diff --git a/acb-relayer/README.md b/acb-relayer/README.md index 86bb6cbf..a7a36b41 100644 --- a/acb-relayer/README.md +++ b/acb-relayer/README.md @@ -101,6 +101,8 @@ docker run -itd --name redis-test -p 6379:6379 redis --requirepass 'YOUR_PWD' -- 在开始之前,需要初始化中继的数据库,这里提供一个[DDL](r-bootstrap/src/main/resources/db/ddl.sql),或者解压之后在路径`config/db/ddl.sql`找到,在MySQL执行即可生成数据库`relayer`。 +已有数据库升级时,需要按版本执行[升级脚本](r-bootstrap/src/main/resources/db/upgrade/README.md),再启动新版中继服务。 + #### TLS 这里初始化中继的TLS证书,会在`tls_certs`路径下生成`relayer.crt`和`relayer.key`。 diff --git a/acb-relayer/r-bootstrap/desc_tar.xml b/acb-relayer/r-bootstrap/desc_tar.xml index 44812361..8e77ed7c 100644 --- a/acb-relayer/r-bootstrap/desc_tar.xml +++ b/acb-relayer/r-bootstrap/desc_tar.xml @@ -28,6 +28,7 @@ application.yml db${file.separator}ddl.sql + db${file.separator}upgrade${file.separator}** @@ -38,4 +39,4 @@ - \ No newline at end of file + diff --git a/acb-relayer/r-bootstrap/src/main/resources/db/ddl.sql b/acb-relayer/r-bootstrap/src/main/resources/db/ddl.sql index e2954c82..caa493a5 100644 --- a/acb-relayer/r-bootstrap/src/main/resources/db/ddl.sql +++ b/acb-relayer/r-bootstrap/src/main/resources/db/ddl.sql @@ -56,7 +56,7 @@ CREATE TABLE IF NOT EXISTS `anchor_process` `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), - UNIQUE KEY `blockchain_product` (`blockchain_product`, `instance`, `task`) + UNIQUE KEY `blockchain_product` (`blockchain_product`, `instance`, `task`, `tpbta_lane_key`) ) ENGINE = InnoDB ROW_FORMAT = DYNAMIC; @@ -545,4 +545,4 @@ CREATE TABLE IF NOT EXISTS `sdp_nonce_record` PRIMARY KEY (`id`), KEY `idx_message_id_nonce` (`message_id`), KEY `idx_channel` (`sender_domain`, `sender_identity`, `receiver_domain`, `receiver_identity`, `nonce`) -); \ No newline at end of file +); diff --git a/acb-relayer/r-bootstrap/src/main/resources/db/upgrade/20260820_anchor_process_lane_index.sql b/acb-relayer/r-bootstrap/src/main/resources/db/upgrade/20260820_anchor_process_lane_index.sql new file mode 100644 index 00000000..71046bb5 --- /dev/null +++ b/acb-relayer/r-bootstrap/src/main/resources/db/upgrade/20260820_anchor_process_lane_index.sql @@ -0,0 +1,4 @@ +ALTER TABLE `anchor_process` + DROP INDEX `blockchain_product`, + ADD UNIQUE KEY `blockchain_product` + (`blockchain_product`, `instance`, `task`, `tpbta_lane_key`); diff --git a/acb-relayer/r-bootstrap/src/main/resources/db/upgrade/README.md b/acb-relayer/r-bootstrap/src/main/resources/db/upgrade/README.md new file mode 100644 index 00000000..47e25bdc --- /dev/null +++ b/acb-relayer/r-bootstrap/src/main/resources/db/upgrade/README.md @@ -0,0 +1,7 @@ +# 数据库升级 + +已有数据库不会重复执行 `ddl.sql` 中的表定义。升级中继服务前,请按版本顺序手动执行本目录中的 SQL 脚本,并在执行前备份数据库。 + +## 2026-08-20 + +执行 `20260820_anchor_process_lane_index.sql`,使不同 TPBTA lane 的锚定任务能够分别保存进度。 diff --git a/acb-relayer/r-bootstrap/src/test/resources/data/ddl.sql b/acb-relayer/r-bootstrap/src/test/resources/data/ddl.sql index 9c260c4a..631441d2 100644 --- a/acb-relayer/r-bootstrap/src/test/resources/data/ddl.sql +++ b/acb-relayer/r-bootstrap/src/test/resources/data/ddl.sql @@ -51,7 +51,7 @@ CREATE TABLE IF NOT EXISTS `anchor_process` `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), - UNIQUE KEY `blockchain_product` (`blockchain_product`, `instance`, `task`) + UNIQUE KEY `blockchain_product` (`blockchain_product`, `instance`, `task`, `tpbta_lane_key`) ); CREATE TABLE IF NOT EXISTS `domain_cert` @@ -503,4 +503,4 @@ CREATE TABLE IF NOT EXISTS `sdp_nonce_record` `hash_val` VARCHAR(64) UNIQUE NOT NULL, `gmt_create` DATETIME DEFAULT CURRENT_TIMESTAMP, `gmt_modified` DATETIME DEFAULT CURRENT_TIMESTAMP -); \ No newline at end of file +); diff --git a/acb-relayer/r-commons/src/main/java/com/alipay/antchain/bridge/relayer/commons/model/BlockchainMeta.java b/acb-relayer/r-commons/src/main/java/com/alipay/antchain/bridge/relayer/commons/model/BlockchainMeta.java index b5067fd6..66e34b97 100644 --- a/acb-relayer/r-commons/src/main/java/com/alipay/antchain/bridge/relayer/commons/model/BlockchainMeta.java +++ b/acb-relayer/r-commons/src/main/java/com/alipay/antchain/bridge/relayer/commons/model/BlockchainMeta.java @@ -168,6 +168,12 @@ public void updateProperties(BlockchainProperties properties) { if (StrUtil.isNotEmpty(properties.getSdpMsgContractAddress())) { this.properties.setSdpMsgContractAddress(properties.getSdpMsgContractAddress()); } + if (StrUtil.isNotEmpty(properties.getPtcContractAddress())) { + this.properties.setPtcContractAddress(properties.getPtcContractAddress()); + } + if (StrUtil.isNotEmpty(properties.getMonitorContractAddress())) { + this.properties.setMonitorContractAddress(properties.getMonitorContractAddress()); + } if (ObjectUtil.isNotNull(properties.getAnchorRuntimeStatus())) { this.properties.setAnchorRuntimeStatus(properties.getAnchorRuntimeStatus()); } diff --git a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/manager/blockchain/BlockchainManager.java b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/manager/blockchain/BlockchainManager.java index bf664580..86d28c3e 100644 --- a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/manager/blockchain/BlockchainManager.java +++ b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/manager/blockchain/BlockchainManager.java @@ -202,7 +202,7 @@ public void updateBlockchain(String product, String blockchainId, String pluginS blockchainMeta.setAlias(alias); blockchainMeta.setDesc(desc); blockchainMeta.updateProperties(blockchainProperties); - if (!updateBlockchainMeta(new BlockchainMeta(product, blockchainId, alias, desc, blockchainProperties))) { + if (!updateBlockchainMeta(blockchainMeta)) { throw new RuntimeException( StrUtil.format( "failed to update meta for blockchain {} - {} into DB", @@ -561,11 +561,40 @@ public void checkTpBtaReadyOnReceivingChain(SDPMsgWrapper sdpMsgWrapper) { return; } - if (blockchainRepository.hasBta(sdpMsgWrapper.getSdpMessage().getTargetDomain())) { + // The third-party proof and its TpBTA describe the sending blockchain. + // Checking the target domain here skips TpBTA upload whenever only the + // source blockchain is trust-enabled, and the subsequent target-chain + // submission then fails with "tpbta not found". + if (blockchainRepository.hasBta(new CrossChainDomain(sdpMsgWrapper.getSenderBlockchainDomain()))) { + AbstractBlockchainClient receivingClient = blockchainClientPool.getClient( + sdpMsgWrapper.getReceiverBlockchainProduct(), + sdpMsgWrapper.getReceiverBlockchainId() + ); + if (ObjectUtil.isNotNull(receivingClient) + && !hasConfiguredPtcContract(receivingClient.queryBBCContext())) { + // Some V0 BBC implementations (currently Dioxide) intentionally + // verify the relayed AM without an on-chain PTC Hub. Calling the + // V1 hasTpBta API for those targets fails before relayAuthMessage + // can run. Trust synchronization is only applicable when the + // receiving chain actually exposes a configured PTC contract. + log.info( + "receiving blockchain {}-{} has no configured ptc contract, skip tpbta upload check", + sdpMsgWrapper.getReceiverBlockchainProduct(), + sdpMsgWrapper.getReceiverBlockchainId() + ); + return; + } checkTpBtaReadyOnReceivingChain(sdpMsgWrapper, tpProof); } } + static boolean hasConfiguredPtcContract(AbstractBBCContext bbcContext) { + return ObjectUtil.isNotNull(bbcContext) + && ObjectUtil.isNotNull(bbcContext.getPtcContract()) + && StrUtil.isNotBlank(bbcContext.getPtcContract().getContractAddress()) + && !"empty".equalsIgnoreCase(bbcContext.getPtcContract().getContractAddress()); + } + @Override @Transactional(rollbackFor = Exception.class) public void initTpBta(@NonNull String ptcServiceId, @NonNull IBlockchainTrustAnchor bta) { @@ -923,38 +952,29 @@ private void deployHeteroBlockchainAMContract(BlockchainMeta blockchainMeta) { blockchainClient.getAMClientContract().deployContract(); } - if ( - ObjectUtil.isNull(bbcContext.getSdpContract()) - || ContractStatusEnum.INIT == bbcContext.getSdpContract().getStatus() - ) { - blockchainClient.getSDPMsgClientContract().deployContract(); - } + // setup-bbccontracts is also the explicit reconciliation entry point + // for versioned system-contract upgrades. BBC implementations must + // keep setup idempotent when an existing deployment is current. + blockchainClient.getSDPMsgClientContract().deployContract(); // if monitor is supported, it needs to be deployed before ptc boolean isMonitorSupport = true; - if ( - ObjectUtil.isNull(bbcContext.getMonitorContract()) - || ContractStatusEnum.INIT == bbcContext.getMonitorContract().getStatus() - ) { - try { - blockchainClient.getMonitorClientContract().deployContract(); - } catch (BbcInterfaceNotSupportException e) { - log.info("setup monitor contract not support for blockchain product: {}", blockchainMeta.getProduct()); - isMonitorSupport = false; - } + try { + blockchainClient.getMonitorClientContract().deployContract(); + } catch (BbcInterfaceNotSupportException e) { + log.info("setup monitor contract not support for blockchain product: {}", blockchainMeta.getProduct()); + isMonitorSupport = false; } boolean isPtcSupport = true; - if ( - ObjectUtil.isNull(bbcContext.getPtcContract()) - || ContractStatusEnum.INIT == bbcContext.getPtcContract().getStatus() - ) { - try { - blockchainClient.getPtcContract().deployContract(); - } catch (BbcInterfaceNotSupportException e) { - log.info("setup ptc contract not support for blockchain product: {}", blockchainMeta.getProduct()); - isPtcSupport = false; - } + try { + // setup-bbccontracts is an explicit reconciliation request. The + // BBC implementation must be allowed to probe and replace a + // legacy PTC Hub even when the persisted context says READY. + blockchainClient.getPtcContract().deployContract(); + } catch (BbcInterfaceNotSupportException e) { + log.info("setup ptc contract not support for blockchain product: {}", blockchainMeta.getProduct()); + isPtcSupport = false; } bbcContext = blockchainClient.queryBBCContext(); diff --git a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/service/anchor/workers/ConsensusStateWorker.java b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/service/anchor/workers/ConsensusStateWorker.java index 167bdc2d..74cc2972 100644 --- a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/service/anchor/workers/ConsensusStateWorker.java +++ b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/service/anchor/workers/ConsensusStateWorker.java @@ -16,10 +16,16 @@ package com.alipay.antchain.bridge.relayer.core.service.anchor.workers; +import java.math.BigInteger; + import cn.hutool.core.util.ObjectUtil; +import com.alipay.antchain.bridge.commons.core.base.CrossChainDomain; +import com.alipay.antchain.bridge.commons.core.base.ConsensusState; +import com.alipay.antchain.bridge.commons.core.bta.IBlockchainTrustAnchor; import com.alipay.antchain.bridge.commons.core.ptc.ValidatedConsensusState; import com.alipay.antchain.bridge.ptc.service.IPTCService; import com.alipay.antchain.bridge.relayer.commons.exception.PtcVerifyConsensusStateException; +import com.alipay.antchain.bridge.relayer.commons.model.BtaDO; import com.alipay.antchain.bridge.relayer.commons.model.TpBtaDO; import com.alipay.antchain.bridge.relayer.commons.model.ValidatedConsensusStateDO; import com.alipay.antchain.bridge.relayer.core.service.anchor.context.AnchorProcessContext; @@ -55,6 +61,8 @@ public boolean process(AbstractBlock block, TpBtaDO tpBtaDO) { throw new PtcVerifyConsensusStateException("ptc service stub {} is null", tpBtaDO.getPtcServiceId()); } + restoreAnchorStateIfNecessary(block, tpBtaDO, ptcService); + ValidatedConsensusStateDO parentVcs = ValidatedConsensusStateDO.builder().build(); if (!ptcService.getPtcFeatureDescriptor().isStorageEnabled()) { parentVcs = getProcessContext().getBlockchainRepository().getValidatedConsensusState( @@ -115,4 +123,55 @@ public boolean process(AbstractBlock block, TpBtaDO tpBtaDO) { return true; } + + /** + * A storage-enabled PTC keeps the verified consensus-state chain on the PTC node. If that + * runtime storage is restored from an incomplete snapshot while the relayer database keeps + * its anchor progress, the first post-BTA block can no longer be verified because its parent + * (the BTA anchor state) is missing. + * + * Re-submitting the BTA anchor is safe and idempotent on committee PTC nodes. Limit the repair + * strictly to {@code initHeight + 1}; a missing parent at any later height is a real continuity + * error and must not be hidden by rewinding or fabricating state. + */ + private void restoreAnchorStateIfNecessary(AbstractBlock block, TpBtaDO tpBtaDO, IPTCService ptcService) { + if (!ptcService.getPtcFeatureDescriptor().isStorageEnabled()) { + return; + } + + BtaDO btaDO = getProcessContext().getBlockchainRepository().getBta(new CrossChainDomain(block.getDomain())); + if (ObjectUtil.isNull(btaDO) || ObjectUtil.isNull(btaDO.getBta())) { + throw new PtcVerifyConsensusStateException("bta is not found for domain {}", block.getDomain()); + } + + IBlockchainTrustAnchor bta = btaDO.getBta(); + if (bta.getSubjectVersion() != tpBtaDO.getBtaSubjectVersion()) { + throw new PtcVerifyConsensusStateException( + "bta subject version {} does not match tpbta subject version {} for domain {}", + bta.getSubjectVersion(), tpBtaDO.getBtaSubjectVersion(), block.getDomain() + ); + } + if (!BigInteger.valueOf(block.getHeight()).equals(bta.getInitHeight().add(BigInteger.ONE))) { + return; + } + + ConsensusState anchorState = getProcessContext().getBlockchainClient().getConsensusState(bta.getInitHeight()); + if (ObjectUtil.isNull(anchorState)) { + throw new PtcVerifyConsensusStateException( + "failed to query BTA anchor consensus state at height {} for domain {}", + bta.getInitHeight(), block.getDomain() + ); + } + ValidatedConsensusState anchorVcs = ptcService.commitAnchorState(bta, tpBtaDO.getTpbta(), anchorState); + if (ObjectUtil.isNull(anchorVcs)) { + throw new PtcVerifyConsensusStateException( + "ptc {} returned null while restoring BTA anchor state at height {} for domain {}", + tpBtaDO.getPtcServiceId(), bta.getInitHeight(), block.getDomain() + ); + } + log.info( + "ensured BTA anchor consensus state {}-{} for domain {} on storage-enabled ptc {}", + anchorState.getHeight(), anchorState.getHashHex(), block.getDomain(), tpBtaDO.getPtcServiceId() + ); + } } diff --git a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/service/confirm/AMConfirmService.java b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/service/confirm/AMConfirmService.java index 26271d69..7ad93ecb 100644 --- a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/service/confirm/AMConfirmService.java +++ b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/service/confirm/AMConfirmService.java @@ -112,24 +112,12 @@ public void process(String product, String blockchainId) { List sdpNonceRecordsToSave = new ArrayList<>(); futureList.forEach( future -> { - ConfirmResult result; - try { - result = future.get(); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException( - String.format("failed to query cross-chain receipt for ( product: %s, bid: %s )", product, blockchainId), - e - ); + ConfirmResult result = resolveConfirmResult(future, product, blockchainId); + if (ObjectUtil.isNull(result)) { + return; } if (result.getReceipt().isConfirmed()) { - SDPMsgCommitResult sdpMsgCommitResult = new SDPMsgCommitResult( - product, - blockchainId, - result.getReceipt().getTxhash(), - result.getReceipt().isSuccessful(), - result.getReceipt().getErrorMsg(), - System.currentTimeMillis() - ); + SDPMsgCommitResult sdpMsgCommitResult = buildCommitResult(product, blockchainId, result); if (result.getSdpMsg().getVersion() > 2 && result.getSdpMsg().getSdpMessage().getAtomicFlag().ordinal() < AtomicFlagEnum.ACK_SUCCESS.ordinal() && result.getSdpMsg().getSdpMessage().getTimeoutMeasure() != TimeoutMeasureEnum.NO_TIMEOUT @@ -171,6 +159,50 @@ public void process(String product, String blockchainId) { ); } + static ConfirmResult resolveConfirmResult( + Future future, + String product, + String blockchainId + ) { + try { + return future.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error( + "interrupted while querying cross-chain receipt for ( product: {}, bid: {} )", + product, + blockchainId, + e + ); + } catch (ExecutionException e) { + // Receipt availability is per transaction. One temporarily missing + // native receipt must not discard confirmed results from the rest + // of this batch; the failed row remains TX_PENDING for reconciliation. + log.error( + "failed to query one cross-chain receipt for ( product: {}, bid: {} ), keep it pending", + product, + blockchainId, + e.getCause() + ); + } + return null; + } + + static SDPMsgCommitResult buildCommitResult(String product, String blockchainId, ConfirmResult result) { + // The pending row is already known. Updating by its primary key avoids + // depending on a plugin's native transaction-hash representation + // (notably Dioxide's non-hex hash) for terminal-state persistence. + return new SDPMsgCommitResult( + result.getSdpMsg().getId(), + product, + blockchainId, + result.getReceipt().getTxhash(), + result.getReceipt().isSuccessful(), + result.getReceipt().getErrorMsg(), + System.currentTimeMillis() + ); + } + public void processTimeout(String product, String blockchainId) { List sdpMsgWrappers = crossChainMessageRepository.peekSDPMessagesSent( product, diff --git a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClient.java b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClient.java index 16866761..437ad921 100644 --- a/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClient.java +++ b/acb-relayer/r-core/src/main/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClient.java @@ -25,6 +25,8 @@ public class GRpcBBCServiceClient implements IBBCServiceClient { + static final long RECEIPT_QUERY_DEADLINE_SECONDS = 30L; + private String psId; private final String product; @@ -108,7 +110,7 @@ public AbstractBBCContext getContext() { @Override public CrossChainMessageReceipt readCrossChainMessageReceipt(String txhash) { - Response response = this.blockingStub.bbcCall( + Response response = withReceiptQueryDeadline(this.blockingStub).bbcCall( CallBBCRequest.newBuilder() .setProduct(this.getProduct()) .setDomain(this.getDomain()) @@ -127,6 +129,12 @@ public CrossChainMessageReceipt readCrossChainMessageReceipt(String txhash) { ); } + static CrossChainServiceGrpc.CrossChainServiceBlockingStub withReceiptQueryDeadline( + CrossChainServiceGrpc.CrossChainServiceBlockingStub stub + ) { + return stub.withDeadlineAfter(RECEIPT_QUERY_DEADLINE_SECONDS, TimeUnit.SECONDS); + } + @Override public List readCrossChainMessagesByHeight(long height) { Response response = this.blockingStub.bbcCall( diff --git a/acb-relayer/r-core/src/test/java/com/alipay/antchain/bridge/relayer/core/manager/blockchain/BlockchainManagerTest.java b/acb-relayer/r-core/src/test/java/com/alipay/antchain/bridge/relayer/core/manager/blockchain/BlockchainManagerTest.java new file mode 100644 index 00000000..850386ad --- /dev/null +++ b/acb-relayer/r-core/src/test/java/com/alipay/antchain/bridge/relayer/core/manager/blockchain/BlockchainManagerTest.java @@ -0,0 +1,189 @@ +/* + * Copyright 2023 Ant Group + * + * 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 com.alipay.antchain.bridge.relayer.core.manager.blockchain; + +import java.lang.reflect.Field; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +import com.alipay.antchain.bridge.commons.bbc.DefaultBBCContext; +import com.alipay.antchain.bridge.commons.bbc.syscontract.PTCContract; +import com.alipay.antchain.bridge.commons.core.base.CrossChainDomain; +import com.alipay.antchain.bridge.commons.core.ptc.ThirdPartyProof; +import com.alipay.antchain.bridge.commons.core.sdp.SDPMessageV1; +import com.alipay.antchain.bridge.relayer.commons.constant.BlockchainStateEnum; +import com.alipay.antchain.bridge.relayer.commons.model.AuthMsgWrapper; +import com.alipay.antchain.bridge.relayer.commons.model.BlockchainMeta; +import com.alipay.antchain.bridge.relayer.commons.model.SDPMsgWrapper; +import com.alipay.antchain.bridge.relayer.dal.repository.IBlockchainRepository; +import com.alipay.antchain.bridge.relayer.dal.repository.ICrossChainMessageRepository; +import org.junit.Assert; +import org.junit.Test; + +public class BlockchainManagerTest { + + @Test + public void hasConfiguredPtcContractShouldRejectLegacyTargetWithoutPtcHub() { + Assert.assertFalse(BlockchainManager.hasConfiguredPtcContract(null)); + Assert.assertFalse(BlockchainManager.hasConfiguredPtcContract(new DefaultBBCContext())); + + DefaultBBCContext emptyContext = new DefaultBBCContext(); + PTCContract emptyPtc = new PTCContract(); + emptyPtc.setContractAddress("empty"); + emptyContext.setPtcContract(emptyPtc); + Assert.assertFalse(BlockchainManager.hasConfiguredPtcContract(emptyContext)); + + DefaultBBCContext configuredContext = new DefaultBBCContext(); + PTCContract configuredPtc = new PTCContract(); + configuredPtc.setContractAddress("ptc-contract-address"); + configuredContext.setPtcContract(configuredPtc); + Assert.assertTrue(BlockchainManager.hasConfiguredPtcContract(configuredContext)); + } + + @Test + public void checkTpBtaReadyShouldCheckSendingBlockchainBta() throws Exception { + AtomicReference checkedDomain = new AtomicReference<>(); + IBlockchainRepository blockchainRepository = (IBlockchainRepository) Proxy.newProxyInstance( + getClass().getClassLoader(), + new Class[]{IBlockchainRepository.class}, + (proxy, method, args) -> { + if ("hasBta".equals(method.getName()) && args.length == 1) { + checkedDomain.set((CrossChainDomain) args[0]); + return false; + } + return defaultValue(method.getReturnType()); + } + ); + ICrossChainMessageRepository crossChainMessageRepository = + (ICrossChainMessageRepository) Proxy.newProxyInstance( + getClass().getClassLoader(), + new Class[]{ICrossChainMessageRepository.class}, + (proxy, method, args) -> "getTpProof".equals(method.getName()) + ? new ThirdPartyProof() + : defaultValue(method.getReturnType()) + ); + + AuthMsgWrapper authMsgWrapper = new AuthMsgWrapper(); + authMsgWrapper.setDomain("source.example"); + authMsgWrapper.setUcpId("ucp-test"); + SDPMessageV1 sdpMessage = new SDPMessageV1(); + sdpMessage.setTargetDomain(new CrossChainDomain("target.example")); + SDPMsgWrapper sdpMsgWrapper = new SDPMsgWrapper(); + sdpMsgWrapper.setAuthMsgWrapper(authMsgWrapper); + sdpMsgWrapper.setSdpMessage(sdpMessage); + + BlockchainManager blockchainManager = new BlockchainManager(); + setField(blockchainManager, "blockchainRepository", blockchainRepository); + setField(blockchainManager, "crossChainMessageRepository", crossChainMessageRepository); + + blockchainManager.checkTpBtaReadyOnReceivingChain(sdpMsgWrapper); + + Assert.assertEquals(new CrossChainDomain("source.example"), checkedDomain.get()); + } + + @Test + public void updateBlockchainShouldPersistMergedProperties() { + BlockchainMeta.BlockchainProperties originalProperties = new BlockchainMeta.BlockchainProperties(); + originalProperties.setPluginServerId("ps01"); + originalProperties.setBbcContext(new DefaultBBCContext()); + originalProperties.setAnchorRuntimeStatus(BlockchainStateEnum.INIT); + originalProperties.getExtraProperties().put("preserved_property", "preserved_value"); + + BlockchainMeta originalMeta = new BlockchainMeta( + "mychain2", + "my02.id", + "old_alias", + "old_desc", + originalProperties + ); + TestBlockchainManager blockchainManager = new TestBlockchainManager(originalMeta); + + Map partialConfig = new HashMap<>(); + partialConfig.put("ptc_contract_address", "ptc_contract"); + partialConfig.put("monitor_contract_address", "monitor_contract"); + partialConfig.put("monitor_verifier_contract_address", "monitor_verifier_contract"); + + blockchainManager.updateBlockchain( + "mychain2", + "my02.id", + "", + "new_alias", + "new_desc", + partialConfig + ); + + BlockchainMeta updatedMeta = blockchainManager.updatedMeta; + Assert.assertSame(originalMeta, updatedMeta); + Assert.assertEquals("new_alias", updatedMeta.getAlias()); + Assert.assertEquals("new_desc", updatedMeta.getDesc()); + Assert.assertEquals("ps01", updatedMeta.getPluginServerId()); + Assert.assertNotNull(updatedMeta.getProperties().getBbcContext()); + Assert.assertEquals("ptc_contract", updatedMeta.getProperties().getPtcContractAddress()); + Assert.assertEquals("monitor_contract", updatedMeta.getProperties().getMonitorContractAddress()); + Assert.assertEquals( + "monitor_verifier_contract", + updatedMeta.getProperties().getExtraProperties().get("monitor_verifier_contract_address") + ); + Assert.assertEquals( + "preserved_value", + updatedMeta.getProperties().getExtraProperties().get("preserved_property") + ); + } + + private static class TestBlockchainManager extends BlockchainManager { + + private final BlockchainMeta originalMeta; + + private BlockchainMeta updatedMeta; + + private TestBlockchainManager(BlockchainMeta originalMeta) { + this.originalMeta = originalMeta; + } + + @Override + public BlockchainMeta getBlockchainMeta(String product, String blockchainId) { + return originalMeta; + } + + @Override + public boolean updateBlockchainMeta(BlockchainMeta blockchainMeta) { + updatedMeta = blockchainMeta; + return true; + } + } + + private static void setField(Object target, String name, Object value) throws Exception { + Field field = BlockchainManager.class.getDeclaredField(name); + field.setAccessible(true); + field.set(target, value); + } + + private static Object defaultValue(Class type) { + if (!type.isPrimitive()) { + return null; + } + if (type == boolean.class) { + return false; + } + if (type == char.class) { + return '\0'; + } + return 0; + } +} diff --git a/acb-relayer/r-core/src/test/java/com/alipay/antchain/bridge/relayer/core/service/confirm/AMConfirmServiceTest.java b/acb-relayer/r-core/src/test/java/com/alipay/antchain/bridge/relayer/core/service/confirm/AMConfirmServiceTest.java new file mode 100644 index 00000000..2f7cadb0 --- /dev/null +++ b/acb-relayer/r-core/src/test/java/com/alipay/antchain/bridge/relayer/core/service/confirm/AMConfirmServiceTest.java @@ -0,0 +1,58 @@ +/* + * Copyright 2024 Ant Group + * + * 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 com.alipay.antchain.bridge.relayer.core.service.confirm; + +import java.util.concurrent.CompletableFuture; + +import com.alipay.antchain.bridge.commons.core.base.CrossChainMessageReceipt; +import com.alipay.antchain.bridge.relayer.commons.model.SDPMsgCommitResult; +import com.alipay.antchain.bridge.relayer.commons.model.SDPMsgWrapper; +import org.junit.Assert; +import org.junit.Test; + +public class AMConfirmServiceTest { + + @Test + public void failedReceiptShouldRemainPendingWithoutAbortingTheBatch() { + CompletableFuture failed = new CompletableFuture<>(); + failed.completeExceptionally(new RuntimeException("native transaction temporarily unavailable")); + + Assert.assertNull(AMConfirmService.resolveConfirmResult(failed, "dioxide2", "diox04.id")); + } + + @Test + public void buildCommitResultShouldKeepPendingRowIdentityForNativeHash() { + SDPMsgWrapper message = new SDPMsgWrapper(); + message.setId(2700L); + + CrossChainMessageReceipt receipt = new CrossChainMessageReceipt(); + receipt.setTxhash("yh7jj8ntyz8ervas66rfv04e7zsjxc6x4ftedvdqk2hz4kbatq7g"); + receipt.setSuccessful(true); + receipt.setConfirmed(true); + receipt.setErrorMsg(""); + + SDPMsgCommitResult result = AMConfirmService.buildCommitResult( + "dioxide2", + "diox04.id", + new ConfirmResult(receipt, message) + ); + + Assert.assertEquals(Long.valueOf(2700L), result.getSdpMsgId()); + Assert.assertEquals(receipt.getTxhash(), result.getTxHash()); + Assert.assertTrue(result.isCommitSuccess()); + } +} diff --git a/acb-relayer/r-core/src/test/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClientTest.java b/acb-relayer/r-core/src/test/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClientTest.java new file mode 100644 index 00000000..acb77711 --- /dev/null +++ b/acb-relayer/r-core/src/test/java/com/alipay/antchain/bridge/relayer/core/types/pluginserver/GRpcBBCServiceClientTest.java @@ -0,0 +1,34 @@ +package com.alipay.antchain.bridge.relayer.core.types.pluginserver; + +import java.util.concurrent.TimeUnit; + +import com.alipay.antchain.bridge.pluginserver.service.CrossChainServiceGrpc; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import org.junit.Assert; +import org.junit.Test; + +public class GRpcBBCServiceClientTest { + + @Test + public void receiptQueryStubHasFiniteDeadline() { + ManagedChannel channel = ManagedChannelBuilder + .forAddress("127.0.0.1", 1) + .usePlaintext() + .build(); + try { + CrossChainServiceGrpc.CrossChainServiceBlockingStub stub = + CrossChainServiceGrpc.newBlockingStub(channel); + CrossChainServiceGrpc.CrossChainServiceBlockingStub deadlineStub = + GRpcBBCServiceClient.withReceiptQueryDeadline(stub); + + Assert.assertNotNull(deadlineStub.getCallOptions().getDeadline()); + long remainingSeconds = deadlineStub.getCallOptions().getDeadline() + .timeRemaining(TimeUnit.SECONDS); + Assert.assertTrue(remainingSeconds >= 0); + Assert.assertTrue(remainingSeconds <= GRpcBBCServiceClient.RECEIPT_QUERY_DEADLINE_SECONDS); + } finally { + channel.shutdownNow(); + } + } +} diff --git a/acb-sdk/antchain-bridge-commons/src/main/java/com/alipay/antchain/bridge/commons/core/monitor/MonitorMessageV1.java b/acb-sdk/antchain-bridge-commons/src/main/java/com/alipay/antchain/bridge/commons/core/monitor/MonitorMessageV1.java index 5f493298..ce69a59c 100755 --- a/acb-sdk/antchain-bridge-commons/src/main/java/com/alipay/antchain/bridge/commons/core/monitor/MonitorMessageV1.java +++ b/acb-sdk/antchain-bridge-commons/src/main/java/com/alipay/antchain/bridge/commons/core/monitor/MonitorMessageV1.java @@ -15,11 +15,35 @@ public class MonitorMessageV1 extends AbstractMonitorMessage { @Override public void decode(byte[] rawMessage) { - int offset = rawMessage.length; - - offset = extractMonitorType(rawMessage, offset); - offset = extractMonitorMsg(rawMessage, offset); - extractPayload(rawMessage, offset); + if (rawMessage == null || rawMessage.length < 68) { + throw new AntChainBridgeCommonsException( + CommonsErrorCodeEnum.MONITOR_MESSAGE_DECODE_ERROR, + "monitor V1 envelope is shorter than its fixed fields" + ); + } + + try { + int offset = rawMessage.length; + offset = extractMonitorType(rawMessage, offset); + if (getMonitorType() != MONITOR_CLOSE + && getMonitorType() != MONITOR_OPEN + && getMonitorType() != MONITOR_ROLLBACK) { + throw new IllegalArgumentException("invalid monitor V1 type: " + getMonitorType()); + } + offset = extractMonitorMsg(rawMessage, offset); + offset = extractPayload(rawMessage, offset); + if (offset != 0) { + throw new IllegalArgumentException("trailing data in monitor V1 envelope: " + offset); + } + } catch (AntChainBridgeCommonsException e) { + throw e; + } catch (Exception e) { + throw new AntChainBridgeCommonsException( + CommonsErrorCodeEnum.MONITOR_MESSAGE_DECODE_ERROR, + "malformed monitor V1 envelope", + e + ); + } } public int extractMonitorType(byte[] rawMessage, int offset) { @@ -49,7 +73,7 @@ public int extractMonitorMsg(byte[] rawMessage, int offset) { // return offset; CoderResult result = EvmCoderUtil.parseVarBytes(rawMessage, offset); - this.setMonitorMsg(new String(result.getResult())); + this.setMonitorMsg(new String(result.getResult(), StandardCharsets.UTF_8)); return result.getOffset(); } diff --git a/acb-sdk/antchain-bridge-commons/src/test/java/com/alipay/antchain/bridge/commons/MonitorMessageV1Test.java b/acb-sdk/antchain-bridge-commons/src/test/java/com/alipay/antchain/bridge/commons/MonitorMessageV1Test.java new file mode 100644 index 00000000..3403c543 --- /dev/null +++ b/acb-sdk/antchain-bridge-commons/src/test/java/com/alipay/antchain/bridge/commons/MonitorMessageV1Test.java @@ -0,0 +1,79 @@ +package com.alipay.antchain.bridge.commons; + +import com.alipay.antchain.bridge.commons.core.monitor.MonitorMessageV1; +import com.alipay.antchain.bridge.commons.exception.AntChainBridgeCommonsException; +import org.junit.Assert; +import org.junit.Test; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +public class MonitorMessageV1Test { + + @Test + public void shouldRoundTripExactPayloadAcrossEvmWordBoundaries() { + for (int length : new int[]{0, 1, 31, 32, 33, 63, 64, 65, 257}) { + byte[] payload = new byte[length]; + for (int index = 0; index < payload.length; index++) { + payload[index] = (byte) (index * 31 + 7); + } + + MonitorMessageV1 encoded = new MonitorMessageV1(); + encoded.setMonitorType(2); + encoded.setMonitorMsg("monitor-v1-监管"); + encoded.setPayload(payload); + + MonitorMessageV1 decoded = new MonitorMessageV1(); + decoded.decode(encoded.encode()); + + Assert.assertEquals(2, decoded.getMonitorType()); + Assert.assertEquals("monitor-v1-监管", decoded.getMonitorMsg()); + Assert.assertArrayEquals(payload, decoded.getPayload()); + } + } + + @Test + public void payloadMustNotContainEnvelopeOrPadding() { + byte[] payload = "business-payload".getBytes(StandardCharsets.UTF_8); + MonitorMessageV1 encoded = new MonitorMessageV1(); + encoded.setMonitorType(1); + encoded.setMonitorMsg(""); + encoded.setPayload(payload); + + byte[] envelope = encoded.encode(); + Assert.assertTrue(envelope.length > payload.length); + Assert.assertFalse(Arrays.equals(envelope, payload)); + + MonitorMessageV1 decoded = new MonitorMessageV1(); + decoded.decode(envelope); + Assert.assertArrayEquals(payload, decoded.getPayload()); + } + + @Test(expected = AntChainBridgeCommonsException.class) + public void shouldRejectTruncatedEnvelope() { + new MonitorMessageV1().decode(new byte[67]); + } + + @Test(expected = AntChainBridgeCommonsException.class) + public void shouldRejectUnknownMonitorType() { + MonitorMessageV1 encoded = new MonitorMessageV1(); + encoded.setMonitorType(99); + encoded.setMonitorMsg(""); + encoded.setPayload(new byte[0]); + + new MonitorMessageV1().decode(encoded.encode()); + } + + @Test(expected = AntChainBridgeCommonsException.class) + public void shouldRejectTrailingEnvelopeData() { + MonitorMessageV1 encoded = new MonitorMessageV1(); + encoded.setMonitorType(1); + encoded.setMonitorMsg(""); + encoded.setPayload("payload".getBytes(StandardCharsets.UTF_8)); + byte[] valid = encoded.encode(); + byte[] withTrailingPrefix = new byte[valid.length + 32]; + System.arraycopy(valid, 0, withTrailingPrefix, 32, valid.length); + + new MonitorMessageV1().decode(withTrailingPrefix); + } +} diff --git a/acb-sdk/pluginset/dioxide/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideClient.java b/acb-sdk/pluginset/dioxide/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideClient.java index c029601f..5f882b5f 100644 --- a/acb-sdk/pluginset/dioxide/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideClient.java +++ b/acb-sdk/pluginset/dioxide/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideClient.java @@ -73,6 +73,8 @@ public class DioxideClient { private static final String RECV_MESSAGE_IN_PROTOCOL = "recvMessageInProtocol:name"; + private static final String INVOCATION_SUCCESS = "IVKRET_SUCCESS"; + public DioxideClient(DioxideConfig config, Logger bbcLogger) { this.bbcLogger = bbcLogger; this.config = config; @@ -200,39 +202,17 @@ public CrossChainMessageReceipt getCrossChainMessageReceipt(DioxideTransaction d List eventTargetTxHashes = new ArrayList<>(); for (String tx2Hash : tx2Hashes) { JSONObject tx2 = getTransactionJonObjectByHash(tx2Hash); - if (tx2 == null) { - eventStructurePending = true; - continue; - } - JSONArray eventRelays = tx2.getJSONArray("Relays"); - if (CollUtil.isEmpty(eventRelays)) { - eventStructurePending = true; - continue; - } - List currentEventTxs = eventRelays.toJavaList(DioxideTransaction.class); - if (CollUtil.isEmpty(currentEventTxs)) { - eventStructurePending = true; - continue; - } - int eventTargetTxCountBefore = eventTargetTxHashes.size(); - for (DioxideTransaction eventTx : currentEventTxs) { - // Items in tx2.Relays are embedded invocation records, not standalone transactions. - if (eventTx == null || eventTx.getInvocation() == null - || CollUtil.isEmpty(eventTx.getInvocation().getRelays())) { - continue; - } - for (String eventTargetTxReference : eventTx.getInvocation().getRelays()) { - String eventTargetTxHash = normalizeRelayTxHash(eventTargetTxReference); - if (StrUtil.isEmpty(eventTargetTxHash)) { - eventStructurePending = true; - } else { - eventTargetTxHashes.add(eventTargetTxHash); - } - } - } - if (eventTargetTxHashes.size() == eventTargetTxCountBefore) { - eventStructurePending = true; + RelayEventInspection relayEventInspection = inspectRelayEvents(tx2, tx2Hash); + if (relayEventInspection.state() == RelayEventState.FAILED) { + return buildCrossChainMessageReceipt( + dioxideTransaction, + true, + false, + relayEventInspection.errorMessage() + ); } + eventStructurePending |= relayEventInspection.state() == RelayEventState.PENDING; + eventTargetTxHashes.addAll(relayEventInspection.eventTargetTxHashes()); } TxFinalityResult pendingEventFinality = eventStructurePending @@ -866,21 +846,25 @@ private boolean isTxConfirmedWithRelays(DioxideTransaction dioxideTransaction) { } public boolean isTxConfirmed(DioxideTransaction tx) { - if (tx == null || tx.getConfirmState() == null) { + if (tx == null) { return false; } - return DioxideTypes.TXN_CONFIRMED_STATUS.contains(tx.getConfirmState()); + return (tx.getConfirmState() != null + && DioxideTypes.TXN_CONFIRMED_STATUS.contains(tx.getConfirmState())) + || isDurablyCommitted(tx); } public static boolean isTxFinalized(DioxideTransaction tx) { - if (tx == null || tx.getConfirmState() == null) { + if (tx == null) { return false; } - return DioxideTypes.TXN_FINALIZED_STATUS.contains(tx.getConfirmState()); + return (tx.getConfirmState() != null + && DioxideTypes.TXN_FINALIZED_STATUS.contains(tx.getConfirmState())) + || isDurablyCommitted(tx); } static boolean isTxTerminalFailed(DioxideTransaction tx) { - if (tx == null || tx.getConfirmState() == null) { + if (tx == null) { return false; } return StrUtil.equalsAny( @@ -888,6 +872,19 @@ static boolean isTxTerminalFailed(DioxideTransaction tx) { DioxideTypes.TxnConfirmState.TXN_RELAY_INVALIDED.name(), DioxideTypes.TxnConfirmState.TXN_ABORTED.name(), DioxideTypes.TxnConfirmState.TXN_EXPIRED.name() + ) || StrUtil.equalsAny( + tx.getState(), + DioxideTypes.BlockState.DUS_INVALID.name(), + DioxideTypes.BlockState.DUS_FORKED.name(), + DioxideTypes.BlockState.DUS_ARCHIVED_UNCLE.name() + ); + } + + private static boolean isDurablyCommitted(DioxideTransaction tx) { + return StrUtil.equalsAny( + tx.getState(), + DioxideTypes.BlockState.DUS_FINALIZED.name(), + DioxideTypes.BlockState.DUS_ARCHIVED.name() ); } @@ -970,6 +967,73 @@ static String normalizeRelayTxHash(String relayTxReference) { return separatorIndex >= 0 ? relayTxReference.substring(0, separatorIndex) : relayTxReference; } + static RelayEventInspection inspectRelayEvents(JSONObject relayGroup, String relayGroupTxHash) { + if (relayGroup == null) { + return new RelayEventInspection(RelayEventState.PENDING, List.of(), ""); + } + + DioxideTransaction relayGroupTransaction = relayGroup.toJavaObject(DioxideTransaction.class); + boolean relayGroupFinalized = isTxFinalized(relayGroupTransaction); + JSONArray eventRelays = relayGroup.getJSONArray("Relays"); + if (CollUtil.isEmpty(eventRelays)) { + return relayGroupFinalized + ? failedRelayEventInspection(relayGroupTxHash, "contains no embedded relay invocations") + : new RelayEventInspection(RelayEventState.PENDING, List.of(), ""); + } + + List embeddedInvocations = eventRelays.toJavaList(DioxideTransaction.class); + if (CollUtil.isEmpty(embeddedInvocations)) { + return relayGroupFinalized + ? failedRelayEventInspection(relayGroupTxHash, "contains no decodable embedded relay invocations") + : new RelayEventInspection(RelayEventState.PENDING, List.of(), ""); + } + + List eventTargetTxHashes = new ArrayList<>(); + for (DioxideTransaction embeddedInvocation : embeddedInvocations) { + if (embeddedInvocation == null || embeddedInvocation.getInvocation() == null) { + continue; + } + String invocationStatus = embeddedInvocation.getInvocation().getStatus(); + if (StrUtil.isNotEmpty(invocationStatus) && !StrUtil.equals(invocationStatus, INVOCATION_SUCCESS)) { + return failedRelayEventInspection( + relayGroupTxHash, + String.format( + "embedded invocation %s failed with status %s", + StrUtil.emptyToDefault(embeddedInvocation.getFunction(), "unknown"), + invocationStatus + ) + ); + } + if (CollUtil.isEmpty(embeddedInvocation.getInvocation().getRelays())) { + continue; + } + embeddedInvocation.getInvocation().getRelays().stream() + .map(DioxideClient::normalizeRelayTxHash) + .filter(StrUtil::isNotEmpty) + .forEach(eventTargetTxHashes::add); + } + + List distinctTargetTxHashes = eventTargetTxHashes.stream().distinct().toList(); + if (CollUtil.isNotEmpty(distinctTargetTxHashes)) { + return new RelayEventInspection(RelayEventState.READY, distinctTargetTxHashes, ""); + } + return relayGroupFinalized + ? failedRelayEventInspection(relayGroupTxHash, "produced no protocol event transaction") + : new RelayEventInspection(RelayEventState.PENDING, List.of(), ""); + } + + private static RelayEventInspection failedRelayEventInspection(String relayGroupTxHash, String reason) { + return new RelayEventInspection( + RelayEventState.FAILED, + List.of(), + String.format( + "relay transaction %s %s", + StrUtil.emptyToDefault(relayGroupTxHash, "unknown"), + reason + ) + ); + } + enum TxFinalityState { PENDING, FINALIZED, @@ -979,6 +1043,19 @@ enum TxFinalityState { record TxFinalityResult(TxFinalityState state, String txHash, String confirmState) { } + enum RelayEventState { + PENDING, + READY, + FAILED + } + + record RelayEventInspection( + RelayEventState state, + List eventTargetTxHashes, + String errorMessage + ) { + } + @SneakyThrows public String sendTransaction(String params, boolean sync) { // getBbcLogger().info("params of compose: \n{}", JSON.toJSONString(JSON.parseObject(params), SerializerFeature.PrettyFormat)); diff --git a/acb-sdk/pluginset/dioxide/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideTransaction.java b/acb-sdk/pluginset/dioxide/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideTransaction.java index 4d9e75a2..766ba932 100644 --- a/acb-sdk/pluginset/dioxide/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideTransaction.java +++ b/acb-sdk/pluginset/dioxide/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideTransaction.java @@ -61,6 +61,14 @@ public class DioxideTransaction { @JSONField(name = "ConfirmState") private String confirmState; + /** + * Dioxide nodes may expose the durable transaction state without a + * ConfirmState (notably for the final relay transactions). Keep both + * fields so finality can be derived from the node's actual response. + */ + @JSONField(name = "State") + private String state; + @Data @NoArgsConstructor diff --git a/acb-sdk/pluginset/dioxide/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideClientFinalityTest.java b/acb-sdk/pluginset/dioxide/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideClientFinalityTest.java index aa8b29b7..aae07bd0 100644 --- a/acb-sdk/pluginset/dioxide/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideClientFinalityTest.java +++ b/acb-sdk/pluginset/dioxide/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/dioxide/core/DioxideClientFinalityTest.java @@ -1,5 +1,7 @@ package com.alipay.antchain.bridge.plugins.dioxide.core; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.alipay.antchain.bridge.plugins.dioxide.conf.DioxideTypes; import org.junit.Assert; import org.junit.Test; @@ -26,6 +28,12 @@ public void testIsTxFinalized() { Assert.assertTrue(DioxideClient.isTxFinalized(transactionWithState( DioxideTypes.TxnConfirmState.TXN_ARCHIVED.name() ))); + Assert.assertTrue(DioxideClient.isTxFinalized(transactionWithBlockState( + DioxideTypes.BlockState.DUS_FINALIZED.name() + ))); + Assert.assertTrue(DioxideClient.isTxFinalized(transactionWithBlockState( + DioxideTypes.BlockState.DUS_ARCHIVED.name() + ))); } @Test @@ -44,6 +52,12 @@ public void testIsTxTerminalFailed() { Assert.assertTrue(DioxideClient.isTxTerminalFailed(transactionWithState( DioxideTypes.TxnConfirmState.TXN_EXPIRED.name() ))); + Assert.assertTrue(DioxideClient.isTxTerminalFailed(transactionWithBlockState( + DioxideTypes.BlockState.DUS_ARCHIVED_UNCLE.name() + ))); + Assert.assertFalse(DioxideClient.isTxTerminalFailed(transactionWithBlockState( + DioxideTypes.BlockState.DUS_ARCHIVED.name() + ))); } @Test @@ -118,6 +132,59 @@ public void testRelayHashNormalizationAndCycleProtection() { ); } + @Test + public void testFinalizedRelayGroupReportsEmbeddedInvocationFailure() { + JSONObject relayGroup = relayGroup( + DioxideTypes.TxnConfirmState.TXN_ARCHIVED.name(), + embeddedInvocation("AuthMsg.global.__relaylambda_8", "IVKRET_SUCCESS", List.of()), + embeddedInvocation("AuthMsg.global.__relaylambda_9", "IVKRET_EXCEPTION_THROWN", List.of()) + ); + + DioxideClient.RelayEventInspection inspection = DioxideClient.inspectRelayEvents(relayGroup, "relay-group"); + + Assert.assertEquals(DioxideClient.RelayEventState.FAILED, inspection.state()); + Assert.assertTrue(inspection.eventTargetTxHashes().isEmpty()); + Assert.assertTrue(inspection.errorMessage().contains("IVKRET_EXCEPTION_THROWN")); + Assert.assertTrue(inspection.errorMessage().contains("AuthMsg.global.__relaylambda_9")); + } + + @Test + public void testFinalizedRelayGroupReturnsProtocolEventTransactions() { + JSONObject relayGroup = relayGroup( + DioxideTypes.TxnConfirmState.TXN_ARCHIVED.name(), + embeddedInvocation("AuthMsg.global.__relaylambda_8", "IVKRET_SUCCESS", List.of()), + embeddedInvocation( + "AuthMsg.global.__relaylambda_9", + "IVKRET_SUCCESS", + List.of("target-a:0", "target-b", "target-a:1") + ) + ); + + DioxideClient.RelayEventInspection inspection = DioxideClient.inspectRelayEvents(relayGroup, "relay-group"); + + Assert.assertEquals(DioxideClient.RelayEventState.READY, inspection.state()); + Assert.assertEquals(List.of("target-a", "target-b"), inspection.eventTargetTxHashes()); + Assert.assertEquals("", inspection.errorMessage()); + } + + @Test + public void testMissingRelayEventsRemainPendingOnlyBeforeFinality() { + Assert.assertEquals( + DioxideClient.RelayEventState.PENDING, + DioxideClient.inspectRelayEvents( + relayGroup(DioxideTypes.TxnConfirmState.TXN_CONFIRMED.name()), + "relay-group" + ).state() + ); + Assert.assertEquals( + DioxideClient.RelayEventState.FAILED, + DioxideClient.inspectRelayEvents( + relayGroup(DioxideTypes.TxnConfirmState.TXN_ARCHIVED.name()), + "relay-group" + ).state() + ); + } + private DioxideTransaction transactionWithState(String state) { return DioxideTransaction.builder().txHash("tx-hash").confirmState(state).build(); } @@ -130,10 +197,34 @@ private DioxideTransaction transactionWithRelays(String txHash, String state, Li .build(); } + private DioxideTransaction transactionWithBlockState(String state) { + return DioxideTransaction.builder().state(state).build(); + } + private DioxideClient.TxFinalityResult evaluate( DioxideTransaction root, Map transactions ) { return DioxideClient.evaluateTxFinalityWithRelays(root, transactions::get); } + + private JSONObject relayGroup(String confirmState, JSONObject... embeddedInvocations) { + JSONObject relayGroup = new JSONObject(); + relayGroup.put("Hash", "relay-group"); + relayGroup.put("ConfirmState", confirmState); + JSONArray relays = new JSONArray(); + relays.addAll(List.of(embeddedInvocations)); + relayGroup.put("Relays", relays); + return relayGroup; + } + + private JSONObject embeddedInvocation(String function, String status, List relays) { + JSONObject invocation = new JSONObject(); + invocation.put("Status", status); + invocation.put("Relays", relays); + JSONObject embedded = new JSONObject(); + embedded.put("Function", function); + embedded.put("Invocation", invocation); + return embedded; + } } diff --git a/acb-sdk/pluginset/dioxide2/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideClient.java b/acb-sdk/pluginset/dioxide2/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideClient.java index 8d66fe97..2de3533d 100644 --- a/acb-sdk/pluginset/dioxide2/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideClient.java +++ b/acb-sdk/pluginset/dioxide2/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideClient.java @@ -76,6 +76,8 @@ public class DioxideClient { private static final String RECV_MESSAGE_IN_PROTOCOL = "recvMessageInProtocol:name"; + private static final String INVOCATION_SUCCESS = "IVKRET_SUCCESS"; + public DioxideClient(DioxideConfig config, Logger bbcLogger) { this.bbcLogger = bbcLogger; this.config = config; @@ -203,39 +205,17 @@ public CrossChainMessageReceipt getCrossChainMessageReceipt(DioxideTransaction d List eventTargetTxHashes = new ArrayList<>(); for (String tx2Hash : tx2Hashes) { JSONObject tx2 = getTransactionJonObjectByHash(tx2Hash); - if (tx2 == null) { - eventStructurePending = true; - continue; - } - JSONArray eventRelays = tx2.getJSONArray("Relays"); - if (CollUtil.isEmpty(eventRelays)) { - eventStructurePending = true; - continue; - } - List currentEventTxs = eventRelays.toJavaList(DioxideTransaction.class); - if (CollUtil.isEmpty(currentEventTxs)) { - eventStructurePending = true; - continue; - } - int eventTargetTxCountBefore = eventTargetTxHashes.size(); - for (DioxideTransaction eventTx : currentEventTxs) { - // Items in tx2.Relays are embedded invocation records, not standalone transactions. - if (eventTx == null || eventTx.getInvocation() == null - || CollUtil.isEmpty(eventTx.getInvocation().getRelays())) { - continue; - } - for (String eventTargetTxReference : eventTx.getInvocation().getRelays()) { - String eventTargetTxHash = normalizeRelayTxHash(eventTargetTxReference); - if (StrUtil.isEmpty(eventTargetTxHash)) { - eventStructurePending = true; - } else { - eventTargetTxHashes.add(eventTargetTxHash); - } - } - } - if (eventTargetTxHashes.size() == eventTargetTxCountBefore) { - eventStructurePending = true; + RelayEventInspection relayEventInspection = inspectRelayEvents(tx2, tx2Hash); + if (relayEventInspection.state() == RelayEventState.FAILED) { + return buildCrossChainMessageReceipt( + dioxideTransaction, + true, + false, + relayEventInspection.errorMessage() + ); } + eventStructurePending |= relayEventInspection.state() == RelayEventState.PENDING; + eventTargetTxHashes.addAll(relayEventInspection.eventTargetTxHashes()); } TxFinalityResult pendingEventFinality = eventStructurePending @@ -965,21 +945,25 @@ private boolean isTxConfirmedWithRelays(DioxideTransaction dioxideTransaction) { } public boolean isTxConfirmed(DioxideTransaction tx) { - if (tx == null || tx.getConfirmState() == null) { + if (tx == null) { return false; } - return DioxideTypes.TXN_CONFIRMED_STATUS.contains(tx.getConfirmState()); + return (tx.getConfirmState() != null + && DioxideTypes.TXN_CONFIRMED_STATUS.contains(tx.getConfirmState())) + || isDurablyCommitted(tx); } public static boolean isTxFinalized(DioxideTransaction tx) { - if (tx == null || tx.getConfirmState() == null) { + if (tx == null) { return false; } - return DioxideTypes.TXN_FINALIZED_STATUS.contains(tx.getConfirmState()); + return (tx.getConfirmState() != null + && DioxideTypes.TXN_FINALIZED_STATUS.contains(tx.getConfirmState())) + || isDurablyCommitted(tx); } static boolean isTxTerminalFailed(DioxideTransaction tx) { - if (tx == null || tx.getConfirmState() == null) { + if (tx == null) { return false; } return StrUtil.equalsAny( @@ -987,6 +971,19 @@ static boolean isTxTerminalFailed(DioxideTransaction tx) { DioxideTypes.TxnConfirmState.TXN_RELAY_INVALIDED.name(), DioxideTypes.TxnConfirmState.TXN_ABORTED.name(), DioxideTypes.TxnConfirmState.TXN_EXPIRED.name() + ) || StrUtil.equalsAny( + tx.getState(), + DioxideTypes.BlockState.DUS_INVALID.name(), + DioxideTypes.BlockState.DUS_FORKED.name(), + DioxideTypes.BlockState.DUS_ARCHIVED_UNCLE.name() + ); + } + + private static boolean isDurablyCommitted(DioxideTransaction tx) { + return StrUtil.equalsAny( + tx.getState(), + DioxideTypes.BlockState.DUS_FINALIZED.name(), + DioxideTypes.BlockState.DUS_ARCHIVED.name() ); } @@ -1069,6 +1066,73 @@ static String normalizeRelayTxHash(String relayTxReference) { return separatorIndex >= 0 ? relayTxReference.substring(0, separatorIndex) : relayTxReference; } + static RelayEventInspection inspectRelayEvents(JSONObject relayGroup, String relayGroupTxHash) { + if (relayGroup == null) { + return new RelayEventInspection(RelayEventState.PENDING, List.of(), ""); + } + + DioxideTransaction relayGroupTransaction = relayGroup.toJavaObject(DioxideTransaction.class); + boolean relayGroupFinalized = isTxFinalized(relayGroupTransaction); + JSONArray eventRelays = relayGroup.getJSONArray("Relays"); + if (CollUtil.isEmpty(eventRelays)) { + return relayGroupFinalized + ? failedRelayEventInspection(relayGroupTxHash, "contains no embedded relay invocations") + : new RelayEventInspection(RelayEventState.PENDING, List.of(), ""); + } + + List embeddedInvocations = eventRelays.toJavaList(DioxideTransaction.class); + if (CollUtil.isEmpty(embeddedInvocations)) { + return relayGroupFinalized + ? failedRelayEventInspection(relayGroupTxHash, "contains no decodable embedded relay invocations") + : new RelayEventInspection(RelayEventState.PENDING, List.of(), ""); + } + + List eventTargetTxHashes = new ArrayList<>(); + for (DioxideTransaction embeddedInvocation : embeddedInvocations) { + if (embeddedInvocation == null || embeddedInvocation.getInvocation() == null) { + continue; + } + String invocationStatus = embeddedInvocation.getInvocation().getStatus(); + if (StrUtil.isNotEmpty(invocationStatus) && !StrUtil.equals(invocationStatus, INVOCATION_SUCCESS)) { + return failedRelayEventInspection( + relayGroupTxHash, + String.format( + "embedded invocation %s failed with status %s", + StrUtil.emptyToDefault(embeddedInvocation.getFunction(), "unknown"), + invocationStatus + ) + ); + } + if (CollUtil.isEmpty(embeddedInvocation.getInvocation().getRelays())) { + continue; + } + embeddedInvocation.getInvocation().getRelays().stream() + .map(DioxideClient::normalizeRelayTxHash) + .filter(StrUtil::isNotEmpty) + .forEach(eventTargetTxHashes::add); + } + + List distinctTargetTxHashes = eventTargetTxHashes.stream().distinct().toList(); + if (CollUtil.isNotEmpty(distinctTargetTxHashes)) { + return new RelayEventInspection(RelayEventState.READY, distinctTargetTxHashes, ""); + } + return relayGroupFinalized + ? failedRelayEventInspection(relayGroupTxHash, "produced no protocol event transaction") + : new RelayEventInspection(RelayEventState.PENDING, List.of(), ""); + } + + private static RelayEventInspection failedRelayEventInspection(String relayGroupTxHash, String reason) { + return new RelayEventInspection( + RelayEventState.FAILED, + List.of(), + String.format( + "relay transaction %s %s", + StrUtil.emptyToDefault(relayGroupTxHash, "unknown"), + reason + ) + ); + } + enum TxFinalityState { PENDING, FINALIZED, @@ -1078,6 +1142,19 @@ enum TxFinalityState { record TxFinalityResult(TxFinalityState state, String txHash, String confirmState) { } + enum RelayEventState { + PENDING, + READY, + FAILED + } + + record RelayEventInspection( + RelayEventState state, + List eventTargetTxHashes, + String errorMessage + ) { + } + @SneakyThrows public String sendTransaction(String params, boolean sync) { // getBbcLogger().info("params of compose: \n{}", JSON.toJSONString(JSON.parseObject(params), SerializerFeature.PrettyFormat)); diff --git a/acb-sdk/pluginset/dioxide2/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideTransaction.java b/acb-sdk/pluginset/dioxide2/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideTransaction.java index 3a1dfffa..dc0e1aed 100644 --- a/acb-sdk/pluginset/dioxide2/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideTransaction.java +++ b/acb-sdk/pluginset/dioxide2/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideTransaction.java @@ -61,6 +61,14 @@ public class DioxideTransaction { @JSONField(name = "ConfirmState") private String confirmState; + /** + * Dioxide nodes may expose the durable transaction state without a + * ConfirmState (notably for the final relay transactions). Keep both + * fields so finality can be derived from the node's actual response. + */ + @JSONField(name = "State") + private String state; + @Data @NoArgsConstructor diff --git a/acb-sdk/pluginset/dioxide2/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideClientFinalityTest.java b/acb-sdk/pluginset/dioxide2/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideClientFinalityTest.java index 0126a9f1..b7f7b09d 100644 --- a/acb-sdk/pluginset/dioxide2/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideClientFinalityTest.java +++ b/acb-sdk/pluginset/dioxide2/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/dioxide2/core/DioxideClientFinalityTest.java @@ -1,5 +1,7 @@ package com.alipay.antchain.bridge.plugins.dioxide2.core; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.alipay.antchain.bridge.plugins.dioxide2.conf.DioxideTypes; import org.junit.Assert; import org.junit.Test; @@ -26,6 +28,12 @@ public void testIsTxFinalized() { Assert.assertTrue(DioxideClient.isTxFinalized(transactionWithState( DioxideTypes.TxnConfirmState.TXN_ARCHIVED.name() ))); + Assert.assertTrue(DioxideClient.isTxFinalized(transactionWithBlockState( + DioxideTypes.BlockState.DUS_FINALIZED.name() + ))); + Assert.assertTrue(DioxideClient.isTxFinalized(transactionWithBlockState( + DioxideTypes.BlockState.DUS_ARCHIVED.name() + ))); } @Test @@ -44,6 +52,12 @@ public void testIsTxTerminalFailed() { Assert.assertTrue(DioxideClient.isTxTerminalFailed(transactionWithState( DioxideTypes.TxnConfirmState.TXN_EXPIRED.name() ))); + Assert.assertTrue(DioxideClient.isTxTerminalFailed(transactionWithBlockState( + DioxideTypes.BlockState.DUS_ARCHIVED_UNCLE.name() + ))); + Assert.assertFalse(DioxideClient.isTxTerminalFailed(transactionWithBlockState( + DioxideTypes.BlockState.DUS_ARCHIVED.name() + ))); } @Test @@ -118,6 +132,59 @@ public void testRelayHashNormalizationAndCycleProtection() { ); } + @Test + public void testFinalizedRelayGroupReportsEmbeddedInvocationFailure() { + JSONObject relayGroup = relayGroup( + DioxideTypes.TxnConfirmState.TXN_ARCHIVED.name(), + embeddedInvocation("AuthMsg.global.__relaylambda_8", "IVKRET_SUCCESS", List.of()), + embeddedInvocation("AuthMsg.global.__relaylambda_9", "IVKRET_EXCEPTION_THROWN", List.of()) + ); + + DioxideClient.RelayEventInspection inspection = DioxideClient.inspectRelayEvents(relayGroup, "relay-group"); + + Assert.assertEquals(DioxideClient.RelayEventState.FAILED, inspection.state()); + Assert.assertTrue(inspection.eventTargetTxHashes().isEmpty()); + Assert.assertTrue(inspection.errorMessage().contains("IVKRET_EXCEPTION_THROWN")); + Assert.assertTrue(inspection.errorMessage().contains("AuthMsg.global.__relaylambda_9")); + } + + @Test + public void testFinalizedRelayGroupReturnsProtocolEventTransactions() { + JSONObject relayGroup = relayGroup( + DioxideTypes.TxnConfirmState.TXN_ARCHIVED.name(), + embeddedInvocation("AuthMsg.global.__relaylambda_8", "IVKRET_SUCCESS", List.of()), + embeddedInvocation( + "AuthMsg.global.__relaylambda_9", + "IVKRET_SUCCESS", + List.of("target-a:0", "target-b", "target-a:1") + ) + ); + + DioxideClient.RelayEventInspection inspection = DioxideClient.inspectRelayEvents(relayGroup, "relay-group"); + + Assert.assertEquals(DioxideClient.RelayEventState.READY, inspection.state()); + Assert.assertEquals(List.of("target-a", "target-b"), inspection.eventTargetTxHashes()); + Assert.assertEquals("", inspection.errorMessage()); + } + + @Test + public void testMissingRelayEventsRemainPendingOnlyBeforeFinality() { + Assert.assertEquals( + DioxideClient.RelayEventState.PENDING, + DioxideClient.inspectRelayEvents( + relayGroup(DioxideTypes.TxnConfirmState.TXN_CONFIRMED.name()), + "relay-group" + ).state() + ); + Assert.assertEquals( + DioxideClient.RelayEventState.FAILED, + DioxideClient.inspectRelayEvents( + relayGroup(DioxideTypes.TxnConfirmState.TXN_ARCHIVED.name()), + "relay-group" + ).state() + ); + } + private DioxideTransaction transactionWithState(String state) { return DioxideTransaction.builder().txHash("tx-hash").confirmState(state).build(); } @@ -130,10 +197,34 @@ private DioxideTransaction transactionWithRelays(String txHash, String state, Li .build(); } + private DioxideTransaction transactionWithBlockState(String state) { + return DioxideTransaction.builder().state(state).build(); + } + private DioxideClient.TxFinalityResult evaluate( DioxideTransaction root, Map transactions ) { return DioxideClient.evaluateTxFinalityWithRelays(root, transactions::get); } + + private JSONObject relayGroup(String confirmState, JSONObject... embeddedInvocations) { + JSONObject relayGroup = new JSONObject(); + relayGroup.put("Hash", "relay-group"); + relayGroup.put("ConfirmState", confirmState); + JSONArray relays = new JSONArray(); + relays.addAll(List.of(embeddedInvocations)); + relayGroup.put("Relays", relays); + return relayGroup; + } + + private JSONObject embeddedInvocation(String function, String status, List relays) { + JSONObject invocation = new JSONObject(); + invocation.put("Status", status); + invocation.put("Relays", relays); + JSONObject embedded = new JSONObject(); + embedded.put("Function", function); + embedded.put("Invocation", invocation); + return embedded; + } } diff --git a/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/EthereumBBCService.java b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/EthereumBBCService.java index 7cb99079..e9af8aed 100644 --- a/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/EthereumBBCService.java +++ b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/EthereumBBCService.java @@ -290,8 +290,10 @@ public void setupSDPMessageContract() { } if (ObjectUtil.isNotNull(this.bbcContext.getSdpContract()) && StrUtil.isNotEmpty(this.bbcContext.getSdpContract().getContractAddress())) { - // If the contract has been pre-deployed and the contract address is configured in the configuration file, - // there is no need to redeploy. + if (!acbEthClient.ensureSdpMonitorRouting( + this.bbcContext.getSdpContract().getContractAddress())) { + throw new RuntimeException("failed to upgrade SDP for V1/V2/V3 monitor routing"); + } return; } @@ -316,8 +318,10 @@ public void setupMonitorContract() { } if (ObjectUtil.isNotNull(this.bbcContext.getMonitorContract()) && StrUtil.isNotEmpty(this.bbcContext.getMonitorContract().getContractAddress())) { - // If the contract has been pre-deployed and the contract address is configured in the configuration file, - // there is no need to redeploy. + if (!acbEthClient.ensureMonitorImplementation( + this.bbcContext.getMonitorContract().getContractAddress())) { + throw new RuntimeException("failed to upgrade Monitor receive-side implementation"); + } return; } @@ -354,6 +358,20 @@ public void setProtocol(String protocolAddress, String protocolType) { throw new RuntimeException("empty am contract in bbc context"); } + String currentProtocol = acbEthClient.getProtocolFromAuthMsg( + this.bbcContext.getAuthMessageContract().getContractAddress(), + protocolType + ); + if (StrUtil.equalsIgnoreCase(currentProtocol, protocolAddress)) { + getBBCLogger().info( + "skip setting protocol {} type {} on AM because it is already configured", + protocolAddress, + protocolType + ); + this.bbcContext.getAuthMessageContract().setStatus(ContractStatusEnum.CONTRACT_READY); + return; + } + acbEthClient.setProtocolToAuthMsg(this.bbcContext.getAuthMessageContract().getContractAddress(), protocolAddress, protocolType); // 4. update am contract status diff --git a/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/core/AcbEthClient.java b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/core/AcbEthClient.java index 25daa0f7..bac3e774 100644 --- a/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/core/AcbEthClient.java +++ b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/core/AcbEthClient.java @@ -58,6 +58,10 @@ public class AcbEthClient { + private static final BigInteger MONITOR_IMPLEMENTATION_VERSION = BigInteger.valueOf(5L); + + private static final BigInteger SDP_MONITOR_ROUTING_VERSION = BigInteger.valueOf(3L); + private static final String SEND_AUTH_MESSAGE_LOG_TOPIC = "0x79b7516b1b7a6a39fb4b7b22e8667cd3744e5c27425292f8a9f49d1042c0c651"; private static final LogsBloomFilter SEND_AUTH_MESSAGE_LOG_TOPIC_FILTER = LogsBloomFilter.builder() @@ -163,6 +167,124 @@ public ProxyAdmin deployProxyAdmin() { } } + public boolean ensureSdpMonitorRouting(String sdpContractAddress) { + if (isSdpMonitorRoutingSupported(sdpContractAddress)) { + return true; + } + upgradeTransparentProxy(sdpContractAddress, deploySdpImplementation(), "SDP"); + return isSdpMonitorRoutingSupported(sdpContractAddress); + } + + public boolean ensureMonitorImplementation(String monitorContractAddress) { + if (isMonitorImplementationSupported(monitorContractAddress)) { + return true; + } + upgradeTransparentProxy(monitorContractAddress, deployMonitorImplementation(), "Monitor"); + return isMonitorImplementationSupported(monitorContractAddress); + } + + private boolean isSdpMonitorRoutingSupported(String sdpContractAddress) { + try { + SDPMsg sdp = SDPMsg.load( + sdpContractAddress, + web3j, + rawTransactionManager, + new DefaultGasProvider()); + return SDP_MONITOR_ROUTING_VERSION.equals(sdp.getMonitorRoutingVersion().send()); + } catch (Exception e) { + getBbcLogger().info( + "SDP {} does not expose monitor routing version {}", + sdpContractAddress, + SDP_MONITOR_ROUTING_VERSION); + return false; + } + } + + private boolean isMonitorImplementationSupported(String monitorContractAddress) { + try { + Monitor monitor = Monitor.load( + monitorContractAddress, + web3j, + rawTransactionManager, + new DefaultGasProvider()); + return MONITOR_IMPLEMENTATION_VERSION.equals(monitor.getImplementationVersion().send()); + } catch (Exception e) { + getBbcLogger().info( + "Monitor {} does not expose implementation version {}", + monitorContractAddress, + MONITOR_IMPLEMENTATION_VERSION); + return false; + } + } + + private String deploySdpImplementation() { + try { + return SDPMsg.deploy( + web3j, + rawTransactionManager, + new AcbGasProvider( + contractGasPriceProvider, + createDeployGasLimitProvider(SDPMsg.BINARY))) + .send() + .getContractAddress(); + } catch (Exception e) { + throw new RuntimeException("failed to deploy monitor-routing SDP implementation", e); + } + } + + private String deployMonitorImplementation() { + try { + return Monitor.deploy( + web3j, + rawTransactionManager, + new AcbGasProvider( + contractGasPriceProvider, + createDeployGasLimitProvider(Monitor.BINARY))) + .send() + .getContractAddress(); + } catch (Exception e) { + throw new RuntimeException("failed to deploy receive-side Monitor implementation", e); + } + } + + private void upgradeTransparentProxy(String proxyAddress, String implementationAddress, String contractName) { + if (!config.isUpgradableContracts()) { + throw new IllegalStateException( + contractName + " requires a receive-side regulatory upgrade, but upgradableContracts is disabled"); + } + if (StrUtil.isEmpty(config.getProxyAdmin())) { + throw new IllegalStateException("empty proxy admin for " + contractName + " upgrade"); + } + + ProxyAdmin proxyAdmin = ProxyAdmin.load( + config.getProxyAdmin(), + web3j, + rawTransactionManager, + new DefaultGasProvider()); + try { + TransactionReceipt receipt = proxyAdmin.upgrade(proxyAddress, implementationAddress).send(); + if (!receipt.isStatusOK()) { + throw new IllegalStateException( + String.format( + "%s proxy upgrade failed: proxy=%s, implementation=%s, tx=%s", + contractName, + proxyAddress, + implementationAddress, + receipt.getTransactionHash())); + } + getBbcLogger().info( + "upgrade {} proxy {} to implementation {} by tx {}", + contractName, + proxyAddress, + implementationAddress, + receipt.getTransactionHash()); + } catch (Exception e) { + throw new RuntimeException( + String.format("failed to upgrade %s proxy %s", contractName, proxyAddress), + e); + } + } + public String deployAuthMsg() { AuthMsg authMsg; try { diff --git a/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/helper/EstimateGasLimitProvider.java b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/helper/EstimateGasLimitProvider.java index a14efa76..e6f816df 100644 --- a/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/helper/EstimateGasLimitProvider.java +++ b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/ethereum3/helper/EstimateGasLimitProvider.java @@ -30,6 +30,17 @@ @Builder public class EstimateGasLimitProvider implements IGasLimitProvider { + /** + * eth_estimateGas is evaluated against the node's latest state. Several relayer + * transactions can be queued before that state advances, so an estimate that is + * exact for the first transaction may be too small for a later transaction in + * the same block. Keep a multiplicative margin in addition to the operator's + * configured fixed margin. + */ + static final BigInteger ESTIMATE_SAFETY_NUMERATOR = BigInteger.valueOf(6L); + + static final BigInteger ESTIMATE_SAFETY_DENOMINATOR = BigInteger.valueOf(5L); + private Web3j web3j; private String fromAddress; @@ -74,6 +85,20 @@ private BigInteger getGasLimitLogic(String contractFunc) { throw new RuntimeException(StrUtil.format("failed to estimate gas for {} : {}", contractFunc, ethEstimateGas.getError().getMessage())); } - return ethEstimateGas.getAmountUsed().add(BigInteger.valueOf(extraGasLimit)); + return applySafetyMargin(ethEstimateGas.getAmountUsed(), extraGasLimit); + } + + static BigInteger applySafetyMargin(BigInteger estimatedGas, long extraGasLimit) { + if (estimatedGas == null || estimatedGas.signum() < 0) { + throw new IllegalArgumentException("estimated gas must be a non-negative integer"); + } + if (extraGasLimit < 0) { + throw new IllegalArgumentException("extra gas limit must be non-negative"); + } + return estimatedGas + .multiply(ESTIMATE_SAFETY_NUMERATOR) + .add(ESTIMATE_SAFETY_DENOMINATOR.subtract(BigInteger.ONE)) + .divide(ESTIMATE_SAFETY_DENOMINATOR) + .add(BigInteger.valueOf(extraGasLimit)); } } diff --git a/acb-sdk/pluginset/ethereum3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/ethereum3/EthereumBBCServiceTest.java b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/ethereum3/EthereumBBCServiceTest.java index a7e8328d..78ecac51 100644 --- a/acb-sdk/pluginset/ethereum3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/ethereum3/EthereumBBCServiceTest.java +++ b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/ethereum3/EthereumBBCServiceTest.java @@ -598,6 +598,11 @@ public void testSetProtocol() throws Exception { ctx.getSdpContract().getContractAddress(), "0"); + // setup-bbccontracts is intentionally repeatable for in-place SDP/Monitor upgrades. + ethereumBBCService.setProtocol( + ctx.getSdpContract().getContractAddress(), + "0"); + String addr = AuthMsg.load( ethereumBBCService.getBbcContext().getAuthMessageContract().getContractAddress(), ethereumBBCService.getAcbEthClient().getWeb3j(), diff --git a/acb-sdk/pluginset/ethereum3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/ethereum3/EthereumMonitorV123CompatibilityTest.java b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/ethereum3/EthereumMonitorV123CompatibilityTest.java new file mode 100644 index 00000000..9fba8366 --- /dev/null +++ b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/ethereum3/EthereumMonitorV123CompatibilityTest.java @@ -0,0 +1,34 @@ +package com.alipay.antchain.bridge.plugins.ethereum3; + +import com.alipay.antchain.bridge.plugins.ethereum3.abi.AppContract; +import com.alipay.antchain.bridge.plugins.ethereum3.abi.Monitor; +import com.alipay.antchain.bridge.plugins.ethereum3.abi.SDPMsg; +import org.junit.Assert; +import org.junit.Test; + +public class EthereumMonitorV123CompatibilityTest { + + @Test + public void generatedSdpRoutesV2AndV3ThroughMonitor() { + Assert.assertEquals("getMonitorRoutingVersion", SDPMsg.FUNC_GETMONITORROUTINGVERSION); + Assert.assertEquals("sendMessageV2FromMonitor", SDPMsg.FUNC_SENDMESSAGEV2FROMMONITOR); + Assert.assertEquals("sendUnorderedMessageV2FromMonitor", SDPMsg.FUNC_SENDUNORDEREDMESSAGEV2FROMMONITOR); + Assert.assertEquals("sendMessageV3FromMonitor", SDPMsg.FUNC_SENDMESSAGEV3FROMMONITOR); + Assert.assertEquals("sendUnorderedMessageV3FromMonitor", SDPMsg.FUNC_SENDUNORDEREDMESSAGEV3FROMMONITOR); + Assert.assertFalse(SDPMsg.BINARY.isEmpty()); + } + + @Test + public void generatedMonitorUnwrapsEveryRequestAndAckVersion() { + Assert.assertEquals("recvMessageFromSDP", Monitor.FUNC_RECVMESSAGEFROMSDP); + Assert.assertEquals("recvUnorderedMessageFromSDP", Monitor.FUNC_RECVUNORDEREDMESSAGEFROMSDP); + Assert.assertEquals("recvMessageV2FromSDP", Monitor.FUNC_RECVMESSAGEV2FROMSDP); + Assert.assertEquals("recvUnorderedMessageV2FromSDP", Monitor.FUNC_RECVUNORDEREDMESSAGEV2FROMSDP); + Assert.assertEquals("recvMessageV3FromSDP", Monitor.FUNC_RECVMESSAGEV3FROMSDP); + Assert.assertEquals("recvUnorderedMessageV3FromSDP", Monitor.FUNC_RECVUNORDEREDMESSAGEV3FROMSDP); + Assert.assertEquals("ackOnSuccessFromSDP", Monitor.FUNC_ACKONSUCCESSFROMSDP); + Assert.assertEquals("ackOnErrorFromSDP", Monitor.FUNC_ACKONERRORFROMSDP); + Assert.assertEquals("sendV3", AppContract.FUNC_SENDV3); + Assert.assertEquals("sendUnorderedV3", AppContract.FUNC_SENDUNORDEREDV3); + } +} diff --git a/acb-sdk/pluginset/ethereum3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/ethereum3/helper/EstimateGasLimitProviderTest.java b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/ethereum3/helper/EstimateGasLimitProviderTest.java new file mode 100644 index 00000000..362eab59 --- /dev/null +++ b/acb-sdk/pluginset/ethereum3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/ethereum3/helper/EstimateGasLimitProviderTest.java @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Ant Group + * + * 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 com.alipay.antchain.bridge.plugins.ethereum3.helper; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; + +import java.math.BigInteger; + +import org.junit.Test; + +public class EstimateGasLimitProviderTest { + + @Test + public void shouldApplyPercentageAndFixedMargins() { + assertEquals( + BigInteger.valueOf(130L), + EstimateGasLimitProvider.applySafetyMargin(BigInteger.valueOf(100L), 10L) + ); + assertEquals( + BigInteger.valueOf(2L), + EstimateGasLimitProvider.applySafetyMargin(BigInteger.ONE, 0L) + ); + } + + @Test + public void shouldRejectNegativeInputs() { + assertThrows( + IllegalArgumentException.class, + () -> EstimateGasLimitProvider.applySafetyMargin(BigInteger.valueOf(-1L), 0L) + ); + assertThrows( + IllegalArgumentException.class, + () -> EstimateGasLimitProvider.applySafetyMargin(BigInteger.ONE, -1L) + ); + } +} diff --git a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/AppContract.sol b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/AppContract.sol index bc996119..0209a916 100644 --- a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/AppContract.sol +++ b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/AppContract.sol @@ -63,7 +63,6 @@ contract AppContract is IContractUsingSDP, Ownable { emit recvCrosschainMsg(senderDomain, author, message, true); } - // notice: monitor only support the sendV1 version message function sendUnorderedMessage(string memory receiverDomain, bytes32 receiver, bytes memory message) external { IMonitor(monitorAddress).sendUnorderedMonitorMessage(receiverDomain, receiver, message); @@ -91,6 +90,42 @@ contract AppContract is IContractUsingSDP, Ownable { latest_msg_id_sent_unorder = sdp.sendUnorderedMessageV2(domain, receiver, atomic, _msg); } + function sendV3( + bytes32 receiver, + string memory domain, + bool atomic, + bytes memory _msg, + uint8 timeoutMeasure, + uint256 timeout + ) public { + latest_msg_id_sent_order = ISDPMessage(sdpAddress).sendMessageV3( + domain, + receiver, + atomic, + _msg, + timeoutMeasure, + timeout + ); + } + + function sendUnorderedV3( + bytes32 receiver, + string memory domain, + bool atomic, + bytes memory _msg, + uint8 timeoutMeasure, + uint256 timeout + ) public { + latest_msg_id_sent_unorder = ISDPMessage(sdpAddress).sendUnorderedMessageV3( + domain, + receiver, + atomic, + _msg, + timeoutMeasure, + timeout + ); + } + function ackOnSuccess(bytes32 messageId, string memory receiverDomain, bytes32 receiver, uint32 sequence, uint64 nonce, bytes memory message) public { emit AckOnSuccess(messageId, receiverDomain, receiver, sequence, nonce, message); latest_msg_id_ack_success = messageId; @@ -116,4 +151,4 @@ contract AppContract is IContractUsingSDP, Ownable { * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; -} \ No newline at end of file +} diff --git a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/Monitor.sol b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/Monitor.sol index 4a9a67dc..dedf4234 100755 --- a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/Monitor.sol +++ b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/Monitor.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import "./interfaces/IContractUsingSDP.sol"; import "./interfaces/IContractUsingMonitor.sol"; +import "./interfaces/IContractWithAcks.sol"; import "./interfaces/ISDPMessage.sol"; import "./interfaces/IMonitor.sol"; import "./interfaces/IMonitorVerifier.sol"; @@ -12,6 +13,11 @@ import "./@openzeppelin/contracts/proxy/utils/Initializable.sol"; // 接受监管指令; 只在发送方进行事前监管 contract Monitor is IMonitor, IContractUsingMonitor, Ownable, Initializable { + // Version 4 fixes monitor-control handling: CLOSE/OPEN/ROLLBACK are stored + // as the protocol enum instead of treating every non-zero value as OPEN. + // Version 5 preserves non-word-aligned payloads emitted by MySolidity chains. + uint32 public constant IMPLEMENTATION_VERSION = 5; + using MonitorLib for MonitorOrder; using MonitorLib for MonitorMessage; @@ -53,13 +59,19 @@ contract Monitor is IMonitor, IContractUsingMonitor, Ownable, Initializable { sdpAddress = protocolAddress; } - function setMonitorVerifier(address newMonitorVerifierAddress) override external { + function setMonitorVerifier(address newMonitorVerifierAddress) override external onlyOwner { require(newMonitorVerifierAddress != address(0), "MonitorMsg: invalid MonitorVerifier contract"); monitorVerifierAddress = newMonitorVerifierAddress; } function setMonitorControl(uint32 monitorType) override external onlyOwner { - monitorControl = monitorType == 0 ? MonitorLib.MONITOR_CLOSE : MonitorLib.MONITOR_OPEN; + require( + monitorType == MonitorLib.MONITOR_CLOSE + || monitorType == MonitorLib.MONITOR_OPEN + || monitorType == MonitorLib.MONITOR_ROLLBACK, + "MonitorMsg: invalid monitor control" + ); + monitorControl = monitorType; } function getProtocol() external view returns (address) { @@ -74,6 +86,10 @@ contract Monitor is IMonitor, IContractUsingMonitor, Ownable, Initializable { return monitorVerifierAddress; } + function getImplementationVersion() external pure returns (uint32) { + return IMPLEMENTATION_VERSION; + } + // function getSuccessfulCallInMonitorOPEN() external view returns (uint32) { // return successfulCallInMonitorOPEN; // } @@ -92,7 +108,7 @@ contract Monitor is IMonitor, IContractUsingMonitor, Ownable, Initializable { // 执行事前监管的检查 if (monitorControl == MonitorLib.MONITOR_OPEN) { bool monitorResult = false; - monitorResult = PreMonitoring(receiverDomain, receiverID, message); + monitorResult = PreMonitoring(msg.sender, receiverDomain, receiverID, message); if(monitorResult == false) { revert("beforehand Monitor disapproval"); } @@ -119,7 +135,7 @@ contract Monitor is IMonitor, IContractUsingMonitor, Ownable, Initializable { // 执行事前监管的检查 if (monitorControl == MonitorLib.MONITOR_OPEN) { bool monitorResult = false; - monitorResult = PreMonitoring(receiverDomain, receiverID, message); + monitorResult = PreMonitoring(msg.sender, receiverDomain, receiverID, message); if(monitorResult == false) { revert("beforehand Monitor disapproval"); } @@ -140,6 +156,82 @@ contract Monitor is IMonitor, IContractUsingMonitor, Ownable, Initializable { _afterSendUnordered(); } + function sendMonitorMessageV2( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message + ) external override onlySubProtocols returns (bytes32) { + bytes memory rawMsg = _prepareMonitoredMessage(senderID, receiverDomain, receiverID, message); + return ISDPMessage(sdpAddress).sendMessageV2FromMonitor( + receiverDomain, receiverID, senderID, atomic, rawMsg + ); + } + + function sendUnorderedMonitorMessageV2( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message + ) external override onlySubProtocols returns (bytes32) { + bytes memory rawMsg = _prepareMonitoredMessage(senderID, receiverDomain, receiverID, message); + return ISDPMessage(sdpAddress).sendUnorderedMessageV2FromMonitor( + receiverDomain, receiverID, senderID, atomic, rawMsg + ); + } + + function sendMonitorMessageV3( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message, + uint8 timeoutMeasure, + uint256 timeout + ) external override onlySubProtocols returns (bytes32) { + bytes memory rawMsg = _prepareMonitoredMessage(senderID, receiverDomain, receiverID, message); + return ISDPMessage(sdpAddress).sendMessageV3FromMonitor( + receiverDomain, receiverID, senderID, atomic, rawMsg, timeoutMeasure, timeout + ); + } + + function sendUnorderedMonitorMessageV3( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message, + uint8 timeoutMeasure, + uint256 timeout + ) external override onlySubProtocols returns (bytes32) { + bytes memory rawMsg = _prepareMonitoredMessage(senderID, receiverDomain, receiverID, message); + return ISDPMessage(sdpAddress).sendUnorderedMessageV3FromMonitor( + receiverDomain, receiverID, senderID, atomic, rawMsg, timeoutMeasure, timeout + ); + } + + function _prepareMonitoredMessage( + address senderID, + string calldata receiverDomain, + bytes32 receiverID, + bytes calldata message + ) internal returns (bytes memory) { + if (monitorControl == MonitorLib.MONITOR_OPEN) { + require( + PreMonitoring(senderID, receiverDomain, receiverID, message), + "beforehand Monitor disapproval" + ); + } + MonitorMessage memory monitorMessage = MonitorMessage({ + monitorType: monitorControl, + monitorMsg: "", + message: message + }); + return monitorMessage.encode(); + } + // IContractUsingMonitor.sol里面的接口 function recvUnorderedMessageFromSDP(string memory senderDomain, bytes32 author, address receiverID, bytes memory message) external override onlySubProtocols { // 去掉监管字段 再向上传给app合约 @@ -203,11 +295,123 @@ contract Monitor is IMonitor, IContractUsingMonitor, Ownable, Initializable { } } - function PreMonitoring(string calldata receiverDomain, bytes32 receiverID, bytes calldata message) internal returns (bool) { + function recvUnorderedMessageV2FromSDP( + string memory senderDomain, + bytes32 author, + address receiverID, + bytes memory message + ) external override onlySubProtocols { + _recvVersionedMessage(senderDomain, author, receiverID, message, true); + } + + function recvMessageV2FromSDP( + string memory senderDomain, + bytes32 author, + address receiverID, + bytes memory message + ) external override onlySubProtocols { + _recvVersionedMessage(senderDomain, author, receiverID, message, false); + } + + function recvUnorderedMessageV3FromSDP( + string memory senderDomain, + bytes32 author, + address receiverID, + bytes memory message + ) external override onlySubProtocols { + _recvVersionedMessage(senderDomain, author, receiverID, message, true); + } + + function recvMessageV3FromSDP( + string memory senderDomain, + bytes32 author, + address receiverID, + bytes memory message + ) external override onlySubProtocols { + _recvVersionedMessage(senderDomain, author, receiverID, message, false); + } + + function _recvVersionedMessage( + string memory senderDomain, + bytes32 author, + address receiverID, + bytes memory rawMessage, + bool unordered + ) internal { + MonitorMessage memory monitorMessage; + monitorMessage.decode(rawMessage); + if (monitorMessage.monitorType == MonitorLib.MONITOR_OPEN) { + bool verified = IMonitorVerifier(monitorVerifierAddress).verifyMonitorNodeProofMessage(); + emit VerifyMonitorNodeProofMessage(senderDomain, author, receiverID, verified); + require(verified, "Monitor_Msg: MidMonitoring not pass"); + } else { + require( + monitorMessage.monitorType == MonitorLib.MONITOR_CLOSE + || monitorMessage.monitorType == MonitorLib.MONITOR_ROLLBACK, + "Monitor_Msg: wrong monitor type" + ); + } + + if (unordered) { + IContractUsingSDP(receiverID).recvUnorderedMessage( + senderDomain, author, monitorMessage.message + ); + } else { + IContractUsingSDP(receiverID).recvMessage( + senderDomain, author, monitorMessage.message + ); + } + } + + function ackOnSuccessFromSDP( + address receiverID, + bytes32 messageId, + string memory receiverDomain, + bytes32 receiver, + uint32 sequence, + uint64 nonce, + bytes memory message + ) external override onlySubProtocols { + MonitorMessage memory monitorMessage; + monitorMessage.decode(message); + IContractWithAcks(receiverID).ackOnSuccess( + messageId, + receiverDomain, + receiver, + sequence, + nonce, + monitorMessage.message + ); + } + + function ackOnErrorFromSDP( + address receiverID, + bytes32 messageId, + string memory receiverDomain, + bytes32 receiver, + uint32 sequence, + uint64 nonce, + bytes memory message, + string memory errorMsg + ) external override onlySubProtocols { + MonitorMessage memory monitorMessage; + monitorMessage.decode(message); + IContractWithAcks(receiverID).ackOnError( + messageId, + receiverDomain, + receiver, + sequence, + nonce, + monitorMessage.message, + errorMsg + ); + } + + function PreMonitoring(address senderAddress, string calldata receiverDomain, bytes32 receiverID, bytes calldata message) internal returns (bool) { bool result = false; // 事前监管逻辑 - bytes32 senderID = MonitorLib.encodeAddressIntoCrossChainID(msg.sender); + bytes32 senderID = MonitorLib.encodeAddressIntoCrossChainID(senderAddress); if(senderBlacklist[senderID]) { emit MonitorDisapproval(senderID, receiverDomain, @@ -295,4 +499,4 @@ contract Monitor is IMonitor, IContractUsingMonitor, Ownable, Initializable { * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; -} \ No newline at end of file +} diff --git a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/SDPMsg.sol b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/SDPMsg.sol index 74a3f19c..6d83847d 100644 --- a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/SDPMsg.sol +++ b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/SDPMsg.sol @@ -5,7 +5,7 @@ import "./interfaces/ISDPMessage.sol"; import "./interfaces/IAuthMessage.sol"; import "./interfaces/IContractUsingMonitor.sol"; import "./interfaces/IContractUsingSDP.sol"; -import "./interfaces/IContractWithAcks.sol"; +import "./interfaces/IMonitor.sol"; import "./lib/sdp/SDPLib.sol"; import "./lib/utils/Ownable.sol"; import "./@openzeppelin/contracts/proxy/utils/Initializable.sol"; @@ -13,6 +13,8 @@ import "./@openzeppelin/contracts/proxy/utils/Initializable.sol"; contract SDPMsg is ISDPMessage, Ownable, Initializable { + uint32 private constant MONITOR_ROUTING_VERSION = 3; + using SDPLib for SDPMessage; using SDPLib for SDPMessageV2; using SDPLib for SDPMessageV3; @@ -62,7 +64,7 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { } function setMonitorContract(address newMonitorAddress) override external onlyOwner { - require(newMonitorAddress != address(0), "SDPMsg: invalid monitor contract"); + require(newMonitorAddress != address(0), "SDP: bad monitor"); monitorAddress = newMonitorAddress; } @@ -70,6 +72,10 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { return monitorAddress; } + function getMonitorRoutingVersion() external pure returns (uint32) { + return MONITOR_ROUTING_VERSION; + } + function setAmContract(address newAmContract) override external onlyOwner { require(newAmContract != address(0), "SDPMsg: invalid am contract"); amAddress = newAmContract; @@ -124,7 +130,19 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { } function sendMessageV2(string calldata receiverDomain, bytes32 receiverID, bool atomic, bytes calldata message) override external returns (bytes32) { - _beforeSend(receiverDomain, receiverID, message); + return IMonitor(monitorAddress).sendMonitorMessageV2( + receiverDomain, receiverID, msg.sender, atomic, message + ); + } + + function sendMessageV2FromMonitor( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message + ) override external onlyMonitorMsg returns (bytes32) { + _beforeSend(receiverDomain, receiverID, message); SDPMessageV2 memory sdpMessage = SDPMessageV2( { @@ -134,14 +152,14 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { receiver: receiverID, atomicFlag: atomic ? SDPLib.SDP_V2_ATOMIC_FLAG_ATOMIC_REQUEST : SDPLib.SDP_V2_ATOMIC_FLAG_NONE_ATOMIC, nonce: SDPLib.MAX_NONCE, - sequence: _getAndUpdateSendSeq(receiverDomain, msg.sender, receiverID), + sequence: _getAndUpdateSendSeq(receiverDomain, senderID, receiverID), message: message, errorMsg: "" } ); sdpMessage.calcMessageId(localDomainHash); - IAuthMessage(amAddress).recvFromProtocol(msg.sender, sdpMessage.encode()); + IAuthMessage(amAddress).recvFromProtocol(senderID, sdpMessage.encode()); _afterSend(); @@ -149,6 +167,18 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { } function sendUnorderedMessageV2(string calldata receiverDomain, bytes32 receiverID, bool atomic, bytes calldata message) override external returns (bytes32) { + return IMonitor(monitorAddress).sendUnorderedMonitorMessageV2( + receiverDomain, receiverID, msg.sender, atomic, message + ); + } + + function sendUnorderedMessageV2FromMonitor( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message + ) override external onlyMonitorMsg returns (bytes32) { _beforeSendUnordered(receiverDomain, receiverID, message); SDPMessageV2 memory sdpMessage = SDPMessageV2( @@ -158,7 +188,7 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { receiveDomain: receiverDomain, receiver: receiverID, atomicFlag: atomic ? SDPLib.SDP_V2_ATOMIC_FLAG_ATOMIC_REQUEST : SDPLib.SDP_V2_ATOMIC_FLAG_NONE_ATOMIC, - nonce: _getAndUpdateSendNonce(receiverDomain, msg.sender, receiverID), + nonce: _getAndUpdateSendNonce(receiverDomain, senderID, receiverID), sequence: SDPLib.UNORDERED_SEQUENCE, message: message, errorMsg: "" @@ -166,7 +196,7 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { ); sdpMessage.calcMessageId(localDomainHash); - IAuthMessage(amAddress).recvFromProtocol(msg.sender, sdpMessage.encode()); + IAuthMessage(amAddress).recvFromProtocol(senderID, sdpMessage.encode()); _afterSendUnordered(); @@ -177,9 +207,30 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { function sendMessageV3(string calldata receiverDomain, bytes32 receiverID, bool atomic, bytes calldata message, uint8 _timeoutMeasure, uint256 _timeout) public returns (bytes32) { + return IMonitor(monitorAddress).sendMonitorMessageV3( + receiverDomain, + receiverID, + msg.sender, + atomic, + message, + _timeoutMeasure, + _timeout + ); + } + + function sendMessageV3FromMonitor( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message, + uint8 _timeoutMeasure, + uint256 _timeout + ) override external onlyMonitorMsg returns (bytes32) { + require( _timeoutMeasure >= SDPLib.SDP_V3_TIMEOUT_MEASUREMENT_NO_TIMEOUT && _timeoutMeasure <= SDPLib.SDP_V3_TIMEOUT_MEASUREMENT_RECEIVER_TIMESTAMP, - "SDP: invalid timeout measure" + "SDP: invalid timeout" ); _beforeSendUnordered(receiverDomain, receiverID, message); @@ -193,7 +244,7 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { receiver: receiver, atomicFlag: atomic ? SDPLib.SDP_V3_ATOMIC_FLAG_ATOMIC_REQUEST : SDPLib.SDP_V3_ATOMIC_FLAG_NONE_ATOMIC, nonce: SDPLib.MAX_NONCE, - sequence: _getAndUpdateSendSeq(receiverDomain, msg.sender, receiver), + sequence: _getAndUpdateSendSeq(receiverDomain, senderID, receiver), message: message, errorMsg: "", timeoutMeasure: _timeoutMeasure, @@ -205,7 +256,7 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { // v3消息才有的记录,用于超时回滚前的验证 sendSDPV3Msgs[sdpMessage.messageId] = true; - IAuthMessage(amAddress).recvFromProtocol(msg.sender, sdpMessage.encode()); + IAuthMessage(amAddress).recvFromProtocol(senderID, sdpMessage.encode()); _afterSend(); @@ -216,9 +267,30 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { function sendUnorderedMessageV3(string calldata receiverDomain, bytes32 receiverID, bool atomic, bytes calldata message, uint8 _timeoutMeasure, uint256 _timeout) public returns (bytes32) { + return IMonitor(monitorAddress).sendUnorderedMonitorMessageV3( + receiverDomain, + receiverID, + msg.sender, + atomic, + message, + _timeoutMeasure, + _timeout + ); + } + + function sendUnorderedMessageV3FromMonitor( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message, + uint8 _timeoutMeasure, + uint256 _timeout + ) override external onlyMonitorMsg returns (bytes32) { + require( _timeoutMeasure >= SDPLib.SDP_V3_TIMEOUT_MEASUREMENT_NO_TIMEOUT && _timeoutMeasure <= SDPLib.SDP_V3_TIMEOUT_MEASUREMENT_RECEIVER_TIMESTAMP, - "SDP: invalid timeout measure" + "SDP: invalid timeout" ); _beforeSendUnordered(receiverDomain, receiverID, message); @@ -231,7 +303,7 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { receiveDomain: receiverDomain, receiver: receiver, atomicFlag: atomic ? SDPLib.SDP_V3_ATOMIC_FLAG_ATOMIC_REQUEST : SDPLib.SDP_V3_ATOMIC_FLAG_NONE_ATOMIC, - nonce: _getAndUpdateSendNonce(receiverDomain, msg.sender, receiver), + nonce: _getAndUpdateSendNonce(receiverDomain, senderID, receiver), sequence: SDPLib.UNORDERED_SEQUENCE, message: message, errorMsg: "", @@ -243,7 +315,7 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { sendSDPV3Msgs[sdpMessage.messageId] = true; - IAuthMessage(amAddress).recvFromProtocol(msg.sender, sdpMessage.encode()); + IAuthMessage(amAddress).recvFromProtocol(senderID, sdpMessage.encode()); _afterSend(); @@ -261,7 +333,7 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { } else if (version == 3) { _processSDPv3(senderDomain, senderID, pkg); } else { - revert("unsupported sdp version"); + revert("bad sdp version"); } _afterRecv(); @@ -398,7 +470,12 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { errMsg = "receiver has no code"; } else { try - IContractUsingSDP(receiver).recvMessage(senderDomain, senderID, sdpMessage.message) + IContractUsingMonitor(monitorAddress).recvMessageV2FromSDP( + senderDomain, + senderID, + receiver, + sdpMessage.message + ) { res = true; } catch Error( @@ -421,7 +498,12 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { errMsg = "receiver has no code"; } else { try - IContractUsingSDP(sdpMessage.getReceiverAddress()).recvUnorderedMessage(senderDomain, senderID, sdpMessage.message) + IContractUsingMonitor(monitorAddress).recvUnorderedMessageV2FromSDP( + senderDomain, + senderID, + sdpMessage.getReceiverAddress(), + sdpMessage.message + ) { res = true; } catch Error( @@ -448,7 +530,8 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { } function _processSDPv2AckSuccess(string calldata senderDomain, bytes32 senderID, SDPMessageV2 memory sdpMessage) internal { - IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnSuccess( + IContractUsingMonitor(monitorAddress).ackOnSuccessFromSDP( + sdpMessage.getReceiverAddress(), sdpMessage.messageId, senderDomain, senderID, @@ -471,7 +554,8 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { } function _processSDPv2AckError(string calldata senderDomain, bytes32 senderID, SDPMessageV2 memory sdpMessage) internal { - IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnError( + IContractUsingMonitor(monitorAddress).ackOnErrorFromSDP( + sdpMessage.getReceiverAddress(), sdpMessage.messageId, senderDomain, senderID, @@ -574,7 +658,12 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { errMsg = "receiver has no code"; } else { try - IContractUsingSDP(sdpMessage.getReceiverAddress()).recvUnorderedMessage(senderDomain, senderID, sdpMessage.message) + IContractUsingMonitor(monitorAddress).recvUnorderedMessageV3FromSDP( + senderDomain, + senderID, + sdpMessage.getReceiverAddress(), + sdpMessage.message + ) { res = true; } catch Error( @@ -601,7 +690,12 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { errMsg = "receiver has no code"; } else { try - IContractUsingSDP(receiver).recvMessage(senderDomain, senderID, sdpMessage.message) + IContractUsingMonitor(monitorAddress).recvMessageV3FromSDP( + senderDomain, + senderID, + receiver, + sdpMessage.message + ) { res = true; } catch Error( @@ -628,7 +722,8 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { } function _processSDPv3AckSuccess(string calldata senderDomain, bytes32 senderID, SDPMessageV3 memory sdpMessage) internal { - IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnSuccess( + IContractUsingMonitor(monitorAddress).ackOnSuccessFromSDP( + sdpMessage.getReceiverAddress(), sdpMessage.messageId, senderDomain, senderID, @@ -658,7 +753,8 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { } function _processSDPv3AckError(string calldata senderDomain, bytes32 senderID, SDPMessageV3 memory sdpMessage) internal { - IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnError( + IContractUsingMonitor(monitorAddress).ackOnErrorFromSDP( + sdpMessage.getReceiverAddress(), sdpMessage.messageId, senderDomain, senderID, @@ -744,7 +840,8 @@ contract SDPMsg is ISDPMessage, Ownable, Initializable { } // 调用onError接口 - IContractWithAcks(SDPLib.encodeCrossChainIDIntoAddress(exceptionMsgAuthor)).ackOnError( + IContractUsingMonitor(monitorAddress).ackOnErrorFromSDP( + SDPLib.encodeCrossChainIDIntoAddress(exceptionMsgAuthor), sdpMessage.messageId, sdpMessage.receiveDomain, sdpMessage.receiver, diff --git a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/IContractUsingMonitor.sol b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/IContractUsingMonitor.sol index 07c37af5..a25accca 100755 --- a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/IContractUsingMonitor.sol +++ b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/IContractUsingMonitor.sol @@ -6,4 +6,33 @@ interface IContractUsingMonitor { function recvUnorderedMessageFromSDP(string memory senderDomain, bytes32 author, address receiverID, bytes memory message) external; function recvMessageFromSDP(string memory senderDomain, bytes32 author, address receiverID, bytes memory message) external; -} \ No newline at end of file + + function recvUnorderedMessageV2FromSDP(string memory senderDomain, bytes32 author, address receiverID, bytes memory message) external; + + function recvMessageV2FromSDP(string memory senderDomain, bytes32 author, address receiverID, bytes memory message) external; + + function recvUnorderedMessageV3FromSDP(string memory senderDomain, bytes32 author, address receiverID, bytes memory message) external; + + function recvMessageV3FromSDP(string memory senderDomain, bytes32 author, address receiverID, bytes memory message) external; + + function ackOnSuccessFromSDP( + address receiverID, + bytes32 messageId, + string memory receiverDomain, + bytes32 receiver, + uint32 sequence, + uint64 nonce, + bytes memory message + ) external; + + function ackOnErrorFromSDP( + address receiverID, + bytes32 messageId, + string memory receiverDomain, + bytes32 receiver, + uint32 sequence, + uint64 nonce, + bytes memory message, + string memory errorMsg + ) external; +} diff --git a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/IMonitor.sol b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/IMonitor.sol index d3a44144..56112233 100755 --- a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/IMonitor.sol +++ b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/IMonitor.sol @@ -66,6 +66,42 @@ interface IMonitor { function sendUnorderedMonitorMessage(string calldata receiverDomain, bytes32 receiverID, bytes calldata message) external; + function sendMonitorMessageV2( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message + ) external returns (bytes32); + + function sendUnorderedMonitorMessageV2( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message + ) external returns (bytes32); + + function sendMonitorMessageV3( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message, + uint8 timeoutMeasure, + uint256 timeout + ) external returns (bytes32); + + function sendUnorderedMonitorMessageV3( + string calldata receiverDomain, + bytes32 receiverID, + address senderID, + bool atomic, + bytes calldata message, + uint8 timeoutMeasure, + uint256 timeout + ) external returns (bytes32); + function recvMonitorOrder(string calldata committeeId, string calldata signAlgo, bytes memory proof, bytes memory rawMonitorOrder) external; // 其他 @@ -74,4 +110,4 @@ interface IMonitor { function setMonitorVerifier(address newMonitorVerifierAddress) external; function setMonitorControl(uint32 monitorType) external; -} \ No newline at end of file +} diff --git a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/ISDPMessage.sol b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/ISDPMessage.sol index 335c79b7..bf47c2eb 100644 --- a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/ISDPMessage.sol +++ b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/interfaces/ISDPMessage.sol @@ -117,6 +117,8 @@ interface ISDPMessage is ISubProtocol { */ function sendMessageV2(string calldata receiverDomain, bytes32 receiverID, bool atomic, bytes calldata message) external returns (bytes32); + function sendMessageV2FromMonitor(string calldata receiverDomain, bytes32 receiverID, address senderID, bool atomic, bytes calldata message) external returns (bytes32); + /** * @dev Smart contracts need to call this method to send orderly cross-chain messages in SDPv1. * @@ -145,6 +147,8 @@ interface ISDPMessage is ISubProtocol { */ function sendUnorderedMessageV2(string calldata receiverDomain, bytes32 receiverID, bool atomic, bytes calldata message) external returns (bytes32); + function sendUnorderedMessageV2FromMonitor(string calldata receiverDomain, bytes32 receiverID, address senderID, bool atomic, bytes calldata message) external returns (bytes32); + /** * @dev Smart contracts call this method to send cross-chain messages out of order in SDPv1. * @@ -190,6 +194,8 @@ interface ISDPMessage is ISubProtocol { */ function sendUnorderedMessageV3(string calldata receiverDomain, bytes32 receiverID, bool atomic, bytes calldata message, uint8 timeoutMeasure, uint256 timeout) external returns (bytes32); + function sendUnorderedMessageV3FromMonitor(string calldata receiverDomain, bytes32 receiverID, address senderID, bool atomic, bytes calldata message, uint8 timeoutMeasure, uint256 timeout) external returns (bytes32); + /** * @dev Smart contracts need to call this method to send orderly cross-chain messages in SDPv3. * @@ -209,6 +215,8 @@ interface ISDPMessage is ISubProtocol { */ function sendMessageV3(string calldata receiverDomain, bytes32 receiverID, bool atomic, bytes calldata message, uint8 timeoutMeasure, uint256 timeout) external returns (bytes32); + function sendMessageV3FromMonitor(string calldata receiverDomain, bytes32 receiverID, address senderID, bool atomic, bytes calldata message, uint8 timeoutMeasure, uint256 timeout) external returns (bytes32); + /** * @dev Calling this function can submit a notification message of an off-chain exception directly on-chain. * diff --git a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/lib/monitor/MonitorLib.sol b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/lib/monitor/MonitorLib.sol index 6c69046c..4cf7b688 100755 --- a/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/lib/monitor/MonitorLib.sol +++ b/acb-sdk/pluginset/ethereum3/onchain-plugin/solidity/sys/lib/monitor/MonitorLib.sol @@ -153,21 +153,69 @@ library MonitorLib { function decode(MonitorMessage memory monitorMessage, bytes memory rawMessage) internal pure { uint256 offset = rawMessage.length; - - monitorMessage.monitorType = BytesToTypes.bytesToUint32(offset, rawMessage); + require(offset >= 68, "MonitorLib: malformed monitor message"); + + monitorMessage.monitorType = _readUint32AtEnd(rawMessage, offset); + require( + monitorMessage.monitorType == MONITOR_CLOSE + || monitorMessage.monitorType == MONITOR_OPEN + || monitorMessage.monitorType == MONITOR_ROLLBACK, + "MonitorLib: invalid monitor type" + ); offset -= SizeOf.sizeOfInt(32); - uint32 monitor_msg_len = BytesToTypes.bytesToUint32(offset, rawMessage) + 32; - bytes memory monitor_msg = new bytes(monitor_msg_len); - BytesToTypes.bytesToString(offset, rawMessage, monitor_msg); - offset -= SizeOf.sizeOfBytes(monitor_msg); - - uint32 message_len = BytesToTypes.bytesToUint32(offset, rawMessage) + 32; - bytes memory message = new bytes(message_len); - BytesToTypes.bytesToString(offset, rawMessage, message); - offset -= SizeOf.sizeOfBytes(message); + bytes memory monitor_msg; + bytes memory message; + (monitor_msg, offset) = _decodeReversePaddedBytes(rawMessage, offset); + (message, offset) = _decodeReversePaddedBytes(rawMessage, offset); + require(offset == 0, "MonitorLib: trailing monitor message data"); monitorMessage.monitorMsg = string(monitor_msg); monitorMessage.message = message; } -} \ No newline at end of file + + /** + * Decode the legacy ACB EVM variable-bytes representation explicitly. + * Payload words are stored in reverse order and followed by a 32-byte + * length slot. Avoid the assembly decoder here because contracts compiled + * by MySolidity and standard solc disagree on non-word-aligned memory + * copies, which can otherwise turn a successful relay into truncated data. + */ + function _decodeReversePaddedBytes(bytes memory rawMessage, uint256 endOffset) + private + pure + returns (bytes memory value, uint256 nextOffset) + { + require(endOffset >= 32, "MonitorLib: malformed variable bytes"); + uint256 length = uint256(_readUint32AtEnd(rawMessage, endOffset)); + uint256 wordCount = (length + 31) / 32; + uint256 paddedLength = wordCount * 32; + require(endOffset >= 32 + paddedLength, "MonitorLib: variable bytes out of bounds"); + + nextOffset = endOffset - 32 - paddedLength; + value = new bytes(length); + for (uint256 logicalWord = 0; logicalWord < wordCount; logicalWord++) { + uint256 sourceOffset = nextOffset + (wordCount - 1 - logicalWord) * 32; + uint256 targetOffset = logicalWord * 32; + uint256 copyLength = length - targetOffset; + if (copyLength > 32) { + copyLength = 32; + } + for (uint256 i = 0; i < copyLength; i++) { + value[targetOffset + i] = rawMessage[sourceOffset + i]; + } + } + } + + function _readUint32AtEnd(bytes memory rawMessage, uint256 endOffset) + private + pure + returns (uint32) + { + require(endOffset >= 4 && endOffset <= rawMessage.length, "MonitorLib: uint32 out of bounds"); + return (uint32(uint8(rawMessage[endOffset - 4])) << 24) + | (uint32(uint8(rawMessage[endOffset - 3])) << 16) + | (uint32(uint8(rawMessage[endOffset - 2])) << 8) + | uint32(uint8(rawMessage[endOffset - 1])); + } +} diff --git a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSBBCService.java b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSBBCService.java index 157c178a..e43c3bcd 100644 --- a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSBBCService.java +++ b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSBBCService.java @@ -25,6 +25,7 @@ import com.alipay.antchain.bridge.commons.bbc.AbstractBBCContext; import com.alipay.antchain.bridge.commons.bbc.syscontract.AuthMessageContract; import com.alipay.antchain.bridge.commons.bbc.syscontract.ContractStatusEnum; +import com.alipay.antchain.bridge.commons.bbc.syscontract.MonitorContract; import com.alipay.antchain.bridge.commons.bbc.syscontract.PTCContract; import com.alipay.antchain.bridge.commons.bbc.syscontract.SDPContract; import com.alipay.antchain.bridge.commons.bcdns.AbstractCrossChainCertificate; @@ -36,6 +37,8 @@ import com.alipay.antchain.bridge.commons.utils.crypto.SignAlgoEnum; import com.alipay.antchain.bridge.plugins.fiscobcos.abi.AuthMsg; import com.alipay.antchain.bridge.plugins.fiscobcos.abi.CommitteePtcVerifier; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.Monitor; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.MonitorVerifier; import com.alipay.antchain.bridge.plugins.fiscobcos.abi.PtcHub; import com.alipay.antchain.bridge.plugins.fiscobcos.abi.SDPMsg; import com.alipay.antchain.bridge.plugins.lib.BBCService; @@ -78,6 +81,25 @@ @BBCService(products = "fiscobcos", pluginId = "plugin-fiscobcos") @Getter public class FISCOBCOSBBCService extends AbstractBBCService { + + private static final BigInteger SDP_MONITOR_ROUTING_VERSION = BigInteger.valueOf(3L); + + private static final BigInteger MONITOR_IMPLEMENTATION_VERSION = BigInteger.valueOf(5L); + + private static final String ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; + + /** + * The legacy generated wrapper declares SendAuthMessage(bytes), while the + * FISCO Solidity interface deployed by this repository emits + * SendAuthMessage(string) containing a hex-encoded AM package. Keep both + * event ABIs so existing deployments remain readable during upgrades. + */ + private static final String SEND_AUTH_MESSAGE_STRING_EVENT_ABI = + "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false," + + "\"internalType\":\"string\",\"name\":\"pkgHex\"," + + "\"type\":\"string\"}],\"name\":\"SendAuthMessage\"," + + "\"type\":\"event\"}]"; + private FISCOBCOSConfig config; private BcosSDK sdk; @@ -93,7 +115,7 @@ public class FISCOBCOSBBCService extends AbstractBBCService { @Override @SneakyThrows public void startup(AbstractBBCContext abstractBBCContext) { - getBBCLogger().info("FISCO-BCOS BBCService startup with context: {}", new String(abstractBBCContext.getConfForBlockchainClient())); + getBBCLogger().info("FISCO-BCOS BBCService startup requested"); // init NativeInterface Future future = ThreadUtil.execAsync(() -> { @@ -157,6 +179,10 @@ public void startup(AbstractBBCContext abstractBBCContext) { Map account = new HashMap<>(); account.put("keyStoreDir", config.getKeyStoreDir()); account.put("accountFileFormat", config.getAccountFileFormat()); + if (StrUtil.isNotBlank(config.getAccountFilePath())) { + account.put("accountFilePath", config.getAccountFilePath()); + } + account.put("password", config.getAccountPassword()); configProperty.account = account; // 实例化 threadPool @@ -197,24 +223,24 @@ public void startup(AbstractBBCContext abstractBBCContext) { client, keyPair, "AuthMsg", - AuthMsg.ABI_ARRAY[0], - AuthMsg.BINARY_ARRAY[0] + AuthMsg.ABI, + AuthMsg.BINARY ); // SDP this.transactionProcessorSDP = TransactionProcessorFactory.createAssembleTransactionProcessor( client, keyPair, "SDPMsg", - SDPMsg.ABI_ARRAY[0], - SDPMsg.BINARY_ARRAY[0] + SDPMsg.ABI, + SDPMsg.BINARY ); // PtcHub this.transactionProcessorPTC = TransactionProcessorFactory.createAssembleTransactionProcessor( client, keyPair, "PtcHub", - PtcHub.ABI_ARRAY[0], - PtcHub.BINARY_ARRAY[0] + PtcHub.ABI, + PtcHub.BINARY ); this.contractCodec = new ContractCodec(client.getCryptoSuite(), false); @@ -246,6 +272,14 @@ public void startup(AbstractBBCContext abstractBBCContext) { this.bbcContext.setPtcContract(ptcContract); } + if (ObjectUtil.isNull(abstractBBCContext.getMonitorContract()) + && StrUtil.isNotEmpty(this.config.getMonitorContractAddressDeployed())) { + MonitorContract monitorContract = new MonitorContract(); + monitorContract.setContractAddress(this.config.getMonitorContractAddressDeployed()); + monitorContract.setStatus(ContractStatusEnum.CONTRACT_DEPLOYED); + this.bbcContext.setMonitorContract(monitorContract); + } + getBBCLogger().info("FISCO-BCOS BBCService startup success for {}", this.config.getConnectPeer()); } @@ -425,9 +459,6 @@ private List readMessagesByFilter(BcosBlock.Block block) { EventSubscribe eventSubscribe = EventSubscribe.build(client.getGroup(), client.getConfigOption()); eventSubscribe.start(); - // 添加SendAuthMessage事件的topic - params.addTopic(0, String.valueOf(SENDAUTHMESSAGE_EVENT)); - // 创建信号量用于同步 Semaphore semaphore = new Semaphore(1, true); semaphore.acquire(); @@ -438,13 +469,9 @@ private List readMessagesByFilter(BcosBlock.Block block) { if (status == 0 && logs != null) { // 正常推送 for (EventLog eventLog : logs) { try { - // 解析事件数据 - List eventData = contractCodec.decodeEventByTopic( - AuthMsg.ABI_ARRAY[0], - "SendAuthMessage", - eventLog); + byte[] rawAuthMessage = decodeSendAuthMessage(eventLog); - if (!eventData.isEmpty() && eventData.get(0) instanceof byte[]) { + if (rawAuthMessage != null) { String txHash = eventLog.getTransactionHash(); // 获取带证明的交易收据 TransactionReceipt receipt = client.getTransactionReceipt(txHash, true).getTransactionReceipt(); @@ -466,7 +493,7 @@ private List readMessagesByFilter(BcosBlock.Block block) { block.getNumber(), block.getTimestamp(), HexUtil.decodeHex(StrUtil.removePrefix(block.getHash().trim(), "0x")), - (byte[]) eventData.get(0), + rawAuthMessage, ledgerData, proof, HexUtil.decodeHex(txHash.replaceFirst("^0x", "")) @@ -532,18 +559,7 @@ private List readMessagesFromEntireBlock(BcosBlock.Block bloc continue; } - // 解码交易收据中的事件 - Map>> events; - try { - events = decoder.decodeEvents(AuthMsg.ABI_ARRAY[0], receipt.getLogEntries()); - } catch (ContractCodecException e) { - getBBCLogger().error("Failed to decode events: " + e.getMessage(), e); - continue; - } - - // 处理SendAuthMessage事件 - List> authMessages = events.getOrDefault("SendAuthMessage", Collections.emptyList()); - for (List event : authMessages) { + for (byte[] rawAuthMessage : decodeSendAuthMessages(decoder, receipt.getLogEntries())) { try { // 构造ledgerData: 直接使用收据JSON序列化 byte[] ledgerData = JSON.toJSONString(receipt).getBytes(); @@ -562,7 +578,7 @@ private List readMessagesFromEntireBlock(BcosBlock.Block bloc receipt.getBlockNumber().longValue(), block.getTimestamp(), HexUtil.decodeHex(StrUtil.removePrefix(block.getHash().trim(), "0x")), - (byte[]) event.get(0), // 消息内容 + rawAuthMessage, ledgerData, proof, HexUtil.decodeHex(txHash.replaceFirst("^0x", "")) @@ -581,6 +597,51 @@ private List readMessagesFromEntireBlock(BcosBlock.Block bloc return messageList; } + private byte[] decodeSendAuthMessage(EventLog eventLog) { + for (String abi : Arrays.asList(AuthMsg.ABI, SEND_AUTH_MESSAGE_STRING_EVENT_ABI)) { + try { + List values = contractCodec.decodeEventByTopic(abi, "SendAuthMessage", eventLog); + if (!values.isEmpty()) { + return decodeAuthMessageEventPayload(values.get(0)); + } + } catch (Exception ignored) { + // The other compatibility ABI may match this topic. + } + } + return null; + } + + private static List decodeSendAuthMessages( + TransactionDecoderInterface decoder, + List logs) throws ContractCodecException { + List messages = new ArrayList<>(); + for (String abi : Arrays.asList(AuthMsg.ABI, SEND_AUTH_MESSAGE_STRING_EVENT_ABI)) { + Map>> events = decoder.decodeEvents(abi, logs); + for (List event : events.getOrDefault("SendAuthMessage", Collections.emptyList())) { + if (!event.isEmpty()) { + messages.add(decodeAuthMessageEventPayload(event.get(0))); + } + } + } + return messages; + } + + static byte[] decodeAuthMessageEventPayload(Object payload) { + if (payload instanceof byte[]) { + return (byte[]) payload; + } + if (payload instanceof String) { + String hex = StrUtil.removePrefixIgnoreCase(((String) payload).trim(), "0x"); + if (hex.isEmpty() || (hex.length() & 1) != 0 || !hex.matches("[0-9a-fA-F]+")) { + throw new IllegalArgumentException("SendAuthMessage string payload is not valid hex"); + } + return HexUtil.decodeHex(hex); + } + throw new IllegalArgumentException( + "unsupported SendAuthMessage payload type: " + + (payload == null ? "null" : payload.getClass().getName())); + } + @Override public ConsensusState readConsensusState(BigInteger height) { getBBCLogger().info("🔍 开始获取高度 {} 的共识状态", height); @@ -784,23 +845,31 @@ public void setProtocol(String protocolAddress, String protocolType) { this.keyPair ); - // 3. set protocol to am + BigInteger protocolTypeValue = BigInteger.valueOf(Long.parseLong(protocolType)); + + // 3. set protocol to am, but keep reconciliation idempotent. A failed + // owner transaction must never be mistaken for a ready AM merely + // because an older protocol route is still present. try { - TransactionReceipt receipt = am.setProtocol(protocolAddress, BigInteger.valueOf(Long.parseLong(protocolType))); - if (receipt.getStatus() == 0) { + String currentProtocol = am.getProtocol(protocolTypeValue); + if (!protocolAddress.equalsIgnoreCase(currentProtocol)) { + TransactionReceipt receipt = am.setProtocol(protocolAddress, protocolTypeValue); + requireSuccessfulReceipt(receipt, "set protocol on AuthMsg"); getBBCLogger().info( - "set protocol (address: {}, type: {}) to AM {} by tx {} ", - protocolAddress, protocolType, - this.bbcContext.getAuthMessageContract().getContractAddress(), - receipt.getTransactionHash() - ); - } else { - getBBCLogger().info( - "set protocol failed, receipt status code: {}", - receipt.getStatus() + "set protocol (address: {}, type: {}) to AM {} by tx {} ", + protocolAddress, protocolType, + this.bbcContext.getAuthMessageContract().getContractAddress(), + receipt.getTransactionHash() ); } - + String verifiedProtocol = am.getProtocol(protocolTypeValue); + if (!protocolAddress.equalsIgnoreCase(verifiedProtocol)) { + throw new IllegalStateException( + String.format( + "AM protocol route mismatch: expected %s but found %s", + protocolAddress, + verifiedProtocol)); + } } catch (Exception e) { throw new RuntimeException( String.format( @@ -812,7 +881,7 @@ public void setProtocol(String protocolAddress, String protocolType) { // 4. update am contract status try { - if (!StrUtil.isEmpty(am.getProtocol(BigInteger.ZERO))) { + if (protocolAddress.equalsIgnoreCase(am.getProtocol(protocolTypeValue))) { this.bbcContext.getAuthMessageContract().setStatus(ContractStatusEnum.CONTRACT_READY); } } catch (Exception e) { @@ -870,7 +939,7 @@ public void setAmContract(String contractAddress) { // 4. update sdp contract status try { - if (!StrUtil.isEmpty(sdp.getAmAddress()) && !isByteArrayZero(sdp.getLocalDomain())) { + if (isSdpReady(sdp)) { this.bbcContext.getSdpContract().setStatus(ContractStatusEnum.CONTRACT_READY); } } catch (Exception e) { @@ -928,7 +997,7 @@ public void setLocalDomain(String domain) { // 4. update sdp contract status try { - if (!StrUtil.isEmpty(sdp.getAmAddress()) && !ObjectUtil.isEmpty(sdp.getLocalDomain())) { + if (isSdpReady(sdp)) { this.bbcContext.getSdpContract().setStatus(ContractStatusEnum.CONTRACT_READY); } } catch (Exception e) { @@ -940,6 +1009,181 @@ public void setLocalDomain(String domain) { } } + @Override + public void setMonitorContract(String contractAddress) { + if (ObjectUtil.isNull(this.bbcContext) + || ObjectUtil.isNull(this.bbcContext.getSdpContract())) { + throw new RuntimeException("SDP contract not ready in bbc context"); + } + + SDPMsg sdp = SDPMsg.load( + this.bbcContext.getSdpContract().getContractAddress(), + this.client, + this.keyPair); + try { + requireSuccessfulReceipt( + sdp.setMonitorContract(contractAddress), + "set Monitor contract on SDP"); + if (isSdpReady(sdp)) { + this.bbcContext.getSdpContract().setStatus(ContractStatusEnum.CONTRACT_READY); + } + } catch (Exception e) { + throw new RuntimeException( + String.format( + "failed to set Monitor %s on FISCO SDP %s", + contractAddress, + this.bbcContext.getSdpContract().getContractAddress()), + e); + } + } + + @Override + public void setProtocolInMonitor(String contractAddress) { + Monitor monitor = loadMonitorFromContext(); + try { + requireSuccessfulReceipt( + monitor.setProtocol(contractAddress), + "set SDP protocol on Monitor"); + updateMonitorContractStatusIfReady(); + } catch (Exception e) { + throw new RuntimeException( + String.format("failed to set protocol %s on FISCO Monitor", contractAddress), + e); + } + } + + @Override + public void setMonitorControl(int monitorType) { + Monitor monitor = loadMonitorFromContext(); + BigInteger onChainMonitorType = requireProtocolMonitorControl(monitorType); + try { + requireSuccessfulReceipt( + monitor.setMonitorControl(onChainMonitorType), + "set Monitor control"); + updateMonitorContractStatusIfReady(); + } catch (Exception e) { + throw new RuntimeException( + String.format("failed to set FISCO Monitor control to %d", monitorType), + e); + } + } + + static BigInteger requireProtocolMonitorControl(int monitorType) { + if (monitorType < 1 || monitorType > 3) { + throw new IllegalArgumentException( + String.format( + "invalid FISCO Monitor control %d: expected 1 (close), 2 (open), or 3 (rollback)", + monitorType)); + } + return BigInteger.valueOf(monitorType); + } + + @Override + public void setPtcHubInMonitorVerifier(String contractAddress) { + Monitor monitor = loadMonitorFromContext(); + try { + String verifierAddress = monitor.getMonitorVerifier(); + if (StrUtil.isEmpty(verifierAddress) || ZERO_ADDRESS.equalsIgnoreCase(verifierAddress)) { + throw new IllegalStateException("MonitorVerifier address is empty"); + } + requireSuccessfulReceipt( + MonitorVerifier.load(verifierAddress, client, keyPair) + .setPtcHubAddress(contractAddress), + "set PTC Hub on MonitorVerifier"); + PtcHub ptcHub = PtcHub.load(contractAddress, client, keyPair); + if (!verifierAddress.equalsIgnoreCase(ptcHub.getMonitorVerifier())) { + requireSuccessfulReceipt( + ptcHub.setMonitorVerifier(verifierAddress), + "set MonitorVerifier on PTC Hub"); + } + if (!contractAddress.equalsIgnoreCase( + MonitorVerifier.load(verifierAddress, client, keyPair).getPtcHubAddress())) { + throw new IllegalStateException("MonitorVerifier PTC Hub binding did not persist"); + } + if (!verifierAddress.equalsIgnoreCase(ptcHub.getMonitorVerifier())) { + throw new IllegalStateException("PTC Hub MonitorVerifier binding did not persist"); + } + updateMonitorContractStatusIfReady(); + } catch (Exception e) { + throw new RuntimeException( + String.format( + "failed to set PTC Hub %s on FISCO MonitorVerifier", + contractAddress), + e); + } + } + + @Override + public CrossChainMessageReceipt relayMonitorOrder( + String committeeId, + String signAlgo, + byte[] rawProof, + byte[] rawMonitorOrder) { + Monitor monitor = loadMonitorFromContext(); + try { + TransactionReceipt receipt = monitor.recvMonitorOrder( + committeeId, + signAlgo, + rawProof, + rawMonitorOrder); + CrossChainMessageReceipt result = new CrossChainMessageReceipt(); + result.setTxhash(receipt.getTransactionHash()); + result.setConfirmed(true); + result.setSuccessful(receipt.isStatusOK()); + result.setErrorMsg(receipt.isStatusOK() ? "" : "FISCO Monitor order execution failed"); + return result; + } catch (Exception e) { + throw new RuntimeException("failed to relay FISCO Monitor order", e); + } + } + + private Monitor loadMonitorFromContext() { + if (ObjectUtil.isNull(this.bbcContext) + || ObjectUtil.isNull(this.bbcContext.getMonitorContract()) + || StrUtil.isEmpty(this.bbcContext.getMonitorContract().getContractAddress())) { + throw new RuntimeException("Monitor contract not ready in bbc context"); + } + return Monitor.load( + this.bbcContext.getMonitorContract().getContractAddress(), + this.client, + this.keyPair); + } + + private boolean isSdpReady(SDPMsg sdp) throws Exception { + return !StrUtil.isEmpty(sdp.getAmAddress()) + && !ZERO_ADDRESS.equalsIgnoreCase(sdp.getAmAddress()) + && !isByteArrayZero(sdp.getLocalDomain()) + && !ZERO_ADDRESS.equalsIgnoreCase(sdp.getMonitorAddress()); + } + + private void updateMonitorContractStatusIfReady() throws Exception { + Monitor monitor = loadMonitorFromContext(); + String protocol = monitor.getProtocol(); + String verifierAddress = monitor.getMonitorVerifier(); + boolean verifierReady = false; + if (!StrUtil.isEmpty(verifierAddress) && !ZERO_ADDRESS.equalsIgnoreCase(verifierAddress)) { + String ptcHub = MonitorVerifier.load(verifierAddress, client, keyPair) + .getPtcHubAddress(); + verifierReady = !StrUtil.isEmpty(ptcHub) && !ZERO_ADDRESS.equalsIgnoreCase(ptcHub); + } + if (!StrUtil.isEmpty(protocol) + && !ZERO_ADDRESS.equalsIgnoreCase(protocol) + && monitor.getMonitorControl().intValue() != 0 + && verifierReady) { + this.bbcContext.getMonitorContract().setStatus(ContractStatusEnum.CONTRACT_READY); + } + } + + private void requireSuccessfulReceipt(TransactionReceipt receipt, String action) { + if (ObjectUtil.isNull(receipt) || !receipt.isStatusOK()) { + throw new IllegalStateException( + String.format( + "%s failed with receipt status %s", + action, + ObjectUtil.isNull(receipt) ? "null" : receipt.getStatus())); + } + } + @Override public CrossChainMessageReceipt relayAuthMessage(byte[] rawMessage) { // 1. check context @@ -984,7 +1228,7 @@ public CrossChainMessageReceipt relayAuthMessage(byte[] rawMessage) { // 2.1 发送实际交易 TransactionResponse response = transactionProcessorAM.sendTransactionAndGetResponse( amContractAddress, - AuthMsg.ABI_ARRAY[0], + AuthMsg.ABI, AuthMsg.FUNC_RECVPKGFROMRELAYER, Collections.singletonList(new DynamicBytes(rawMessage))); @@ -1073,9 +1317,15 @@ public void setupSDPMessageContract() { } if (ObjectUtil.isNotNull(this.bbcContext.getSdpContract()) && StrUtil.isNotEmpty(this.bbcContext.getSdpContract().getContractAddress())) { - // If the contract has been pre-deployed and the contract address is configured in the configuration file, - // there is no need to redeploy. - return; + try { + assertSdpMonitorRoutingSupported( + this.bbcContext.getSdpContract().getContractAddress()); + return; + } catch (IllegalStateException e) { + getBBCLogger().warn( + "replace legacy FISCO SDP {} during explicit BBC reconciliation", + this.bbcContext.getSdpContract().getContractAddress()); + } } // 2. deploy contract @@ -1095,12 +1345,150 @@ public void setupSDPMessageContract() { sdpContract.setContractAddress(sdpMsg.getContractAddress()); sdpContract.setStatus(ContractStatusEnum.CONTRACT_DEPLOYED); bbcContext.setSdpContract(sdpContract); + config.setSdpContractAddressDeployed(sdpMsg.getContractAddress()); getBBCLogger().info("setup sdp contract successful: {}", sdpMsg.getContractAddress()); } else { throw new RuntimeException("failed to get deploy sdpMsg tx receipt"); } } + @Override + public void setupMonitorContract() { + if (ObjectUtil.isNull(this.bbcContext)) { + throw new RuntimeException("empty bbc context"); + } + if (ObjectUtil.isNull(this.bbcContext.getSdpContract()) + || StrUtil.isEmpty(this.bbcContext.getSdpContract().getContractAddress())) { + throw new RuntimeException("SDP contract must be deployed before Monitor"); + } + String reusableMonitorVerifierAddress = null; + if (ObjectUtil.isNotNull(this.bbcContext.getMonitorContract()) + && StrUtil.isNotEmpty(this.bbcContext.getMonitorContract().getContractAddress())) { + String existingMonitorAddress = this.bbcContext.getMonitorContract().getContractAddress(); + try { + assertMonitorImplementationSupported(existingMonitorAddress); + return; + } catch (IllegalStateException e) { + getBBCLogger().warn( + "replace legacy FISCO Monitor {} during explicit BBC reconciliation", + existingMonitorAddress); + reusableMonitorVerifierAddress = findReusableMonitorVerifier(existingMonitorAddress); + } + } + + final MonitorVerifier monitorVerifier; + final Monitor monitor; + try { + if (StrUtil.isNotEmpty(reusableMonitorVerifierAddress)) { + monitorVerifier = MonitorVerifier.load( + reusableMonitorVerifierAddress, + client, + keyPair); + getBBCLogger().info( + "reuse legacy FISCO MonitorVerifier {} so existing TPBTA monitor-node " + + "endorsements remain available", + reusableMonitorVerifierAddress); + } else { + monitorVerifier = MonitorVerifier.deploy(client, keyPair); + requireSuccessfulReceipt( + monitorVerifier.getDeployReceipt(), + "deploy MonitorVerifier"); + } + + monitor = Monitor.deploy(client, keyPair); + requireSuccessfulReceipt(monitor.getDeployReceipt(), "deploy Monitor"); + requireSuccessfulReceipt( + monitor.setMonitorVerifier(monitorVerifier.getContractAddress()), + "wire MonitorVerifier into Monitor"); + } catch (Exception e) { + throw new RuntimeException("failed to deploy FISCO Monitor contracts", e); + } + + MonitorContract monitorContract = new MonitorContract(); + monitorContract.setContractAddress(monitor.getContractAddress()); + monitorContract.setStatus(ContractStatusEnum.CONTRACT_DEPLOYED); + this.bbcContext.setMonitorContract(monitorContract); + config.setMonitorContractAddressDeployed(monitor.getContractAddress()); + getBBCLogger().info( + "setup monitor contracts successful: Monitor={}, MonitorVerifier={}", + monitor.getContractAddress(), + monitorVerifier.getContractAddress()); + } + + private String findReusableMonitorVerifier(String monitorAddress) { + try { + String candidate = Monitor.load(monitorAddress, client, keyPair).getMonitorVerifier(); + if (StrUtil.isEmpty(candidate) || ZERO_ADDRESS.equalsIgnoreCase(candidate)) { + return null; + } + String verifierPtcHub = MonitorVerifier.load(candidate, client, keyPair).getPtcHubAddress(); + if (StrUtil.isEmpty(verifierPtcHub) || ZERO_ADDRESS.equalsIgnoreCase(verifierPtcHub)) { + return null; + } + if (ObjectUtil.isNotNull(this.bbcContext.getPtcContract()) + && StrUtil.isNotEmpty(this.bbcContext.getPtcContract().getContractAddress())) { + String expectedPtcHub = this.bbcContext.getPtcContract().getContractAddress(); + String ptcMonitorVerifier = PtcHub.load(expectedPtcHub, client, keyPair) + .getMonitorVerifier(); + if (!expectedPtcHub.equalsIgnoreCase(verifierPtcHub) + || !candidate.equalsIgnoreCase(ptcMonitorVerifier)) { + getBBCLogger().warn( + "legacy FISCO MonitorVerifier {} is not the active verifier of PTC Hub {}", + candidate, + expectedPtcHub); + return null; + } + } + return candidate; + } catch (Exception e) { + getBBCLogger().warn( + "unable to reuse MonitorVerifier from legacy FISCO Monitor {}", + monitorAddress, + e); + return null; + } + } + + private void assertSdpMonitorRoutingSupported(String sdpAddress) { + try { + BigInteger routingVersion = SDPMsg.load(sdpAddress, client, keyPair) + .getMonitorRoutingVersion(); + if (!SDP_MONITOR_ROUTING_VERSION.equals(routingVersion)) { + throw new IllegalStateException( + String.format( + "unsupported FISCO SDP monitor routing version %s at %s", + routingVersion, + sdpAddress)); + } + } catch (Exception e) { + throw new IllegalStateException( + String.format( + "FISCO SDP %s does not route SDP V1/V2/V3 requests through Monitor", + sdpAddress), + e); + } + } + + private void assertMonitorImplementationSupported(String monitorAddress) { + try { + BigInteger implementationVersion = Monitor.load(monitorAddress, client, keyPair) + .getImplementationVersion(); + if (!MONITOR_IMPLEMENTATION_VERSION.equals(implementationVersion)) { + throw new IllegalStateException( + String.format( + "unsupported FISCO Monitor implementation version %s at %s", + implementationVersion, + monitorAddress)); + } + } catch (Exception e) { + throw new IllegalStateException( + String.format( + "FISCO Monitor %s lacks exact envelope decode or receive-side routing", + monitorAddress), + e); + } + } + @Override public void setupPTCContract() { // 1. Check context @@ -1109,10 +1497,16 @@ public void setupPTCContract() { } if (ObjectUtil.isNotNull(this.bbcContext.getPtcContract()) && StrUtil.isNotEmpty(this.bbcContext.getPtcContract().getContractAddress())) { - // If the contract has been pre-deployed and the contract address is configured in the configuration file, - // there is no need to redeploy. - getBBCLogger().info("PTC contract has been deployed: {}", this.bbcContext.getPtcContract().getContractAddress()); - return; + String existingPtc = this.bbcContext.getPtcContract().getContractAddress(); + try { + ensurePtcMonitorVerifierBinding(existingPtc); + getBBCLogger().info("PTC contract has been deployed with Monitor support: {}", existingPtc); + return; + } catch (Exception e) { + getBBCLogger().warn( + "replace legacy FISCO PTC Hub {} without bidirectional MonitorVerifier support", + existingPtc); + } } AbstractCrossChainCertificate bcdnsRootCert = CrossChainCertificateUtil.readCrossChainCertificateFromPem( @@ -1195,9 +1589,38 @@ public void setupPTCContract() { config.setPtcHubContractAddressDeployed(ptcHubAddr); + ensurePtcMonitorVerifierBinding(ptcHubAddr); + getBBCLogger().info("setup ptc contract successful: {}", ptcHubAddr); } + private void ensurePtcMonitorVerifierBinding(String ptcHubAddress) { + if (ObjectUtil.isNull(this.bbcContext.getMonitorContract()) + || StrUtil.isEmpty(this.bbcContext.getMonitorContract().getContractAddress())) { + throw new IllegalStateException("Monitor contract must be deployed before PTC Hub reconciliation"); + } + try { + Monitor monitor = loadMonitorFromContext(); + String verifierAddress = monitor.getMonitorVerifier(); + if (StrUtil.isEmpty(verifierAddress) || ZERO_ADDRESS.equalsIgnoreCase(verifierAddress)) { + throw new IllegalStateException("MonitorVerifier address is empty"); + } + PtcHub ptcHub = PtcHub.load(ptcHubAddress, client, keyPair); + if (!verifierAddress.equalsIgnoreCase(ptcHub.getMonitorVerifier())) { + requireSuccessfulReceipt( + ptcHub.setMonitorVerifier(verifierAddress), + "set MonitorVerifier on PTC Hub"); + } + if (!verifierAddress.equalsIgnoreCase(ptcHub.getMonitorVerifier())) { + throw new IllegalStateException("PTC Hub MonitorVerifier binding did not persist"); + } + } catch (Exception e) { + throw new IllegalStateException( + String.format("FISCO PTC Hub %s lacks MonitorVerifier routing", ptcHubAddress), + e); + } + } + @Override public void setPtcContract(String ptcContractAddress) { // 1. check context diff --git a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSConfig.java b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSConfig.java index 6840f493..88058258 100644 --- a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSConfig.java +++ b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSConfig.java @@ -79,6 +79,17 @@ public enum CrossChainMessageScanPolicyEnum { @JSONField private String accountFileFormat = "pem"; + /** + * Optional explicit account file. FISCO SDK v3 does not select a PEM from + * {@link #keyStoreDir} unless an account address is also configured, so a + * production BBC should set this field to a root-only PEM path. + */ + @JSONField + private String accountFilePath; + + @JSONField + private String accountPassword = ""; + // client @JSONField private String groupID; @@ -89,6 +100,9 @@ public enum CrossChainMessageScanPolicyEnum { @JSONField private String sdpContractAddressDeployed; + + @JSONField + private String monitorContractAddressDeployed; @JSONField private String ptcHubContractAddressDeployed; diff --git a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSHCDVSService.java b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSHCDVSService.java index 5146dc9b..5fe18e1b 100644 --- a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSHCDVSService.java +++ b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSHCDVSService.java @@ -11,15 +11,20 @@ import com.alipay.antchain.bridge.plugins.lib.HeteroChainDataVerifierService; import com.alipay.antchain.bridge.plugins.spi.ptc.AbstractHCDVSService; import com.alipay.antchain.bridge.plugins.spi.ptc.core.VerifyResult; -import org.fisco.bcos.sdk.v3.crypto.CryptoSuite; import org.fisco.bcos.sdk.v3.crypto.hash.Keccak256; -import org.fisco.bcos.sdk.v3.model.CryptoType; import org.fisco.bcos.sdk.v3.utils.MerkleProofUtility; +import org.bouncycastle.asn1.x9.X9ECParameters; +import org.bouncycastle.crypto.ec.CustomNamedCurves; +import org.bouncycastle.crypto.params.ECDomainParameters; +import org.bouncycastle.crypto.params.ECPublicKeyParameters; +import org.bouncycastle.crypto.signers.ECDSASigner; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * FISCO BCOS 异构链数据验证服务 @@ -31,7 +36,13 @@ public class FISCOBCOSHCDVSService extends AbstractHCDVSService { private static final String SEND_AUTH_MESSAGE_TOPIC = "0x79b7516b1b7a6a39fb4b7b22e8667cd3744e5c27425292f8a9f49d1042c0c651"; - private final CryptoSuite cryptoSuite = new CryptoSuite(CryptoType.ECDSA_TYPE); + private static final X9ECParameters SECP256K1_PARAMS = CustomNamedCurves.getByName("secp256k1"); + private static final ECDomainParameters SECP256K1_DOMAIN = new ECDomainParameters( + SECP256K1_PARAMS.getCurve(), + SECP256K1_PARAMS.getG(), + SECP256K1_PARAMS.getN(), + SECP256K1_PARAMS.getH() + ); /** * 查找并解析交易收据中的SendAuthMessage事件 @@ -194,6 +205,7 @@ private int verifySignatures(JSONArray signatureListArray, JSONArray sealerListA byte[] hashBytes = HexUtil.decodeHex(StrUtil.removePrefix(hashHex, "0x")); int validSignatureCount = 0; + Set verifiedSealerIndexes = new HashSet<>(); for (int i = 0; i < signatureListArray.size(); i++) { JSONObject signatureInfo = signatureListArray.getJSONObject(i); @@ -211,13 +223,18 @@ private int verifySignatures(JSONArray signatureListArray, JSONArray sealerListA continue; } + if (!verifiedSealerIndexes.add(sealerIndex)) { + getHCDVSLogger().warn("忽略共识节点 {} 的重复签名", sealerIndex); + continue; + } + String nodeId = sealerListArray.getString(sealerIndex); String publicKeyHex = StrUtil.removePrefix(nodeId, "0x"); try { byte[] signatureBytes = HexUtil.decodeHex( StrUtil.removePrefix(signatureInfo.getString("signature"), "0x")); - if (cryptoSuite.verify(publicKeyHex, hashBytes, signatureBytes)) { + if (verifySecp256k1Signature(publicKeyHex, hashBytes, signatureBytes)) { validSignatureCount++; getHCDVSLogger().debug("节点 {} 的签名验证成功", nodeId); } else { @@ -231,6 +248,47 @@ private int verifySignatures(JSONArray signatureListArray, JSONArray sealerListA return validSignatureCount; } + /** + * Verifies the FISCO BCOS ECDSA signature without constructing {@code CryptoSuite}. + * + *

The SDK's {@code CryptoSuite} eagerly loads the WeDPR native library even though + * HCDVS only needs standard secp256k1 verification. Committee nodes load HCDVS in an + * isolated PF4J class loader, where that native resource is deliberately unavailable. + * Bouncy Castle keeps this verification deterministic, portable and independent of + * the blockchain SDK runtime.

+ */ + private boolean verifySecp256k1Signature(String publicKeyHex, byte[] hashBytes, byte[] signatureBytes) { + if (hashBytes.length != 32 || (signatureBytes.length != 64 && signatureBytes.length != 65)) { + return false; + } + + byte[] publicKeyBytes = HexUtil.decodeHex(StrUtil.removePrefix(publicKeyHex, "0x")); + if (publicKeyBytes.length == 64) { + byte[] uncompressedPublicKey = new byte[65]; + uncompressedPublicKey[0] = 0x04; + System.arraycopy(publicKeyBytes, 0, uncompressedPublicKey, 1, publicKeyBytes.length); + publicKeyBytes = uncompressedPublicKey; + } + + if (publicKeyBytes.length != 33 && publicKeyBytes.length != 65) { + return false; + } + + BigInteger r = new BigInteger(1, Arrays.copyOfRange(signatureBytes, 0, 32)); + BigInteger s = new BigInteger(1, Arrays.copyOfRange(signatureBytes, 32, 64)); + if (r.signum() <= 0 || s.signum() <= 0 || r.compareTo(SECP256K1_DOMAIN.getN()) >= 0 + || s.compareTo(SECP256K1_DOMAIN.getN()) >= 0) { + return false; + } + + ECDSASigner verifier = new ECDSASigner(); + verifier.init(false, new ECPublicKeyParameters( + SECP256K1_PARAMS.getCurve().decodePoint(publicKeyBytes), + SECP256K1_DOMAIN + )); + return verifier.verifySignature(hashBytes, r, s); + } + /** * 检查AM合约地址是否匹配 * @@ -492,4 +550,4 @@ public JSONObject getLogEntry() { return logEntry; } } -} \ No newline at end of file +} diff --git a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/AppContract.java b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/AppContract.java index d39cc11b..a067a2c0 100644 --- a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/AppContract.java +++ b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/AppContract.java @@ -15,8 +15,10 @@ import org.fisco.bcos.sdk.v3.codec.datatypes.TypeReference; import org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String; import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256; import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32; import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8; import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple1; import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple3; import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple4; @@ -29,19 +31,20 @@ import org.fisco.bcos.sdk.v3.model.CryptoType; import org.fisco.bcos.sdk.v3.model.TransactionReceipt; import org.fisco.bcos.sdk.v3.model.callback.TransactionCallback; +import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.ProxySignTransactionManager; import org.fisco.bcos.sdk.v3.transaction.model.exception.ContractException; @SuppressWarnings("unchecked") public class AppContract extends Contract { - public static final String[] BINARY_ARRAY = {"608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6111a78061007e6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063a1c5324d116100c3578063e5512e971161007c578063e5512e9714610285578063eff2a07614610298578063f2fde38b146102ab578063f6d750e4146102be578063f76f703b146102d1578063ff098be7146102e457600080fd5b8063a1c5324d1461023d578063a25ae14a14610246578063aec2fc141461024e578063c09b261b14610256578063c1cecc5a14610269578063d7686d5c1461027c57600080fd5b8063715018a611610115578063715018a6146101ed5780637260ca9c146101f557806381c3f533146101fe57806389c9b1d9146102115780638da5cb5b146102195780639670efcb1461022a57600080fd5b80630a9d793d1461015d57806335cd96e014610172578063387868ae146101905780633fecfe3f146101bb57806358e28153146101ce5780635ee20956146101d6575b600080fd5b61017061016b366004610b9f565b6102f7565b005b61017a61034c565b6040516101879190610c1c565b60405180910390f35b6003546101a3906001600160a01b031681565b6040516001600160a01b039091168152602001610187565b61017a6101c9366004610c2f565b6103de565b61017a610497565b6101df60075481565b604051908152602001610187565b6101706104a4565b6101df60055481565b61017061020c366004610cf4565b6104da565b61017a61055f565b6000546001600160a01b03166101a3565b61017a610238366004610c2f565b61056e565b6101df60045481565b61017a61058a565b61017a610597565b610170610264366004610d7b565b6105a4565b610170610277366004610d7b565b61067c565b6101df60065481565b610170610293366004610e19565b61074a565b6101706102a6366004610cf4565b610798565b6101706102b9366004610b9f565b61081d565b6101706102cc366004610eb0565b6108b8565b6101706102df366004610d7b565b61091d565b6101706102f2366004610d7b565b6109eb565b6000546001600160a01b0316331461032a5760405162461bcd60e51b815260040161032190610f6d565b60405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60606009805461035b90610fa2565b80601f016020809104026020016040519081016040528092919081815260200182805461038790610fa2565b80156103d45780601f106103a9576101008083540402835291602001916103d4565b820191906000526020600020905b8154815290600101906020018083116103b757829003601f168201915b5050505050905090565b600260205281600052604060002081815481106103fa57600080fd5b9060005260206000200160009150915050805461041690610fa2565b80601f016020809104026020016040519081016040528092919081815260200182805461044290610fa2565b801561048f5780601f106104645761010080835404028352916020019161048f565b820191906000526020600020905b81548152906001019060200180831161047257829003601f168201915b505050505081565b6008805461041690610fa2565b6000546001600160a01b031633146104ce5760405162461bcd60e51b815260040161032190610f6d565b6104d86000610ab6565b565b6003546040516391198fcd60e01b81526001600160a01b039091169081906391198fcd90610512908790899088908890600401610fdd565b6020604051808303816000875af1158015610531573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610555919061101b565b6004555050505050565b6060600a805461035b90610fa2565b600160205281600052604060002081815481106103fa57600080fd5b600a805461041690610fa2565b6009805461041690610fa2565b6003546001600160a01b031633146105f35760405162461bcd60e51b815260206004820152601260248201527124a72b20a624a22fa822a926a4a9a9a4a7a760711b6044820152606401610321565b6000828152600160208181526040832080549283018155835291829020835161062493919092019190840190610b06565b508051610638906009906020840190610b06565b507f7b59e766dd02d6ce4e574f0ab75dfc4b180c90deb50dd9dbdbc65768abcf80f1838383600160405161066f9493929190611034565b60405180910390a1505050565b6003546040516360e7662d60e11b81526001600160a01b039091169063c1cecc5a906106b090869086908690600401611073565b600060405180830381600087803b1580156106ca57600080fd5b505af11580156106de573d6000803e3d6000fd5b505050600083815260026020908152604082208054600181018255908352918190208451610713945092019190840190610b06565b507fbbe83d8459c305cf51f2425b93e693dcfaaf60f22766486b0983c905b98ead40838383600060405161066f9493929190611034565b7fa8bb25943cddb58193ff50af54633a11fcff3e922840a1c4f2964f2fff27a025868686868686604051610783969594939291906110a8565b60405180910390a15050506006929092555050565b6003546040516302e546d360e11b81526001600160a01b039091169081906305ca8da6906107d0908790899088908890600401610fdd565b6020604051808303816000875af11580156107ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610813919061101b565b6005555050505050565b6000546001600160a01b031633146108475760405162461bcd60e51b815260040161032190610f6d565b6001600160a01b0381166108ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610321565b6108b581610ab6565b50565b7f67644860f47ea033ed40e06c5d59a6fc642d999c52b2fd29a57d476db4989d81878787878787876040516108f39796959493929190611102565b60405180910390a160078790558051610913906008906020840190610b06565b5050505050505050565b60035460405163f76f703b60e01b81526001600160a01b039091169063f76f703b9061095190869086908690600401611073565b600060405180830381600087803b15801561096b57600080fd5b505af115801561097f573d6000803e3d6000fd5b5050506000838152600260209081526040822080546001810182559083529181902084516109b4945092019190840190610b06565b507fbbe83d8459c305cf51f2425b93e693dcfaaf60f22766486b0983c905b98ead40838383600160405161066f9493929190611034565b6003546001600160a01b03163314610a3a5760405162461bcd60e51b815260206004820152601260248201527124a72b20a624a22fa822a926a4a9a9a4a7a760711b6044820152606401610321565b60008281526001602081815260408320805492830181558352918290208351610a6b93919092019190840190610b06565b508051610a7f90600a906020840190610b06565b507f7b59e766dd02d6ce4e574f0ab75dfc4b180c90deb50dd9dbdbc65768abcf80f1838383600060405161066f9493929190611034565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054610b1290610fa2565b90600052602060002090601f016020900481019282610b345760008555610b7a565b82601f10610b4d57805160ff1916838001178555610b7a565b82800160010185558215610b7a579182015b82811115610b7a578251825591602001919060010190610b5f565b50610b86929150610b8a565b5090565b5b80821115610b865760008155600101610b8b565b600060208284031215610bb157600080fd5b81356001600160a01b0381168114610bc857600080fd5b9392505050565b6000815180845260005b81811015610bf557602081850181015186830182015201610bd9565b81811115610c07576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610bc86020830184610bcf565b60008060408385031215610c4257600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610c7857600080fd5b813567ffffffffffffffff80821115610c9357610c93610c51565b604051601f8301601f19908116603f01168101908282118183101715610cbb57610cbb610c51565b81604052838152866020858801011115610cd457600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060808587031215610d0a57600080fd5b84359350602085013567ffffffffffffffff80821115610d2957600080fd5b610d3588838901610c67565b9450604087013591508115158214610d4c57600080fd5b90925060608601359080821115610d6257600080fd5b50610d6f87828801610c67565b91505092959194509250565b600080600060608486031215610d9057600080fd5b833567ffffffffffffffff80821115610da857600080fd5b610db487838801610c67565b9450602086013593506040860135915080821115610dd157600080fd5b50610dde86828701610c67565b9150509250925092565b803563ffffffff81168114610dfc57600080fd5b919050565b803567ffffffffffffffff81168114610dfc57600080fd5b60008060008060008060c08789031215610e3257600080fd5b86359550602087013567ffffffffffffffff80821115610e5157600080fd5b610e5d8a838b01610c67565b965060408901359550610e7260608a01610de8565b9450610e8060808a01610e01565b935060a0890135915080821115610e9657600080fd5b50610ea389828a01610c67565b9150509295509295509295565b600080600080600080600060e0888a031215610ecb57600080fd5b87359650602088013567ffffffffffffffff80821115610eea57600080fd5b610ef68b838c01610c67565b975060408a01359650610f0b60608b01610de8565b9550610f1960808b01610e01565b945060a08a0135915080821115610f2f57600080fd5b610f3b8b838c01610c67565b935060c08a0135915080821115610f5157600080fd5b50610f5e8a828b01610c67565b91505092959891949750929550565b6020808252818101527f4f776e61626c653a2063","616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680610fb657607f821691505b60208210811415610fd757634e487b7160e01b600052602260045260246000fd5b50919050565b608081526000610ff06080830187610bcf565b856020840152841515604084015282810360608401526110108185610bcf565b979650505050505050565b60006020828403121561102d57600080fd5b5051919050565b6080815260006110476080830187610bcf565b856020840152828103604084015261105f8186610bcf565b915050821515606083015295945050505050565b6060815260006110866060830186610bcf565b846020840152828103604084015261109e8185610bcf565b9695505050505050565b86815260c0602082015260006110c160c0830188610bcf565b86604084015263ffffffff8616606084015267ffffffffffffffff8516608084015282810360a08401526110f58185610bcf565b9998505050505050505050565b87815260e06020820152600061111b60e0830189610bcf565b87604084015263ffffffff8716606084015267ffffffffffffffff8616608084015282810360a084015261114f8186610bcf565b905082810360c08401526111638185610bcf565b9a995050505050505050505056fea26469706673582212208efa56bf468df8098bb568198d902a3d13b350d9a685d7b7d5e261aaacccfed764736f6c634300080b0033"}; + public static final String[] BINARY_ARRAY = {"608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6114a98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063a25ae14a116100f9578063eff2a07611610097578063f6d750e411610071578063f6d750e414610363578063f76f703b14610376578063f80babb114610389578063ff098be71461039c57600080fd5b8063eff2a0761461032a578063f1f352a41461033d578063f2fde38b1461035057600080fd5b8063c1cecc5a116100d3578063c1cecc5a146102e8578063d7686d5c146102fb578063e5512e9714610304578063e55210921461031757600080fd5b8063a25ae14a146102c5578063aec2fc14146102cd578063c09b261b146102d557600080fd5b8063715018a61161016657806389c9b1d91161014057806389c9b1d9146102905780638da5cb5b146102985780639670efcb146102a9578063a1c5324d146102bc57600080fd5b8063715018a61461026c5780637260ca9c1461027457806381c3f5331461027d57600080fd5b80633fecfe3f116101a25780633fecfe3f146102275780635018f4921461023a57806358e281531461024d5780635ee209561461025557600080fd5b80630a9d793d146101c957806335cd96e0146101de578063387868ae146101fc575b600080fd5b6101dc6101d7366004610d65565b6103af565b005b6101e6610404565b6040516101f39190610de2565b60405180910390f35b60045461020f906001600160a01b031681565b6040516001600160a01b0390911681526020016101f3565b6101e6610235366004610df5565b610496565b6101dc610248366004610ecf565b61054f565b6101e66105d6565b61025e60085481565b6040519081526020016101f3565b6101dc6105e3565b61025e60065481565b6101dc61028b366004610f70565b610619565b6101e661069d565b6000546001600160a01b031661020f565b6101e66102b7366004610df5565b6106ac565b61025e60055481565b6101e66106c8565b6101e66106d5565b6101dc6102e3366004610fee565b6106e2565b6101dc6102f6366004610fee565b610795565b61025e60075481565b6101dc610312366004611087565b610863565b60035461020f906001600160a01b031681565b6101dc610338366004610f70565b6108b1565b6101dc61034b366004610ecf565b610935565b6101dc61035e366004610d65565b6109bc565b6101dc61037136600461111e565b610a57565b6101dc610384366004610fee565b610abc565b6101dc610397366004610d65565b610b8a565b6101dc6103aa366004610fee565b610bd6565b6000546001600160a01b031633146103e25760405162461bcd60e51b81526004016103d9906111db565b60405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6060600a805461041390611210565b80601f016020809104026020016040519081016040528092919081815260200182805461043f90611210565b801561048c5780601f106104615761010080835404028352916020019161048c565b820191906000526020600020905b81548152906001019060200180831161046f57829003601f168201915b5050505050905090565b600260205281600052604060002081815481106104b257600080fd5b906000526020600020016000915091505080546104ce90611210565b80601f01602080910402602001604051908101604052809291908181526020018280546104fa90611210565b80156105475780601f1061051c57610100808354040283529160200191610547565b820191906000526020600020905b81548152906001019060200180831161052a57829003601f168201915b505050505081565b60048054604051633b179eb760e11b81526001600160a01b039091169163762f3d6e916105889189918b918a918a918a918a910161124b565b6020604051808303816000875af11580156105a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105cb9190611297565b600655505050505050565b600980546104ce90611210565b6000546001600160a01b0316331461060d5760405162461bcd60e51b81526004016103d9906111db565b6106176000610c7c565b565b600480546040516391198fcd60e01b81526001600160a01b039091169182916391198fcd916106509188918a9189918991016112b0565b6020604051808303816000875af115801561066f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106939190611297565b6005555050505050565b6060600b805461041390611210565b600160205281600052604060002081815481106104b257600080fd5b600b80546104ce90611210565b600a80546104ce90611210565b6003546001600160a01b0316331461070c5760405162461bcd60e51b81526004016103d9906112ee565b6000828152600160208181526040832080549283018155835291829020835161073d93919092019190840190610ccc565b50805161075190600a906020840190610ccc565b507f7b59e766dd02d6ce4e574f0ab75dfc4b180c90deb50dd9dbdbc65768abcf80f183838360016040516107889493929190611336565b60405180910390a1505050565b600354604051635debd27960e01b81526001600160a01b0390911690635debd279906107c990869086908690600401611375565b600060405180830381600087803b1580156107e357600080fd5b505af11580156107f7573d6000803e3d6000fd5b50505060008381526002602090815260408220805460018101825590835291819020845161082c945092019190840190610ccc565b507fbbe83d8459c305cf51f2425b93e693dcfaaf60f22766486b0983c905b98ead4083838360006040516107889493929190611336565b7fa8bb25943cddb58193ff50af54633a11fcff3e922840a1c4f2964f2fff27a02586868686868660405161089c969594939291906113aa565b60405180910390a15050506007929092555050565b600480546040516302e546d360e11b81526001600160a01b039091169182916305ca8da6916108e89188918a9189918991016112b0565b6020604051808303816000875af1158015610907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092b9190611297565b6006555050505050565b600480546040516337084d7f60e11b81526001600160a01b0390911691636e109afe9161096e9189918b918a918a918a918a910161124b565b6020604051808303816000875af115801561098d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b19190611297565b600555505050505050565b6000546001600160a01b031633146109e65760405162461bcd60e51b81526004016103d9906111db565b6001600160a01b038116610a4b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103d9565b610a5481610c7c565b50565b7f67644860f47ea033ed40e06c5d59a6fc642d999c52b2fd29a57d476db4989d8187878787878787604051610a929796959493929190611404565b60405180910390a160088790558051610ab2906009906020840190610ccc565b5050505050505050565b60035460405163630853bb60e11b81526001600160a01b039091169063c610a77690610af090869086908690600401611375565b600060405180830381600087803b158015610b0a57600080fd5b505af1158015610b1e573d6000803e3d6000fd5b505050600083815260026020908152604082208054600181018255908352918190208451610b53945092019190840190610ccc565b507fbbe83d8459c305cf51f2425b93e693dcfaaf60f22766486b0983c905b98ead4083838360016040516107889493929190611336565b6000546001600160a01b03163314610bb45760405162461bcd60e51b81526004016103d9906111db565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b03163314610c005760405162461bcd60e51b81526004016103d9906112ee565b60008281526001602081815260408320805492830181558352918290208351610c3193919092019190840190610ccc565b508051610c4590600b906020840190610ccc565b507f7b59e766dd02d6ce4e574f0ab75dfc4b180c90deb50dd9dbdbc65768abcf80f183838360006040516107889493929190611336565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054610cd890611210565b90600052602060002090601f016020900481019282610cfa5760008555610d40565b82601f10610d1357805160ff1916838001178555610d40565b82800160010185558215610d40579182015b82811115610d40578251825591602001919060010190610d25565b50610d4c929150610d50565b5090565b5b80821115610d4c5760008155600101610d51565b600060208284031215610d7757600080fd5b81356001600160a01b0381168114610d8e57600080fd5b9392505050565b6000815180845260005b81811015610dbb57602081850181015186830182015201610d9f565b81811115610dcd576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610d8e6020830184610d95565b60008060408385031215610e0857600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610e3e57600080fd5b813567ffffffffffffffff80821115610e5957610e59610e17565b604051601f8301601f19908116603f01168101908282118183101715610e8157610e81610e17565b81604052838152866020858801011115610e9a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b80358015158114610eca57600080fd5b919050565b60008060008060008060c08789031215610ee857600080fd5b86359550602087013567ffffffffffffffff80821115610f0757600080fd5b610f138a838b01610e2d565b9650610f2160408a01610eba565b95506060890135915080821115610f3757600080fd5b50610f4489828a01610e2d565b935050608087013560ff81168114610f5b57600080fd5b8092505060a087013590509295509295509295565b60008060008060808587031215610f8657","600080fd5b84359350602085013567ffffffffffffffff80821115610fa557600080fd5b610fb188838901610e2d565b9450610fbf60408801610eba565b93506060870135915080821115610fd557600080fd5b50610fe287828801610e2d565b91505092959194509250565b60008060006060848603121561100357600080fd5b833567ffffffffffffffff8082111561101b57600080fd5b61102787838801610e2d565b945060208601359350604086013591508082111561104457600080fd5b5061105186828701610e2d565b9150509250925092565b803563ffffffff81168114610eca57600080fd5b803567ffffffffffffffff81168114610eca57600080fd5b60008060008060008060c087890312156110a057600080fd5b86359550602087013567ffffffffffffffff808211156110bf57600080fd5b6110cb8a838b01610e2d565b9650604089013595506110e060608a0161105b565b94506110ee60808a0161106f565b935060a089013591508082111561110457600080fd5b5061111189828a01610e2d565b9150509295509295509295565b600080600080600080600060e0888a03121561113957600080fd5b87359650602088013567ffffffffffffffff8082111561115857600080fd5b6111648b838c01610e2d565b975060408a0135965061117960608b0161105b565b955061118760808b0161106f565b945060a08a013591508082111561119d57600080fd5b6111a98b838c01610e2d565b935060c08a01359150808211156111bf57600080fd5b506111cc8a828b01610e2d565b91505092959891949750929550565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061122457607f821691505b6020821081141561124557634e487b7160e01b600052602260045260246000fd5b50919050565b60c08152600061125e60c0830189610d95565b8760208401528615156040840152828103606084015261127e8187610d95565b60ff959095166080840152505060a00152949350505050565b6000602082840312156112a957600080fd5b5051919050565b6080815260006112c36080830187610d95565b856020840152841515604084015282810360608401526112e38185610d95565b979650505050505050565b60208082526028908201527f494e56414c49445f5045524d495353494f4e3a206f6e6c79206d6f6e69746f72604082015267206d65737361676560c01b606082015260800190565b6080815260006113496080830187610d95565b85602084015282810360408401526113618186610d95565b915050821515606083015295945050505050565b6060815260006113886060830186610d95565b84602084015282810360408401526113a08185610d95565b9695505050505050565b86815260c0602082015260006113c360c0830188610d95565b86604084015263ffffffff8616606084015267ffffffffffffffff8516608084015282810360a08401526113f78185610d95565b9998505050505050505050565b87815260e06020820152600061141d60e0830189610d95565b87604084015263ffffffff8716606084015267ffffffffffffffff8616608084015282810360a08401526114518186610d95565b905082810360c08401526114658185610d95565b9a995050505050505050505056fea2646970667358221220b4f7b1f8d58d0f8a9449f08eabfbd298bb0b19934aacbae7ae1e1db91e2c912f64736f6c634300080b0033"}; public static final String BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", BINARY_ARRAY); - public static final String[] SM_BINARY_ARRAY = {"608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b6111a98061007e6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806390b28686116100c3578063d84ecd691161007c578063d84ecd691461028c578063d86e29e21461029f578063e2df53a9146102a7578063e5b813ad146102ba578063f985484a146102cd578063fbec4563146102e057600080fd5b806390b28686146102445780639c1b7bb214610257578063b31d332914610260578063bdb560a614610268578063d417dd1814610270578063d6175d1a1461028357600080fd5b80632d0da185116101155780632d0da185146101eb5780634ae89fd2146101f45780635089e2c8146101fc5780635b3040451461022157806365699d8d146102295780638a5851371461023c57600080fd5b80630204ebc21461015d578063084e7508146101725780630a3b07e81461019b57806316cad12a146101b25780632097809b146101c5578063281cf5e6146101d8575b600080fd5b61017061016b366004610c44565b6102f3565b005b610185610180366004610cb1565b6103ce565b6040516101929190610d20565b60405180910390f35b6101a460075481565b604051908152602001610192565b6101706101c0366004610d3a565b610487565b6101706101d3366004610d3a565b61052d565b6101706101e6366004610c44565b61057a565b6101a460065481565b610185610646565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610192565b610185610653565b610170610237366004610c44565b610660565b61018561072e565b610185610252366004610cb1565b6107c0565b6101a460045481565b6101856107dc565b6101856107e9565b61017061027e366004610d94565b6107f8565b6101a460055481565b600354610209906001600160a01b031681565b61017061085d565b6101706102b5366004610e51565b610894565b6101706102c8366004610c44565b610919565b6101706102db366004610e51565b6109e5565b6101706102ee366004610ed8565b610a6a565b60035460405163010275e160e11b81526001600160a01b0390911690630204ebc29061032790869086908690600401610f6f565b600060405180830381600087803b15801561034157600080fd5b505af1158015610355573d6000803e3d6000fd5b50505060008381526002602090815260408220805460018101825590835291819020845161038a945092019190840190610b08565b507f200ed2971aa003016354f781cf280ada45672de3dc8c36583854d0bfe8b33a6083838360006040516103c19493929190610fa4565b60405180910390a1505050565b600260205281600052604060002081815481106103ea57600080fd5b9060005260206000200160009150915050805461040690610fe3565b80601f016020809104026020016040519081016040528092919081815260200182805461043290610fe3565b801561047f5780601f106104545761010080835404028352916020019161047f565b820191906000526020600020905b81548152906001019060200180831161046257829003601f168201915b505050505081565b6000546001600160a01b031633146104bb57604051636381e58960e11b81526004016104b29061101e565b60405180910390fd5b6001600160a01b03811661052157604051636381e58960e11b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104b2565b61052a81610ab8565b50565b6000546001600160a01b0316331461055857604051636381e58960e11b81526004016104b29061101e565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031633146105ca57604051636381e58960e11b815260206004820152601260248201527124a72b20a624a22fa822a926a4a9a9a4a7a760711b60448201526064016104b2565b600082815260016020818152604083208054928301815583529182902083516105fb93919092019190840190610b08565b50805161060f906009906020840190610b08565b507f96dd7a715fb188abef0d5ab36bd03d64c6457c75f997607aa73f9c3d85700ba583838360016040516103c19493929190610fa4565b600a805461040690610fe3565b6008805461040690610fe3565b6003546040516365699d8d60e01b81526001600160a01b03909116906365699d8d9061069490869086908690600401610f6f565b600060405180830381600087803b1580156106ae57600080fd5b505af11580156106c2573d6000803e3d6000fd5b5050506000838152600260209081526040822080546001810182559083529181902084516106f7945092019190840190610b08565b507f200ed2971aa003016354f781cf280ada45672de3dc8c36583854d0bfe8b33a6083838360016040516103c19493929190610fa4565b6060600a805461073d90610fe3565b80601f016020809104026020016040519081016040528092919081815260200182805461076990610fe3565b80156107b65780601f1061078b576101008083540402835291602001916107b6565b820191906000526020600020905b81548152906001019060200180831161079957829003601f168201915b5050505050905090565b600160205281600052604060002081815481106103ea57600080fd5b6009805461040690610fe3565b60606009805461073d90610fe3565b7f7c428ded023c093a8e5b0442e2d50dac9ab81475f660a28b1cd1a028ffd0d991878787878787876040516108339796959493929190611053565b60405180910390a160078790558051610853906008906020840190610b08565b5050505050505050565b6000546001600160a01b0316331461088857604051636381e58960e11b81526004016104b29061101e565b6108926000610ab8565b565b60035460405163f7d579c760e01b81526001600160a01b0390911690819063f7d579c7906108cc9087908990889088906004016110c2565b6020604051808303816000875af11580156108eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090f9190611100565b6005555050505050565b6003546001600160a01b0316331461096957604051636381e58960e11b815260206004820152601260248201527124a72b20a624a22fa822a926a4a9a9a4a7a760711b60448201526064016104b2565b6000828152600160208181526040832080549283018155835291829020835161099a93919092019190840190610b08565b5080516109ae90600a906020840190610b08565b507f96dd7a715fb188abef0d5ab36bd03d64c6457c75f997607aa73f9c3d85700ba583838360006040516103c19493929190610fa4565b600354604051631839bef160e21b81526001600160a01b039091169081906360e6fbc490610a1d9087908990889088906004016110c2565b6020604051808303816000875af1158015610a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a609190611100565b6004555050505050565b7fa7647aaf8a6699c6874d335ef4930e14945244cf7d83698864123d18f37c0a72868686868686604051610aa396959493929190611119565b60405180910390a15050506006929092555050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b828054610b1490610fe3565b90600052602060002090601f016020900481019282610b365760008555610b7c565b82601f10610b4f57805160ff1916838001178555610b7c565b82800160010185558215610b7c579182015b82811115610b7c578251825591602001919060010190610b61565b50610b88929150610b8c565b5090565b5b80821115610b885760008155600101610b8d565b63b95aa35560e01b600052604160045260246000fd5b600082601f830112610bc857600080fd5b813567ffffffffffffffff80821115610be357610be3610ba1565b604051601f8301601f19908116603f01168101908282118183101715610c0b57610c0b610ba1565b81604052838152866020858801011115610c2457600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215610c5957600080fd5b833567ffffffffffffffff80821115610c7157600080fd5b610c7d87838801610bb7565b9450602086013593506040860135915080821115610c9a57600080fd5b50610ca786828701610bb7565b9150509250925092565b60008060408385031215610cc457600080fd5b50508035926020909101359150565b6000815180845260005b81811015610cf957602081850181015186830182015201610cdd565b81811115610d0b576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610d336020830184610cd3565b9392505050565b600060208284031215610d4c57600080fd5b81356001600160a01b0381168114610d3357600080fd5b803563ffffffff81168114610d7757600080fd5b919050565b803567ffffffffffffffff81168114610d7757600080fd5b600080600080600080600060e0888a031215610daf57600080fd5b87359650602088013567ffffffffffffffff80821115610dce57600080fd5b610dda8b838c01610bb7565b975060408a01359650610def60608b01610d63565b9550610dfd60808b01610d7c565b945060a08a0135915080821115610e1357600080fd5b610e1f8b838c01610bb7565b935060c08a0135915080821115610e3557600080fd5b50610e428a828b01610bb7565b91505092959891949750929550565b60008060008060808587031215610e6757600080fd5b84359350602085013567ffffffffffffffff80821115610e8657600080fd5b610e9288838901610bb7565b9450604087013591508115158214610ea957600080fd5b90925060608601359080821115610ebf57600080fd5b50610ecc87828801610bb7565b91505092959194509250565b60008060008060008060c08789031215610ef157600080fd5b86359550602087013567ffffffffffffffff80821115610f1057600080fd5b610f1c8a838b01610bb7565b965060408901359550610f3160608a01610d63565b9450610f3f60808a01610d7c565b935060a0890135915080821115610f5557600080fd5b50610f6289828a01610bb7565b9150509295509295509295565b606081526000610f826060830186610cd356","5b8460208401528281036040840152610f9a8185610cd3565b9695505050505050565b608081526000610fb76080830187610cd3565b8560208401528281036040840152610fcf8186610cd3565b915050821515606083015295945050505050565b600181811c90821680610ff757607f821691505b602082108114156110185763b95aa35560e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b87815260e06020820152600061106c60e0830189610cd3565b87604084015263ffffffff8716606084015267ffffffffffffffff8616608084015282810360a08401526110a08186610cd3565b905082810360c08401526110b48185610cd3565b9a9950505050505050505050565b6080815260006110d56080830187610cd3565b856020840152841515604084015282810360608401526110f58185610cd3565b979650505050505050565b60006020828403121561111257600080fd5b5051919050565b86815260c06020820152600061113260c0830188610cd3565b86604084015263ffffffff8616606084015267ffffffffffffffff8516608084015282810360a08401526111668185610cd3565b999850505050505050505056fea2646970667358221220ec39d6f57340a1527abbd45581a9b60f1290135dd5ba89363de4c6a0345a821a64736f6c634300080b0033"}; + public static final String[] SM_BINARY_ARRAY = {"608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b6114ac8061007e6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80639c1b7bb2116100f9578063d964ada511610097578063edf79eef11610071578063edf79eef1461035f578063f03dc28814610372578063f985484a14610385578063fbec45631461039857600080fd5b8063d964ada514610326578063e2df53a914610339578063e5b813ad1461034c57600080fd5b8063d417dd18116100d3578063d417dd18146102ef578063d6175d1a14610302578063d84ecd691461030b578063d86e29e21461031e57600080fd5b80639c1b7bb2146102d6578063b31d3329146102df578063bdb560a6146102e757600080fd5b806336f35354116101665780635b304045116101405780635b304045146102a057806365699d8d146102a85780638a585137146102bb57806390b28686146102c357600080fd5b806336f35354146102605780634ae89fd2146102735780635089e2c81461027b57600080fd5b806316cad12a116101a257806316cad12a1461021e5780632097809b14610231578063281cf5e6146102445780632d0da1851461025757600080fd5b80630204ebc2146101c9578063084e7508146101de5780630a3b07e814610207575b600080fd5b6101dc6101d7366004610e0b565b6103ab565b005b6101f16101ec366004610e78565b610486565b6040516101fe9190610ee7565b60405180910390f35b61021060085481565b6040519081526020016101fe565b6101dc61022c366004610f01565b61053f565b6101dc61023f366004610f01565b6105e5565b6101dc610252366004610e0b565b610632565b61021060075481565b6101dc61026e366004610f01565b6106d9565b6101f1610726565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101fe565b6101f1610733565b6101dc6102b6366004610e0b565b610740565b6101f161080e565b6101f16102d1366004610e78565b6108a0565b61021060055481565b6101f16108bc565b6101f16108c9565b6101dc6102fd366004610f5b565b6108d8565b61021060065481565b600454610288906001600160a01b031681565b6101dc61093d565b6101dc610334366004611028565b610974565b6101dc6103473660046110c9565b6109fb565b6101dc61035a366004610e0b565b610a7f565b6101dc61036d366004611028565b610b26565b600354610288906001600160a01b031681565b6101dc6103933660046110c9565b610bad565b6101dc6103a6366004611147565b610c31565b60035460405163354e6a6f60e21b81526001600160a01b039091169063d539a9bc906103df908690869086906004016111de565b600060405180830381600087803b1580156103f957600080fd5b505af115801561040d573d6000803e3d6000fd5b505050600083815260026020908152604082208054600181018255908352918190208451610442945092019190840190610ccf565b507f200ed2971aa003016354f781cf280ada45672de3dc8c36583854d0bfe8b33a6083838360006040516104799493929190611213565b60405180910390a1505050565b600260205281600052604060002081815481106104a257600080fd5b906000526020600020016000915091505080546104be90611252565b80601f01602080910402602001604051908101604052809291908181526020018280546104ea90611252565b80156105375780601f1061050c57610100808354040283529160200191610537565b820191906000526020600020905b81548152906001019060200180831161051a57829003601f168201915b505050505081565b6000546001600160a01b0316331461057357604051636381e58960e11b815260040161056a9061128d565b60405180910390fd5b6001600160a01b0381166105d957604051636381e58960e11b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161056a565b6105e281610c7f565b50565b6000546001600160a01b0316331461061057604051636381e58960e11b815260040161056a9061128d565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b0316331461065d57604051636381e58960e11b815260040161056a906112c2565b6000828152600160208181526040832080549283018155835291829020835161068e93919092019190840190610ccf565b5080516106a290600a906020840190610ccf565b507f96dd7a715fb188abef0d5ab36bd03d64c6457c75f997607aa73f9c3d85700ba583838360016040516104799493929190611213565b6000546001600160a01b0316331461070457604051636381e58960e11b815260040161056a9061128d565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600b80546104be90611252565b600980546104be90611252565b6003546040516303ed4ce560e41b81526001600160a01b0390911690633ed4ce5090610774908690869086906004016111de565b600060405180830381600087803b15801561078e57600080fd5b505af11580156107a2573d6000803e3d6000fd5b5050506000838152600260209081526040822080546001810182559083529181902084516107d7945092019190840190610ccf565b507f200ed2971aa003016354f781cf280ada45672de3dc8c36583854d0bfe8b33a6083838360016040516104799493929190611213565b6060600b805461081d90611252565b80601f016020809104026020016040519081016040528092919081815260200182805461084990611252565b80156108965780601f1061086b57610100808354040283529160200191610896565b820191906000526020600020905b81548152906001019060200180831161087957829003601f168201915b5050505050905090565b600160205281600052604060002081815481106104a257600080fd5b600a80546104be90611252565b6060600a805461081d90611252565b7f7c428ded023c093a8e5b0442e2d50dac9ab81475f660a28b1cd1a028ffd0d99187878787878787604051610913979695949392919061130a565b60405180910390a160088790558051610933906009906020840190610ccf565b5050505050505050565b6000546001600160a01b0316331461096857604051636381e58960e11b815260040161056a9061128d565b6109726000610c7f565b565b60048054604051634183bc3f60e01b81526001600160a01b0390911691634183bc3f916109ad9189918b918a918a918a918a9101611379565b6020604051808303816000875af11580156109cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f091906113c5565b600655505050505050565b6004805460405163f7d579c760e01b81526001600160a01b0390911691829163f7d579c791610a329188918a9189918991016113de565b6020604051808303816000875af1158015610a51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7591906113c5565b6006555050505050565b6003546001600160a01b03163314610aaa57604051636381e58960e11b815260040161056a906112c2565b60008281526001602081815260408320805492830181558352918290208351610adb93919092019190840190610ccf565b508051610aef90600b906020840190610ccf565b507f96dd7a715fb188abef0d5ab36bd03d64c6457c75f997607aa73f9c3d85700ba583838360006040516104799493929190611213565b6004805460405163488c188160e11b81526001600160a01b0390911691639118310291610b5f9189918b918a918a918a918a9101611379565b6020604051808303816000875af1158015610b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba291906113c5565b600555505050505050565b60048054604051631839bef160e21b81526001600160a01b039091169182916360e6fbc491610be49188918a9189918991016113de565b6020604051808303816000875af1158015610c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2791906113c5565b6005555050505050565b7fa7647aaf8a6699c6874d335ef4930e14945244cf7d83698864123d18f37c0a72868686868686604051610c6a9695949392919061141c565b60405180910390a15050506007929092555050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b828054610cdb90611252565b90600052602060002090601f016020900481019282610cfd5760008555610d43565b82601f10610d1657805160ff1916838001178555610d43565b82800160010185558215610d43579182015b82811115610d43578251825591602001919060010190610d28565b50610d4f929150610d53565b5090565b5b80821115610d4f5760008155600101610d54565b63b95aa35560e01b600052604160045260246000fd5b600082601f830112610d8f57600080fd5b813567ffffffffffffffff80821115610daa57610daa610d68565b604051601f8301601f19908116603f01168101908282118183101715610dd257610dd2610d68565b81604052838152866020858801011115610deb57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215610e2057600080fd5b833567ffffffffffffffff80821115610e3857600080fd5b610e4487838801610d7e565b9450602086013593506040860135915080821115610e6157600080fd5b50610e6e86828701610d7e565b9150509250925092565b60008060408385031215610e8b57600080fd5b50508035926020909101359150565b6000815180845260005b81811015610ec057602081850181015186830182015201610ea4565b81811115610ed2576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610efa6020830184610e9a565b9392505050565b600060208284031215610f1357600080fd5b81356001600160a01b0381168114610efa57600080fd5b803563ffffffff81168114610f3e57600080fd5b919050565b803567ffffffffffffffff81168114610f3e57600080fd5b600080600080600080600060e0888a031215610f7657600080fd5b87359650602088013567ff","ffffffffffffff80821115610f9557600080fd5b610fa18b838c01610d7e565b975060408a01359650610fb660608b01610f2a565b9550610fc460808b01610f43565b945060a08a0135915080821115610fda57600080fd5b610fe68b838c01610d7e565b935060c08a0135915080821115610ffc57600080fd5b506110098a828b01610d7e565b91505092959891949750929550565b80358015158114610f3e57600080fd5b60008060008060008060c0878903121561104157600080fd5b86359550602087013567ffffffffffffffff8082111561106057600080fd5b61106c8a838b01610d7e565b965061107a60408a01611018565b9550606089013591508082111561109057600080fd5b5061109d89828a01610d7e565b935050608087013560ff811681146110b457600080fd5b8092505060a087013590509295509295509295565b600080600080608085870312156110df57600080fd5b84359350602085013567ffffffffffffffff808211156110fe57600080fd5b61110a88838901610d7e565b945061111860408801611018565b9350606087013591508082111561112e57600080fd5b5061113b87828801610d7e565b91505092959194509250565b60008060008060008060c0878903121561116057600080fd5b86359550602087013567ffffffffffffffff8082111561117f57600080fd5b61118b8a838b01610d7e565b9650604089013595506111a060608a01610f2a565b94506111ae60808a01610f43565b935060a08901359150808211156111c457600080fd5b506111d189828a01610d7e565b9150509295509295509295565b6060815260006111f16060830186610e9a565b84602084015282810360408401526112098185610e9a565b9695505050505050565b6080815260006112266080830187610e9a565b856020840152828103604084015261123e8186610e9a565b915050821515606083015295945050505050565b600181811c9082168061126657607f821691505b602082108114156112875763b95aa35560e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f494e56414c49445f5045524d495353494f4e3a206f6e6c79206d6f6e69746f72604082015267206d65737361676560c01b606082015260800190565b87815260e06020820152600061132360e0830189610e9a565b87604084015263ffffffff8716606084015267ffffffffffffffff8616608084015282810360a08401526113578186610e9a565b905082810360c084015261136b8185610e9a565b9a9950505050505050505050565b60c08152600061138c60c0830189610e9a565b876020840152861515604084015282810360608401526113ac8187610e9a565b60ff959095166080840152505060a00152949350505050565b6000602082840312156113d757600080fd5b5051919050565b6080815260006113f16080830187610e9a565b856020840152841515604084015282810360608401526114118185610e9a565b979650505050505050565b86815260c06020820152600061143560c0830188610e9a565b86604084015263ffffffff8616606084015267ffffffffffffffff8516608084015282810360a08401526114698185610e9a565b999850505050505050505056fea26469706673582212202cb33e13adb52d120f7e13d7e2446df1698acd011c496332749f613c9bf9b31e64736f6c634300080b0033"}; public static final String SM_BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", SM_BINARY_ARRAY); - public static final String[] ABI_ARRAY = {"[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"errorMsg\",\"type\":\"string\"}],\"name\":\"AckOnError\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"AckOnSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isOrdered\",\"type\":\"bool\"}],\"name\":\"recvCrosschainMsg\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isOrdered\",\"type\":\"bool\"}],\"name\":\"sendCrosschainMsg\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"errorMsg\",\"type\":\"string\"}],\"name\":\"ackOnError\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"ackOnSuccess\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastMsg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastUnorderedMsg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"last_msg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"last_uo_msg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latest_msg_error\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latest_msg_id_ack_error\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latest_msg_id_ack_success\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latest_msg_id_sent_order\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latest_msg_id_sent_unorder\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"recvMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"recvMsg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"recvUnorderedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sdpAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"sendMsg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendUnorderedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_msg\",\"type\":\"bytes\"}],\"name\":\"sendUnorderedV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_msg\",\"type\":\"bytes\"}],\"name\":\"sendV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"protocolAddress\",\"type\":\"address\"}],\"name\":\"setProtocol\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"}; + public static final String[] ABI_ARRAY = {"[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"errorMsg\",\"type\":\"string\"}],\"name\":\"AckOnError\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"AckOnSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isOrdered\",\"type\":\"bool\"}],\"name\":\"recvCrosschainMsg\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isOrdered\",\"type\":\"bool\"}],\"name\":\"sendCrosschainMsg\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"errorMsg\",\"type\":\"string\"}],\"name\":\"ackOnError\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"ackOnSuccess\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastMsg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastUnorderedMsg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"last_msg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"last_uo_msg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latest_msg_error\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latest_msg_id_ack_error\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latest_msg_id_ack_success\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latest_msg_id_sent_order\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latest_msg_id_sent_unorder\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"monitorAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"recvMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"recvMsg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"recvUnorderedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sdpAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"sendMsg\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendUnorderedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_msg\",\"type\":\"bytes\"}],\"name\":\"sendUnorderedV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_msg\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"timeoutMeasure\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"}],\"name\":\"sendUnorderedV3\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_msg\",\"type\":\"bytes\"}],\"name\":\"sendV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_msg\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"timeoutMeasure\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"}],\"name\":\"sendV3\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMoni","torAddress\",\"type\":\"address\"}],\"name\":\"setMonitorContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"protocolAddress\",\"type\":\"address\"}],\"name\":\"setProtocol\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"}; public static final String ABI = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", ABI_ARRAY); @@ -67,6 +70,8 @@ public class AppContract extends Contract { public static final String FUNC_LATEST_MSG_ID_SENT_UNORDER = "latest_msg_id_sent_unorder"; + public static final String FUNC_MONITORADDRESS = "monitorAddress"; + public static final String FUNC_OWNER = "owner"; public static final String FUNC_RECVMESSAGE = "recvMessage"; @@ -87,34 +92,41 @@ public class AppContract extends Contract { public static final String FUNC_SENDUNORDEREDV2 = "sendUnorderedV2"; + public static final String FUNC_SENDUNORDEREDV3 = "sendUnorderedV3"; + public static final String FUNC_SENDV2 = "sendV2"; + public static final String FUNC_SENDV3 = "sendV3"; + + public static final String FUNC_SETMONITORCONTRACT = "setMonitorContract"; + public static final String FUNC_SETPROTOCOL = "setProtocol"; public static final String FUNC_TRANSFEROWNERSHIP = "transferOwnership"; - public static final Event ACKONERROR_EVENT = new Event("AckOnError", + public static final Event ACKONERROR_EVENT = new Event("AckOnError", Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); ; - public static final Event ACKONSUCCESS_EVENT = new Event("AckOnSuccess", + public static final Event ACKONSUCCESS_EVENT = new Event("AckOnSuccess", Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); ; - public static final Event OWNERSHIPTRANSFERRED_EVENT = new Event("OwnershipTransferred", + public static final Event OWNERSHIPTRANSFERRED_EVENT = new Event("OwnershipTransferred", Arrays.>asList(new TypeReference
(true) {}, new TypeReference
(true) {})); ; - public static final Event RECVCROSSCHAINMSG_EVENT = new Event("recvCrosschainMsg", + public static final Event RECVCROSSCHAINMSG_EVENT = new Event("recvCrosschainMsg", Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); ; - public static final Event SENDCROSSCHAINMSG_EVENT = new Event("sendCrosschainMsg", + public static final Event SENDCROSSCHAINMSG_EVENT = new Event("sendCrosschainMsg", Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); ; protected AppContract(String contractAddress, Client client, CryptoKeyPair credential) { super(getBinary(client.getCryptoSuite()), contractAddress, client, credential); + this.transactionManager = new ProxySignTransactionManager(client); } public static String getBinary(CryptoSuite cryptoSuite) { @@ -266,14 +278,14 @@ public void subscribeSendCrosschainMsgEvent(EventSubCallback callback) { public TransactionReceipt ackOnError(byte[] messageId, String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, byte[] message, String errorMsg) { final Function function = new Function( - FUNC_ACKONERROR, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), + FUNC_ACKONERROR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), Collections.>emptyList(), 0); return executeTransaction(function); } @@ -281,14 +293,14 @@ public TransactionReceipt ackOnError(byte[] messageId, String receiverDomain, by public Function getMethodAckOnErrorRawFunction(byte[] messageId, String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, byte[] message, String errorMsg) throws ContractException { - final Function function = new Function(FUNC_ACKONERROR, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), + final Function function = new Function(FUNC_ACKONERROR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), Arrays.>asList()); return function; } @@ -297,14 +309,14 @@ public String getSignedTransactionForAckOnError(byte[] messageId, String receive byte[] receiver, BigInteger sequence, BigInteger nonce, byte[] message, String errorMsg) { final Function function = new Function( - FUNC_ACKONERROR, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), + FUNC_ACKONERROR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -313,14 +325,14 @@ public String ackOnError(byte[] messageId, String receiverDomain, byte[] receive BigInteger sequence, BigInteger nonce, byte[] message, String errorMsg, TransactionCallback callback) { final Function function = new Function( - FUNC_ACKONERROR, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), + FUNC_ACKONERROR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -328,18 +340,18 @@ public String ackOnError(byte[] messageId, String receiverDomain, byte[] receive public Tuple7 getAckOnErrorInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_ACKONERROR, - Arrays.asList(), + final Function function = new Function(FUNC_ACKONERROR, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple7( - (byte[]) results.get(0).getValue(), - (String) results.get(1).getValue(), - (byte[]) results.get(2).getValue(), - (BigInteger) results.get(3).getValue(), - (BigInteger) results.get(4).getValue(), - (byte[]) results.get(5).getValue(), + (byte[]) results.get(0).getValue(), + (String) results.get(1).getValue(), + (byte[]) results.get(2).getValue(), + (BigInteger) results.get(3).getValue(), + (BigInteger) results.get(4).getValue(), + (byte[]) results.get(5).getValue(), (String) results.get(6).getValue() ); } @@ -347,13 +359,13 @@ public Tuple7 ge public TransactionReceipt ackOnSuccess(byte[] messageId, String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, byte[] message) { final Function function = new Function( - FUNC_ACKONSUCCESS, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_ACKONSUCCESS, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return executeTransaction(function); } @@ -361,13 +373,13 @@ public TransactionReceipt ackOnSuccess(byte[] messageId, String receiverDomain, public Function getMethodAckOnSuccessRawFunction(byte[] messageId, String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, byte[] message) throws ContractException { - final Function function = new Function(FUNC_ACKONSUCCESS, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + final Function function = new Function(FUNC_ACKONSUCCESS, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Arrays.>asList()); return function; } @@ -375,13 +387,13 @@ public Function getMethodAckOnSuccessRawFunction(byte[] messageId, String receiv public String getSignedTransactionForAckOnSuccess(byte[] messageId, String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, byte[] message) { final Function function = new Function( - FUNC_ACKONSUCCESS, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_ACKONSUCCESS, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -389,13 +401,13 @@ public String getSignedTransactionForAckOnSuccess(byte[] messageId, String recei public String ackOnSuccess(byte[] messageId, String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, byte[] message, TransactionCallback callback) { final Function function = new Function( - FUNC_ACKONSUCCESS, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_ACKONSUCCESS, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -403,177 +415,191 @@ public String ackOnSuccess(byte[] messageId, String receiverDomain, byte[] recei public Tuple6 getAckOnSuccessInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_ACKONSUCCESS, - Arrays.asList(), + final Function function = new Function(FUNC_ACKONSUCCESS, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple6( - (byte[]) results.get(0).getValue(), - (String) results.get(1).getValue(), - (byte[]) results.get(2).getValue(), - (BigInteger) results.get(3).getValue(), - (BigInteger) results.get(4).getValue(), + (byte[]) results.get(0).getValue(), + (String) results.get(1).getValue(), + (byte[]) results.get(2).getValue(), + (BigInteger) results.get(3).getValue(), + (BigInteger) results.get(4).getValue(), (byte[]) results.get(5).getValue() ); } public byte[] getLastMsg() throws ContractException { - final Function function = new Function(FUNC_GETLASTMSG, - Arrays.asList(), + final Function function = new Function(FUNC_GETLASTMSG, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodGetLastMsgRawFunction() throws ContractException { - final Function function = new Function(FUNC_GETLASTMSG, - Arrays.asList(), + final Function function = new Function(FUNC_GETLASTMSG, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } public byte[] getLastUnorderedMsg() throws ContractException { - final Function function = new Function(FUNC_GETLASTUNORDEREDMSG, - Arrays.asList(), + final Function function = new Function(FUNC_GETLASTUNORDEREDMSG, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodGetLastUnorderedMsgRawFunction() throws ContractException { - final Function function = new Function(FUNC_GETLASTUNORDEREDMSG, - Arrays.asList(), + final Function function = new Function(FUNC_GETLASTUNORDEREDMSG, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } public byte[] last_msg() throws ContractException { - final Function function = new Function(FUNC_LAST_MSG, - Arrays.asList(), + final Function function = new Function(FUNC_LAST_MSG, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodLast_msgRawFunction() throws ContractException { - final Function function = new Function(FUNC_LAST_MSG, - Arrays.asList(), + final Function function = new Function(FUNC_LAST_MSG, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } public byte[] last_uo_msg() throws ContractException { - final Function function = new Function(FUNC_LAST_UO_MSG, - Arrays.asList(), + final Function function = new Function(FUNC_LAST_UO_MSG, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodLast_uo_msgRawFunction() throws ContractException { - final Function function = new Function(FUNC_LAST_UO_MSG, - Arrays.asList(), + final Function function = new Function(FUNC_LAST_UO_MSG, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } public String latest_msg_error() throws ContractException { - final Function function = new Function(FUNC_LATEST_MSG_ERROR, - Arrays.asList(), + final Function function = new Function(FUNC_LATEST_MSG_ERROR, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, String.class); } public Function getMethodLatest_msg_errorRawFunction() throws ContractException { - final Function function = new Function(FUNC_LATEST_MSG_ERROR, - Arrays.asList(), + final Function function = new Function(FUNC_LATEST_MSG_ERROR, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } public byte[] latest_msg_id_ack_error() throws ContractException { - final Function function = new Function(FUNC_LATEST_MSG_ID_ACK_ERROR, - Arrays.asList(), + final Function function = new Function(FUNC_LATEST_MSG_ID_ACK_ERROR, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodLatest_msg_id_ack_errorRawFunction() throws ContractException { - final Function function = new Function(FUNC_LATEST_MSG_ID_ACK_ERROR, - Arrays.asList(), + final Function function = new Function(FUNC_LATEST_MSG_ID_ACK_ERROR, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } public byte[] latest_msg_id_ack_success() throws ContractException { - final Function function = new Function(FUNC_LATEST_MSG_ID_ACK_SUCCESS, - Arrays.asList(), + final Function function = new Function(FUNC_LATEST_MSG_ID_ACK_SUCCESS, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodLatest_msg_id_ack_successRawFunction() throws ContractException { - final Function function = new Function(FUNC_LATEST_MSG_ID_ACK_SUCCESS, - Arrays.asList(), + final Function function = new Function(FUNC_LATEST_MSG_ID_ACK_SUCCESS, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } public byte[] latest_msg_id_sent_order() throws ContractException { - final Function function = new Function(FUNC_LATEST_MSG_ID_SENT_ORDER, - Arrays.asList(), + final Function function = new Function(FUNC_LATEST_MSG_ID_SENT_ORDER, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodLatest_msg_id_sent_orderRawFunction() throws ContractException { - final Function function = new Function(FUNC_LATEST_MSG_ID_SENT_ORDER, - Arrays.asList(), + final Function function = new Function(FUNC_LATEST_MSG_ID_SENT_ORDER, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } public byte[] latest_msg_id_sent_unorder() throws ContractException { - final Function function = new Function(FUNC_LATEST_MSG_ID_SENT_UNORDER, - Arrays.asList(), + final Function function = new Function(FUNC_LATEST_MSG_ID_SENT_UNORDER, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodLatest_msg_id_sent_unorderRawFunction() throws ContractException { - final Function function = new Function(FUNC_LATEST_MSG_ID_SENT_UNORDER, - Arrays.asList(), + final Function function = new Function(FUNC_LATEST_MSG_ID_SENT_UNORDER, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } + public String monitorAddress() throws ContractException { + final Function function = new Function(FUNC_MONITORADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodMonitorAddressRawFunction() throws ContractException { + final Function function = new Function(FUNC_MONITORADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + public String owner() throws ContractException { - final Function function = new Function(FUNC_OWNER, - Arrays.asList(), + final Function function = new Function(FUNC_OWNER, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return executeCallWithSingleValueReturn(function, String.class); } public Function getMethodOwnerRawFunction() throws ContractException { - final Function function = new Function(FUNC_OWNER, - Arrays.asList(), + final Function function = new Function(FUNC_OWNER, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return function; } public TransactionReceipt recvMessage(String senderDomain, byte[] author, byte[] message) { final Function function = new Function( - FUNC_RECVMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_RECVMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodRecvMessageRawFunction(String senderDomain, byte[] author, byte[] message) throws ContractException { - final Function function = new Function(FUNC_RECVMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + final Function function = new Function(FUNC_RECVMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Arrays.>asList()); return function; } @@ -581,10 +607,10 @@ public Function getMethodRecvMessageRawFunction(String senderDomain, byte[] auth public String getSignedTransactionForRecvMessage(String senderDomain, byte[] author, byte[] message) { final Function function = new Function( - FUNC_RECVMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_RECVMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -592,10 +618,10 @@ public String getSignedTransactionForRecvMessage(String senderDomain, byte[] aut public String recvMessage(String senderDomain, byte[] author, byte[] message, TransactionCallback callback) { final Function function = new Function( - FUNC_RECVMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_RECVMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -603,31 +629,31 @@ public String recvMessage(String senderDomain, byte[] author, byte[] message, public Tuple3 getRecvMessageInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_RECVMESSAGE, - Arrays.asList(), + final Function function = new Function(FUNC_RECVMESSAGE, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple3( - (String) results.get(0).getValue(), - (byte[]) results.get(1).getValue(), + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), (byte[]) results.get(2).getValue() ); } public byte[] recvMsg(byte[] param0, BigInteger param1) throws ContractException { - final Function function = new Function(FUNC_RECVMSG, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param1)), + final Function function = new Function(FUNC_RECVMSG, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param1)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodRecvMsgRawFunction(byte[] param0, BigInteger param1) throws ContractException { - final Function function = new Function(FUNC_RECVMSG, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param1)), + final Function function = new Function(FUNC_RECVMSG, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param1)), Arrays.>asList(new TypeReference() {})); return function; } @@ -635,20 +661,20 @@ public Function getMethodRecvMsgRawFunction(byte[] param0, BigInteger param1) th public TransactionReceipt recvUnorderedMessage(String senderDomain, byte[] author, byte[] message) { final Function function = new Function( - FUNC_RECVUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_RECVUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodRecvUnorderedMessageRawFunction(String senderDomain, byte[] author, byte[] message) throws ContractException { - final Function function = new Function(FUNC_RECVUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + final Function function = new Function(FUNC_RECVUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Arrays.>asList()); return function; } @@ -656,10 +682,10 @@ public Function getMethodRecvUnorderedMessageRawFunction(String senderDomain, by public String getSignedTransactionForRecvUnorderedMessage(String senderDomain, byte[] author, byte[] message) { final Function function = new Function( - FUNC_RECVUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_RECVUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -667,10 +693,10 @@ public String getSignedTransactionForRecvUnorderedMessage(String senderDomain, b public String recvUnorderedMessage(String senderDomain, byte[] author, byte[] message, TransactionCallback callback) { final Function function = new Function( - FUNC_RECVUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_RECVUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -678,79 +704,79 @@ public String recvUnorderedMessage(String senderDomain, byte[] author, byte[] me public Tuple3 getRecvUnorderedMessageInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_RECVUNORDEREDMESSAGE, - Arrays.asList(), + final Function function = new Function(FUNC_RECVUNORDEREDMESSAGE, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple3( - (String) results.get(0).getValue(), - (byte[]) results.get(1).getValue(), + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), (byte[]) results.get(2).getValue() ); } public TransactionReceipt renounceOwnership() { final Function function = new Function( - FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodRenounceOwnershipRawFunction() throws ContractException { - final Function function = new Function(FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + final Function function = new Function(FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), Arrays.>asList()); return function; } public String getSignedTransactionForRenounceOwnership() { final Function function = new Function( - FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String renounceOwnership(TransactionCallback callback) { final Function function = new Function( - FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public String sdpAddress() throws ContractException { - final Function function = new Function(FUNC_SDPADDRESS, - Arrays.asList(), + final Function function = new Function(FUNC_SDPADDRESS, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return executeCallWithSingleValueReturn(function, String.class); } public Function getMethodSdpAddressRawFunction() throws ContractException { - final Function function = new Function(FUNC_SDPADDRESS, - Arrays.asList(), + final Function function = new Function(FUNC_SDPADDRESS, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return function; } public TransactionReceipt sendMessage(String receiverDomain, byte[] receiver, byte[] message) { final Function function = new Function( - FUNC_SENDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodSendMessageRawFunction(String receiverDomain, byte[] receiver, byte[] message) throws ContractException { - final Function function = new Function(FUNC_SENDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + final Function function = new Function(FUNC_SENDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Arrays.>asList()); return function; } @@ -758,10 +784,10 @@ public Function getMethodSendMessageRawFunction(String receiverDomain, byte[] re public String getSignedTransactionForSendMessage(String receiverDomain, byte[] receiver, byte[] message) { final Function function = new Function( - FUNC_SENDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -769,10 +795,10 @@ public String getSignedTransactionForSendMessage(String receiverDomain, byte[] r public String sendMessage(String receiverDomain, byte[] receiver, byte[] message, TransactionCallback callback) { final Function function = new Function( - FUNC_SENDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -780,31 +806,31 @@ public String sendMessage(String receiverDomain, byte[] receiver, byte[] message public Tuple3 getSendMessageInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SENDMESSAGE, - Arrays.asList(), + final Function function = new Function(FUNC_SENDMESSAGE, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple3( - (String) results.get(0).getValue(), - (byte[]) results.get(1).getValue(), + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), (byte[]) results.get(2).getValue() ); } public byte[] sendMsg(byte[] param0, BigInteger param1) throws ContractException { - final Function function = new Function(FUNC_SENDMSG, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param1)), + final Function function = new Function(FUNC_SENDMSG, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param1)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodSendMsgRawFunction(byte[] param0, BigInteger param1) throws ContractException { - final Function function = new Function(FUNC_SENDMSG, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param1)), + final Function function = new Function(FUNC_SENDMSG, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param1)), Arrays.>asList(new TypeReference() {})); return function; } @@ -812,20 +838,20 @@ public Function getMethodSendMsgRawFunction(byte[] param0, BigInteger param1) th public TransactionReceipt sendUnorderedMessage(String receiverDomain, byte[] receiver, byte[] message) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodSendUnorderedMessageRawFunction(String receiverDomain, byte[] receiver, byte[] message) throws ContractException { - final Function function = new Function(FUNC_SENDUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Arrays.>asList()); return function; } @@ -833,10 +859,10 @@ public Function getMethodSendUnorderedMessageRawFunction(String receiverDomain, public String getSignedTransactionForSendUnorderedMessage(String receiverDomain, byte[] receiver, byte[] message) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -844,10 +870,10 @@ public String getSignedTransactionForSendUnorderedMessage(String receiverDomain, public String sendUnorderedMessage(String receiverDomain, byte[] receiver, byte[] message, TransactionCallback callback) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -855,14 +881,14 @@ public String sendUnorderedMessage(String receiverDomain, byte[] receiver, byte[ public Tuple3 getSendUnorderedMessageInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SENDUNORDEREDMESSAGE, - Arrays.asList(), + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGE, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple3( - (String) results.get(0).getValue(), - (byte[]) results.get(1).getValue(), + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), (byte[]) results.get(2).getValue() ); } @@ -870,22 +896,22 @@ public Tuple3 getSendUnorderedMessageInput( public TransactionReceipt sendUnorderedV2(byte[] receiver, String domain, Boolean atomic, byte[] _msg) { final Function function = new Function( - FUNC_SENDUNORDEREDV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), + FUNC_SENDUNORDEREDV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodSendUnorderedV2RawFunction(byte[] receiver, String domain, Boolean atomic, byte[] _msg) throws ContractException { - final Function function = new Function(FUNC_SENDUNORDEREDV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), + final Function function = new Function(FUNC_SENDUNORDEREDV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), Arrays.>asList()); return function; } @@ -893,11 +919,11 @@ public Function getMethodSendUnorderedV2RawFunction(byte[] receiver, String doma public String getSignedTransactionForSendUnorderedV2(byte[] receiver, String domain, Boolean atomic, byte[] _msg) { final Function function = new Function( - FUNC_SENDUNORDEREDV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), + FUNC_SENDUNORDEREDV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -905,11 +931,11 @@ public String getSignedTransactionForSendUnorderedV2(byte[] receiver, String dom public String sendUnorderedV2(byte[] receiver, String domain, Boolean atomic, byte[] _msg, TransactionCallback callback) { final Function function = new Function( - FUNC_SENDUNORDEREDV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), + FUNC_SENDUNORDEREDV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -917,37 +943,111 @@ public String sendUnorderedV2(byte[] receiver, String domain, Boolean atomic, by public Tuple4 getSendUnorderedV2Input( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SENDUNORDEREDV2, - Arrays.asList(), + final Function function = new Function(FUNC_SENDUNORDEREDV2, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple4( - (byte[]) results.get(0).getValue(), - (String) results.get(1).getValue(), - (Boolean) results.get(2).getValue(), + (byte[]) results.get(0).getValue(), + (String) results.get(1).getValue(), + (Boolean) results.get(2).getValue(), (byte[]) results.get(3).getValue() ); } + public TransactionReceipt sendUnorderedV3(byte[] receiver, String domain, Boolean atomic, + byte[] _msg, BigInteger timeoutMeasure, BigInteger timeout) { + final Function function = new Function( + FUNC_SENDUNORDEREDV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendUnorderedV3RawFunction(byte[] receiver, String domain, + Boolean atomic, byte[] _msg, BigInteger timeoutMeasure, BigInteger timeout) throws + ContractException { + final Function function = new Function(FUNC_SENDUNORDEREDV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForSendUnorderedV3(byte[] receiver, String domain, + Boolean atomic, byte[] _msg, BigInteger timeoutMeasure, BigInteger timeout) { + final Function function = new Function( + FUNC_SENDUNORDEREDV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendUnorderedV3(byte[] receiver, String domain, Boolean atomic, byte[] _msg, + BigInteger timeoutMeasure, BigInteger timeout, TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDUNORDEREDV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple6 getSendUnorderedV3Input( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDUNORDEREDV3, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple6( + + (byte[]) results.get(0).getValue(), + (String) results.get(1).getValue(), + (Boolean) results.get(2).getValue(), + (byte[]) results.get(3).getValue(), + (BigInteger) results.get(4).getValue(), + (BigInteger) results.get(5).getValue() + ); + } + public TransactionReceipt sendV2(byte[] receiver, String domain, Boolean atomic, byte[] _msg) { final Function function = new Function( - FUNC_SENDV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), + FUNC_SENDV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodSendV2RawFunction(byte[] receiver, String domain, Boolean atomic, byte[] _msg) throws ContractException { - final Function function = new Function(FUNC_SENDV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), + final Function function = new Function(FUNC_SENDV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), Arrays.>asList()); return function; } @@ -955,11 +1055,11 @@ public Function getMethodSendV2RawFunction(byte[] receiver, String domain, Boole public String getSignedTransactionForSendV2(byte[] receiver, String domain, Boolean atomic, byte[] _msg) { final Function function = new Function( - FUNC_SENDV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), + FUNC_SENDV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -967,11 +1067,11 @@ public String getSignedTransactionForSendV2(byte[] receiver, String domain, Bool public String sendV2(byte[] receiver, String domain, Boolean atomic, byte[] _msg, TransactionCallback callback) { final Function function = new Function( - FUNC_SENDV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), + FUNC_SENDV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -979,55 +1079,172 @@ public String sendV2(byte[] receiver, String domain, Boolean atomic, byte[] _msg public Tuple4 getSendV2Input( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SENDV2, - Arrays.asList(), + final Function function = new Function(FUNC_SENDV2, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple4( - (byte[]) results.get(0).getValue(), - (String) results.get(1).getValue(), - (Boolean) results.get(2).getValue(), + (byte[]) results.get(0).getValue(), + (String) results.get(1).getValue(), + (Boolean) results.get(2).getValue(), (byte[]) results.get(3).getValue() ); } + public TransactionReceipt sendV3(byte[] receiver, String domain, Boolean atomic, byte[] _msg, + BigInteger timeoutMeasure, BigInteger timeout) { + final Function function = new Function( + FUNC_SENDV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendV3RawFunction(byte[] receiver, String domain, Boolean atomic, + byte[] _msg, BigInteger timeoutMeasure, BigInteger timeout) throws ContractException { + final Function function = new Function(FUNC_SENDV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForSendV3(byte[] receiver, String domain, Boolean atomic, + byte[] _msg, BigInteger timeoutMeasure, BigInteger timeout) { + final Function function = new Function( + FUNC_SENDV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendV3(byte[] receiver, String domain, Boolean atomic, byte[] _msg, + BigInteger timeoutMeasure, BigInteger timeout, TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(_msg), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple6 getSendV3Input( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDV3, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple6( + + (byte[]) results.get(0).getValue(), + (String) results.get(1).getValue(), + (Boolean) results.get(2).getValue(), + (byte[]) results.get(3).getValue(), + (BigInteger) results.get(4).getValue(), + (BigInteger) results.get(5).getValue() + ); + } + + public TransactionReceipt setMonitorContract(String newMonitorAddress) { + final Function function = new Function( + FUNC_SETMONITORCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorAddress)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSetMonitorContractRawFunction(String newMonitorAddress) throws + ContractException { + final Function function = new Function(FUNC_SETMONITORCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorAddress)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForSetMonitorContract(String newMonitorAddress) { + final Function function = new Function( + FUNC_SETMONITORCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorAddress)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String setMonitorContract(String newMonitorAddress, TransactionCallback callback) { + final Function function = new Function( + FUNC_SETMONITORCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorAddress)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple1 getSetMonitorContractInput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SETMONITORCONTRACT, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (String) results.get(0).getValue() + ); + } + public TransactionReceipt setProtocol(String protocolAddress) { final Function function = new Function( - FUNC_SETPROTOCOL, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), + FUNC_SETPROTOCOL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodSetProtocolRawFunction(String protocolAddress) throws ContractException { - final Function function = new Function(FUNC_SETPROTOCOL, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), + final Function function = new Function(FUNC_SETPROTOCOL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), Arrays.>asList()); return function; } public String getSignedTransactionForSetProtocol(String protocolAddress) { final Function function = new Function( - FUNC_SETPROTOCOL, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), + FUNC_SETPROTOCOL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String setProtocol(String protocolAddress, TransactionCallback callback) { final Function function = new Function( - FUNC_SETPROTOCOL, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), + FUNC_SETPROTOCOL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getSetProtocolInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SETPROTOCOL, - Arrays.asList(), + final Function function = new Function(FUNC_SETPROTOCOL, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -1038,40 +1255,40 @@ public Tuple1 getSetProtocolInput(TransactionReceipt transactionReceipt) public TransactionReceipt transferOwnership(String newOwner) { final Function function = new Function( - FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodTransferOwnershipRawFunction(String newOwner) throws ContractException { - final Function function = new Function(FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + final Function function = new Function(FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Arrays.>asList()); return function; } public String getSignedTransactionForTransferOwnership(String newOwner) { final Function function = new Function( - FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String transferOwnership(String newOwner, TransactionCallback callback) { final Function function = new Function( - FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getTransferOwnershipInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_TRANSFEROWNERSHIP, - Arrays.asList(), + final Function function = new Function(FUNC_TRANSFEROWNERSHIP, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( diff --git a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/CommitteePtcVerifier.java b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/CommitteePtcVerifier.java index f3cef20c..9768585c 100644 --- a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/CommitteePtcVerifier.java +++ b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/CommitteePtcVerifier.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.List; import org.fisco.bcos.sdk.v3.client.Client; +import org.fisco.bcos.sdk.v3.codec.datatypes.Address; import org.fisco.bcos.sdk.v3.codec.datatypes.Bool; import org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes; import org.fisco.bcos.sdk.v3.codec.datatypes.DynamicStruct; @@ -17,25 +18,27 @@ import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8; import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple1; import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple2; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple3; import org.fisco.bcos.sdk.v3.contract.Contract; import org.fisco.bcos.sdk.v3.crypto.CryptoSuite; import org.fisco.bcos.sdk.v3.crypto.keypair.CryptoKeyPair; import org.fisco.bcos.sdk.v3.model.CryptoType; import org.fisco.bcos.sdk.v3.model.TransactionReceipt; import org.fisco.bcos.sdk.v3.model.callback.TransactionCallback; +import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.ProxySignTransactionManager; import org.fisco.bcos.sdk.v3.transaction.model.exception.ContractException; @SuppressWarnings("unchecked") public class CommitteePtcVerifier extends Contract { - public static final String[] BINARY_ARRAY = {"608060405234801561001057600080fd5b50613899806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806348a3c57014610046578063b93ba39c1461006e578063bff3093b1461007d575b600080fd5b6100596100543660046132d4565b610090565b60405190151581526020015b60405180910390f35b60016040516100659190613402565b61005961008b36600461342a565b6100a5565b600061009c83836100c1565b90505b92915050565b600061009c6100b38461349d565b6100bc846134fd565b610334565b6000806100d18460e001516103d2565b905060006100e28460600151610559565b80518351815160209283012081519290910191909120919250146101735760405162461bcd60e51b815260206004820152603c60248201527f636f6d6d697474656520696420696e2070726f6f66206e6f7420657175616c2060448201527f7769746820746865206f6e6520696e20656e646f72736520726f6f740000000060648201526084015b60405180910390fd5b600061017e856106f6565b90506000805b846040015151811015610318576000856040015182815181106101a9576101a9613509565b602002602001015190506000805b86602001515181101561029957610200876020015182815181106101dd576101dd613509565b602090810291909101810151518551815191830191909120815191909201201490565b156102875761025f8760200151828151811061021e5761021e613509565b6020026020010151602001516102378560400151610810565b888a60200151858151811061024e5761024e613509565b6020026020010151604001516108be565b915081801561027057508260200151155b15610287578461027f81613535565b955050610299565b8061029181613559565b9150506101b7565b5060808a0151875183516040517f086b0f54ca3b94dae1a005bcc90b18a8265302363c906965449e99133d8692ed936102d7939092909186906135d0565b60405180910390a1801580156102ee575081602001515b1561030357600097505050505050505061009f565b5050808061031090613559565b915050610184565b506020840151516103299082610a89565b979650505050505050565b60006103438260400151610d17565b835161034e90610d17565b1461039b5760405162461bcd60e51b815260206004820152601f60248201527f76657269667920616e63686f722076657273696f6e206e6f7420657175616c00604482015260640161016a565b60006103aa8460200151610dd3565b905060006103bc846101000151610559565b90506103c9828286610f4a565b95945050505050565b6103da612da7565b6103e2612da7565b60006103ed84611259565b905060005b8160200151518110156105505760008260200151828151811061041757610417613509565b60200260200101519050600061ffff16816000015161ffff161415610442576040810151845261053d565b805161ffff166001141561046d5761046361045e826040015190565b611434565b602085015261053d565b805161ffff166002141561053d576000610486826114e5565b9050600061049382611513565b6001600160401b038111156104aa576104aa612e27565b6040519080825280602002602001820160405280156104e357816020015b6104d0612dea565b8152602001906001900390816104c85790505b50905060005b60208301515183511015610535576105086105038461154a565b6115eb565b828261051381613559565b93508151811061052557610525613509565b60200260200101819052506104e9565b506040860152505b508061054881613559565b9150506103f2565b50909392505050565b60408051808201909152606080825260208201526040805180820190915260608082526020820152600061058c84611259565b905060005b816020015151811015610550576000826020015182815181106105b6576105b6613509565b60200260200101519050600061ffff16816000015161ffff1614156105e157604081015184526106cd565b805161ffff16600114156106cd5760006105fa826114e5565b9050600061060782611513565b6001600160401b0381111561061e5761061e612e27565b60405190808252806020026020018201604052801561067357816020015b61066060405180606001604052806060815260200160608152602001606081525090565b81526020019060019003908161063c5790505b50905060005b602083015151835110156106c5576106986106938461154a565b6116cc565b82826106a381613559565b9350815181106106b5576106b5613509565b6020026020010181905250610679565b506020860152505b50806106d881613559565b915050610591565b8051602091820120825192909101919091201490565b6040805160038082526080820190925260609160009190816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161071257905050905061075361010084604001516117bd565b8160008151811061076657610766613509565b60200260200101819052506107886005610783856000015161183d565b6118ab565b8160018151811061079b5761079b613509565b60200260200101819052506107b961010161078385602001516118ee565b816002815181106107cc576107cc613509565b60200260200101819052506107f86040518060400160405280600061ffff168152602001606081525090565b6020810182905261080881611b78565b949350505050565b6060604082602001515110156108685760405162461bcd60e51b815260206004820152601c60248201527f7075626c6963206b6579206c656e677468206e6f7420656e6f75746800000000604482015260640161016a565b6020820151805160009061087e90604090613667565b6040805181815260608101825291925060009190602082018180368337019050509290910160208181015190840152604090810151908301525092915050565b6000610901604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b815250866106e090919063ffffffff16565b6109695760405162461bcd60e51b815260206004820152603360248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152723235364b31207369676e6174757265206e6f7760681b606482015260840161016a565b6041825110156109bb5760405162461bcd60e51b815260206004820152601a60248201527f77726f6e6720736563703235366b3120736967206c656e677468000000000000604482015260640161016a565b601b826040815181106109d0576109d0613509565b01602001516109e2919060f81c61367e565b60f81b826040815181106109f8576109f8613509565b60200101906001600160f81b031916908160001a90535083516020850120600090610a2a908551602087012085611c82565b9050601b83604081518110610a4157610a41613509565b0160200151610a53919060f81c6136a3565b60f81b83604081518110610a6957610a69613509565b60200101906001600160f81b031916908160001a90535095945050505050565b6040805180820190915260018152600f60fa1b602091820152825180519101206000907f8cb938a03d27235fdf22924e770f8c8a7fc7441e706e979b359839d1efe725201415610aed57826020015163ffffffff168263ffffffff1610905061009f565b6040805180820190915260018152601f60f91b602091820152835180519101207feff31f7855752a3582db9a0d965d5063f23d94003e66f8c5a8f8e8fe2ab247531415610b4e57826020015163ffffffff168263ffffffff1611905061009f565b6040805180820190915260028152613d3d60f01b602091820152835180519101207f8130d264cf52b536814fc69bd2deac50f17224d36413db41792fe7f8742c2b5a1415610bb057826020015163ffffffff168263ffffffff1614905061009f565b6040805180820190915260028152613e3d60f01b602091820152835180519101207f07cb807c6a0dff35ec91f1d7c9113298207e728f628c0def2060de1af723685a1415610c1357826020015163ffffffff168263ffffffff161015905061009f565b6040805180820190915260028152613c3d60f01b602091820152835180519101207fe5a87a2aa5cf9e4c4a6b6ca07e0c091c8a0118e9066affa9adc7f6ae150a71a21415610c7657826020015163ffffffff168263ffffffff161115905061009f565b604080518082019091526002815261213d60f01b602091820152835180519101207f9ac244772c728e3ea33abaab05d51ed9065114029a53892fd1ed2fbb33ede3c81415610cd957826020015163ffffffff168263ffffffff161415905061009f565b60405162461bcd60e51b81526020600482015260136024820152721b9bc81bdc195c985d1bdc881b585d18da1959606a1b604482015260640161016a565b80516000906020811115610d795760405162461bcd60e51b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b606482015260840161016a565b6000816001600160401b03811115610d9357610d93612e27565b6040519080825280601f01601f191660200182016040528015610dbd576020820181803683370190505b5084518152938201519190930151900392915050565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000610e0684611259565b905060005b81602001515181101561055057600082602001518281518110610e3057610e30613509565b60200260200101519050600061ffff16816000015161ffff161415610e5b5760408101518452610f37565b805161ffff1660011415610f37576000610e74826114e5565b90506000610e8182611513565b6001600160401b03811115610e9857610e98612e27565b604051908082528060200260200182016040528015610edd57816020015b6040805180820190915260608082526020820152815260200190600190039081610eb65790505b50905060005b60208301515183511015610f2f57610f02610efd8461154a565b611ce3565b8282610f0d81613559565b935081518110610f1f57610f1f613509565b6020026020010181905250610ee3565b506020860152505b5080610f4281613559565b915050610e0b565b8151835181516020928301208151929091019190912060009114610fd65760405162461bcd60e51b815260206004820152603d60248201527f636f6d6d697474656520696420696e2070726f6f66206e6f7420657175616c2060448201527f7769746820746865206f6e6520696e2076657269667920616e63686f72000000606482015260840161016a565b6000610fe183611e55","565b90506000805b8560200151518110156112315760008660200151828151811061100c5761100c613509565b6020026020010151905061105b604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b81525082602001516106e090919063ffffffff16565b6110b95760405162461bcd60e51b815260206004820152602960248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152683235364b312073696760b81b606482015260840161016a565b60005b88602001515181101561121c5761110182600001518a6020015183815181106110e7576110e7613509565b6020026020010151600001516106e090919063ffffffff16565b1561120a576000805b8a60200151838151811061112057611120613509565b602002602001015160200151518110156111a95761118a846020015161117f8d60200151868151811061115557611155613509565b602002602001015160200151848151811061117257611172613509565b6020026020010151610810565b8987604001516108be565b91508115611197576111a9565b806111a181613559565b91505061110a565b5060808801518a5184516040517fd3b78160828b77fd969b374a2530bcefe0239a4ca0d07bea18709283476964e9936111e7939092909186906135d0565b60405180910390a1801561120857846111ff81613559565b9550505061121c565b505b8061121481613559565b9150506110bc565b5050808061122990613559565b915050610fe7565b506020860151516112439060026136c6565b61124e8260036136c6565b119695505050505050565b6040805180820190915260008152606060208201526006825110156112c05760405162461bcd60e51b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e677468000000000000000000604482015260640161016a565b60408051808201909152600080825260606020830152906112e96112e48584612006565b61202e565b61ffff1681526112fa6006836136e5565b91506000825b8551811015611354576113256113208761131b8460026136e5565b6120c6565b6120f0565b6113309060066136fd565b6113409063ffffffff16826136e5565b90508161134c81613559565b925050611300565b6000826001600160401b0381111561136e5761136e612e27565b6040519080825280602002602001820160405280156113bb57816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161138c5790505b509050600092505b865185101561142557604080516060808201835260008083526020830152918101919091526113f288876121ea565b9650905080828561140281613559565b96508151811061141457611414613509565b6020026020010181905250506113c3565b60208401525090949350505050565b60408051606080820183526020808301828152600084860181905290845284518084018652918201928352938101849052908152909161147384611259565b905060005b8160200151518110156105505760008260200151828151811061149d5761149d613509565b60200260200101519050600061ffff16816000015161ffff1614156114d2576114cf6114ca826040015190565b612345565b84525b50806114dd81613559565b915050611478565b6040805180820190915260008152606060208201525060408051808201825260008152910151602082015290565b8051600090815b60208401515184511015611544576115318461154a565b508061153c81613559565b91505061151a565b92525090565b60608160200151518260000151106115b35760405162461bcd60e51b815260206004820152602660248201527f4279746573417272617953747265616d3a206f6666657374206f7574206f6620604482015265313ab33332b960d11b606482015260840161016a565b60006115c783600001518460200151612405565b80518451919250906115da9060046136e5565b6115e491906136e5565b9092525090565b6115f3612dea565b6115fb612dea565b600061160684611259565b905060005b8160200151518110156105505760008260200151828151811061163057611630613509565b60200260200101519050600061ffff16816000015161ffff16141561165b57604081015184526116b9565b805161ffff166001141561169257600061167482612499565b60ff1611611683576000611686565b60015b151560208501526116b9565b805161ffff16600214156116b9576116b36116ae826040015190565b6124aa565b60408501525b50806116c481613559565b91505061160b565b6116f060405180606001604052806060815260200160608152602001606081525090565b61171460405180606001604052806060815260200160608152602001606081525090565b600061171f84611259565b905060005b8160200151518110156105505760008260200151828151811061174957611749613509565b60200260200101519050600061ffff16816000015161ffff16141561177457604081015184526117aa565b805161ffff166001141561179157604081015160208501526117aa565b805161ffff16600214156117aa57604081015160408501525b50806117b581613559565b915050611724565b604080516060808201835260008083526020830152918101919091526040805160048082528183019092526000916020820181803683370190505090506118196004611808856120f0565b908301600319810180519290915252565b6040805160608101825261ffff959095168552600460208601528401525090919050565b60408051600180825281830190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611858579050509050611898600084600001516118ab565b816000815181106107cc576107cc613509565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b6020810151606090819015801561190757506040830151155b156119875760408051600180825281830190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816119215790505090506119646000610783856000015161255e565b8160008151811061197757611977613509565b6020026020010181905250611b5e565b60208301511580159061199d5750604083015115155b15611b16576040805160038082526080820190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816119b85790505090506119fb6000610783856000015161255e565b81600081518110611a0e57611a0e613509565b6020026020010181905250600060206001600160401b03811115611a3457611a34612e27565b6040519080825280601f01601f191660200182016040528015611a5e576020820181803683370190505b50602085810151908201529050611a766001826118ab565b82600181518110611a8957611a89613509565b6020026020010181905250600060206001600160401b03811115611aaf57611aaf612e27565b6040519080825280601f01601f191660200182016040528015611ad9576020820181803683370190505b50604086015160208201529050611af16002826118ab565b83600281518110611b0457611b04613509565b60200260200101819052505050611b5e565b60405162461bcd60e51b815260206004820152601760248201527f696e76616c69642063726f7373636861696e206c616e65000000000000000000604482015260640161016a565b6040805180820190915260008152606060208201526107f8565b60606000611b858361263b565b90506000611b948260066136fd565b63ffffffff166001600160401b03811115611bb157611bb1612e27565b6040519080825280601f01601f191660200182016040528015611bdb576020820181803683370190505b509050611c016002611bf0866000015161202e565b908301600119810180519290915252565b611c0f6006611808846120f0565b600660005b602086015151811015611c78576000611c4987602001518381518110611c3c57611c3c613509565b60200260200101516126af565b9050611c5683828661273e565b8051611c6290846136e5565b9250508080611c7090613559565b915050611c14565b5090949350505050565b6000806000611c918585612823565b90925090506000816004811115611caa57611caa6133ec565b148015611cc85750856001600160a01b0316826001600160a01b0316145b80611cd95750611cd9868686612866565b9695505050505050565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000611d1684611259565b905060005b81602001515181101561055057600082602001518281518110611d4057611d40613509565b60200260200101519050600061ffff16816000015161ffff161415611d6b5760408101518452611e42565b805161ffff1660011415611e42576000611d84826114e5565b90506000611d9182611513565b6001600160401b03811115611da857611da8612e27565b604051908082528060200260200182016040528015611ded57816020015b6040805180820190915260608082526020820152815260200190600190039081611dc65790505b50905060005b60208301515183511015611e3a57611e0d6116ae8461154a565b8282611e1881613559565b935081518110611e2a57611e2a613509565b6020026020010181905250611df3565b506020860152505b5080611e4d81613559565b915050611d1b565b604080516008808252610120820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611e72579050509050611eb2600084600001516117bd565b81600081518110611ec557611ec5613509565b6020026020010181905250611edf600184602001516117bd565b81600181518110611ef257611ef2613509565b6020026020010181905250611f0c600284604001516118ab565b81600281518110611f1f57611f1f613509565b6020026020010181905250611f3c60036107838560600151612952565b81600381518110611f4f57611f4f613509565b6020026020010181905250611f6c600461078385608001516118ee565b81600481518110611f7f57611f7f613509565b6020026020010181905250611f9960058460a001516117bd565b81600581518110611fac57611fac613509565b6020026020010181905250611fc660068460c001516118ab565b81600681518110611fd957611fd9613509565b602002602001","0181905250611ff360078460e001516118ab565b816007815181106107cc576107cc613509565b81516000906120168360026136e5565b111561202157600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b8160008151811061207157612071613509565b60200101906001600160f81b031916908160001a9053508160001a60f81b816001815181106120a2576120a2613509565b60200101906001600160f81b031916908160001a90535060006103c9826000612006565b81516000906120d68360046136e5565b11156120e157600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b8160008151811061213357612133613509565b60200101906001600160f81b031916908160001a9053508160021a60f81b8160018151811061216457612164613509565b60200101906001600160f81b031916908160001a9053508160011a60f81b8160028151811061219557612195613509565b60200101906001600160f81b031916908160001a9053508160001a60f81b816003815181106121c6576121c6613509565b60200101906001600160f81b031916908160001a90535060006103c98260006120c6565b604080516060808201835260008083526020830152918101919091526000828451116122645760405162461bcd60e51b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b606482015260840161016a565b60068310156122a65760405162461bcd60e51b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b604482015260640161016a565b604080516060808201835260008083526020830152918101919091526122cf6112e48686612006565b61ffff1681526122e06002856136e5565b93506122ef61132086866120c6565b63ffffffff1660208201526123056004856136e5565b935061231c8585836020015163ffffffff16612a91565b604082015260208101516123369063ffffffff16856136e5565b935091508290505b9250929050565b604080518082019091526060815260006020820152604080518082019091526060815260006020820152600061237a84611259565b905060005b816020015151811015610550576000826020015182815181106123a4576123a4613509565b60200260200101519050600061ffff16816000015161ffff1614156123cf57604081015184526123f2565b805161ffff16600114156123f2576123e681612b12565b63ffffffff1660208501525b50806123fd81613559565b91505061237f565b60606124126004846136e5565b925060006124236113208585015190565b63ffffffff16905060608115801561244657604051915060208201604052612490565b6040519150601f8316801560200281840101848101888315602002848a0101015b8183101561247f578051835260209283019201612467565b5050848452601f01601f1916604052505b50949350505050565b600061009f60018360400151015190565b6040805180820190915260608082526020820152604080518082019091526060808252602082015260006124dd84611259565b905060005b8160200151518110156105505760008260200151828151811061250757612507613509565b60200260200101519050600061ffff16816000015161ffff161415612532576040810151845261254b565b805161ffff166001141561254b57604081015160208501525b508061255681613559565b9150506124e2565b60608060008360200151511115612605576040805160028082526060820190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816125855790505090506125c5600084600001516118ab565b816000815181106125d8576125d8613509565b60200260200101819052506125f2600184602001516118ab565b8160018151811061197757611977613509565b50604080516001815260a081018252600091810182815260608083018490526080830152602082015283519091611898916118ab565b600080805b6020840151518110156126a85760008460200151828151811061266557612665613509565b6020026020010151905080604001515183600661268291906136fd565b63ffffffff1661269291906136e5565b92505080806126a090613559565b915050612640565b5092915050565b60606000826020015160066126c491906136fd565b63ffffffff166001600160401b038111156126e1576126e1612e27565b6040519080825280601f01601f19166020018201604052801561270b576020820181803683370190505b5090506127206002611bf0856000015161202e565b612732600661180885602001516120f0565b61009f60068460400151835b8151815161275263ffffffff8316866136e5565b11156127d15760405162461bcd60e51b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a40161016a565b801580156127de5761281c565b8483018051601f84168015602002818801018581018215602002838601015b818310156128155782518152602092830192016127fd565b5050509152505b5050505050565b60008082516041141561285a5760208301516040840151606085015160001a61284e87828585612b26565b9450945050505061233e565b5060009050600261233e565b6000806000856001600160a01b0316631626ba7e60e01b8686604051602401612890929190613725565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516128ce919061373e565b600060405180830381855afa9150503d8060008114612909576040519150601f19603f3d011682016040523d82523d6000602084013e61290e565b606091505b509150915081801561292257506020815110155b8015611cd957508051630b135d3f60e11b90612947908301602090810190840161375a565b149695505050505050565b60408051600580825260c0820190925260609160009190816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161296e5790505090506129ae600084600001516118ab565b816000815181106129c1576129c1613509565b60200260200101819052506129db600184602001516118ab565b816001815181106129ee576129ee613509565b6020026020010181905250612a216002612a1c85604001516002811115612a1757612a176133ec565b612bea565b612bfe565b81600281518110612a3457612a34613509565b6020026020010181905250612a5160036107838560600151612c6a565b81600381518110612a6457612a64613509565b6020026020010181905250612a7e600484608001516118ab565b816004815181106107cc576107cc613509565b8251606090612aa083856136e5565b1115612aab57600080fd5b6000826001600160401b03811115612ac557612ac5612e27565b6040519080825280601f01601f191660200182016040528015612aef576020820181803683370190505b50905060208082019086860101612b07828287612d18565b509095945050505050565b600061009f61132060048460400151015190565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612b5d5750600090506003612be1565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612bb1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bda57600060019250925050612be1565b9150600090505b94509492505050565b600081600281111561009f5761009f6133ec565b6040805160608082018352600080835260208301529181019190915260408051600180825281830190925260009160208201818036833701905050805160018201859052815290506040805160608101825261ffff959095168552600160208601528401525090919050565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612c84579050509050612cd86000612a1c85600001516001811115612cd357612cd36133ec565b612d93565b81600081518110612ceb57612ceb613509565b6020026020010181905250612d05600184602001516118ab565b816001815181106107cc576107cc613509565b60208110612d505781518352612d2f6020846136e5565b9250612d3c6020836136e5565b9150612d49602082613667565b9050612d18565b80612d5a57505050565b60006001612d69836020613667565b612d7590610100613857565b612d7f9190613667565b925184518416931916929092179092525050565b600081600181111561009f5761009f6133ec565b604051806060016040528060608152602001612ddd60408051606080820183526020820190815260009282019290925290815290565b8152602001606081525090565b604051806060016040528060608152602001600015158152602001612e22604051806040016040528060608152602001606081525090565b905290565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612e5f57612e5f612e27565b60405290565b60405160a081016001600160401b0381118282101715612e5f57612e5f612e27565b604051606081016001600160401b0381118282101715612e5f57612e5f612e27565b60405161012081016001600160401b0381118282101715612e5f57612e5f612e27565b604051608081016001600160401b0381118282101715612e5f57612e5f612e27565b604051602081016001600160401b0381118282101715612e5f57612e5f612e27565b803563ffffffff81168114612f2457600080fd5b919050565b600082601f830112612f3a57600080fd5b81356001600160401b0380821115612f5457612f54612e27565b604051601f8301601f19908116603f01168101908282118183101715612f7c57612f7c612e27565b81604052838152866020858801011115612f9557600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560038110612f2457600080fd5b600060408284031215612fd657600080fd5b612fde612e3d565b90","50813560028110612fef57600080fd5b815260208201356001600160401b0381111561300a57600080fd5b61301684828501612f29565b60208301525092915050565b600060a0828403121561303457600080fd5b61303c612e65565b905081356001600160401b038082111561305557600080fd5b61306185838601612f29565b8352602084013591508082111561307757600080fd5b61308385838601612f29565b602084015261309460408501612fb5565b604084015260608401359150808211156130ad57600080fd5b6130b985838601612fc4565b606084015260808401359150808211156130d257600080fd5b506130df84828501612f29565b60808301525092915050565b6000606082840312156130fd57600080fd5b613105612e87565b905081356001600160401b038082111561311e57600080fd5b908301906040828603121561313257600080fd5b61313a612e3d565b82358281111561314957600080fd5b61315587828601612f29565b82525060208301358281111561316a57600080fd5b61317687828601612f29565b602083015250808452505050602082013560208201526040820135604082015292915050565b600061012082840312156131af57600080fd5b6131b7612ea9565b90506131c282612f10565b81526131d060208301612f10565b602082015260408201356001600160401b03808211156131ef57600080fd5b6131fb85838601612f29565b6040840152606084013591508082111561321457600080fd5b61322085838601613022565b6060840152608084013591508082111561323957600080fd5b613245858386016130eb565b608084015261325660a08501612f10565b60a084015260c084013591508082111561326f57600080fd5b61327b85838601612f29565b60c084015260e084013591508082111561329457600080fd5b6132a085838601612f29565b60e0840152610100915081840135818111156132bb57600080fd5b6132c786828701612f29565b8385015250505092915050565b600080604083850312156132e757600080fd5b82356001600160401b03808211156132fe57600080fd5b61330a8683870161319c565b9350602085013591508082111561332057600080fd5b908401906080828703121561333457600080fd5b61333c612ecc565b82358281111561334b57600080fd5b83016020818903121561335d57600080fd5b613365612eee565b81358481111561337457600080fd5b6133808a828501612f29565b82525082525060208301358281111561339857600080fd5b6133a4888286016130eb565b6020830152506133b660408401612f10565b60408201526060830135828111156133cd57600080fd5b6133d988828601612f29565b6060830152508093505050509250929050565b634e487b7160e01b600052602160045260246000fd5b602081016003831061342457634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561343d57600080fd5b82356001600160401b038082111561345457600080fd5b908401906040828703121561346857600080fd5b9092506020840135908082111561347e57600080fd5b508301610120818603121561349257600080fd5b809150509250929050565b6000604082360312156134af57600080fd5b6134b7612e3d565b82356001600160401b03808211156134ce57600080fd5b6134da36838701612f29565b835260208501359150808211156134f057600080fd5b5061301636828601612f29565b600061009f368361319c565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff8083168181141561354f5761354f61351f565b6001019392505050565b600060001982141561356d5761356d61351f565b5060010190565b60005b8381101561358f578181015183820152602001613577565b8381111561359e576000848401525b50505050565b600081518084526135bc816020860160208601613574565b601f01601f19169290920160200192915050565b6080815260008551606060808401528051604060e08501526135f66101208501826135a4565b90506020820151915060df198482030161010085015261361681836135a4565b915050602087015160a0840152604087015160c0840152828103602084015261363f81876135a4565b9050828103604084015261365381866135a4565b915050821515606083015295945050505050565b6000828210156136795761367961351f565b500390565b600060ff821660ff84168060ff0382111561369b5761369b61351f565b019392505050565b600060ff821660ff8416808210156136bd576136bd61351f565b90039392505050565b60008160001904831182151516156136e0576136e061351f565b500290565b600082198211156136f8576136f861351f565b500190565b600063ffffffff80831681851680830382111561371c5761371c61351f565b01949350505050565b82815260406020820152600061080860408301846135a4565b60008251613750818460208701613574565b9190910192915050565b60006020828403121561376c57600080fd5b5051919050565b600181815b808511156137ae5781600019048211156137945761379461351f565b808516156137a157918102915b93841c9390800290613778565b509250929050565b6000826137c55750600161009f565b816137d25750600061009f565b81600181146137e857600281146137f25761380e565b600191505061009f565b60ff8411156138035761380361351f565b50506001821b61009f565b5060208310610133831016604e8410600b8410161715613831575081810a61009f565b61383b8383613773565b806000190482111561384f5761384f61351f565b029392505050565b600061009c83836137b656fea2646970667358221220c14f1c87039e8682da8350c8db67d3f11f1884f656936b1077525a6052b6f49264736f6c634300080b0033"}; + public static final String[] BINARY_ARRAY = {"608060405234801561001057600080fd5b50613add806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063471174e514610046578063b93ba39c1461006e578063bff3093b1461007d575b600080fd5b61005961005436600461345f565b610090565b60405190151581526020015b60405180910390f35b6001604051610065919061359c565b61005961008b3660046135c4565b6100a7565b600061009d8484846100cc565b90505b9392505050565b60006100c36100b584613637565b6100be84613697565b6103f0565b90505b92915050565b6000806100dc8560e0015161048e565b905060006100ed8560600151610615565b805183518151602092830120815192909101919091209192501461017e5760405162461bcd60e51b815260206004820152603c60248201527f636f6d6d697474656520696420696e2070726f6f66206e6f7420657175616c2060448201527f7769746820746865206f6e6520696e20656e646f72736520726f6f740000000060648201526084015b60405180910390fd5b6000610189866107b2565b90506000805b8460400151518110156103d3576000856040015182815181106101b4576101b46136a3565b6020026020010151905060008060005b87602001515181101561034c5761020d886020015182815181106101ea576101ea6136a3565b602090810291909101810151518651815191830191909120815191909201201490565b1561033a57835161021d906108cc565b156102b857600192508a6001600160a01b031663e181b5088e608001518b600001518b602001518581518110610255576102556136a3565b60200260200101518b6040518563ffffffff1660e01b815260040161027d9493929190613773565b600060405180830381600087803b15801561029757600080fd5b505af11580156102ab573d6000803e3d6000fd5b505050506001915061034c565b610312886020015182815181106102d1576102d16136a3565b6020026020010151602001516102ea8660400151610984565b898b602001518581518110610301576103016136a3565b602002602001015160400151610a32565b915081801561032357508360200151155b1561033a57856103328161381f565b96505061034c565b8061034481613843565b9150506101c4565b50816103985760808c0151885184516040517f086b0f54ca3b94dae1a005bcc90b18a8265302363c906965449e99133d8692ed9361038f9390929091869061385e565b60405180910390a15b801580156103a7575082602001515b156103bd576000985050505050505050506100a0565b50505080806103cb90613843565b91505061018f565b506020840151516103e49082610bfd565b98975050505050505050565b60006103ff8260400151610e8b565b835161040a90610e8b565b146104575760405162461bcd60e51b815260206004820152601f60248201527f76657269667920616e63686f722076657273696f6e206e6f7420657175616c006044820152606401610175565b60006104668460200151610f47565b90506000610478846101000151610615565b90506104858282866110be565b95945050505050565b610496612f1b565b61049e612f1b565b60006104a9846113cd565b905060005b81602001515181101561060c576000826020015182815181106104d3576104d36136a3565b60200260200101519050600061ffff16816000015161ffff1614156104fe57604081015184526105f9565b805161ffff16600114156105295761051f61051a826040015190565b6115a8565b60208501526105f9565b805161ffff16600214156105f957600061054282611659565b9050600061054f82611687565b6001600160401b0381111561056657610566612f9b565b60405190808252806020026020018201604052801561059f57816020015b61058c612f5e565b8152602001906001900390816105845790505b50905060005b602083015151835110156105f1576105c46105bf846116be565b61175f565b82826105cf81613843565b9350815181106105e1576105e16136a3565b60200260200101819052506105a5565b506040860152505b508061060481613843565b9150506104ae565b50909392505050565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000610648846113cd565b905060005b81602001515181101561060c57600082602001518281518110610672576106726136a3565b60200260200101519050600061ffff16816000015161ffff16141561069d5760408101518452610789565b805161ffff16600114156107895760006106b682611659565b905060006106c382611687565b6001600160401b038111156106da576106da612f9b565b60405190808252806020026020018201604052801561072f57816020015b61071c60405180606001604052806060815260200160608152602001606081525090565b8152602001906001900390816106f85790505b50905060005b602083015151835110156107815761075461074f846116be565b611840565b828261075f81613843565b935081518110610771576107716136a3565b6020026020010181905250610735565b506020860152505b508061079481613843565b91505061064d565b8051602091820120825192909101919091201490565b6040805160038082526080820190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816107ce57905050905061080f6101008460400151611931565b81600081518110610822576108226136a3565b6020026020010181905250610844600561083f85600001516119b1565b611a1f565b81600181518110610857576108576136a3565b602002602001018190525061087561010161083f8560200151611a62565b81600281518110610888576108886136a3565b60200260200101819052506108b46040518060400160405280600061ffff168152602001606081525090565b602081018290526108c481611cec565b949350505050565b6040805180820190915260078082526636b7b734ba37b960c91b602083015282516000929184911015610903575060009392505050565b60005b825181101561097957828181518110610921576109216136a3565b602001015160f81c60f81b6001600160f81b031916828281518110610948576109486136a3565b01602001516001600160f81b0319161461096757506000949350505050565b8061097181613843565b915050610906565b506001949350505050565b6060604082602001515110156109dc5760405162461bcd60e51b815260206004820152601c60248201527f7075626c6963206b6579206c656e677468206e6f7420656e6f757468000000006044820152606401610175565b602082015180516000906109f2906040906138ab565b6040805181815260608101825291925060009190602082018180368337019050509290910160208181015190840152604090810151908301525092915050565b6000610a75604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b8152508661079c90919063ffffffff16565b610add5760405162461bcd60e51b815260206004820152603360248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152723235364b31207369676e6174757265206e6f7760681b6064820152608401610175565b604182511015610b2f5760405162461bcd60e51b815260206004820152601a60248201527f77726f6e6720736563703235366b3120736967206c656e6774680000000000006044820152606401610175565b601b82604081518110610b4457610b446136a3565b0160200151610b56919060f81c6138c2565b60f81b82604081518110610b6c57610b6c6136a3565b60200101906001600160f81b031916908160001a90535083516020850120600090610b9e908551602087012085611df6565b9050601b83604081518110610bb557610bb56136a3565b0160200151610bc7919060f81c6138e7565b60f81b83604081518110610bdd57610bdd6136a3565b60200101906001600160f81b031916908160001a90535095945050505050565b6040805180820190915260018152600f60fa1b602091820152825180519101206000907f8cb938a03d27235fdf22924e770f8c8a7fc7441e706e979b359839d1efe725201415610c6157826020015163ffffffff168263ffffffff161090506100c6565b6040805180820190915260018152601f60f91b602091820152835180519101207feff31f7855752a3582db9a0d965d5063f23d94003e66f8c5a8f8e8fe2ab247531415610cc257826020015163ffffffff168263ffffffff161190506100c6565b6040805180820190915260028152613d3d60f01b602091820152835180519101207f8130d264cf52b536814fc69bd2deac50f17224d36413db41792fe7f8742c2b5a1415610d2457826020015163ffffffff168263ffffffff161490506100c6565b6040805180820190915260028152613e3d60f01b602091820152835180519101207f07cb807c6a0dff35ec91f1d7c9113298207e728f628c0def2060de1af723685a1415610d8757826020015163ffffffff168263ffffffff16101590506100c6565b6040805180820190915260028152613c3d60f01b602091820152835180519101207fe5a87a2aa5cf9e4c4a6b6ca07e0c091c8a0118e9066affa9adc7f6ae150a71a21415610dea57826020015163ffffffff168263ffffffff16111590506100c6565b604080518082019091526002815261213d60f01b602091820152835180519101207f9ac244772c728e3ea33abaab05d51ed9065114029a53892fd1ed2fbb33ede3c81415610e4d57826020015163ffffffff168263ffffffff16141590506100c6565b60405162461bcd60e51b81526020600482015260136024820152721b9bc81bdc195c985d1bdc881b585d18da1959606a1b6044820152606401610175565b80516000906020811115610eed5760405162461bcd60e51b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b6064820152608401610175565b6000816001600160401b03811115610f0757610f07612f9b565b6040519080825280601f01601f191660200182016040528015610f31576020820181803683370190505b5084518152938201519190930151900392915050565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000610f7a846113cd565b905060005b81602001515181101561060c57600082602001518281518110610fa457610fa46136a3565b60200260200101519050600061ffff16816000015161ffff161415610fcf57604081015184526110ab565b805161ffff16600114156110ab576000","610fe882611659565b90506000610ff582611687565b6001600160401b0381111561100c5761100c612f9b565b60405190808252806020026020018201604052801561105157816020015b604080518082019091526060808252602082015281526020019060019003908161102a5790505b50905060005b602083015151835110156110a357611076611071846116be565b611e57565b828261108181613843565b935081518110611093576110936136a3565b6020026020010181905250611057565b506020860152505b50806110b681613843565b915050610f7f565b815183518151602092830120815192909101919091206000911461114a5760405162461bcd60e51b815260206004820152603d60248201527f636f6d6d697474656520696420696e2070726f6f66206e6f7420657175616c2060448201527f7769746820746865206f6e6520696e2076657269667920616e63686f720000006064820152608401610175565b600061115583611fc9565b90506000805b8560200151518110156113a557600086602001518281518110611180576111806136a3565b602002602001015190506111cf604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b815250826020015161079c90919063ffffffff16565b61122d5760405162461bcd60e51b815260206004820152602960248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152683235364b312073696760b81b6064820152608401610175565b60005b8860200151518110156113905761127582600001518a60200151838151811061125b5761125b6136a3565b60200260200101516000015161079c90919063ffffffff16565b1561137e576000805b8a602001518381518110611294576112946136a3565b6020026020010151602001515181101561131d576112fe84602001516112f38d6020015186815181106112c9576112c96136a3565b60200260200101516020015184815181106112e6576112e66136a3565b6020026020010151610984565b898760400151610a32565b9150811561130b5761131d565b8061131581613843565b91505061127e565b5060808801518a5184516040517fd3b78160828b77fd969b374a2530bcefe0239a4ca0d07bea18709283476964e99361135b9390929091869061385e565b60405180910390a1801561137c578461137381613843565b95505050611390565b505b8061138881613843565b915050611230565b5050808061139d90613843565b91505061115b565b506020860151516113b790600261390a565b6113c282600361390a565b119695505050505050565b6040805180820190915260008152606060208201526006825110156114345760405162461bcd60e51b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e6774680000000000000000006044820152606401610175565b604080518082019091526000808252606060208301529061145d611458858461217a565b6121a2565b61ffff16815261146e600683613929565b91506000825b85518110156114c8576114996114948761148f846002613929565b61223a565b612264565b6114a4906006613941565b6114b49063ffffffff1682613929565b9050816114c081613843565b925050611474565b6000826001600160401b038111156114e2576114e2612f9b565b60405190808252806020026020018201604052801561152f57816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816115005790505b509050600092505b86518510156115995760408051606080820183526000808352602083015291810191909152611566888761235e565b9650905080828561157681613843565b965081518110611588576115886136a3565b602002602001018190525050611537565b60208401525090949350505050565b6040805160608082018352602080830182815260008486018190529084528451808401865291820192835293810184905290815290916115e7846113cd565b905060005b81602001515181101561060c57600082602001518281518110611611576116116136a3565b60200260200101519050600061ffff16816000015161ffff1614156116465761164361163e826040015190565b6124b9565b84525b508061165181613843565b9150506115ec565b6040805180820190915260008152606060208201525060408051808201825260008152910151602082015290565b8051600090815b602084015151845110156116b8576116a5846116be565b50806116b081613843565b91505061168e565b92525090565b60608160200151518260000151106117275760405162461bcd60e51b815260206004820152602660248201527f4279746573417272617953747265616d3a206f6666657374206f7574206f6620604482015265313ab33332b960d11b6064820152608401610175565b600061173b83600001518460200151612579565b805184519192509061174e906004613929565b6117589190613929565b9092525090565b611767612f5e565b61176f612f5e565b600061177a846113cd565b905060005b81602001515181101561060c576000826020015182815181106117a4576117a46136a3565b60200260200101519050600061ffff16816000015161ffff1614156117cf576040810151845261182d565b805161ffff16600114156118065760006117e88261260d565b60ff16116117f75760006117fa565b60015b1515602085015261182d565b805161ffff166002141561182d57611827611822826040015190565b61261e565b60408501525b508061183881613843565b91505061177f565b61186460405180606001604052806060815260200160608152602001606081525090565b61188860405180606001604052806060815260200160608152602001606081525090565b6000611893846113cd565b905060005b81602001515181101561060c576000826020015182815181106118bd576118bd6136a3565b60200260200101519050600061ffff16816000015161ffff1614156118e8576040810151845261191e565b805161ffff1660011415611905576040810151602085015261191e565b805161ffff166002141561191e57604081015160408501525b508061192981613843565b915050611898565b6040805160608082018352600080835260208301529181019190915260408051600480825281830190925260009160208201818036833701905050905061198d600461197c85612264565b908301600319810180519290915252565b6040805160608101825261ffff959095168552600460208601528401525090919050565b60408051600180825281830190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816119cc579050509050611a0c60008460000151611a1f565b81600081518110610888576108886136a3565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b60208101516060908190158015611a7b57506040830151155b15611afb5760408051600180825281830190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611a95579050509050611ad8600061083f85600001516126d2565b81600081518110611aeb57611aeb6136a3565b6020026020010181905250611cd2565b602083015115801590611b115750604083015115155b15611c8a576040805160038082526080820190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611b2c579050509050611b6f600061083f85600001516126d2565b81600081518110611b8257611b826136a3565b6020026020010181905250600060206001600160401b03811115611ba857611ba8612f9b565b6040519080825280601f01601f191660200182016040528015611bd2576020820181803683370190505b50602085810151908201529050611bea600182611a1f565b82600181518110611bfd57611bfd6136a3565b6020026020010181905250600060206001600160401b03811115611c2357611c23612f9b565b6040519080825280601f01601f191660200182016040528015611c4d576020820181803683370190505b50604086015160208201529050611c65600282611a1f565b83600281518110611c7857611c786136a3565b60200260200101819052505050611cd2565b60405162461bcd60e51b815260206004820152601760248201527f696e76616c69642063726f7373636861696e206c616e650000000000000000006044820152606401610175565b6040805180820190915260008152606060208201526108b4565b60606000611cf9836127af565b90506000611d08826006613941565b63ffffffff166001600160401b03811115611d2557611d25612f9b565b6040519080825280601f01601f191660200182016040528015611d4f576020820181803683370190505b509050611d756002611d6486600001516121a2565b908301600119810180519290915252565b611d83600661197c84612264565b600660005b602086015151811015611dec576000611dbd87602001518381518110611db057611db06136a3565b6020026020010151612823565b9050611dca8382866128b2565b8051611dd69084613929565b9250508080611de490613843565b915050611d88565b5090949350505050565b6000806000611e058585612997565b90925090506000816004811115611e1e57611e1e613586565b148015611e3c5750856001600160a01b0316826001600160a01b0316145b80611e4d5750611e4d8686866129da565b9695505050505050565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000611e8a846113cd565b905060005b81602001515181101561060c57600082602001518281518110611eb457611eb46136a3565b60200260200101519050600061ffff16816000015161ffff161415611edf5760408101518452611fb6565b805161ffff1660011415611fb6576000611ef882611659565b90506000611f0582611687565b6001600160401b03811115611f1c57611f1c612f9b565b604051908082528060200260200182016040528015611f6157816020015b6040805180820190915260608082526020820152815260200190600190039081611f3a5790505b50905060005b60208301515183511015611fae57611f81611822846116be565b8282611f8c81613843565b935081518110611f9e57611f9e6136a3565b6020026020010181905250611f67565b506020860152505b5080611fc181613843565b915050611e8f565b60408051600880825261012082019092526060916000","9190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611fe657905050905061202660008460000151611931565b81600081518110612039576120396136a3565b602002602001018190525061205360018460200151611931565b81600181518110612066576120666136a3565b602002602001018190525061208060028460400151611a1f565b81600281518110612093576120936136a3565b60200260200101819052506120b0600361083f8560600151612ac6565b816003815181106120c3576120c36136a3565b60200260200101819052506120e0600461083f8560800151611a62565b816004815181106120f3576120f36136a3565b602002602001018190525061210d60058460a00151611931565b81600581518110612120576121206136a3565b602002602001018190525061213a60068460c00151611a1f565b8160068151811061214d5761214d6136a3565b602002602001018190525061216760078460e00151611a1f565b81600781518110610888576108886136a3565b815160009061218a836002613929565b111561219557600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b816000815181106121e5576121e56136a3565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600181518110612216576122166136a3565b60200101906001600160f81b031916908160001a905350600061048582600061217a565b815160009061224a836004613929565b111561225557600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b816000815181106122a7576122a76136a3565b60200101906001600160f81b031916908160001a9053508160021a60f81b816001815181106122d8576122d86136a3565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600281518110612309576123096136a3565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160038151811061233a5761233a6136a3565b60200101906001600160f81b031916908160001a905350600061048582600061223a565b604080516060808201835260008083526020830152918101919091526000828451116123d85760405162461bcd60e51b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b6064820152608401610175565b600683101561241a5760405162461bcd60e51b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b6044820152606401610175565b60408051606080820183526000808352602083015291810191909152612443611458868661217a565b61ffff168152612454600285613929565b9350612463611494868661223a565b63ffffffff166020820152612479600485613929565b93506124908585836020015163ffffffff16612c05565b604082015260208101516124aa9063ffffffff1685613929565b935091508290505b9250929050565b60408051808201909152606081526000602082015260408051808201909152606081526000602082015260006124ee846113cd565b905060005b81602001515181101561060c57600082602001518281518110612518576125186136a3565b60200260200101519050600061ffff16816000015161ffff1614156125435760408101518452612566565b805161ffff16600114156125665761255a81612c86565b63ffffffff1660208501525b508061257181613843565b9150506124f3565b6060612586600484613929565b925060006125976114948585015190565b63ffffffff1690506060811580156125ba57604051915060208201604052612604565b6040519150601f8316801560200281840101848101888315602002848a0101015b818310156125f35780518352602092830192016125db565b5050848452601f01601f1916604052505b50949350505050565b60006100c660018360400151015190565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000612651846113cd565b905060005b81602001515181101561060c5760008260200151828151811061267b5761267b6136a3565b60200260200101519050600061ffff16816000015161ffff1614156126a657604081015184526126bf565b805161ffff16600114156126bf57604081015160208501525b50806126ca81613843565b915050612656565b60608060008360200151511115612779576040805160028082526060820190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816126f957905050905061273960008460000151611a1f565b8160008151811061274c5761274c6136a3565b602002602001018190525061276660018460200151611a1f565b81600181518110611aeb57611aeb6136a3565b50604080516001815260a081018252600091810182815260608083018490526080830152602082015283519091611a0c91611a1f565b600080805b60208401515181101561281c576000846020015182815181106127d9576127d96136a3565b602002602001015190508060400151518360066127f69190613941565b63ffffffff166128069190613929565b925050808061281490613843565b9150506127b4565b5092915050565b60606000826020015160066128389190613941565b63ffffffff166001600160401b0381111561285557612855612f9b565b6040519080825280601f01601f19166020018201604052801561287f576020820181803683370190505b5090506128946002611d6485600001516121a2565b6128a6600661197c8560200151612264565b6100c660068460400151835b815181516128c663ffffffff831686613929565b11156129455760405162461bcd60e51b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a401610175565b8015801561295257612990565b8483018051601f84168015602002818801018581018215602002838601015b81831015612989578251815260209283019201612971565b5050509152505b5050505050565b6000808251604114156129ce5760208301516040840151606085015160001a6129c287828585612c9a565b945094505050506124b2565b506000905060026124b2565b6000806000856001600160a01b0316631626ba7e60e01b8686604051602401612a04929190613969565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612a429190613982565b600060405180830381855afa9150503d8060008114612a7d576040519150601f19603f3d011682016040523d82523d6000602084013e612a82565b606091505b5091509150818015612a9657506020815110155b8015611e4d57508051630b135d3f60e11b90612abb908301602090810190840161399e565b149695505050505050565b60408051600580825260c0820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612ae2579050509050612b2260008460000151611a1f565b81600081518110612b3557612b356136a3565b6020026020010181905250612b4f60018460200151611a1f565b81600181518110612b6257612b626136a3565b6020026020010181905250612b956002612b9085604001516002811115612b8b57612b8b613586565b612d5e565b612d72565b81600281518110612ba857612ba86136a3565b6020026020010181905250612bc5600361083f8560600151612dde565b81600381518110612bd857612bd86136a3565b6020026020010181905250612bf260048460800151611a1f565b81600481518110610888576108886136a3565b8251606090612c148385613929565b1115612c1f57600080fd5b6000826001600160401b03811115612c3957612c39612f9b565b6040519080825280601f01601f191660200182016040528015612c63576020820181803683370190505b50905060208082019086860101612c7b828287612e8c565b509095945050505050565b60006100c661149460048460400151015190565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612cd15750600090506003612d55565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612d25573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d4e57600060019250925050612d55565b9150600090505b94509492505050565b60008160028111156100c6576100c6613586565b6040805160608082018352600080835260208301529181019190915260408051600180825281830190925260009160208201818036833701905050805160018201859052815290506040805160608101825261ffff959095168552600160208601528401525090919050565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612df8579050509050612e4c6000612b9085600001516001811115612e4757612e47613586565b612f07565b81600081518110612e5f57612e5f6136a3565b6020026020010181905250612e7960018460200151611a1f565b81600181518110610888576108886136a3565b60208110612ec45781518352612ea3602084613929565b9250612eb0602083613929565b9150612ebd6020826138ab565b9050612e8c565b80612ece57505050565b60006001612edd8360206138ab565b612ee990610100613a9b565b612ef391906138ab565b925184518416931916929092179092525050565b60008160018111156100c6576100c6613586565b604051806060016040528060608152602001612f5160408051606080820183526020820190815260009282019290925290815290565b8152602001606081525090565b604051806060016040528060608152602001600015158152602001612f96604051806040016040528060608152602001606081525090565b905290565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612fd357612fd3612f9b565b60405290565b60405160a081","016001600160401b0381118282101715612fd357612fd3612f9b565b604051606081016001600160401b0381118282101715612fd357612fd3612f9b565b60405161012081016001600160401b0381118282101715612fd357612fd3612f9b565b604051608081016001600160401b0381118282101715612fd357612fd3612f9b565b604051602081016001600160401b0381118282101715612fd357612fd3612f9b565b803563ffffffff8116811461309857600080fd5b919050565b600082601f8301126130ae57600080fd5b81356001600160401b03808211156130c8576130c8612f9b565b604051601f8301601f19908116603f011681019082821181831017156130f0576130f0612f9b565b8160405283815286602085880101111561310957600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356003811061309857600080fd5b60006040828403121561314a57600080fd5b613152612fb1565b905081356002811061316357600080fd5b815260208201356001600160401b0381111561317e57600080fd5b61318a8482850161309d565b60208301525092915050565b600060a082840312156131a857600080fd5b6131b0612fd9565b905081356001600160401b03808211156131c957600080fd5b6131d58583860161309d565b835260208401359150808211156131eb57600080fd5b6131f78583860161309d565b602084015261320860408501613129565b6040840152606084013591508082111561322157600080fd5b61322d85838601613138565b6060840152608084013591508082111561324657600080fd5b506132538482850161309d565b60808301525092915050565b60006060828403121561327157600080fd5b613279612ffb565b905081356001600160401b038082111561329257600080fd5b90830190604082860312156132a657600080fd5b6132ae612fb1565b8235828111156132bd57600080fd5b6132c98782860161309d565b8252506020830135828111156132de57600080fd5b6132ea8782860161309d565b602083015250808452505050602082013560208201526040820135604082015292915050565b6000610120828403121561332357600080fd5b61332b61301d565b905061333682613084565b815261334460208301613084565b602082015260408201356001600160401b038082111561336357600080fd5b61336f8583860161309d565b6040840152606084013591508082111561338857600080fd5b61339485838601613196565b606084015260808401359150808211156133ad57600080fd5b6133b98583860161325f565b60808401526133ca60a08501613084565b60a084015260c08401359150808211156133e357600080fd5b6133ef8583860161309d565b60c084015260e084013591508082111561340857600080fd5b6134148583860161309d565b60e08401526101009150818401358181111561342f57600080fd5b61343b8682870161309d565b8385015250505092915050565b80356001600160a01b038116811461309857600080fd5b60008060006060848603121561347457600080fd5b83356001600160401b038082111561348b57600080fd5b61349787838801613310565b945060208601359150808211156134ad57600080fd5b90850190608082880312156134c157600080fd5b6134c9613040565b8235828111156134d857600080fd5b83016020818a0312156134ea57600080fd5b6134f2613062565b81358481111561350157600080fd5b61350d8b82850161309d565b82525082525060208301358281111561352557600080fd5b6135318982860161325f565b60208301525061354360408401613084565b604082015260608301358281111561355a57600080fd5b6135668982860161309d565b606083015250935061357d91505060408501613448565b90509250925092565b634e487b7160e01b600052602160045260246000fd5b60208101600383106135be57634e487b7160e01b600052602160045260246000fd5b91905290565b600080604083850312156135d757600080fd5b82356001600160401b03808211156135ee57600080fd5b908401906040828703121561360257600080fd5b9092506020840135908082111561361857600080fd5b508301610120818603121561362c57600080fd5b809150509250929050565b60006040823603121561364957600080fd5b613651612fb1565b82356001600160401b038082111561366857600080fd5b6136743683870161309d565b8352602085013591508082111561368a57600080fd5b5061318a3682860161309d565b60006100c63683613310565b634e487b7160e01b600052603260045260246000fd5b60005b838110156136d45781810151838201526020016136bc565b838111156136e3576000848401525b50505050565b600081518084526137018160208601602086016136b9565b601f01601f19169290920160200192915050565b600081516060845280516040606086015261373360a08601826136e9565b905060208201519150605f1985820301608086015261375281836136e9565b91505060208301516020850152604083015160408501528091505092915050565b6080815260006137866080830187613715565b828103602084015261379881876136e9565b905082810360408401528451606082526137b560608301826136e9565b9050602086015182820360208401526137ce82826136e9565b915050604086015182820360408401526137e882826136e9565b9250505082810360608401526137fe81856136e9565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff8083168181141561383957613839613809565b6001019392505050565b600060001982141561385757613857613809565b5060010190565b6080815260006138716080830187613715565b828103602084015261388381876136e9565b9050828103604084015261389781866136e9565b915050821515606083015295945050505050565b6000828210156138bd576138bd613809565b500390565b600060ff821660ff84168060ff038211156138df576138df613809565b019392505050565b600060ff821660ff84168082101561390157613901613809565b90039392505050565b600081600019048311821515161561392457613924613809565b500290565b6000821982111561393c5761393c613809565b500190565b600063ffffffff80831681851680830382111561396057613960613809565b01949350505050565b82815260406020820152600061009d60408301846136e9565b600082516139948184602087016136b9565b9190910192915050565b6000602082840312156139b057600080fd5b5051919050565b600181815b808511156139f25781600019048211156139d8576139d8613809565b808516156139e557918102915b93841c93908002906139bc565b509250929050565b600082613a09575060016100c6565b81613a16575060006100c6565b8160018114613a2c5760028114613a3657613a52565b60019150506100c6565b60ff841115613a4757613a47613809565b50506001821b6100c6565b5060208310610133831016604e8410600b8410161715613a75575081810a6100c6565b613a7f83836139b7565b8060001904821115613a9357613a93613809565b029392505050565b60006100c383836139fa56fea2646970667358221220284a22b98630a3577f63e4b9fd5e11dffc6eb492b09a98601774792fdb269a2864736f6c634300080b0033"}; public static final String BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", BINARY_ARRAY); - public static final String[] SM_BINARY_ARRAY = {"608060405234801561001057600080fd5b506138ac806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80631272ad5814610046578063a2b04ada1461005e578063e0b011b814610081575b600080fd5b60016040516100559190612e50565b60405180910390f35b61007161006c366004613325565b610094565b6040519015158152602001610055565b61007161008f36600461343d565b6100a9565b60006100a083836100c5565b90505b92915050565b60006100a06100b7846134b0565b6100c084613510565b610339565b6000806100d58460e001516103d8565b905060006100e6846060015161055f565b805183518151602092830120815192909101919091209192501461017857604051636381e58960e11b815260206004820152603c60248201527f636f6d6d697474656520696420696e2070726f6f66206e6f7420657175616c2060448201527f7769746820746865206f6e6520696e20656e646f72736520726f6f740000000060648201526084015b60405180910390fd5b6000610183856106fc565b90506000805b84604001515181101561031d576000856040015182815181106101ae576101ae61351c565b602002602001015190506000805b86602001515181101561029e57610205876020015182815181106101e2576101e261351c565b602090810291909101810151518551815191830191909120815191909201201490565b1561028c57610264876020015182815181106102235761022361351c565b60200260200101516020015161023c8560400151610816565b888a6020015185815181106102535761025361351c565b6020026020010151604001516108c5565b915081801561027557508260200151155b1561028c578461028481613548565b95505061029e565b806102968161356c565b9150506101bc565b5060808a0151875183516040517f1d1b77552f06fdab2027dfbcb7976adcec559223ac8194da00497bf58be13dc7936102dc939092909186906135e3565b60405180910390a1801580156102f3575081602001515b156103085760009750505050505050506100a3565b505080806103159061356c565b915050610189565b5060208401515161032e9082610a92565b979650505050505050565b60006103488260400151610d21565b835161035390610d21565b146103a157604051636381e58960e11b815260206004820152601f60248201527f76657269667920616e63686f722076657273696f6e206e6f7420657175616c00604482015260640161016f565b60006103b08460200151610dde565b905060006103c284610100015161055f565b90506103cf828286610f55565b95945050505050565b6103e0612dba565b6103e8612dba565b60006103f384611266565b905060005b8160200151518110156105565760008260200151828151811061041d5761041d61351c565b60200260200101519050600061ffff16816000015161ffff1614156104485760408101518452610543565b805161ffff166001141561047357610469610464826040015190565b611442565b6020850152610543565b805161ffff166002141561054357600061048c826114f3565b9050600061049982611521565b6001600160401b038111156104b0576104b0612e78565b6040519080825280602002602001820160405280156104e957816020015b6104d6612dfd565b8152602001906001900390816104ce5790505b50905060005b6020830151518351101561053b5761050e61050984611558565b6115fa565b82826105198161356c565b93508151811061052b5761052b61351c565b60200260200101819052506104ef565b506040860152505b508061054e8161356c565b9150506103f8565b50909392505050565b60408051808201909152606080825260208201526040805180820190915260608082526020820152600061059284611266565b905060005b816020015151811015610556576000826020015182815181106105bc576105bc61351c565b60200260200101519050600061ffff16816000015161ffff1614156105e757604081015184526106d3565b805161ffff16600114156106d3576000610600826114f3565b9050600061060d82611521565b6001600160401b0381111561062457610624612e78565b60405190808252806020026020018201604052801561067957816020015b61066660405180606001604052806060815260200160608152602001606081525090565b8152602001906001900390816106425790505b50905060005b602083015151835110156106cb5761069e61069984611558565b6116db565b82826106a98161356c565b9350815181106106bb576106bb61351c565b602002602001018190525061067f565b506020860152505b50806106de8161356c565b915050610597565b8051602091820120825192909101919091201490565b6040805160038082526080820190925260609160009190816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161071857905050905061075961010084604001516117cc565b8160008151811061076c5761076c61351c565b602002602001018190525061078e6005610789856000015161184c565b6118ba565b816001815181106107a1576107a161351c565b60200260200101819052506107bf61010161078985602001516118fd565b816002815181106107d2576107d261351c565b60200260200101819052506107fe6040518060400160405280600061ffff168152602001606081525090565b6020810182905261080e81611b88565b949350505050565b60606040826020015151101561086f57604051636381e58960e11b815260206004820152601c60248201527f7075626c6963206b6579206c656e677468206e6f7420656e6f75746800000000604482015260640161016f565b602082015180516000906108859060409061367a565b6040805181815260608101825291925060009190602082018180368337019050509290910160208181015190840152604090810151908301525092915050565b6000610908604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b815250866106e690919063ffffffff16565b61097157604051636381e58960e11b815260206004820152603360248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152723235364b31207369676e6174757265206e6f7760681b606482015260840161016f565b6041825110156109c457604051636381e58960e11b815260206004820152601a60248201527f77726f6e6720736563703235366b3120736967206c656e677468000000000000604482015260640161016f565b601b826040815181106109d9576109d961351c565b01602001516109eb919060f81c613691565b60f81b82604081518110610a0157610a0161351c565b60200101906001600160f81b031916908160001a90535083516020850120600090610a33908551602087012085611c92565b9050601b83604081518110610a4a57610a4a61351c565b0160200151610a5c919060f81c6136b6565b60f81b83604081518110610a7257610a7261351c565b60200101906001600160f81b031916908160001a90535095945050505050565b6040805180820190915260018152600f60fa1b602091820152825180519101206000907f1a83a22570ae851a72e0a2ffc218628d558535e52a54bb98de0d4439dfbc78861415610af657826020015163ffffffff168263ffffffff161090506100a3565b6040805180820190915260018152601f60f91b602091820152835180519101207f42efe63385f22718f8c87a878c50edd45bda229a3efc257e207e8b332225ff1c1415610b5757826020015163ffffffff168263ffffffff161190506100a3565b6040805180820190915260028152613d3d60f01b602091820152835180519101207f0d5bd1dab64a124378c1bb762ceba748096841145ff73f0b98d316ffa1d29c501415610bb957826020015163ffffffff168263ffffffff161490506100a3565b6040805180820190915260028152613e3d60f01b602091820152835180519101207ffb3e4e2b290f49c37c7ff57899285e85c64aa83adb30a9cfe503065d3d692b5a1415610c1c57826020015163ffffffff168263ffffffff16101590506100a3565b6040805180820190915260028152613c3d60f01b602091820152835180519101207ffe073fcec6ccafdb38953d2bf0cec4c84de0fe62c400de941e31ab445bda168e1415610c7f57826020015163ffffffff168263ffffffff16111590506100a3565b604080518082019091526002815261213d60f01b602091820152835180519101207f20eb1849b32f1b642dfa61efbd8bd9a756c396b0f1a3c1d46966fde89b0195ba1415610ce257826020015163ffffffff168263ffffffff16141590506100a3565b604051636381e58960e11b81526020600482015260136024820152721b9bc81bdc195c985d1bdc881b585d18da1959606a1b604482015260640161016f565b80516000906020811115610d8457604051636381e58960e11b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b606482015260840161016f565b6000816001600160401b03811115610d9e57610d9e612e78565b6040519080825280601f01601f191660200182016040528015610dc8576020820181803683370190505b5084518152938201519190930151900392915050565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000610e1184611266565b905060005b81602001515181101561055657600082602001518281518110610e3b57610e3b61351c565b60200260200101519050600061ffff16816000015161ffff161415610e665760408101518452610f42565b805161ffff1660011415610f42576000610e7f826114f3565b90506000610e8c82611521565b6001600160401b03811115610ea357610ea3612e78565b604051908082528060200260200182016040528015610ee857816020015b6040805180820190915260608082526020820152815260200190600190039081610ec15790505b50905060005b60208301515183511015610f3a57610f0d610f0884611558565b611cf3565b8282610f188161356c565b935081518110610f2a57610f2a61351c565b6020026020010181905250610eee565b506020860152505b5080610f4d8161356c565b915050610e16565b8151835181516020928301208151929091019190912060009114610fe257604051636381e58960e11b815260206004820152603d60248201527f636f6d6d697474656520696420696e2070726f6f66206e6f7420657175616c2060448201527f7769746820746865206f6e6520696e2076657269667920616e63686f7200000060648201526084016101","6f565b6000610fed83611e65565b90506000805b85602001515181101561123e576000866020015182815181106110185761101861351c565b60200260200101519050611067604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b81525082602001516106e690919063ffffffff16565b6110c657604051636381e58960e11b815260206004820152602960248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152683235364b312073696760b81b606482015260840161016f565b60005b8860200151518110156112295761110e82600001518a6020015183815181106110f4576110f461351c565b6020026020010151600001516106e690919063ffffffff16565b15611217576000805b8a60200151838151811061112d5761112d61351c565b602002602001015160200151518110156111b657611197846020015161118c8d6020015186815181106111625761116261351c565b602002602001015160200151848151811061117f5761117f61351c565b6020026020010151610816565b8987604001516108c5565b915081156111a4576111b6565b806111ae8161356c565b915050611117565b5060808801518a5184516040517ff9a1e9d39ff5138cfbf6ee2703c375f1eac237bd40d3c026c4eeadffa814ab49936111f4939092909186906135e3565b60405180910390a18015611215578461120c8161356c565b95505050611229565b505b806112218161356c565b9150506110c9565b505080806112369061356c565b915050610ff3565b506020860151516112509060026136d9565b61125b8260036136d9565b119695505050505050565b6040805180820190915260008152606060208201526006825110156112ce57604051636381e58960e11b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e677468000000000000000000604482015260640161016f565b60408051808201909152600080825260606020830152906112f76112f28584612016565b61203e565b61ffff1681526113086006836136f8565b91506000825b85518110156113625761133361132e876113298460026136f8565b6120d6565b612100565b61133e906006613710565b61134e9063ffffffff16826136f8565b90508161135a8161356c565b92505061130e565b6000826001600160401b0381111561137c5761137c612e78565b6040519080825280602002602001820160405280156113c957816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161139a5790505b509050600092505b8651851015611433576040805160608082018352600080835260208301529181019190915261140088876121fa565b965090508082856114108161356c565b9650815181106114225761142261351c565b6020026020010181905250506113d1565b60208401525090949350505050565b60408051606080820183526020808301828152600084860181905290845284518084018652918201928352938101849052908152909161148184611266565b905060005b816020015151811015610556576000826020015182815181106114ab576114ab61351c565b60200260200101519050600061ffff16816000015161ffff1614156114e0576114dd6114d8826040015190565b612357565b84525b50806114eb8161356c565b915050611486565b6040805180820190915260008152606060208201525060408051808201825260008152910151602082015290565b8051600090815b602084015151845110156115525761153f84611558565b508061154a8161356c565b915050611528565b92525090565b60608160200151518260000151106115c257604051636381e58960e11b815260206004820152602660248201527f4279746573417272617953747265616d3a206f6666657374206f7574206f6620604482015265313ab33332b960d11b606482015260840161016f565b60006115d683600001518460200151612417565b80518451919250906115e99060046136f8565b6115f391906136f8565b9092525090565b611602612dfd565b61160a612dfd565b600061161584611266565b905060005b8160200151518110156105565760008260200151828151811061163f5761163f61351c565b60200260200101519050600061ffff16816000015161ffff16141561166a57604081015184526116c8565b805161ffff16600114156116a1576000611683826124ab565b60ff1611611692576000611695565b60015b151560208501526116c8565b805161ffff16600214156116c8576116c26116bd826040015190565b6124bc565b60408501525b50806116d38161356c565b91505061161a565b6116ff60405180606001604052806060815260200160608152602001606081525090565b61172360405180606001604052806060815260200160608152602001606081525090565b600061172e84611266565b905060005b816020015151811015610556576000826020015182815181106117585761175861351c565b60200260200101519050600061ffff16816000015161ffff16141561178357604081015184526117b9565b805161ffff16600114156117a057604081015160208501526117b9565b805161ffff16600214156117b957604081015160408501525b50806117c48161356c565b915050611733565b60408051606080820183526000808352602083015291810191909152604080516004808252818301909252600091602082018180368337019050509050611828600461181785612100565b908301600319810180519290915252565b6040805160608101825261ffff959095168552600460208601528401525090919050565b60408051600180825281830190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118675790505090506118a7600084600001516118ba565b816000815181106107d2576107d261351c565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b6020810151606090819015801561191657506040830151155b156119965760408051600180825281830190925290816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161193057905050905061197360006107898560000151612570565b816000815181106119865761198661351c565b6020026020010181905250611b6e565b6020830151158015906119ac5750604083015115155b15611b25576040805160038082526080820190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816119c7579050509050611a0a60006107898560000151612570565b81600081518110611a1d57611a1d61351c565b6020026020010181905250600060206001600160401b03811115611a4357611a43612e78565b6040519080825280601f01601f191660200182016040528015611a6d576020820181803683370190505b50602085810151908201529050611a856001826118ba565b82600181518110611a9857611a9861351c565b6020026020010181905250600060206001600160401b03811115611abe57611abe612e78565b6040519080825280601f01601f191660200182016040528015611ae8576020820181803683370190505b50604086015160208201529050611b006002826118ba565b83600281518110611b1357611b1361351c565b60200260200101819052505050611b6e565b604051636381e58960e11b815260206004820152601760248201527f696e76616c69642063726f7373636861696e206c616e65000000000000000000604482015260640161016f565b6040805180820190915260008152606060208201526107fe565b60606000611b958361264d565b90506000611ba4826006613710565b63ffffffff166001600160401b03811115611bc157611bc1612e78565b6040519080825280601f01601f191660200182016040528015611beb576020820181803683370190505b509050611c116002611c00866000015161203e565b908301600119810180519290915252565b611c1f600661181784612100565b600660005b602086015151811015611c88576000611c5987602001518381518110611c4c57611c4c61351c565b60200260200101516126c1565b9050611c66838286612750565b8051611c7290846136f8565b9250508080611c809061356c565b915050611c24565b5090949350505050565b6000806000611ca18585612836565b90925090506000816004811115611cba57611cba612e3a565b148015611cd85750856001600160a01b0316826001600160a01b0316145b80611ce95750611ce9868686612879565b9695505050505050565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000611d2684611266565b905060005b81602001515181101561055657600082602001518281518110611d5057611d5061351c565b60200260200101519050600061ffff16816000015161ffff161415611d7b5760408101518452611e52565b805161ffff1660011415611e52576000611d94826114f3565b90506000611da182611521565b6001600160401b03811115611db857611db8612e78565b604051908082528060200260200182016040528015611dfd57816020015b6040805180820190915260608082526020820152815260200190600190039081611dd65790505b50905060005b60208301515183511015611e4a57611e1d6116bd84611558565b8282611e288161356c565b935081518110611e3a57611e3a61351c565b6020026020010181905250611e03565b506020860152505b5080611e5d8161356c565b915050611d2b565b604080516008808252610120820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611e82579050509050611ec2600084600001516117cc565b81600081518110611ed557611ed561351c565b6020026020010181905250611eef600184602001516117cc565b81600181518110611f0257611f0261351c565b6020026020010181905250611f1c600284604001516118ba565b81600281518110611f2f57611f2f61351c565b6020026020010181905250611f4c60036107898560600151612965565b81600381518110611f5f57611f5f61351c565b6020026020010181905250611f7c600461078985608001516118fd565b81600481518110611f8f57611f8f61351c565b6020026020010181905250611fa960058460a001516117cc565b81600581518110611fbc57611fbc61351c565b6020026020010181905250611fd660068460c001516118ba565b81600681518110611f","e957611fe961351c565b602002602001018190525061200360078460e001516118ba565b816007815181106107d2576107d261351c565b81516000906120268360026136f8565b111561203157600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b816000815181106120815761208161351c565b60200101906001600160f81b031916908160001a9053508160001a60f81b816001815181106120b2576120b261351c565b60200101906001600160f81b031916908160001a90535060006103cf826000612016565b81516000906120e68360046136f8565b11156120f157600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b816000815181106121435761214361351c565b60200101906001600160f81b031916908160001a9053508160021a60f81b816001815181106121745761217461351c565b60200101906001600160f81b031916908160001a9053508160011a60f81b816002815181106121a5576121a561351c565b60200101906001600160f81b031916908160001a9053508160001a60f81b816003815181106121d6576121d661351c565b60200101906001600160f81b031916908160001a90535060006103cf8260006120d6565b6040805160608082018352600080835260208301529181019190915260008284511161227557604051636381e58960e11b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b606482015260840161016f565b60068310156122b857604051636381e58960e11b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b604482015260640161016f565b604080516060808201835260008083526020830152918101919091526122e16112f28686612016565b61ffff1681526122f26002856136f8565b935061230161132e86866120d6565b63ffffffff1660208201526123176004856136f8565b935061232e8585836020015163ffffffff16612aa4565b604082015260208101516123489063ffffffff16856136f8565b935091508290505b9250929050565b604080518082019091526060815260006020820152604080518082019091526060815260006020820152600061238c84611266565b905060005b816020015151811015610556576000826020015182815181106123b6576123b661351c565b60200260200101519050600061ffff16816000015161ffff1614156123e15760408101518452612404565b805161ffff1660011415612404576123f881612b25565b63ffffffff1660208501525b508061240f8161356c565b915050612391565b60606124246004846136f8565b9250600061243561132e8585015190565b63ffffffff169050606081158015612458576040519150602082016040526124a2565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015612491578051835260209283019201612479565b5050848452601f01601f1916604052505b50949350505050565b60006100a360018360400151015190565b6040805180820190915260608082526020820152604080518082019091526060808252602082015260006124ef84611266565b905060005b816020015151811015610556576000826020015182815181106125195761251961351c565b60200260200101519050600061ffff16816000015161ffff161415612544576040810151845261255d565b805161ffff166001141561255d57604081015160208501525b50806125688161356c565b9150506124f4565b60608060008360200151511115612617576040805160028082526060820190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816125975790505090506125d7600084600001516118ba565b816000815181106125ea576125ea61351c565b6020026020010181905250612604600184602001516118ba565b816001815181106119865761198661351c565b50604080516001815260a0810182526000918101828152606080830184905260808301526020820152835190916118a7916118ba565b600080805b6020840151518110156126ba576000846020015182815181106126775761267761351c565b602002602001015190508060400151518360066126949190613710565b63ffffffff166126a491906136f8565b92505080806126b29061356c565b915050612652565b5092915050565b60606000826020015160066126d69190613710565b63ffffffff166001600160401b038111156126f3576126f3612e78565b6040519080825280601f01601f19166020018201604052801561271d576020820181803683370190505b5090506127326002611c00856000015161203e565b61274460066118178560200151612100565b6100a360068460400151835b8151815161276463ffffffff8316866136f8565b11156127e457604051636381e58960e11b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a40161016f565b801580156127f15761282f565b8483018051601f84168015602002818801018581018215602002838601015b81831015612828578251815260209283019201612810565b5050509152505b5050505050565b60008082516041141561286d5760208301516040840151606085015160001a61286187828585612b39565b94509450505050612350565b50600090506002612350565b6000806000856001600160a01b031663973e417a60e01b86866040516024016128a3929190613738565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516128e19190613751565b600060405180830381855afa9150503d806000811461291c576040519150601f19603f3d011682016040523d82523d6000602084013e612921565b606091505b509150915081801561293557506020815110155b8015611ce957508051634b9f20bd60e11b9061295a908301602090810190840161376d565b149695505050505050565b60408051600580825260c0820190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816129815790505090506129c1600084600001516118ba565b816000815181106129d4576129d461351c565b60200260200101819052506129ee600184602001516118ba565b81600181518110612a0157612a0161351c565b6020026020010181905250612a346002612a2f85604001516002811115612a2a57612a2a612e3a565b612bfd565b612c11565b81600281518110612a4757612a4761351c565b6020026020010181905250612a6460036107898560600151612c7d565b81600381518110612a7757612a7761351c565b6020026020010181905250612a91600484608001516118ba565b816004815181106107d2576107d261351c565b8251606090612ab383856136f8565b1115612abe57600080fd5b6000826001600160401b03811115612ad857612ad8612e78565b6040519080825280601f01601f191660200182016040528015612b02576020820181803683370190505b50905060208082019086860101612b1a828287612d2b565b509095945050505050565b60006100a361132e60048460400151015190565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612b705750600090506003612bf4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612bc4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bed57600060019250925050612bf4565b9150600090505b94509492505050565b60008160028111156100a3576100a3612e3a565b6040805160608082018352600080835260208301529181019190915260408051600180825281830190925260009160208201818036833701905050805160018201859052815290506040805160608101825261ffff959095168552600160208601528401525090919050565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612c97579050509050612ceb6000612a2f85600001516001811115612ce657612ce6612e3a565b612da6565b81600081518110612cfe57612cfe61351c565b6020026020010181905250612d18600184602001516118ba565b816001815181106107d2576107d261351c565b60208110612d635781518352612d426020846136f8565b9250612d4f6020836136f8565b9150612d5c60208261367a565b9050612d2b565b80612d6d57505050565b60006001612d7c83602061367a565b612d889061010061386a565b612d92919061367a565b925184518416931916929092179092525050565b60008160018111156100a3576100a3612e3a565b604051806060016040528060608152602001612df060408051606080820183526020820190815260009282019290925290815290565b8152602001606081525090565b604051806060016040528060608152602001600015158152602001612e35604051806040016040528060608152602001606081525090565b905290565b63b95aa35560e01b600052602160045260246000fd5b6020810160038310612e725763b95aa35560e01b600052602160045260246000fd5b91905290565b63b95aa35560e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612eb057612eb0612e78565b60405290565b60405160a081016001600160401b0381118282101715612eb057612eb0612e78565b604051606081016001600160401b0381118282101715612eb057612eb0612e78565b60405161012081016001600160401b0381118282101715612eb057612eb0612e78565b604051608081016001600160401b0381118282101715612eb057612eb0612e78565b604051602081016001600160401b0381118282101715612eb057612eb0612e78565b803563ffffffff81168114612f7557600080fd5b919050565b600082601f830112612f8b57600080fd5b81356001600160401b0380821115612fa557612fa5612e78565b604051601f8301601f19908116603f01168101908282118183101715612fcd57612fcd612e78565b81604052838152866020858801011115612f","e657600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560038110612f7557600080fd5b60006040828403121561302757600080fd5b61302f612e8e565b905081356002811061304057600080fd5b815260208201356001600160401b0381111561305b57600080fd5b61306784828501612f7a565b60208301525092915050565b600060a0828403121561308557600080fd5b61308d612eb6565b905081356001600160401b03808211156130a657600080fd5b6130b285838601612f7a565b835260208401359150808211156130c857600080fd5b6130d485838601612f7a565b60208401526130e560408501613006565b604084015260608401359150808211156130fe57600080fd5b61310a85838601613015565b6060840152608084013591508082111561312357600080fd5b5061313084828501612f7a565b60808301525092915050565b60006060828403121561314e57600080fd5b613156612ed8565b905081356001600160401b038082111561316f57600080fd5b908301906040828603121561318357600080fd5b61318b612e8e565b82358281111561319a57600080fd5b6131a687828601612f7a565b8252506020830135828111156131bb57600080fd5b6131c787828601612f7a565b602083015250808452505050602082013560208201526040820135604082015292915050565b6000610120828403121561320057600080fd5b613208612efa565b905061321382612f61565b815261322160208301612f61565b602082015260408201356001600160401b038082111561324057600080fd5b61324c85838601612f7a565b6040840152606084013591508082111561326557600080fd5b61327185838601613073565b6060840152608084013591508082111561328a57600080fd5b6132968583860161313c565b60808401526132a760a08501612f61565b60a084015260c08401359150808211156132c057600080fd5b6132cc85838601612f7a565b60c084015260e08401359150808211156132e557600080fd5b6132f185838601612f7a565b60e08401526101009150818401358181111561330c57600080fd5b61331886828701612f7a565b8385015250505092915050565b6000806040838503121561333857600080fd5b82356001600160401b038082111561334f57600080fd5b61335b868387016131ed565b9350602085013591508082111561337157600080fd5b908401906080828703121561338557600080fd5b61338d612f1d565b82358281111561339c57600080fd5b8301602081890312156133ae57600080fd5b6133b6612f3f565b8135848111156133c557600080fd5b6133d18a828501612f7a565b8252508252506020830135828111156133e957600080fd5b6133f58882860161313c565b60208301525061340760408401612f61565b604082015260608301358281111561341e57600080fd5b61342a88828601612f7a565b6060830152508093505050509250929050565b6000806040838503121561345057600080fd5b82356001600160401b038082111561346757600080fd5b908401906040828703121561347b57600080fd5b9092506020840135908082111561349157600080fd5b50830161012081860312156134a557600080fd5b809150509250929050565b6000604082360312156134c257600080fd5b6134ca612e8e565b82356001600160401b03808211156134e157600080fd5b6134ed36838701612f7a565b8352602085013591508082111561350357600080fd5b5061306736828601612f7a565b60006100a336836131ed565b63b95aa35560e01b600052603260045260246000fd5b63b95aa35560e01b600052601160045260246000fd5b600063ffffffff8083168181141561356257613562613532565b6001019392505050565b600060001982141561358057613580613532565b5060010190565b60005b838110156135a257818101518382015260200161358a565b838111156135b1576000848401525b50505050565b600081518084526135cf816020860160208601613587565b601f01601f19169290920160200192915050565b6080815260008551606060808401528051604060e08501526136096101208501826135b7565b90506020820151915060df198482030161010085015261362981836135b7565b915050602087015160a0840152604087015160c0840152828103602084015261365281876135b7565b9050828103604084015261366681866135b7565b915050821515606083015295945050505050565b60008282101561368c5761368c613532565b500390565b600060ff821660ff84168060ff038211156136ae576136ae613532565b019392505050565b600060ff821660ff8416808210156136d0576136d0613532565b90039392505050565b60008160001904831182151516156136f3576136f3613532565b500290565b6000821982111561370b5761370b613532565b500190565b600063ffffffff80831681851680830382111561372f5761372f613532565b01949350505050565b82815260406020820152600061080e60408301846135b7565b60008251613763818460208701613587565b9190910192915050565b60006020828403121561377f57600080fd5b5051919050565b600181815b808511156137c15781600019048211156137a7576137a7613532565b808516156137b457918102915b93841c939080029061378b565b509250929050565b6000826137d8575060016100a3565b816137e5575060006100a3565b81600181146137fb576002811461380557613821565b60019150506100a3565b60ff84111561381657613816613532565b50506001821b6100a3565b5060208310610133831016604e8410600b8410161715613844575081810a6100a3565b61384e8383613786565b806000190482111561386257613862613532565b029392505050565b60006100a083836137c956fea264697066735822122078c319624b557615dd28cb9a6b0b35ed2180b5bfcddaf96c8066019b82e4edb964736f6c634300080b0033"}; + public static final String[] SM_BINARY_ARRAY = {"608060405234801561001057600080fd5b50613af0806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80631272ad581461004657806361454de51461005e578063e0b011b814610081575b600080fd5b60016040516100559190612fc4565b60405180910390f35b61007161006c3660046134b0565b610094565b6040519015158152602001610055565b61007161008f3660046135d7565b6100ab565b60006100a18484846100d0565b90505b9392505050565b60006100c76100b98461364a565b6100c2846136aa565b6103f5565b90505b92915050565b6000806100e08560e00151610494565b905060006100f1856060015161061b565b805183518151602092830120815192909101919091209192501461018357604051636381e58960e11b815260206004820152603c60248201527f636f6d6d697474656520696420696e2070726f6f66206e6f7420657175616c2060448201527f7769746820746865206f6e6520696e20656e646f72736520726f6f740000000060648201526084015b60405180910390fd5b600061018e866107b8565b90506000805b8460400151518110156103d8576000856040015182815181106101b9576101b96136b6565b6020026020010151905060008060005b87602001515181101561035157610212886020015182815181106101ef576101ef6136b6565b602090810291909101810151518651815191830191909120815191909201201490565b1561033f578351610222906108d2565b156102bd57600192508a6001600160a01b0316631bd72cca8e608001518b600001518b60200151858151811061025a5761025a6136b6565b60200260200101518b6040518563ffffffff1660e01b81526004016102829493929190613786565b600060405180830381600087803b15801561029c57600080fd5b505af11580156102b0573d6000803e3d6000fd5b5050505060019150610351565b610317886020015182815181106102d6576102d66136b6565b6020026020010151602001516102ef866040015161098a565b898b602001518581518110610306576103066136b6565b602002602001015160400151610a39565b915081801561032857508360200151155b1561033f578561033781613832565b965050610351565b8061034981613856565b9150506101c9565b508161039d5760808c0151885184516040517f1d1b77552f06fdab2027dfbcb7976adcec559223ac8194da00497bf58be13dc79361039493909290918690613871565b60405180910390a15b801580156103ac575082602001515b156103c2576000985050505050505050506100a4565b50505080806103d090613856565b915050610194565b506020840151516103e99082610c06565b98975050505050505050565b60006104048260400151610e95565b835161040f90610e95565b1461045d57604051636381e58960e11b815260206004820152601f60248201527f76657269667920616e63686f722076657273696f6e206e6f7420657175616c00604482015260640161017a565b600061046c8460200151610f52565b9050600061047e84610100015161061b565b905061048b8282866110c9565b95945050505050565b61049c612f2e565b6104a4612f2e565b60006104af846113da565b905060005b816020015151811015610612576000826020015182815181106104d9576104d96136b6565b60200260200101519050600061ffff16816000015161ffff16141561050457604081015184526105ff565b805161ffff166001141561052f57610525610520826040015190565b6115b6565b60208501526105ff565b805161ffff16600214156105ff57600061054882611667565b9050600061055582611695565b6001600160401b0381111561056c5761056c612fec565b6040519080825280602002602001820160405280156105a557816020015b610592612f71565b81526020019060019003908161058a5790505b50905060005b602083015151835110156105f7576105ca6105c5846116cc565b61176e565b82826105d581613856565b9350815181106105e7576105e76136b6565b60200260200101819052506105ab565b506040860152505b508061060a81613856565b9150506104b4565b50909392505050565b60408051808201909152606080825260208201526040805180820190915260608082526020820152600061064e846113da565b905060005b81602001515181101561061257600082602001518281518110610678576106786136b6565b60200260200101519050600061ffff16816000015161ffff1614156106a3576040810151845261078f565b805161ffff166001141561078f5760006106bc82611667565b905060006106c982611695565b6001600160401b038111156106e0576106e0612fec565b60405190808252806020026020018201604052801561073557816020015b61072260405180606001604052806060815260200160608152602001606081525090565b8152602001906001900390816106fe5790505b50905060005b602083015151835110156107875761075a610755846116cc565b61184f565b828261076581613856565b935081518110610777576107776136b6565b602002602001018190525061073b565b506020860152505b508061079a81613856565b915050610653565b8051602091820120825192909101919091201490565b6040805160038082526080820190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816107d45790505090506108156101008460400151611940565b81600081518110610828576108286136b6565b602002602001018190525061084a600561084585600001516119c0565b611a2e565b8160018151811061085d5761085d6136b6565b602002602001018190525061087b6101016108458560200151611a71565b8160028151811061088e5761088e6136b6565b60200260200101819052506108ba6040518060400160405280600061ffff168152602001606081525090565b602081018290526108ca81611cfc565b949350505050565b6040805180820190915260078082526636b7b734ba37b960c91b602083015282516000929184911015610909575060009392505050565b60005b825181101561097f57828181518110610927576109276136b6565b602001015160f81c60f81b6001600160f81b03191682828151811061094e5761094e6136b6565b01602001516001600160f81b0319161461096d57506000949350505050565b8061097781613856565b91505061090c565b506001949350505050565b6060604082602001515110156109e357604051636381e58960e11b815260206004820152601c60248201527f7075626c6963206b6579206c656e677468206e6f7420656e6f75746800000000604482015260640161017a565b602082015180516000906109f9906040906138be565b6040805181815260608101825291925060009190602082018180368337019050509290910160208181015190840152604090810151908301525092915050565b6000610a7c604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b815250866107a290919063ffffffff16565b610ae557604051636381e58960e11b815260206004820152603360248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152723235364b31207369676e6174757265206e6f7760681b606482015260840161017a565b604182511015610b3857604051636381e58960e11b815260206004820152601a60248201527f77726f6e6720736563703235366b3120736967206c656e677468000000000000604482015260640161017a565b601b82604081518110610b4d57610b4d6136b6565b0160200151610b5f919060f81c6138d5565b60f81b82604081518110610b7557610b756136b6565b60200101906001600160f81b031916908160001a90535083516020850120600090610ba7908551602087012085611e06565b9050601b83604081518110610bbe57610bbe6136b6565b0160200151610bd0919060f81c6138fa565b60f81b83604081518110610be657610be66136b6565b60200101906001600160f81b031916908160001a90535095945050505050565b6040805180820190915260018152600f60fa1b602091820152825180519101206000907f1a83a22570ae851a72e0a2ffc218628d558535e52a54bb98de0d4439dfbc78861415610c6a57826020015163ffffffff168263ffffffff161090506100ca565b6040805180820190915260018152601f60f91b602091820152835180519101207f42efe63385f22718f8c87a878c50edd45bda229a3efc257e207e8b332225ff1c1415610ccb57826020015163ffffffff168263ffffffff161190506100ca565b6040805180820190915260028152613d3d60f01b602091820152835180519101207f0d5bd1dab64a124378c1bb762ceba748096841145ff73f0b98d316ffa1d29c501415610d2d57826020015163ffffffff168263ffffffff161490506100ca565b6040805180820190915260028152613e3d60f01b602091820152835180519101207ffb3e4e2b290f49c37c7ff57899285e85c64aa83adb30a9cfe503065d3d692b5a1415610d9057826020015163ffffffff168263ffffffff16101590506100ca565b6040805180820190915260028152613c3d60f01b602091820152835180519101207ffe073fcec6ccafdb38953d2bf0cec4c84de0fe62c400de941e31ab445bda168e1415610df357826020015163ffffffff168263ffffffff16111590506100ca565b604080518082019091526002815261213d60f01b602091820152835180519101207f20eb1849b32f1b642dfa61efbd8bd9a756c396b0f1a3c1d46966fde89b0195ba1415610e5657826020015163ffffffff168263ffffffff16141590506100ca565b604051636381e58960e11b81526020600482015260136024820152721b9bc81bdc195c985d1bdc881b585d18da1959606a1b604482015260640161017a565b80516000906020811115610ef857604051636381e58960e11b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b606482015260840161017a565b6000816001600160401b03811115610f1257610f12612fec565b6040519080825280601f01601f191660200182016040528015610f3c576020820181803683370190505b5084518152938201519190930151900392915050565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000610f85846113da565b905060005b81602001515181101561061257600082602001518281518110610faf57610faf6136b6565b60200260200101519050600061ffff16816000015161ffff161415610fda57604081015184526110b6565b805161ffff","16600114156110b6576000610ff382611667565b9050600061100082611695565b6001600160401b0381111561101757611017612fec565b60405190808252806020026020018201604052801561105c57816020015b60408051808201909152606080825260208201528152602001906001900390816110355790505b50905060005b602083015151835110156110ae5761108161107c846116cc565b611e67565b828261108c81613856565b93508151811061109e5761109e6136b6565b6020026020010181905250611062565b506020860152505b50806110c181613856565b915050610f8a565b815183518151602092830120815192909101919091206000911461115657604051636381e58960e11b815260206004820152603d60248201527f636f6d6d697474656520696420696e2070726f6f66206e6f7420657175616c2060448201527f7769746820746865206f6e6520696e2076657269667920616e63686f72000000606482015260840161017a565b600061116183611fd9565b90506000805b8560200151518110156113b25760008660200151828151811061118c5761118c6136b6565b602002602001015190506111db604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b81525082602001516107a290919063ffffffff16565b61123a57604051636381e58960e11b815260206004820152602960248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152683235364b312073696760b81b606482015260840161017a565b60005b88602001515181101561139d5761128282600001518a602001518381518110611268576112686136b6565b6020026020010151600001516107a290919063ffffffff16565b1561138b576000805b8a6020015183815181106112a1576112a16136b6565b6020026020010151602001515181101561132a5761130b84602001516113008d6020015186815181106112d6576112d66136b6565b60200260200101516020015184815181106112f3576112f36136b6565b602002602001015161098a565b898760400151610a39565b915081156113185761132a565b8061132281613856565b91505061128b565b5060808801518a5184516040517ff9a1e9d39ff5138cfbf6ee2703c375f1eac237bd40d3c026c4eeadffa814ab499361136893909290918690613871565b60405180910390a18015611389578461138081613856565b9550505061139d565b505b8061139581613856565b91505061123d565b505080806113aa90613856565b915050611167565b506020860151516113c490600261391d565b6113cf82600361391d565b119695505050505050565b60408051808201909152600081526060602082015260068251101561144257604051636381e58960e11b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e677468000000000000000000604482015260640161017a565b604080518082019091526000808252606060208301529061146b611466858461218a565b6121b2565b61ffff16815261147c60068361393c565b91506000825b85518110156114d6576114a76114a28761149d84600261393c565b61224a565b612274565b6114b2906006613954565b6114c29063ffffffff168261393c565b9050816114ce81613856565b925050611482565b6000826001600160401b038111156114f0576114f0612fec565b60405190808252806020026020018201604052801561153d57816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161150e5790505b509050600092505b86518510156115a75760408051606080820183526000808352602083015291810191909152611574888761236e565b9650905080828561158481613856565b965081518110611596576115966136b6565b602002602001018190525050611545565b60208401525090949350505050565b6040805160608082018352602080830182815260008486018190529084528451808401865291820192835293810184905290815290916115f5846113da565b905060005b8160200151518110156106125760008260200151828151811061161f5761161f6136b6565b60200260200101519050600061ffff16816000015161ffff1614156116545761165161164c826040015190565b6124cb565b84525b508061165f81613856565b9150506115fa565b6040805180820190915260008152606060208201525060408051808201825260008152910151602082015290565b8051600090815b602084015151845110156116c6576116b3846116cc565b50806116be81613856565b91505061169c565b92525090565b606081602001515182600001511061173657604051636381e58960e11b815260206004820152602660248201527f4279746573417272617953747265616d3a206f6666657374206f7574206f6620604482015265313ab33332b960d11b606482015260840161017a565b600061174a8360000151846020015161258b565b805184519192509061175d90600461393c565b611767919061393c565b9092525090565b611776612f71565b61177e612f71565b6000611789846113da565b905060005b816020015151811015610612576000826020015182815181106117b3576117b36136b6565b60200260200101519050600061ffff16816000015161ffff1614156117de576040810151845261183c565b805161ffff16600114156118155760006117f78261261f565b60ff1611611806576000611809565b60015b1515602085015261183c565b805161ffff166002141561183c57611836611831826040015190565b612630565b60408501525b508061184781613856565b91505061178e565b61187360405180606001604052806060815260200160608152602001606081525090565b61189760405180606001604052806060815260200160608152602001606081525090565b60006118a2846113da565b905060005b816020015151811015610612576000826020015182815181106118cc576118cc6136b6565b60200260200101519050600061ffff16816000015161ffff1614156118f7576040810151845261192d565b805161ffff1660011415611914576040810151602085015261192d565b805161ffff166002141561192d57604081015160408501525b508061193881613856565b9150506118a7565b6040805160608082018352600080835260208301529181019190915260408051600480825281830190925260009160208201818036833701905050905061199c600461198b85612274565b908301600319810180519290915252565b6040805160608101825261ffff959095168552600460208601528401525090919050565b60408051600180825281830190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816119db579050509050611a1b60008460000151611a2e565b8160008151811061088e5761088e6136b6565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b60208101516060908190158015611a8a57506040830151155b15611b0a5760408051600180825281830190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611aa4579050509050611ae7600061084585600001516126e4565b81600081518110611afa57611afa6136b6565b6020026020010181905250611ce2565b602083015115801590611b205750604083015115155b15611c99576040805160038082526080820190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611b3b579050509050611b7e600061084585600001516126e4565b81600081518110611b9157611b916136b6565b6020026020010181905250600060206001600160401b03811115611bb757611bb7612fec565b6040519080825280601f01601f191660200182016040528015611be1576020820181803683370190505b50602085810151908201529050611bf9600182611a2e565b82600181518110611c0c57611c0c6136b6565b6020026020010181905250600060206001600160401b03811115611c3257611c32612fec565b6040519080825280601f01601f191660200182016040528015611c5c576020820181803683370190505b50604086015160208201529050611c74600282611a2e565b83600281518110611c8757611c876136b6565b60200260200101819052505050611ce2565b604051636381e58960e11b815260206004820152601760248201527f696e76616c69642063726f7373636861696e206c616e65000000000000000000604482015260640161017a565b6040805180820190915260008152606060208201526108ba565b60606000611d09836127c1565b90506000611d18826006613954565b63ffffffff166001600160401b03811115611d3557611d35612fec565b6040519080825280601f01601f191660200182016040528015611d5f576020820181803683370190505b509050611d856002611d7486600001516121b2565b908301600119810180519290915252565b611d93600661198b84612274565b600660005b602086015151811015611dfc576000611dcd87602001518381518110611dc057611dc06136b6565b6020026020010151612835565b9050611dda8382866128c4565b8051611de6908461393c565b9250508080611df490613856565b915050611d98565b5090949350505050565b6000806000611e1585856129aa565b90925090506000816004811115611e2e57611e2e612fae565b148015611e4c5750856001600160a01b0316826001600160a01b0316145b80611e5d5750611e5d8686866129ed565b9695505050505050565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000611e9a846113da565b905060005b81602001515181101561061257600082602001518281518110611ec457611ec46136b6565b60200260200101519050600061ffff16816000015161ffff161415611eef5760408101518452611fc6565b805161ffff1660011415611fc6576000611f0882611667565b90506000611f1582611695565b6001600160401b03811115611f2c57611f2c612fec565b604051908082528060200260200182016040528015611f7157816020015b6040805180820190915260608082526020820152815260200190600190039081611f4a5790505b50905060005b60208301515183511015611fbe57611f91611831846116cc565b8282611f9c81613856565b935081518110611fae57611fae6136b6565b6020026020010181905250611f77565b506020860152505b5080611fd181613856565b915050611e9f565b604080516008","808252610120820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611ff657905050905061203660008460000151611940565b81600081518110612049576120496136b6565b602002602001018190525061206360018460200151611940565b81600181518110612076576120766136b6565b602002602001018190525061209060028460400151611a2e565b816002815181106120a3576120a36136b6565b60200260200101819052506120c060036108458560600151612ad9565b816003815181106120d3576120d36136b6565b60200260200101819052506120f060046108458560800151611a71565b81600481518110612103576121036136b6565b602002602001018190525061211d60058460a00151611940565b81600581518110612130576121306136b6565b602002602001018190525061214a60068460c00151611a2e565b8160068151811061215d5761215d6136b6565b602002602001018190525061217760078460e00151611a2e565b8160078151811061088e5761088e6136b6565b815160009061219a83600261393c565b11156121a557600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b816000815181106121f5576121f56136b6565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600181518110612226576122266136b6565b60200101906001600160f81b031916908160001a905350600061048b82600061218a565b815160009061225a83600461393c565b111561226557600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b816000815181106122b7576122b76136b6565b60200101906001600160f81b031916908160001a9053508160021a60f81b816001815181106122e8576122e86136b6565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600281518110612319576123196136b6565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160038151811061234a5761234a6136b6565b60200101906001600160f81b031916908160001a905350600061048b82600061224a565b604080516060808201835260008083526020830152918101919091526000828451116123e957604051636381e58960e11b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b606482015260840161017a565b600683101561242c57604051636381e58960e11b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b604482015260640161017a565b60408051606080820183526000808352602083015291810191909152612455611466868661218a565b61ffff16815261246660028561393c565b93506124756114a2868661224a565b63ffffffff16602082015261248b60048561393c565b93506124a28585836020015163ffffffff16612c18565b604082015260208101516124bc9063ffffffff168561393c565b935091508290505b9250929050565b6040805180820190915260608152600060208201526040805180820190915260608152600060208201526000612500846113da565b905060005b8160200151518110156106125760008260200151828151811061252a5761252a6136b6565b60200260200101519050600061ffff16816000015161ffff1614156125555760408101518452612578565b805161ffff16600114156125785761256c81612c99565b63ffffffff1660208501525b508061258381613856565b915050612505565b606061259860048461393c565b925060006125a96114a28585015190565b63ffffffff1690506060811580156125cc57604051915060208201604052612616565b6040519150601f8316801560200281840101848101888315602002848a0101015b818310156126055780518352602092830192016125ed565b5050848452601f01601f1916604052505b50949350505050565b60006100ca60018360400151015190565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000612663846113da565b905060005b8160200151518110156106125760008260200151828151811061268d5761268d6136b6565b60200260200101519050600061ffff16816000015161ffff1614156126b857604081015184526126d1565b805161ffff16600114156126d157604081015160208501525b50806126dc81613856565b915050612668565b6060806000836020015151111561278b576040805160028082526060820190925290816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161270b57905050905061274b60008460000151611a2e565b8160008151811061275e5761275e6136b6565b602002602001018190525061277860018460200151611a2e565b81600181518110611afa57611afa6136b6565b50604080516001815260a081018252600091810182815260608083018490526080830152602082015283519091611a1b91611a2e565b600080805b60208401515181101561282e576000846020015182815181106127eb576127eb6136b6565b602002602001015190508060400151518360066128089190613954565b63ffffffff16612818919061393c565b925050808061282690613856565b9150506127c6565b5092915050565b606060008260200151600661284a9190613954565b63ffffffff166001600160401b0381111561286757612867612fec565b6040519080825280601f01601f191660200182016040528015612891576020820181803683370190505b5090506128a66002611d7485600001516121b2565b6128b8600661198b8560200151612274565b6100ca60068460400151835b815181516128d863ffffffff83168661393c565b111561295857604051636381e58960e11b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a40161017a565b80158015612965576129a3565b8483018051601f84168015602002818801018581018215602002838601015b8183101561299c578251815260209283019201612984565b5050509152505b5050505050565b6000808251604114156129e15760208301516040840151606085015160001a6129d587828585612cad565b945094505050506124c4565b506000905060026124c4565b6000806000856001600160a01b031663973e417a60e01b8686604051602401612a1792919061397c565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612a559190613995565b600060405180830381855afa9150503d8060008114612a90576040519150601f19603f3d011682016040523d82523d6000602084013e612a95565b606091505b5091509150818015612aa957506020815110155b8015611e5d57508051634b9f20bd60e11b90612ace90830160209081019084016139b1565b149695505050505050565b60408051600580825260c0820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612af5579050509050612b3560008460000151611a2e565b81600081518110612b4857612b486136b6565b6020026020010181905250612b6260018460200151611a2e565b81600181518110612b7557612b756136b6565b6020026020010181905250612ba86002612ba385604001516002811115612b9e57612b9e612fae565b612d71565b612d85565b81600281518110612bbb57612bbb6136b6565b6020026020010181905250612bd860036108458560600151612df1565b81600381518110612beb57612beb6136b6565b6020026020010181905250612c0560048460800151611a2e565b8160048151811061088e5761088e6136b6565b8251606090612c27838561393c565b1115612c3257600080fd5b6000826001600160401b03811115612c4c57612c4c612fec565b6040519080825280601f01601f191660200182016040528015612c76576020820181803683370190505b50905060208082019086860101612c8e828287612e9f565b509095945050505050565b60006100ca6114a260048460400151015190565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612ce45750600090506003612d68565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612d38573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d6157600060019250925050612d68565b9150600090505b94509492505050565b60008160028111156100ca576100ca612fae565b6040805160608082018352600080835260208301529181019190915260408051600180825281830190925260009160208201818036833701905050805160018201859052815290506040805160608101825261ffff959095168552600160208601528401525090919050565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612e0b579050509050612e5f6000612ba385600001516001811115612e5a57612e5a612fae565b612f1a565b81600081518110612e7257612e726136b6565b6020026020010181905250612e8c60018460200151611a2e565b8160018151811061088e5761088e6136b6565b60208110612ed75781518352612eb660208461393c565b9250612ec360208361393c565b9150612ed06020826138be565b9050612e9f565b80612ee157505050565b60006001612ef08360206138be565b612efc90610100613aae565b612f0691906138be565b925184518416931916929092179092525050565b60008160018111156100ca576100ca612fae565b604051806060016040528060608152602001612f6460408051606080820183526020820190815260009282019290925290815290565b8152602001606081525090565b604051806060016040528060608152602001600015158152602001612fa9604051806040016040528060608152602001606081525090565b905290565b63b95aa35560e01b600052602160045260246000fd5b6020810160038310612fe65763b95aa35560e01b60005260216004","5260246000fd5b91905290565b63b95aa35560e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561302457613024612fec565b60405290565b60405160a081016001600160401b038111828210171561302457613024612fec565b604051606081016001600160401b038111828210171561302457613024612fec565b60405161012081016001600160401b038111828210171561302457613024612fec565b604051608081016001600160401b038111828210171561302457613024612fec565b604051602081016001600160401b038111828210171561302457613024612fec565b803563ffffffff811681146130e957600080fd5b919050565b600082601f8301126130ff57600080fd5b81356001600160401b038082111561311957613119612fec565b604051601f8301601f19908116603f0116810190828211818310171561314157613141612fec565b8160405283815286602085880101111561315a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b8035600381106130e957600080fd5b60006040828403121561319b57600080fd5b6131a3613002565b90508135600281106131b457600080fd5b815260208201356001600160401b038111156131cf57600080fd5b6131db848285016130ee565b60208301525092915050565b600060a082840312156131f957600080fd5b61320161302a565b905081356001600160401b038082111561321a57600080fd5b613226858386016130ee565b8352602084013591508082111561323c57600080fd5b613248858386016130ee565b60208401526132596040850161317a565b6040840152606084013591508082111561327257600080fd5b61327e85838601613189565b6060840152608084013591508082111561329757600080fd5b506132a4848285016130ee565b60808301525092915050565b6000606082840312156132c257600080fd5b6132ca61304c565b905081356001600160401b03808211156132e357600080fd5b90830190604082860312156132f757600080fd5b6132ff613002565b82358281111561330e57600080fd5b61331a878286016130ee565b82525060208301358281111561332f57600080fd5b61333b878286016130ee565b602083015250808452505050602082013560208201526040820135604082015292915050565b6000610120828403121561337457600080fd5b61337c61306e565b9050613387826130d5565b8152613395602083016130d5565b602082015260408201356001600160401b03808211156133b457600080fd5b6133c0858386016130ee565b604084015260608401359150808211156133d957600080fd5b6133e5858386016131e7565b606084015260808401359150808211156133fe57600080fd5b61340a858386016132b0565b608084015261341b60a085016130d5565b60a084015260c084013591508082111561343457600080fd5b613440858386016130ee565b60c084015260e084013591508082111561345957600080fd5b613465858386016130ee565b60e08401526101009150818401358181111561348057600080fd5b61348c868287016130ee565b8385015250505092915050565b80356001600160a01b03811681146130e957600080fd5b6000806000606084860312156134c557600080fd5b83356001600160401b03808211156134dc57600080fd5b6134e887838801613361565b945060208601359150808211156134fe57600080fd5b908501906080828803121561351257600080fd5b61351a613091565b82358281111561352957600080fd5b83016020818a03121561353b57600080fd5b6135436130b3565b81358481111561355257600080fd5b61355e8b8285016130ee565b82525082525060208301358281111561357657600080fd5b613582898286016132b0565b602083015250613594604084016130d5565b60408201526060830135828111156135ab57600080fd5b6135b7898286016130ee565b60608301525093506135ce91505060408501613499565b90509250925092565b600080604083850312156135ea57600080fd5b82356001600160401b038082111561360157600080fd5b908401906040828703121561361557600080fd5b9092506020840135908082111561362b57600080fd5b508301610120818603121561363f57600080fd5b809150509250929050565b60006040823603121561365c57600080fd5b613664613002565b82356001600160401b038082111561367b57600080fd5b613687368387016130ee565b8352602085013591508082111561369d57600080fd5b506131db368286016130ee565b60006100ca3683613361565b63b95aa35560e01b600052603260045260246000fd5b60005b838110156136e75781810151838201526020016136cf565b838111156136f6576000848401525b50505050565b600081518084526137148160208601602086016136cc565b601f01601f19169290920160200192915050565b600081516060845280516040606086015261374660a08601826136fc565b905060208201519150605f1985820301608086015261376581836136fc565b91505060208301516020850152604083015160408501528091505092915050565b6080815260006137996080830187613728565b82810360208401526137ab81876136fc565b905082810360408401528451606082526137c860608301826136fc565b9050602086015182820360208401526137e182826136fc565b915050604086015182820360408401526137fb82826136fc565b92505050828103606084015261381181856136fc565b979650505050505050565b63b95aa35560e01b600052601160045260246000fd5b600063ffffffff8083168181141561384c5761384c61381c565b6001019392505050565b600060001982141561386a5761386a61381c565b5060010190565b6080815260006138846080830187613728565b828103602084015261389681876136fc565b905082810360408401526138aa81866136fc565b915050821515606083015295945050505050565b6000828210156138d0576138d061381c565b500390565b600060ff821660ff84168060ff038211156138f2576138f261381c565b019392505050565b600060ff821660ff8416808210156139145761391461381c565b90039392505050565b60008160001904831182151516156139375761393761381c565b500290565b6000821982111561394f5761394f61381c565b500190565b600063ffffffff8083168185168083038211156139735761397361381c565b01949350505050565b8281526040602082015260006100a160408301846136fc565b600082516139a78184602087016136cc565b9190910192915050565b6000602082840312156139c357600080fd5b5051919050565b600181815b80851115613a055781600019048211156139eb576139eb61381c565b808516156139f857918102915b93841c93908002906139cf565b509250929050565b600082613a1c575060016100ca565b81613a29575060006100ca565b8160018114613a3f5760028114613a4957613a65565b60019150506100ca565b60ff841115613a5a57613a5a61381c565b50506001821b6100ca565b5060208310610133831016604e8410600b8410161715613a88575081810a6100ca565b613a9283836139ca565b8060001904821115613aa657613aa661381c565b029392505050565b60006100c78383613a0d56fea2646970667358221220662a85e6471c050d41e03b3f4836e2395084201a863125b9000fecddf1af920764736f6c634300080b0033"}; public static final String SM_BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", SM_BINARY_ARRAY); - public static final String[] ABI_ARRAY = {"[{\"inputs\":[],\"name\":\"myPtcType\",\"outputs\":[{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"version\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"anchor\",\"type\":\"bytes\"}],\"internalType\":\"struct PTCVerifyAnchor\",\"name\":\"va\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"tpbtaVersion\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"ptcVerifyAnchorVersion\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"ptcType\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"enum ObjectIdentityType\",\"name\":\"oidType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"rawId\",\"type\":\"bytes\"}],\"internalType\":\"struct ObjectIdentity\",\"name\":\"applicant\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"subjectInfo\",\"type\":\"bytes\"}],\"internalType\":\"struct PTCCredentialSubject\",\"name\":\"signerPtcCredentialSubject\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"}],\"internalType\":\"struct CrossChainChannel\",\"name\":\"channel\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"senderId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"receiverId\",\"type\":\"bytes32\"}],\"internalType\":\"struct CrossChainLane\",\"name\":\"crossChainLane\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"btaSubjectVersion\",\"type\":\"uint32\"},{\"internalType\":\"string\",\"name\":\"ucpMessageHashAlgo\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"endorseRoot\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"endorseProof\",\"type\":\"bytes\"}],\"internalType\":\"struct TpBta\",\"name\":\"tpBta\",\"type\":\"tuple\"}],\"name\":\"verifyTpBta\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"tpbtaVersion\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"ptcVerifyAnchorVersion\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"ptcType\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"enum ObjectIdentityType\",\"name\":\"oidType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"rawId\",\"type\":\"bytes\"}],\"internalType\":\"struct ObjectIdentity\",\"name\":\"applicant\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"subjectInfo\",\"type\":\"bytes\"}],\"internalType\":\"struct PTCCredentialSubject\",\"name\":\"signerPtcCredentialSubject\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"}],\"internalType\":\"struct CrossChainChannel\",\"name\":\"channel\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"senderId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"receiverId\",\"type\":\"bytes32\"}],\"internalType\":\"struct CrossChainLane\",\"name\":\"crossChainLane\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"btaSubjectVersion\",\"type\":\"uint32\"},{\"internalType\":\"string\",\"name\":\"ucpMessageHashAlgo\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"endorseRoot\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"endorseProof\",\"type\":\"bytes\"}],\"internalType\":\"struct TpBta\",\"name\":\"tpBta\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"body\",\"type\":\"bytes\"}],\"internalType\":\"struct ThirdPartyResp\",\"name\":\"resp\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"}],\"internalType\":\"struct CrossChainChannel\",\"name\":\"channel\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"senderId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"receiverId\",\"type\":\"bytes32\"}],\"internalType\":\"struct CrossChainLane\",\"name\":\"tpbtaCrossChainLane\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"tpbtaVersion\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"rawProof\",\"type\":\"bytes\"}],\"internalType\":\"struct ThirdPartyProof\",\"name\":\"tpProof\",\"type\":\"tuple\"}],\"name\":\"verifyTpProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"}; + public static final String[] ABI_ARRAY = {"[{\"inputs\":[],\"name\":\"myPtcType\",\"outputs\":[{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"version\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"anchor\",\"type\":\"bytes\"}],\"internalType\":\"struct PTCVerifyAnchor\",\"name\":\"va\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"tpbtaVersion\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"ptcVerifyAnchorVersion\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"ptcType\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"enum ObjectIdentityType\",\"name\":\"oidType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"rawId\",\"type\":\"bytes\"}],\"internalType\":\"struct ObjectIdentity\",\"name\":\"applicant\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"subjectInfo\",\"type\":\"bytes\"}],\"internalType\":\"struct PTCCredentialSubject\",\"name\":\"signerPtcCredentialSubject\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"}],\"internalType\":\"struct CrossChainChannel\",\"name\":\"channel\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"senderId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"receiverId\",\"type\":\"bytes32\"}],\"internalType\":\"struct CrossChainLane\",\"name\":\"crossChainLane\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"btaSubjectVersion\",\"type\":\"uint32\"},{\"internalType\":\"string\",\"name\":\"ucpMessageHashAlgo\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"endorseRoot\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"endorseProof\",\"type\":\"bytes\"}],\"internalType\":\"struct TpBta\",\"name\":\"tpBta\",\"type\":\"tuple\"}],\"name\":\"verifyTpBta\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"tpbtaVersion\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"ptcVerifyAnchorVersion\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"ptcType\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"enum ObjectIdentityType\",\"name\":\"oidType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"rawId\",\"type\":\"bytes\"}],\"internalType\":\"struct ObjectIdentity\",\"name\":\"applicant\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"subjectInfo\",\"type\":\"bytes\"}],\"internalType\":\"struct PTCCredentialSubject\",\"name\":\"signerPtcCredentialSubject\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"}],\"internalType\":\"struct CrossChainChannel\",\"name\":\"channel\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"senderId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"receiverId\",\"type\":\"bytes32\"}],\"internalType\":\"struct CrossChainLane\",\"name\":\"crossChainLane\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"btaSubjectVersion\",\"type\":\"uint32\"},{\"internalType\":\"string\",\"name\":\"ucpMessageHashAlgo\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"endorseRoot\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"endorseProof\",\"type\":\"bytes\"}],\"internalType\":\"struct TpBta\",\"name\":\"tpBta\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"body\",\"type\":\"bytes\"}],\"internalType\":\"struct ThirdPartyResp\",\"name\":\"resp\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"}],\"internalType\":\"struct CrossChainChannel\",\"name\":\"channel\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"senderId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"receiverId\",\"type\":\"bytes32\"}],\"internalType\":\"struct CrossChainLane\",\"name\":\"tpbtaCrossChainLane\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"tpbtaVersion\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"rawProof\",\"type\":\"bytes\"}],\"internalType\":\"struct ThirdPartyProof\",\"name\":\"tpProof\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"monitorPtcAddr\",\"type\":\"address\"}],\"name\":\"verifyTpProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"}; public static final String ABI = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", ABI_ARRAY); @@ -48,6 +51,7 @@ public class CommitteePtcVerifier extends Contract { protected CommitteePtcVerifier(String contractAddress, Client client, CryptoKeyPair credential) { super(getBinary(client.getCryptoSuite()), contractAddress, client, credential); + this.transactionManager = new ProxySignTransactionManager(client); } public static String getBinary(CryptoSuite cryptoSuite) { @@ -59,51 +63,51 @@ public static String getABI() { } public BigInteger myPtcType() throws ContractException { - final Function function = new Function(FUNC_MYPTCTYPE, - Arrays.asList(), + final Function function = new Function(FUNC_MYPTCTYPE, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, BigInteger.class); } public Function getMethodMyPtcTypeRawFunction() throws ContractException { - final Function function = new Function(FUNC_MYPTCTYPE, - Arrays.asList(), + final Function function = new Function(FUNC_MYPTCTYPE, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } public TransactionReceipt verifyTpBta(PTCVerifyAnchor va, TpBta tpBta) { final Function function = new Function( - FUNC_VERIFYTPBTA, - Arrays.asList(va, - tpBta), + FUNC_VERIFYTPBTA, + Arrays.asList(va, + tpBta), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodVerifyTpBtaRawFunction(PTCVerifyAnchor va, TpBta tpBta) throws ContractException { - final Function function = new Function(FUNC_VERIFYTPBTA, - Arrays.asList(va, - tpBta), + final Function function = new Function(FUNC_VERIFYTPBTA, + Arrays.asList(va, + tpBta), Arrays.>asList(new TypeReference() {})); return function; } public String getSignedTransactionForVerifyTpBta(PTCVerifyAnchor va, TpBta tpBta) { final Function function = new Function( - FUNC_VERIFYTPBTA, - Arrays.asList(va, - tpBta), + FUNC_VERIFYTPBTA, + Arrays.asList(va, + tpBta), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String verifyTpBta(PTCVerifyAnchor va, TpBta tpBta, TransactionCallback callback) { final Function function = new Function( - FUNC_VERIFYTPBTA, - Arrays.asList(va, - tpBta), + FUNC_VERIFYTPBTA, + Arrays.asList(va, + tpBta), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -111,21 +115,21 @@ public String verifyTpBta(PTCVerifyAnchor va, TpBta tpBta, TransactionCallback c public Tuple2 getVerifyTpBtaInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_VERIFYTPBTA, - Arrays.asList(), + final Function function = new Function(FUNC_VERIFYTPBTA, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple2( - (PTCVerifyAnchor) results.get(0), + (PTCVerifyAnchor) results.get(0), (TpBta) results.get(1) ); } public Tuple1 getVerifyTpBtaOutput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getOutput(); - final Function function = new Function(FUNC_VERIFYTPBTA, - Arrays.asList(), + final Function function = new Function(FUNC_VERIFYTPBTA, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -134,61 +138,68 @@ public Tuple1 getVerifyTpBtaOutput(TransactionReceipt transactionReceip ); } - public TransactionReceipt verifyTpProof(TpBta tpBta, ThirdPartyProof tpProof) { + public TransactionReceipt verifyTpProof(TpBta tpBta, ThirdPartyProof tpProof, + String monitorPtcAddr) { final Function function = new Function( - FUNC_VERIFYTPPROOF, - Arrays.asList(tpBta, - tpProof), + FUNC_VERIFYTPPROOF, + Arrays.asList(tpBta, + tpProof, + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(monitorPtcAddr)), Collections.>emptyList(), 0); return executeTransaction(function); } - public Function getMethodVerifyTpProofRawFunction(TpBta tpBta, ThirdPartyProof tpProof) throws - ContractException { - final Function function = new Function(FUNC_VERIFYTPPROOF, - Arrays.asList(tpBta, - tpProof), + public Function getMethodVerifyTpProofRawFunction(TpBta tpBta, ThirdPartyProof tpProof, + String monitorPtcAddr) throws ContractException { + final Function function = new Function(FUNC_VERIFYTPPROOF, + Arrays.asList(tpBta, + tpProof, + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(monitorPtcAddr)), Arrays.>asList(new TypeReference() {})); return function; } - public String getSignedTransactionForVerifyTpProof(TpBta tpBta, ThirdPartyProof tpProof) { + public String getSignedTransactionForVerifyTpProof(TpBta tpBta, ThirdPartyProof tpProof, + String monitorPtcAddr) { final Function function = new Function( - FUNC_VERIFYTPPROOF, - Arrays.asList(tpBta, - tpProof), + FUNC_VERIFYTPPROOF, + Arrays.asList(tpBta, + tpProof, + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(monitorPtcAddr)), Collections.>emptyList(), 0); return createSignedTransaction(function); } - public String verifyTpProof(TpBta tpBta, ThirdPartyProof tpProof, + public String verifyTpProof(TpBta tpBta, ThirdPartyProof tpProof, String monitorPtcAddr, TransactionCallback callback) { final Function function = new Function( - FUNC_VERIFYTPPROOF, - Arrays.asList(tpBta, - tpProof), + FUNC_VERIFYTPPROOF, + Arrays.asList(tpBta, + tpProof, + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(monitorPtcAddr)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } - public Tuple2 getVerifyTpProofInput( + public Tuple3 getVerifyTpProofInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_VERIFYTPPROOF, - Arrays.asList(), - Arrays.>asList(new TypeReference() {}, new TypeReference() {})); + final Function function = new Function(FUNC_VERIFYTPPROOF, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); - return new Tuple2( + return new Tuple3( - (TpBta) results.get(0), - (ThirdPartyProof) results.get(1) + (TpBta) results.get(0), + (ThirdPartyProof) results.get(1), + (String) results.get(2).getValue() ); } public Tuple1 getVerifyTpProofOutput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getOutput(); - final Function function = new Function(FUNC_VERIFYTPPROOF, - Arrays.asList(), + final Function function = new Function(FUNC_VERIFYTPPROOF, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( diff --git a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/Monitor.java b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/Monitor.java new file mode 100644 index 00000000..5e5f0693 --- /dev/null +++ b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/Monitor.java @@ -0,0 +1,1988 @@ +package com.alipay.antchain.bridge.plugins.fiscobcos.abi; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.fisco.bcos.sdk.v3.client.Client; +import org.fisco.bcos.sdk.v3.codec.datatypes.Address; +import org.fisco.bcos.sdk.v3.codec.datatypes.Bool; +import org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes; +import org.fisco.bcos.sdk.v3.codec.datatypes.Event; +import org.fisco.bcos.sdk.v3.codec.datatypes.Function; +import org.fisco.bcos.sdk.v3.codec.datatypes.Type; +import org.fisco.bcos.sdk.v3.codec.datatypes.TypeReference; +import org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple1; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple3; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple4; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple5; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple7; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple8; +import org.fisco.bcos.sdk.v3.contract.Contract; +import org.fisco.bcos.sdk.v3.crypto.CryptoSuite; +import org.fisco.bcos.sdk.v3.crypto.keypair.CryptoKeyPair; +import org.fisco.bcos.sdk.v3.eventsub.EventSubCallback; +import org.fisco.bcos.sdk.v3.model.CryptoType; +import org.fisco.bcos.sdk.v3.model.TransactionReceipt; +import org.fisco.bcos.sdk.v3.model.callback.TransactionCallback; +import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.ProxySignTransactionManager; +import org.fisco.bcos.sdk.v3.transaction.model.exception.ContractException; + +@SuppressWarnings("unchecked") +public class Monitor extends Contract { + public static final String[] BINARY_ARRAY = {"60806040523480156200001157600080fd5b506200001d336200002d565b620000276200007d565b6200014c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a81b900460ff1615620000ec5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff600160a01b909104811610156200014a576000805460ff60a01b191660ff60a01b17905560405160ff81527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6138a6806200015c6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638da5cb5b1161010f578063c2450b50116100a2578063dbc0e0b011610071578063dbc0e0b014610306578063e1c7392a14610446578063f2fde38b1461044e578063fed209e21461046157600080fd5b8063c2450b50146103fa578063c610a7761461040b578063cd6be5b81461041e578063d16352af1461043557600080fd5b8063980c8e75116100de578063980c8e75146103a85780639f62a9f9146103bd578063bc327e40146103e0578063bccc247f146103e757600080fd5b80638da5cb5b146103515780639465cfa41461024357806396d8b69214610362578063980113c71461037557600080fd5b80634d7c7085116101875780636bc704b3116101565780636bc704b314610306578063715018a614610319578063754b377c146103215780637fd2ac431461033e57600080fd5b80634d7c7085146102ba578063552a8d19146102cd5780635debd279146102e05780636605dc79146102f357600080fd5b80633699f217116101c35780633699f21714610256578063387868ae146102695780634450f2911461029457806346a48dd8146102a757600080fd5b80630a9d793d146101f55780630ec522621461020a5780632644ef051461023057806327bdcf6414610243575b600080fd5b610208610203366004612bee565b610474565b005b61021d610218366004612c5f565b61051f565b6040519081526020015b60405180910390f35b61020861023e366004612d14565b6105e7565b610208610251366004612dd1565b6106bb565b61021d610264366004612e4e565b6106f9565b60015461027c906001600160a01b031681565b6040516001600160a01b039091168152602001610227565b61021d6102a2366004612e4e565b6107c7565b6102086102b5366004612dd1565b610843565b6102086102c8366004612dd1565b610c5f565b6102086102db366004612bee565b610e9a565b6102086102ee366004612f11565b610f51565b61021d610301366004612c5f565b611083565b610208610314366004612dd1565b6110fb565b610208611133565b610329600581565b60405163ffffffff9091168152602001610227565b61020861034c366004612fa1565b611169565b6000546001600160a01b031661027c565b610208610370366004613049565b61123c565b6103986103833660046130ff565b60036020526000908152604090205460ff1681565b6040519015158152602001610227565b600254600160a01b900463ffffffff16610329565b6103986103cb3660046130ff565b60046020526000908152604090205460ff1681565b6005610329565b6102086103f5366004613118565b6117bf565b6002546001600160a01b031661027c565b610208610419366004612f11565b611895565b60025461032990600160a01b900463ffffffff1681565b6001546001600160a01b031661027c565b61020861198c565b61020861045c366004612bee565b611ab9565b60025461027c906001600160a01b031681565b6000546001600160a01b031633146104a75760405162461bcd60e51b815260040161049e906131e5565b60405180910390fd5b6001600160a01b0381166104fd5760405162461bcd60e51b815260206004820181905260248201527f4d6f6e69746f724d73673a20696e76616c69642073647020636f6e7472616374604482015260640161049e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546000906001600160a01b0316331461054c5760405162461bcd60e51b815260040161049e9061321a565b600061055c868a8a8a8888611b51565b60015460405163849d87a560e01b81529192506001600160a01b03169063849d87a590610597908c908c908c908c908c9089906004016132d9565b6020604051808303816000875af11580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da919061331d565b9998505050505050505050565b6000546001600160a01b031633146106115760405162461bcd60e51b815260040161049e906131e5565b63ffffffff81166001148061062c575063ffffffff81166002145b8061063d575063ffffffff81166003145b6106955760405162461bcd60e51b815260206004820152602360248201527f4d6f6e69746f724d73673a20696e76616c6964206d6f6e69746f7220636f6e746044820152621c9bdb60ea1b606482015260840161049e565b6002805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6001546001600160a01b031633146106e55760405162461bcd60e51b815260040161049e9061321a565b6106f3848484846001611c16565b50505050565b6001546000906001600160a01b031633146107265760405162461bcd60e51b815260040161049e9061321a565b6000610736888c8c8c8a8a611b51565b600154604051637003e90160e11b81529192506001600160a01b03169063e007d20290610775908e908e908e908e908e9089908d908d90600401613336565b6020604051808303816000875af1158015610794573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b8919061331d565b9b9a5050505050505050505050565b6001546000906001600160a01b031633146107f45760405162461bcd60e51b815260040161049e9061321a565b6000610804888c8c8c8a8a611b51565b60015460405163b01d99a760e01b81529192506001600160a01b03169063b01d99a790610775908e908e908e908e908e9089908d908d90600401613336565b6001546001600160a01b0316331461086d5760405162461bcd60e51b815260040161049e9061321a565b6108976040518060600160405280600063ffffffff16815260200160608152602001606081525090565b6108a18183611eb3565b805163ffffffff1660021415610acb57600254604080516333039e0d60e11b815290516000926001600160a01b0316916366073c1a916004808301926020929190829003018187875af11580156108fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109209190613395565b90507fe0b90dd197b48e9d1d4c8261aaa0a7d81af5f82cdf4175de5c238998b7cbef428686868460405161095794939291906133b2565b60405180910390a180610a5e57600382526040805180820190915260168152754d69644d6f6e69746f72696e67206e6f74207061737360501b6020808301919091528301526001546001600160a01b031663d76ceb178787876109b987612044565b6040518563ffffffff1660e01b81526004016109d894939291906133ec565b600060405180830381600087803b1580156109f257600080fd5b505af1158015610a06573d6000803e3d6000fd5b505050507f03c2dda0c8af54b5751192fb5cb8d43da47e2dec0d76467c53fb1ad04a50f0538260000151610a3986612140565b88888660200151604051610a51959493929190613432565b60405180910390a1610ac5565b604080830151905163c09b261b60e01b81526001600160a01b0386169163c09b261b91610a92918a918a919060040161346f565b600060405180830381600087803b158015610aac57600080fd5b505af1158015610ac0573d6000803e3d6000fd5b505050505b50610c58565b805163ffffffff1660031415610b9557604080820151905163c09b261b60e01b81526001600160a01b0385169163c09b261b91610b0f91899189919060040161346f565b600060405180830381600087803b158015610b2957600080fd5b505af1158015610b3d573d6000803e3d6000fd5b505050507fc48de7554303bcb3c6e7fb9887aae278d9fb675bbe9e4deec78a0fda64fec1b181600001518686610b7287612140565b8560200151604051610b8895949392919061349a565b60405180910390a1610c58565b805163ffffffff1660011415610c1057604080820151905163c09b261b60e01b81526001600160a01b0385169163c09b261b91610bd991899189919060040161346f565b600060405180830381600087803b158015610bf357600080fd5b505af1158015610c07573d6000803e3d6000fd5b50505050610c58565b60405162461bcd60e51b815260206004820152601f60248201527f4d6f6e69746f725f4d73673a2077726f6e67206d6f6e69746f72207479706500604482015260640161049e565b5050505050565b6001546001600160a01b03163314610c895760405162461bcd60e51b815260040161049e9061321a565b610cb36040518060600160405280600063ffffffff16815260200160608152602001606081525090565b610cbd8183611eb3565b805163ffffffff1660021415610e0c57600254604080516333039e0d60e11b815290516000926001600160a01b0316916366073c1a916004808301926020929190829003018187875af1158015610d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3c9190613395565b90507fe0b90dd197b48e9d1d4c8261aaa0a7d81af5f82cdf4175de5c238998b7cbef4286868684604051610d7394939291906133b2565b60405180910390a180610dd557600382526040805180820190915260168152754d69644d6f6e69746f72696e67206e6f74207061737360501b6020808301919091528301526001546001600160a01b03166393e68aa88787876109b987612044565b6040808301519051600162f6741960e01b031981526001600160a01b0386169163ff098be791610a92918a918a919060040161346f565b805163ffffffff1660031415610e53576040808201519051600162f6741960e01b031981526001600160a01b0385169163ff098be791610b0f91899189919060040161346f565b805163ffffffff1660011415610c10576040808201519051600162f6741960e01b031981526001600160a01b0385169163ff098be791610bd991899189919060040161346f565b6000546001600160a0","1b03163314610ec45760405162461bcd60e51b815260040161049e906131e5565b6001600160a01b038116610f2f5760405162461bcd60e51b815260206004820152602c60248201527f4d6f6e69746f724d73673a20696e76616c6964204d6f6e69746f72566572696660448201526b1a595c8818dbdb9d1c9858dd60a21b606482015260840161049e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60028054600160a01b900463ffffffff161415610f99576000610f78338787878787612153565b905080610f975760405162461bcd60e51b815260040161049e906134d7565b505b60408051606081018252600254600160a01b900463ffffffff1681528151602080820184526000808352818401929092528351601f86018290048202810182018552858152919383019190869086908190840183828082843760009201829052509390945250929350915061100f905082612044565b60015460405163127cd15560e31b81529192506001600160a01b0316906393e68aa890611048908a908a908a903390889060040161350e565b600060405180830381600087803b15801561106257600080fd5b505af1158015611076573d6000803e3d6000fd5b5050505050505050505050565b6001546000906001600160a01b031633146110b05760405162461bcd60e51b815260040161049e9061321a565b60006110c0868a8a8a8888611b51565b6001546040516311b380c360e31b81529192506001600160a01b031690638d9c061890610597908c908c908c908c908c9089906004016132d9565b6001546001600160a01b031633146111255760405162461bcd60e51b815260040161049e9061321a565b6106f3848484846000611c16565b6000546001600160a01b0316331461115d5760405162461bcd60e51b815260040161049e906131e5565b6111676000612267565b565b6001546001600160a01b031633146111935760405162461bcd60e51b815260040161049e9061321a565b6111bd6040518060600160405280600063ffffffff16815260200160608152602001606081525090565b6111c78183611eb3565b604080820151905163e5512e9760e01b81526001600160a01b038a169163e5512e9791611200918b918b918b918b918b9160040161354a565b600060405180830381600087803b15801561121a57600080fd5b505af115801561122e573d6000803e3d6000fd5b505050505050505050505050565b60025460405163109982ed60e21b81526000916001600160a01b0316906342660bb490611277908a908a908a908a908a908a90600401613596565b6020604051808303816000875af1158015611296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ba9190613395565b90507fe93691f2b94d95bf2148c481d070d8fa8eb667649f9cd77500752956d0e2742f8787836040516112ef939291906135e5565b60405180910390a16001811515146113675760405162461bcd60e51b815260206004820152603560248201527f4d6f6e69746f725f4d73673a20766572696679206d6f6e69746f72206e6f6465604482015274081c1c9bdbd9881b595cdcd859d94819985a5b1959605a1b606482015260840161049e565b6113c26040518061012001604052806060815260200160608152602001600063ffffffff1681526020016060815260200160008019168152602001606081526020016000801916815260200160608152602001606081525090565b6113cc81846122b7565b6113d4612bb3565b6113dc612bb3565b60005b60088160ff1610156114825760006113f8826004613621565b61140390601c61364a565b60ff16856040015163ffffffff16901c600f16905060038160ff16901c600116848360ff16600881106114385761143861366d565b602002019060ff16908160ff168152505080600716838360ff16600881106114625761146261366d565b60ff9092166020929092020152508061147a81613683565b9150506113df565b50815160ff16600114156115c657805160ff166114db57608083015160009081526003602090815260408083208054600160ff19918216811790925560c0880151855260049093529220805490911690911790556115c6565b805160ff16600114156115245760808301516000908152600360209081526040808320805460ff1990811690915560c087015184526004909252909120805490911690556115c6565b60405162461bcd60e51b8152602060048201526064602482018190527f4d6f6e69746f725f4d73673a206e6f7420737570706f7274206d6f6e69746f7260448301527f206f7264657220636f6e7461696e696e672074686973204d494e4f5220545950908201527f4520696e204d414a4f525f545950455f434f4e54524143545f41444452455353608482015263081e595d60e21b60a482015260c40161049e565b602082015160ff16600114156116bc57602081015160ff166115fd576002805463ffffffff60a01b1916600160a01b1790556116bc565b602081015160ff1660011415611628576002805463ffffffff60a01b1916600160a11b1790556116bc565b60405162461bcd60e51b815260206004820152605b60248201527f4d6f6e69746f725f4d73673a206e6f7420737570706f7274206d6f6e69746f7260448201527f206f7264657220636f6e7461696e696e672074686973204d494e4f522054595060648201527f4520696e204d414a4f525f545950455f434f4e54524f4c207965740000000000608482015260a40161049e565b815160ff1660011461175357602082015160ff166001146117535760405162461bcd60e51b815260206004820152604560248201527f4d6f6e69746f725f4d73673a206e6f7420737570706f7274206d6f6e69746f7260448201527f206f7264657220636f6e7461696e696e672074686973204d414a4f522054595060648201526411481e595d60da1b608482015260a40161049e565b7f6d19330bbe1366e949bc567dd5b32e30fabcea37e58ec046f418e30d7ebd35618360400151846060015185608001518660a001518760c001518860e001518961010001516040516117ab97969594939291906136a3565b60405180910390a150505050505050505050565b6001546001600160a01b031633146117e95760405162461bcd60e51b815260040161049e9061321a565b6118136040518060600160405280600063ffffffff16815260200160608152602001606081525090565b61181d8184611eb3565b6040808201519051633db5d43960e21b81526001600160a01b038b169163f6d750e491611858918c918c918c918c918c918b90600401613716565b600060405180830381600087803b15801561187257600080fd5b505af1158015611886573d6000803e3d6000fd5b50505050505050505050505050565b60028054600160a01b900463ffffffff1614156118dd5760006118bc338787878787612153565b9050806118db5760405162461bcd60e51b815260040161049e906134d7565b505b60408051606081018252600254600160a01b900463ffffffff1681528151602080820184526000808352818401929092528351601f860182900482028101820185528581529193830191908690869081908401838280828437600092018290525093909452509293509150611953905082612044565b60015460405163d76ceb1760e01b81529192506001600160a01b03169063d76ceb1790611048908a908a908a903390889060040161350e565b600054600160a81b900460ff16158080156119b457506000546001600160a01b90910460ff16105b806119d55750303b1580156119d55750600054600160a01b900460ff166001145b611a385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161049e565b6000805460ff60a01b1916600160a01b1790558015611a65576000805460ff60a81b1916600160a81b1790555b611a6e33612267565b8015611ab6576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6000546001600160a01b03163314611ae35760405162461bcd60e51b815260040161049e906131e5565b6001600160a01b038116611b485760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161049e565b611ab681612267565b60028054606091600160a01b90910463ffffffff161415611b9657611b7a878787878787612153565b611b965760405162461bcd60e51b815260040161049e906134d7565b60408051606081018252600254600160a01b900463ffffffff1681528151602080820184526000808352818401929092528351601f87018290048202810182018552868152919383019190879087908190840183828082843760009201919091525050509152509050611c0881612044565b9150505b9695505050505050565b611c406040518060600160405280600063ffffffff16815260200160608152602001606081525090565b611c4a8184611eb3565b805163ffffffff1660021415611d6757600254604080516333039e0d60e11b815290516000926001600160a01b0316916366073c1a916004808301926020929190829003018187875af1158015611ca5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc99190613395565b90507fe0b90dd197b48e9d1d4c8261aaa0a7d81af5f82cdf4175de5c238998b7cbef4287878784604051611d0094939291906133b2565b60405180910390a180611d615760405162461bcd60e51b815260206004820152602360248201527f4d6f6e69746f725f4d73673a204d69644d6f6e69746f72696e67206e6f74207060448201526261737360e81b606482015260840161049e565b50611dd0565b805163ffffffff1660011480611d845750805163ffffffff166003145b611dd05760405162461bcd60e51b815260206004820152601f60248201527f4d6f6e69746f725f4d73673a2077726f6e67206d6f6e69746f72207479706500604482015260640161049e565b8115611e44576040808201519051600162f6741960e01b031981526001600160a01b0386169163ff098be791611e0d918a918a919060040161346f565b600060405180830381600087803b158015611e2757600080fd5b505af1158015611e3b573d6000803e3d6000fd5b50505050611eab565b604080820151905163c09b261b60e01b81526001600160a01b0386169163c09b261b91611e78918a918a919060040161346f565b600060405180830381600087803b158015611e9257600080fd5b505af1158015611ea6573d6000803e3d60","00fd5b505050505b505050505050565b80516044811015611f145760405162461bcd60e51b815260206004820152602560248201527f4d6f6e69746f724c69623a206d616c666f726d6564206d6f6e69746f72206d65604482015264737361676560d81b606482015260840161049e565b611f1e8282612428565b63ffffffff1680845260011480611f3c5750825163ffffffff166002145b80611f4e5750825163ffffffff166003145b611f9a5760405162461bcd60e51b815260206004820181905260248201527f4d6f6e69746f724c69623a20696e76616c6964206d6f6e69746f722074797065604482015260640161049e565b611fa4602061252f565b611fae9082613762565b9050606080611fbd848461275e565b93509150611fcb848461275e565b93509050821561202f5760405162461bcd60e51b815260206004820152602960248201527f4d6f6e69746f724c69623a20747261696c696e67206d6f6e69746f72206d657360448201526873616765206461746160b81b606482015260840161049e565b60208501919091526040909301929092525050565b6060600061205583604001516129c4565b61206284602001516129c4565b61206d906004613779565b6120779190613779565b90506000816001600160401b0381111561209357612093612d2f565b6040519080825280601f01601f1916602001820160405280156120bd576020820181803683370190505b5084518382016003198101805192909152529050816120dc6020612a16565b6120e69082613762565b90506120f781866020015184612a21565b61210485602001516129c4565b61210e9082613762565b905061211f81866040015184612a21565b61212c85604001516129c4565b6121369082613762565b5090949350505050565b60008061214c83612a7f565b9392505050565b6000808061216089612140565b60008181526003602052604090205490915060ff16156121c2577f8327e36ff38d53c73dd2b72f9e3ed44e8d85f48d64958fe901cf60bfc440bf2181898989600160006040516121b596959493929190613791565b60405180910390a161225b565b60008681526004602052604090205460ff1615612213577f8327e36ff38d53c73dd2b72f9e3ed44e8d85f48d64958fe901cf60bfc440bf21818989896001806040516121b596959493929190613791565b7f3ea8cc01f2a486a400584b5d32875ce43bfdff8d859e79f600b4c0b20c9293068189898960405161224894939291906137cd565b60405180910390a1600192505050611c0c565b50979650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b805160006122c58284612aad565b80855280519091506122d8906004613779565b6122e29083613762565b915060006122f08385612aad565b602086018190528051909150612307906004613779565b6123119084613762565b925061231d8385015190565b63ffffffff166040860152612333600484613762565b925060006123418486612aad565b606087018190528051909150612358906004613779565b6123629085613762565b935061236e8486015190565b608087015261237e602085613762565b9350600061238c8587612aad565b60a0880181905280519091506123a3906004613779565b6123ad9086613762565b94506123b98587015190565b60c08801526123c9602086613762565b945060006123d78688612aad565b60e0890181905280519091506123ee906004613779565b6123f89087613762565b955060006124068789612aad565b6101008a01819052805190915061241e906004613779565b611ea69088613762565b60006004821015801561243c575082518211155b6124885760405162461bcd60e51b815260206004820181905260248201527f4d6f6e69746f724c69623a2075696e743332206f7574206f6620626f756e6473604482015260640161049e565b82612494600184613762565b815181106124a4576124a461366d565b016020015160f81c6008846124ba600286613762565b815181106124ca576124ca61366d565b016020015160f81c901b6010856124e2600387613762565b815181106124f2576124f261366d565b016020015160f81c901b60188661250a600488613762565b8151811061251a5761251a61366d565b016020015160f81c901b171717905092915050565b6000816008811461263c5760108114612645576018811461264e5760208114612657576028811461266057603081146126695760388114612672576040811461267b5760488114612684576050811461268d5760588114612696576060811461269f57606881146126a857607081146126b157607881146126ba57608081146126c357608881146126cc57609081146126d557609881146126de5760a081146126e75760a881146126f05760b081146126f95760b881146127025760c0811461270b5760c881146127145760d0811461271d5760d881146127265760e0811461272f5760e881146127385760f081146127415760f8811461274a5761010081146127535760209150612758565b60019150612758565b60029150612758565b60039150612758565b60049150612758565b60059150612758565b60069150612758565b60079150612758565b60089150612758565b60099150612758565b600a9150612758565b600b9150612758565b600c9150612758565b600d9150612758565b600e9150612758565b600f9150612758565b60109150612758565b60119150612758565b60129150612758565b60139150612758565b60149150612758565b60159150612758565b60169150612758565b60179150612758565b60189150612758565b60199150612758565b601a9150612758565b601b9150612758565b601c9150612758565b601d9150612758565b601e9150612758565b601f9150612758565b602091505b50919050565b6060600060208310156127bf5760405162461bcd60e51b8152602060048201526024808201527f4d6f6e69746f724c69623a206d616c666f726d6564207661726961626c6520626044820152637974657360e01b606482015260840161049e565b60006127cb8585612428565b63ffffffff169050600060206127e283601f613779565b6127ec919061380e565b905060006127fb826020613822565b9050612808816020613779565b8610156128685760405162461bcd60e51b815260206004820152602860248201527f4d6f6e69746f724c69623a207661726961626c65206279746573206f7574206f6044820152676620626f756e647360c01b606482015260840161049e565b80612874602088613762565b61287e9190613762565b9350826001600160401b0381111561289857612898612d2f565b6040519080825280601f01601f1916602001820160405280156128c2576020820181803683370190505b50945060005b828110156129b9576000816128de600186613762565b6128e89190613762565b6128f3906020613822565b6128fd9087613779565b9050600061290c836020613822565b9050600061291a8288613762565b90506020811115612929575060205b60005b818110156129a2578b61293f8286613779565b8151811061294f5761294f61366d565b01602001516001600160f81b0319168a6129698386613779565b815181106129795761297961366d565b60200101906001600160f81b031916908160001a9053508061299a81613841565b91505061292c565b5050505080806129b190613841565b9150506128c8565b505050509250929050565b6000602082516129d4919061380e565b9050602082516129e4919061385c565b156129f757806129f381613841565b9150505b80612a0181613841565b9150612a109050602082613822565b92915050565b6000612a108261252f565b600060208351612a31919061380e565b9050600060208451612a43919061385c565b1115612a575780612a5381613841565b9150505b60010160005b81811015610c58576020810284015183860152601f1990940193600101612a5d565b6040805160208082528183019092526000918291906020820181803683375050506020018390525090919050565b60606000612abb8484015190565b63ffffffff169050612ace600485613762565b935083811115612b395760405162461bcd60e51b815260206004820152603060248201527f6279746573546f56617242797465733a206f6666736574206c6573732074686160448201526f6e206c656e677468206f6620626f647960801b606482015260840161049e565b612b438185613762565b9350606081158015612b6057604051915060208201604052612baa565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015612b99578051835260209283019201612b81565b5050848452601f01601f1916604052505b50949350505050565b6040518061010001604052806008906020820280368337509192915050565b80356001600160a01b0381168114612be957600080fd5b919050565b600060208284031215612c0057600080fd5b61214c82612bd2565b60008083601f840112612c1b57600080fd5b5081356001600160401b03811115612c3257600080fd5b602083019150836020828501011115612c4a57600080fd5b9250929050565b8015158114611ab657600080fd5b600080600080600080600060a0888a031215612c7a57600080fd5b87356001600160401b0380821115612c9157600080fd5b612c9d8b838c01612c09565b909950975060208a01359650879150612cb860408b01612bd2565b955060608a01359150612cca82612c51565b90935060808901359080821115612ce057600080fd5b50612ced8a828b01612c09565b989b979a50959850939692959293505050565b803563ffffffff81168114612be957600080fd5b600060208284031215612d2657600080fd5b61214c82612d00565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612d5657600080fd5b81356001600160401b0380821115612d7057612d70612d2f565b604051601f8301601f19908116603f01168101908282118183101715612d9857612d98612d2f565b81604052838152866020858801011115612db157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060808587031215612de757600080fd5b84356001600160401b0380821115612dfe57600080fd5b612e0a88838901612d45565b955060208701359450612e1f60408801612bd2565b93506060870135915080821115612e3557600080fd5b50612e4287828801612d45565b91505092959194509250565b600080600080600080600080600060e08a8c031215612e6c57600080fd5b89356001600160401b0380821115612e8357600080fd5b612e8f8d838e01612c09565b909b50995060208c01359850899150612eaa6040","8d01612bd2565b975060608c01359150612ebc82612c51565b90955060808b01359080821115612ed257600080fd5b50612edf8c828d01612c09565b90955093505060a08a013560ff81168114612ef957600080fd5b8092505060c08a013590509295985092959850929598565b600080600080600060608688031215612f2957600080fd5b85356001600160401b0380821115612f4057600080fd5b612f4c89838a01612c09565b9097509550602088013594506040880135915080821115612f6c57600080fd5b50612f7988828901612c09565b969995985093965092949392505050565b80356001600160401b0381168114612be957600080fd5b600080600080600080600060e0888a031215612fbc57600080fd5b612fc588612bd2565b96506020880135955060408801356001600160401b0380821115612fe857600080fd5b612ff48b838c01612d45565b965060608a0135955061300960808b01612d00565b945061301760a08b01612f8a565b935060c08a013591508082111561302d57600080fd5b5061303a8a828b01612d45565b91505092959891949750929550565b6000806000806000806080878903121561306257600080fd5b86356001600160401b038082111561307957600080fd5b6130858a838b01612c09565b9098509650602089013591508082111561309e57600080fd5b6130aa8a838b01612c09565b909650945060408901359150808211156130c357600080fd5b6130cf8a838b01612d45565b935060608901359150808211156130e557600080fd5b506130f289828a01612d45565b9150509295509295509295565b60006020828403121561311157600080fd5b5035919050565b600080600080600080600080610100898b03121561313557600080fd5b61313e89612bd2565b97506020890135965060408901356001600160401b038082111561316157600080fd5b61316d8c838d01612d45565b975060608b0135965061318260808c01612d00565b955061319060a08c01612f8a565b945060c08b01359150808211156131a657600080fd5b6131b28c838d01612d45565b935060e08b01359150808211156131c857600080fd5b506131d58b828c01612d45565b9150509295985092959890939650565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4d6f6e69746f724d73673a2073656e646572206e6f742076616c6964207375626040820152680b5c1c9bdd1bd8dbdb60ba1b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845260005b818110156132b257602081850181015186830182015201613296565b818111156132c4576000602083870101525b50601f01601f19169290920160200192915050565b60a0815260006132ed60a08301888a613263565b602083018790526001600160a01b0386166040840152841515606084015282810360808401526105da818561328c565b60006020828403121561332f57600080fd5b5051919050565b60e08152600061334a60e083018a8c613263565b602083018990526001600160a01b03881660408401528615156060840152828103608084015261337a818761328c565b60ff9590951660a0840152505060c001529695505050505050565b6000602082840312156133a757600080fd5b815161214c81612c51565b6080815260006133c5608083018761328c565b6020830195909552506001600160a01b039290921660408301521515606090910152919050565b6080815260006133ff608083018761328c565b602083018690526001600160a01b03851660408401528281036060840152613427818561328c565b979650505050505050565b63ffffffff8616815284602082015260a06040820152600061345760a083018661328c565b8460608401528281036080840152611c08818561328c565b606081526000613482606083018661328c565b8460208401528281036040840152611c0c818561328c565b63ffffffff8616815260a0602082015260006134b960a083018761328c565b8560408401528460608401528281036080840152611c08818561328c565b6020808252601e908201527f6265666f726568616e64204d6f6e69746f7220646973617070726f76616c0000604082015260600190565b608081526000613522608083018789613263565b602083018690526001600160a01b03851660408401528281036060840152611c08818561328c565b86815260c06020820152600061356360c083018861328c565b86604084015263ffffffff861660608401526001600160401b038516608084015282810360a08401526105da818561328c565b6080815260006135aa60808301888a613263565b82810360208401526135bd818789613263565b905082810360408401526135d1818661328c565b905082810360608401526105da818561328c565b6040815260006135f9604083018587613263565b90508215156020830152949350505050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff84168160ff04811182151516156136425761364261360b565b029392505050565b600060ff821660ff8416808210156136645761366461360b565b90039392505050565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff81141561369a5761369a61360b565b60010192915050565b63ffffffff8816815260e0602082015260006136c260e083018961328c565b87604084015282810360608401526136da818861328c565b905085608084015282810360a08401526136f4818661328c565b905082810360c0840152613708818561328c565b9a9950505050505050505050565b87815260e06020820152600061372f60e083018961328c565b87604084015263ffffffff871660608401526001600160401b038616608084015282810360a08401526136f4818661328c565b6000828210156137745761377461360b565b500390565b6000821982111561378c5761378c61360b565b500190565b86815260a0602082015260006137ab60a083018789613263565b60408301959095525060ff928316606082015291166080909101529392505050565b8481526060602082015260006137e7606083018587613263565b905082604083015295945050505050565b634e487b7160e01b600052601260045260246000fd5b60008261381d5761381d6137f8565b500490565b600081600019048311821515161561383c5761383c61360b565b500290565b60006000198214156138555761385561360b565b5060010190565b60008261386b5761386b6137f8565b50069056fea2646970667358221220d771937b7e4c6a07f3d06c6fc50271f23b753122d5c8053b451e77b57fb90f2864736f6c634300080b0033"}; + + public static final String BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", BINARY_ARRAY); + + public static final String[] SM_BINARY_ARRAY = {"60806040523480156200001157600080fd5b506200001d336200002d565b620000276200007d565b6200014d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b600054600160a81b900460ff1615620000ed57604051636381e58960e11b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff600160a01b909104811610156200014b576000805460ff60a01b191660ff60a01b17905560405160ff81527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa9060200160405180910390a15b565b6138bd806200015d6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80637f7af9f41161010f578063b494e8ef116100a2578063d84ecd6911610071578063d84ecd691461042f578063d86e29e214610442578063e943e1ae1461044a578063ff5331821461045d57600080fd5b8063b494e8ef146103e5578063beb51d4f146103f8578063d2bb5c1b1461040b578063d539a9bc1461041c57600080fd5b80639752402c116100de5780639752402c146103945780639c538d1c146103a7578063abf915cd146103bc578063b25ec36b146103c457600080fd5b80637f7af9f41461033a5780638539abc61461034d578063869536de1461037057806395eaccee1461038357600080fd5b8063515c7322116101875780636c85ff20116101565780636c85ff20146102da578063708dc744146102e15780637c56bd1e146102f45780637e5fea661461032757600080fd5b8063515c7322146101f55780636126f954146102bf57806361624d6a146102c75780636460c2ea1461021d57600080fd5b8063262c421c116101c3578063262c421c146102435780633ed4ce501461027457806342639c4d146102875780635089e2c81461029a57600080fd5b80630e50dc2a146101f557806316cad12a1461020a5780631d312fb11461021d5780632097809b14610230575b600080fd5b610208610203366004612ca7565b610470565b005b610208610218366004612d24565b6104b8565b61020861022b366004612ca7565b610555565b61020861023e366004612d24565b61058e565b60025461025a90600160a01b900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b610208610282366004612d87565b610632565b610208610295366004612e00565b610765565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161026b565b61025a600581565b6102086102d5366004612ca7565b610cec565b600561025a565b6102086102ef366004612ca7565b61110a565b610317610302366004612eb6565b60036020526000908152604090205460ff1681565b604051901515815260200161026b565b610208610335366004612d24565b61133d565b610208610348366004612efa565b6113f6565b61031761035b366004612eb6565b60046020526000908152604090205460ff1681565b61020861037e366004612fc7565b6114cd565b6001546001600160a01b03166102a7565b6102086103a2366004612fe2565b6115a3565b600254600160a01b900463ffffffff1661025a565b610208611677565b6103d76103d2366004613098565b6117a4565b60405190815260200161026b565b6103d76103f3366004613139565b61186d565b6103d7610406366004613098565b61193c565b6002546001600160a01b03166102a7565b61020861042a366004612d87565b6119b5565b6001546102a7906001600160a01b031681565b610208611aad565b6103d7610458366004613139565b611ae4565b6002546102a7906001600160a01b031681565b6001546001600160a01b031633146104a457604051636381e58960e11b815260040161049b906131fc565b60405180910390fd5b6104b2848484846000611b61565b50505050565b6000546001600160a01b031633146104e357604051636381e58960e11b815260040161049b90613245565b6001600160a01b03811661054957604051636381e58960e11b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161049b565b61055281611dfd565b50565b6001546001600160a01b0316331461058057604051636381e58960e11b815260040161049b906131fc565b6104b2848484846001611b61565b6000546001600160a01b031633146105b957604051636381e58960e11b815260040161049b90613245565b6001600160a01b03811661061057604051636381e58960e11b815260206004820181905260248201527f4d6f6e69746f724d73673a20696e76616c69642073647020636f6e7472616374604482015260640161049b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60028054600160a01b900463ffffffff16141561067b576000610659338787878787611e4d565b90508061067957604051636381e58960e11b815260040161049b9061327a565b505b60408051606081018252600254600160a01b900463ffffffff1681528151602080820184526000808352818401929092528351601f8601829004820281018201855285815291938301919086908690819084018382808284376000920182905250939094525092935091506106f1905082611f63565b6001546040516350d2ea9160e11b81529192506001600160a01b03169063a1a5d5229061072a908a908a908a9033908890600401613327565b600060405180830381600087803b15801561074457600080fd5b505af1158015610758573d6000803e3d6000fd5b5050505050505050505050565b600254604051630719fa7960e01b81526000916001600160a01b031690630719fa79906107a0908a908a908a908a908a908a90600401613363565b6020604051808303816000875af11580156107bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e391906133b2565b90507f5955e3eb410fa714a96b7c91bdf33262e13c2bf65e2ccd017652740e3017ce4c878783604051610818939291906133cf565b60405180910390a160018115151461089157604051636381e58960e11b815260206004820152603560248201527f4d6f6e69746f725f4d73673a20766572696679206d6f6e69746f72206e6f6465604482015274081c1c9bdbd9881b595cdcd859d94819985a5b1959605a1b606482015260840161049b565b6108ec6040518061012001604052806060815260200160608152602001600063ffffffff1681526020016060815260200160008019168152602001606081526020016000801916815260200160608152602001606081525090565b6108f6818461205f565b6108fe612bca565b610906612bca565b60005b60088160ff1610156109ac57600061092282600461340b565b61092d90601c613434565b60ff16856040015163ffffffff16901c600f16905060038160ff16901c600116848360ff166008811061096257610962613457565b602002019060ff16908160ff168152505080600716838360ff166008811061098c5761098c613457565b60ff909216602092909202015250806109a48161346d565b915050610909565b50815160ff1660011415610af157805160ff16610a0557608083015160009081526003602090815260408083208054600160ff19918216811790925560c088015185526004909352922080549091169091179055610af1565b805160ff1660011415610a4e5760808301516000908152600360209081526040808320805460ff1990811690915560c08701518452600490925290912080549091169055610af1565b604051636381e58960e11b8152602060048201526064602482018190527f4d6f6e69746f725f4d73673a206e6f7420737570706f7274206d6f6e69746f7260448301527f206f7264657220636f6e7461696e696e672074686973204d494e4f5220545950908201527f4520696e204d414a4f525f545950455f434f4e54524143545f41444452455353608482015263081e595d60e21b60a482015260c40161049b565b602082015160ff1660011415610be857602081015160ff16610b28576002805463ffffffff60a01b1916600160a01b179055610be8565b602081015160ff1660011415610b53576002805463ffffffff60a01b1916600160a11b179055610be8565b604051636381e58960e11b815260206004820152605b60248201527f4d6f6e69746f725f4d73673a206e6f7420737570706f7274206d6f6e69746f7260448201527f206f7264657220636f6e7461696e696e672074686973204d494e4f522054595060648201527f4520696e204d414a4f525f545950455f434f4e54524f4c207965740000000000608482015260a40161049b565b815160ff16600114610c8057602082015160ff16600114610c8057604051636381e58960e11b815260206004820152604560248201527f4d6f6e69746f725f4d73673a206e6f7420737570706f7274206d6f6e69746f7260448201527f206f7264657220636f6e7461696e696e672074686973204d414a4f522054595060648201526411481e595d60da1b608482015260a40161049b565b7fb0b084fb29b15706943c845f381b31175c803a874f1c06cca889cce74b6c514e8360400151846060015185608001518660a001518760c001518860e00151896101000151604051610cd8979695949392919061348d565b60405180910390a150505050505050505050565b6001546001600160a01b03163314610d1757604051636381e58960e11b815260040161049b906131fc565b610d416040518060600160405280600063ffffffff16815260200160608152602001606081525090565b610d4b81836121d0565b805163ffffffff1660021415610f75576002546040805163245b04c360e11b815290516000926001600160a01b0316916348b60986916004808301926020929190829003018187875af1158015610da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dca91906133b2565b90507fdf66e1002506099c97d0586fa8961a6b5d3a053c5fc7847871fb6d1949b3956786868684604051610e019493929190613500565b60405180910390a180610f0857600382526040805180820190915260168152754d69644d6f6e69746f72696e67206e6f74207061737360501b6020808301919091528301526001546001600160a01b031663a1a5d522878787610e6387611f63565b6040518563ffffffff1660e01b8152600401610e82949392919061353a565b600060405180830381600087803b158015610e9c57600080fd5b505af1158015","610eb0573d6000803e3d6000fd5b505050507fae157f6f3df55f75f9c968c6831e22770c1838279975edd8309a6a195c9919628260000151610ee386612364565b88888660200151604051610efb959493929190613580565b60405180910390a1610f6f565b604080830151905163140e7af360e11b81526001600160a01b0386169163281cf5e691610f3c918a918a91906004016135bd565b600060405180830381600087803b158015610f5657600080fd5b505af1158015610f6a573d6000803e3d6000fd5b505050505b50611103565b805163ffffffff166003141561103f57604080820151905163140e7af360e11b81526001600160a01b0385169163281cf5e691610fb99189918991906004016135bd565b600060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050507fc3c2529b09575e765cf063f55a18083fa583585b31cbd56316070e432079d1688160000151868661101c87612364565b85602001516040516110329594939291906135e8565b60405180910390a1611103565b805163ffffffff16600114156110ba57604080820151905163140e7af360e11b81526001600160a01b0385169163281cf5e6916110839189918991906004016135bd565b600060405180830381600087803b15801561109d57600080fd5b505af11580156110b1573d6000803e3d6000fd5b50505050611103565b604051636381e58960e11b815260206004820152601f60248201527f4d6f6e69746f725f4d73673a2077726f6e67206d6f6e69746f72207479706500604482015260640161049b565b5050505050565b6001546001600160a01b0316331461113557604051636381e58960e11b815260040161049b906131fc565b61115f6040518060600160405280600063ffffffff16815260200160608152602001606081525090565b61116981836121d0565b805163ffffffff16600214156112b5576002546040805163245b04c360e11b815290516000926001600160a01b0316916348b60986916004808301926020929190829003018187875af11580156111c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e891906133b2565b90507fdf66e1002506099c97d0586fa8961a6b5d3a053c5fc7847871fb6d1949b395678686868460405161121f9493929190613500565b60405180910390a18061128157600382526040805180820190915260168152754d69644d6f6e69746f72696e67206e6f74207061737360501b6020808301919091528301526001546001600160a01b031663910e45af878787610e6387611f63565b604080830151905163e5b813ad60e01b81526001600160a01b0386169163e5b813ad91610f3c918a918a91906004016135bd565b805163ffffffff16600314156112f957604080820151905163e5b813ad60e01b81526001600160a01b0385169163e5b813ad91610fb99189918991906004016135bd565b805163ffffffff16600114156110ba57604080820151905163e5b813ad60e01b81526001600160a01b0385169163e5b813ad916110839189918991906004016135bd565b6000546001600160a01b0316331461136857604051636381e58960e11b815260040161049b90613245565b6001600160a01b0381166113d457604051636381e58960e11b815260206004820152602c60248201527f4d6f6e69746f724d73673a20696e76616c6964204d6f6e69746f72566572696660448201526b1a595c8818dbdb9d1c9858dd60a21b606482015260840161049b565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461142157604051636381e58960e11b815260040161049b906131fc565b61144b6040518060600160405280600063ffffffff16815260200160608152602001606081525090565b61145581846121d0565b6040808201519051631a82fba360e31b81526001600160a01b038b169163d417dd1891611490918c918c918c918c918c918b90600401613625565b600060405180830381600087803b1580156114aa57600080fd5b505af11580156114be573d6000803e3d6000fd5b50505050505050505050505050565b6000546001600160a01b031633146114f857604051636381e58960e11b815260040161049b90613245565b63ffffffff811660011480611513575063ffffffff81166002145b80611524575063ffffffff81166003145b61157d57604051636381e58960e11b815260206004820152602360248201527f4d6f6e69746f724d73673a20696e76616c6964206d6f6e69746f7220636f6e746044820152621c9bdb60ea1b606482015260840161049b565b6002805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6001546001600160a01b031633146115ce57604051636381e58960e11b815260040161049b906131fc565b6115f86040518060600160405280600063ffffffff16815260200160608152602001606081525090565b61160281836121d0565b604080820151905163fbec456360e01b81526001600160a01b038a169163fbec45639161163b918b918b918b918b918b91600401613671565b600060405180830381600087803b15801561165557600080fd5b505af1158015611669573d6000803e3d6000fd5b505050505050505050505050565b600054600160a81b900460ff161580801561169f57506000546001600160a01b90910460ff16105b806116c05750303b1580156116c05750600054600160a01b900460ff166001145b61172457604051636381e58960e11b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161049b565b6000805460ff60a01b1916600160a01b1790558015611751576000805460ff60a81b1916600160a81b1790555b61175a33611dfd565b8015610552576000805460ff60a81b19169055604051600181527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa9060200160405180910390a150565b6001546000906001600160a01b031633146117d257604051636381e58960e11b815260040161049b906131fc565b60006117e2868a8a8a8888612377565b600154604051636e29b4fb60e01b81529192506001600160a01b031690636e29b4fb9061181d908c908c908c908c908c9089906004016136bd565b6020604051808303816000875af115801561183c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118609190613701565b9998505050505050505050565b6001546000906001600160a01b0316331461189b57604051636381e58960e11b815260040161049b906131fc565b60006118ab888c8c8c8a8a612377565b600154604051633a1fda0f60e21b81529192506001600160a01b03169063e87f683c906118ea908e908e908e908e908e9089908d908d9060040161371a565b6020604051808303816000875af1158015611909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192d9190613701565b9b9a5050505050505050505050565b6001546000906001600160a01b0316331461196a57604051636381e58960e11b815260040161049b906131fc565b600061197a868a8a8a8888612377565b60015460405163af9bca8760e01b81529192506001600160a01b03169063af9bca879061181d908c908c908c908c908c9089906004016136bd565b60028054600160a01b900463ffffffff1614156119fe5760006119dc338787878787611e4d565b9050806119fc57604051636381e58960e11b815260040161049b9061327a565b505b60408051606081018252600254600160a01b900463ffffffff1681528151602080820184526000808352818401929092528351601f860182900482028101820185528581529193830191908690869081908401838280828437600092018290525093909452509293509150611a74905082611f63565b60015460405163910e45af60e01b81529192506001600160a01b03169063910e45af9061072a908a908a908a9033908890600401613327565b6000546001600160a01b03163314611ad857604051636381e58960e11b815260040161049b90613245565b611ae26000611dfd565b565b6001546000906001600160a01b03163314611b1257604051636381e58960e11b815260040161049b906131fc565b6000611b22888c8c8c8a8a612377565b6001546040516321b1d3f560e11b81529192506001600160a01b031690634363a7ea906118ea908e908e908e908e908e9089908d908d9060040161371a565b611b8b6040518060600160405280600063ffffffff16815260200160608152602001606081525090565b611b9581846121d0565b805163ffffffff1660021415611cb3576002546040805163245b04c360e11b815290516000926001600160a01b0316916348b60986916004808301926020929190829003018187875af1158015611bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1491906133b2565b90507fdf66e1002506099c97d0586fa8961a6b5d3a053c5fc7847871fb6d1949b3956787878784604051611c4b9493929190613500565b60405180910390a180611cad57604051636381e58960e11b815260206004820152602360248201527f4d6f6e69746f725f4d73673a204d69644d6f6e69746f72696e67206e6f74207060448201526261737360e81b606482015260840161049b565b50611d1d565b805163ffffffff1660011480611cd05750805163ffffffff166003145b611d1d57604051636381e58960e11b815260206004820152601f60248201527f4d6f6e69746f725f4d73673a2077726f6e67206d6f6e69746f72207479706500604482015260640161049b565b8115611d8e57604080820151905163e5b813ad60e01b81526001600160a01b0386169163e5b813ad91611d57918a918a91906004016135bd565b600060405180830381600087803b158015611d7157600080fd5b505af1158015611d85573d6000803e3d6000fd5b50505050611df5565b604080820151905163140e7af360e11b81526001600160a01b0386169163281cf5e691611dc2918a918a91906004016135bd565b600060405180830381600087803b158015611ddc57600080fd5b505af1158015611df0573d6000803e3d6000fd5b505050505b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b60008080611e5a89612364565b60008181526003602052604090205490915060ff1615611ebc577f44cb15bc5a0120111ba9bed4b1618a72a94b91b49d838e455dac96dcd9024d628189898960016000604051611e","af96959493929190613779565b60405180910390a1611f55565b60008681526004602052604090205460ff1615611f0d577f44cb15bc5a0120111ba9bed4b1618a72a94b91b49d838e455dac96dcd9024d6281898989600180604051611eaf96959493929190613779565b7fd7552d1b36b2180e899403be127ca54cd598bb983a15b2aca4b78184a2c11b9681898989604051611f4294939291906137b5565b60405180910390a1600192505050611f59565b5090505b9695505050505050565b60606000611f74836040015161243b565b611f81846020015161243b565b611f8c9060046137e0565b611f9691906137e0565b90506000816001600160401b03811115611fb257611fb2612be9565b6040519080825280601f01601f191660200182016040528015611fdc576020820181803683370190505b508451838201600319810180519290915252905081611ffb602061248d565b61200590826137f8565b905061201681866020015184612498565b612023856020015161243b565b61202d90826137f8565b905061203e81866040015184612498565b61204b856040015161243b565b61205590826137f8565b5090949350505050565b8051600061206d82846124f6565b80855280519091506120809060046137e0565b61208a90836137f8565b9150600061209883856124f6565b6020860181905280519091506120af9060046137e0565b6120b990846137f8565b92506120c58385015190565b63ffffffff1660408601526120db6004846137f8565b925060006120e984866124f6565b6060870181905280519091506121009060046137e0565b61210a90856137f8565b93506121168486015190565b60808701526121266020856137f8565b9350600061213485876124f6565b60a08801819052805190915061214b9060046137e0565b61215590866137f8565b94506121618587015190565b60c08801526121716020866137f8565b9450600061217f86886124f6565b60e0890181905280519091506121969060046137e0565b6121a090876137f8565b955060006121ae87896124f6565b6101008a0181905280519091506121c69060046137e0565b611df090886137f8565b8051604481101561223257604051636381e58960e11b815260206004820152602560248201527f4d6f6e69746f724c69623a206d616c666f726d6564206d6f6e69746f72206d65604482015264737361676560d81b606482015260840161049b565b61223c82826125fd565b63ffffffff168084526001148061225a5750825163ffffffff166002145b8061226c5750825163ffffffff166003145b6122b957604051636381e58960e11b815260206004820181905260248201527f4d6f6e69746f724c69623a20696e76616c6964206d6f6e69746f722074797065604482015260640161049b565b6122c36020612705565b6122cd90826137f8565b90506060806122dc8484612934565b935091506122ea8484612934565b93509050821561234f57604051636381e58960e11b815260206004820152602960248201527f4d6f6e69746f724c69623a20747261696c696e67206d6f6e69746f72206d657360448201526873616765206461746160b81b606482015260840161049b565b60208501919091526040909301929092525050565b60008061237083612b9c565b9392505050565b60028054606091600160a01b90910463ffffffff1614156123bd576123a0878787878787611e4d565b6123bd57604051636381e58960e11b815260040161049b9061327a565b60408051606081018252600254600160a01b900463ffffffff1681528151602080820184526000808352818401929092528351601f8701829004820281018201855286815291938301919087908790819084018382808284376000920191909152505050915250905061242f81611f63565b98975050505050505050565b60006020825161244b9190613825565b90506020825161245b9190613839565b1561246e578061246a8161384d565b9150505b806124788161384d565b91506124879050602082613868565b92915050565b600061248782612705565b6000602083516124a89190613825565b90506000602084516124ba9190613839565b11156124ce57806124ca8161384d565b9150505b60010160005b81811015611103576020810284015183860152601f19909401936001016124d4565b606060006125048484015190565b63ffffffff1690506125176004856137f8565b93508381111561258357604051636381e58960e11b815260206004820152603060248201527f6279746573546f56617242797465733a206f6666736574206c6573732074686160448201526f6e206c656e677468206f6620626f647960801b606482015260840161049b565b61258d81856137f8565b93506060811580156125aa576040519150602082016040526125f4565b6040519150601f8316801560200281840101848101888315602002848a0101015b818310156125e35780518352602092830192016125cb565b5050848452601f01601f1916604052505b50949350505050565b600060048210158015612611575082518211155b61265e57604051636381e58960e11b815260206004820181905260248201527f4d6f6e69746f724c69623a2075696e743332206f7574206f6620626f756e6473604482015260640161049b565b8261266a6001846137f8565b8151811061267a5761267a613457565b016020015160f81c6008846126906002866137f8565b815181106126a0576126a0613457565b016020015160f81c901b6010856126b86003876137f8565b815181106126c8576126c8613457565b016020015160f81c901b6018866126e06004886137f8565b815181106126f0576126f0613457565b016020015160f81c901b171717905092915050565b60008160088114612812576010811461281b5760188114612824576020811461282d5760288114612836576030811461283f57603881146128485760408114612851576048811461285a5760508114612863576058811461286c5760608114612875576068811461287e57607081146128875760788114612890576080811461289957608881146128a257609081146128ab57609881146128b45760a081146128bd5760a881146128c65760b081146128cf5760b881146128d85760c081146128e15760c881146128ea5760d081146128f35760d881146128fc5760e081146129055760e8811461290e5760f081146129175760f88114612920576101008114612929576020915061292e565b6001915061292e565b6002915061292e565b6003915061292e565b6004915061292e565b6005915061292e565b6006915061292e565b6007915061292e565b6008915061292e565b6009915061292e565b600a915061292e565b600b915061292e565b600c915061292e565b600d915061292e565b600e915061292e565b600f915061292e565b6010915061292e565b6011915061292e565b6012915061292e565b6013915061292e565b6014915061292e565b6015915061292e565b6016915061292e565b6017915061292e565b6018915061292e565b6019915061292e565b601a915061292e565b601b915061292e565b601c915061292e565b601d915061292e565b601e915061292e565b601f915061292e565b602091505b50919050565b60606000602083101561299657604051636381e58960e11b8152602060048201526024808201527f4d6f6e69746f724c69623a206d616c666f726d6564207661726961626c6520626044820152637974657360e01b606482015260840161049b565b60006129a285856125fd565b63ffffffff169050600060206129b983601f6137e0565b6129c39190613825565b905060006129d2826020613868565b90506129df8160206137e0565b861015612a4057604051636381e58960e11b815260206004820152602860248201527f4d6f6e69746f724c69623a207661726961626c65206279746573206f7574206f6044820152676620626f756e647360c01b606482015260840161049b565b80612a4c6020886137f8565b612a5691906137f8565b9350826001600160401b03811115612a7057612a70612be9565b6040519080825280601f01601f191660200182016040528015612a9a576020820181803683370190505b50945060005b82811015612b9157600081612ab66001866137f8565b612ac091906137f8565b612acb906020613868565b612ad590876137e0565b90506000612ae4836020613868565b90506000612af282886137f8565b90506020811115612b01575060205b60005b81811015612b7a578b612b1782866137e0565b81518110612b2757612b27613457565b01602001516001600160f81b0319168a612b4183866137e0565b81518110612b5157612b51613457565b60200101906001600160f81b031916908160001a90535080612b728161384d565b915050612b04565b505050508080612b899061384d565b915050612aa0565b505050509250929050565b6040805160208082528183019092526000918291906020820181803683375050506020018390525090919050565b6040518061010001604052806008906020820280368337509192915050565b63b95aa35560e01b600052604160045260246000fd5b600082601f830112612c1057600080fd5b81356001600160401b0380821115612c2a57612c2a612be9565b604051601f8301601f19908116603f01168101908282118183101715612c5257612c52612be9565b81604052838152866020858801011115612c6b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b80356001600160a01b0381168114612ca257600080fd5b919050565b60008060008060808587031215612cbd57600080fd5b84356001600160401b0380821115612cd457600080fd5b612ce088838901612bff565b955060208701359450612cf560408801612c8b565b93506060870135915080821115612d0b57600080fd5b50612d1887828801612bff565b91505092959194509250565b600060208284031215612d3657600080fd5b61237082612c8b565b60008083601f840112612d5157600080fd5b5081356001600160401b03811115612d6857600080fd5b602083019150836020828501011115612d8057600080fd5b9250929050565b600080600080600060608688031215612d9f57600080fd5b85356001600160401b0380821115612db657600080fd5b612dc289838a01612d3f565b9097509550602088013594506040880135915080821115612de257600080fd5b50612def88828901612d3f565b969995985093965092949392505050565b60008060008060008060808789031215612e1957600080fd5b86356001600160401b0380821115612e3057600080fd5b612e3c8a838b01612d3f565b90985096506020890135915080821115612e5557600080fd5b612e618a838b01612d3f565b90965094506040890135915080821115612e7a57600080fd5b612e868a838b01612bff565b93506060890135915080821115612e9c57600080fd5b50612ea98982","8a01612bff565b9150509295509295509295565b600060208284031215612ec857600080fd5b5035919050565b803563ffffffff81168114612ca257600080fd5b80356001600160401b0381168114612ca257600080fd5b600080600080600080600080610100898b031215612f1757600080fd5b612f2089612c8b565b97506020890135965060408901356001600160401b0380821115612f4357600080fd5b612f4f8c838d01612bff565b975060608b01359650612f6460808c01612ecf565b9550612f7260a08c01612ee3565b945060c08b0135915080821115612f8857600080fd5b612f948c838d01612bff565b935060e08b0135915080821115612faa57600080fd5b50612fb78b828c01612bff565b9150509295985092959890939650565b600060208284031215612fd957600080fd5b61237082612ecf565b600080600080600080600060e0888a031215612ffd57600080fd5b61300688612c8b565b96506020880135955060408801356001600160401b038082111561302957600080fd5b6130358b838c01612bff565b965060608a0135955061304a60808b01612ecf565b945061305860a08b01612ee3565b935060c08a013591508082111561306e57600080fd5b5061307b8a828b01612bff565b91505092959891949750929550565b801515811461055257600080fd5b600080600080600080600060a0888a0312156130b357600080fd5b87356001600160401b03808211156130ca57600080fd5b6130d68b838c01612d3f565b909950975060208a013596508791506130f160408b01612c8b565b955060608a013591506131038261308a565b9093506080890135908082111561311957600080fd5b506131268a828b01612d3f565b989b979a50959850939692959293505050565b600080600080600080600080600060e08a8c03121561315757600080fd5b89356001600160401b038082111561316e57600080fd5b61317a8d838e01612d3f565b909b50995060208c0135985089915061319560408d01612c8b565b975060608c013591506131a78261308a565b90955060808b013590808211156131bd57600080fd5b506131ca8c828d01612d3f565b90955093505060a08a013560ff811681146131e457600080fd5b8092505060c08a013590509295985092959850929598565b60208082526029908201527f4d6f6e69746f724d73673a2073656e646572206e6f742076616c6964207375626040820152680b5c1c9bdd1bd8dbdb60ba1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f6265666f726568616e64204d6f6e69746f7220646973617070726f76616c0000604082015260600190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845260005b81811015613300576020818501810151868301820152016132e4565b81811115613312576000602083870101525b50601f01601f19169290920160200192915050565b60808152600061333b6080830187896132b1565b602083018690526001600160a01b0385166040840152828103606084015261242f81856132da565b60808152600061337760808301888a6132b1565b828103602084015261338a8187896132b1565b9050828103604084015261339e81866132da565b9050828103606084015261186081856132da565b6000602082840312156133c457600080fd5b81516123708161308a565b6040815260006133e36040830185876132b1565b90508215156020830152949350505050565b63b95aa35560e01b600052601160045260246000fd5b600060ff821660ff84168160ff048111821515161561342c5761342c6133f5565b029392505050565b600060ff821660ff84168082101561344e5761344e6133f5565b90039392505050565b63b95aa35560e01b600052603260045260246000fd5b600060ff821660ff811415613484576134846133f5565b60010192915050565b63ffffffff8816815260e0602082015260006134ac60e08301896132da565b87604084015282810360608401526134c481886132da565b905085608084015282810360a08401526134de81866132da565b905082810360c08401526134f281856132da565b9a9950505050505050505050565b60808152600061351360808301876132da565b6020830195909552506001600160a01b039290921660408301521515606090910152919050565b60808152600061354d60808301876132da565b602083018690526001600160a01b0385166040840152828103606084015261357581856132da565b979650505050505050565b63ffffffff8616815284602082015260a0604082015260006135a560a08301866132da565b846060840152828103608084015261242f81856132da565b6060815260006135d060608301866132da565b8460208401528281036040840152611f5981856132da565b63ffffffff8616815260a06020820152600061360760a08301876132da565b856040840152846060840152828103608084015261242f81856132da565b87815260e06020820152600061363e60e08301896132da565b87604084015263ffffffff871660608401526001600160401b038616608084015282810360a08401526134de81866132da565b86815260c06020820152600061368a60c08301886132da565b86604084015263ffffffff861660608401526001600160401b038516608084015282810360a084015261186081856132da565b60a0815260006136d160a08301888a6132b1565b602083018790526001600160a01b03861660408401528415156060840152828103608084015261186081856132da565b60006020828403121561371357600080fd5b5051919050565b60e08152600061372e60e083018a8c6132b1565b602083018990526001600160a01b03881660408401528615156060840152828103608084015261375e81876132da565b60ff9590951660a0840152505060c001529695505050505050565b86815260a06020820152600061379360a0830187896132b1565b60408301959095525060ff928316606082015291166080909101529392505050565b8481526060602082015260006137cf6060830185876132b1565b905082604083015295945050505050565b600082198211156137f3576137f36133f5565b500190565b60008282101561380a5761380a6133f5565b500390565b63b95aa35560e01b600052601260045260246000fd5b6000826138345761383461380f565b500490565b6000826138485761384861380f565b500690565b6000600019821415613861576138616133f5565b5060010190565b6000816000190483118215151615613882576138826133f5565b50029056fea2646970667358221220efacf197b53ff9df6ff943dc7562e4e2146b83ac299678a94953c2779250195f64736f6c634300080b0033"}; + + public static final String SM_BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", SM_BINARY_ARRAY); + + public static final String[] ABI_ARRAY = {"[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"}],\"name\":\"MonitorApproval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"monitorMainType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"monitorSubType\",\"type\":\"uint8\"}],\"name\":\"MonitorDisapproval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"name\":\"VerifyMonitorNodeProofMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"committeeId\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"name\":\"VerifyMonitorOrder\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"monitorType\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"transactionContent\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"extra\",\"type\":\"string\"}],\"name\":\"receiveMonitorOrder\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"monitorType\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"monitorMsg\",\"type\":\"string\"}],\"name\":\"receiveMonitorRollbackMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"monitorType\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"monitorMsg\",\"type\":\"string\"}],\"name\":\"sendMonitorRollbakMessage\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"IMPLEMENTATION_VERSION\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"errorMsg\",\"type\":\"string\"}],\"name\":\"ackOnErrorFromSDP\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiver\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"ackOnSuccessFromSDP\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getImplementationVersion\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMonitorControl\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMonitorVerifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProtocol\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"monitorControl\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"monitorVerifierAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"receiverBlacklist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"recvMessageFromSDP\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"recvMessageV2FromSDP\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"recvMessageV3FromSDP\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"committeeId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"signAlgo\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"rawProof\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rawMonitorOrder\",\"type\":\"bytes\"}],\"name\":\"recvMonitorOrder\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"recvUnorderedMessageFromSDP\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"recvUnorderedMessageV2FromSDP\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"t","ype\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"author\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"recvUnorderedMessageV3FromSDP\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sdpAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendMonitorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"senderID\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendMonitorMessageV2\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"senderID\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"timeoutMeasure\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"}],\"name\":\"sendMonitorMessageV3\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendUnorderedMonitorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"senderID\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendUnorderedMonitorMessageV2\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"senderID\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"timeoutMeasure\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"}],\"name\":\"sendUnorderedMonitorMessageV3\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"senderBlacklist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"monitorType\",\"type\":\"uint32\"}],\"name\":\"setMonitorControl\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMonitorVerifierAddress\",\"type\":\"address\"}],\"name\":\"setMonitorVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"protocolAddress\",\"type\":\"address\"}],\"name\":\"setProtocol\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"}; + + public static final String ABI = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", ABI_ARRAY); + + public static final String FUNC_IMPLEMENTATION_VERSION = "IMPLEMENTATION_VERSION"; + + public static final String FUNC_ACKONERRORFROMSDP = "ackOnErrorFromSDP"; + + public static final String FUNC_ACKONSUCCESSFROMSDP = "ackOnSuccessFromSDP"; + + public static final String FUNC_GETIMPLEMENTATIONVERSION = "getImplementationVersion"; + + public static final String FUNC_GETMONITORCONTROL = "getMonitorControl"; + + public static final String FUNC_GETMONITORVERIFIER = "getMonitorVerifier"; + + public static final String FUNC_GETPROTOCOL = "getProtocol"; + + public static final String FUNC_INIT = "init"; + + public static final String FUNC_MONITORCONTROL = "monitorControl"; + + public static final String FUNC_MONITORVERIFIERADDRESS = "monitorVerifierAddress"; + + public static final String FUNC_OWNER = "owner"; + + public static final String FUNC_RECEIVERBLACKLIST = "receiverBlacklist"; + + public static final String FUNC_RECVMESSAGEFROMSDP = "recvMessageFromSDP"; + + public static final String FUNC_RECVMESSAGEV2FROMSDP = "recvMessageV2FromSDP"; + + public static final String FUNC_RECVMESSAGEV3FROMSDP = "recvMessageV3FromSDP"; + + public static final String FUNC_RECVMONITORORDER = "recvMonitorOrder"; + + public static final String FUNC_RECVUNORDEREDMESSAGEFROMSDP = "recvUnorderedMessageFromSDP"; + + public static final String FUNC_RECVUNORDEREDMESSAGEV2FROMSDP = "recvUnorderedMessageV2FromSDP"; + + public static final String FUNC_RECVUNORDEREDMESSAGEV3FROMSDP = "recvUnorderedMessageV3FromSDP"; + + public static final String FUNC_RENOUNCEOWNERSHIP = "renounceOwnership"; + + public static final String FUNC_SDPADDRESS = "sdpAddress"; + + public static final String FUNC_SENDMONITORMESSAGE = "sendMonitorMessage"; + + public static final String FUNC_SENDMONITORMESSAGEV2 = "sendMonitorMessageV2"; + + public static final String FUNC_SENDMONITORMESSAGEV3 = "sendMonitorMessageV3"; + + public static final String FUNC_SENDUNORDEREDMONITORMESSAGE = "sendUnorderedMonitorMessage"; + + public static final String FUNC_SENDUNORDEREDMONITORMESSAGEV2 = "sendUnorderedMonitorMessageV2"; + + public static final String FUNC_SENDUNORDEREDMONITORMESSAGEV3 = "sendUnorderedMonitorMessageV3"; + + public static final String FUNC_SENDERBLACKLIST = "senderBlacklist"; + + public static final String FUNC_SETMONITORCONTROL = "setMonitorControl"; + + public static final String FUNC_SETMONITORVERIFIER = "setMonitorVerifier"; + + public static final String FUNC_SETPROTOCOL = "setProtocol"; + + public static final String FUNC_TRANSFEROWNERSHIP = "transferOwnership"; + + public static final Event INITIALIZED_EVENT = new Event("Initialized", + Arrays.>asList(new TypeReference() {})); + ; + + public static final Event MONITORAPPROVAL_EVENT = new Event("MonitorApproval", + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + ; + + public static final Event MONITORDISAPPROVAL_EVENT = new Event("MonitorDisapproval", + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + ; + + public static final Event OWNERSHIPTRANSFERRED_EVENT = new Event("OwnershipTransferred", + Arrays.>asList(new TypeReference
(true) {}, new TypeReference
(true) {})); + ; + + public static final Event VERIFYMONITORNODEPROOFMESSAGE_EVENT = new Event("VerifyMonitorNodeProofMessage", + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {})); + ; + + public static final Event VERIFYMONITORORDER_EVENT = new Event("VerifyMonitorOrder", + Arrays.>asList(new TypeReference() {}, new TypeReference() {})); + ; + + public static final Event RECEIVEMONITORORDER_EVENT = new Event("receiveMonitorOrder", + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + ; + + public static final Event RECEIVEMONITORROLLBACKMESSAGE_EVENT = new Event("receiveMonitorRollbackMessage", + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + ; + + public static final Event SENDMONITORROLLBAKMESSAGE_EVENT = new Event("sendMonitorRollbakMessage", + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + ; + + protected Monitor(String contractAddress, Client client, CryptoKeyPair credential) { + super(getBinary(client.getCryptoSuite()), contractAddress, client, credential); + this.transactionManager = new ProxySignTransactionManager(client); + } + + public static String getBinary(CryptoSuite cryptoSuite) { + return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY); + } + + public static String getABI() { + return ABI; + } + + public List getInitializedEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(INITIALIZED_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + InitializedEventResponse typedResponse = new InitializedEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.version = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeInitializedEvent(BigInteger fromBlock, BigInteger toBlock, + List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(INITIALIZED_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeInitializedEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(INITIALIZED_EVENT); + subscribeEvent(topic0,callback); + } + + public List getMonitorApprovalEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(MONITORAPPROVAL_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + MonitorApprovalEventResponse typedResponse = new MonitorApprovalEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.senderID = (byte[]) eventValues.getNonIndexedValues().get(0).getValue(); + typedResponse.receiverDomain = (String) eventValues.getNonIndexedValues().get(1).getValue(); + typedResponse.receiverID = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeMonitorApprovalEvent(BigInteger fromBlock, BigInteger toBlock, + List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(MONITORAPPROVAL_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeMonitorApprovalEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(MONITORAPPROVAL_EVENT); + subscribeEvent(topic0,callback); + } + + public List getMonitorDisapprovalEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(MONITORDISAPPROVAL_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + MonitorDisapprovalEventResponse typedResponse = new MonitorDisapprovalEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.senderID = (byte[]) eventValues.getNonIndexedValues().get(0).getValue(); + typedResponse.receiverDomain = (String) eventValues.getNonIndexedValues().get(1).getValue(); + typedResponse.receiverID = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); + typedResponse.monitorMainType = (BigInteger) eventValues.getNonIndexedValues().get(3).getValue(); + typedResponse.monitorSubType = (BigInteger) eventValues.getNonIndexedValues().get(4).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeMonitorDisapprovalEvent(BigInteger fromBlock, BigInteger toBlock, + List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(MONITORDISAPPROVAL_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeMonitorDisapprovalEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(MONITORDISAPPROVAL_EVENT); + subscribeEvent(topic0,callback); + } + + public List getOwnershipTransferredEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(OWNERSHIPTRANSFERRED_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + OwnershipTransferredEventResponse typedResponse = new OwnershipTransferredEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.previousOwner = (String) eventValues.getIndexedValues().get(0).getValue(); + typedResponse.newOwner = (String) eventValues.getIndexedValues().get(1).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeOwnershipTransferredEvent(BigInteger fromBlock, BigInteger toBlock, + List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(OWNERSHIPTRANSFERRED_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeOwnershipTransferredEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(OWNERSHIPTRANSFERRED_EVENT); + subscribeEvent(topic0,callback); + } + + public List getVerifyMonitorNodeProofMessageEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(VERIFYMONITORNODEPROOFMESSAGE_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + VerifyMonitorNodeProofMessageEventResponse typedResponse = new VerifyMonitorNodeProofMessageEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.senderDomain = (String) eventValues.getNonIndexedValues().get(0).getValue(); + typedResponse.author = (byte[]) eventValues.getNonIndexedValues().get(1).getValue(); + typedResponse.receiverID = (String) eventValues.getNonIndexedValues().get(2).getValue(); + typedResponse.result = (Boolean) eventValues.getNonIndexedValues().get(3).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeVerifyMonitorNodeProofMessageEvent(BigInteger fromBlock, + BigInteger toBlock, List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(VERIFYMONITORNODEPROOFMESSAGE_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeVerifyMonitorNodeProofMessageEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(VERIFYMONITORNODEPROOFMESSAGE_EVENT); + subscribeEvent(topic0,callback); + } + + public List getVerifyMonitorOrderEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(VERIFYMONITORORDER_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + VerifyMonitorOrderEventResponse typedResponse = new VerifyMonitorOrderEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.committeeId = (String) eventValues.getNonIndexedValues().get(0).getValue(); + typedResponse.result = (Boolean) eventValues.getNonIndexedValues().get(1).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeVerifyMonitorOrderEvent(BigInteger fromBlock, BigInteger toBlock, + List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(VERIFYMONITORORDER_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeVerifyMonitorOrderEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(VERIFYMONITORORDER_EVENT); + subscribeEvent(topic0,callback); + } + + public List getReceiveMonitorOrderEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(RECEIVEMONITORORDER_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + ReceiveMonitorOrderEventResponse typedResponse = new ReceiveMonitorOrderEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.monitorType = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); + typedResponse.senderDomain = (String) eventValues.getNonIndexedValues().get(1).getValue(); + typedResponse.sender = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); + typedResponse.receiverDomain = (String) eventValues.getNonIndexedValues().get(3).getValue(); + typedResponse.receiver = (byte[]) eventValues.getNonIndexedValues().get(4).getValue(); + typedResponse.transactionContent = (String) eventValues.getNonIndexedValues().get(5).getValue(); + typedResponse.extra = (String) eventValues.getNonIndexedValues().get(6).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeReceiveMonitorOrderEvent(BigInteger fromBlock, BigInteger toBlock, + List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(RECEIVEMONITORORDER_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeReceiveMonitorOrderEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(RECEIVEMONITORORDER_EVENT); + subscribeEvent(topic0,callback); + } + + public List getReceiveMonitorRollbackMessageEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(RECEIVEMONITORROLLBACKMESSAGE_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + ReceiveMonitorRollbackMessageEventResponse typedResponse = new ReceiveMonitorRollbackMessageEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.monitorType = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); + typedResponse.senderDomain = (String) eventValues.getNonIndexedValues().get(1).getValue(); + typedResponse.sender = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); + typedResponse.receiver = (byte[]) eventValues.getNonIndexedValues().get(3).getValue(); + typedResponse.monitorMsg = (String) eventValues.getNonIndexedValues().get(4).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeReceiveMonitorRollbackMessageEvent(BigInteger fromBlock, + BigInteger toBlock, List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(RECEIVEMONITORROLLBACKMESSAGE_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeReceiveMonitorRollbackMessageEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(RECEIVEMONITORROLLBACKMESSAGE_EVENT); + subscribeEvent(topic0,callback); + } + + public List getSendMonitorRollbakMessageEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(SENDMONITORROLLBAKMESSAGE_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + SendMonitorRollbakMessageEventResponse typedResponse = new SendMonitorRollbakMessageEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.monitorType = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); + typedResponse.sender = (byte[]) eventValues.getNonIndexedValues().get(1).getValue(); + typedResponse.receiverDomain = (String) eventValues.getNonIndexedValues().get(2).getValue(); + typedResponse.receiver = (byte[]) eventValues.getNonIndexedValues().get(3).getValue(); + typedResponse.monitorMsg = (String) eventValues.getNonIndexedValues().get(4).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeSendMonitorRollbakMessageEvent(BigInteger fromBlock, BigInteger toBlock, + List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(SENDMONITORROLLBAKMESSAGE_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeSendMonitorRollbakMessageEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(SENDMONITORROLLBAKMESSAGE_EVENT); + subscribeEvent(topic0,callback); + } + + public BigInteger IMPLEMENTATION_VERSION() throws ContractException { + final Function function = new Function(FUNC_IMPLEMENTATION_VERSION, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + return executeCallWithSingleValueReturn(function, BigInteger.class); + } + + public Function getMethodIMPLEMENTATION_VERSIONRawFunction() throws ContractException { + final Function function = new Function(FUNC_IMPLEMENTATION_VERSION, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public TransactionReceipt ackOnErrorFromSDP(String receiverID, byte[] messageId, + String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, + byte[] message, String errorMsg) { + final Function function = new Function( + FUNC_ACKONERRORFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodAckOnErrorFromSDPRawFunction(String receiverID, byte[] messageId, + String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, + byte[] message, String errorMsg) throws ContractException { + final Function function = new Function(FUNC_ACKONERRORFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForAckOnErrorFromSDP(String receiverID, byte[] messageId, + String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, + byte[] message, String errorMsg) { + final Function function = new Function( + FUNC_ACKONERRORFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String ackOnErrorFromSDP(String receiverID, byte[] messageId, String receiverDomain, + byte[] receiver, BigInteger sequence, BigInteger nonce, byte[] message, String errorMsg, + TransactionCallback callback) { + final Function function = new Function( + FUNC_ACKONERRORFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(errorMsg)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple8 getAckOnErrorFromSDPInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_ACKONERRORFROMSDP, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple8( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (byte[]) results.get(3).getValue(), + (BigInteger) results.get(4).getValue(), + (BigInteger) results.get(5).getValue(), + (byte[]) results.get(6).getValue(), + (String) results.get(7).getValue() + ); + } + + public TransactionReceipt ackOnSuccessFromSDP(String receiverID, byte[] messageId, + String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, + byte[] message) { + final Function function = new Function( + FUNC_ACKONSUCCESSFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodAckOnSuccessFromSDPRawFunction(String receiverID, byte[] messageId, + String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, + byte[] message) throws ContractException { + final Function function = new Function(FUNC_ACKONSUCCESSFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForAckOnSuccessFromSDP(String receiverID, byte[] messageId, + String receiverDomain, byte[] receiver, BigInteger sequence, BigInteger nonce, + byte[] message) { + final Function function = new Function( + FUNC_ACKONSUCCESSFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String ackOnSuccessFromSDP(String receiverID, byte[] messageId, String receiverDomain, + byte[] receiver, BigInteger sequence, BigInteger nonce, byte[] message, + TransactionCallback callback) { + final Function function = new Function( + FUNC_ACKONSUCCESSFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(messageId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiver), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(sequence), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint64(nonce), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple7 getAckOnSuccessFromSDPInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_ACKONSUCCESSFROMSDP, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple7( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (byte[]) results.get(3).getValue(), + (BigInteger) results.get(4).getValue(), + (BigInteger) results.get(5).getValue(), + (byte[]) results.get(6).getValue() + ); + } + + public BigInteger getImplementationVersion() throws ContractException { + final Function function = new Function(FUNC_GETIMPLEMENTATIONVERSION, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + return executeCallWithSingleValueReturn(function, BigInteger.class); + } + + public Function getMethodGetImplementationVersionRawFunction() throws ContractException { + final Function function = new Function(FUNC_GETIMPLEMENTATIONVERSION, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public BigInteger getMonitorControl() throws ContractException { + final Function function = new Function(FUNC_GETMONITORCONTROL, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + return executeCallWithSingleValueReturn(function, BigInteger.class); + } + + public Function getMethodGetMonitorControlRawFunction() throws ContractException { + final Function function = new Function(FUNC_GETMONITORCONTROL, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String getMonitorVerifier() throws ContractException { + final Function function = new Function(FUNC_GETMONITORVERIFIER, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodGetMonitorVerifierRawFunction() throws ContractException { + final Function function = new Function(FUNC_GETMONITORVERIFIER, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + + public String getProtocol() throws ContractException { + final Function function = new Function(FUNC_GETPROTOCOL, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodGetProtocolRawFunction() throws ContractException { + final Function function = new Function(FUNC_GETPROTOCOL, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + + public TransactionReceipt init() { + final Function function = new Function( + FUNC_INIT, + Arrays.asList(), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodInitRawFunction() throws ContractException { + final Function function = new Function(FUNC_INIT, + Arrays.asList(), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForInit() { + final Function function = new Function( + FUNC_INIT, + Arrays.asList(), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String init(TransactionCallback callback) { + final Function function = new Function( + FUNC_INIT, + Arrays.asList(), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public BigInteger monitorControl() throws ContractException { + final Function function = new Function(FUNC_MONITORCONTROL, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + return executeCallWithSingleValueReturn(function, BigInteger.class); + } + + public Function getMethodMonitorControlRawFunction() throws ContractException { + final Function function = new Function(FUNC_MONITORCONTROL, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String monitorVerifierAddress() throws ContractException { + final Function function = new Function(FUNC_MONITORVERIFIERADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodMonitorVerifierAddressRawFunction() throws ContractException { + final Function function = new Function(FUNC_MONITORVERIFIERADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + + public String owner() throws ContractException { + final Function function = new Function(FUNC_OWNER, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodOwnerRawFunction() throws ContractException { + final Function function = new Function(FUNC_OWNER, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + + public Boolean receiverBlacklist(byte[] param0) throws ContractException { + final Function function = new Function(FUNC_RECEIVERBLACKLIST, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), + Arrays.>asList(new TypeReference() {})); + return executeCallWithSingleValueReturn(function, Boolean.class); + } + + public Function getMethodReceiverBlacklistRawFunction(byte[] param0) throws ContractException { + final Function function = new Function(FUNC_RECEIVERBLACKLIST, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public TransactionReceipt recvMessageFromSDP(String senderDomain, byte[] author, + String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVMESSAGEFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodRecvMessageFromSDPRawFunction(String senderDomain, byte[] author, + String receiverID, byte[] message) throws ContractException { + final Function function = new Function(FUNC_RECVMESSAGEFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForRecvMessageFromSDP(String senderDomain, byte[] author, + String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVMESSAGEFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String recvMessageFromSDP(String senderDomain, byte[] author, String receiverID, + byte[] message, TransactionCallback callback) { + final Function function = new Function( + FUNC_RECVMESSAGEFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple4 getRecvMessageFromSDPInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_RECVMESSAGEFROMSDP, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple4( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (byte[]) results.get(3).getValue() + ); + } + + public TransactionReceipt recvMessageV2FromSDP(String senderDomain, byte[] author, + String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVMESSAGEV2FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodRecvMessageV2FromSDPRawFunction(String senderDomain, byte[] author, + String receiverID, byte[] message) throws ContractException { + final Function function = new Function(FUNC_RECVMESSAGEV2FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForRecvMessageV2FromSDP(String senderDomain, byte[] author, + String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVMESSAGEV2FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String recvMessageV2FromSDP(String senderDomain, byte[] author, String receiverID, + byte[] message, TransactionCallback callback) { + final Function function = new Function( + FUNC_RECVMESSAGEV2FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple4 getRecvMessageV2FromSDPInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_RECVMESSAGEV2FROMSDP, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple4( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (byte[]) results.get(3).getValue() + ); + } + + public TransactionReceipt recvMessageV3FromSDP(String senderDomain, byte[] author, + String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVMESSAGEV3FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodRecvMessageV3FromSDPRawFunction(String senderDomain, byte[] author, + String receiverID, byte[] message) throws ContractException { + final Function function = new Function(FUNC_RECVMESSAGEV3FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForRecvMessageV3FromSDP(String senderDomain, byte[] author, + String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVMESSAGEV3FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String recvMessageV3FromSDP(String senderDomain, byte[] author, String receiverID, + byte[] message, TransactionCallback callback) { + final Function function = new Function( + FUNC_RECVMESSAGEV3FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple4 getRecvMessageV3FromSDPInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_RECVMESSAGEV3FROMSDP, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple4( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (byte[]) results.get(3).getValue() + ); + } + + public TransactionReceipt recvMonitorOrder(String committeeId, String signAlgo, byte[] rawProof, + byte[] rawMonitorOrder) { + final Function function = new Function( + FUNC_RECVMONITORORDER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(committeeId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(signAlgo), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawProof), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawMonitorOrder)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodRecvMonitorOrderRawFunction(String committeeId, String signAlgo, + byte[] rawProof, byte[] rawMonitorOrder) throws ContractException { + final Function function = new Function(FUNC_RECVMONITORORDER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(committeeId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(signAlgo), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawProof), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawMonitorOrder)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForRecvMonitorOrder(String committeeId, String signAlgo, + byte[] rawProof, byte[] rawMonitorOrder) { + final Function function = new Function( + FUNC_RECVMONITORORDER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(committeeId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(signAlgo), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawProof), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawMonitorOrder)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String recvMonitorOrder(String committeeId, String signAlgo, byte[] rawProof, + byte[] rawMonitorOrder, TransactionCallback callback) { + final Function function = new Function( + FUNC_RECVMONITORORDER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(committeeId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(signAlgo), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawProof), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawMonitorOrder)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple4 getRecvMonitorOrderInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_RECVMONITORORDER, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple4( + + (String) results.get(0).getValue(), + (String) results.get(1).getValue(), + (byte[]) results.get(2).getValue(), + (byte[]) results.get(3).getValue() + ); + } + + public TransactionReceipt recvUnorderedMessageFromSDP(String senderDomain, byte[] author, + String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVUNORDEREDMESSAGEFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodRecvUnorderedMessageFromSDPRawFunction(String senderDomain, + byte[] author, String receiverID, byte[] message) throws ContractException { + final Function function = new Function(FUNC_RECVUNORDEREDMESSAGEFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForRecvUnorderedMessageFromSDP(String senderDomain, + byte[] author, String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVUNORDEREDMESSAGEFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String recvUnorderedMessageFromSDP(String senderDomain, byte[] author, String receiverID, + byte[] message, TransactionCallback callback) { + final Function function = new Function( + FUNC_RECVUNORDEREDMESSAGEFROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple4 getRecvUnorderedMessageFromSDPInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_RECVUNORDEREDMESSAGEFROMSDP, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple4( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (byte[]) results.get(3).getValue() + ); + } + + public TransactionReceipt recvUnorderedMessageV2FromSDP(String senderDomain, byte[] author, + String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVUNORDEREDMESSAGEV2FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodRecvUnorderedMessageV2FromSDPRawFunction(String senderDomain, + byte[] author, String receiverID, byte[] message) throws ContractException { + final Function function = new Function(FUNC_RECVUNORDEREDMESSAGEV2FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForRecvUnorderedMessageV2FromSDP(String senderDomain, + byte[] author, String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVUNORDEREDMESSAGEV2FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String recvUnorderedMessageV2FromSDP(String senderDomain, byte[] author, + String receiverID, byte[] message, TransactionCallback callback) { + final Function function = new Function( + FUNC_RECVUNORDEREDMESSAGEV2FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple4 getRecvUnorderedMessageV2FromSDPInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_RECVUNORDEREDMESSAGEV2FROMSDP, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple4( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (byte[]) results.get(3).getValue() + ); + } + + public TransactionReceipt recvUnorderedMessageV3FromSDP(String senderDomain, byte[] author, + String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVUNORDEREDMESSAGEV3FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodRecvUnorderedMessageV3FromSDPRawFunction(String senderDomain, + byte[] author, String receiverID, byte[] message) throws ContractException { + final Function function = new Function(FUNC_RECVUNORDEREDMESSAGEV3FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForRecvUnorderedMessageV3FromSDP(String senderDomain, + byte[] author, String receiverID, byte[] message) { + final Function function = new Function( + FUNC_RECVUNORDEREDMESSAGEV3FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String recvUnorderedMessageV3FromSDP(String senderDomain, byte[] author, + String receiverID, byte[] message, TransactionCallback callback) { + final Function function = new Function( + FUNC_RECVUNORDEREDMESSAGEV3FROMSDP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(author), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple4 getRecvUnorderedMessageV3FromSDPInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_RECVUNORDEREDMESSAGEV3FROMSDP, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple4( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (byte[]) results.get(3).getValue() + ); + } + + public TransactionReceipt renounceOwnership() { + final Function function = new Function( + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodRenounceOwnershipRawFunction() throws ContractException { + final Function function = new Function(FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForRenounceOwnership() { + final Function function = new Function( + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String renounceOwnership(TransactionCallback callback) { + final Function function = new Function( + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public String sdpAddress() throws ContractException { + final Function function = new Function(FUNC_SDPADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodSdpAddressRawFunction() throws ContractException { + final Function function = new Function(FUNC_SDPADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + + public TransactionReceipt sendMonitorMessage(String receiverDomain, byte[] receiverID, + byte[] message) { + final Function function = new Function( + FUNC_SENDMONITORMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendMonitorMessageRawFunction(String receiverDomain, byte[] receiverID, + byte[] message) throws ContractException { + final Function function = new Function(FUNC_SENDMONITORMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForSendMonitorMessage(String receiverDomain, + byte[] receiverID, byte[] message) { + final Function function = new Function( + FUNC_SENDMONITORMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendMonitorMessage(String receiverDomain, byte[] receiverID, byte[] message, + TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDMONITORMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple3 getSendMonitorMessageInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDMONITORMESSAGE, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple3( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (byte[]) results.get(2).getValue() + ); + } + + public TransactionReceipt sendMonitorMessageV2(String receiverDomain, byte[] receiverID, + String senderID, Boolean atomic, byte[] message) { + final Function function = new Function( + FUNC_SENDMONITORMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendMonitorMessageV2RawFunction(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message) throws + ContractException { + final Function function = new Function(FUNC_SENDMONITORMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String getSignedTransactionForSendMonitorMessageV2(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message) { + final Function function = new Function( + FUNC_SENDMONITORMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendMonitorMessageV2(String receiverDomain, byte[] receiverID, String senderID, + Boolean atomic, byte[] message, TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDMONITORMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple5 getSendMonitorMessageV2Input( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDMONITORMESSAGEV2, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple5( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (Boolean) results.get(3).getValue(), + (byte[]) results.get(4).getValue() + ); + } + + public Tuple1 getSendMonitorMessageV2Output(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getOutput(); + final Function function = new Function(FUNC_SENDMONITORMESSAGEV2, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (byte[]) results.get(0).getValue() + ); + } + + public TransactionReceipt sendMonitorMessageV3(String receiverDomain, byte[] receiverID, + String senderID, Boolean atomic, byte[] message, BigInteger timeoutMeasure, + BigInteger timeout) { + final Function function = new Function( + FUNC_SENDMONITORMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendMonitorMessageV3RawFunction(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message, + BigInteger timeoutMeasure, BigInteger timeout) throws ContractException { + final Function function = new Function(FUNC_SENDMONITORMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String getSignedTransactionForSendMonitorMessageV3(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message, + BigInteger timeoutMeasure, BigInteger timeout) { + final Function function = new Function( + FUNC_SENDMONITORMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendMonitorMessageV3(String receiverDomain, byte[] receiverID, String senderID, + Boolean atomic, byte[] message, BigInteger timeoutMeasure, BigInteger timeout, + TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDMONITORMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple7 getSendMonitorMessageV3Input( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDMONITORMESSAGEV3, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple7( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (Boolean) results.get(3).getValue(), + (byte[]) results.get(4).getValue(), + (BigInteger) results.get(5).getValue(), + (BigInteger) results.get(6).getValue() + ); + } + + public Tuple1 getSendMonitorMessageV3Output(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getOutput(); + final Function function = new Function(FUNC_SENDMONITORMESSAGEV3, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (byte[]) results.get(0).getValue() + ); + } + + public TransactionReceipt sendUnorderedMonitorMessage(String receiverDomain, byte[] receiverID, + byte[] message) { + final Function function = new Function( + FUNC_SENDUNORDEREDMONITORMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendUnorderedMonitorMessageRawFunction(String receiverDomain, + byte[] receiverID, byte[] message) throws ContractException { + final Function function = new Function(FUNC_SENDUNORDEREDMONITORMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForSendUnorderedMonitorMessage(String receiverDomain, + byte[] receiverID, byte[] message) { + final Function function = new Function( + FUNC_SENDUNORDEREDMONITORMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendUnorderedMonitorMessage(String receiverDomain, byte[] receiverID, + byte[] message, TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDUNORDEREDMONITORMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple3 getSendUnorderedMonitorMessageInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDUNORDEREDMONITORMESSAGE, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple3( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (byte[]) results.get(2).getValue() + ); + } + + public TransactionReceipt sendUnorderedMonitorMessageV2(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message) { + final Function function = new Function( + FUNC_SENDUNORDEREDMONITORMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendUnorderedMonitorMessageV2RawFunction(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message) throws + ContractException { + final Function function = new Function(FUNC_SENDUNORDEREDMONITORMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String getSignedTransactionForSendUnorderedMonitorMessageV2(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message) { + final Function function = new Function( + FUNC_SENDUNORDEREDMONITORMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendUnorderedMonitorMessageV2(String receiverDomain, byte[] receiverID, + String senderID, Boolean atomic, byte[] message, TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDUNORDEREDMONITORMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple5 getSendUnorderedMonitorMessageV2Input( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDUNORDEREDMONITORMESSAGEV2, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple5( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (Boolean) results.get(3).getValue(), + (byte[]) results.get(4).getValue() + ); + } + + public Tuple1 getSendUnorderedMonitorMessageV2Output( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getOutput(); + final Function function = new Function(FUNC_SENDUNORDEREDMONITORMESSAGEV2, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (byte[]) results.get(0).getValue() + ); + } + + public TransactionReceipt sendUnorderedMonitorMessageV3(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message, + BigInteger timeoutMeasure, BigInteger timeout) { + final Function function = new Function( + FUNC_SENDUNORDEREDMONITORMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendUnorderedMonitorMessageV3RawFunction(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message, + BigInteger timeoutMeasure, BigInteger timeout) throws ContractException { + final Function function = new Function(FUNC_SENDUNORDEREDMONITORMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String getSignedTransactionForSendUnorderedMonitorMessageV3(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message, + BigInteger timeoutMeasure, BigInteger timeout) { + final Function function = new Function( + FUNC_SENDUNORDEREDMONITORMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendUnorderedMonitorMessageV3(String receiverDomain, byte[] receiverID, + String senderID, Boolean atomic, byte[] message, BigInteger timeoutMeasure, + BigInteger timeout, TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDUNORDEREDMONITORMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(timeout)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple7 getSendUnorderedMonitorMessageV3Input( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDUNORDEREDMONITORMESSAGEV3, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple7( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (Boolean) results.get(3).getValue(), + (byte[]) results.get(4).getValue(), + (BigInteger) results.get(5).getValue(), + (BigInteger) results.get(6).getValue() + ); + } + + public Tuple1 getSendUnorderedMonitorMessageV3Output( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getOutput(); + final Function function = new Function(FUNC_SENDUNORDEREDMONITORMESSAGEV3, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (byte[]) results.get(0).getValue() + ); + } + + public Boolean senderBlacklist(byte[] param0) throws ContractException { + final Function function = new Function(FUNC_SENDERBLACKLIST, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), + Arrays.>asList(new TypeReference() {})); + return executeCallWithSingleValueReturn(function, Boolean.class); + } + + public Function getMethodSenderBlacklistRawFunction(byte[] param0) throws ContractException { + final Function function = new Function(FUNC_SENDERBLACKLIST, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public TransactionReceipt setMonitorControl(BigInteger monitorType) { + final Function function = new Function( + FUNC_SETMONITORCONTROL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(monitorType)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSetMonitorControlRawFunction(BigInteger monitorType) throws + ContractException { + final Function function = new Function(FUNC_SETMONITORCONTROL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(monitorType)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForSetMonitorControl(BigInteger monitorType) { + final Function function = new Function( + FUNC_SETMONITORCONTROL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(monitorType)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String setMonitorControl(BigInteger monitorType, TransactionCallback callback) { + final Function function = new Function( + FUNC_SETMONITORCONTROL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(monitorType)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple1 getSetMonitorControlInput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SETMONITORCONTROL, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (BigInteger) results.get(0).getValue() + ); + } + + public TransactionReceipt setMonitorVerifier(String newMonitorVerifierAddress) { + final Function function = new Function( + FUNC_SETMONITORVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorVerifierAddress)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSetMonitorVerifierRawFunction(String newMonitorVerifierAddress) throws + ContractException { + final Function function = new Function(FUNC_SETMONITORVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorVerifierAddress)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForSetMonitorVerifier(String newMonitorVerifierAddress) { + final Function function = new Function( + FUNC_SETMONITORVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorVerifierAddress)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String setMonitorVerifier(String newMonitorVerifierAddress, + TransactionCallback callback) { + final Function function = new Function( + FUNC_SETMONITORVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorVerifierAddress)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple1 getSetMonitorVerifierInput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SETMONITORVERIFIER, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (String) results.get(0).getValue() + ); + } + + public TransactionReceipt setProtocol(String protocolAddress) { + final Function function = new Function( + FUNC_SETPROTOCOL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSetProtocolRawFunction(String protocolAddress) throws + ContractException { + final Function function = new Function(FUNC_SETPROTOCOL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForSetProtocol(String protocolAddress) { + final Function function = new Function( + FUNC_SETPROTOCOL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String setProtocol(String protocolAddress, TransactionCallback callback) { + final Function function = new Function( + FUNC_SETPROTOCOL, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(protocolAddress)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple1 getSetProtocolInput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SETPROTOCOL, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (String) results.get(0).getValue() + ); + } + + public TransactionReceipt transferOwnership(String newOwner) { + final Function function = new Function( + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodTransferOwnershipRawFunction(String newOwner) throws + ContractException { + final Function function = new Function(FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForTransferOwnership(String newOwner) { + final Function function = new Function( + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String transferOwnership(String newOwner, TransactionCallback callback) { + final Function function = new Function( + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple1 getTransferOwnershipInput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_TRANSFEROWNERSHIP, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (String) results.get(0).getValue() + ); + } + + public static Monitor load(String contractAddress, Client client, CryptoKeyPair credential) { + return new Monitor(contractAddress, client, credential); + } + + public static Monitor deploy(Client client, CryptoKeyPair credential) throws ContractException { + return deploy(Monitor.class, client, credential, getBinary(client.getCryptoSuite()), getABI(), null, null); + } + + public static class InitializedEventResponse { + public TransactionReceipt.Logs log; + + public BigInteger version; + } + + public static class MonitorApprovalEventResponse { + public TransactionReceipt.Logs log; + + public byte[] senderID; + + public String receiverDomain; + + public byte[] receiverID; + } + + public static class MonitorDisapprovalEventResponse { + public TransactionReceipt.Logs log; + + public byte[] senderID; + + public String receiverDomain; + + public byte[] receiverID; + + public BigInteger monitorMainType; + + public BigInteger monitorSubType; + } + + public static class OwnershipTransferredEventResponse { + public TransactionReceipt.Logs log; + + public String previousOwner; + + public String newOwner; + } + + public static class VerifyMonitorNodeProofMessageEventResponse { + public TransactionReceipt.Logs log; + + public String senderDomain; + + public byte[] author; + + public String receiverID; + + public Boolean result; + } + + public static class VerifyMonitorOrderEventResponse { + public TransactionReceipt.Logs log; + + public String committeeId; + + public Boolean result; + } + + public static class ReceiveMonitorOrderEventResponse { + public TransactionReceipt.Logs log; + + public BigInteger monitorType; + + public String senderDomain; + + public byte[] sender; + + public String receiverDomain; + + public byte[] receiver; + + public String transactionContent; + + public String extra; + } + + public static class ReceiveMonitorRollbackMessageEventResponse { + public TransactionReceipt.Logs log; + + public BigInteger monitorType; + + public String senderDomain; + + public byte[] sender; + + public byte[] receiver; + + public String monitorMsg; + } + + public static class SendMonitorRollbakMessageEventResponse { + public TransactionReceipt.Logs log; + + public BigInteger monitorType; + + public byte[] sender; + + public String receiverDomain; + + public byte[] receiver; + + public String monitorMsg; + } +} diff --git a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/MonitorVerifier.java b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/MonitorVerifier.java new file mode 100644 index 00000000..d5b0a8ce --- /dev/null +++ b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/MonitorVerifier.java @@ -0,0 +1,751 @@ +package com.alipay.antchain.bridge.plugins.fiscobcos.abi; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.fisco.bcos.sdk.v3.client.Client; +import org.fisco.bcos.sdk.v3.codec.datatypes.Address; +import org.fisco.bcos.sdk.v3.codec.datatypes.Bool; +import org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes; +import org.fisco.bcos.sdk.v3.codec.datatypes.DynamicStruct; +import org.fisco.bcos.sdk.v3.codec.datatypes.Event; +import org.fisco.bcos.sdk.v3.codec.datatypes.Function; +import org.fisco.bcos.sdk.v3.codec.datatypes.Type; +import org.fisco.bcos.sdk.v3.codec.datatypes.TypeReference; +import org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple1; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple3; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple4; +import org.fisco.bcos.sdk.v3.contract.Contract; +import org.fisco.bcos.sdk.v3.crypto.CryptoSuite; +import org.fisco.bcos.sdk.v3.crypto.keypair.CryptoKeyPair; +import org.fisco.bcos.sdk.v3.eventsub.EventSubCallback; +import org.fisco.bcos.sdk.v3.model.CryptoType; +import org.fisco.bcos.sdk.v3.model.TransactionReceipt; +import org.fisco.bcos.sdk.v3.model.callback.TransactionCallback; +import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.ProxySignTransactionManager; +import org.fisco.bcos.sdk.v3.transaction.model.exception.ContractException; + +@SuppressWarnings("unchecked") +public class MonitorVerifier extends Contract { + public static final String[] BINARY_ARRAY = {"60806040523480156200001157600080fd5b506200001d336200002d565b620000276200007d565b6200014c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a81b900460ff1615620000ec5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff600160a01b909104811610156200014a576000805460ff60a01b191660ff60a01b17905560405160ff81527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6137b1806200015c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806366073c1a1161008c578063b856530911610066578063b8565309146101a4578063e181b508146101b7578063e1c7392a146101ca578063f2fde38b146101d257600080fd5b806366073c1a14610183578063715018a61461018b5780638da5cb5b1461019357600080fd5b80630fdd6680146100d457806316a77222146100e95780631a383f181461011357806342660bb4146101265780634697df6b1461014957806351ccae0f1461016b575b600080fd5b6100e76100e2366004612b7f565b6101e5565b005b600a546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b6100e7610121366004612c3b565b61020f565b610139610134366004612cce565b6103d6565b604051901515815260200161010a565b61015c610157366004612c3b565b610724565b60405161010a93929190612dee565b610173610914565b60405161010a9493929190612ea7565b610139610d51565b6100e7611448565b6000546001600160a01b03166100f6565b600a546100f6906001600160a01b031681565b6100e76101c5366004612f55565b61145c565b6100e761149e565b6100e76101e0366004612b7f565b6115cb565b6101ed611641565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b0316336001600160a01b03161461028c5760405162461bcd60e51b815260206004820152602c60248201527f4d6f6e69746f7256657269666965724d73673a2063616c6c6572206973206e6f60448201526b3a103a343290383a31a43ab160a11b60648201526084015b60405180910390fd5b60006102978261169b565b905060005b8160400151518110156103d1576000826040015182815181106102c1576102c161300e565b602002602001015190506102d8816000015161184c565b156103be5780600b84600001516040516102f29190613024565b9081526020016040518091039020600082015181600001908051906020019061031c9291906129f2565b5060208281015160018301805460ff19169115159190911790556040830151805180519192600285019261035392849201906129f2565b50602082810151805161036c92600185019201906129f2565b5050855184516040808701516020015190517fafcd4a591a86cb8bd73ea647fca68292b93996dc72028308ffdb9c6a88d8ac7696506103b095509293509091613040565b60405180910390a150505050565b50806103c98161308f565b91505061029c565b505050565b600061041789898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061190492505050565b6104335760405162461bcd60e51b8152600401610283906130aa565b61071789898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604051600b925061047f91508d908d906130fa565b90815260200160405180910390206040518060600160405290816000820180546104a89061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546104d49061310a565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b5050509183525050600182015460ff1615156020820152604080518082018252600284018054929093019290918290829061055b9061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546105879061310a565b80156105d45780601f106105a9576101008083540402835291602001916105d4565b820191906000526020600020905b8154815290600101906020018083116105b757829003601f168201915b505050505081526020016001820180546105ed9061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546106199061310a565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050815250508152505089898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a908190840183828082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525061193b92505050565b9998505050505050505050565b8051602081830181018051600b8252928201919093012091528054819061074a9061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546107769061310a565b80156107c35780601f10610798576101008083540402835291602001916107c3565b820191906000526020600020905b8154815290600101906020018083116107a657829003601f168201915b5050505050908060010160009054906101000a900460ff1690806002016040518060400160405290816000820180546107fb9061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546108279061310a565b80156108745780601f1061084957610100808354040283529160200191610874565b820191906000526020600020905b81548152906001019060200180831161085757829003601f168201915b5050505050815260200160018201805461088d9061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546108b99061310a565b80156109065780601f106108db57610100808354040283529160200191610906565b820191906000526020600020905b8154815290600101906020018083116108e957829003601f168201915b505050505081525050905083565b6040805160a081019091526001805490919082908290606082019083908290829061093e9061310a565b80601f016020809104026020016040519081016040528092919081815260200182805461096a9061310a565b80156109b75780601f1061098c576101008083540402835291602001916109b7565b820191906000526020600020905b81548152906001019060200180831161099a57829003601f168201915b505050505081526020016001820180546109d09061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546109fc9061310a565b8015610a495780601f10610a1e57610100808354040283529160200191610a49565b820191906000526020600020905b815481529060010190602001808311610a2c57829003601f168201915b50505050508152505081526020016002820154815260200160038201548152505090806004018054610a7a9061310a565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa69061310a565b8015610af35780601f10610ac857610100808354040283529160200191610af3565b820191906000526020600020905b815481529060010190602001808311610ad657829003601f168201915b50505050509080600501604051806060016040529081600082018054610b189061310a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b449061310a565b8015610b915780601f10610b6657610100808354040283529160200191610b91565b820191906000526020600020905b815481529060010190602001808311610b7457829003601f168201915b50505050508152602001600182018054610baa9061310a565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd69061310a565b8015610c235780601f10610bf857610100808354040283529160200191610c23565b820191906000526020600020905b815481529060010190602001808311610c0657829003601f168201915b50505050508152602001600282018054610c3c9061310a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c689061310a565b8015610cb55780601f10610c8a57610100808354040283529160200191610cb5565b820191906000526020600020905b815481529060010190602001808311610c9857829003601f168201915b50505050508152505090806008018054610cce9061310a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cfa9061310a565b8015610d475780601f10610d1c57610100808354040283529160200191610d47565b820191906000526020600020905b815481529060010190602001808311610d2a57829003601f168201915b5050505050905084565b6000610de960016004018054610d669061310a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d929061310a565b8015610ddf5780601f10610db457610100808354040283529160200191610ddf565b820191906000526020600020905b815481529060010190602001808311610dc257829003601f168201915b5050505050611904565b610e055760405162461bcd60e51b8152600401610283906130aa565b6040805160a081019091526001805461144392919082906060820190839082908290610e309061310a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5c9061310a565b8015610ea95780601f10610e7e57610100808354040283529160200191610ea9565b820191906000526020600020905b815481529060010190602001808311610e8c5782900360","1f168201915b50505050508152602001600182018054610ec29061310a565b80601f0160208091040260200160405190810160405280929190818152602001828054610eee9061310a565b8015610f3b5780601f10610f1057610100808354040283529160200191610f3b565b820191906000526020600020905b815481529060010190602001808311610f1e57829003601f168201915b5050509190925250505081526002820154602082015260039091015460409091015260058054610f6a9061310a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f969061310a565b8015610fe35780601f10610fb857610100808354040283529160200191610fe3565b820191906000526020600020905b815481529060010190602001808311610fc657829003601f168201915b5050604051600b9350610ffa92506005915061313f565b90815260200160405180910390206040518060600160405290816000820180546110239061310a565b80601f016020809104026020016040519081016040528092919081815260200182805461104f9061310a565b801561109c5780601f106110715761010080835404028352916020019161109c565b820191906000526020600020905b81548152906001019060200180831161107f57829003601f168201915b5050509183525050600182015460ff161515602082015260408051808201825260028401805492909301929091829082906110d69061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546111029061310a565b801561114f5780601f106111245761010080835404028352916020019161114f565b820191906000526020600020905b81548152906001019060200180831161113257829003601f168201915b505050505081526020016001820180546111689061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546111949061310a565b80156111e15780601f106111b6576101008083540402835291602001916111e1565b820191906000526020600020905b8154815290600101906020018083116111c457829003601f168201915b505050919092525050509052506040805160608101909152600680548290829061120a9061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546112369061310a565b80156112835780601f1061125857610100808354040283529160200191611283565b820191906000526020600020905b81548152906001019060200180831161126657829003601f168201915b5050505050815260200160018201805461129c9061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546112c89061310a565b80156113155780601f106112ea57610100808354040283529160200191611315565b820191906000526020600020905b8154815290600101906020018083116112f857829003601f168201915b5050505050815260200160028201805461132e9061310a565b80601f016020809104026020016040519081016040528092919081815260200182805461135a9061310a565b80156113a75780601f1061137c576101008083540402835291602001916113a7565b820191906000526020600020905b81548152906001019060200180831161138a57829003601f168201915b505050505081525050600160080180546113c09061310a565b80601f01602080910402602001604051908101604052809291908181526020018280546113ec9061310a565b80156114395780601f1061140e57610100808354040283529160200191611439565b820191906000526020600020905b81548152906001019060200180831161141c57829003601f168201915b50505050506119a3565b905090565b611450611641565b61145a6000611a05565b565b8560016114698282613316565b50611478905060058686612a76565b508260066114868282613425565b50611495905060098383612a76565b50505050505050565b600054600160a81b900460ff16158080156114c657506000546001600160a01b90910460ff16105b806114e75750303b1580156114e75750600054600160a01b900460ff166001145b61154a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610283565b6000805460ff60a01b1916600160a01b1790558015611577576000805460ff60a81b1916600160a81b1790555b61158033611a05565b80156115c8576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6115d3611641565b6001600160a01b0381166116385760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610283565b6115c881611a05565b6000546001600160a01b0316331461145a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610283565b6116a3612aea565b6116ab612aea565b60006116b684611a55565b905060005b816020015151811015611843576000826020015182815181106116e0576116e061300e565b60200260200101519050600061ffff16816000015161ffff16141561170b5760408101518452611830565b805161ffff16600114156117365761172c611727826040015190565b611c31565b6020850152611830565b805161ffff1660021415611830576000611778826040805180820190915260008152606060208201525060408051808201825260008152910151602082015290565b9050600061178582611ce2565b67ffffffffffffffff81111561179d5761179d612baf565b6040519080825280602002602001820160405280156117d657816020015b6117c3612b2d565b8152602001906001900390816117bb5790505b50905060005b60208301515183511015611828576117fb6117f684611d19565b611dba565b82826118068161308f565b9350815181106118185761181861300e565b60200260200101819052506117dc565b506040860152505b508061183b8161308f565b9150506116bb565b50909392505050565b6040805180820190915260078082526636b7b734ba37b960c91b602083015282516000929184911015611883575060009392505050565b60005b82518110156118f9578281815181106118a1576118a161300e565b602001015160f81c60f81b6001600160f81b0319168282815181106118c8576118c861300e565b01602001516001600160f81b031916146118e757506000949350505050565b806118f18161308f565b915050611886565b506001949350505050565b600080600b836040516119179190613024565b90815260405190819003602001902080546119319061310a565b9050119050919050565b6000806000905061195a856119538860400151611e9b565b8587611f49565b86516040519192507fb0bfa4568d397510623f22e7fbce69883374d7cbf54cd81b4024bb1523766d5e91611991918a91859061351f565b60405180910390a19695505050505050565b600080600090506119ca84602001516119bf8760400151611e9b565b858760400151611f49565b90507f6cc1eb7828b1e1df492afe8de0d5a0e24a364f53db5f23b01457634b5e14da5087878760000151846040516119919493929190613557565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080518082019091526000815260606020820152600682511015611abc5760405162461bcd60e51b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e6774680000000000000000006044820152606401610283565b6040805180820190915260008082526060602083015290611ae5611ae08584612114565b61213c565b61ffff168152611af66006836135a4565b91506000825b8551811015611b5057611b21611b1c87611b178460026135a4565b6121dd565b612207565b611b2c9060066135bc565b611b3c9063ffffffff16826135a4565b905081611b488161308f565b925050611afc565b60008267ffffffffffffffff811115611b6b57611b6b612baf565b604051908082528060200260200182016040528015611bb857816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611b895790505b509050600092505b8651851015611c225760408051606080820183526000808352602083015291810191909152611bef8887612301565b96509050808285611bff8161308f565b965081518110611c1157611c1161300e565b602002602001018190525050611bc0565b60208401525090949350505050565b604080516060808201835260208083018281526000848601819052908452845180840186529182019283529381018490529081529091611c7084611a55565b905060005b81602001515181101561184357600082602001518281518110611c9a57611c9a61300e565b60200260200101519050600061ffff16816000015161ffff161415611ccf57611ccc611cc7826040015190565b61245c565b84525b5080611cda8161308f565b915050611c75565b8051600090815b60208401515184511015611d1357611d0084611d19565b5080611d0b8161308f565b915050611ce9565b92525090565b6060816020015151826000015110611d825760405162461bcd60e51b815260206004820152602660248201527f4279746573417272617953747265616d3a206f6666657374206f7574206f6620604482015265313ab33332b960d11b6064820152608401610283565b6000611d968360000151846020015161251c565b8051845191925090611da99060046135a4565b611db391906135a4565b9092525090565b611dc2612b2d565b611dca612b2d565b6000611dd584611a55565b905060005b81602001515181101561184357600082602001518281518110611dff57611dff61300e565b60200260200101519050600061ffff16816000015161ffff161415611e2a5760408101518452611e88565b805161ffff1660011415611e61576000611e43826125b2565b60ff1611611e52576000611e55565b60015b15156020850152611e88565b805161ffff1660021415611e8857611e82611e7d826040015190565b6125c3565b60408501525b5080611e938161308f565b915050611dda565b6060604082602001","51511015611ef35760405162461bcd60e51b815260206004820152601c60248201527f7075626c6963206b6579206c656e677468206e6f7420656e6f757468000000006044820152606401610283565b60208201518051600090611f09906040906135e4565b6040805181815260608101825291925060009190602082018180368337019050509290910160208181015190840152604090810151908301525092915050565b6000611f8c604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b8152508661267790919063ffffffff16565b611ff45760405162461bcd60e51b815260206004820152603360248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152723235364b31207369676e6174757265206e6f7760681b6064820152608401610283565b6041825110156120465760405162461bcd60e51b815260206004820152601a60248201527f77726f6e6720736563703235366b3120736967206c656e6774680000000000006044820152606401610283565b601b8260408151811061205b5761205b61300e565b016020015161206d919060f81c6135fb565b60f81b826040815181106120835761208361300e565b60200101906001600160f81b031916908160001a905350835160208501206000906120b590855160208701208561268d565b9050601b836040815181106120cc576120cc61300e565b01602001516120de919060f81c613620565b60f81b836040815181106120f4576120f461300e565b60200101906001600160f81b031916908160001a90535095945050505050565b81516000906121248360026135a4565b111561212f57600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b8160008151811061217f5761217f61300e565b60200101906001600160f81b031916908160001a9053508160001a60f81b816001815181106121b0576121b061300e565b60200101906001600160f81b031916908160001a90535060006121d4826000612114565b95945050505050565b81516000906121ed8360046135a4565b11156121f857600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b8160008151811061224a5761224a61300e565b60200101906001600160f81b031916908160001a9053508160021a60f81b8160018151811061227b5761227b61300e565b60200101906001600160f81b031916908160001a9053508160011a60f81b816002815181106122ac576122ac61300e565b60200101906001600160f81b031916908160001a9053508160001a60f81b816003815181106122dd576122dd61300e565b60200101906001600160f81b031916908160001a90535060006121d48260006121dd565b6040805160608082018352600080835260208301529181019190915260008284511161237b5760405162461bcd60e51b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b6064820152608401610283565b60068310156123bd5760405162461bcd60e51b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b6044820152606401610283565b604080516060808201835260008083526020830152918101919091526123e6611ae08686612114565b61ffff1681526123f76002856135a4565b9350612406611b1c86866121dd565b63ffffffff16602082015261241c6004856135a4565b93506124338585836020015163ffffffff166126ee565b6040820152602081015161244d9063ffffffff16856135a4565b935091508290505b9250929050565b604080518082019091526060815260006020820152604080518082019091526060815260006020820152600061249184611a55565b905060005b816020015151811015611843576000826020015182815181106124bb576124bb61300e565b60200260200101519050600061ffff16816000015161ffff1614156124e65760408101518452612509565b805161ffff1660011415612509576124fd81612770565b63ffffffff1660208501525b50806125148161308f565b915050612496565b60606125296004846135a4565b9250600061253a611b1c8585015190565b63ffffffff16905060608115801561255d576040519150602082016040526125a7565b6040519150601f8316801560200281840101848101888315602002848a0101015b8183101561259657805183526020928301920161257e565b5050848452601f01601f1916604052505b509150505b92915050565b60006125ac60018360400151015190565b6040805180820190915260608082526020820152604080518082019091526060808252602082015260006125f684611a55565b905060005b816020015151811015611843576000826020015182815181106126205761262061300e565b60200260200101519050600061ffff16816000015161ffff16141561264b5760408101518452612664565b805161ffff166001141561266457604081015160208501525b508061266f8161308f565b9150506125fb565b8051602091820120825192909101919091201490565b600080600061269c8585612784565b909250905060008160048111156126b5576126b5613643565b1480156126d35750856001600160a01b0316826001600160a01b0316145b806126e457506126e48686866127c7565b9695505050505050565b82516060906126fd83856135a4565b111561270857600080fd5b60008267ffffffffffffffff81111561272357612723612baf565b6040519080825280601f01601f19166020018201604052801561274d576020820181803683370190505b509050602080820190868601016127658282876128b3565b509095945050505050565b60006125ac611b1c60048460400151015190565b6000808251604114156127bb5760208301516040840151606085015160001a6127af8782858561292e565b94509450505050612455565b50600090506002612455565b6000806000856001600160a01b0316631626ba7e60e01b86866040516024016127f1929190613659565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161282f9190613024565b600060405180830381855afa9150503d806000811461286a576040519150601f19603f3d011682016040523d82523d6000602084013e61286f565b606091505b509150915081801561288357506020815110155b80156126e457508051630b135d3f60e11b906128a89083016020908101908401613672565b149695505050505050565b602081106128eb57815183526128ca6020846135a4565b92506128d76020836135a4565b91506128e46020826135e4565b90506128b3565b806128f557505050565b600060016129048360206135e4565b6129109061010061376f565b61291a91906135e4565b925184518416931916929092179092525050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561296557506000905060036129e9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156129b9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166129e2576000600192509250506129e9565b9150600090505b94509492505050565b8280546129fe9061310a565b90600052602060002090601f016020900481019282612a205760008555612a66565b82601f10612a3957805160ff1916838001178555612a66565b82800160010185558215612a66579182015b82811115612a66578251825591602001919060010190612a4b565b50612a72929150612b6a565b5090565b828054612a829061310a565b90600052602060002090601f016020900481019282612aa45760008555612a66565b82601f10612abd5782800160ff19823516178555612a66565b82800160010185558215612a66579182015b82811115612a66578235825591602001919060010190612acf565b604051806060016040528060608152602001612b2060408051606080820183526020820190815260009282019290925290815290565b8152602001606081525090565b604051806060016040528060608152602001600015158152602001612b65604051806040016040528060608152602001606081525090565b905290565b5b80821115612a725760008155600101612b6b565b600060208284031215612b9157600080fd5b81356001600160a01b0381168114612ba857600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612be057612be0612baf565b604051601f8501601f19908116603f01168101908282118183101715612c0857612c08612baf565b81604052809350858152868686011115612c2157600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612c4d57600080fd5b813567ffffffffffffffff811115612c6457600080fd5b8201601f81018413612c7557600080fd5b612c8484823560208401612bc5565b949350505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b60208301915083602082850101111561245557600080fd5b6000806000806000806000806080898b031215612cea57600080fd5b883567ffffffffffffffff80821115612d0257600080fd5b612d0e8c838d01612c8c565b909a50985060208b0135915080821115612d2757600080fd5b612d338c838d01612c8c565b909850965060408b0135915080821115612d4c57600080fd5b612d588c838d01612c8c565b909650945060608b0135915080821115612d7157600080fd5b50612d7e8b828c01612c8c565b999c989b5096995094979396929594505050565b60005b83811015612dad578181015183820152602001612d95565b83811115612dbc576000848401525b50505050565b60008151808452612dda816020860160208601612d92565b601f01601f19169290920160200192915050565b606081526000612e016060830186612dc2565b84151560208401528281036040840152835160408252612e246040830182612dc2565b905060208501518282036020840152612e3d8282612dc2565b98975050505050505050565b6000815160608452805160406060860152612e6760a0860182612dc2565b905060208201519150605f19858203016080860152612e868183612dc2565b9150506020830151602085015260408301516040850152809150509291","5050565b608081526000612eba6080830187612e49565b8281036020840152612ecc8187612dc2565b90508281036040840152845160608252612ee96060830182612dc2565b905060208601518282036020840152612f028282612dc2565b91505060408601518282036040840152612f1c8282612dc2565b925050508281036060840152612f328185612dc2565b979650505050505050565b600060608284031215612f4f57600080fd5b50919050565b60008060008060008060808789031215612f6e57600080fd5b863567ffffffffffffffff80821115612f8657600080fd5b612f928a838b01612f3d565b97506020890135915080821115612fa857600080fd5b612fb48a838b01612c8c565b90975095506040890135915080821115612fcd57600080fd5b612fd98a838b01612f3d565b94506060890135915080821115612fef57600080fd5b50612ffc89828a01612c8c565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b60008251613036818460208701612d92565b9190910192915050565b6060815260006130536060830186612dc2565b82810360208401526130658186612dc2565b905082810360408401526126e48185612dc2565b634e487b7160e01b600052601160045260246000fd5b60006000198214156130a3576130a3613079565b5060010190565b60208082526030908201527f4d6f6e69746f7256657269666965724d73673a206e6f206d6f6e69746f72206e60408201526f6f646520656e646f72736520696e666f60801b606082015260800190565b8183823760009101908152919050565b600181811c9082168061311e57607f821691505b60208210811415612f4f57634e487b7160e01b600052602260045260246000fd5b600080835461314d8161310a565b600182811680156131655760018114613176576131a5565b60ff198416875282870194506131a5565b8760005260208060002060005b8581101561319c5781548a820152908401908201613183565b50505082870194505b50929695505050505050565b6000808335601e198436030181126131c857600080fd5b83018035915067ffffffffffffffff8211156131e357600080fd5b60200191503681900382131561245557600080fd5b601f8211156103d157600081815260208120601f850160051c8101602086101561321f5750805b601f850160051c820191505b8181101561323e5782815560010161322b565b505050505050565b600019600383901b1c191660019190911b1790565b67ffffffffffffffff83111561327357613273612baf565b61328783613281835461310a565b836131f8565b6000601f8411600181146132b557600085156132a35750838201355b6132ad8682613246565b84555061330f565b600083815260209020601f19861690835b828110156132e657868501358255602094850194600190920191016132c6565b50868210156133035760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8135603e1983360301811261332a57600080fd5b820161333681806131b1565b67ffffffffffffffff81111561334e5761334e612baf565b6133628161335c865461310a565b866131f8565b6000601f821160018114613390576000831561337e5750838201355b6133888482613246565b8755506133ea565b600086815260209020601f19841690835b828110156133c157868501358255602094850194600190920191016133a1565b50848210156133de5760001960f88660031b161c19848701351681555b505060018360011b0186555b505050506133fb60208201826131b1565b915061340b82826001860161325b565b505060208201356002820155604082013560038201555050565b61342f82836131b1565b67ffffffffffffffff81111561344757613447612baf565b61345b81613455855461310a565b856131f8565b6000601f82116001811461348957600083156134775750838201355b6134818482613246565b8655506134e3565b600085815260209020601f19841690835b828110156134ba578685013582556020948501946001909201910161349a565b50848210156134d75760001960f88660031b161c19848701351681555b505060018360011b0185555b505050506134f460208301836131b1565b61350281836001860161325b565b505061351160408301836131b1565b612dbc81836002860161325b565b6060815260006135326060830186612dc2565b82810360208401526135448186612dc2565b9150508215156040830152949350505050565b60808152600061356a6080830187612e49565b828103602084015261357c8187612dc2565b905082810360408401526135908186612dc2565b915050821515606083015295945050505050565b600082198211156135b7576135b7613079565b500190565b600063ffffffff8083168185168083038211156135db576135db613079565b01949350505050565b6000828210156135f6576135f6613079565b500390565b600060ff821660ff84168060ff0382111561361857613618613079565b019392505050565b600060ff821660ff84168082101561363a5761363a613079565b90039392505050565b634e487b7160e01b600052602160045260246000fd5b828152604060208201526000612c846040830184612dc2565b60006020828403121561368457600080fd5b5051919050565b600181815b808511156136c65781600019048211156136ac576136ac613079565b808516156136b957918102915b93841c9390800290613690565b509250929050565b6000826136dd575060016125ac565b816136ea575060006125ac565b8160018114613700576002811461370a57613726565b60019150506125ac565b60ff84111561371b5761371b613079565b50506001821b6125ac565b5060208310610133831016604e8410600b8410161715613749575081810a6125ac565b613753838361368b565b806000190482111561376757613767613079565b029392505050565b6000612ba883836136ce56fea2646970667358221220369f74e96b31dbe672c69807beaef318f0ba7f487d4ed446d8e16181c3030cf064736f6c634300080b0033"}; + + public static final String BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", BINARY_ARRAY); + + public static final String[] SM_BINARY_ARRAY = {"60806040523480156200001157600080fd5b506200001d336200002d565b620000276200007d565b6200014d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b600054600160a81b900460ff1615620000ed57604051636381e58960e11b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff600160a01b909104811610156200014b576000805460ff60a01b191660ff60a01b17905560405160ff81527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa9060200160405180910390a15b565b6137c8806200015d6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806348b609861161008c578063abf915cd11610066578063abf915cd1461019b578063c4f9dcde146101a3578063c7d9be7b146101bb578063d86e29e2146101dd57600080fd5b806348b609861461016f5780635089e2c814610177578063a042f0e61461018857600080fd5b80630719fa79146100d45780630f3eb9b0146100fc5780630fe2fa0a1461011157806316cad12a146101365780631bd72cca146101495780634401aa131461015c575b600080fd5b6100e76100e2366004612bd8565b6101e5565b60405190151581526020015b60405180910390f35b61010f61010a366004612c9c565b61053d565b005b600a546001600160a01b03165b6040516001600160a01b0390911681526020016100f3565b61010f610144366004612c9c565b610567565b61010f610157366004612ce4565b6105e1565b600a5461011e906001600160a01b031681565b6100e7610623565b6000546001600160a01b031661011e565b61010f610196366004612e29565b610d1b565b61010f610ede565b6101ab61100b565b6040516100f39493929190612f34565b6101ce6101c9366004612e29565b611448565b6040516100f393929190612fca565b61010f611638565b600061022689898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164c92505050565b61024c57604051636381e58960e11b815260040161024390613025565b60405180910390fd5b61053089898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604051600b925061029891508d908d90613075565b90815260200160405180910390206040518060600160405290816000820180546102c190613085565b80601f01602080910402602001604051908101604052809291908181526020018280546102ed90613085565b801561033a5780601f1061030f5761010080835404028352916020019161033a565b820191906000526020600020905b81548152906001019060200180831161031d57829003601f168201915b5050509183525050600182015460ff1615156020820152604080518082018252600284018054929093019290918290829061037490613085565b80601f01602080910402602001604051908101604052809291908181526020018280546103a090613085565b80156103ed5780601f106103c2576101008083540402835291602001916103ed565b820191906000526020600020905b8154815290600101906020018083116103d057829003601f168201915b5050505050815260200160018201805461040690613085565b80601f016020809104026020016040519081016040528092919081815260200182805461043290613085565b801561047f5780601f106104545761010080835404028352916020019161047f565b820191906000526020600020905b81548152906001019060200180831161046257829003601f168201915b5050505050815250508152505089898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a908190840183828082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525061168392505050565b9998505050505050505050565b6105456116eb565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61056f6116eb565b6001600160a01b0381166105d557604051636381e58960e11b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610243565b6105de81611746565b50565b8560016105ee828261321f565b506105fd905060058686612a09565b5082600661060b828261332e565b5061061a905060098383612a09565b50505050505050565b60006106bb6001600401805461063890613085565b80601f016020809104026020016040519081016040528092919081815260200182805461066490613085565b80156106b15780601f10610686576101008083540402835291602001916106b1565b820191906000526020600020905b81548152906001019060200180831161069457829003601f168201915b505050505061164c565b6106d857604051636381e58960e11b815260040161024390613025565b6040805160a0810190915260018054610d169291908290606082019083908290829061070390613085565b80601f016020809104026020016040519081016040528092919081815260200182805461072f90613085565b801561077c5780601f106107515761010080835404028352916020019161077c565b820191906000526020600020905b81548152906001019060200180831161075f57829003601f168201915b5050505050815260200160018201805461079590613085565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190613085565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b505050919092525050508152600282015460208201526003909101546040909101526005805461083d90613085565b80601f016020809104026020016040519081016040528092919081815260200182805461086990613085565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050604051600b93506108cd925060059150613428565b90815260200160405180910390206040518060600160405290816000820180546108f690613085565b80601f016020809104026020016040519081016040528092919081815260200182805461092290613085565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050509183525050600182015460ff161515602082015260408051808201825260028401805492909301929091829082906109a990613085565b80601f01602080910402602001604051908101604052809291908181526020018280546109d590613085565b8015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b50505050508152602001600182018054610a3b90613085565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6790613085565b8015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b5050509190925250505090525060408051606081019091526006805482908290610add90613085565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0990613085565b8015610b565780601f10610b2b57610100808354040283529160200191610b56565b820191906000526020600020905b815481529060010190602001808311610b3957829003601f168201915b50505050508152602001600182018054610b6f90613085565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9b90613085565b8015610be85780601f10610bbd57610100808354040283529160200191610be8565b820191906000526020600020905b815481529060010190602001808311610bcb57829003601f168201915b50505050508152602001600282018054610c0190613085565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2d90613085565b8015610c7a5780601f10610c4f57610100808354040283529160200191610c7a565b820191906000526020600020905b815481529060010190602001808311610c5d57829003601f168201915b50505050508152505060016008018054610c9390613085565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbf90613085565b8015610d0c5780601f10610ce157610100808354040283529160200191610d0c565b820191906000526020600020905b815481529060010190602001808311610cef57829003601f168201915b5050505050611796565b905090565b600a546001600160a01b0316336001600160a01b031614610d9457604051636381e58960e11b815260206004820152602c60248201527f4d6f6e69746f7256657269666965724d73673a2063616c6c6572206973206e6f60448201526b3a103a343290383a31a43ab160a11b6064820152608401610243565b6000610d9f826117f8565b905060005b816040015151811015610ed957600082604001518281518110610dc957610dc961349a565b60200260200101519050610de081600001516119a9565b15610ec65780600b8460000151604051610dfa91906134b0565b90815260200160405180910390206000820151816000019080519060200190610e24929190612a8d565b5060208281015160018301805460ff191691151591909117905560408301518051805191926002850192610e5b9284920190612a8d565b506020828101518051610e749260018501920190612a8d565b5050855184516040808701516020015190517fab81ad8cc6b375c4a499cdc8c44c0541c5db3b28b1700ede24dad7","ef875ff15c9650610eb8955092935090916134cc565b60405180910390a150505050565b5080610ed18161351b565b915050610da4565b505050565b600054600160a81b900460ff1615808015610f0657506000546001600160a01b90910460ff16105b80610f275750303b158015610f275750600054600160a01b900460ff166001145b610f8b57604051636381e58960e11b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610243565b6000805460ff60a01b1916600160a01b1790558015610fb8576000805460ff60a81b1916600160a81b1790555b610fc133611746565b80156105de576000805460ff60a81b19169055604051600181527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa9060200160405180910390a150565b6040805160a081019091526001805490919082908290606082019083908290829061103590613085565b80601f016020809104026020016040519081016040528092919081815260200182805461106190613085565b80156110ae5780601f10611083576101008083540402835291602001916110ae565b820191906000526020600020905b81548152906001019060200180831161109157829003601f168201915b505050505081526020016001820180546110c790613085565b80601f01602080910402602001604051908101604052809291908181526020018280546110f390613085565b80156111405780601f1061111557610100808354040283529160200191611140565b820191906000526020600020905b81548152906001019060200180831161112357829003601f168201915b5050505050815250508152602001600282015481526020016003820154815250509080600401805461117190613085565b80601f016020809104026020016040519081016040528092919081815260200182805461119d90613085565b80156111ea5780601f106111bf576101008083540402835291602001916111ea565b820191906000526020600020905b8154815290600101906020018083116111cd57829003601f168201915b5050505050908060050160405180606001604052908160008201805461120f90613085565b80601f016020809104026020016040519081016040528092919081815260200182805461123b90613085565b80156112885780601f1061125d57610100808354040283529160200191611288565b820191906000526020600020905b81548152906001019060200180831161126b57829003601f168201915b505050505081526020016001820180546112a190613085565b80601f01602080910402602001604051908101604052809291908181526020018280546112cd90613085565b801561131a5780601f106112ef5761010080835404028352916020019161131a565b820191906000526020600020905b8154815290600101906020018083116112fd57829003601f168201915b5050505050815260200160028201805461133390613085565b80601f016020809104026020016040519081016040528092919081815260200182805461135f90613085565b80156113ac5780601f10611381576101008083540402835291602001916113ac565b820191906000526020600020905b81548152906001019060200180831161138f57829003601f168201915b505050505081525050908060080180546113c590613085565b80601f01602080910402602001604051908101604052809291908181526020018280546113f190613085565b801561143e5780601f106114135761010080835404028352916020019161143e565b820191906000526020600020905b81548152906001019060200180831161142157829003601f168201915b5050505050905084565b8051602081830181018051600b8252928201919093012091528054819061146e90613085565b80601f016020809104026020016040519081016040528092919081815260200182805461149a90613085565b80156114e75780601f106114bc576101008083540402835291602001916114e7565b820191906000526020600020905b8154815290600101906020018083116114ca57829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020160405180604001604052908160008201805461151f90613085565b80601f016020809104026020016040519081016040528092919081815260200182805461154b90613085565b80156115985780601f1061156d57610100808354040283529160200191611598565b820191906000526020600020905b81548152906001019060200180831161157b57829003601f168201915b505050505081526020016001820180546115b190613085565b80601f01602080910402602001604051908101604052809291908181526020018280546115dd90613085565b801561162a5780601f106115ff5761010080835404028352916020019161162a565b820191906000526020600020905b81548152906001019060200180831161160d57829003601f168201915b505050505081525050905083565b6116406116eb565b61164a6000611746565b565b600080600b8360405161165f91906134b0565b908152604051908190036020019020805461167990613085565b9050119050919050565b600080600090506116a28561169b8860400151611a61565b8587611b10565b86516040519192507fee54212fddae1ab680aed1b70a8d7ae4cd829c4394f17318ba956bf20f43607d916116d9918a918590613536565b60405180910390a19695505050505050565b6000546001600160a01b0316331461164a57604051636381e58960e11b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610243565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b600080600090506117bd84602001516117b28760400151611a61565b858760400151611b10565b90507fa10fc3bf56771828cfe377bab9b5942f458448aaeb483b0d78f7916a9a9cb0d987878760000151846040516116d9949392919061356e565b611800612b01565b611808612b01565b600061181384611cdd565b905060005b8160200151518110156119a05760008260200151828151811061183d5761183d61349a565b60200260200101519050600061ffff16816000015161ffff161415611868576040810151845261198d565b805161ffff166001141561189357611889611884826040015190565b611eba565b602085015261198d565b805161ffff166002141561198d5760006118d5826040805180820190915260008152606060208201525060408051808201825260008152910151602082015290565b905060006118e282611f6b565b67ffffffffffffffff8111156118fa576118fa612d9d565b60405190808252806020026020018201604052801561193357816020015b611920612b44565b8152602001906001900390816119185790505b50905060005b602083015151835110156119855761195861195384611fa2565b612044565b82826119638161351b565b9350815181106119755761197561349a565b6020026020010181905250611939565b506040860152505b50806119988161351b565b915050611818565b50909392505050565b6040805180820190915260078082526636b7b734ba37b960c91b6020830152825160009291849110156119e0575060009392505050565b60005b8251811015611a56578281815181106119fe576119fe61349a565b602001015160f81c60f81b6001600160f81b031916828281518110611a2557611a2561349a565b01602001516001600160f81b03191614611a4457506000949350505050565b80611a4e8161351b565b9150506119e3565b506001949350505050565b606060408260200151511015611aba57604051636381e58960e11b815260206004820152601c60248201527f7075626c6963206b6579206c656e677468206e6f7420656e6f757468000000006044820152606401610243565b60208201518051600090611ad0906040906135bb565b6040805181815260608101825291925060009190602082018180368337019050509290910160208181015190840152604090810151908301525092915050565b6000611b53604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b8152508661212590919063ffffffff16565b611bbc57604051636381e58960e11b815260206004820152603360248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152723235364b31207369676e6174757265206e6f7760681b6064820152608401610243565b604182511015611c0f57604051636381e58960e11b815260206004820152601a60248201527f77726f6e6720736563703235366b3120736967206c656e6774680000000000006044820152606401610243565b601b82604081518110611c2457611c2461349a565b0160200151611c36919060f81c6135d2565b60f81b82604081518110611c4c57611c4c61349a565b60200101906001600160f81b031916908160001a90535083516020850120600090611c7e908551602087012085612141565b9050601b83604081518110611c9557611c9561349a565b0160200151611ca7919060f81c6135f7565b60f81b83604081518110611cbd57611cbd61349a565b60200101906001600160f81b031916908160001a90535095945050505050565b604080518082019091526000815260606020820152600682511015611d4557604051636381e58960e11b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e6774680000000000000000006044820152606401610243565b6040805180820190915260008082526060602083015290611d6e611d6985846121a2565b6121ca565b61ffff168152611d7f60068361361a565b91506000825b8551811015611dd957611daa611da587611da084600261361a565b61226b565b612295565b611db5906006613632565b611dc59063ffffffff168261361a565b905081611dd18161351b565b925050611d85565b60008267ffffffffffffffff811115611df457611df4612d9d565b604051908082528060200260200182016040528015611e4157816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611e125790505b509050600092505b8651851015611eab5760408051606080820183526000808352602083015291810191909152611e78888761238f565b96509050808285611e888161351b565b965081518110611e9a57611e9a61349a565b6020026020010181","90525050611e49565b60208401525090949350505050565b604080516060808201835260208083018281526000848601819052908452845180840186529182019283529381018490529081529091611ef984611cdd565b905060005b8160200151518110156119a057600082602001518281518110611f2357611f2361349a565b60200260200101519050600061ffff16816000015161ffff161415611f5857611f55611f50826040015190565b6124ec565b84525b5080611f638161351b565b915050611efe565b8051600090815b60208401515184511015611f9c57611f8984611fa2565b5080611f948161351b565b915050611f72565b92525090565b606081602001515182600001511061200c57604051636381e58960e11b815260206004820152602660248201527f4279746573417272617953747265616d3a206f6666657374206f7574206f6620604482015265313ab33332b960d11b6064820152608401610243565b6000612020836000015184602001516125ac565b805184519192509061203390600461361a565b61203d919061361a565b9092525090565b61204c612b44565b612054612b44565b600061205f84611cdd565b905060005b8160200151518110156119a0576000826020015182815181106120895761208961349a565b60200260200101519050600061ffff16816000015161ffff1614156120b45760408101518452612112565b805161ffff16600114156120eb5760006120cd82612640565b60ff16116120dc5760006120df565b60015b15156020850152612112565b805161ffff16600214156121125761210c612107826040015190565b612651565b60408501525b508061211d8161351b565b915050612064565b6000818051906020012083805190602001201490505b92915050565b60008060006121508585612705565b909250905060008160048111156121695761216961365a565b1480156121875750856001600160a01b0316826001600160a01b0316145b806121985750612198868686612748565b9695505050505050565b81516000906121b283600261361a565b11156121bd57600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b8160008151811061220d5761220d61349a565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160018151811061223e5761223e61349a565b60200101906001600160f81b031916908160001a90535060006122628260006121a2565b95945050505050565b815160009061227b83600461361a565b111561228657600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b816000815181106122d8576122d861349a565b60200101906001600160f81b031916908160001a9053508160021a60f81b816001815181106123095761230961349a565b60200101906001600160f81b031916908160001a9053508160011a60f81b8160028151811061233a5761233a61349a565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160038151811061236b5761236b61349a565b60200101906001600160f81b031916908160001a905350600061226282600061226b565b6040805160608082018352600080835260208301529181019190915260008284511161240a57604051636381e58960e11b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b6064820152608401610243565b600683101561244d57604051636381e58960e11b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b6044820152606401610243565b60408051606080820183526000808352602083015291810191909152612476611d6986866121a2565b61ffff16815261248760028561361a565b9350612496611da5868661226b565b63ffffffff1660208201526124ac60048561361a565b93506124c38585836020015163ffffffff16612834565b604082015260208101516124dd9063ffffffff168561361a565b935091508290505b9250929050565b604080518082019091526060815260006020820152604080518082019091526060815260006020820152600061252184611cdd565b905060005b8160200151518110156119a05760008260200151828151811061254b5761254b61349a565b60200260200101519050600061ffff16816000015161ffff1614156125765760408101518452612599565b805161ffff16600114156125995761258d816128b6565b63ffffffff1660208501525b50806125a48161351b565b915050612526565b60606125b960048461361a565b925060006125ca611da58585015190565b63ffffffff1690506060811580156125ed57604051915060208201604052612637565b6040519150601f8316801560200281840101848101888315602002848a0101015b8183101561262657805183526020928301920161260e565b5050848452601f01601f1916604052505b50949350505050565b600061213b60018360400151015190565b60408051808201909152606080825260208201526040805180820190915260608082526020820152600061268484611cdd565b905060005b8160200151518110156119a0576000826020015182815181106126ae576126ae61349a565b60200260200101519050600061ffff16816000015161ffff1614156126d957604081015184526126f2565b805161ffff16600114156126f257604081015160208501525b50806126fd8161351b565b915050612689565b60008082516041141561273c5760208301516040840151606085015160001a612730878285856128ca565b945094505050506124e5565b506000905060026124e5565b6000806000856001600160a01b031663973e417a60e01b8686604051602401612772929190613670565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516127b091906134b0565b600060405180830381855afa9150503d80600081146127eb576040519150601f19603f3d011682016040523d82523d6000602084013e6127f0565b606091505b509150915081801561280457506020815110155b801561219857508051634b9f20bd60e11b906128299083016020908101908401613689565b149695505050505050565b8251606090612843838561361a565b111561284e57600080fd5b60008267ffffffffffffffff81111561286957612869612d9d565b6040519080825280601f01601f191660200182016040528015612893576020820181803683370190505b509050602080820190868601016128ab82828761298e565b509095945050505050565b600061213b611da560048460400151015190565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156129015750600090506003612985565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612955573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661297e57600060019250925050612985565b9150600090505b94509492505050565b602081106129c657815183526129a560208461361a565b92506129b260208361361a565b91506129bf6020826135bb565b905061298e565b806129d057505050565b600060016129df8360206135bb565b6129eb90610100613786565b6129f591906135bb565b925184518416931916929092179092525050565b828054612a1590613085565b90600052602060002090601f016020900481019282612a375760008555612a7d565b82601f10612a505782800160ff19823516178555612a7d565b82800160010185558215612a7d579182015b82811115612a7d578235825591602001919060010190612a62565b50612a89929150612b81565b5090565b828054612a9990613085565b90600052602060002090601f016020900481019282612abb5760008555612a7d565b82601f10612ad457805160ff1916838001178555612a7d565b82800160010185558215612a7d579182015b82811115612a7d578251825591602001919060010190612ae6565b604051806060016040528060608152602001612b3760408051606080820183526020820190815260009282019290925290815290565b8152602001606081525090565b604051806060016040528060608152602001600015158152602001612b7c604051806040016040528060608152602001606081525090565b905290565b5b80821115612a895760008155600101612b82565b60008083601f840112612ba857600080fd5b50813567ffffffffffffffff811115612bc057600080fd5b6020830191508360208285010111156124e557600080fd5b6000806000806000806000806080898b031215612bf457600080fd5b883567ffffffffffffffff80821115612c0c57600080fd5b612c188c838d01612b96565b909a50985060208b0135915080821115612c3157600080fd5b612c3d8c838d01612b96565b909850965060408b0135915080821115612c5657600080fd5b612c628c838d01612b96565b909650945060608b0135915080821115612c7b57600080fd5b50612c888b828c01612b96565b999c989b5096995094979396929594505050565b600060208284031215612cae57600080fd5b81356001600160a01b0381168114612cc557600080fd5b9392505050565b600060608284031215612cde57600080fd5b50919050565b60008060008060008060808789031215612cfd57600080fd5b863567ffffffffffffffff80821115612d1557600080fd5b612d218a838b01612ccc565b97506020890135915080821115612d3757600080fd5b612d438a838b01612b96565b90975095506040890135915080821115612d5c57600080fd5b612d688a838b01612ccc565b94506060890135915080821115612d7e57600080fd5b50612d8b89828a01612b96565b979a9699509497509295939492505050565b63b95aa35560e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612dce57612dce612d9d565b604051601f8501601f19908116603f01168101908282118183101715612df657612df6612d9d565b81604052809350858152868686011115612e0f57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612e3b57600080fd5b813567ffffffffffffffff811115612e5257600080fd5b8201601f81018413612e6357600080fd5b612e7284823560208401612db3565b949350505050565b60005b83811015612e95578181015183820152602001612e7d565b83811115612ea4576000848401","525b50505050565b60008151808452612ec2816020860160208601612e7a565b601f01601f19169290920160200192915050565b6000815160608452805160406060860152612ef460a0860182612eaa565b905060208201519150605f19858203016080860152612f138183612eaa565b91505060208301516020850152604083015160408501528091505092915050565b608081526000612f476080830187612ed6565b8281036020840152612f598187612eaa565b90508281036040840152845160608252612f766060830182612eaa565b905060208601518282036020840152612f8f8282612eaa565b91505060408601518282036040840152612fa98282612eaa565b925050508281036060840152612fbf8185612eaa565b979650505050505050565b606081526000612fdd6060830186612eaa565b841515602084015282810360408401528351604082526130006040830182612eaa565b9050602085015182820360208401526130198282612eaa565b98975050505050505050565b60208082526030908201527f4d6f6e69746f7256657269666965724d73673a206e6f206d6f6e69746f72206e60408201526f6f646520656e646f72736520696e666f60801b606082015260800190565b8183823760009101908152919050565b600181811c9082168061309957607f821691505b60208210811415612cde5763b95aa35560e01b600052602260045260246000fd5b6000808335601e198436030181126130d157600080fd5b83018035915067ffffffffffffffff8211156130ec57600080fd5b6020019150368190038213156124e557600080fd5b601f821115610ed957600081815260208120601f850160051c810160208610156131285750805b601f850160051c820191505b8181101561314757828155600101613134565b505050505050565b600019600383901b1c191660019190911b1790565b67ffffffffffffffff83111561317c5761317c612d9d565b6131908361318a8354613085565b83613101565b6000601f8411600181146131be57600085156131ac5750838201355b6131b6868261314f565b845550613218565b600083815260209020601f19861690835b828110156131ef57868501358255602094850194600190920191016131cf565b508682101561320c5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8135603e1983360301811261323357600080fd5b820161323f81806130ba565b67ffffffffffffffff81111561325757613257612d9d565b61326b816132658654613085565b86613101565b6000601f82116001811461329957600083156132875750838201355b613291848261314f565b8755506132f3565b600086815260209020601f19841690835b828110156132ca57868501358255602094850194600190920191016132aa565b50848210156132e75760001960f88660031b161c19848701351681555b505060018360011b0186555b5050505061330460208201826130ba565b9150613314828260018601613164565b505060208201356002820155604082013560038201555050565b61333882836130ba565b67ffffffffffffffff81111561335057613350612d9d565b6133648161335e8554613085565b85613101565b6000601f82116001811461339257600083156133805750838201355b61338a848261314f565b8655506133ec565b600085815260209020601f19841690835b828110156133c357868501358255602094850194600190920191016133a3565b50848210156133e05760001960f88660031b161c19848701351681555b505060018360011b0185555b505050506133fd60208301836130ba565b61340b818360018601613164565b505061341a60408301836130ba565b612ea4818360028601613164565b600080835461343681613085565b6001828116801561344e576001811461345f5761348e565b60ff1984168752828701945061348e565b8760005260208060002060005b858110156134855781548a82015290840190820161346c565b50505082870194505b50929695505050505050565b63b95aa35560e01b600052603260045260246000fd5b600082516134c2818460208701612e7a565b9190910192915050565b6060815260006134df6060830186612eaa565b82810360208401526134f18186612eaa565b905082810360408401526121988185612eaa565b63b95aa35560e01b600052601160045260246000fd5b600060001982141561352f5761352f613505565b5060010190565b6060815260006135496060830186612eaa565b828103602084015261355b8186612eaa565b9150508215156040830152949350505050565b6080815260006135816080830187612ed6565b82810360208401526135938187612eaa565b905082810360408401526135a78186612eaa565b915050821515606083015295945050505050565b6000828210156135cd576135cd613505565b500390565b600060ff821660ff84168060ff038211156135ef576135ef613505565b019392505050565b600060ff821660ff84168082101561361157613611613505565b90039392505050565b6000821982111561362d5761362d613505565b500190565b600063ffffffff80831681851680830382111561365157613651613505565b01949350505050565b63b95aa35560e01b600052602160045260246000fd5b828152604060208201526000612e726040830184612eaa565b60006020828403121561369b57600080fd5b5051919050565b600181815b808511156136dd5781600019048211156136c3576136c3613505565b808516156136d057918102915b93841c93908002906136a7565b509250929050565b6000826136f45750600161213b565b816137015750600061213b565b816001811461371757600281146137215761373d565b600191505061213b565b60ff84111561373257613732613505565b50506001821b61213b565b5060208310610133831016604e8410600b8410161715613760575081810a61213b565b61376a83836136a2565b806000190482111561377e5761377e613505565b029392505050565b6000612cc583836136e556fea264697066735822122049aa6b7efa5ecfd146192eccdc32f9abfb2e54d7ea179a757c30a1d457b2154564736f6c634300080b0033"}; + + public static final String SM_BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", SM_BINARY_ARRAY); + + public static final String[] ABI_ARRAY = {"[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"committeeId\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"nodeId\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"rawPublicKey\",\"type\":\"bytes\"}],\"name\":\"UpdateMonitorNodeEndorseInfo\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"getPtcHubAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"monitorNodeEndorseInfoMap\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"nodeId\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"required\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"keyId\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"rawPublicKey\",\"type\":\"bytes\"}],\"internalType\":\"struct NodePublicKeyEntry\",\"name\":\"publicKey\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"monitorNodeProofMessage\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"}],\"internalType\":\"struct CrossChainChannel\",\"name\":\"channel\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"senderId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"receiverId\",\"type\":\"bytes32\"}],\"internalType\":\"struct CrossChainLane\",\"name\":\"crossChainLane\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"committeeId\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nodeId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"signAlgo\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct CommitteeNodeProof\",\"name\":\"monitorNodeProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"encodedToSign\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ptcHubAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"}],\"internalType\":\"struct CrossChainChannel\",\"name\":\"channel\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"senderId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"receiverId\",\"type\":\"bytes32\"}],\"internalType\":\"struct CrossChainLane\",\"name\":\"newCrossChainLane\",\"type\":\"tuple\"},{\"internalType\":\"string\",\"name\":\"newCommitteeId\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"nodeId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"signAlgo\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct CommitteeNodeProof\",\"name\":\"newMonitorNodeProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"newEncodedToSign\",\"type\":\"bytes\"}],\"name\":\"receiveMonitorNodeProofMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPtcHubAddress\",\"type\":\"address\"}],\"name\":\"setPtcHubAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawEndorseRoot\",\"type\":\"bytes\"}],\"name\":\"updateMonitorNodeEndorseInfo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifyMonitorNodeProofMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"committeeId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"signAlgo\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"rawProof\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"rawMonitorOrder\",\"type\":\"bytes\"}],\"name\":\"verifyMonitorOrder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"}; + + public static final String ABI = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", ABI_ARRAY); + + public static final String FUNC_GETPTCHUBADDRESS = "getPtcHubAddress"; + + public static final String FUNC_INIT = "init"; + + public static final String FUNC_MONITORNODEENDORSEINFOMAP = "monitorNodeEndorseInfoMap"; + + public static final String FUNC_MONITORNODEPROOFMESSAGE = "monitorNodeProofMessage"; + + public static final String FUNC_OWNER = "owner"; + + public static final String FUNC_PTCHUBADDRESS = "ptcHubAddress"; + + public static final String FUNC_RECEIVEMONITORNODEPROOFMESSAGE = "receiveMonitorNodeProofMessage"; + + public static final String FUNC_RENOUNCEOWNERSHIP = "renounceOwnership"; + + public static final String FUNC_SETPTCHUBADDRESS = "setPtcHubAddress"; + + public static final String FUNC_TRANSFEROWNERSHIP = "transferOwnership"; + + public static final String FUNC_UPDATEMONITORNODEENDORSEINFO = "updateMonitorNodeEndorseInfo"; + + public static final String FUNC_VERIFYMONITORNODEPROOFMESSAGE = "verifyMonitorNodeProofMessage"; + + public static final String FUNC_VERIFYMONITORORDER = "verifyMonitorOrder"; + + public static final Event INITIALIZED_EVENT = new Event("Initialized", + Arrays.>asList(new TypeReference() {})); + ; + + public static final Event OWNERSHIPTRANSFERRED_EVENT = new Event("OwnershipTransferred", + Arrays.>asList(new TypeReference
(true) {}, new TypeReference
(true) {})); + ; + + public static final Event UPDATEMONITORNODEENDORSEINFO_EVENT = new Event("UpdateMonitorNodeEndorseInfo", + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + ; + + protected MonitorVerifier(String contractAddress, Client client, CryptoKeyPair credential) { + super(getBinary(client.getCryptoSuite()), contractAddress, client, credential); + this.transactionManager = new ProxySignTransactionManager(client); + } + + public static String getBinary(CryptoSuite cryptoSuite) { + return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY); + } + + public static String getABI() { + return ABI; + } + + public List getInitializedEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(INITIALIZED_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + InitializedEventResponse typedResponse = new InitializedEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.version = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeInitializedEvent(BigInteger fromBlock, BigInteger toBlock, + List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(INITIALIZED_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeInitializedEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(INITIALIZED_EVENT); + subscribeEvent(topic0,callback); + } + + public List getOwnershipTransferredEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(OWNERSHIPTRANSFERRED_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + OwnershipTransferredEventResponse typedResponse = new OwnershipTransferredEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.previousOwner = (String) eventValues.getIndexedValues().get(0).getValue(); + typedResponse.newOwner = (String) eventValues.getIndexedValues().get(1).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeOwnershipTransferredEvent(BigInteger fromBlock, BigInteger toBlock, + List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(OWNERSHIPTRANSFERRED_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeOwnershipTransferredEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(OWNERSHIPTRANSFERRED_EVENT); + subscribeEvent(topic0,callback); + } + + public List getUpdateMonitorNodeEndorseInfoEvents( + TransactionReceipt transactionReceipt) { + List valueList = extractEventParametersWithLog(UPDATEMONITORNODEENDORSEINFO_EVENT, transactionReceipt); + ArrayList responses = new ArrayList(valueList.size()); + for (Contract.EventValuesWithLog eventValues : valueList) { + UpdateMonitorNodeEndorseInfoEventResponse typedResponse = new UpdateMonitorNodeEndorseInfoEventResponse(); + typedResponse.log = eventValues.getLog(); + typedResponse.committeeId = (String) eventValues.getNonIndexedValues().get(0).getValue(); + typedResponse.nodeId = (String) eventValues.getNonIndexedValues().get(1).getValue(); + typedResponse.rawPublicKey = (byte[]) eventValues.getNonIndexedValues().get(2).getValue(); + responses.add(typedResponse); + } + return responses; + } + + public void subscribeUpdateMonitorNodeEndorseInfoEvent(BigInteger fromBlock, BigInteger toBlock, + List otherTopics, EventSubCallback callback) { + String topic0 = eventEncoder.encode(UPDATEMONITORNODEENDORSEINFO_EVENT); + subscribeEvent(topic0,otherTopics,fromBlock,toBlock,callback); + } + + public void subscribeUpdateMonitorNodeEndorseInfoEvent(EventSubCallback callback) { + String topic0 = eventEncoder.encode(UPDATEMONITORNODEENDORSEINFO_EVENT); + subscribeEvent(topic0,callback); + } + + public String getPtcHubAddress() throws ContractException { + final Function function = new Function(FUNC_GETPTCHUBADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodGetPtcHubAddressRawFunction() throws ContractException { + final Function function = new Function(FUNC_GETPTCHUBADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + + public TransactionReceipt init() { + final Function function = new Function( + FUNC_INIT, + Arrays.asList(), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodInitRawFunction() throws ContractException { + final Function function = new Function(FUNC_INIT, + Arrays.asList(), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForInit() { + final Function function = new Function( + FUNC_INIT, + Arrays.asList(), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String init(TransactionCallback callback) { + final Function function = new Function( + FUNC_INIT, + Arrays.asList(), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple3 monitorNodeEndorseInfoMap(String param0) + throws ContractException { + final Function function = new Function(FUNC_MONITORNODEENDORSEINFOMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(param0)), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = executeCallWithMultipleValueReturn(function); + return new Tuple3( + (String) results.get(0).getValue(), + (Boolean) results.get(1).getValue(), + (NodePublicKeyEntry) results.get(2).getValue()); + } + + public Function getMethodMonitorNodeEndorseInfoMapRawFunction(String param0) throws + ContractException { + final Function function = new Function(FUNC_MONITORNODEENDORSEINFOMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(param0)), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + return function; + } + + public Tuple4 monitorNodeProofMessage() + throws ContractException { + final Function function = new Function(FUNC_MONITORNODEPROOFMESSAGE, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = executeCallWithMultipleValueReturn(function); + return new Tuple4( + (CrossChainLane) results.get(0).getValue(), + (String) results.get(1).getValue(), + (CommitteeNodeProof) results.get(2).getValue(), + (byte[]) results.get(3).getValue()); + } + + public Function getMethodMonitorNodeProofMessageRawFunction() throws ContractException { + final Function function = new Function(FUNC_MONITORNODEPROOFMESSAGE, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + return function; + } + + public String owner() throws ContractException { + final Function function = new Function(FUNC_OWNER, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodOwnerRawFunction() throws ContractException { + final Function function = new Function(FUNC_OWNER, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + + public String ptcHubAddress() throws ContractException { + final Function function = new Function(FUNC_PTCHUBADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodPtcHubAddressRawFunction() throws ContractException { + final Function function = new Function(FUNC_PTCHUBADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + + public TransactionReceipt receiveMonitorNodeProofMessage(CrossChainLane newCrossChainLane, + String newCommitteeId, CommitteeNodeProof newMonitorNodeProof, + byte[] newEncodedToSign) { + final Function function = new Function( + FUNC_RECEIVEMONITORNODEPROOFMESSAGE, + Arrays.asList(newCrossChainLane, + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(newCommitteeId), + newMonitorNodeProof, + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(newEncodedToSign)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodReceiveMonitorNodeProofMessageRawFunction( + CrossChainLane newCrossChainLane, String newCommitteeId, + CommitteeNodeProof newMonitorNodeProof, byte[] newEncodedToSign) throws + ContractException { + final Function function = new Function(FUNC_RECEIVEMONITORNODEPROOFMESSAGE, + Arrays.asList(newCrossChainLane, + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(newCommitteeId), + newMonitorNodeProof, + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(newEncodedToSign)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForReceiveMonitorNodeProofMessage( + CrossChainLane newCrossChainLane, String newCommitteeId, + CommitteeNodeProof newMonitorNodeProof, byte[] newEncodedToSign) { + final Function function = new Function( + FUNC_RECEIVEMONITORNODEPROOFMESSAGE, + Arrays.asList(newCrossChainLane, + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(newCommitteeId), + newMonitorNodeProof, + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(newEncodedToSign)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String receiveMonitorNodeProofMessage(CrossChainLane newCrossChainLane, + String newCommitteeId, CommitteeNodeProof newMonitorNodeProof, byte[] newEncodedToSign, + TransactionCallback callback) { + final Function function = new Function( + FUNC_RECEIVEMONITORNODEPROOFMESSAGE, + Arrays.asList(newCrossChainLane, + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(newCommitteeId), + newMonitorNodeProof, + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(newEncodedToSign)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple4 getReceiveMonitorNodeProofMessageInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_RECEIVEMONITORNODEPROOFMESSAGE, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple4( + + (CrossChainLane) results.get(0), + (String) results.get(1).getValue(), + (CommitteeNodeProof) results.get(2), + (byte[]) results.get(3).getValue() + ); + } + + public TransactionReceipt renounceOwnership() { + final Function function = new Function( + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodRenounceOwnershipRawFunction() throws ContractException { + final Function function = new Function(FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForRenounceOwnership() { + final Function function = new Function( + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String renounceOwnership(TransactionCallback callback) { + final Function function = new Function( + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public TransactionReceipt setPtcHubAddress(String newPtcHubAddress) { + final Function function = new Function( + FUNC_SETPTCHUBADDRESS, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newPtcHubAddress)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSetPtcHubAddressRawFunction(String newPtcHubAddress) throws + ContractException { + final Function function = new Function(FUNC_SETPTCHUBADDRESS, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newPtcHubAddress)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForSetPtcHubAddress(String newPtcHubAddress) { + final Function function = new Function( + FUNC_SETPTCHUBADDRESS, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newPtcHubAddress)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String setPtcHubAddress(String newPtcHubAddress, TransactionCallback callback) { + final Function function = new Function( + FUNC_SETPTCHUBADDRESS, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newPtcHubAddress)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple1 getSetPtcHubAddressInput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SETPTCHUBADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (String) results.get(0).getValue() + ); + } + + public TransactionReceipt transferOwnership(String newOwner) { + final Function function = new Function( + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodTransferOwnershipRawFunction(String newOwner) throws + ContractException { + final Function function = new Function(FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForTransferOwnership(String newOwner) { + final Function function = new Function( + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String transferOwnership(String newOwner, TransactionCallback callback) { + final Function function = new Function( + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple1 getTransferOwnershipInput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_TRANSFEROWNERSHIP, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (String) results.get(0).getValue() + ); + } + + public TransactionReceipt updateMonitorNodeEndorseInfo(byte[] rawEndorseRoot) { + final Function function = new Function( + FUNC_UPDATEMONITORNODEENDORSEINFO, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawEndorseRoot)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodUpdateMonitorNodeEndorseInfoRawFunction(byte[] rawEndorseRoot) throws + ContractException { + final Function function = new Function(FUNC_UPDATEMONITORNODEENDORSEINFO, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawEndorseRoot)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForUpdateMonitorNodeEndorseInfo(byte[] rawEndorseRoot) { + final Function function = new Function( + FUNC_UPDATEMONITORNODEENDORSEINFO, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawEndorseRoot)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String updateMonitorNodeEndorseInfo(byte[] rawEndorseRoot, + TransactionCallback callback) { + final Function function = new Function( + FUNC_UPDATEMONITORNODEENDORSEINFO, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawEndorseRoot)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple1 getUpdateMonitorNodeEndorseInfoInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_UPDATEMONITORNODEENDORSEINFO, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (byte[]) results.get(0).getValue() + ); + } + + public TransactionReceipt verifyMonitorNodeProofMessage() { + final Function function = new Function( + FUNC_VERIFYMONITORNODEPROOFMESSAGE, + Arrays.asList(), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodVerifyMonitorNodeProofMessageRawFunction() throws ContractException { + final Function function = new Function(FUNC_VERIFYMONITORNODEPROOFMESSAGE, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String getSignedTransactionForVerifyMonitorNodeProofMessage() { + final Function function = new Function( + FUNC_VERIFYMONITORNODEPROOFMESSAGE, + Arrays.asList(), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String verifyMonitorNodeProofMessage(TransactionCallback callback) { + final Function function = new Function( + FUNC_VERIFYMONITORNODEPROOFMESSAGE, + Arrays.asList(), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple1 getVerifyMonitorNodeProofMessageOutput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getOutput(); + final Function function = new Function(FUNC_VERIFYMONITORNODEPROOFMESSAGE, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (Boolean) results.get(0).getValue() + ); + } + + public TransactionReceipt verifyMonitorOrder(String committeeId, String signAlgo, + byte[] rawProof, byte[] rawMonitorOrder) { + final Function function = new Function( + FUNC_VERIFYMONITORORDER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(committeeId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(signAlgo), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawProof), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawMonitorOrder)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodVerifyMonitorOrderRawFunction(String committeeId, String signAlgo, + byte[] rawProof, byte[] rawMonitorOrder) throws ContractException { + final Function function = new Function(FUNC_VERIFYMONITORORDER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(committeeId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(signAlgo), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawProof), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawMonitorOrder)), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String getSignedTransactionForVerifyMonitorOrder(String committeeId, String signAlgo, + byte[] rawProof, byte[] rawMonitorOrder) { + final Function function = new Function( + FUNC_VERIFYMONITORORDER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(committeeId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(signAlgo), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawProof), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawMonitorOrder)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String verifyMonitorOrder(String committeeId, String signAlgo, byte[] rawProof, + byte[] rawMonitorOrder, TransactionCallback callback) { + final Function function = new Function( + FUNC_VERIFYMONITORORDER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(committeeId), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(signAlgo), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawProof), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawMonitorOrder)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple4 getVerifyMonitorOrderInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_VERIFYMONITORORDER, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple4( + + (String) results.get(0).getValue(), + (String) results.get(1).getValue(), + (byte[]) results.get(2).getValue(), + (byte[]) results.get(3).getValue() + ); + } + + public Tuple1 getVerifyMonitorOrderOutput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getOutput(); + final Function function = new Function(FUNC_VERIFYMONITORORDER, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (Boolean) results.get(0).getValue() + ); + } + + public static MonitorVerifier load(String contractAddress, Client client, + CryptoKeyPair credential) { + return new MonitorVerifier(contractAddress, client, credential); + } + + public static MonitorVerifier deploy(Client client, CryptoKeyPair credential) throws + ContractException { + return deploy(MonitorVerifier.class, client, credential, getBinary(client.getCryptoSuite()), getABI(), null, null); + } + + public static class NodePublicKeyEntry extends DynamicStruct { + public String keyId; + + public byte[] rawPublicKey; + + public NodePublicKeyEntry(Utf8String keyId, DynamicBytes rawPublicKey) { + super(keyId,rawPublicKey); + this.keyId = keyId.getValue(); + this.rawPublicKey = rawPublicKey.getValue(); + } + + public NodePublicKeyEntry(String keyId, byte[] rawPublicKey) { + super(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(keyId),new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawPublicKey)); + this.keyId = keyId; + this.rawPublicKey = rawPublicKey; + } + } + + public static class CrossChainChannel extends DynamicStruct { + public String senderDomain; + + public String receiverDomain; + + public CrossChainChannel(Utf8String senderDomain, Utf8String receiverDomain) { + super(senderDomain,receiverDomain); + this.senderDomain = senderDomain.getValue(); + this.receiverDomain = receiverDomain.getValue(); + } + + public CrossChainChannel(String senderDomain, String receiverDomain) { + super(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain),new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain)); + this.senderDomain = senderDomain; + this.receiverDomain = receiverDomain; + } + } + + public static class CommitteeNodeProof extends DynamicStruct { + public String nodeId; + + public String signAlgo; + + public byte[] signature; + + public CommitteeNodeProof(Utf8String nodeId, Utf8String signAlgo, DynamicBytes signature) { + super(nodeId,signAlgo,signature); + this.nodeId = nodeId.getValue(); + this.signAlgo = signAlgo.getValue(); + this.signature = signature.getValue(); + } + + public CommitteeNodeProof(String nodeId, String signAlgo, byte[] signature) { + super(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(nodeId),new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(signAlgo),new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(signature)); + this.nodeId = nodeId; + this.signAlgo = signAlgo; + this.signature = signature; + } + } + + public static class CrossChainLane extends DynamicStruct { + public CrossChainChannel channel; + + public byte[] senderId; + + public byte[] receiverId; + + public CrossChainLane(CrossChainChannel channel, Bytes32 senderId, Bytes32 receiverId) { + super(channel,senderId,receiverId); + this.channel = channel; + this.senderId = senderId.getValue(); + this.receiverId = receiverId.getValue(); + } + + public CrossChainLane(CrossChainChannel channel, byte[] senderId, byte[] receiverId) { + super(channel,new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderId),new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverId)); + this.channel = channel; + this.senderId = senderId; + this.receiverId = receiverId; + } + } + + public static class InitializedEventResponse { + public TransactionReceipt.Logs log; + + public BigInteger version; + } + + public static class OwnershipTransferredEventResponse { + public TransactionReceipt.Logs log; + + public String previousOwner; + + public String newOwner; + } + + public static class UpdateMonitorNodeEndorseInfoEventResponse { + public TransactionReceipt.Logs log; + + public String committeeId; + + public String nodeId; + + public byte[] rawPublicKey; + } +} diff --git a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/PtcHub.java b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/PtcHub.java index af2f5ddf..bca4c955 100644 --- a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/PtcHub.java +++ b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/PtcHub.java @@ -28,19 +28,20 @@ import org.fisco.bcos.sdk.v3.model.CryptoType; import org.fisco.bcos.sdk.v3.model.TransactionReceipt; import org.fisco.bcos.sdk.v3.model.callback.TransactionCallback; +import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.ProxySignTransactionManager; import org.fisco.bcos.sdk.v3.transaction.model.exception.ContractException; @SuppressWarnings("unchecked") public class PtcHub extends Contract { - public static final String[] BINARY_ARRAY = {"60806040523480156200001157600080fd5b50604051620082dc380380620082dc833981016040819052620000349162002097565b6200003f336200005b565b6200004a81620000ab565b620000546200022e565b506200237c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000620000c382620002fa60201b6200187f1760201c565b9050600081604001516003811115620000e057620000e06200214f565b14620001335760405162461bcd60e51b815260206004820152601e60248201527f77726f6e67207479706520666f72206263646e7320726f6f742063657274000060448201526064015b60405180910390fd5b6000620001606200014f836200056660201b62001a471760201c565b620006b860201b62001b7a1760201c565b805190602001209050826001604051806040016040528060048152602001631c9bdbdd60e21b81525060405162000198919062002165565b90815260200160405180910390209080519060200190620001bb92919062001e6e565b5060408051808201825260048152631c9bdbdd60e21b602080830191825260008581526002909152929092209051620001f5929062001e6e565b506040518181527f7c787bfbe942686b5f41acec151012ca79c6b81c1c5a23cee512781cf3d5b9bb9060200160405180910390a1505050565b600054600160a81b900460ff16156200029a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016200012a565b60005460ff600160a01b90910481161015620002f8576000805460ff60a01b191660ff60a01b17905560405160ff81527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6200030462001efd565b6200030e62001efd565b60006200032684620007f060201b62001c711760201c565b905060005b8160200151518110156200055d5760008260200151828151811062000354576200035462002183565b60200260200101519050600061ffff16816000015161ffff16141562000392576200038a8162000a1b60201b62001e4c1760201c565b845262000547565b805161ffff1660011415620003c257620003b78162000a1b60201b62001e4c1760201c565b602085015262000547565b805161ffff16600214156200043657620003e78162000a2260201b62001e531760201c565b60ff166003811115620003fe57620003fe6200214f565b846040019060038111156200041757620004176200214f565b908160038111156200042d576200042d6200214f565b90525062000547565b805161ffff16600314156200047057620004656200045f8262000a1b60201b62001e4c1760201c565b62000a46565b606085015262000547565b805161ffff1660041415620004a957620004958162000b6360201b62001e641760201c565b6001600160401b0316608085015262000547565b805161ffff1660051415620004e257620004ce8162000b6360201b62001e641760201c565b6001600160401b031660a085015262000547565b805161ffff16600614156200051257620005078162000a1b60201b62001e4c1760201c565b60c085015262000547565b805161ffff16600714156200054757620005416200053b8262000a1b60201b62001e4c1760201c565b62000b96565b60e08501525b50806200055481620021af565b9150506200032b565b50909392505050565b6200057062001f83565b6000826040015160038111156200058b576200058b6200214f565b1415620005ac5760c0820151620005a29062000d13565b6020015192915050565b600182604001516003811115620005c757620005c76200214f565b1415620005e85760c0820151620005de9062000e20565b6080015192915050565b6002826040015160038111156200060357620006036200214f565b1415620006245760c08201516200061a9062001001565b6060015192915050565b6003826040015160038111156200063f576200063f6200214f565b1415620006605760c08201516200065690620011b2565b6040015192915050565b60405162461bcd60e51b815260206004820152602660248201527f676574436572744f776e65724f69643a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b60648201526084016200012a565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081620006d257905050905062000749600062000738856000015160018111156200072757620007276200214f565b620012ef60201b62001e7d1760201c565b6200130660201b62001e911760201c565b816000815181106200075f576200075f62002183565b602002602001018190525062000786600184602001516200138260201b62001efe1760201c565b816001815181106200079c576200079c62002183565b6020026020010181905250620007c96040518060400160405280600061ffff168152602001606081525090565b818160200181905250620007e881620013c560201b62001f411760201c565b949350505050565b604080518082019091526000815260606020820152600682511015620008595760405162461bcd60e51b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e67746800000000000000000060448201526064016200012a565b60408051808201909152600080825260606020830152906200089c6200088b85846200154460201b620020461760201c565b6200156f60201b6200206e1760201c565b61ffff168152620008af600683620021cd565b91506000825b85518110156200092d57620008f7620008e687620008d5846002620021cd565b6200161760201b6200210f1760201c565b6200164460201b620021391760201c565b62000904906006620021e8565b620009169063ffffffff1682620021cd565b9050816200092481620021af565b925050620008b5565b6000826001600160401b038111156200094a576200094a6200204e565b6040519080825280602002602001820160405280156200099957816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081620009695790505b509050600092505b865185101562000a0c5760408051606080820183526000808352602083015291810191909152620009d388876200174b565b96509050808285620009e581620021af565b965081518110620009fa57620009fa62002183565b602002602001018190525050620009a1565b60208401525090949350505050565b6040015190565b600062000a4060018360400151620018d560201b620022331760201c565b92915050565b62000a5062001f83565b62000a5a62001f83565b600062000a7284620007f060201b62001c711760201c565b905060005b8160200151518110156200055d5760008260200151828151811062000aa05762000aa062002183565b60200260200101519050600061ffff16816000015161ffff16141562000b225762000ad68162000a2260201b62001e531760201c565b60ff16600181111562000aed5762000aed6200214f565b8490600181111562000b035762000b036200214f565b9081600181111562000b195762000b196200214f565b90525062000b4d565b805161ffff166001141562000b4d5762000b478162000a1b60201b62001e4c1760201c565b60208501525b508062000b5a81620021af565b91505062000a77565b600062000a4062000b8560088460400151620018d560201b620022331760201c565b620018da60201b620022381760201c565b62000bc26040518060800160405280606081526020016060815260200160608152602001606081525090565b62000bee6040518060800160405280606081526020016060815260200160608152602001606081525090565b600062000c0684620007f060201b62001c711760201c565b905060005b8160200151518110156200055d5760008260200151828151811062000c345762000c3462002183565b60200260200101519050600061ffff16816000015161ffff16141562000c725762000c6a8162000a1b60201b62001e4c1760201c565b845262000cfd565b805161ffff166001141562000ca25762000c978162000a1b60201b62001e4c1760201c565b602085015262000cfd565b805161ffff166002141562000cd25762000cc78162000a1b60201b62001e4c1760201c565b604085015262000cfd565b805161ffff166003141562000cfd5762000cf78162000a1b60201b62001e4c1760201c565b60608501525b508062000d0a81620021af565b91505062000c0b565b62000d1d62001f9e565b62000d2762001f9e565b600062000d3f84620007f060201b62001c711760201c565b905060005b8160200151518110156200055d5760008260200151828151811062000d6d5762000d6d62002183565b60200260200101519050600061ffff16816000015161ffff16141562000dab5762000da38162000a1b60201b62001e4c1760201c565b845262000e0a565b805161ffff166001141562000ddf5762000dd46200045f8262000a1b60201b62001e4c1760201c565b602085015262000e0a565b805161ffff166002141562000e0a5762000e048162000a1b60201b62001e4c1760201c565b60408501525b508062000e1781620021af565b91505062000d44565b62000e2a62001fba565b62000e3462001fba565b600062000e4c84620007f060201b62001c711760201c565b905060005b8160200151518110156200055d5760008260200151828151811062000e7a5762000e7a62002183565b60200260200101519050600061ffff16816000015161ffff16141562000eb85762000eb08162000a1b60201b62001e4c1760201c565b845262000feb565b805161ffff166001141562000f2c5762000edd8162000a2260201b62001e531760201c565b60ff16600181111562000ef45762000ef46200214f565b8460200190600181111562000f0d5762000f0d6200214f565b9081600181111562000f235762000f236200214f565b90525062000feb565b805161ffff166002141562000f5c5762000f518162000a1b60201b62001e4c1760201c565b604085015262000feb565b805161ffff166003141562000f8c5762000f818162000a1b60201b62001e4c1760201c565b606085015262000feb565b805161ffff166004141562000fc05762000fb56200045f8262000a1b60201b62001e4c1760201c565b608085015262000feb565b805161ffff166005141562000feb5762000fe58162000a1b60201b62001e4c1760201c565b60a08501525b508062000ff881620021af565b91505062000e51","565b6200100b62001fec565b6200101562001fec565b60006200102d84620007f060201b62001c711760201c565b905060005b8160200151518110156200055d576000826020015182815181106200105b576200105b62002183565b60200260200101519050600061ffff16816000015161ffff1614156200109957620010918162000a1b60201b62001e4c1760201c565b84526200119c565b805161ffff1660011415620010c957620010be8162000a1b60201b62001e4c1760201c565b60208501526200119c565b805161ffff16600214156200113d57620010ee8162000a2260201b62001e531760201c565b60ff1660028111156200110557620011056200214f565b846040019060028111156200111e576200111e6200214f565b908160028111156200113457620011346200214f565b9052506200119c565b805161ffff16600314156200117157620011666200045f8262000a1b60201b62001e4c1760201c565b60608501526200119c565b805161ffff16600414156200119c57620011968162000a1b60201b62001e4c1760201c565b60808501525b5080620011a981620021af565b91505062001032565b620011bc62002014565b620011c662002014565b6000620011de84620007f060201b62001c711760201c565b905060005b8160200151518110156200055d576000826020015182815181106200120c576200120c62002183565b60200260200101519050600061ffff16816000015161ffff1614156200124a57620012428162000a1b60201b62001e4c1760201c565b8452620012d9565b805161ffff16600114156200127a576200126f8162000a1b60201b62001e4c1760201c565b6020850152620012d9565b805161ffff1660031415620012ae57620012a36200045f8262000a1b60201b62001e4c1760201c565b6040850152620012d9565b805161ffff1660041415620012d957620012d38162000a1b60201b62001e4c1760201c565b60608501525b5080620012e681620021af565b915050620011e3565b600081600181111562000a405762000a406200214f565b6040805160608082018352600080835260208301819052828401919091528251600180825281850190945291929091906020820181803683370190505090506200135e6001848362001ab160201b620023f61760201c565b6040805160608101825261ffff959095168552600160208601528401525090919050565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b60606000620013df8362001ac260201b620024071760201c565b90506000620013f0826006620021e8565b63ffffffff166001600160401b038111156200141057620014106200204e565b6040519080825280601f01601f1916602001820160405280156200143b576020820181803683370190505b5090506200147060026200145e86600001516200156f60201b6200206e1760201c565b8362001b5160201b6200247b1760201c565b6200149e60066200148c846200164460201b620021391760201c565b8362001b6260201b6200248c1760201c565b600660005b620014b98662001b7360201b6200249d1760201c565b8110156200153a576000620014f987602001518381518110620014e057620014e062002183565b602002602001015162001b7b60201b620024a51760201c565b90506200151383828662001c3d60201b620025341760201c565b8051620015219084620021cd565b92505080806200153190620021af565b915050620014a3565b5090949350505050565b815160009062001556836002620021cd565b11156200156257600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b81600081518110620015b557620015b562002183565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600181518110620015e957620015e962002183565b60200101906001600160f81b031916908160001a90535060006200160e828262001544565b95945050505050565b815160009062001629836004620021cd565b11156200163557600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b816000815181106200168a576200168a62002183565b60200101906001600160f81b031916908160001a9053508160021a60f81b81600181518110620016be57620016be62002183565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600281518110620016f257620016f262002183565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160038151811062001726576200172662002183565b60200101906001600160f81b031916908160001a90535060006200160e828262001617565b60408051606080820183526000808352602083015291810191909152600082845111620017c75760405162461bcd60e51b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b60648201526084016200012a565b60068310156200180b5760405162461bcd60e51b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b60448201526064016200012a565b60408051606080820183526000808352602083015291810191909152620018426200088b86866200154460201b620020461760201c565b61ffff16815262001855600285620021cd565b935062001872620008e686866200161760201b6200210f1760201c565b63ffffffff1660208201526200188a600485620021cd565b9350620018ae8585836020015163ffffffff1662001d2a60201b620026181760201c565b60408201526020810151620018ca9063ffffffff1685620021cd565b909590945092505050565b015190565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b8160008151811062001920576200192062002183565b60200101906001600160f81b031916908160001a9053508160061a60f81b8160018151811062001954576200195462002183565b60200101906001600160f81b031916908160001a9053508160051a60f81b8160028151811062001988576200198862002183565b60200101906001600160f81b031916908160001a9053508160041a60f81b81600381518110620019bc57620019bc62002183565b60200101906001600160f81b031916908160001a9053508160031a60f81b81600481518110620019f057620019f062002183565b60200101906001600160f81b031916908160001a9053508160021a60f81b8160058151811062001a245762001a2462002183565b60200101906001600160f81b031916908160001a9053508160011a60f81b8160068151811062001a585762001a5862002183565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160078151811062001a8c5762001a8c62002183565b60200101906001600160f81b031916908160001a90535060006200160e828262001db4565b909101600019810180519290915252565b600080805b62001add8462001b7360201b6200249d1760201c565b81101562001b4a5760008460200151828151811062001b005762001b0062002183565b6020026020010151905080604001515183600662001b1f9190620021e8565b63ffffffff1662001b319190620021cd565b925050808062001b4190620021af565b91505062001ac7565b5092915050565b909101600119810180519290915252565b909101600319810180519290915252565b602001515190565b606060008260200151600662001b929190620021e8565b63ffffffff166001600160401b0381111562001bb25762001bb26200204e565b6040519080825280601f01601f19166020018201604052801562001bdd576020820181803683370190505b50905062001c0060026200145e85600001516200156f60201b6200206e1760201c565b62001c2060066200148c85602001516200164460201b620021391760201c565b62000a40600684604001518362001c3d60201b620025341760201c565b8151815162001c5363ffffffff831686620021cd565b111562001cd45760405162461bcd60e51b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a4016200012a565b8015801562001ce35762001d23565b8483018051601f84168015602002818801018581018215602002838601015b8183101562001d1c57825181526020928301920162001d02565b5050509152505b5050505050565b825160609062001d3b8385620021cd565b111562001d4757600080fd5b6000826001600160401b0381111562001d645762001d646200204e565b6040519080825280601f01601f19166020018201604052801562001d8f576020820181803683370190505b5090506020808201908686010162001da982828762001de4565b509095945050505050565b815160009062001dc6836008620021cd565b111562001dd257600080fd5b5001600801516001600160401b031690565b6020811062001e24578151835262001dfe602084620021cd565b925062001e0d602083620021cd565b915062001e1c60208262002213565b905062001de4565b8062001e2f57505050565b6000600162001e4083602062002213565b62001e4e906101006200232a565b62001e5a919062002213565b925184518416931916929092179092525050565b82805462001e7c906200233f565b90600052602060002090601f01602090048101928262001ea0576000855562001eeb565b82601f1062001ebb57805160ff191683800117855562001eeb565b8280016001018555821562001eeb579182015b8281111562001eeb57825182559160200191906001019062001ece565b5062001ef992915062002037565b5090565b6040805161010081018252606080825260208201529081016000815260200162001f2662001f83565b815260200160006001600160401b0316815260200160006001600160401b031681526020016060815260200162001f7e6040518060800160405280606081526020016060815260200160608152602001606081525090565b905290565b604080518082019091528060005b8152602001606081525090565b60405180606001604052806060815260200162001f9162001f83565b6040805160c08101909152606081526020810160008152602001606081526020016060815260200162001f9162001f83565b6040805160a081018252606080825260208201","529081016000815260200162001f9162001f83565b6040518060800160405280606081526020016060815260200162001f9162001f83565b5b8082111562001ef9576000815560010162002038565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200208157818101518382015260200162002067565b8381111562002091576000848401525b50505050565b600060208284031215620020aa57600080fd5b81516001600160401b0380821115620020c257600080fd5b818401915084601f830112620020d757600080fd5b815181811115620020ec57620020ec6200204e565b604051601f8201601f19908116603f011681019083821181831017156200211757620021176200204e565b816040528281528760208487010111156200213157600080fd5b6200214483602083016020880162002064565b979650505050505050565b634e487b7160e01b600052602160045260246000fd5b600082516200217981846020870162002064565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415620021c657620021c662002199565b5060010190565b60008219821115620021e357620021e362002199565b500190565b600063ffffffff8083168185168083038211156200220a576200220a62002199565b01949350505050565b60008282101562002228576200222862002199565b500390565b600181815b808511156200226e57816000190482111562002252576200225262002199565b808516156200226057918102915b93841c939080029062002232565b509250929050565b600082620022875750600162000a40565b81620022965750600062000a40565b8160018114620022af5760028114620022ba57620022da565b600191505062000a40565b60ff841115620022ce57620022ce62002199565b50506001821b62000a40565b5060208310610133831016604e8410600b8410161715620022ff575081810a62000a40565b6200230b83836200222d565b806000190482111562002322576200232262002199565b029392505050565b600062002338838362002276565b9392505050565b600181811c908216806200235457607f821691505b602082108114156200237657634e487b7160e01b600052602260045260246000fd5b50919050565b615f50806200238c6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806395e8fcee116100c3578063c3292b6d1161007c578063c3292b6d14610308578063d91958171461031b578063dde185461461032e578063e1ceb03014610341578063f2fde38b14610354578063fe8cc1e31461036757600080fd5b806395e8fcee14610279578063a1d6c9641461028c578063ad86bc031461029f578063adc64a18146102cd578063adf22b3f146102e0578063bf812b2c146102f557600080fd5b806355c265fe1161011557806355c265fe146101e6578063715018a6146101f957806373d6c7bd146102015780637adcff0c146102145780638da5cb5b1461025557806390157ffb1461026657600080fd5b806304802a34146101525780630604420e1461016757806309158b211461019057806312dabd3a146101b05780634ddf47d4146101d3575b600080fd5b6101656101603660046154ce565b61037a565b005b61017a6101753660046154ce565b610707565b604051610187919061556b565b60405180910390f35b6101a361019e36600461557e565b6107c8565b60405161018791906155c1565b6101c36101be3660046155cf565b6107fc565b6040519015158152602001610187565b6101656101e13660046156b9565b61085a565b6101656101f43660046154ce565b610992565b610165610cf0565b6101c361020f3660046154ce565b610d04565b61023d61022236600461570e565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610187565b6000546001600160a01b031661023d565b61017a61027436600461557e565b610d4a565b6101656102873660046154ce565b610de4565b61016561029a36600461570e565b611029565b6102bf6102ad36600461557e565b60046020526000908152604090205481565b604051908152602001610187565b61017a6102db36600461557e565b611288565b6102e8611326565b604051610187919061572b565b610165610303366004615776565b6113ae565b6101c361031636600461579f565b611598565b61017a6103293660046155cf565b6115e4565b61017a61033c36600461579f565b6116bc565b61017a61034f3660046156b9565b611707565b610165610362366004615776565b61172b565b61017a6103753660046154ce565b6117a4565b610382612699565b60006103c383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126f392505050565b90506103d6816060015160600151612895565b6104215760405162461bcd60e51b81526020600482015260176024820152761b9bc81c1d18c81d1c9d5cdd081c9bdbdd08199bdd5b99604a1b60448201526064015b60405180910390fd5b60006104348260600151606001516128d2565b905060006104458360400151612990565b905061045983606001516060015182612a4c565b6104a55760405162461bcd60e51b815260206004820152601a60248201527f6e6f207074632076657269667920616e63686f7220666f756e640000000000006044820152606401610418565b6000600560006104bc856020015160c00151612a90565b6040015160028111156104d1576104d1615597565b60028111156104e2576104e2615597565b81526020810191909152604001600020546001600160a01b03169050806105405760405162461bcd60e51b81526020600482015260126024820152711b9bc81c1d18c81d995a599a595c881cd95d60721b6044820152606401610418565b806001600160a01b031663bff3093b61056186606001516060015185612bcb565b866040518363ffffffff1660e01b815260040161057f9291906159bd565b6020604051808303816000875af115801561059e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c29190615a0a565b6106075760405162461bcd60e51b81526020600482015260166024820152756661696c656420746f2076657269667920747062746160501b6044820152606401610418565b60006106168560800151612cad565b80516020918201206000818152600483526040902091870151825491935063ffffffff1611156106895760208681015163ffffffff1680835560408051858152928301919091527f14f6dcf24001d9e8910255539bf10f0a01ba6fcb712bdcd812fe528b9ad798d1910160405180910390a15b60208087015163ffffffff16600090815260018301909152604090206106b0908989615138565b507f8796377aabd0d7feac50b0be12f810cac9a467a6ccd01c3bb79e50e2da8fd1f28287602001516040516106f592919091825263ffffffff16602082015260400190565b60405180910390a15050505050505050565b606060036000848460405161071d929190615a2c565b60405180910390208152602001908152602001600020600001805461074190615a3c565b80601f016020809104026020016040519081016040528092919081815260200182805461076d90615a3c565b80156107ba5780601f1061078f576101008083540402835291602001916107ba565b820191906000526020600020905b81548152906001019060200180831161079d57829003601f168201915b505050505090505b92915050565b600681815481106107d857600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b600080600460008686604051610813929190615a2c565b6040518091039020815260200190815260200160002060010160008463ffffffff168152602001908152602001600020805461084e90615a3c565b90501190509392505050565b600054600160a81b900460ff161580801561088257506000546001600160a01b90910460ff16105b806108a35750303b1580156108a35750600054600160a01b900460ff166001145b6109065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610418565b6000805460ff60a01b1916600160a01b1790558015610933576000805460ff60a81b1916600160a81b1790555b61093c82612f3c565b61094533613089565b801561098e576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b5050565b60006109d383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506130d992505050565b905060006109e48260200151612cad565b805160208083019190912060009081526004825260408082208682015163ffffffff16835260010190925290812080549293509091610a2290615a3c565b905011610a655760405162461bcd60e51b815260206004820152601160248201527009dd1c189d1849c81b9bdd08199bdd5b99607a1b6044820152606401610418565b6000610a7b82846040015163ffffffff166131d3565b9050610a8e816060015160600151612895565b610ad45760405162461bcd60e51b81526020600482015260176024820152761b9bc81c1d18c81d1c9d5cdd081c9bdbdd08199bdd5b99604a1b6044820152606401610418565b6000610ae78260600151606001516128d2565b90506000610af88360400151612990565b9050610b0c83606001516060015182612a4c565b610b585760405162461bcd60e51b815260206004820152601a60248201527f6e6f207074632076657269667920616e63686f7220666f756e640000000000006044820152606401610418565b600060056000610b6f856020015160c00151612a90565b604001516002811115610b8457610b84615597565b6002811115610b9557610b95615597565b81526020810191909152604001600020546001600160a01b0316905080610bf35760405162461bcd60e51b81526020600482015260126024820152711b9bc81c1d18c81d995a599a595c881cd95d60721b6044820152606401610418565b60405163048a3c5760e41b81526000906001600160a01b038316906348a3c57090610c249088908b90600401615a77565b6020604051808303816000875af1158015610c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c679190615a0a565b90507f4d2d7be42668dce292","7650393613e408fc71274deac16f825eb0a869a5667e8c856080015182604051610c9e929190615afe565b60405180910390a180610ce55760405162461bcd60e51b815260206004820152600f60248201526e766572696679206e6f74207061737360881b6044820152606401610418565b505050505050505050565b610cf8612699565b610d026000613089565b565b600080600360008585604051610d1b929190615a2c565b604051809103902081526020019081526020016000206000018054610d3f90615a3c565b905011905092915050565b60026020526000908152604090208054610d6390615a3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8f90615a3c565b8015610ddc5780601f10610db157610100808354040283529160200191610ddc565b820191906000526020600020905b815481529060010190602001808311610dbf57829003601f168201915b505050505081565b610dec612699565b6000610e2d83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061329192505050565b9050610e38816133d2565b6000610e43826135f6565b60008181526003602052604081208054929350918290610e6290615a3c565b90501115610f4b57610e75818686615138565b505b606083015160208101515190511015610f46576000610e998460600151613616565b60008181526001840160205260409020805491925090610eb890615a3c565b15159050610f3157610ecd8460600151613629565b600082815260018401602090815260409091208251610ef293919291909101906151bc565b5060408051848152602081018390527f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce910160405180910390a1610f40565b610f3e8460600151613629565b505b50610e77565b611022565b610f56818686615138565b505b606083015160208101515190511015610fee576000610f7a8460600151613616565b9050610f898460600151613629565b600082815260018401602090815260409091208251610fae93919291909101906151bc565b5060408051848152602081018390527f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce910160405180910390a150610f58565b6040518281527fc115cf6e41eccaaf9dbe48f3cbf3e82c176644e35bf1cae0839627723d980a0d9060200160405180910390a15b5050505050565b611031612699565b600060058183600281111561104857611048615597565b600281111561105957611059615597565b81526020810191909152604001600020546001600160a01b031614156110c15760405162461bcd60e51b815260206004820152601760248201527f707463207665726966696572206e6f74206578697374730000000000000000006044820152606401610418565b60015b600654811015611207578160028111156110e0576110e0615597565b600682815481106110f3576110f3615b22565b90600052602060002090602091828204019190069054906101000a900460ff16600281111561112457611124615597565b14156111f5576006805461113a90600190615b4e565b8154811061114a5761114a615b22565b90600052602060002090602091828204019190069054906101000a900460ff166006828154811061117d5761117d615b22565b90600052602060002090602091828204019190066101000a81548160ff021916908360028111156111b0576111b0615597565b021790555060068054806111c6576111c6615b65565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611207565b806111ff81615b7b565b9150506110c4565b506005600082600281111561121e5761121e615597565b600281111561122f5761122f615597565b81526020810191909152604090810160002080546001600160a01b0319169055517f4ae9b990c01f3cf6322d2f72f0c0a7eefdcdb12b782e47f420dbc75314d7f5089061127d9083906155c1565b60405180910390a150565b6003602052600090815260409020805481906112a390615a3c565b80601f01602080910402602001604051908101604052809291908181526020018280546112cf90615a3c565b801561131c5780601f106112f15761010080835404028352916020019161131c565b820191906000526020600020905b8154815290600101906020018083116112ff57829003601f168201915b5050505050905081565b606060068054806020026020016040519081016040528092919081815260200182805480156113a457602002820191906000526020600020906000905b82829054906101000a900460ff16600281111561138257611382615597565b8152602060019283018181049485019490930390920291018084116113635790505b5050505050905090565b6113b6612699565b6000816001600160a01b031663b93ba39c6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156113f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141c9190615b96565b9050600060058183600281111561143557611435615597565b600281111561144657611446615597565b81526020810191909152604001600020546001600160a01b0316146114ad5760405162461bcd60e51b815260206004820152601b60248201527f70746320766572696669657220616c72656164792065786973747300000000006044820152606401610418565b600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f602082040180548392601f166101000a60ff8102199091169083600281111561150957611509615597565b0217905550816005600083600281111561152557611525615597565b600281111561153657611536615597565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507e9d36884bab8205b3032d60f42239b9d5024f0acd6178f117374a9bbef092958183604051610985929190615bb3565b6000806003600086866040516115af929190615a2c565b604051809103902081526020019081526020016000206001016000848152602001908152602001600020805461084e90615a3c565b60606004600085856040516115fa929190615a2c565b6040518091039020815260200190815260200160002060010160008363ffffffff168152602001908152602001600020805461163590615a3c565b80601f016020809104026020016040519081016040528092919081815260200182805461166190615a3c565b80156116ae5780601f10611683576101008083540402835291602001916116ae565b820191906000526020600020905b81548152906001019060200180831161169157829003601f168201915b505050505090509392505050565b60606003600085856040516116d2929190615a2c565b604051809103902081526020019081526020016000206001016000838152602001908152602001600020805461163590615a3c565b805160208183018101805160018252928201919093012091528054610d6390615a3c565b611733612699565b6001600160a01b0381166117985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610418565b6117a181613089565b50565b606060006004600085856040516117bc929190615a2c565b6040518091039020815260200190815260200160002090508060010160008260000154815260200190815260200160002080546117f890615a3c565b80601f016020809104026020016040519081016040528092919081815260200182805461182490615a3c565b80156118715780601f1061184657610100808354040283529160200191611871565b820191906000526020600020905b81548152906001019060200180831161185457829003601f168201915b505050505091505092915050565b611887615230565b61188f615230565b600061189a84611c71565b905060005b816020015151811015611a3e576000826020015182815181106118c4576118c4615b22565b60200260200101519050600061ffff16816000015161ffff1614156118ef5760408101518452611a2b565b805161ffff166001141561190c5760408101516020850152611a2b565b805161ffff16600214156119685761192381611e53565b60ff16600381111561193757611937615597565b8460400190600381111561194d5761194d615597565b9081600381111561196057611960615597565b905250611a2b565b805161ffff166003141561199357611989611984826040015190565b6136cf565b6060850152611a2b565b805161ffff16600414156119bd576119aa81611e64565b6001600160401b03166080850152611a2b565b805161ffff16600514156119e7576119d481611e64565b6001600160401b031660a0850152611a2b565b805161ffff1660061415611a0457604081015160c0850152611a2b565b805161ffff1660071415611a2b57611a25611a20826040015190565b6137aa565b60e08501525b5080611a3681615b7b565b91505061189f565b50909392505050565b611a4f6152b3565b600082604001516003811115611a6757611a67615597565b1415611a8457611a7a8260c001516138c6565b6020015192915050565b600182604001516003811115611a9c57611a9c615597565b1415611ab957611aaf8260c00151613988565b6080015192915050565b600282604001516003811115611ad157611ad1615597565b1415611aee57611ae48260c00151612a90565b6060015192915050565b600382604001516003811115611b0657611b06615597565b1415611b2357611b198260c00151613ae0565b6040015192915050565b60405162461bcd60e51b815260206004820152602660248201527f676574436572744f776e65724f69643a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b6064820152608401610418565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611b94579050509050611bed6000611be885600001516001811115611be357611be3615597565b611e7d565b611e91565b81600081518110611c0057611c00615b22565b6020026020010181905250611c1a60018460200151611efe565b81600181518110611c2d57611c2d615b22565b6020026020010181905250611c596040518060400160405280600061ffff168152602001606081525090565b60208101829052611c6981611f41565b949350505050565b6040","80518082019091526000815260606020820152600682511015611cd85760405162461bcd60e51b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e6774680000000000000000006044820152606401610418565b6040805180820190915260008082526060602083015290611d01611cfc8584612046565b61206e565b61ffff168152611d12600683615bd9565b91506000825b8551811015611d6c57611d3d611d3887611d33846002615bd9565b61210f565b612139565b611d48906006615bf1565b611d589063ffffffff1682615bd9565b905081611d6481615b7b565b925050611d18565b6000826001600160401b03811115611d8657611d8661562e565b604051908082528060200260200182016040528015611dd357816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611da45790505b509050600092505b8651851015611e3d5760408051606080820183526000808352602083015291810191909152611e0a8887613bbf565b96509050808285611e1a81615b7b565b965081518110611e2c57611e2c615b22565b602002602001018190525050611ddb565b60208401525090949350505050565b6040015190565b60006107c260018360400151015190565b60006107c2611e7860088460400151015190565b612238565b60008160018111156107c2576107c2615597565b60408051606080820183526000808352602083015291810191909152604080516001808252818301909252600091602082018180368337019050509050611eda600184836123f6565b6040805160608101825261ffff959095168552600160208601528401525090919050565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b60606000611f4e83612407565b90506000611f5d826006615bf1565b63ffffffff166001600160401b03811115611f7a57611f7a61562e565b6040519080825280601f01601f191660200182016040528015611fa4576020820181803683370190505b509050611fbf6002611fb9866000015161206e565b8361247b565b611fd36006611fcd84612139565b8361248c565b600660005b60208601515181101561203c57600061200d8760200151838151811061200057612000615b22565b60200260200101516124a5565b905061201a838286612534565b80516120269084615bd9565b925050808061203490615b7b565b915050611fd8565b5090949350505050565b8151600090612056836002615bd9565b111561206157600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b816000815181106120b1576120b1615b22565b60200101906001600160f81b031916908160001a9053508160001a60f81b816001815181106120e2576120e2615b22565b60200101906001600160f81b031916908160001a9053506000612106826000612046565b95945050505050565b815160009061211f836004615bd9565b111561212a57600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b8160008151811061217c5761217c615b22565b60200101906001600160f81b031916908160001a9053508160021a60f81b816001815181106121ad576121ad615b22565b60200101906001600160f81b031916908160001a9053508160011a60f81b816002815181106121de576121de615b22565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160038151811061220f5761220f615b22565b60200101906001600160f81b031916908160001a905350600061210682600061210f565b015190565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b8160008151811061227b5761227b615b22565b60200101906001600160f81b031916908160001a9053508160061a60f81b816001815181106122ac576122ac615b22565b60200101906001600160f81b031916908160001a9053508160051a60f81b816002815181106122dd576122dd615b22565b60200101906001600160f81b031916908160001a9053508160041a60f81b8160038151811061230e5761230e615b22565b60200101906001600160f81b031916908160001a9053508160031a60f81b8160048151811061233f5761233f615b22565b60200101906001600160f81b031916908160001a9053508160021a60f81b8160058151811061237057612370615b22565b60200101906001600160f81b031916908160001a9053508160011a60f81b816006815181106123a1576123a1615b22565b60200101906001600160f81b031916908160001a9053508160001a60f81b816007815181106123d2576123d2615b22565b60200101906001600160f81b031916908160001a9053506000612106826000613d1a565b909101600019810180519290915252565b600080805b6020840151518110156124745760008460200151828151811061243157612431615b22565b6020026020010151905080604001515183600661244e9190615bf1565b63ffffffff1661245e9190615bd9565b925050808061246c90615b7b565b91505061240c565b5092915050565b909101600119810180519290915252565b909101600319810180519290915252565b602001515190565b60606000826020015160066124ba9190615bf1565b63ffffffff166001600160401b038111156124d7576124d761562e565b6040519080825280601f01601f191660200182016040528015612501576020820181803683370190505b5090506125166002611fb9856000015161206e565b6125286006611fcd8560200151612139565b6107c260068460400151835b8151815161254863ffffffff831686615bd9565b11156125c75760405162461bcd60e51b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a401610418565b801580156125d457611022565b8483018051601f84168015602002818801018581018215602002838601015b8183101561260b5782518152602092830192016125f3565b5050509152505050505050565b82516060906126278385615bd9565b111561263257600080fd5b6000826001600160401b0381111561264c5761264c61562e565b6040519080825280601f01601f191660200182016040528015612676576020820181803683370190505b5090506020808201908686010161268e828287613d47565b509095945050505050565b6000546001600160a01b03163314610d025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610418565b6126fb6152ce565b6127036152ce565b600061270e84611c71565b905060005b816020015151811015611a3e5760008260200151828151811061273857612738615b22565b60200260200101519050600061ffff16816000015161ffff16141561276d5761276081613dc2565b63ffffffff168452612882565b805161ffff16600114156127945761278481613dc2565b63ffffffff166020850152612882565b805161ffff16600214156127b15760408101516040850152612882565b805161ffff16600314156127dc576127d26127cd826040015190565b612a90565b6060850152612882565b805161ffff1660041415612807576127fd6127f8826040015190565b613dd6565b6080850152612882565b805161ffff166005141561282e5761281e81613dc2565b63ffffffff1660a0850152612882565b805161ffff166006141561284b57604081015160c0850152612882565b805161ffff166007141561286857604081015160e0850152612882565b805161ffff1660ff14156128825760408101516101008501525b508061288d81615b7b565b915050612713565b600080600360006128a585611b7a565b80519060200120815260200190815260200160002060000180546128c890615a3c565b9050119050919050565b6128da61532b565b6107c2600360006128ea85611b7a565b805190602001208152602001908152602001600020600001805461290d90615a3c565b80601f016020809104026020016040519081016040528092919081815260200182805461293990615a3c565b80156129865780601f1061295b57610100808354040283529160200191612986565b820191906000526020600020905b81548152906001019060200180831161296957829003601f168201915b5050505050613291565b805160009060208111156129f25760405162461bcd60e51b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b6064820152608401610418565b6000816001600160401b03811115612a0c57612a0c61562e565b6040519080825280601f01601f191660200182016040528015612a36576020820181803683370190505b5084518152938201519190930151900392915050565b60008060036000612a5c86611b7a565b80519060200120815260200190815260200160002060010160008481526020019081526020016000208054610d3f90615a3c565b612a98615382565b612aa0615382565b6000612aab84611c71565b905060005b816020015151811015611a3e57600082602001518281518110612ad557612ad5615b22565b60200260200101519050600061ffff16816000015161ffff161415612b005760408101518452612bb8565b805161ffff1660011415612b1d5760408101516020850152612bb8565b805161ffff1660021415612b7957612b3481611e53565b60ff166002811115612b4857612b48615597565b84604001906002811115612b5e57612b5e615597565b90816002811115612b7157612b71615597565b905250612bb8565b805161ffff1660031415612b9f57612b95611984826040015190565b6060850152612bb8565b805161ffff1660041415612bb857604081015160808501525b5080612bc381615b7b565b915050612ab0565b6040805180820190915260608082526020820152612ca660036000612bef86611b7a565b80519060200120815260200190815260200160002060010160008481526020019081526020016000208054612c2390615a3c565b80601f0160208091040260200160405190810160405280929190818152602001828054612c4f90615a3c565b8015612c9c5780601f10612c7157610100808354040283529160200191612c9c565b8201","91906000526020600020905b815481529060010190602001808311612c7f57829003601f168201915b5050505050613ec9565b9392505050565b60208101516060908190158015612cc657506040830151155b15612d4b5760408051600180825281830190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612ce0579050509050612d286000612d238560000151613f7d565b611efe565b81600081518110612d3b57612d3b615b22565b6020026020010181905250612f22565b602083015115801590612d615750604083015115155b15612eda576040805160038082526080820190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612d7c579050509050612dbf6000612d238560000151613f7d565b81600081518110612dd257612dd2615b22565b6020026020010181905250600060206001600160401b03811115612df857612df861562e565b6040519080825280601f01601f191660200182016040528015612e22576020820181803683370190505b50602085810151908201529050612e3a600182611efe565b82600181518110612e4d57612e4d615b22565b6020026020010181905250600060206001600160401b03811115612e7357612e7361562e565b6040519080825280601f01601f191660200182016040528015612e9d576020820181803683370190505b50604086015160208201529050612eb5600282611efe565b83600281518110612ec857612ec8615b22565b60200260200101819052505050612f22565b60405162461bcd60e51b815260206004820152601760248201527f696e76616c69642063726f7373636861696e206c616e650000000000000000006044820152606401610418565b604080518082019091526000815260606020820152611c59565b6000612f478261187f565b9050600081604001516003811115612f6157612f61615597565b14612fae5760405162461bcd60e51b815260206004820152601e60248201527f77726f6e67207479706520666f72206263646e7320726f6f74206365727400006044820152606401610418565b6000612fc1612fbc83611a47565b611b7a565b805190602001209050826001604051806040016040528060048152602001631c9bdbdd60e21b815250604051612ff79190615c19565b908152602001604051809103902090805190602001906130189291906151bc565b5060408051808201825260048152631c9bdbdd60e21b60208083019182526000858152600290915292909220905161305092906151bc565b506040518181527f7c787bfbe942686b5f41acec151012ca79c6b81c1c5a23cee512781cf3d5b9bb9060200160405180910390a1505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6130e16153a8565b6130e96153a8565b60006130f484611c71565b905060005b816020015151811015611a3e5760008260200151828151811061311e5761311e615b22565b60200260200101519050600561ffff16816000015161ffff1614156131575761315061314b826040015190565b61408c565b84526131c0565b805161ffff16610101141561317e576131746127f8826040015190565b60208501526131c0565b805161ffff1661010014156131a65761319681613dc2565b63ffffffff1660408501526131c0565b805161ffff166101ff14156131c057604081015160608501525b50806131cb81615b7b565b9150506130f9565b6131db6152ce565b82516020808501919091206000908152600482526040808220858352600101909252208054612ca6919061320e90615a3c565b80601f016020809104026020016040519081016040528092919081815260200182805461323a90615a3c565b80156132875780601f1061325c57610100808354040283529160200191613287565b820191906000526020600020905b81548152906001019060200180831161326a57829003601f168201915b50505050506126f3565b61329961532b565b6132a161532b565b60006132ac84611c71565b905060005b816020015151811015611a3e576000826020015182815181106132d6576132d6615b22565b60200260200101519050600061ffff16816000015161ffff16141561330157604081015184526133bf565b805161ffff166001141561332c5761332261331d826040015190565b61187f565b60208501526133bf565b805161ffff166002141561334957604081015160408501526133bf565b805161ffff1660031415613389576040805180820182526000808252606060209283015282518084018452908152918301519082015260608501526133bf565b805161ffff16600414156133a657604081015160808501526133bf565b805161ffff16600514156133bf57604081015160a08501525b50806133ca81615b7b565b9150506132b1565b60006133e5826020015160600151611b7a565b8051602091820120600081815260029092526040822080549193509061340a90615a3c565b90501161344c5760405162461bcd60e51b815260206004820152601060248201526f1a5cdcdd595c881b9bdd08199bdd5b9960821b6044820152606401610418565b600081815260026020526040808220905161350a9160019161346e9190615c35565b9081526020016040518091039020805461348790615a3c565b80601f01602080910402602001604051908101604052809291908181526020018280546134b390615a3c565b80156135005780601f106134d557610100808354040283529160200191613500565b820191906000526020600020905b8154815290600101906020018083116134e357829003601f168201915b505050505061187f565b9050613555604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b8152508260e001516040015161411990919063ffffffff16565b1561359c5760008061357483866020015161412f90919063ffffffff16565b915091508181906135985760405162461bcd60e51b8152600401610418919061556b565b5050505b6135a5836142c3565b6135f15760405162461bcd60e51b815260206004820152601a60248201527f70746320747275737420726f6f742073696720696e76616c69640000000000006044820152606401610418565b505050565b6000613608612fbc8360200151611a47565b805190602001209050919050565b60006107c261362483613629565b612990565b60608160200151518260000151106136975760405162461bcd60e51b815260206004820152602b60248201527f544c564974656d4d617056616c756553747265616d3a206f6666657374206f7560448201526a3a1037b310313ab33332b960a91b6064820152608401610418565b60006136ab836000015184602001516142ed565b80518451919250906136be906004615bd9565b6136c89190615bd9565b9092525090565b6136d76152b3565b6136df6152b3565b60006136ea84611c71565b905060005b816020015151811015611a3e5760008260200151828151811061371457613714615b22565b60200260200101519050600061ffff16816000015161ffff16141561377e5761373c81611e53565b60ff16600181111561375057613750615597565b8490600181111561376357613763615597565b9081600181111561377657613776615597565b905250613797565b805161ffff166001141561379757604081015160208501525b50806137a281615b7b565b9150506136ef565b6137d56040518060800160405280606081526020016060815260200160608152602001606081525090565b6138006040518060800160405280606081526020016060815260200160608152602001606081525090565b600061380b84611c71565b905060005b816020015151811015611a3e5760008260200151828151811061383557613835615b22565b60200260200101519050600061ffff16816000015161ffff16141561386057604081015184526138b3565b805161ffff166001141561387d57604081015160208501526138b3565b805161ffff166002141561389a57604081015160408501526138b3565b805161ffff16600314156138b357604081015160608501525b50806138be81615b7b565b915050613810565b6138ce6153de565b6138d66153de565b60006138e184611c71565b905060005b816020015151811015611a3e5760008260200151828151811061390b5761390b615b22565b60200260200101519050600061ffff16816000015161ffff1614156139365760408101518452613975565b805161ffff166001141561395c57613952611984826040015190565b6020850152613975565b805161ffff166002141561397557604081015160408501525b508061398081615b7b565b9150506138e6565b6139906153f8565b6139986153f8565b60006139a384611c71565b905060005b816020015151811015611a3e576000826020015182815181106139cd576139cd615b22565b60200260200101519050600061ffff16816000015161ffff1614156139f85760408101518452613acd565b805161ffff1660011415613a5457613a0f81611e53565b60ff166001811115613a2357613a23615597565b84602001906001811115613a3957613a39615597565b90816001811115613a4c57613a4c615597565b905250613acd565b805161ffff1660021415613a715760408101516040850152613acd565b805161ffff1660031415613a8e5760408101516060850152613acd565b805161ffff1660041415613ab457613aaa611984826040015190565b6080850152613acd565b805161ffff1660051415613acd57604081015160a08501525b5080613ad881615b7b565b9150506139a8565b613ae8615428565b613af0615428565b6000613afb84611c71565b905060005b816020015151811015611a3e57600082602001518281518110613b2557613b25615b22565b60200260200101519050600061ffff16816000015161ffff161415613b505760408101518452613bac565b805161ffff1660011415613b6d5760408101516020850152613bac565b805161ffff1660031415613b9357613b89611984826040015190565b6040850152613bac565b805161ffff1660041415613bac57604081015160608501525b5080613bb781615b7b565b915050613b00565b60408051606080820183526000808352602083015291810191909152600082845111613c395760405162461bcd60e51b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b6064820152608401610418565b6006831015613c7b5760405162461bcd60e51b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b6044820152","606401610418565b60408051606080820183526000808352602083015291810191909152613ca4611cfc8686612046565b61ffff168152613cb5600285615bd9565b9350613cc4611d38868661210f565b63ffffffff166020820152613cda600485615bd9565b9350613cf18585836020015163ffffffff16612618565b60408201526020810151613d0b9063ffffffff1685615bd9565b935091508290505b9250929050565b8151600090613d2a836008615bd9565b1115613d3557600080fd5b5001600801516001600160401b031690565b60208110613d7f5781518352613d5e602084615bd9565b9250613d6b602083615bd9565b9150613d78602082615b4e565b9050613d47565b80613d8957505050565b60006001613d98836020615b4e565b613da490610100615db5565b613dae9190615b4e565b925184518416931916929092179092525050565b60006107c2611d3860048460400151015190565b613dde615449565b613de6615449565b6000613df184611c71565b905060005b816020015151811015611a3e57600082602001518281518110613e1b57613e1b615b22565b60200260200101519050600061ffff16816000015161ffff161415613e5457613e4d613e48826040015190565b614381565b8452613eb6565b805161ffff1660011415613e87576000613e6f826040015190565b9050613e7c815182015190565b602086015250613eb6565b805161ffff1660021415613eb6576000613ea2826040015190565b9050613eaf815182015190565b6040860152505b5080613ec181615b7b565b915050613df6565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000613efc84611c71565b905060005b816020015151811015611a3e57600082602001518281518110613f2657613f26615b22565b60200260200101519050600061ffff16816000015161ffff161415613f515760408101518452613f6a565b805161ffff1660011415613f6a57604081015160208501525b5080613f7581615b7b565b915050613f01565b60608060008360200151511115614024576040805160028082526060820190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081613fa4579050509050613fe460008460000151611efe565b81600081518110613ff757613ff7615b22565b602002602001018190525061401160018460200151611efe565b81600181518110612d3b57612d3b615b22565b60408051600180825281830190925290816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161403957905050905061407960008460000151611efe565b81600081518110611c2d57611c2d615b22565b60408051602081019091526060815260408051602081019091526060815260006140b584611c71565b905060005b816020015151811015611a3e576000826020015182815181106140df576140df615b22565b60200260200101519050600061ffff16816000015161ffff16141561410657604081015184525b508061411181615b7b565b9150506140ba565b8051602091820120825192909101919091201490565b60006060818360400151600381111561414a5761414a615597565b14156141ab57600061415f8460c001516138c6565b905061417c8160200151866060015161443590919063ffffffff16565b6141a5576000604051806060016040528060288152602001615ef3602891399250925050613d13565b50614253565b6001836040015160038111156141c3576141c3615597565b141561422f5760006141d88460c00151613988565b90506001816020015160018111156141f2576141f2615597565b1461421c576000604051806080016040528060538152602001615ea0605391399250925050613d13565b6080810151606086015161417c91614435565b60006040518060600160405280603d8152602001615e3c603d913991509150613d13565b61427f8460e001516040015161426885614460565b61427187614585565b8760e001516060015161471a565b1561429d575050604080516020810190915260008152600190613d13565b6000604051806060016040528060278152602001615e7960279139915091509250929050565b60006107c282608001516142da8460200151614460565b6142e3856148e5565b8560a0015161471a565b60606142fa600484615bd9565b9250600061430b611d388585015190565b63ffffffff16905060608115801561432e57604051915060208201604052614378565b6040519150601f8316801560200281840101848101888315602002848a0101015b8183101561436757805183526020928301920161434f565b5050848452601f01601f1916604052505b50949350505050565b6040805180820190915260608082526020820152604080518082019091526060808252602082015260006143b484611c71565b905060005b816020015151811015611a3e576000826020015182815181106143de576143de615b22565b60200260200101519050600061ffff16816000015161ffff1614156144095760408101518452614422565b805161ffff166001141561442257604081015160208501525b508061442d81615b7b565b9150506143b9565b600061444082611b7a565b8051906020012061445084611b7a565b8051906020012014905092915050565b606060008260400151600381111561447a5761447a615597565b1415614495576107c26144908360c001516138c6565b614a0f565b6001826040015160038111156144ad576144ad615597565b14156144c8576107c26144c38360c00151613988565b614a2c565b6002826040015160038111156144e0576144e0615597565b14156144fb576107c26144f68360c00151612a90565b614a49565b60038260400151600381111561451357614513615597565b141561452e576107c26145298360c00151613ae0565b614a66565b60405162461bcd60e51b815260206004820152602660248201527f6765745261775075626c69634b65793a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b6064820152608401610418565b604080516007808252610100820190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816145a25790505090506145e260008460000151611efe565b816000815181106145f5576145f5615b22565b602002602001018190525061460f60018460200151611efe565b8160018151811061462257614622615b22565b60200260200101819052506146506002611be88560400151600381111561464b5761464b615597565b614a7a565b8160028151811061466357614663615b22565b60200260200101819052506146806003612d238560600151611b7a565b8160038151811061469357614693615b22565b60200260200101819052506146ad60048460800151614a8e565b816004815181106146c0576146c0615b22565b60200260200101819052506146da60058460a00151614a8e565b816005815181106146ed576146ed615b22565b602002602001018190525061470760068460c00151611efe565b81600681518110611c2d57611c2d615b22565b600061475d604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b8152508661411990919063ffffffff16565b6147c55760405162461bcd60e51b815260206004820152603360248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152723235364b31207369676e6174757265206e6f7760681b6064820152608401610418565b6041825110156148175760405162461bcd60e51b815260206004820152601a60248201527f77726f6e6720736563703235366b3120736967206c656e6774680000000000006044820152606401610418565b601b8260408151811061482c5761482c615b22565b016020015161483e919060f81c615dc1565b60f81b8260408151811061485457614854615b22565b60200101906001600160f81b031916908160001a90535083516020850120600090614886908551602087012085614b0e565b9050601b8360408151811061489d5761489d615b22565b01602001516148af919060f81c615de6565b60f81b836040815181106148c5576148c5615b22565b60200101906001600160f81b031916908160001a90535095945050505050565b60408051600580825260c0820190925260609160009190816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161490157905050905061494160008460000151611efe565b8160008151811061495457614954615b22565b60200260200101819052506149716001612d238560200151614b6f565b8160018151811061498457614984615b22565b602002602001018190525061499e60028460400151611efe565b816002815181106149b1576149b1615b22565b60200260200101819052506149cf6003846060015160200151611efe565b816003815181106149e2576149e2615b22565b60200260200101819052506149fc60048460800151611efe565b81600481518110611c2d57611c2d615b22565b60606107c282604001518360200151614d2f90919063ffffffff16565b60606107c28260a001518360800151614d2f90919063ffffffff16565b60606107c282608001518360600151614d2f90919063ffffffff16565b60608181015160408301516107c291614d2f565b60008160038111156107c2576107c2615597565b60408051606080820183526000808352602083015291810191909152604080516008808252818301909252600091602082018180368337019050509050614aea6008614ad985612238565b908301600719810180519290915252565b6040805160608101825261ffff959095168552600860208601528401525090919050565b6000806000614b1d8585614e4f565b90925090506000816004811115614b3657614b36615597565b148015614b545750856001600160a01b0316826001600160a01b0316145b80614b655750614b65868686614e92565b9695505050505050565b604080516008808252610120820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081614b8c579050509050614bcc60008460000151611efe565b81600081518110614bdf57614bdf615b22565b6020026020010181905250614bf960018460200151611efe565b81600181518110614c0c57614c0c615b22565b6020026020010181905250614c356002611be88560400151600381111561464b5761464b615597565b81600281518110614c4857614c48615b22565b6020026020010181905250614c656003612d238560600151611b7a565b81600381518110614c7857614c78","615b22565b6020026020010181905250614c9260048460800151614a8e565b81600481518110614ca557614ca5615b22565b6020026020010181905250614cbf60058460a00151614a8e565b81600581518110614cd257614cd2615b22565b6020026020010181905250614cec60068460c00151611efe565b81600681518110614cff57614cff615b22565b6020026020010181905250614d1c6007612d238560e00151614f7e565b81600781518110611c2d57611c2d615b22565b6060600083516001811115614d4657614d46615597565b14614da15760405162461bcd60e51b815260206004820152602560248201527f6f6e6c7920737570706f727420583530395f5055424c49435f4b45595f494e466044820152644f206e6f7760d81b6064820152608401610418565b60408360200151511015614df75760405162461bcd60e51b815260206004820152601c60248201527f7075626c6963206b6579206c656e677468206e6f7420656e6f757468000000006044820152606401610418565b60208301518051600090614e0d90604090615b4e565b60408051818152606081018252919250600091906020820181803683370190505092909101602081810151908401526040908101519083015250905092915050565b600080825160411415614e865760208301516040840151606085015160001a614e7a87828585615074565b94509450505050613d13565b50600090506002613d13565b6000806000856001600160a01b0316631626ba7e60e01b8686604051602401614ebc929190615e09565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051614efa9190615c19565b600060405180830381855afa9150503d8060008114614f35576040519150601f19603f3d011682016040523d82523d6000602084013e614f3a565b606091505b5091509150818015614f4e57506020815110155b8015614b6557508051630b135d3f60e11b90614f739083016020908101908401615e22565b149695505050505050565b60408051600480825260a0820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081614f9a579050509050614fda60008460000151611efe565b81600081518110614fed57614fed615b22565b602002602001018190525061500760018460200151611efe565b8160018151811061501a5761501a615b22565b602002602001018190525061503460028460400151611efe565b8160028151811061504757615047615b22565b602002602001018190525061506160038460600151611efe565b81600381518110611c2d57611c2d615b22565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156150ab575060009050600361512f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156150ff573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166151285760006001925092505061512f565b9150600090505b94509492505050565b82805461514490615a3c565b90600052602060002090601f01602090048101928261516657600085556151ac565b82601f1061517f5782800160ff198235161785556151ac565b828001600101855582156151ac579182015b828111156151ac578235825591602001919060010190615191565b506151b8929150615478565b5090565b8280546151c890615a3c565b90600052602060002090601f0160209004810192826151ea57600085556151ac565b82601f1061520357805160ff19168380011785556151ac565b828001600101855582156151ac579182015b828111156151ac578251825591602001919060010190615215565b604080516101008101825260608082526020820152908101600081526020016152576152b3565b815260200160006001600160401b0316815260200160006001600160401b03168152602001606081526020016152ae6040518060800160405280606081526020016060815260200160608152602001606081525090565b905290565b604080518082019091528060005b8152602001606081525090565b60408051610120810182526000808252602082015260609181018290529081016152f6615382565b8152602001615303615449565b8152602001600063ffffffff1681526020016060815260200160608152602001606081525090565b6040518060c0016040528060608152602001615345615230565b81526020016060815260200161536e604051806040016040528060008152602001606081525090565b815260200160608152602001606081525090565b6040805160a08101825260608082526020820152908101600081526020016152c16152b3565b6040805160a081019091526060608082019081528152602081016153ca615449565b815260006020820152606060409091015290565b6040518060600160405280606081526020016152c16152b3565b6040805160c0810190915260608152602081016000815260200160608152602001606081526020016152c16152b3565b604051806080016040528060608152602001606081526020016152c16152b3565b6040805160a0810182526060808201818152608083019190915281526000602082018190529181019190915290565b5b808211156151b85760008155600101615479565b60008083601f84011261549f57600080fd5b5081356001600160401b038111156154b657600080fd5b602083019150836020828501011115613d1357600080fd5b600080602083850312156154e157600080fd5b82356001600160401b038111156154f757600080fd5b6155038582860161548d565b90969095509350505050565b60005b8381101561552a578181015183820152602001615512565b83811115615539576000848401525b50505050565b6000815180845261555781602086016020860161550f565b601f01601f19169290920160200192915050565b602081526000612ca6602083018461553f565b60006020828403121561559057600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b600381106155bd576155bd615597565b9052565b602081016107c282846155ad565b6000806000604084860312156155e457600080fd5b83356001600160401b038111156155fa57600080fd5b6156068682870161548d565b909450925050602084013563ffffffff8116811461562357600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561565e5761565e61562e565b604051601f8501601f19908116603f011681019082821181831017156156865761568661562e565b8160405280935085815286868601111561569f57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156156cb57600080fd5b81356001600160401b038111156156e157600080fd5b8201601f810184136156f257600080fd5b611c6984823560208401615644565b600381106117a157600080fd5b60006020828403121561572057600080fd5b8135612ca681615701565b6020808252825182820181905260009190848201906040850190845b8181101561576a5761575a8385516155ad565b9284019291840191600101615747565b50909695505050505050565b60006020828403121561578857600080fd5b81356001600160a01b0381168114612ca657600080fd5b6000806000604084860312156157b457600080fd5b83356001600160401b038111156157ca57600080fd5b6157d68682870161548d565b909790965060209590950135949350505050565b6000815160a084526157ff60a085018261553f565b905060208301518482036020860152615818828261553f565b915050604083015161582d60408601826155ad565b506060830151848203606086015280516002811061584d5761584d615597565b80835250602081015190506040602083015261586c604083018261553f565b91505060808301518482036080860152612106828261553f565b60008151606084528051604060608601526158a460a086018261553f565b905060208201519150605f198582030160808601526158c3818361553f565b91505060208301516020850152604083015160408501528091505092915050565b805163ffffffff1682526000610120602083015161590a602086018263ffffffff169052565b5060408301518160408601526159228286018261553f565b9150506060830151848203606086015261593c82826157ea565b915050608083015184820360808601526159568282615886565b91505060a083015161597060a086018263ffffffff169052565b5060c083015184820360c0860152615988828261553f565b91505060e083015184820360e08601526159a2828261553f565b9150506101008084015185830382870152614b65838261553f565b60408152600083516040808401526159d8608084018261553f565b90506020850151603f198483030160608501526159f5828261553f565b915050828103602084015261210681856158e4565b600060208284031215615a1c57600080fd5b81518015158114612ca657600080fd5b8183823760009101908152919050565b600181811c90821680615a5057607f821691505b60208210811415615a7157634e487b7160e01b600052602260045260246000fd5b50919050565b604081526000615a8a60408301856158e4565b82810360208401528351608082528051905060206080830152615ab060a083018261553f565b905060208501518282036020840152615ac98282615886565b91505063ffffffff604086015116604083015260608501518282036060840152615af3828261553f565b979650505050505050565b604081526000615b116040830185615886565b905082151560208301529392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015615b6057615b60615b38565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415615b8f57615b8f615b38565b5060010190565b600060208284031215615ba857600080fd5b8151612ca681615701565b60408101615bc182856155ad565b6001600160a01b039290921660209190910152919050565b60008219821115615bec57615bec615b38565b500190565b600063ffffffff808316818516808303821115615c1057615c10615b38565b01949350505050565b60008251615c2b81846020870161550f565b9190910192915050565b600080835481600182811c915080831680615c5157607f831692505b6020808410821415615c7157634e487b7160e01b86526022600452602486fd5b8180","15615c855760018114615c9657615cc3565b60ff19861689528489019650615cc3565b60008a81526020902060005b86811015615cbb5781548b820152908501908301615ca2565b505084890196505b509498975050505050505050565b600181815b80851115615d0c578160001904821115615cf257615cf2615b38565b80851615615cff57918102915b93841c9390800290615cd6565b509250929050565b600082615d23575060016107c2565b81615d30575060006107c2565b8160018114615d465760028114615d5057615d6c565b60019150506107c2565b60ff841115615d6157615d61615b38565b50506001821b6107c2565b5060208310610133831016604e8410600b8410161715615d8f575081810a6107c2565b615d998383615cd1565b8060001904821115615dad57615dad615b38565b029392505050565b6000612ca68383615d14565b600060ff821660ff84168060ff03821115615dde57615dde615b38565b019392505050565b600060ff821660ff841680821015615e0057615e00615b38565b90039392505050565b828152604060208201526000611c69604083018461553f565b600060208284031215615e3457600080fd5b505191905056fe63726f7373636861696e20636572742076616c69646174696f6e3a2074797065206f66207369676e65722063657274206d757374206265206263646e7363726f7373636861696e20636572742076616c69646174696f6e3a20696e76616c69642073696763726f7373636861696e20636572742076616c69646174696f6e3a2072657175697265206263646e7320726f6f74206f7220646f6d61696e207370616365206f776e65722063657274206173207369676e657263726f7373636861696e20636572742076616c69646174696f6e3a2077726f6e67207369676e6572a26469706673582212208a6c28e5c12a7adb367d404741fdfb723e36edb04272828c357338800c939fcc64736f6c634300080b0033"}; + public static final String[] BINARY_ARRAY = {"6080604052348015630000001257600080fd5b50604051630000871438038063000087148339810160408190526300000039916300002316565b6300000046336300000067565b63000000538163000000b7565b630000005f630000024d565b506300002632565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600063000000d282630000031c60201b63000019f01760201c565b905060008160400151600381111563000000f25763000000f263000023da565b1463000001465760405162461bcd60e51b815260206004820152601e60248201527f77726f6e67207479706520666f72206263646e7320726f6f742063657274000060448201526064015b60405180910390fd5b6000630000017963000001668363000005ca60201b6300001bb81760201c565b630000073760201b6300001ceb1760201c565b805190602001209050826001604051806040016040528060048152602001631c9bdbdd60e21b81525060405163000001b3919063000023f0565b9081526020016040518091039020908051906020019063000001d892919063000020d2565b5060408051808201825260048152631c9bdbdd60e21b6020808301918252600085815260029091529290922090516300000214929063000020d2565b506040518181527f7c787bfbe942686b5f41acec151012ca79c6b81c1c5a23cee512781cf3d5b9bb9060200160405180910390a1505050565b600054600160a81b900460ff161563000002bb5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401630000013d565b60005460ff600160a01b90910481161015630000031a576000805460ff60a01b191660ff60a01b17905560405160ff81527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6300000328630000216c565b6300000334630000216c565b6000630000034f84630000088660201b6300001de21760201c565b905060005b81602001515181101563000005c15760008260200151828151811063000003815763000003816300002410565b60200260200101519050600061ffff16816000015161ffff16141563000003c45763000003bb816300000ad960201b6300001fbd1760201c565b845263000005a8565b805161ffff166001141563000003f95763000003ed816300000ad960201b6300001fbd1760201c565b602085015263000005a8565b805161ffff1660021415630000047b576300000422816300000ae060201b6300001fc41760201c565b60ff166003811115630000043c57630000043c63000023da565b84604001906003811115630000045857630000045863000023da565b90816003811115630000047157630000047163000023da565b90525063000005a8565b805161ffff166003141563000004bc5763000004b063000004a9826300000ad960201b6300001fbd1760201c565b6300000b07565b606085015263000005a8565b805161ffff166004141563000004fa5763000004e5816300000c4460201b6300001fd51760201c565b6001600160401b0316608085015263000005a8565b805161ffff16600514156300000538576300000523816300000c4460201b6300001fd51760201c565b6001600160401b031660a085015263000005a8565b805161ffff1660061415630000056d576300000561816300000ad960201b6300001fbd1760201c565b60c085015263000005a8565b805161ffff166007141563000005a85763000005a2630000059b826300000ad960201b6300001fbd1760201c565b6300000c7d565b60e08501525b508063000005b781630000243c565b9150506300000354565b50909392505050565b63000005d663000021f5565b60008260400151600381111563000005f45763000005f463000023da565b141563000006185760c0820151630000060e906300000e19565b6020015192915050565b600182604001516003811115630000063657630000063663000023da565b1415630000065a5760c08201516300000650906300000f43565b6080015192915050565b600282604001516003811115630000067857630000067863000023da565b1415630000069c5760c08201516300000692906300001159565b6060015192915050565b60038260400151600381111563000006ba5763000006ba63000023da565b141563000006de5760c082015163000006d490630000133a565b6040015192915050565b60405162461bcd60e51b815260206004820152602660248201527f676574436572744f776e65724f69643a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b6064820152608401630000013d565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081630000075157905050905063000007d2600063000007bf8560000151600181111563000007ac5763000007ac63000023da565b630000149960201b6300001fee1760201c565b63000014b360201b63000020021760201c565b8160008151811063000007eb5763000007eb6300002410565b6020026020010181905250630000081560018460200151630000153260201b630000206f1760201c565b81600181518110630000082e57630000082e6300002410565b6020026020010181905250630000085c6040518060400160405280600061ffff168152602001606081525090565b818160200181905250630000087e81630000157560201b63000020b21760201c565b949350505050565b60408051808201909152600081526060602082015260068251101563000008f15760405162461bcd60e51b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e6774680000000000000000006044820152606401630000013d565b6040805180820190915260008082526060602083015290630000093a63000009278584630000171b60201b63000021b71760201c565b630000174960201b63000021df1760201c565b61ffff168152630000094f600683630000245d565b91506000825b855181101563000009dd5763000009a0630000098d87630000097a846002630000245d565b63000017f960201b63000022801760201c565b630000182960201b63000022aa1760201c565b63000009af906006630000247b565b63000009c39063ffffffff1682630000245d565b90508163000009d381630000243c565b9250506300000955565b6000826001600160401b0381111563000009fd5763000009fd63000022ca565b6040519080825280602002602001820160405280156300000a4e57816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816300000a1d5790505b509050600092505b86518510156300000aca57604080516060808201835260008083526020830152918101919091526300000a8b8887630000193e565b965090508082856300000a9f81630000243c565b9650815181106300000ab7576300000ab76300002410565b6020026020010181905250506300000a56565b60208401525090949350505050565b6040015190565b60006300000b01600183604001516300001add60201b63000023a41760201c565b92915050565b6300000b1363000021f5565b6300000b1f63000021f5565b60006300000b3a84630000088660201b6300001de21760201c565b905060005b81602001515181101563000005c1576000826020015182815181106300000b6c576300000b6c6300002410565b60200260200101519050600061ffff16816000015161ffff1614156300000bfc576300000ba6816300000ae060201b6300001fc41760201c565b60ff1660018111156300000bc0576300000bc063000023da565b849060018111156300000bd9576300000bd963000023da565b908160018111156300000bf2576300000bf263000023da565b9052506300000c2b565b805161ffff16600114156300000c2b576300000c25816300000ad960201b6300001fbd1760201c565b60208501525b50806300000c3a81630000243c565b9150506300000b3f565b60006300000b016300000c6a600884604001516300001add60201b63000023a41760201c565b6300001ae260201b63000023a91760201c565b6300000caa6040518060800160405280606081526020016060815260200160608152602001606081525090565b6300000cd76040518060800160405280606081526020016060815260200160608152602001606081525090565b60006300000cf284630000088660201b6300001de21760201c565b905060005b81602001515181101563000005c1576000826020015182815181106300000d24576300000d246300002410565b60200260200101519050600061ffff16816000015161ffff1614156300000d67576300000d5e816300000ad960201b6300001fbd1760201c565b84526300000e00565b805161ffff16600114156300000d9c576300000d90816300000ad960201b6300001fbd1760201c565b60208501526300000e00565b805161ffff16600214156300000dd1576300000dc5816300000ad960201b6300001fbd1760201c565b60408501526300000e00565b805161ffff16600314156300000e00576300000dfa816300000ad960201b6300001fbd1760201c565b60608501525b50806300000e0f81630000243c565b9150506300000cf7565b6300000e256300002210565b6300000e316300002210565b60006300000e4c84630000088660201b6300001de21760201c565b905060005b81602001515181101563000005c1576000826020015182815181106300000e7e576300000e7e6300002410565b60200260200101519050600061ffff16816000015161ffff1614156300000ec1576300000eb8816300000ad960201b6300001fbd1760201c565b84526300000f2a565b805161ffff16600114156300000efb576300000eef63000004a9826300000ad960201b6300001fbd1760201c565b60208501526300000f2a565b805161ffff16600214156300000f2a576300000f24816300000ad960201b6300001fbd1760201c565b60408501525b50806300000f3981630000243c565b9150506300000e51565b6300000f4f630000222e565b6300000f5b630000222e565b60006300000f7684630000088660201b6300001de21760201c565b905060005b81602001515181101563000005c1576000826020015182815181106300000fa8576300000fa86300002410565b60200260200101519050600061ffff16816000015161ffff1614156300000feb576300000fe2816300000ad960201b6300001fbd1760201c565b84526300001140565b805161ffff1660011415630000106d5763000010","14816300000ae060201b6300001fc41760201c565b60ff166001811115630000102e57630000102e63000023da565b84602001906001811115630000104a57630000104a63000023da565b90816001811115630000106357630000106363000023da565b9052506300001140565b805161ffff166002141563000010a2576300001096816300000ad960201b6300001fbd1760201c565b60408501526300001140565b805161ffff166003141563000010d75763000010cb816300000ad960201b6300001fbd1760201c565b60608501526300001140565b805161ffff1660041415630000111157630000110563000004a9826300000ad960201b6300001fbd1760201c565b60808501526300001140565b805161ffff1660051415630000114057630000113a816300000ad960201b6300001fbd1760201c565b60a08501525b5080630000114f81630000243c565b9150506300000f7b565b63000011656300002262565b63000011716300002262565b6000630000118c84630000088660201b6300001de21760201c565b905060005b81602001515181101563000005c15760008260200151828151811063000011be5763000011be6300002410565b60200260200101519050600061ffff16816000015161ffff16141563000012015763000011f8816300000ad960201b6300001fbd1760201c565b84526300001321565b805161ffff1660011415630000123657630000122a816300000ad960201b6300001fbd1760201c565b60208501526300001321565b805161ffff166002141563000012b857630000125f816300000ae060201b6300001fc41760201c565b60ff166002811115630000127957630000127963000023da565b84604001906002811115630000129557630000129563000023da565b9081600281111563000012ae5763000012ae63000023da565b9052506300001321565b805161ffff166003141563000012f25763000012e663000004a9826300000ad960201b6300001fbd1760201c565b60608501526300001321565b805161ffff1660041415630000132157630000131b816300000ad960201b6300001fbd1760201c565b60808501525b5080630000133081630000243c565b9150506300001191565b6300001346630000228c565b6300001352630000228c565b6000630000136d84630000088660201b6300001de21760201c565b905060005b81602001515181101563000005c157600082602001518281518110630000139f57630000139f6300002410565b60200260200101519050600061ffff16816000015161ffff16141563000013e25763000013d9816300000ad960201b6300001fbd1760201c565b84526300001480565b805161ffff1660011415630000141757630000140b816300000ad960201b6300001fbd1760201c565b60208501526300001480565b805161ffff1660031415630000145157630000144563000004a9826300000ad960201b6300001fbd1760201c565b60408501526300001480565b805161ffff1660041415630000148057630000147a816300000ad960201b6300001fbd1760201c565b60608501525b5080630000148f81630000243c565b9150506300001372565b60008160018111156300000b01576300000b0163000023da565b604080516060808201835260008083526020830181905282840191909152825160018082528185019094529192909190602082018180368337019050509050630000150e600184836300001cd360201b63000025671760201c565b6040805160608101825261ffff959095168552600160208601528401525090919050565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b606060006300001592836300001ce460201b63000025781760201c565b9050600063000015a5826006630000247b565b63ffffffff166001600160401b0381111563000015c85763000015c863000022ca565b6040519080825280601f01601f19166020018201604052801563000015f4576020820181803683370190505b509050630000162f6002630000161b8660000151630000174960201b63000021df1760201c565b836300001d8160201b63000025ec1760201c565b63000016636006630000164f84630000182960201b63000022aa1760201c565b836300001d9260201b63000025fd1760201c565b600660005b6300001681866300001da360201b630000260e1760201c565b811015630000171157600063000016c88760200151838151811063000016ad5763000016ad6300002410565b60200260200101516300001dab60201b63000026161760201c565b905063000016e58382866300001e7e60201b63000026a51760201c565b805163000016f59084630000245d565b9250508080630000170790630000243c565b9150506300001668565b5090949350505050565b8151600090630000172f836002630000245d565b1115630000173c57600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b8160008151811063000017925763000017926300002410565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160018151811063000017c95763000017c96300002410565b60200101906001600160f81b031916908160001a905350600063000017f08282630000171b565b95945050505050565b8151600090630000180d836004630000245d565b1115630000181a57600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b8160008151811063000018725763000018726300002410565b60200101906001600160f81b031916908160001a9053508160021a60f81b8160018151811063000018a95763000018a96300002410565b60200101906001600160f81b031916908160001a9053508160011a60f81b8160028151811063000018e05763000018e06300002410565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160038151811063000019175763000019176300002410565b60200101906001600160f81b031916908160001a905350600063000017f0828263000017f9565b6040805160608082018352600080835260208301529181019190915260008284511163000019bc5760405162461bcd60e51b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b6064820152608401630000013d565b60068310156300001a025760405162461bcd60e51b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b6044820152606401630000013d565b604080516060808201835260008083526020830152918101919091526300001a3d63000009278686630000171b60201b63000021b71760201c565b61ffff1681526300001a52600285630000245d565b93506300001a73630000098d868663000017f960201b63000022801760201c565b63ffffffff1660208201526300001a8d600485630000245d565b93506300001ab48585836020015163ffffffff166300001f7360201b63000027891760201c565b604082015260208101516300001ad29063ffffffff1685630000245d565b909590945092505050565b015190565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b816000815181106300001b2b576300001b2b6300002410565b60200101906001600160f81b031916908160001a9053508160061a60f81b816001815181106300001b62576300001b626300002410565b60200101906001600160f81b031916908160001a9053508160051a60f81b816002815181106300001b99576300001b996300002410565b60200101906001600160f81b031916908160001a9053508160041a60f81b816003815181106300001bd0576300001bd06300002410565b60200101906001600160f81b031916908160001a9053508160031a60f81b816004815181106300001c07576300001c076300002410565b60200101906001600160f81b031916908160001a9053508160021a60f81b816005815181106300001c3e576300001c3e6300002410565b60200101906001600160f81b031916908160001a9053508160011a60f81b816006815181106300001c75576300001c756300002410565b60200101906001600160f81b031916908160001a9053508160001a60f81b816007815181106300001cac576300001cac6300002410565b60200101906001600160f81b031916908160001a905350600063000017f082826300002006565b909101600019810180519290915252565b600080805b6300001d02846300001da360201b630000260e1760201c565b8110156300001d7a576000846020015182815181106300001d29576300001d296300002410565b602002602001015190508060400151518360066300001d4a9190630000247b565b63ffffffff166300001d5e9190630000245d565b92505080806300001d7090630000243c565b9150506300001ce9565b5092915050565b909101600119810180519290915252565b909101600319810180519290915252565b602001515190565b60606000826020015160066300001dc49190630000247b565b63ffffffff166001600160401b038111156300001de7576300001de763000022ca565b6040519080825280601f01601f1916602001820160405280156300001e13576020820181803683370190505b5090506300001e3a6002630000161b8560000151630000174960201b63000021df1760201c565b6300001e5e6006630000164f8560200151630000182960201b63000022aa1760201c565b6300000b0160068460400151836300001e7e60201b63000026a51760201c565b815181516300001e9663ffffffff831686630000245d565b11156300001f195760405162461bcd60e51b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a401630000013d565b801580156300001f2a576300001f6c565b8483018051601f84168015602002818801018581018215602002838601015b818310156300001f655782518152602092830192016300001f49565b5050509152505b5050505050565b82516060906300001f868385630000245d565b11156300001f9357600080fd5b6000826001600160401b038111156300001fb3576300001fb363000022ca565b6040519080825280601f01601f1916602001820160405280156300001fdf576020820181803683370190505b509050602080820190868601016300001ffb8282876300002039565b50909594","5050505050565b8151600090630000201a836008630000245d565b1115630000202757600080fd5b5001600801516001600160401b031690565b60208110630000208157815183526300002056602084630000245d565b92506300002067602083630000245d565b9150630000207860208263000024a9565b90506300002039565b80630000208d57505050565b6000600163000020a083602063000024a9565b63000020b09061010063000025dc565b63000020be919063000024a9565b925184518416931916929092179092525050565b82805463000020e29063000025f3565b90600052602060002090601f016020900481019282630000210857600085556300002158565b82601f10630000212557805160ff19168380011785556300002158565b828001600101855582156300002158579182015b8281111563000021585782518255916020019190600101906300002139565b50630000216892915063000022b1565b5090565b60408051610100810182526060808252602082015290810160008152602001630000219763000021f5565b815260200160006001600160401b0316815260200160006001600160401b031681526020016060815260200163000021f06040518060800160405280606081526020016060815260200160608152602001606081525090565b905290565b604080518082019091528060005b8152602001606081525090565b604051806060016040528060608152602001630000220363000021f5565b6040805160c081019091526060815260208101600081526020016060815260200160608152602001630000220363000021f5565b6040805160a0810182526060808252602082015290810160008152602001630000220363000021f5565b60405180608001604052806060815260200160608152602001630000220363000021f5565b5b808211156300002168576000815560010163000022b2565b634e487b7160e01b600052604160045260246000fd5b60005b8381101563000022ff57818101518382015260200163000022e3565b838111156300002310576000848401525b50505050565b600060208284031215630000232a57600080fd5b81516001600160401b0380821115630000234357600080fd5b818401915084601f830112630000235957600080fd5b815181811115630000237157630000237163000022ca565b604051601f8201601f19908116603f01168101908382118183101715630000239f57630000239f63000022ca565b8160405282815287602084870101111563000023ba57600080fd5b63000023cf83602083016020880163000022e0565b979650505050505050565b634e487b7160e01b600052602160045260246000fd5b60008251630000240681846020870163000022e0565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141563000024565763000024566300002426565b5060010190565b6000821982111563000024765763000024766300002426565b500190565b600063ffffffff80831681851680830382111563000024a05763000024a06300002426565b01949350505050565b60008282101563000024c15763000024c16300002426565b500390565b600181815b80851115630000250d57816000190482111563000024ef5763000024ef6300002426565b8085161563000024fe57918102915b93841c939080029063000024cb565b509250929050565b6000826300002528575060016300000b01565b816300002539575060006300000b01565b8160018114630000255557600281146300002561576300002585565b60019150506300000b01565b60ff84111563000025785763000025786300002426565b50506001821b6300000b01565b5060208310610133831016604e8410600b841016171563000025ac575081810a6300000b01565b63000025ba838363000024c6565b806000190482111563000025d45763000025d46300002426565b029392505050565b600063000025ec83836300002515565b9392505050565b600181811c90821680630000260957607f821691505b60208210811415630000262c57634e487b7160e01b600052602260045260246000fd5b50919050565b6160d18063000026436000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063a1d6c964116100de578063c2450b5011610097578063dde1854611610071578063dde18546146103a6578063e1ceb030146103b9578063f2fde38b146103cc578063fe8cc1e3146103df57600080fd5b8063c2450b501461036f578063c3292b6d14610380578063d91958171461039357600080fd5b8063a1d6c964146102e0578063ad86bc03146102f3578063adc64a1814610321578063adf22b3f14610334578063ae14961d14610349578063bf812b2c1461035c57600080fd5b806355c265fe1161014b5780637adcff0c116101255780637adcff0c146102685780638da5cb5b146102a957806390157ffb146102ba57806395e8fcee146102cd57600080fd5b806355c265fe1461023a578063715018a61461024d57806373d6c7bd1461025557600080fd5b806304802a34146101935780630604420e146101a857806309158b21146101d157806312dabd3a146101f15780634ddf47d414610214578063552a8d1914610227575b600080fd5b6101a66101a136600461563f565b6103f2565b005b6101bb6101b636600461563f565b6107e4565b6040516101c891906156dc565b60405180910390f35b6101e46101df3660046156ef565b6108a5565b6040516101c89190615732565b6102046101ff366004615740565b6108d9565b60405190151581526020016101c8565b6101a661022236600461582a565b610937565b6101a6610235366004615872565b610a6f565b6101a661024836600461563f565b610afb565b6101a6610e61565b61020461026336600461563f565b610e75565b6102916102763660046158a8565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101c8565b6000546001600160a01b0316610291565b6101bb6102c83660046156ef565b610ebb565b6101a66102db36600461563f565b610f55565b6101a66102ee3660046158a8565b61119a565b6103136103013660046156ef565b60046020526000908152604090205481565b6040519081526020016101c8565b6101bb61032f3660046156ef565b6113f9565b61033c611497565b6040516101c891906158c5565b600754610291906001600160a01b031681565b6101a661036a366004615872565b61151f565b6007546001600160a01b0316610291565b61020461038e366004615910565b611709565b6101bb6103a1366004615740565b611755565b6101bb6103b4366004615910565b61182d565b6101bb6103c736600461582a565b611878565b6101a66103da366004615872565b61189c565b6101bb6103ed36600461563f565b611915565b6103fa61280a565b600061043b83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061286492505050565b905061044e816060015160600151612a06565b6104995760405162461bcd60e51b81526020600482015260176024820152761b9bc81c1d18c81d1c9d5cdd081c9bdbdd08199bdd5b99604a1b60448201526064015b60405180910390fd5b60006104ac826060015160600151612a43565b905060006104bd8360400151612b01565b90506104d183606001516060015182612bbd565b61051d5760405162461bcd60e51b815260206004820152601a60248201527f6e6f207074632076657269667920616e63686f7220666f756e640000000000006044820152606401610490565b600060056000610534856020015160c00151612c01565b60400151600281111561054957610549615708565b600281111561055a5761055a615708565b81526020810191909152604001600020546001600160a01b03169050806105b85760405162461bcd60e51b81526020600482015260126024820152711b9bc81c1d18c81d995a599a595c881cd95d60721b6044820152606401610490565b806001600160a01b031663bff3093b6105d986606001516060015185612d3c565b866040518363ffffffff1660e01b81526004016105f7929190615b2e565b6020604051808303816000875af1158015610616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063a9190615b7b565b61067f5760405162461bcd60e51b81526020600482015260166024820152756661696c656420746f2076657269667920747062746160501b6044820152606401610490565b600061068e8560800151612e1e565b80516020918201206000818152600483526040902091870151825491935063ffffffff1611156107015760208681015163ffffffff1680835560408051858152928301919091527f14f6dcf24001d9e8910255539bf10f0a01ba6fcb712bdcd812fe528b9ad798d1910160405180910390a15b60208087015163ffffffff16600090815260018301909152604090206107289089896152a9565b507f8796377aabd0d7feac50b0be12f810cac9a467a6ccd01c3bb79e50e2da8fd1f282876020015160405161076d92919091825263ffffffff16602082015260400190565b60405180910390a160075460e087015160405163034707e360e31b81526001600160a01b0390921691631a383f18916107a8916004016156dc565b600060405180830381600087803b1580156107c257600080fd5b505af11580156107d6573d6000803e3d6000fd5b505050505050505050505050565b60606003600084846040516107fa929190615b9d565b60405180910390208152602001908152602001600020600001805461081e90615bad565b80601f016020809104026020016040519081016040528092919081815260200182805461084a90615bad565b80156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b505050505090505b92915050565b600681815481106108b557600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b6000806004600086866040516108f0929190615b9d565b6040518091039020815260200190815260200160002060010160008463ffffffff168152602001908152602001600020805461092b90615bad565b90501190509392505050565b600054600160a81b900460ff161580801561095f57506000546001600160a01b90910460ff16105b806109805750303b1580156109805750600054600160a01b900460ff166001145b6109e35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c","72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610490565b6000805460ff60a01b1916600160a01b1790558015610a10576000805460ff60a81b1916600160a81b1790555b610a19826130ad565b610a22336131fa565b8015610a6b576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b5050565b610a7761280a565b6001600160a01b038116610ad95760405162461bcd60e51b815260206004820152602360248201527f5074634875623a20696e76616c6964206d6f6e69746f7250746320636f6e74726044820152621858dd60ea1b6064820152608401610490565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b3c83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061324a92505050565b90506000610b4d8260200151612e1e565b805160208083019190912060009081526004825260408082208682015163ffffffff16835260010190925290812080549293509091610b8b90615bad565b905011610bce5760405162461bcd60e51b815260206004820152601160248201527009dd1c189d1849c81b9bdd08199bdd5b99607a1b6044820152606401610490565b6000610be482846040015163ffffffff16613344565b9050610bf7816060015160600151612a06565b610c3d5760405162461bcd60e51b81526020600482015260176024820152761b9bc81c1d18c81d1c9d5cdd081c9bdbdd08199bdd5b99604a1b6044820152606401610490565b6000610c50826060015160600151612a43565b90506000610c618360400151612b01565b9050610c7583606001516060015182612bbd565b610cc15760405162461bcd60e51b815260206004820152601a60248201527f6e6f207074632076657269667920616e63686f7220666f756e640000000000006044820152606401610490565b600060056000610cd8856020015160c00151612c01565b604001516002811115610ced57610ced615708565b6002811115610cfe57610cfe615708565b81526020810191909152604001600020546001600160a01b0316905080610d5c5760405162461bcd60e51b81526020600482015260126024820152711b9bc81c1d18c81d995a599a595c881cd95d60721b6044820152606401610490565b60075460405163471174e560e01b81526000916001600160a01b038085169263471174e592610d95928a928d9290911690600401615be8565b6020604051808303816000875af1158015610db4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd89190615b7b565b90507f4d2d7be42668dce2927650393613e408fc71274deac16f825eb0a869a5667e8c856080015182604051610e0f929190615c7f565b60405180910390a180610e565760405162461bcd60e51b815260206004820152600f60248201526e766572696679206e6f74207061737360881b6044820152606401610490565b505050505050505050565b610e6961280a565b610e7360006131fa565b565b600080600360008585604051610e8c929190615b9d565b604051809103902081526020019081526020016000206000018054610eb090615bad565b905011905092915050565b60026020526000908152604090208054610ed490615bad565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0090615bad565b8015610f4d5780601f10610f2257610100808354040283529160200191610f4d565b820191906000526020600020905b815481529060010190602001808311610f3057829003601f168201915b505050505081565b610f5d61280a565b6000610f9e83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061340292505050565b9050610fa981613543565b6000610fb482613767565b60008181526003602052604081208054929350918290610fd390615bad565b905011156110bc57610fe68186866152a9565b505b6060830151602081015151905110156110b757600061100a8460600151613787565b6000818152600184016020526040902080549192509061102990615bad565b151590506110a25761103e846060015161379a565b600082815260018401602090815260409091208251611063939192919091019061532d565b5060408051848152602081018390527f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce910160405180910390a16110b1565b6110af846060015161379a565b505b50610fe8565b611193565b6110c78186866152a9565b505b60608301516020810151519051101561115f5760006110eb8460600151613787565b90506110fa846060015161379a565b60008281526001840160209081526040909120825161111f939192919091019061532d565b5060408051848152602081018390527f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce910160405180910390a1506110c9565b6040518281527fc115cf6e41eccaaf9dbe48f3cbf3e82c176644e35bf1cae0839627723d980a0d9060200160405180910390a15b5050505050565b6111a261280a565b60006005818360028111156111b9576111b9615708565b60028111156111ca576111ca615708565b81526020810191909152604001600020546001600160a01b031614156112325760405162461bcd60e51b815260206004820152601760248201527f707463207665726966696572206e6f74206578697374730000000000000000006044820152606401610490565b60015b6006548110156113785781600281111561125157611251615708565b6006828154811061126457611264615ca3565b90600052602060002090602091828204019190069054906101000a900460ff16600281111561129557611295615708565b141561136657600680546112ab90600190615ccf565b815481106112bb576112bb615ca3565b90600052602060002090602091828204019190069054906101000a900460ff16600682815481106112ee576112ee615ca3565b90600052602060002090602091828204019190066101000a81548160ff0219169083600281111561132157611321615708565b0217905550600680548061133757611337615ce6565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611378565b8061137081615cfc565b915050611235565b506005600082600281111561138f5761138f615708565b60028111156113a0576113a0615708565b81526020810191909152604090810160002080546001600160a01b0319169055517f4ae9b990c01f3cf6322d2f72f0c0a7eefdcdb12b782e47f420dbc75314d7f508906113ee908390615732565b60405180910390a150565b60036020526000908152604090208054819061141490615bad565b80601f016020809104026020016040519081016040528092919081815260200182805461144090615bad565b801561148d5780601f106114625761010080835404028352916020019161148d565b820191906000526020600020905b81548152906001019060200180831161147057829003601f168201915b5050505050905081565b6060600680548060200260200160405190810160405280929190818152602001828054801561151557602002820191906000526020600020906000905b82829054906101000a900460ff1660028111156114f3576114f3615708565b8152602060019283018181049485019490930390920291018084116114d45790505b5050505050905090565b61152761280a565b6000816001600160a01b031663b93ba39c6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158d9190615d17565b905060006005818360028111156115a6576115a6615708565b60028111156115b7576115b7615708565b81526020810191909152604001600020546001600160a01b03161461161e5760405162461bcd60e51b815260206004820152601b60248201527f70746320766572696669657220616c72656164792065786973747300000000006044820152606401610490565b600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f602082040180548392601f166101000a60ff8102199091169083600281111561167a5761167a615708565b0217905550816005600083600281111561169657611696615708565b60028111156116a7576116a7615708565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507e9d36884bab8205b3032d60f42239b9d5024f0acd6178f117374a9bbef092958183604051610a62929190615d34565b600080600360008686604051611720929190615b9d565b604051809103902081526020019081526020016000206001016000848152602001908152602001600020805461092b90615bad565b606060046000858560405161176b929190615b9d565b6040518091039020815260200190815260200160002060010160008363ffffffff16815260200190815260200160002080546117a690615bad565b80601f01602080910402602001604051908101604052809291908181526020018280546117d290615bad565b801561181f5780601f106117f45761010080835404028352916020019161181f565b820191906000526020600020905b81548152906001019060200180831161180257829003601f168201915b505050505090509392505050565b6060600360008585604051611843929190615b9d565b60405180910390208152602001908152602001600020600101600083815260200190815260200160002080546117a690615bad565b805160208183018101805160018252928201919093012091528054610ed490615bad565b6118a461280a565b6001600160a01b0381166119095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610490565b611912816131fa565b50565b6060600060046000858560405161192d929190615b9d565b60405180910390208152602001908152602001600020905080600101600082600001548152602001908152602001600020805461196990615bad565b80601f016020809104026020016040519081016040528092919081815260200182805461199590615bad565b80156119e25780601f106119b7576101008083540402835291602001916119e2565b8201919060","00526020600020905b8154815290600101906020018083116119c557829003601f168201915b505050505091505092915050565b6119f86153a1565b611a006153a1565b6000611a0b84611de2565b905060005b816020015151811015611baf57600082602001518281518110611a3557611a35615ca3565b60200260200101519050600061ffff16816000015161ffff161415611a605760408101518452611b9c565b805161ffff1660011415611a7d5760408101516020850152611b9c565b805161ffff1660021415611ad957611a9481611fc4565b60ff166003811115611aa857611aa8615708565b84604001906003811115611abe57611abe615708565b90816003811115611ad157611ad1615708565b905250611b9c565b805161ffff1660031415611b0457611afa611af5826040015190565b613840565b6060850152611b9c565b805161ffff1660041415611b2e57611b1b81611fd5565b6001600160401b03166080850152611b9c565b805161ffff1660051415611b5857611b4581611fd5565b6001600160401b031660a0850152611b9c565b805161ffff1660061415611b7557604081015160c0850152611b9c565b805161ffff1660071415611b9c57611b96611b91826040015190565b61391b565b60e08501525b5080611ba781615cfc565b915050611a10565b50909392505050565b611bc0615424565b600082604001516003811115611bd857611bd8615708565b1415611bf557611beb8260c00151613a37565b6020015192915050565b600182604001516003811115611c0d57611c0d615708565b1415611c2a57611c208260c00151613af9565b6080015192915050565b600282604001516003811115611c4257611c42615708565b1415611c5f57611c558260c00151612c01565b6060015192915050565b600382604001516003811115611c7757611c77615708565b1415611c9457611c8a8260c00151613c51565b6040015192915050565b60405162461bcd60e51b815260206004820152602660248201527f676574436572744f776e65724f69643a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b6064820152608401610490565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611d05579050509050611d5e6000611d5985600001516001811115611d5457611d54615708565b611fee565b612002565b81600081518110611d7157611d71615ca3565b6020026020010181905250611d8b6001846020015161206f565b81600181518110611d9e57611d9e615ca3565b6020026020010181905250611dca6040518060400160405280600061ffff168152602001606081525090565b60208101829052611dda816120b2565b949350505050565b604080518082019091526000815260606020820152600682511015611e495760405162461bcd60e51b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e6774680000000000000000006044820152606401610490565b6040805180820190915260008082526060602083015290611e72611e6d85846121b7565b6121df565b61ffff168152611e83600683615d5a565b91506000825b8551811015611edd57611eae611ea987611ea4846002615d5a565b612280565b6122aa565b611eb9906006615d72565b611ec99063ffffffff1682615d5a565b905081611ed581615cfc565b925050611e89565b6000826001600160401b03811115611ef757611ef761579f565b604051908082528060200260200182016040528015611f4457816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611f155790505b509050600092505b8651851015611fae5760408051606080820183526000808352602083015291810191909152611f7b8887613d30565b96509050808285611f8b81615cfc565b965081518110611f9d57611f9d615ca3565b602002602001018190525050611f4c565b60208401525090949350505050565b6040015190565b600061089f60018360400151015190565b600061089f611fe960088460400151015190565b6123a9565b600081600181111561089f5761089f615708565b6040805160608082018352600080835260208301529181019190915260408051600180825281830190925260009160208201818036833701905050905061204b60018483612567565b6040805160608101825261ffff959095168552600160208601528401525090919050565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b606060006120bf83612578565b905060006120ce826006615d72565b63ffffffff166001600160401b038111156120eb576120eb61579f565b6040519080825280601f01601f191660200182016040528015612115576020820181803683370190505b509050612130600261212a86600001516121df565b836125ec565b612144600661213e846122aa565b836125fd565b600660005b6020860151518110156121ad57600061217e8760200151838151811061217157612171615ca3565b6020026020010151612616565b905061218b8382866126a5565b80516121979084615d5a565b92505080806121a590615cfc565b915050612149565b5090949350505050565b81516000906121c7836002615d5a565b11156121d257600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b8160008151811061222257612222615ca3565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160018151811061225357612253615ca3565b60200101906001600160f81b031916908160001a90535060006122778260006121b7565b95945050505050565b8151600090612290836004615d5a565b111561229b57600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b816000815181106122ed576122ed615ca3565b60200101906001600160f81b031916908160001a9053508160021a60f81b8160018151811061231e5761231e615ca3565b60200101906001600160f81b031916908160001a9053508160011a60f81b8160028151811061234f5761234f615ca3565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160038151811061238057612380615ca3565b60200101906001600160f81b031916908160001a9053506000612277826000612280565b015190565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b816000815181106123ec576123ec615ca3565b60200101906001600160f81b031916908160001a9053508160061a60f81b8160018151811061241d5761241d615ca3565b60200101906001600160f81b031916908160001a9053508160051a60f81b8160028151811061244e5761244e615ca3565b60200101906001600160f81b031916908160001a9053508160041a60f81b8160038151811061247f5761247f615ca3565b60200101906001600160f81b031916908160001a9053508160031a60f81b816004815181106124b0576124b0615ca3565b60200101906001600160f81b031916908160001a9053508160021a60f81b816005815181106124e1576124e1615ca3565b60200101906001600160f81b031916908160001a9053508160011a60f81b8160068151811061251257612512615ca3565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160078151811061254357612543615ca3565b60200101906001600160f81b031916908160001a9053506000612277826000613e8b565b909101600019810180519290915252565b600080805b6020840151518110156125e5576000846020015182815181106125a2576125a2615ca3565b602002602001015190508060400151518360066125bf9190615d72565b63ffffffff166125cf9190615d5a565b92505080806125dd90615cfc565b91505061257d565b5092915050565b909101600119810180519290915252565b909101600319810180519290915252565b602001515190565b606060008260200151600661262b9190615d72565b63ffffffff166001600160401b038111156126485761264861579f565b6040519080825280601f01601f191660200182016040528015612672576020820181803683370190505b509050612687600261212a85600001516121df565b612699600661213e85602001516122aa565b61089f60068460400151835b815181516126b963ffffffff831686615d5a565b11156127385760405162461bcd60e51b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a401610490565b8015801561274557611193565b8483018051601f84168015602002818801018581018215602002838601015b8183101561277c578251815260209283019201612764565b5050509152505050505050565b82516060906127988385615d5a565b11156127a357600080fd5b6000826001600160401b038111156127bd576127bd61579f565b6040519080825280601f01601f1916602001820160405280156127e7576020820181803683370190505b509050602080820190868601016127ff828287613eb8565b509095945050505050565b6000546001600160a01b03163314610e735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610490565b61286c61543f565b61287461543f565b600061287f84611de2565b905060005b816020015151811015611baf576000826020015182815181106128a9576128a9615ca3565b60200260200101519050600061ffff16816000015161ffff1614156128de576128d181613f33565b63ffffffff1684526129f3565b805161ffff1660011415612905576128f581613f33565b63ffffffff1660208501526129f3565b805161ffff166002141561292257604081015160408501526129f3565b805161ffff166003141561294d5761294361293e826040015190565b612c01565b60608501526129f3565b805161ffff16600414156129785761296e612969826040015190565b613f47565b60808501526129f3565b805161ffff166005141561299f5761298f81613f33565b63ffffffff1660a08501526129f3565b805161ffff16600614156129bc57604081015160c08501526129f3565b","805161ffff16600714156129d957604081015160e08501526129f3565b805161ffff1660ff14156129f35760408101516101008501525b50806129fe81615cfc565b915050612884565b60008060036000612a1685611ceb565b8051906020012081526020019081526020016000206000018054612a3990615bad565b9050119050919050565b612a4b61549c565b61089f60036000612a5b85611ceb565b8051906020012081526020019081526020016000206000018054612a7e90615bad565b80601f0160208091040260200160405190810160405280929190818152602001828054612aaa90615bad565b8015612af75780601f10612acc57610100808354040283529160200191612af7565b820191906000526020600020905b815481529060010190602001808311612ada57829003601f168201915b5050505050613402565b80516000906020811115612b635760405162461bcd60e51b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b6064820152608401610490565b6000816001600160401b03811115612b7d57612b7d61579f565b6040519080825280601f01601f191660200182016040528015612ba7576020820181803683370190505b5084518152938201519190930151900392915050565b60008060036000612bcd86611ceb565b80519060200120815260200190815260200160002060010160008481526020019081526020016000208054610eb090615bad565b612c096154f3565b612c116154f3565b6000612c1c84611de2565b905060005b816020015151811015611baf57600082602001518281518110612c4657612c46615ca3565b60200260200101519050600061ffff16816000015161ffff161415612c715760408101518452612d29565b805161ffff1660011415612c8e5760408101516020850152612d29565b805161ffff1660021415612cea57612ca581611fc4565b60ff166002811115612cb957612cb9615708565b84604001906002811115612ccf57612ccf615708565b90816002811115612ce257612ce2615708565b905250612d29565b805161ffff1660031415612d1057612d06611af5826040015190565b6060850152612d29565b805161ffff1660041415612d2957604081015160808501525b5080612d3481615cfc565b915050612c21565b6040805180820190915260608082526020820152612e1760036000612d6086611ceb565b80519060200120815260200190815260200160002060010160008481526020019081526020016000208054612d9490615bad565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc090615bad565b8015612e0d5780601f10612de257610100808354040283529160200191612e0d565b820191906000526020600020905b815481529060010190602001808311612df057829003601f168201915b505050505061403a565b9392505050565b60208101516060908190158015612e3757506040830151155b15612ebc5760408051600180825281830190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612e51579050509050612e996000612e9485600001516140ee565b61206f565b81600081518110612eac57612eac615ca3565b6020026020010181905250613093565b602083015115801590612ed25750604083015115155b1561304b576040805160038082526080820190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612eed579050509050612f306000612e9485600001516140ee565b81600081518110612f4357612f43615ca3565b6020026020010181905250600060206001600160401b03811115612f6957612f6961579f565b6040519080825280601f01601f191660200182016040528015612f93576020820181803683370190505b50602085810151908201529050612fab60018261206f565b82600181518110612fbe57612fbe615ca3565b6020026020010181905250600060206001600160401b03811115612fe457612fe461579f565b6040519080825280601f01601f19166020018201604052801561300e576020820181803683370190505b5060408601516020820152905061302660028261206f565b8360028151811061303957613039615ca3565b60200260200101819052505050613093565b60405162461bcd60e51b815260206004820152601760248201527f696e76616c69642063726f7373636861696e206c616e650000000000000000006044820152606401610490565b604080518082019091526000815260606020820152611dca565b60006130b8826119f0565b90506000816040015160038111156130d2576130d2615708565b1461311f5760405162461bcd60e51b815260206004820152601e60248201527f77726f6e67207479706520666f72206263646e7320726f6f74206365727400006044820152606401610490565b600061313261312d83611bb8565b611ceb565b805190602001209050826001604051806040016040528060048152602001631c9bdbdd60e21b8152506040516131689190615d9a565b9081526020016040518091039020908051906020019061318992919061532d565b5060408051808201825260048152631c9bdbdd60e21b6020808301918252600085815260029091529290922090516131c1929061532d565b506040518181527f7c787bfbe942686b5f41acec151012ca79c6b81c1c5a23cee512781cf3d5b9bb9060200160405180910390a1505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613252615519565b61325a615519565b600061326584611de2565b905060005b816020015151811015611baf5760008260200151828151811061328f5761328f615ca3565b60200260200101519050600561ffff16816000015161ffff1614156132c8576132c16132bc826040015190565b6141fd565b8452613331565b805161ffff1661010114156132ef576132e5612969826040015190565b6020850152613331565b805161ffff1661010014156133175761330781613f33565b63ffffffff166040850152613331565b805161ffff166101ff141561333157604081015160608501525b508061333c81615cfc565b91505061326a565b61334c61543f565b82516020808501919091206000908152600482526040808220858352600101909252208054612e17919061337f90615bad565b80601f01602080910402602001604051908101604052809291908181526020018280546133ab90615bad565b80156133f85780601f106133cd576101008083540402835291602001916133f8565b820191906000526020600020905b8154815290600101906020018083116133db57829003601f168201915b5050505050612864565b61340a61549c565b61341261549c565b600061341d84611de2565b905060005b816020015151811015611baf5760008260200151828151811061344757613447615ca3565b60200260200101519050600061ffff16816000015161ffff1614156134725760408101518452613530565b805161ffff166001141561349d5761349361348e826040015190565b6119f0565b6020850152613530565b805161ffff16600214156134ba5760408101516040850152613530565b805161ffff16600314156134fa57604080518082018252600080825260606020928301528251808401845290815291830151908201526060850152613530565b805161ffff16600414156135175760408101516080850152613530565b805161ffff166005141561353057604081015160a08501525b508061353b81615cfc565b915050613422565b6000613556826020015160600151611ceb565b8051602091820120600081815260029092526040822080549193509061357b90615bad565b9050116135bd5760405162461bcd60e51b815260206004820152601060248201526f1a5cdcdd595c881b9bdd08199bdd5b9960821b6044820152606401610490565b600081815260026020526040808220905161367b916001916135df9190615db6565b908152602001604051809103902080546135f890615bad565b80601f016020809104026020016040519081016040528092919081815260200182805461362490615bad565b80156136715780601f1061364657610100808354040283529160200191613671565b820191906000526020600020905b81548152906001019060200180831161365457829003601f168201915b50505050506119f0565b90506136c6604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b8152508260e001516040015161428a90919063ffffffff16565b1561370d576000806136e58386602001516142a090919063ffffffff16565b915091508181906137095760405162461bcd60e51b815260040161049091906156dc565b5050505b61371683614434565b6137625760405162461bcd60e51b815260206004820152601a60248201527f70746320747275737420726f6f742073696720696e76616c69640000000000006044820152606401610490565b505050565b600061377961312d8360200151611bb8565b805190602001209050919050565b600061089f6137958361379a565b612b01565b60608160200151518260000151106138085760405162461bcd60e51b815260206004820152602b60248201527f544c564974656d4d617056616c756553747265616d3a206f6666657374206f7560448201526a3a1037b310313ab33332b960a91b6064820152608401610490565b600061381c8360000151846020015161445e565b805184519192509061382f906004615d5a565b6138399190615d5a565b9092525090565b613848615424565b613850615424565b600061385b84611de2565b905060005b816020015151811015611baf5760008260200151828151811061388557613885615ca3565b60200260200101519050600061ffff16816000015161ffff1614156138ef576138ad81611fc4565b60ff1660018111156138c1576138c1615708565b849060018111156138d4576138d4615708565b908160018111156138e7576138e7615708565b905250613908565b805161ffff166001141561390857604081015160208501525b508061391381615cfc565b915050613860565b6139466040518060800160405280606081526020016060815260200160608152602001606081525090565b6139716040518060800160405280606081526020016060815260200160608152602001606081525090565b600061397c84611de2565b905060005b816020015151811015611baf576000826020015182815181106139a6576139a6615ca3565b60200260200101519050600061ffff16816000015161","ffff1614156139d15760408101518452613a24565b805161ffff16600114156139ee5760408101516020850152613a24565b805161ffff1660021415613a0b5760408101516040850152613a24565b805161ffff1660031415613a2457604081015160608501525b5080613a2f81615cfc565b915050613981565b613a3f61554f565b613a4761554f565b6000613a5284611de2565b905060005b816020015151811015611baf57600082602001518281518110613a7c57613a7c615ca3565b60200260200101519050600061ffff16816000015161ffff161415613aa75760408101518452613ae6565b805161ffff1660011415613acd57613ac3611af5826040015190565b6020850152613ae6565b805161ffff1660021415613ae657604081015160408501525b5080613af181615cfc565b915050613a57565b613b01615569565b613b09615569565b6000613b1484611de2565b905060005b816020015151811015611baf57600082602001518281518110613b3e57613b3e615ca3565b60200260200101519050600061ffff16816000015161ffff161415613b695760408101518452613c3e565b805161ffff1660011415613bc557613b8081611fc4565b60ff166001811115613b9457613b94615708565b84602001906001811115613baa57613baa615708565b90816001811115613bbd57613bbd615708565b905250613c3e565b805161ffff1660021415613be25760408101516040850152613c3e565b805161ffff1660031415613bff5760408101516060850152613c3e565b805161ffff1660041415613c2557613c1b611af5826040015190565b6080850152613c3e565b805161ffff1660051415613c3e57604081015160a08501525b5080613c4981615cfc565b915050613b19565b613c59615599565b613c61615599565b6000613c6c84611de2565b905060005b816020015151811015611baf57600082602001518281518110613c9657613c96615ca3565b60200260200101519050600061ffff16816000015161ffff161415613cc15760408101518452613d1d565b805161ffff1660011415613cde5760408101516020850152613d1d565b805161ffff1660031415613d0457613cfa611af5826040015190565b6040850152613d1d565b805161ffff1660041415613d1d57604081015160608501525b5080613d2881615cfc565b915050613c71565b60408051606080820183526000808352602083015291810191909152600082845111613daa5760405162461bcd60e51b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b6064820152608401610490565b6006831015613dec5760405162461bcd60e51b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b6044820152606401610490565b60408051606080820183526000808352602083015291810191909152613e15611e6d86866121b7565b61ffff168152613e26600285615d5a565b9350613e35611ea98686612280565b63ffffffff166020820152613e4b600485615d5a565b9350613e628585836020015163ffffffff16612789565b60408201526020810151613e7c9063ffffffff1685615d5a565b935091508290505b9250929050565b8151600090613e9b836008615d5a565b1115613ea657600080fd5b5001600801516001600160401b031690565b60208110613ef05781518352613ecf602084615d5a565b9250613edc602083615d5a565b9150613ee9602082615ccf565b9050613eb8565b80613efa57505050565b60006001613f09836020615ccf565b613f1590610100615f36565b613f1f9190615ccf565b925184518416931916929092179092525050565b600061089f611ea960048460400151015190565b613f4f6155ba565b613f576155ba565b6000613f6284611de2565b905060005b816020015151811015611baf57600082602001518281518110613f8c57613f8c615ca3565b60200260200101519050600061ffff16816000015161ffff161415613fc557613fbe613fb9826040015190565b6144f2565b8452614027565b805161ffff1660011415613ff8576000613fe0826040015190565b9050613fed815182015190565b602086015250614027565b805161ffff1660021415614027576000614013826040015190565b9050614020815182015190565b6040860152505b508061403281615cfc565b915050613f67565b60408051808201909152606080825260208201526040805180820190915260608082526020820152600061406d84611de2565b905060005b816020015151811015611baf5760008260200151828151811061409757614097615ca3565b60200260200101519050600061ffff16816000015161ffff1614156140c257604081015184526140db565b805161ffff16600114156140db57604081015160208501525b50806140e681615cfc565b915050614072565b60608060008360200151511115614195576040805160028082526060820190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816141155790505090506141556000846000015161206f565b8160008151811061416857614168615ca3565b60200260200101819052506141826001846020015161206f565b81600181518110612eac57612eac615ca3565b60408051600180825281830190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816141aa5790505090506141ea6000846000015161206f565b81600081518110611d9e57611d9e615ca3565b604080516020810190915260608152604080516020810190915260608152600061422684611de2565b905060005b816020015151811015611baf5760008260200151828151811061425057614250615ca3565b60200260200101519050600061ffff16816000015161ffff16141561427757604081015184525b508061428281615cfc565b91505061422b565b8051602091820120825192909101919091201490565b6000606081836040015160038111156142bb576142bb615708565b141561431c5760006142d08460c00151613a37565b90506142ed816020015186606001516145a690919063ffffffff16565b614316576000604051806060016040528060288152602001616074602891399250925050613e84565b506143c4565b60018360400151600381111561433457614334615708565b14156143a05760006143498460c00151613af9565b905060018160200151600181111561436357614363615708565b1461438d576000604051806080016040528060538152602001616021605391399250925050613e84565b608081015160608601516142ed916145a6565b60006040518060600160405280603d8152602001615fbd603d913991509150613e84565b6143f08460e00151604001516143d9856145d1565b6143e2876146f6565b8760e001516060015161488b565b1561440e575050604080516020810190915260008152600190613e84565b6000604051806060016040528060278152602001615ffa60279139915091509250929050565b600061089f826080015161444b84602001516145d1565b61445485614a56565b8560a0015161488b565b606061446b600484615d5a565b9250600061447c611ea98585015190565b63ffffffff16905060608115801561449f576040519150602082016040526144e9565b6040519150601f8316801560200281840101848101888315602002848a0101015b818310156144d85780518352602092830192016144c0565b5050848452601f01601f1916604052505b50949350505050565b60408051808201909152606080825260208201526040805180820190915260608082526020820152600061452584611de2565b905060005b816020015151811015611baf5760008260200151828151811061454f5761454f615ca3565b60200260200101519050600061ffff16816000015161ffff16141561457a5760408101518452614593565b805161ffff166001141561459357604081015160208501525b508061459e81615cfc565b91505061452a565b60006145b182611ceb565b805190602001206145c184611ceb565b8051906020012014905092915050565b60606000826040015160038111156145eb576145eb615708565b14156146065761089f6146018360c00151613a37565b614b80565b60018260400151600381111561461e5761461e615708565b14156146395761089f6146348360c00151613af9565b614b9d565b60028260400151600381111561465157614651615708565b141561466c5761089f6146678360c00151612c01565b614bba565b60038260400151600381111561468457614684615708565b141561469f5761089f61469a8360c00151613c51565b614bd7565b60405162461bcd60e51b815260206004820152602660248201527f6765745261775075626c69634b65793a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b6064820152608401610490565b604080516007808252610100820190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816147135790505090506147536000846000015161206f565b8160008151811061476657614766615ca3565b60200260200101819052506147806001846020015161206f565b8160018151811061479357614793615ca3565b60200260200101819052506147c16002611d59856040015160038111156147bc576147bc615708565b614beb565b816002815181106147d4576147d4615ca3565b60200260200101819052506147f16003612e948560600151611ceb565b8160038151811061480457614804615ca3565b602002602001018190525061481e60048460800151614bff565b8160048151811061483157614831615ca3565b602002602001018190525061484b60058460a00151614bff565b8160058151811061485e5761485e615ca3565b602002602001018190525061487860068460c0015161206f565b81600681518110611d9e57611d9e615ca3565b60006148ce604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b8152508661428a90919063ffffffff16565b6149365760405162461bcd60e51b815260206004820152603360248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152723235364b31207369676e6174757265206e6f7760681b6064820152608401610490565b6041825110156149885760405162461bcd60e51b815260206004820152601a60248201527f77726f6e6720736563703235366b3120736967206c656e6774680000000000006044820152606401610490565b601b8260408151811061499d5761499d615ca3565b01602001516149af919060f81c615f42565b60f81b826040815181106149c5","576149c5615ca3565b60200101906001600160f81b031916908160001a905350835160208501206000906149f7908551602087012085614c7f565b9050601b83604081518110614a0e57614a0e615ca3565b0160200151614a20919060f81c615f67565b60f81b83604081518110614a3657614a36615ca3565b60200101906001600160f81b031916908160001a90535095945050505050565b60408051600580825260c0820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081614a72579050509050614ab26000846000015161206f565b81600081518110614ac557614ac5615ca3565b6020026020010181905250614ae26001612e948560200151614ce0565b81600181518110614af557614af5615ca3565b6020026020010181905250614b0f6002846040015161206f565b81600281518110614b2257614b22615ca3565b6020026020010181905250614b40600384606001516020015161206f565b81600381518110614b5357614b53615ca3565b6020026020010181905250614b6d6004846080015161206f565b81600481518110611d9e57611d9e615ca3565b606061089f82604001518360200151614ea090919063ffffffff16565b606061089f8260a001518360800151614ea090919063ffffffff16565b606061089f82608001518360600151614ea090919063ffffffff16565b606081810151604083015161089f91614ea0565b600081600381111561089f5761089f615708565b60408051606080820183526000808352602083015291810191909152604080516008808252818301909252600091602082018180368337019050509050614c5b6008614c4a856123a9565b908301600719810180519290915252565b6040805160608101825261ffff959095168552600860208601528401525090919050565b6000806000614c8e8585614fc0565b90925090506000816004811115614ca757614ca7615708565b148015614cc55750856001600160a01b0316826001600160a01b0316145b80614cd65750614cd6868686615003565b9695505050505050565b604080516008808252610120820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081614cfd579050509050614d3d6000846000015161206f565b81600081518110614d5057614d50615ca3565b6020026020010181905250614d6a6001846020015161206f565b81600181518110614d7d57614d7d615ca3565b6020026020010181905250614da66002611d59856040015160038111156147bc576147bc615708565b81600281518110614db957614db9615ca3565b6020026020010181905250614dd66003612e948560600151611ceb565b81600381518110614de957614de9615ca3565b6020026020010181905250614e0360048460800151614bff565b81600481518110614e1657614e16615ca3565b6020026020010181905250614e3060058460a00151614bff565b81600581518110614e4357614e43615ca3565b6020026020010181905250614e5d60068460c0015161206f565b81600681518110614e7057614e70615ca3565b6020026020010181905250614e8d6007612e948560e001516150ef565b81600781518110611d9e57611d9e615ca3565b6060600083516001811115614eb757614eb7615708565b14614f125760405162461bcd60e51b815260206004820152602560248201527f6f6e6c7920737570706f727420583530395f5055424c49435f4b45595f494e466044820152644f206e6f7760d81b6064820152608401610490565b60408360200151511015614f685760405162461bcd60e51b815260206004820152601c60248201527f7075626c6963206b6579206c656e677468206e6f7420656e6f757468000000006044820152606401610490565b60208301518051600090614f7e90604090615ccf565b60408051818152606081018252919250600091906020820181803683370190505092909101602081810151908401526040908101519083015250905092915050565b600080825160411415614ff75760208301516040840151606085015160001a614feb878285856151e5565b94509450505050613e84565b50600090506002613e84565b6000806000856001600160a01b0316631626ba7e60e01b868660405160240161502d929190615f8a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161506b9190615d9a565b600060405180830381855afa9150503d80600081146150a6576040519150601f19603f3d011682016040523d82523d6000602084013e6150ab565b606091505b50915091508180156150bf57506020815110155b8015614cd657508051630b135d3f60e11b906150e49083016020908101908401615fa3565b149695505050505050565b60408051600480825260a0820190925260609160009190816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161510b57905050905061514b6000846000015161206f565b8160008151811061515e5761515e615ca3565b60200260200101819052506151786001846020015161206f565b8160018151811061518b5761518b615ca3565b60200260200101819052506151a56002846040015161206f565b816002815181106151b8576151b8615ca3565b60200260200101819052506151d26003846060015161206f565b81600381518110611d9e57611d9e615ca3565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561521c57506000905060036152a0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015615270573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116615299576000600192509250506152a0565b9150600090505b94509492505050565b8280546152b590615bad565b90600052602060002090601f0160209004810192826152d7576000855561531d565b82601f106152f05782800160ff1982351617855561531d565b8280016001018555821561531d579182015b8281111561531d578235825591602001919060010190615302565b506153299291506155e9565b5090565b82805461533990615bad565b90600052602060002090601f01602090048101928261535b576000855561531d565b82601f1061537457805160ff191683800117855561531d565b8280016001018555821561531d579182015b8281111561531d578251825591602001919060010190615386565b604080516101008101825260608082526020820152908101600081526020016153c8615424565b815260200160006001600160401b0316815260200160006001600160401b031681526020016060815260200161541f6040518060800160405280606081526020016060815260200160608152602001606081525090565b905290565b604080518082019091528060005b8152602001606081525090565b60408051610120810182526000808252602082015260609181018290529081016154676154f3565b81526020016154746155ba565b8152602001600063ffffffff1681526020016060815260200160608152602001606081525090565b6040518060c00160405280606081526020016154b66153a1565b8152602001606081526020016154df604051806040016040528060008152602001606081525090565b815260200160608152602001606081525090565b6040805160a0810182526060808252602082015290810160008152602001615432615424565b6040805160a0810190915260606080820190815281526020810161553b6155ba565b815260006020820152606060409091015290565b604051806060016040528060608152602001615432615424565b6040805160c081019091526060815260208101600081526020016060815260200160608152602001615432615424565b60405180608001604052806060815260200160608152602001615432615424565b6040805160a0810182526060808201818152608083019190915281526000602082018190529181019190915290565b5b8082111561532957600081556001016155ea565b60008083601f84011261561057600080fd5b5081356001600160401b0381111561562757600080fd5b602083019150836020828501011115613e8457600080fd5b6000806020838503121561565257600080fd5b82356001600160401b0381111561566857600080fd5b615674858286016155fe565b90969095509350505050565b60005b8381101561569b578181015183820152602001615683565b838111156156aa576000848401525b50505050565b600081518084526156c8816020860160208601615680565b601f01601f19169290920160200192915050565b602081526000612e1760208301846156b0565b60006020828403121561570157600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6003811061572e5761572e615708565b9052565b6020810161089f828461571e565b60008060006040848603121561575557600080fd5b83356001600160401b0381111561576b57600080fd5b615777868287016155fe565b909450925050602084013563ffffffff8116811461579457600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156157cf576157cf61579f565b604051601f8501601f19908116603f011681019082821181831017156157f7576157f761579f565b8160405280935085815286868601111561581057600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561583c57600080fd5b81356001600160401b0381111561585257600080fd5b8201601f8101841361586357600080fd5b611dda848235602084016157b5565b60006020828403121561588457600080fd5b81356001600160a01b0381168114612e1757600080fd5b6003811061191257600080fd5b6000602082840312156158ba57600080fd5b8135612e178161589b565b6020808252825182820181905260009190848201906040850190845b81811015615904576158f483855161571e565b92840192918401916001016158e1565b50909695505050505050565b60008060006040848603121561592557600080fd5b83356001600160401b0381111561593b57600080fd5b615947868287016155fe565b909790965060209590950135949350505050565b6000815160a0845261597060a08501826156b0565b90506020830151848203602086015261598982826156b0565b915050604083015161599e604086018261571e565b50606083015184820360608601528051600281106159be576159be615708","565b8083525060208101519050604060208301526159dd60408301826156b0565b9150506080830151848203608086015261227782826156b0565b6000815160608452805160406060860152615a1560a08601826156b0565b905060208201519150605f19858203016080860152615a3481836156b0565b91505060208301516020850152604083015160408501528091505092915050565b805163ffffffff16825260006101206020830151615a7b602086018263ffffffff169052565b506040830151816040860152615a93828601826156b0565b91505060608301518482036060860152615aad828261595b565b91505060808301518482036080860152615ac782826159f7565b91505060a0830151615ae160a086018263ffffffff169052565b5060c083015184820360c0860152615af982826156b0565b91505060e083015184820360e0860152615b1382826156b0565b9150506101008084015185830382870152614cd683826156b0565b6040815260008351604080840152615b4960808401826156b0565b90506020850151603f19848303016060850152615b6682826156b0565b91505082810360208401526122778185615a55565b600060208284031215615b8d57600080fd5b81518015158114612e1757600080fd5b8183823760009101908152919050565b600181811c90821680615bc157607f821691505b60208210811415615be257634e487b7160e01b600052602260045260246000fd5b50919050565b606081526000615bfb6060830186615a55565b82810360208401528451608082528051905060206080830152615c2160a08301826156b0565b905060208601518282036020840152615c3a82826159f7565b91505063ffffffff604087015116604083015260608601518282036060840152615c6482826156b0565b935050505060018060a01b0383166040830152949350505050565b604081526000615c9260408301856159f7565b905082151560208301529392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015615ce157615ce1615cb9565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415615d1057615d10615cb9565b5060010190565b600060208284031215615d2957600080fd5b8151612e178161589b565b60408101615d42828561571e565b6001600160a01b039290921660209190910152919050565b60008219821115615d6d57615d6d615cb9565b500190565b600063ffffffff808316818516808303821115615d9157615d91615cb9565b01949350505050565b60008251615dac818460208701615680565b9190910192915050565b600080835481600182811c915080831680615dd257607f831692505b6020808410821415615df257634e487b7160e01b86526022600452602486fd5b818015615e065760018114615e1757615e44565b60ff19861689528489019650615e44565b60008a81526020902060005b86811015615e3c5781548b820152908501908301615e23565b505084890196505b509498975050505050505050565b600181815b80851115615e8d578160001904821115615e7357615e73615cb9565b80851615615e8057918102915b93841c9390800290615e57565b509250929050565b600082615ea45750600161089f565b81615eb15750600061089f565b8160018114615ec75760028114615ed157615eed565b600191505061089f565b60ff841115615ee257615ee2615cb9565b50506001821b61089f565b5060208310610133831016604e8410600b8410161715615f10575081810a61089f565b615f1a8383615e52565b8060001904821115615f2e57615f2e615cb9565b029392505050565b6000612e178383615e95565b600060ff821660ff84168060ff03821115615f5f57615f5f615cb9565b019392505050565b600060ff821660ff841680821015615f8157615f81615cb9565b90039392505050565b828152604060208201526000611dda60408301846156b0565b600060208284031215615fb557600080fd5b505191905056fe63726f7373636861696e20636572742076616c69646174696f6e3a2074797065206f66207369676e65722063657274206d757374206265206263646e7363726f7373636861696e20636572742076616c69646174696f6e3a20696e76616c69642073696763726f7373636861696e20636572742076616c69646174696f6e3a2072657175697265206263646e7320726f6f74206f7220646f6d61696e207370616365206f776e65722063657274206173207369676e657263726f7373636861696e20636572742076616c69646174696f6e3a2077726f6e67207369676e6572a2646970667358221220f7bf38349b14922fb0581f69ee9efe473891cfafbf0d655e56d2d294676ed44a64736f6c634300080b0033"}; public static final String BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", BINARY_ARRAY); - public static final String[] SM_BINARY_ARRAY = {"60806040523480156200001157600080fd5b50604051620082ff380380620082ff83398101604081905262000034916200209e565b6200003f336200005b565b6200004a81620000ab565b620000546200022f565b5062002383565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b6000620000c382620002fc60201b620018891760201c565b9050600081604001516003811115620000e057620000e062002156565b146200013457604051636381e58960e11b815260206004820152601e60248201527f77726f6e67207479706520666f72206263646e7320726f6f742063657274000060448201526064015b60405180910390fd5b60006200016162000150836200056860201b62001a511760201c565b620006bb60201b62001b851760201c565b805190602001209050826001604051806040016040528060048152602001631c9bdbdd60e21b8152506040516200019991906200216c565b90815260200160405180910390209080519060200190620001bc92919062001e75565b5060408051808201825260048152631c9bdbdd60e21b602080830191825260008581526002909152929092209051620001f6929062001e75565b506040518181527f93e430b5dea7948b047f2309fc9ab945d4eea0d469ad3c8f561fdb6b88ff2a1e9060200160405180910390a1505050565b600054600160a81b900460ff16156200029c57604051636381e58960e11b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016200012b565b60005460ff600160a01b90910481161015620002fa576000805460ff60a01b191660ff60a01b17905560405160ff81527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa9060200160405180910390a15b565b6200030662001f04565b6200031062001f04565b60006200032884620007f360201b62001c7c1760201c565b905060005b8160200151518110156200055f576000826020015182815181106200035657620003566200218a565b60200260200101519050600061ffff16816000015161ffff16141562000394576200038c8162000a1f60201b62001e581760201c565b845262000549565b805161ffff1660011415620003c457620003b98162000a1f60201b62001e581760201c565b602085015262000549565b805161ffff16600214156200043857620003e98162000a2660201b62001e5f1760201c565b60ff16600381111562000400576200040062002156565b8460400190600381111562000419576200041962002156565b908160038111156200042f576200042f62002156565b90525062000549565b805161ffff1660031415620004725762000467620004618262000a1f60201b62001e581760201c565b62000a4a565b606085015262000549565b805161ffff1660041415620004ab57620004978162000b6760201b62001e701760201c565b6001600160401b0316608085015262000549565b805161ffff1660051415620004e457620004d08162000b6760201b62001e701760201c565b6001600160401b031660a085015262000549565b805161ffff16600614156200051457620005098162000a1f60201b62001e581760201c565b60c085015262000549565b805161ffff16600714156200054957620005436200053d8262000a1f60201b62001e581760201c565b62000b9a565b60e08501525b50806200055681620021b6565b9150506200032d565b50909392505050565b6200057262001f8a565b6000826040015160038111156200058d576200058d62002156565b1415620005ae5760c0820151620005a49062000d17565b6020015192915050565b600182604001516003811115620005c957620005c962002156565b1415620005ea5760c0820151620005e09062000e24565b6080015192915050565b60028260400151600381111562000605576200060562002156565b1415620006265760c08201516200061c9062001005565b6060015192915050565b60038260400151600381111562000641576200064162002156565b1415620006625760c08201516200065890620011b6565b6040015192915050565b604051636381e58960e11b815260206004820152602660248201527f676574436572744f776e65724f69643a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b60648201526084016200012b565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081620006d55790505090506200074c60006200073b856000015160018111156200072a576200072a62002156565b620012f360201b62001e891760201c565b6200130a60201b62001e9d1760201c565b816000815181106200076257620007626200218a565b602002602001018190525062000789600184602001516200138660201b62001f0a1760201c565b816001815181106200079f576200079f6200218a565b6020026020010181905250620007cc6040518060400160405280600061ffff168152602001606081525090565b818160200181905250620007eb81620013c960201b62001f4d1760201c565b949350505050565b6040805180820190915260008152606060208201526006825110156200085d57604051636381e58960e11b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e67746800000000000000000060448201526064016200012b565b6040805180820190915260008082526060602083015290620008a06200088f85846200154860201b620020521760201c565b6200157360201b6200207a1760201c565b61ffff168152620008b3600683620021d4565b91506000825b85518110156200093157620008fb620008ea87620008d9846002620021d4565b6200161b60201b6200211b1760201c565b6200164860201b620021451760201c565b62000908906006620021ef565b6200091a9063ffffffff1682620021d4565b9050816200092881620021b6565b925050620008b9565b6000826001600160401b038111156200094e576200094e62002055565b6040519080825280602002602001820160405280156200099d57816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816200096d5790505b509050600092505b865185101562000a105760408051606080820183526000808352602083015291810191909152620009d788876200174f565b96509050808285620009e981620021b6565b965081518110620009fe57620009fe6200218a565b602002602001018190525050620009a5565b60208401525090949350505050565b6040015190565b600062000a4460018360400151620018db60201b6200223f1760201c565b92915050565b62000a5462001f8a565b62000a5e62001f8a565b600062000a7684620007f360201b62001c7c1760201c565b905060005b8160200151518110156200055f5760008260200151828151811062000aa45762000aa46200218a565b60200260200101519050600061ffff16816000015161ffff16141562000b265762000ada8162000a2660201b62001e5f1760201c565b60ff16600181111562000af15762000af162002156565b8490600181111562000b075762000b0762002156565b9081600181111562000b1d5762000b1d62002156565b90525062000b51565b805161ffff166001141562000b515762000b4b8162000a1f60201b62001e581760201c565b60208501525b508062000b5e81620021b6565b91505062000a7b565b600062000a4462000b8960088460400151620018db60201b6200223f1760201c565b620018e060201b620022441760201c565b62000bc66040518060800160405280606081526020016060815260200160608152602001606081525090565b62000bf26040518060800160405280606081526020016060815260200160608152602001606081525090565b600062000c0a84620007f360201b62001c7c1760201c565b905060005b8160200151518110156200055f5760008260200151828151811062000c385762000c386200218a565b60200260200101519050600061ffff16816000015161ffff16141562000c765762000c6e8162000a1f60201b62001e581760201c565b845262000d01565b805161ffff166001141562000ca65762000c9b8162000a1f60201b62001e581760201c565b602085015262000d01565b805161ffff166002141562000cd65762000ccb8162000a1f60201b62001e581760201c565b604085015262000d01565b805161ffff166003141562000d015762000cfb8162000a1f60201b62001e581760201c565b60608501525b508062000d0e81620021b6565b91505062000c0f565b62000d2162001fa5565b62000d2b62001fa5565b600062000d4384620007f360201b62001c7c1760201c565b905060005b8160200151518110156200055f5760008260200151828151811062000d715762000d716200218a565b60200260200101519050600061ffff16816000015161ffff16141562000daf5762000da78162000a1f60201b62001e581760201c565b845262000e0e565b805161ffff166001141562000de35762000dd8620004618262000a1f60201b62001e581760201c565b602085015262000e0e565b805161ffff166002141562000e0e5762000e088162000a1f60201b62001e581760201c565b60408501525b508062000e1b81620021b6565b91505062000d48565b62000e2e62001fc1565b62000e3862001fc1565b600062000e5084620007f360201b62001c7c1760201c565b905060005b8160200151518110156200055f5760008260200151828151811062000e7e5762000e7e6200218a565b60200260200101519050600061ffff16816000015161ffff16141562000ebc5762000eb48162000a1f60201b62001e581760201c565b845262000fef565b805161ffff166001141562000f305762000ee18162000a2660201b62001e5f1760201c565b60ff16600181111562000ef85762000ef862002156565b8460200190600181111562000f115762000f1162002156565b9081600181111562000f275762000f2762002156565b90525062000fef565b805161ffff166002141562000f605762000f558162000a1f60201b62001e581760201c565b604085015262000fef565b805161ffff166003141562000f905762000f858162000a1f60201b62001e581760201c565b606085015262000fef565b805161ffff166004141562000fc45762000fb9620004618262000a1f60201b62001e581760201c565b608085015262000fef565b805161ffff166005141562000fef5762000fe98162000a1f60201b62001e581760201c565b60a08501525b508062000ffc81620021b6565b915050","62000e55565b6200100f62001ff3565b6200101962001ff3565b60006200103184620007f360201b62001c7c1760201c565b905060005b8160200151518110156200055f576000826020015182815181106200105f576200105f6200218a565b60200260200101519050600061ffff16816000015161ffff1614156200109d57620010958162000a1f60201b62001e581760201c565b8452620011a0565b805161ffff1660011415620010cd57620010c28162000a1f60201b62001e581760201c565b6020850152620011a0565b805161ffff16600214156200114157620010f28162000a2660201b62001e5f1760201c565b60ff16600281111562001109576200110962002156565b8460400190600281111562001122576200112262002156565b9081600281111562001138576200113862002156565b905250620011a0565b805161ffff166003141562001175576200116a620004618262000a1f60201b62001e581760201c565b6060850152620011a0565b805161ffff1660041415620011a0576200119a8162000a1f60201b62001e581760201c565b60808501525b5080620011ad81620021b6565b91505062001036565b620011c06200201b565b620011ca6200201b565b6000620011e284620007f360201b62001c7c1760201c565b905060005b8160200151518110156200055f576000826020015182815181106200121057620012106200218a565b60200260200101519050600061ffff16816000015161ffff1614156200124e57620012468162000a1f60201b62001e581760201c565b8452620012dd565b805161ffff16600114156200127e57620012738162000a1f60201b62001e581760201c565b6020850152620012dd565b805161ffff1660031415620012b257620012a7620004618262000a1f60201b62001e581760201c565b6040850152620012dd565b805161ffff1660041415620012dd57620012d78162000a1f60201b62001e581760201c565b60608501525b5080620012ea81620021b6565b915050620011e7565b600081600181111562000a445762000a4462002156565b604080516060808201835260008083526020830181905282840191909152825160018082528185019094529192909190602082018180368337019050509050620013626001848362001ab760201b620024021760201c565b6040805160608101825261ffff959095168552600160208601528401525090919050565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b60606000620013e38362001ac860201b620024131760201c565b90506000620013f4826006620021ef565b63ffffffff166001600160401b0381111562001414576200141462002055565b6040519080825280601f01601f1916602001820160405280156200143f576020820181803683370190505b5090506200147460026200146286600001516200157360201b6200207a1760201c565b8362001b5760201b620024871760201c565b620014a2600662001490846200164860201b620021451760201c565b8362001b6860201b620024981760201c565b600660005b620014bd8662001b7960201b620024a91760201c565b8110156200153e576000620014fd87602001518381518110620014e457620014e46200218a565b602002602001015162001b8160201b620024b11760201c565b90506200151783828662001c4360201b620025401760201c565b8051620015259084620021d4565b92505080806200153590620021b6565b915050620014a7565b5090949350505050565b81516000906200155a836002620021d4565b11156200156657600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b81600081518110620015b957620015b96200218a565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600181518110620015ed57620015ed6200218a565b60200101906001600160f81b031916908160001a905350600062001612828262001548565b95945050505050565b81516000906200162d836004620021d4565b11156200163957600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b816000815181106200168e576200168e6200218a565b60200101906001600160f81b031916908160001a9053508160021a60f81b81600181518110620016c257620016c26200218a565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600281518110620016f657620016f66200218a565b60200101906001600160f81b031916908160001a9053508160001a60f81b816003815181106200172a576200172a6200218a565b60200101906001600160f81b031916908160001a90535060006200161282826200161b565b60408051606080820183526000808352602083015291810191909152600082845111620017cc57604051636381e58960e11b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b60648201526084016200012b565b60068310156200181157604051636381e58960e11b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b60448201526064016200012b565b60408051606080820183526000808352602083015291810191909152620018486200088f86866200154860201b620020521760201c565b61ffff1681526200185b600285620021d4565b935062001878620008ea86866200161b60201b6200211b1760201c565b63ffffffff16602082015262001890600485620021d4565b9350620018b48585836020015163ffffffff1662001d3160201b620026251760201c565b60408201526020810151620018d09063ffffffff1685620021d4565b909590945092505050565b015190565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b816000815181106200192657620019266200218a565b60200101906001600160f81b031916908160001a9053508160061a60f81b816001815181106200195a576200195a6200218a565b60200101906001600160f81b031916908160001a9053508160051a60f81b816002815181106200198e576200198e6200218a565b60200101906001600160f81b031916908160001a9053508160041a60f81b81600381518110620019c257620019c26200218a565b60200101906001600160f81b031916908160001a9053508160031a60f81b81600481518110620019f657620019f66200218a565b60200101906001600160f81b031916908160001a9053508160021a60f81b8160058151811062001a2a5762001a2a6200218a565b60200101906001600160f81b031916908160001a9053508160011a60f81b8160068151811062001a5e5762001a5e6200218a565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160078151811062001a925762001a926200218a565b60200101906001600160f81b031916908160001a905350600062001612828262001dbb565b909101600019810180519290915252565b600080805b62001ae38462001b7960201b620024a91760201c565b81101562001b505760008460200151828151811062001b065762001b066200218a565b6020026020010151905080604001515183600662001b259190620021ef565b63ffffffff1662001b379190620021d4565b925050808062001b4790620021b6565b91505062001acd565b5092915050565b909101600119810180519290915252565b909101600319810180519290915252565b602001515190565b606060008260200151600662001b989190620021ef565b63ffffffff166001600160401b0381111562001bb85762001bb862002055565b6040519080825280601f01601f19166020018201604052801562001be3576020820181803683370190505b50905062001c0660026200146285600001516200157360201b6200207a1760201c565b62001c2660066200149085602001516200164860201b620021451760201c565b62000a44600684604001518362001c4360201b620025401760201c565b8151815162001c5963ffffffff831686620021d4565b111562001cdb57604051636381e58960e11b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a4016200012b565b8015801562001cea5762001d2a565b8483018051601f84168015602002818801018581018215602002838601015b8183101562001d2357825181526020928301920162001d09565b5050509152505b5050505050565b825160609062001d428385620021d4565b111562001d4e57600080fd5b6000826001600160401b0381111562001d6b5762001d6b62002055565b6040519080825280601f01601f19166020018201604052801562001d96576020820181803683370190505b5090506020808201908686010162001db082828762001deb565b509095945050505050565b815160009062001dcd836008620021d4565b111562001dd957600080fd5b5001600801516001600160401b031690565b6020811062001e2b578151835262001e05602084620021d4565b925062001e14602083620021d4565b915062001e236020826200221a565b905062001deb565b8062001e3657505050565b6000600162001e478360206200221a565b62001e559061010062002331565b62001e6191906200221a565b925184518416931916929092179092525050565b82805462001e839062002346565b90600052602060002090601f01602090048101928262001ea7576000855562001ef2565b82601f1062001ec257805160ff191683800117855562001ef2565b8280016001018555821562001ef2579182015b8281111562001ef257825182559160200191906001019062001ed5565b5062001f009291506200203e565b5090565b6040805161010081018252606080825260208201529081016000815260200162001f2d62001f8a565b815260200160006001600160401b0316815260200160006001600160401b031681526020016060815260200162001f856040518060800160405280606081526020016060815260200160608152602001606081525090565b905290565b604080518082019091528060005b8152602001606081525090565b60405180606001604052806060815260200162001f9862001f8a565b6040805160c08101909152606081526020810160008152602001606081526020016060815260200162001f9862001f8a565b6040805160a0810182526060","80825260208201529081016000815260200162001f9862001f8a565b6040518060800160405280606081526020016060815260200162001f9862001f8a565b5b8082111562001f0057600081556001016200203f565b63b95aa35560e01b600052604160045260246000fd5b60005b83811015620020885781810151838201526020016200206e565b8381111562002098576000848401525b50505050565b600060208284031215620020b157600080fd5b81516001600160401b0380821115620020c957600080fd5b818401915084601f830112620020de57600080fd5b815181811115620020f357620020f362002055565b604051601f8201601f19908116603f011681019083821181831017156200211e576200211e62002055565b816040528281528760208487010111156200213857600080fd5b6200214b8360208301602088016200206b565b979650505050505050565b63b95aa35560e01b600052602160045260246000fd5b60008251620021808184602087016200206b565b9190910192915050565b63b95aa35560e01b600052603260045260246000fd5b63b95aa35560e01b600052601160045260246000fd5b6000600019821415620021cd57620021cd620021a0565b5060010190565b60008219821115620021ea57620021ea620021a0565b500190565b600063ffffffff808316818516808303821115620022115762002211620021a0565b01949350505050565b6000828210156200222f576200222f620021a0565b500390565b600181815b8085111562002275578160001904821115620022595762002259620021a0565b808516156200226757918102915b93841c939080029062002239565b509250929050565b6000826200228e5750600162000a44565b816200229d5750600062000a44565b8160018114620022b65760028114620022c157620022e1565b600191505062000a44565b60ff841115620022d557620022d5620021a0565b50506001821b62000a44565b5060208310610133831016604e8410600b841016171562002306575081810a62000a44565b62002312838362002234565b8060001904821115620023295762002329620021a0565b029392505050565b60006200233f83836200227d565b9392505050565b600181811c908216806200235b57607f821691505b602082108114156200237d5763b95aa35560e01b600052602260045260246000fd5b50919050565b615f6c80620023936000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063a5cc4ca0116100c3578063cdb504551161007c578063cdb5045514610302578063d7720a8d14610315578063d86e29e214610328578063da5052da14610330578063ec449a9614610343578063f63da9e51461035657600080fd5b8063a5cc4ca014610290578063b386cc56146102a3578063b4b5f0c6146102b6578063ba057553146102c9578063c069ac27146102dc578063c3482f37146102ef57600080fd5b80635089e2c8116101155780635089e2c8146102035780636040d0a014610214578063674dbe1014610229578063719c6be81461025757806386dc270d1461026a57806387218e821461027d57600080fd5b8063091fed3d1461015257806316cad12a1461017a5780631cc42afb1461018f5780631cce0a86146101af5780634fe09e43146101f0575b600080fd5b6101656101603660046154ea565b610376565b60405190151581526020015b60405180910390f35b61018d61018836600461552b565b6103bd565b005b6101a261019d366004615554565b61043c565b604051610171919061560f565b6101d86101bd36600461562f565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610171565b61018d6101fe3660046156d7565b610514565b6000546001600160a01b03166101d8565b61021c61064d565b6040516101719190615749565b610249610237366004615794565b60046020526000908152604090205481565b604051908152602001610171565b61018d6102653660046154ea565b6106d5565b6101a26102783660046154ea565b61091a565b61018d61028b36600461552b565b6109f5565b6101a261029e366004615794565b610be1565b6101a26102b13660046156d7565b610c7b565b61018d6102c43660046154ea565b610c9f565b6101a26102d73660046154ea565b611002565b6101a26102ea3660046157ad565b6110c2565b61018d6102fd3660046154ea565b61110d565b610165610310366004615554565b611499565b61018d61032336600461562f565b6114f7565b61018d611757565b6101a261033e366004615794565b61176b565b6101656103513660046157ad565b611809565b610369610364366004615794565b611855565b60405161017191906157f8565b60008060036000858560405161038d929190615806565b6040518091039020815260200190815260200160002060000180546103b190615816565b90501190505b92915050565b6103c56126a6565b6001600160a01b03811661043057604051636381e58960e11b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61043981612701565b50565b6060600460008585604051610452929190615806565b6040518091039020815260200190815260200160002060010160008363ffffffff168152602001908152602001600020805461048d90615816565b80601f01602080910402602001604051908101604052809291908181526020018280546104b990615816565b80156105065780601f106104db57610100808354040283529160200191610506565b820191906000526020600020905b8154815290600101906020018083116104e957829003601f168201915b505050505090509392505050565b600054600160a81b900460ff161580801561053c57506000546001600160a01b90910460ff16105b8061055d5750303b15801561055d5750600054600160a01b900460ff166001145b6105c157604051636381e58960e11b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610427565b6000805460ff60a01b1916600160a01b17905580156105ee576000805460ff60a81b1916600160a81b1790555b6105f782612751565b61060033612701565b8015610649576000805460ff60a81b19169055604051600181527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa906020015b60405180910390a15b5050565b606060068054806020026020016040519081016040528092919081815260200182805480156106cb57602002820191906000526020600020906000905b82829054906101000a900460ff1660028111156106a9576106a961571f565b81526020600192830181810494850194909303909202910180841161068a5790505b5050505050905090565b6106dd6126a6565b600061071e83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289f92505050565b9050610729816129e0565b600061073482612c07565b6000818152600360205260408120805492935091829061075390615816565b9050111561083c57610766818686615154565b505b60608301516020810151519051101561083757600061078a8460600151612c27565b600081815260018401602052604090208054919250906107a990615816565b15159050610822576107be8460600151612c3a565b6000828152600184016020908152604090912082516107e393919291909101906151d8565b5060408051848152602081018390527f54be05179495d79308b555ea9a902ba1e042e9c9454989365920b7ebe13bd3f6910160405180910390a1610831565b61082f8460600151612c3a565b505b50610768565b610913565b610847818686615154565b505b6060830151602081015151905110156108df57600061086b8460600151612c27565b905061087a8460600151612c3a565b60008281526001840160209081526040909120825161089f93919291909101906151d8565b5060408051848152602081018390527f54be05179495d79308b555ea9a902ba1e042e9c9454989365920b7ebe13bd3f6910160405180910390a150610849565b6040518281527f3e0d464c0b26534b34562cc94eef50ef9280129ddcafee0815694b2981a9317e9060200160405180910390a15b5050505050565b60606000600460008585604051610932929190615806565b60405180910390208152602001908152602001600020905080600101600082600001548152602001908152602001600020805461096e90615816565b80601f016020809104026020016040519081016040528092919081815260200182805461099a90615816565b80156109e75780601f106109bc576101008083540402835291602001916109e7565b820191906000526020600020905b8154815290600101906020018083116109ca57829003601f168201915b505050505091505092915050565b6109fd6126a6565b6000816001600160a01b0316631272ad586040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610a3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a639190615851565b90506000600581836002811115610a7c57610a7c61571f565b6002811115610a8d57610a8d61571f565b81526020810191909152604001600020546001600160a01b031614610af557604051636381e58960e11b815260206004820152601b60248201527f70746320766572696669657220616c72656164792065786973747300000000006044820152606401610427565b600680546001810182556000919091527fa26d67b36928e909a2a4db51de73963e974ca036ae1fd765867a117ed4543616602082040180548392601f166101000a60ff81021990911690836002811115610b5157610b5161571f565b02179055508160056000836002811115610b6d57610b6d61571f565b6002811115610b7e57610b7e61571f565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507fcec9da05ac4bb94bd17cf7f73b1cf870b87e983fafc5f53a58e79aa8ba311d8b818360405161064092919061586e565b60026020526000908152604090208054610bfa90615816565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2690615816565b8015610c735780601f10610c4857610100808354040283529160200191610c73565b820191906000526020600020905b815481529060010190602001808311610c5657829003","601f168201915b505050505081565b805160208183018101805160018252928201919093012091528054610bfa90615816565b6000610ce083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612ce192505050565b90506000610cf18260200151612de0565b805160208083019190912060009081526004825260408082208682015163ffffffff16835260010190925290812080549293509091610d2f90615816565b905011610d7357604051636381e58960e11b815260206004820152601160248201527009dd1c189d1849c81b9bdd08199bdd5b99607a1b6044820152606401610427565b6000610d8982846040015163ffffffff16613070565b9050610d9c816060015160600151613135565b610de357604051636381e58960e11b81526020600482015260176024820152761b9bc81c1d18c81d1c9d5cdd081c9bdbdd08199bdd5b99604a1b6044820152606401610427565b6000610df6826060015160600151613172565b90506000610e078360400151613230565b9050610e1b836060015160600151826132ed565b610e6857604051636381e58960e11b815260206004820152601a60248201527f6e6f207074632076657269667920616e63686f7220666f756e640000000000006044820152606401610427565b600060056000610e7f856020015160c00151613331565b604001516002811115610e9457610e9461571f565b6002811115610ea557610ea561571f565b81526020810191909152604001600020546001600160a01b0316905080610f0457604051636381e58960e11b81526020600482015260126024820152711b9bc81c1d18c81d995a599a595c881cd95d60721b6044820152606401610427565b604051635158256d60e11b81526000906001600160a01b0383169063a2b04ada90610f359088908b90600401615a67565b6020604051808303816000875af1158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f789190615aee565b90507f65f171de652251c9e9201eea4542f70c250bb2d3feb9b3154f0da78b86245cd9856080015182604051610faf929190615b10565b60405180910390a180610ff757604051636381e58960e11b815260206004820152600f60248201526e766572696679206e6f74207061737360881b6044820152606401610427565b505050505050505050565b6060600360008484604051611018929190615806565b60405180910390208152602001908152602001600020600001805461103c90615816565b80601f016020809104026020016040519081016040528092919081815260200182805461106890615816565b80156110b55780601f1061108a576101008083540402835291602001916110b5565b820191906000526020600020905b81548152906001019060200180831161109857829003601f168201915b5050505050905092915050565b60606003600085856040516110d8929190615806565b604051809103902081526020019081526020016000206001016000838152602001908152602001600020805461048d90615816565b6111156126a6565b600061115683838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061346c92505050565b9050611169816060015160600151613135565b6111b057604051636381e58960e11b81526020600482015260176024820152761b9bc81c1d18c81d1c9d5cdd081c9bdbdd08199bdd5b99604a1b6044820152606401610427565b60006111c3826060015160600151613172565b905060006111d48360400151613230565b90506111e8836060015160600151826132ed565b61123557604051636381e58960e11b815260206004820152601a60248201527f6e6f207074632076657269667920616e63686f7220666f756e640000000000006044820152606401610427565b60006005600061124c856020015160c00151613331565b6040015160028111156112615761126161571f565b60028111156112725761127261571f565b81526020810191909152604001600020546001600160a01b03169050806112d157604051636381e58960e11b81526020600482015260126024820152711b9bc81c1d18c81d995a599a595c881cd95d60721b6044820152606401610427565b806001600160a01b031663e0b011b86112f286606001516060015185613609565b866040518363ffffffff1660e01b8152600401611310929190615b34565b6020604051808303816000875af115801561132f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113539190615aee565b61139957604051636381e58960e11b81526020600482015260166024820152756661696c656420746f2076657269667920747062746160501b6044820152606401610427565b60006113a88560800151612de0565b80516020918201206000818152600483526040902091870151825491935063ffffffff16111561141b5760208681015163ffffffff1680835560408051858152928301919091527fcfec0a46c6e624ac6f78c0c3ac81bb6c3acafaaa42ab41247bdbb1f2f8926acb910160405180910390a15b60208087015163ffffffff1660009081526001830190915260409020611442908989615154565b507fe7da5c48d6b9115684cdf93d22bc820fde23884efcab14ae8ca820a51d858b5882876020015160405161148792919091825263ffffffff16602082015260400190565b60405180910390a15050505050505050565b6000806004600086866040516114b0929190615806565b6040518091039020815260200190815260200160002060010160008463ffffffff16815260200190815260200160002080546114eb90615816565b90501190509392505050565b6114ff6126a6565b60006005818360028111156115165761151661571f565b60028111156115275761152761571f565b81526020810191909152604001600020546001600160a01b0316141561159057604051636381e58960e11b815260206004820152601760248201527f707463207665726966696572206e6f74206578697374730000000000000000006044820152606401610427565b60015b6006548110156116d6578160028111156115af576115af61571f565b600682815481106115c2576115c2615b81565b90600052602060002090602091828204019190069054906101000a900460ff1660028111156115f3576115f361571f565b14156116c4576006805461160990600190615bad565b8154811061161957611619615b81565b90600052602060002090602091828204019190069054906101000a900460ff166006828154811061164c5761164c615b81565b90600052602060002090602091828204019190066101000a81548160ff0219169083600281111561167f5761167f61571f565b0217905550600680548061169557611695615bc4565b60019003818190600052602060002090602091828204019190066101000a81549060ff021916905590556116d6565b806116ce81615bda565b915050611593565b50600560008260028111156116ed576116ed61571f565b60028111156116fe576116fe61571f565b81526020810191909152604090810160002080546001600160a01b0319169055517f57edd695794597830277338ba9cfc1b6b1781173f9a193504e19bd79f8d5a97a9061174c9083906157f8565b60405180910390a150565b61175f6126a6565b6117696000612701565b565b60036020526000908152604090208054819061178690615816565b80601f01602080910402602001604051908101604052809291908181526020018280546117b290615816565b80156117ff5780601f106117d4576101008083540402835291602001916117ff565b820191906000526020600020905b8154815290600101906020018083116117e257829003601f168201915b5050505050905081565b600080600360008686604051611820929190615806565b60405180910390208152602001908152602001600020600101600084815260200190815260200160002080546114eb90615816565b6006818154811061186557600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b61189161524c565b61189961524c565b60006118a484611c7c565b905060005b816020015151811015611a48576000826020015182815181106118ce576118ce615b81565b60200260200101519050600061ffff16816000015161ffff1614156118f95760408101518452611a35565b805161ffff16600114156119165760408101516020850152611a35565b805161ffff16600214156119725761192d81611e5f565b60ff1660038111156119415761194161571f565b846040019060038111156119575761195761571f565b9081600381111561196a5761196a61571f565b905250611a35565b805161ffff166003141561199d5761199361198e826040015190565b6136e4565b6060850152611a35565b805161ffff16600414156119c7576119b481611e70565b6001600160401b03166080850152611a35565b805161ffff16600514156119f1576119de81611e70565b6001600160401b031660a0850152611a35565b805161ffff1660061415611a0e57604081015160c0850152611a35565b805161ffff1660071415611a3557611a2f611a2a826040015190565b6137bf565b60e08501525b5080611a4081615bda565b9150506118a9565b50909392505050565b611a596152cf565b600082604001516003811115611a7157611a7161571f565b1415611a8e57611a848260c001516138db565b6020015192915050565b600182604001516003811115611aa657611aa661571f565b1415611ac357611ab98260c0015161399d565b6080015192915050565b600282604001516003811115611adb57611adb61571f565b1415611af857611aee8260c00151613331565b6060015192915050565b600382604001516003811115611b1057611b1061571f565b1415611b2d57611b238260c00151613af5565b6040015192915050565b604051636381e58960e11b815260206004820152602660248201527f676574436572744f776e65724f69643a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b6064820152608401610427565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611b9f579050509050611bf86000611bf385600001516001811115611bee57611bee61571f565b611e89565b611e9d565b81600081518110611c0b57611c0b615b81565b6020026020010181905250611c2560018460200151611f0a565b81600181518110611c3857611c38615b81565b6020026020010181905250611c646040518060400160405280600061ffff168152602001606081525090565b6020810182905261","1c7481611f4d565b949350505050565b604080518082019091526000815260606020820152600682511015611ce457604051636381e58960e11b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e6774680000000000000000006044820152606401610427565b6040805180820190915260008082526060602083015290611d0d611d088584612052565b61207a565b61ffff168152611d1e600683615bf5565b91506000825b8551811015611d7857611d49611d4487611d3f846002615bf5565b61211b565b612145565b611d54906006615c0d565b611d649063ffffffff1682615bf5565b905081611d7081615bda565b925050611d24565b6000826001600160401b03811115611d9257611d9261564c565b604051908082528060200260200182016040528015611ddf57816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611db05790505b509050600092505b8651851015611e495760408051606080820183526000808352602083015291810191909152611e168887613bd4565b96509050808285611e2681615bda565b965081518110611e3857611e38615b81565b602002602001018190525050611de7565b60208401525090949350505050565b6040015190565b60006103b760018360400151015190565b60006103b7611e8460088460400151015190565b612244565b60008160018111156103b7576103b761571f565b60408051606080820183526000808352602083015291810191909152604080516001808252818301909252600091602082018180368337019050509050611ee660018483612402565b6040805160608101825261ffff959095168552600160208601528401525090919050565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b60606000611f5a83612413565b90506000611f69826006615c0d565b63ffffffff166001600160401b03811115611f8657611f8661564c565b6040519080825280601f01601f191660200182016040528015611fb0576020820181803683370190505b509050611fcb6002611fc5866000015161207a565b83612487565b611fdf6006611fd984612145565b83612498565b600660005b6020860151518110156120485760006120198760200151838151811061200c5761200c615b81565b60200260200101516124b1565b9050612026838286612540565b80516120329084615bf5565b925050808061204090615bda565b915050611fe4565b5090949350505050565b8151600090612062836002615bf5565b111561206d57600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b816000815181106120bd576120bd615b81565b60200101906001600160f81b031916908160001a9053508160001a60f81b816001815181106120ee576120ee615b81565b60200101906001600160f81b031916908160001a9053506000612112826000612052565b95945050505050565b815160009061212b836004615bf5565b111561213657600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b8160008151811061218857612188615b81565b60200101906001600160f81b031916908160001a9053508160021a60f81b816001815181106121b9576121b9615b81565b60200101906001600160f81b031916908160001a9053508160011a60f81b816002815181106121ea576121ea615b81565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160038151811061221b5761221b615b81565b60200101906001600160f81b031916908160001a905350600061211282600061211b565b015190565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b8160008151811061228757612287615b81565b60200101906001600160f81b031916908160001a9053508160061a60f81b816001815181106122b8576122b8615b81565b60200101906001600160f81b031916908160001a9053508160051a60f81b816002815181106122e9576122e9615b81565b60200101906001600160f81b031916908160001a9053508160041a60f81b8160038151811061231a5761231a615b81565b60200101906001600160f81b031916908160001a9053508160031a60f81b8160048151811061234b5761234b615b81565b60200101906001600160f81b031916908160001a9053508160021a60f81b8160058151811061237c5761237c615b81565b60200101906001600160f81b031916908160001a9053508160011a60f81b816006815181106123ad576123ad615b81565b60200101906001600160f81b031916908160001a9053508160001a60f81b816007815181106123de576123de615b81565b60200101906001600160f81b031916908160001a9053506000612112826000613d31565b909101600019810180519290915252565b600080805b6020840151518110156124805760008460200151828151811061243d5761243d615b81565b6020026020010151905080604001515183600661245a9190615c0d565b63ffffffff1661246a9190615bf5565b925050808061247890615bda565b915050612418565b5092915050565b909101600119810180519290915252565b909101600319810180519290915252565b602001515190565b60606000826020015160066124c69190615c0d565b63ffffffff166001600160401b038111156124e3576124e361564c565b6040519080825280601f01601f19166020018201604052801561250d576020820181803683370190505b5090506125226002611fc5856000015161207a565b6125346006611fd98560200151612145565b6103b760068460400151835b8151815161255463ffffffff831686615bf5565b11156125d457604051636381e58960e11b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a401610427565b801580156125e157610913565b8483018051601f84168015602002818801018581018215602002838601015b81831015612618578251815260209283019201612600565b5050509152505050505050565b82516060906126348385615bf5565b111561263f57600080fd5b6000826001600160401b038111156126595761265961564c565b6040519080825280601f01601f191660200182016040528015612683576020820181803683370190505b5090506020808201908686010161269b828287613d5e565b509095945050505050565b6000546001600160a01b0316331461176957604051636381e58960e11b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610427565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b600061275c82611889565b90506000816040015160038111156127765761277661571f565b146127c457604051636381e58960e11b815260206004820152601e60248201527f77726f6e67207479706520666f72206263646e7320726f6f74206365727400006044820152606401610427565b60006127d76127d283611a51565b611b85565b805190602001209050826001604051806040016040528060048152602001631c9bdbdd60e21b81525060405161280d9190615c35565b9081526020016040518091039020908051906020019061282e9291906151d8565b5060408051808201825260048152631c9bdbdd60e21b60208083019182526000858152600290915292909220905161286692906151d8565b506040518181527f93e430b5dea7948b047f2309fc9ab945d4eea0d469ad3c8f561fdb6b88ff2a1e9060200160405180910390a1505050565b6128a76152ea565b6128af6152ea565b60006128ba84611c7c565b905060005b816020015151811015611a48576000826020015182815181106128e4576128e4615b81565b60200260200101519050600061ffff16816000015161ffff16141561290f57604081015184526129cd565b805161ffff166001141561293a5761293061292b826040015190565b611889565b60208501526129cd565b805161ffff166002141561295757604081015160408501526129cd565b805161ffff1660031415612997576040805180820182526000808252606060209283015282518084018452908152918301519082015260608501526129cd565b805161ffff16600414156129b457604081015160808501526129cd565b805161ffff16600514156129cd57604081015160a08501525b50806129d881615bda565b9150506128bf565b60006129f3826020015160600151611b85565b80516020918201206000818152600290925260408220805491935090612a1890615816565b905011612a5b57604051636381e58960e11b815260206004820152601060248201526f1a5cdcdd595c881b9bdd08199bdd5b9960821b6044820152606401610427565b6000818152600260205260408082209051612b1991600191612a7d9190615c51565b90815260200160405180910390208054612a9690615816565b80601f0160208091040260200160405190810160405280929190818152602001828054612ac290615816565b8015612b0f5780601f10612ae457610100808354040283529160200191612b0f565b820191906000526020600020905b815481529060010190602001808311612af257829003601f168201915b5050505050611889565b9050612b64604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b8152508260e0015160400151613dd990919063ffffffff16565b15612bac57600080612b83838660200151613def90919063ffffffff16565b91509150818190612ba857604051636381e58960e11b8152600401610427919061560f565b5050505b612bb583613f83565b612c0257604051636381e58960e11b815260206004820152601a60248201527f70746320747275737420726f6f742073696720696e76616c69640000000000006044820152606401610427565b505050565b6000612c196127d28360200151611a51565b805190602001209050919050565b60006103b7612c3583612c3a565b613230565b6060816020015151826000015110612ca957604051636381e58960e11b815260206004820152602b60248201527f544c5649","74656d4d617056616c756553747265616d3a206f6666657374206f7560448201526a3a1037b310313ab33332b960a91b6064820152608401610427565b6000612cbd83600001518460200151613fad565b8051845191925090612cd0906004615bf5565b612cda9190615bf5565b9092525090565b612ce9615341565b612cf1615341565b6000612cfc84611c7c565b905060005b816020015151811015611a4857600082602001518281518110612d2657612d26615b81565b60200260200101519050600561ffff16816000015161ffff161415612d5f57612d58612d53826040015190565b614041565b8452612dcd565b805161ffff166101011415612d8b57612d81612d7c826040015190565b6140ce565b6020850152612dcd565b805161ffff166101001415612db357612da3816141c1565b63ffffffff166040850152612dcd565b805161ffff166101ff1415612dcd57604081015160608501525b5080612dd881615bda565b915050612d01565b60208101516060908190158015612df957506040830151155b15612e7e5760408051600180825281830190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612e13579050509050612e5b6000612e5685600001516141d5565b611f0a565b81600081518110612e6e57612e6e615b81565b6020026020010181905250613056565b602083015115801590612e945750604083015115155b1561300d576040805160038082526080820190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612eaf579050509050612ef26000612e5685600001516141d5565b81600081518110612f0557612f05615b81565b6020026020010181905250600060206001600160401b03811115612f2b57612f2b61564c565b6040519080825280601f01601f191660200182016040528015612f55576020820181803683370190505b50602085810151908201529050612f6d600182611f0a565b82600181518110612f8057612f80615b81565b6020026020010181905250600060206001600160401b03811115612fa657612fa661564c565b6040519080825280601f01601f191660200182016040528015612fd0576020820181803683370190505b50604086015160208201529050612fe8600282611f0a565b83600281518110612ffb57612ffb615b81565b60200260200101819052505050613056565b604051636381e58960e11b815260206004820152601760248201527f696e76616c69642063726f7373636861696e206c616e650000000000000000006044820152606401610427565b604080518082019091526000815260606020820152611c64565b613078615377565b8251602080850191909120600090815260048252604080822085835260010190925220805461312e91906130ab90615816565b80601f01602080910402602001604051908101604052809291908181526020018280546130d790615816565b80156131245780601f106130f957610100808354040283529160200191613124565b820191906000526020600020905b81548152906001019060200180831161310757829003601f168201915b505050505061346c565b9392505050565b6000806003600061314585611b85565b805190602001208152602001908152602001600020600001805461316890615816565b9050119050919050565b61317a6152ea565b6103b76003600061318a85611b85565b80519060200120815260200190815260200160002060000180546131ad90615816565b80601f01602080910402602001604051908101604052809291908181526020018280546131d990615816565b80156132265780601f106131fb57610100808354040283529160200191613226565b820191906000526020600020905b81548152906001019060200180831161320957829003601f168201915b505050505061289f565b8051600090602081111561329357604051636381e58960e11b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b6064820152608401610427565b6000816001600160401b038111156132ad576132ad61564c565b6040519080825280601f01601f1916602001820160405280156132d7576020820181803683370190505b5084518152938201519190930151900392915050565b600080600360006132fd86611b85565b805190602001208152602001908152602001600020600101600084815260200190815260200160002080546103b190615816565b6133396153d4565b6133416153d4565b600061334c84611c7c565b905060005b816020015151811015611a485760008260200151828151811061337657613376615b81565b60200260200101519050600061ffff16816000015161ffff1614156133a15760408101518452613459565b805161ffff16600114156133be5760408101516020850152613459565b805161ffff166002141561341a576133d581611e5f565b60ff1660028111156133e9576133e961571f565b846040019060028111156133ff576133ff61571f565b908160028111156134125761341261571f565b905250613459565b805161ffff16600314156134405761343661198e826040015190565b6060850152613459565b805161ffff166004141561345957604081015160808501525b508061346481615bda565b915050613351565b613474615377565b61347c615377565b600061348784611c7c565b905060005b816020015151811015611a48576000826020015182815181106134b1576134b1615b81565b60200260200101519050600061ffff16816000015161ffff1614156134e6576134d9816141c1565b63ffffffff1684526135f6565b805161ffff166001141561350d576134fd816141c1565b63ffffffff1660208501526135f6565b805161ffff166002141561352a57604081015160408501526135f6565b805161ffff16600314156135555761354b613546826040015190565b613331565b60608501526135f6565b805161ffff166004141561357b57613571612d7c826040015190565b60808501526135f6565b805161ffff16600514156135a257613592816141c1565b63ffffffff1660a08501526135f6565b805161ffff16600614156135bf57604081015160c08501526135f6565b805161ffff16600714156135dc57604081015160e08501526135f6565b805161ffff1660ff14156135f65760408101516101008501525b508061360181615bda565b91505061348c565b604080518082019091526060808252602082015261312e6003600061362d86611b85565b8051906020012081526020019081526020016000206001016000848152602001908152602001600020805461366190615816565b80601f016020809104026020016040519081016040528092919081815260200182805461368d90615816565b80156136da5780601f106136af576101008083540402835291602001916136da565b820191906000526020600020905b8154815290600101906020018083116136bd57829003601f168201915b50505050506142e4565b6136ec6152cf565b6136f46152cf565b60006136ff84611c7c565b905060005b816020015151811015611a485760008260200151828151811061372957613729615b81565b60200260200101519050600061ffff16816000015161ffff1614156137935761375181611e5f565b60ff1660018111156137655761376561571f565b849060018111156137785761377861571f565b9081600181111561378b5761378b61571f565b9052506137ac565b805161ffff16600114156137ac57604081015160208501525b50806137b781615bda565b915050613704565b6137ea6040518060800160405280606081526020016060815260200160608152602001606081525090565b6138156040518060800160405280606081526020016060815260200160608152602001606081525090565b600061382084611c7c565b905060005b816020015151811015611a485760008260200151828151811061384a5761384a615b81565b60200260200101519050600061ffff16816000015161ffff16141561387557604081015184526138c8565b805161ffff166001141561389257604081015160208501526138c8565b805161ffff16600214156138af57604081015160408501526138c8565b805161ffff16600314156138c857604081015160608501525b50806138d381615bda565b915050613825565b6138e36153fa565b6138eb6153fa565b60006138f684611c7c565b905060005b816020015151811015611a485760008260200151828151811061392057613920615b81565b60200260200101519050600061ffff16816000015161ffff16141561394b576040810151845261398a565b805161ffff16600114156139715761396761198e826040015190565b602085015261398a565b805161ffff166002141561398a57604081015160408501525b508061399581615bda565b9150506138fb565b6139a5615414565b6139ad615414565b60006139b884611c7c565b905060005b816020015151811015611a48576000826020015182815181106139e2576139e2615b81565b60200260200101519050600061ffff16816000015161ffff161415613a0d5760408101518452613ae2565b805161ffff1660011415613a6957613a2481611e5f565b60ff166001811115613a3857613a3861571f565b84602001906001811115613a4e57613a4e61571f565b90816001811115613a6157613a6161571f565b905250613ae2565b805161ffff1660021415613a865760408101516040850152613ae2565b805161ffff1660031415613aa35760408101516060850152613ae2565b805161ffff1660041415613ac957613abf61198e826040015190565b6080850152613ae2565b805161ffff1660051415613ae257604081015160a08501525b5080613aed81615bda565b9150506139bd565b613afd615444565b613b05615444565b6000613b1084611c7c565b905060005b816020015151811015611a4857600082602001518281518110613b3a57613b3a615b81565b60200260200101519050600061ffff16816000015161ffff161415613b655760408101518452613bc1565b805161ffff1660011415613b825760408101516020850152613bc1565b805161ffff1660031415613ba857613b9e61198e826040015190565b6040850152613bc1565b805161ffff1660041415613bc157604081015160608501525b5080613bcc81615bda565b915050613b15565b60408051606080820183526000808352602083015291810191909152600082845111613c4f57604051636381e58960e11b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b6064820152608401610427565b6006831015613c9257604051636381e58960e11b815260206004820152","600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b6044820152606401610427565b60408051606080820183526000808352602083015291810191909152613cbb611d088686612052565b61ffff168152613ccc600285615bf5565b9350613cdb611d44868661211b565b63ffffffff166020820152613cf1600485615bf5565b9350613d088585836020015163ffffffff16612625565b60408201526020810151613d229063ffffffff1685615bf5565b935091508290505b9250929050565b8151600090613d41836008615bf5565b1115613d4c57600080fd5b5001600801516001600160401b031690565b60208110613d965781518352613d75602084615bf5565b9250613d82602083615bf5565b9150613d8f602082615bad565b9050613d5e565b80613da057505050565b60006001613daf836020615bad565b613dbb90610100615dd1565b613dc59190615bad565b925184518416931916929092179092525050565b8051602091820120825192909101919091201490565b600060608183604001516003811115613e0a57613e0a61571f565b1415613e6b576000613e1f8460c001516138db565b9050613e3c8160200151866060015161439890919063ffffffff16565b613e65576000604051806060016040528060288152602001615eab602891399250925050613d2a565b50613f13565b600183604001516003811115613e8357613e8361571f565b1415613eef576000613e988460c0015161399d565b9050600181602001516001811115613eb257613eb261571f565b14613edc576000604051806080016040528060538152602001615e58605391399250925050613d2a565b60808101516060860151613e3c91614398565b60006040518060600160405280603d8152602001615efa603d913991509150613d2a565b613f3f8460e0015160400151613f28856143c3565b613f31876144e9565b8760e001516060015161467e565b15613f5d575050604080516020810190915260008152600190613d2a565b6000604051806060016040528060278152602001615ed360279139915091509250929050565b60006103b78260800151613f9a84602001516143c3565b613fa38561484b565b8560a0015161467e565b6060613fba600484615bf5565b92506000613fcb611d448585015190565b63ffffffff169050606081158015613fee57604051915060208201604052614038565b6040519150601f8316801560200281840101848101888315602002848a0101015b8183101561402757805183526020928301920161400f565b5050848452601f01601f1916604052505b50949350505050565b604080516020810190915260608152604080516020810190915260608152600061406a84611c7c565b905060005b816020015151811015611a485760008260200151828151811061409457614094615b81565b60200260200101519050600061ffff16816000015161ffff1614156140bb57604081015184525b50806140c681615bda565b91505061406f565b6140d6615465565b6140de615465565b60006140e984611c7c565b905060005b816020015151811015611a485760008260200151828151811061411357614113615b81565b60200260200101519050600061ffff16816000015161ffff16141561414c57614145614140826040015190565b614975565b84526141ae565b805161ffff166001141561417f576000614167826040015190565b9050614174815182015190565b6020860152506141ae565b805161ffff16600214156141ae57600061419a826040015190565b90506141a7815182015190565b6040860152505b50806141b981615bda565b9150506140ee565b60006103b7611d4460048460400151015190565b6060806000836020015151111561427c576040805160028082526060820190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816141fc57905050905061423c60008460000151611f0a565b8160008151811061424f5761424f615b81565b602002602001018190525061426960018460200151611f0a565b81600181518110612e6e57612e6e615b81565b60408051600180825281830190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816142915790505090506142d160008460000151611f0a565b81600081518110611c3857611c38615b81565b60408051808201909152606080825260208201526040805180820190915260608082526020820152600061431784611c7c565b905060005b816020015151811015611a485760008260200151828151811061434157614341615b81565b60200260200101519050600061ffff16816000015161ffff16141561436c5760408101518452614385565b805161ffff166001141561438557604081015160208501525b508061439081615bda565b91505061431c565b60006143a382611b85565b805190602001206143b384611b85565b8051906020012014905092915050565b60606000826040015160038111156143dd576143dd61571f565b14156143f8576103b76143f38360c001516138db565b614a29565b6001826040015160038111156144105761441061571f565b141561442b576103b76144268360c0015161399d565b614a46565b6002826040015160038111156144435761444361571f565b141561445e576103b76144598360c00151613331565b614a63565b6003826040015160038111156144765761447661571f565b1415614491576103b761448c8360c00151613af5565b614a80565b604051636381e58960e11b815260206004820152602660248201527f6765745261775075626c69634b65793a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b6064820152608401610427565b604080516007808252610100820190925260609160009190816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161450657905050905061454660008460000151611f0a565b8160008151811061455957614559615b81565b602002602001018190525061457360018460200151611f0a565b8160018151811061458657614586615b81565b60200260200101819052506145b46002611bf3856040015160038111156145af576145af61571f565b614a94565b816002815181106145c7576145c7615b81565b60200260200101819052506145e46003612e568560600151611b85565b816003815181106145f7576145f7615b81565b602002602001018190525061461160048460800151614aa8565b8160048151811061462457614624615b81565b602002602001018190525061463e60058460a00151614aa8565b8160058151811061465157614651615b81565b602002602001018190525061466b60068460c00151611f0a565b81600681518110611c3857611c38615b81565b60006146c1604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b81525086613dd990919063ffffffff16565b61472a57604051636381e58960e11b815260206004820152603360248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152723235364b31207369676e6174757265206e6f7760681b6064820152608401610427565b60418251101561477d57604051636381e58960e11b815260206004820152601a60248201527f77726f6e6720736563703235366b3120736967206c656e6774680000000000006044820152606401610427565b601b8260408151811061479257614792615b81565b01602001516147a4919060f81c615ddd565b60f81b826040815181106147ba576147ba615b81565b60200101906001600160f81b031916908160001a905350835160208501206000906147ec908551602087012085614b28565b9050601b8360408151811061480357614803615b81565b0160200151614815919060f81c615e02565b60f81b8360408151811061482b5761482b615b81565b60200101906001600160f81b031916908160001a90535095945050505050565b60408051600580825260c0820190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816148675790505090506148a760008460000151611f0a565b816000815181106148ba576148ba615b81565b60200260200101819052506148d76001612e568560200151614b89565b816001815181106148ea576148ea615b81565b602002602001018190525061490460028460400151611f0a565b8160028151811061491757614917615b81565b60200260200101819052506149356003846060015160200151611f0a565b8160038151811061494857614948615b81565b602002602001018190525061496260048460800151611f0a565b81600481518110611c3857611c38615b81565b6040805180820190915260608082526020820152604080518082019091526060808252602082015260006149a884611c7c565b905060005b816020015151811015611a48576000826020015182815181106149d2576149d2615b81565b60200260200101519050600061ffff16816000015161ffff1614156149fd5760408101518452614a16565b805161ffff1660011415614a1657604081015160208501525b5080614a2181615bda565b9150506149ad565b60606103b782604001518360200151614d4990919063ffffffff16565b60606103b78260a001518360800151614d4990919063ffffffff16565b60606103b782608001518360600151614d4990919063ffffffff16565b60608181015160408301516103b791614d49565b60008160038111156103b7576103b761571f565b60408051606080820183526000808352602083015291810191909152604080516008808252818301909252600091602082018180368337019050509050614b046008614af385612244565b908301600719810180519290915252565b6040805160608101825261ffff959095168552600860208601528401525090919050565b6000806000614b378585614e6b565b90925090506000816004811115614b5057614b5061571f565b148015614b6e5750856001600160a01b0316826001600160a01b0316145b80614b7f5750614b7f868686614eae565b9695505050505050565b604080516008808252610120820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081614ba6579050509050614be660008460000151611f0a565b81600081518110614bf957614bf9615b81565b6020026020010181905250614c1360018460200151611f0a565b81600181518110614c2657614c26615b81565b6020026020010181905250614c4f6002611bf3856040015160038111156145af576145af61571f565b81600281518110614c6257614c62615b81565b60200260200101819052","50614c7f6003612e568560600151611b85565b81600381518110614c9257614c92615b81565b6020026020010181905250614cac60048460800151614aa8565b81600481518110614cbf57614cbf615b81565b6020026020010181905250614cd960058460a00151614aa8565b81600581518110614cec57614cec615b81565b6020026020010181905250614d0660068460c00151611f0a565b81600681518110614d1957614d19615b81565b6020026020010181905250614d366007612e568560e00151614f9a565b81600781518110611c3857611c38615b81565b6060600083516001811115614d6057614d6061571f565b14614dbc57604051636381e58960e11b815260206004820152602560248201527f6f6e6c7920737570706f727420583530395f5055424c49435f4b45595f494e466044820152644f206e6f7760d81b6064820152608401610427565b60408360200151511015614e1357604051636381e58960e11b815260206004820152601c60248201527f7075626c6963206b6579206c656e677468206e6f7420656e6f757468000000006044820152606401610427565b60208301518051600090614e2990604090615bad565b60408051818152606081018252919250600091906020820181803683370190505092909101602081810151908401526040908101519083015250905092915050565b600080825160411415614ea25760208301516040840151606085015160001a614e9687828585615090565b94509450505050613d2a565b50600090506002613d2a565b6000806000856001600160a01b031663973e417a60e01b8686604051602401614ed8929190615e25565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051614f169190615c35565b600060405180830381855afa9150503d8060008114614f51576040519150601f19603f3d011682016040523d82523d6000602084013e614f56565b606091505b5091509150818015614f6a57506020815110155b8015614b7f57508051634b9f20bd60e11b90614f8f9083016020908101908401615e3e565b149695505050505050565b60408051600480825260a0820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081614fb6579050509050614ff660008460000151611f0a565b8160008151811061500957615009615b81565b602002602001018190525061502360018460200151611f0a565b8160018151811061503657615036615b81565b602002602001018190525061505060028460400151611f0a565b8160028151811061506357615063615b81565b602002602001018190525061507d60038460600151611f0a565b81600381518110611c3857611c38615b81565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156150c7575060009050600361514b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561511b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166151445760006001925092505061514b565b9150600090505b94509492505050565b82805461516090615816565b90600052602060002090601f01602090048101928261518257600085556151c8565b82601f1061519b5782800160ff198235161785556151c8565b828001600101855582156151c8579182015b828111156151c85782358255916020019190600101906151ad565b506151d4929150615494565b5090565b8280546151e490615816565b90600052602060002090601f01602090048101928261520657600085556151c8565b82601f1061521f57805160ff19168380011785556151c8565b828001600101855582156151c8579182015b828111156151c8578251825591602001919060010190615231565b604080516101008101825260608082526020820152908101600081526020016152736152cf565b815260200160006001600160401b0316815260200160006001600160401b03168152602001606081526020016152ca6040518060800160405280606081526020016060815260200160608152602001606081525090565b905290565b604080518082019091528060005b8152602001606081525090565b6040518060c001604052806060815260200161530461524c565b81526020016060815260200161532d604051806040016040528060008152602001606081525090565b815260200160608152602001606081525090565b6040805160a08101909152606060808201908152815260208101615363615465565b815260006020820152606060409091015290565b604080516101208101825260008082526020820152606091810182905290810161539f6153d4565b81526020016153ac615465565b8152602001600063ffffffff1681526020016060815260200160608152602001606081525090565b6040805160a08101825260608082526020820152908101600081526020016152dd6152cf565b6040518060600160405280606081526020016152dd6152cf565b6040805160c0810190915260608152602081016000815260200160608152602001606081526020016152dd6152cf565b604051806080016040528060608152602001606081526020016152dd6152cf565b6040805160a0810182526060808201818152608083019190915281526000602082018190529181019190915290565b5b808211156151d45760008155600101615495565b60008083601f8401126154bb57600080fd5b5081356001600160401b038111156154d257600080fd5b602083019150836020828501011115613d2a57600080fd5b600080602083850312156154fd57600080fd5b82356001600160401b0381111561551357600080fd5b61551f858286016154a9565b90969095509350505050565b60006020828403121561553d57600080fd5b81356001600160a01b038116811461312e57600080fd5b60008060006040848603121561556957600080fd5b83356001600160401b0381111561557f57600080fd5b61558b868287016154a9565b909450925050602084013563ffffffff811681146155a857600080fd5b809150509250925092565b60005b838110156155ce5781810151838201526020016155b6565b838111156155dd576000848401525b50505050565b600081518084526155fb8160208601602086016155b3565b601f01601f19169290920160200192915050565b60208152600061312e60208301846155e3565b6003811061043957600080fd5b60006020828403121561564157600080fd5b813561312e81615622565b63b95aa35560e01b600052604160045260246000fd5b60006001600160401b038084111561567c5761567c61564c565b604051601f8501601f19908116603f011681019082821181831017156156a4576156a461564c565b816040528093508581528686860111156156bd57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156156e957600080fd5b81356001600160401b038111156156ff57600080fd5b8201601f8101841361571057600080fd5b611c7484823560208401615662565b63b95aa35560e01b600052602160045260246000fd5b600381106157455761574561571f565b9052565b6020808252825182820181905260009190848201906040850190845b8181101561578857615778838551615735565b9284019291840191600101615765565b50909695505050505050565b6000602082840312156157a657600080fd5b5035919050565b6000806000604084860312156157c257600080fd5b83356001600160401b038111156157d857600080fd5b6157e4868287016154a9565b909790965060209590950135949350505050565b602081016103b78284615735565b8183823760009101908152919050565b600181811c9082168061582a57607f821691505b6020821081141561584b5763b95aa35560e01b600052602260045260246000fd5b50919050565b60006020828403121561586357600080fd5b815161312e81615622565b6040810161587c8285615735565b6001600160a01b039290921660209190910152919050565b6000815160a084526158a960a08501826155e3565b9050602083015184820360208601526158c282826155e3565b91505060408301516158d76040860182615735565b50606083015184820360608601528051600281106158f7576158f761571f565b80835250602081015190506040602083015261591660408301826155e3565b9150506080830151848203608086015261211282826155e3565b600081516060845280516040606086015261594e60a08601826155e3565b905060208201519150605f1985820301608086015261596d81836155e3565b91505060208301516020850152604083015160408501528091505092915050565b805163ffffffff168252600061012060208301516159b4602086018263ffffffff169052565b5060408301518160408601526159cc828601826155e3565b915050606083015184820360608601526159e68282615894565b91505060808301518482036080860152615a008282615930565b91505060a0830151615a1a60a086018263ffffffff169052565b5060c083015184820360c0860152615a3282826155e3565b91505060e083015184820360e0860152615a4c82826155e3565b9150506101008084015185830382870152614b7f83826155e3565b604081526000615a7a604083018561598e565b82810360208401528351608082528051905060206080830152615aa060a08301826155e3565b905060208501518282036020840152615ab98282615930565b91505063ffffffff604086015116604083015260608501518282036060840152615ae382826155e3565b979650505050505050565b600060208284031215615b0057600080fd5b8151801515811461312e57600080fd5b604081526000615b236040830185615930565b905082151560208301529392505050565b6040815260008351604080840152615b4f60808401826155e3565b90506020850151603f19848303016060850152615b6c82826155e3565b9150508281036020840152612112818561598e565b63b95aa35560e01b600052603260045260246000fd5b63b95aa35560e01b600052601160045260246000fd5b600082821015615bbf57615bbf615b97565b500390565b63b95aa35560e01b600052603160045260246000fd5b6000600019821415615bee57615bee615b97565b5060010190565b60008219821115615c0857615c08615b97565b500190565b600063ffffffff808316818516808303821115615c2c57615c2c615b97565b01949350505050565b60008251615c478184602087016155b3565b9190910192915050565b600080835481600182811c915080831680615c6d57607f83169250","5b6020808410821415615c8d5763b95aa35560e01b86526022600452602486fd5b818015615ca15760018114615cb257615cdf565b60ff19861689528489019650615cdf565b60008a81526020902060005b86811015615cd75781548b820152908501908301615cbe565b505084890196505b509498975050505050505050565b600181815b80851115615d28578160001904821115615d0e57615d0e615b97565b80851615615d1b57918102915b93841c9390800290615cf2565b509250929050565b600082615d3f575060016103b7565b81615d4c575060006103b7565b8160018114615d625760028114615d6c57615d88565b60019150506103b7565b60ff841115615d7d57615d7d615b97565b50506001821b6103b7565b5060208310610133831016604e8410600b8410161715615dab575081810a6103b7565b615db58383615ced565b8060001904821115615dc957615dc9615b97565b029392505050565b600061312e8383615d30565b600060ff821660ff84168060ff03821115615dfa57615dfa615b97565b019392505050565b600060ff821660ff841680821015615e1c57615e1c615b97565b90039392505050565b828152604060208201526000611c7460408301846155e3565b600060208284031215615e5057600080fd5b505191905056fe63726f7373636861696e20636572742076616c69646174696f6e3a2072657175697265206263646e7320726f6f74206f7220646f6d61696e207370616365206f776e65722063657274206173207369676e657263726f7373636861696e20636572742076616c69646174696f6e3a2077726f6e67207369676e657263726f7373636861696e20636572742076616c69646174696f6e3a20696e76616c69642073696763726f7373636861696e20636572742076616c69646174696f6e3a2074797065206f66207369676e65722063657274206d757374206265206263646e73a2646970667358221220e72b5fad5218fd943fcee666738ea6f2472f5df364b1582d2dafea28feb5a11a64736f6c634300080b0033"}; + public static final String[] SM_BINARY_ARRAY = {"6080604052348015630000001257600080fd5b5060405163000087383803806300008738833981016040819052630000003991630000231d565b6300000046336300000067565b63000000538163000000b7565b630000005f630000024e565b506300002639565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b600063000000d282630000031e60201b63000019fb1760201c565b905060008160400151600381111563000000f25763000000f263000023e1565b14630000014757604051636381e58960e11b815260206004820152601e60248201527f77726f6e67207479706520666f72206263646e7320726f6f742063657274000060448201526064015b60405180910390fd5b6000630000017a63000001678363000005cc60201b6300001bc31760201c565b630000073a60201b6300001cf71760201c565b805190602001209050826001604051806040016040528060048152602001631c9bdbdd60e21b81525060405163000001b4919063000023f7565b9081526020016040518091039020908051906020019063000001d992919063000020d9565b5060408051808201825260048152631c9bdbdd60e21b6020808301918252600085815260029091529290922090516300000215929063000020d9565b506040518181527f93e430b5dea7948b047f2309fc9ab945d4eea0d469ad3c8f561fdb6b88ff2a1e9060200160405180910390a1505050565b600054600160a81b900460ff161563000002bd57604051636381e58960e11b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401630000013e565b60005460ff600160a01b90910481161015630000031c576000805460ff60a01b191660ff60a01b17905560405160ff81527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa9060200160405180910390a15b565b630000032a6300002173565b63000003366300002173565b6000630000035184630000088960201b6300001dee1760201c565b905060005b81602001515181101563000005c35760008260200151828151811063000003835763000003836300002417565b60200260200101519050600061ffff16816000015161ffff16141563000003c65763000003bd816300000add60201b6300001fca1760201c565b845263000005aa565b805161ffff166001141563000003fb5763000003ef816300000add60201b6300001fca1760201c565b602085015263000005aa565b805161ffff1660021415630000047d576300000424816300000ae460201b6300001fd11760201c565b60ff166003811115630000043e57630000043e63000023e1565b84604001906003811115630000045a57630000045a63000023e1565b90816003811115630000047357630000047363000023e1565b90525063000005aa565b805161ffff166003141563000004be5763000004b263000004ab826300000add60201b6300001fca1760201c565b6300000b0b565b606085015263000005aa565b805161ffff166004141563000004fc5763000004e7816300000c4860201b6300001fe21760201c565b6001600160401b0316608085015263000005aa565b805161ffff1660051415630000053a576300000525816300000c4860201b6300001fe21760201c565b6001600160401b031660a085015263000005aa565b805161ffff1660061415630000056f576300000563816300000add60201b6300001fca1760201c565b60c085015263000005aa565b805161ffff166007141563000005aa5763000005a4630000059d826300000add60201b6300001fca1760201c565b6300000c81565b60e08501525b508063000005b9816300002443565b9150506300000356565b50909392505050565b63000005d863000021fc565b60008260400151600381111563000005f65763000005f663000023e1565b1415630000061a5760c08201516300000610906300000e1d565b6020015192915050565b600182604001516003811115630000063857630000063863000023e1565b1415630000065c5760c08201516300000652906300000f47565b6080015192915050565b600282604001516003811115630000067a57630000067a63000023e1565b1415630000069e5760c0820151630000069490630000115d565b6060015192915050565b60038260400151600381111563000006bc5763000006bc63000023e1565b141563000006e05760c082015163000006d690630000133e565b6040015192915050565b604051636381e58960e11b815260206004820152602660248201527f676574436572744f776e65724f69643a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b6064820152608401630000013e565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081630000075457905050905063000007d5600063000007c28560000151600181111563000007af5763000007af63000023e1565b630000149d60201b6300001ffb1760201c565b63000014b760201b630000200f1760201c565b8160008151811063000007ee5763000007ee6300002417565b6020026020010181905250630000081860018460200151630000153660201b630000207c1760201c565b8160018151811063000008315763000008316300002417565b6020026020010181905250630000085f6040518060400160405280600061ffff168152602001606081525090565b818160200181905250630000088181630000157960201b63000020bf1760201c565b949350505050565b60408051808201909152600081526060602082015260068251101563000008f557604051636381e58960e11b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e6774680000000000000000006044820152606401630000013e565b6040805180820190915260008082526060602083015290630000093e630000092b8584630000171f60201b63000021c41760201c565b630000174d60201b63000021ec1760201c565b61ffff16815263000009536006836300002464565b91506000825b855181101563000009e15763000009a4630000099187630000097e8460026300002464565b63000017fd60201b630000228d1760201c565b630000182d60201b63000022b71760201c565b63000009b39060066300002482565b63000009c79063ffffffff16826300002464565b90508163000009d7816300002443565b9250506300000959565b6000826001600160401b038111156300000a01576300000a0163000022d1565b6040519080825280602002602001820160405280156300000a5257816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816300000a215790505b509050600092505b86518510156300000ace57604080516060808201835260008083526020830152918101919091526300000a8f88876300001942565b965090508082856300000aa3816300002443565b9650815181106300000abb576300000abb6300002417565b6020026020010181905250506300000a5a565b60208401525090949350505050565b6040015190565b60006300000b05600183604001516300001ae360201b63000023b11760201c565b92915050565b6300000b1763000021fc565b6300000b2363000021fc565b60006300000b3e84630000088960201b6300001dee1760201c565b905060005b81602001515181101563000005c3576000826020015182815181106300000b70576300000b706300002417565b60200260200101519050600061ffff16816000015161ffff1614156300000c00576300000baa816300000ae460201b6300001fd11760201c565b60ff1660018111156300000bc4576300000bc463000023e1565b849060018111156300000bdd576300000bdd63000023e1565b908160018111156300000bf6576300000bf663000023e1565b9052506300000c2f565b805161ffff16600114156300000c2f576300000c29816300000add60201b6300001fca1760201c565b60208501525b50806300000c3e816300002443565b9150506300000b43565b60006300000b056300000c6e600884604001516300001ae360201b63000023b11760201c565b6300001ae860201b63000023b61760201c565b6300000cae6040518060800160405280606081526020016060815260200160608152602001606081525090565b6300000cdb6040518060800160405280606081526020016060815260200160608152602001606081525090565b60006300000cf684630000088960201b6300001dee1760201c565b905060005b81602001515181101563000005c3576000826020015182815181106300000d28576300000d286300002417565b60200260200101519050600061ffff16816000015161ffff1614156300000d6b576300000d62816300000add60201b6300001fca1760201c565b84526300000e04565b805161ffff16600114156300000da0576300000d94816300000add60201b6300001fca1760201c565b60208501526300000e04565b805161ffff16600214156300000dd5576300000dc9816300000add60201b6300001fca1760201c565b60408501526300000e04565b805161ffff16600314156300000e04576300000dfe816300000add60201b6300001fca1760201c565b60608501525b50806300000e13816300002443565b9150506300000cfb565b6300000e296300002217565b6300000e356300002217565b60006300000e5084630000088960201b6300001dee1760201c565b905060005b81602001515181101563000005c3576000826020015182815181106300000e82576300000e826300002417565b60200260200101519050600061ffff16816000015161ffff1614156300000ec5576300000ebc816300000add60201b6300001fca1760201c565b84526300000f2e565b805161ffff16600114156300000eff576300000ef363000004ab826300000add60201b6300001fca1760201c565b60208501526300000f2e565b805161ffff16600214156300000f2e576300000f28816300000add60201b6300001fca1760201c565b60408501525b50806300000f3d816300002443565b9150506300000e55565b6300000f536300002235565b6300000f5f6300002235565b60006300000f7a84630000088960201b6300001dee1760201c565b905060005b81602001515181101563000005c3576000826020015182815181106300000fac576300000fac6300002417565b60200260200101519050600061ffff16816000015161ffff1614156300000fef576300000fe6816300000add60201b6300001fca1760201c565b84526300001144565b805161ffff1660011415630000107157","6300001018816300000ae460201b6300001fd11760201c565b60ff166001811115630000103257630000103263000023e1565b84602001906001811115630000104e57630000104e63000023e1565b90816001811115630000106757630000106763000023e1565b9052506300001144565b805161ffff166002141563000010a657630000109a816300000add60201b6300001fca1760201c565b60408501526300001144565b805161ffff166003141563000010db5763000010cf816300000add60201b6300001fca1760201c565b60608501526300001144565b805161ffff1660041415630000111557630000110963000004ab826300000add60201b6300001fca1760201c565b60808501526300001144565b805161ffff1660051415630000114457630000113e816300000add60201b6300001fca1760201c565b60a08501525b50806300001153816300002443565b9150506300000f7f565b63000011696300002269565b63000011756300002269565b6000630000119084630000088960201b6300001dee1760201c565b905060005b81602001515181101563000005c35760008260200151828151811063000011c25763000011c26300002417565b60200260200101519050600061ffff16816000015161ffff16141563000012055763000011fc816300000add60201b6300001fca1760201c565b84526300001325565b805161ffff1660011415630000123a57630000122e816300000add60201b6300001fca1760201c565b60208501526300001325565b805161ffff166002141563000012bc576300001263816300000ae460201b6300001fd11760201c565b60ff166002811115630000127d57630000127d63000023e1565b84604001906002811115630000129957630000129963000023e1565b9081600281111563000012b25763000012b263000023e1565b9052506300001325565b805161ffff166003141563000012f65763000012ea63000004ab826300000add60201b6300001fca1760201c565b60608501526300001325565b805161ffff1660041415630000132557630000131f816300000add60201b6300001fca1760201c565b60808501525b50806300001334816300002443565b9150506300001195565b630000134a6300002293565b63000013566300002293565b6000630000137184630000088960201b6300001dee1760201c565b905060005b81602001515181101563000005c35760008260200151828151811063000013a35763000013a36300002417565b60200260200101519050600061ffff16816000015161ffff16141563000013e65763000013dd816300000add60201b6300001fca1760201c565b84526300001484565b805161ffff1660011415630000141b57630000140f816300000add60201b6300001fca1760201c565b60208501526300001484565b805161ffff1660031415630000145557630000144963000004ab826300000add60201b6300001fca1760201c565b60408501526300001484565b805161ffff1660041415630000148457630000147e816300000add60201b6300001fca1760201c565b60608501525b50806300001493816300002443565b9150506300001376565b60008160018111156300000b05576300000b0563000023e1565b6040805160608082018352600080835260208301819052828401919091528251600180825281850190945291929091906020820181803683370190505090506300001512600184836300001cd960201b63000025741760201c565b6040805160608101825261ffff959095168552600160208601528401525090919050565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b606060006300001596836300001cea60201b63000025851760201c565b9050600063000015a98260066300002482565b63ffffffff166001600160401b0381111563000015cc5763000015cc63000022d1565b6040519080825280601f01601f19166020018201604052801563000015f8576020820181803683370190505b50905063000016336002630000161f8660000151630000174d60201b63000021ec1760201c565b836300001d8760201b63000025f91760201c565b63000016676006630000165384630000182d60201b63000022b71760201c565b836300001d9860201b630000260a1760201c565b600660005b6300001685866300001da960201b630000261b1760201c565b811015630000171557600063000016cc8760200151838151811063000016b15763000016b16300002417565b60200260200101516300001db160201b63000026231760201c565b905063000016e98382866300001e8460201b63000026b21760201c565b805163000016f990846300002464565b9250508080630000170b906300002443565b915050630000166c565b5090949350505050565b815160009063000017338360026300002464565b1115630000174057600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b8160008151811063000017965763000017966300002417565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160018151811063000017cd5763000017cd6300002417565b60200101906001600160f81b031916908160001a905350600063000017f48282630000171f565b95945050505050565b815160009063000018118360046300002464565b1115630000181e57600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b8160008151811063000018765763000018766300002417565b60200101906001600160f81b031916908160001a9053508160021a60f81b8160018151811063000018ad5763000018ad6300002417565b60200101906001600160f81b031916908160001a9053508160011a60f81b8160028151811063000018e45763000018e46300002417565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600381518110630000191b57630000191b6300002417565b60200101906001600160f81b031916908160001a905350600063000017f4828263000017fd565b6040805160608082018352600080835260208301529181019190915260008284511163000019c157604051636381e58960e11b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b6064820152608401630000013e565b60068310156300001a0857604051636381e58960e11b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b6044820152606401630000013e565b604080516060808201835260008083526020830152918101919091526300001a43630000092b8686630000171f60201b63000021c41760201c565b61ffff1681526300001a586002856300002464565b93506300001a796300000991868663000017fd60201b630000228d1760201c565b63ffffffff1660208201526300001a936004856300002464565b93506300001aba8585836020015163ffffffff166300001f7a60201b63000027971760201c565b604082015260208101516300001ad89063ffffffff16856300002464565b909590945092505050565b015190565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b816000815181106300001b31576300001b316300002417565b60200101906001600160f81b031916908160001a9053508160061a60f81b816001815181106300001b68576300001b686300002417565b60200101906001600160f81b031916908160001a9053508160051a60f81b816002815181106300001b9f576300001b9f6300002417565b60200101906001600160f81b031916908160001a9053508160041a60f81b816003815181106300001bd6576300001bd66300002417565b60200101906001600160f81b031916908160001a9053508160031a60f81b816004815181106300001c0d576300001c0d6300002417565b60200101906001600160f81b031916908160001a9053508160021a60f81b816005815181106300001c44576300001c446300002417565b60200101906001600160f81b031916908160001a9053508160011a60f81b816006815181106300001c7b576300001c7b6300002417565b60200101906001600160f81b031916908160001a9053508160001a60f81b816007815181106300001cb2576300001cb26300002417565b60200101906001600160f81b031916908160001a905350600063000017f48282630000200d565b909101600019810180519290915252565b600080805b6300001d08846300001da960201b630000261b1760201c565b8110156300001d80576000846020015182815181106300001d2f576300001d2f6300002417565b602002602001015190508060400151518360066300001d5091906300002482565b63ffffffff166300001d6491906300002464565b92505080806300001d76906300002443565b9150506300001cef565b5092915050565b909101600119810180519290915252565b909101600319810180519290915252565b602001515190565b60606000826020015160066300001dca91906300002482565b63ffffffff166001600160401b038111156300001ded576300001ded63000022d1565b6040519080825280601f01601f1916602001820160405280156300001e19576020820181803683370190505b5090506300001e406002630000161f8560000151630000174d60201b63000021ec1760201c565b6300001e64600663000016538560200151630000182d60201b63000022b71760201c565b6300000b0560068460400151836300001e8460201b63000026b21760201c565b815181516300001e9c63ffffffff8316866300002464565b11156300001f2057604051636381e58960e11b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a401630000013e565b801580156300001f31576300001f73565b8483018051601f84168015602002818801018581018215602002838601015b818310156300001f6c5782518152602092830192016300001f50565b5050509152505b5050505050565b82516060906300001f8d83856300002464565b11156300001f9a57600080fd5b6000826001600160401b038111156300001fba576300001fba63000022d1565b6040519080825280601f01601f1916602001820160405280156300001fe6576020820181803683370190505b50905060208082019086860101630000200282828763000020","40565b509095945050505050565b815160009063000020218360086300002464565b1115630000202e57600080fd5b5001600801516001600160401b031690565b6020811063000020885781518352630000205d6020846300002464565b9250630000206e6020836300002464565b9150630000207f60208263000024b0565b90506300002040565b80630000209457505050565b6000600163000020a783602063000024b0565b63000020b79061010063000025e3565b63000020c5919063000024b0565b925184518416931916929092179092525050565b82805463000020e99063000025fa565b90600052602060002090601f016020900481019282630000210f5760008555630000215f565b82601f10630000212c57805160ff1916838001178555630000215f565b82800160010185558215630000215f579182015b82811115630000215f5782518255916020019190600101906300002140565b50630000216f92915063000022b8565b5090565b60408051610100810182526060808252602082015290810160008152602001630000219e63000021fc565b815260200160006001600160401b0316815260200160006001600160401b031681526020016060815260200163000021f76040518060800160405280606081526020016060815260200160608152602001606081525090565b905290565b604080518082019091528060005b8152602001606081525090565b604051806060016040528060608152602001630000220a63000021fc565b6040805160c081019091526060815260208101600081526020016060815260200160608152602001630000220a63000021fc565b6040805160a0810182526060808252602082015290810160008152602001630000220a63000021fc565b60405180608001604052806060815260200160608152602001630000220a63000021fc565b5b80821115630000216f576000815560010163000022b9565b63b95aa35560e01b600052604160045260246000fd5b60005b83811015630000230657818101518382015260200163000022ea565b838111156300002317576000848401525b50505050565b600060208284031215630000233157600080fd5b81516001600160401b0380821115630000234a57600080fd5b818401915084601f830112630000236057600080fd5b815181811115630000237857630000237863000022d1565b604051601f8201601f19908116603f0116810190838211818310171563000023a65763000023a663000022d1565b8160405282815287602084870101111563000023c157600080fd5b63000023d683602083016020880163000022e7565b979650505050505050565b63b95aa35560e01b600052602160045260246000fd5b60008251630000240d81846020870163000022e7565b9190910192915050565b63b95aa35560e01b600052603260045260246000fd5b63b95aa35560e01b600052601160045260246000fd5b6000600019821415630000245d57630000245d630000242d565b5060010190565b60008219821115630000247d57630000247d630000242d565b500190565b600063ffffffff80831681851680830382111563000024a75763000024a7630000242d565b01949350505050565b60008282101563000024c85763000024c8630000242d565b500390565b600181815b80851115630000251457816000190482111563000024f65763000024f6630000242d565b80851615630000250557918102915b93841c939080029063000024d2565b509250929050565b600082630000252f575060016300000b05565b816300002540575060006300000b05565b8160018114630000255c5760028114630000256857630000258c565b60019150506300000b05565b60ff841115630000257f57630000257f630000242d565b50506001821b6300000b05565b5060208310610133831016604e8410600b841016171563000025b3575081810a6300000b05565b63000025c1838363000024cd565b806000190482111563000025db5763000025db630000242d565b029392505050565b600063000025f38383630000251c565b9392505050565b600181811c90821680630000261057607f821691505b6020821081141563000026335763b95aa35560e01b600052602260045260246000fd5b50919050565b6160ee80630000264a6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063b386cc56116100de578063d2bb5c1b11610097578063d8cf382811610071578063d8cf382814610395578063da5052da146103a8578063ec449a96146103bb578063f63da9e5146103ce57600080fd5b8063d2bb5c1b14610369578063d7720a8d1461037a578063d86e29e21461038d57600080fd5b8063b386cc56146102f7578063b4b5f0c61461030a578063ba0575531461031d578063c069ac2714610330578063c3482f3714610343578063cdb504551461035657600080fd5b80636040d0a01161014b5780637e5fea66116101255780637e5fea66146102ab57806386dc270d146102be57806387218e82146102d1578063a5cc4ca0146102e457600080fd5b80636040d0a014610255578063674dbe101461026a578063719c6be81461029857600080fd5b8063091fed3d1461019357806316cad12a146101bb5780631cc42afb146101d05780631cce0a86146101f05780634fe09e43146102315780635089e2c814610244575b600080fd5b6101a66101a136600461565c565b6103ee565b60405190151581526020015b60405180910390f35b6101ce6101c936600461569d565b610435565b005b6101e36101de3660046156c6565b6104b4565b6040516101b29190615781565b6102196101fe3660046157a1565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101b2565b6101ce61023f366004615849565b61058c565b6000546001600160a01b0316610219565b61025d6106c5565b6040516101b291906158bb565b61028a610278366004615906565b60046020526000908152604090205481565b6040519081526020016101b2565b6101ce6102a636600461565c565b61074d565b6101ce6102b936600461569d565b610992565b6101e36102cc36600461565c565b610a1f565b6101ce6102df36600461569d565b610afa565b6101e36102f2366004615906565b610ce6565b6101e3610305366004615849565b610d80565b6101ce61031836600461565c565b610da4565b6101e361032b36600461565c565b61110f565b6101e361033e36600461591f565b6111cf565b6101ce61035136600461565c565b61121a565b6101a66103643660046156c6565b61160b565b6007546001600160a01b0316610219565b6101ce6103883660046157a1565b611669565b6101ce6118c9565b600754610219906001600160a01b031681565b6101e36103b6366004615906565b6118dd565b6101a66103c936600461591f565b61197b565b6103e16103dc366004615906565b6119c7565b6040516101b2919061596a565b600080600360008585604051610405929190615978565b60405180910390208152602001908152602001600020600001805461042990615988565b90501190505b92915050565b61043d612818565b6001600160a01b0381166104a857604051636381e58960e11b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6104b181612873565b50565b60606004600085856040516104ca929190615978565b6040518091039020815260200190815260200160002060010160008363ffffffff168152602001908152602001600020805461050590615988565b80601f016020809104026020016040519081016040528092919081815260200182805461053190615988565b801561057e5780601f106105535761010080835404028352916020019161057e565b820191906000526020600020905b81548152906001019060200180831161056157829003601f168201915b505050505090509392505050565b600054600160a81b900460ff16158080156105b457506000546001600160a01b90910460ff16105b806105d55750303b1580156105d55750600054600160a01b900460ff166001145b61063957604051636381e58960e11b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161049f565b6000805460ff60a01b1916600160a01b1790558015610666576000805460ff60a81b1916600160a81b1790555b61066f826128c3565b61067833612873565b80156106c1576000805460ff60a81b19169055604051600181527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa906020015b60405180910390a15b5050565b6060600680548060200260200160405190810160405280929190818152602001828054801561074357602002820191906000526020600020906000905b82829054906101000a900460ff16600281111561072157610721615891565b8152602060019283018181049485019490930390920291018084116107025790505b5050505050905090565b610755612818565b600061079683838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a1192505050565b90506107a181612b52565b60006107ac82612d79565b600081815260036020526040812080549293509182906107cb90615988565b905011156108b4576107de8186866152c6565b505b6060830151602081015151905110156108af5760006108028460600151612d99565b6000818152600184016020526040902080549192509061082190615988565b1515905061089a576108368460600151612dac565b60008281526001840160209081526040909120825161085b939192919091019061534a565b5060408051848152602081018390527f54be05179495d79308b555ea9a902ba1e042e9c9454989365920b7ebe13bd3f6910160405180910390a16108a9565b6108a78460600151612dac565b505b506107e0565b61098b565b6108bf8186866152c6565b505b6060830151602081015151905110156109575760006108e38460600151612d99565b90506108f28460600151612dac565b600082815260018401602090815260409091208251610917939192919091019061534a565b5060408051848152602081018390527f54be05179495d79308b555ea9a902ba1e042e9c9454989365920b7ebe13bd3f6910160405180910390a1506108c1565b6040518281527f3e0d464c0b26534b34562cc94eef50ef9280129ddcafee0815694b2981a9317e9060200160405180910390a15b5050505050565b61099a612818565b6001600160a01b0381166109fd57604051636381e58960e11b8152","60206004820152602360248201527f5074634875623a20696e76616c6964206d6f6e69746f7250746320636f6e74726044820152621858dd60ea1b606482015260840161049f565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60606000600460008585604051610a37929190615978565b604051809103902081526020019081526020016000209050806001016000826000015481526020019081526020016000208054610a7390615988565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9f90615988565b8015610aec5780601f10610ac157610100808354040283529160200191610aec565b820191906000526020600020905b815481529060010190602001808311610acf57829003601f168201915b505050505091505092915050565b610b02612818565b6000816001600160a01b0316631272ad586040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6891906159c3565b90506000600581836002811115610b8157610b81615891565b6002811115610b9257610b92615891565b81526020810191909152604001600020546001600160a01b031614610bfa57604051636381e58960e11b815260206004820152601b60248201527f70746320766572696669657220616c7265616479206578697374730000000000604482015260640161049f565b600680546001810182556000919091527fa26d67b36928e909a2a4db51de73963e974ca036ae1fd765867a117ed4543616602082040180548392601f166101000a60ff81021990911690836002811115610c5657610c56615891565b02179055508160056000836002811115610c7257610c72615891565b6002811115610c8357610c83615891565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507fcec9da05ac4bb94bd17cf7f73b1cf870b87e983fafc5f53a58e79aa8ba311d8b81836040516106b89291906159e0565b60026020526000908152604090208054610cff90615988565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2b90615988565b8015610d785780601f10610d4d57610100808354040283529160200191610d78565b820191906000526020600020905b815481529060010190602001808311610d5b57829003601f168201915b505050505081565b805160208183018101805160018252928201919093012091528054610cff90615988565b6000610de583838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e5392505050565b90506000610df68260200151612f52565b805160208083019190912060009081526004825260408082208682015163ffffffff16835260010190925290812080549293509091610e3490615988565b905011610e7857604051636381e58960e11b815260206004820152601160248201527009dd1c189d1849c81b9bdd08199bdd5b99607a1b604482015260640161049f565b6000610e8e82846040015163ffffffff166131e2565b9050610ea18160600151606001516132a7565b610ee857604051636381e58960e11b81526020600482015260176024820152761b9bc81c1d18c81d1c9d5cdd081c9bdbdd08199bdd5b99604a1b604482015260640161049f565b6000610efb8260600151606001516132e4565b90506000610f0c83604001516133a2565b9050610f208360600151606001518261345f565b610f6d57604051636381e58960e11b815260206004820152601a60248201527f6e6f207074632076657269667920616e63686f7220666f756e64000000000000604482015260640161049f565b600060056000610f84856020015160c001516134a3565b604001516002811115610f9957610f99615891565b6002811115610faa57610faa615891565b81526020810191909152604001600020546001600160a01b031690508061100957604051636381e58960e11b81526020600482015260126024820152711b9bc81c1d18c81d995a599a595c881cd95d60721b604482015260640161049f565b6007546040516361454de560e01b81526000916001600160a01b03808516926361454de592611042928a928d9290911690600401615bd9565b6020604051808303816000875af1158015611061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110859190615c70565b90507f65f171de652251c9e9201eea4542f70c250bb2d3feb9b3154f0da78b86245cd98560800151826040516110bc929190615c92565b60405180910390a18061110457604051636381e58960e11b815260206004820152600f60248201526e766572696679206e6f74207061737360881b604482015260640161049f565b505050505050505050565b6060600360008484604051611125929190615978565b60405180910390208152602001908152602001600020600001805461114990615988565b80601f016020809104026020016040519081016040528092919081815260200182805461117590615988565b80156111c25780601f10611197576101008083540402835291602001916111c2565b820191906000526020600020905b8154815290600101906020018083116111a557829003601f168201915b5050505050905092915050565b60606003600085856040516111e5929190615978565b604051809103902081526020019081526020016000206001016000838152602001908152602001600020805461050590615988565b611222612818565b600061126383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506135de92505050565b90506112768160600151606001516132a7565b6112bd57604051636381e58960e11b81526020600482015260176024820152761b9bc81c1d18c81d1c9d5cdd081c9bdbdd08199bdd5b99604a1b604482015260640161049f565b60006112d08260600151606001516132e4565b905060006112e183604001516133a2565b90506112f58360600151606001518261345f565b61134257604051636381e58960e11b815260206004820152601a60248201527f6e6f207074632076657269667920616e63686f7220666f756e64000000000000604482015260640161049f565b600060056000611359856020015160c001516134a3565b60400151600281111561136e5761136e615891565b600281111561137f5761137f615891565b81526020810191909152604001600020546001600160a01b03169050806113de57604051636381e58960e11b81526020600482015260126024820152711b9bc81c1d18c81d995a599a595c881cd95d60721b604482015260640161049f565b806001600160a01b031663e0b011b86113ff8660600151606001518561377b565b866040518363ffffffff1660e01b815260040161141d929190615cb6565b6020604051808303816000875af115801561143c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114609190615c70565b6114a657604051636381e58960e11b81526020600482015260166024820152756661696c656420746f2076657269667920747062746160501b604482015260640161049f565b60006114b58560800151612f52565b80516020918201206000818152600483526040902091870151825491935063ffffffff1611156115285760208681015163ffffffff1680835560408051858152928301919091527fcfec0a46c6e624ac6f78c0c3ac81bb6c3acafaaa42ab41247bdbb1f2f8926acb910160405180910390a15b60208087015163ffffffff166000908152600183019091526040902061154f9089896152c6565b507fe7da5c48d6b9115684cdf93d22bc820fde23884efcab14ae8ca820a51d858b5882876020015160405161159492919091825263ffffffff16602082015260400190565b60405180910390a160075460e0870151604051635021787360e11b81526001600160a01b039092169163a042f0e6916115cf91600401615781565b600060405180830381600087803b1580156115e957600080fd5b505af11580156115fd573d6000803e3d6000fd5b505050505050505050505050565b600080600460008686604051611622929190615978565b6040518091039020815260200190815260200160002060010160008463ffffffff168152602001908152602001600020805461165d90615988565b90501190509392505050565b611671612818565b600060058183600281111561168857611688615891565b600281111561169957611699615891565b81526020810191909152604001600020546001600160a01b0316141561170257604051636381e58960e11b815260206004820152601760248201527f707463207665726966696572206e6f7420657869737473000000000000000000604482015260640161049f565b60015b6006548110156118485781600281111561172157611721615891565b6006828154811061173457611734615d03565b90600052602060002090602091828204019190069054906101000a900460ff16600281111561176557611765615891565b1415611836576006805461177b90600190615d2f565b8154811061178b5761178b615d03565b90600052602060002090602091828204019190069054906101000a900460ff16600682815481106117be576117be615d03565b90600052602060002090602091828204019190066101000a81548160ff021916908360028111156117f1576117f1615891565b0217905550600680548061180757611807615d46565b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611848565b8061184081615d5c565b915050611705565b506005600082600281111561185f5761185f615891565b600281111561187057611870615891565b81526020810191909152604090810160002080546001600160a01b0319169055517f57edd695794597830277338ba9cfc1b6b1781173f9a193504e19bd79f8d5a97a906118be90839061596a565b60405180910390a150565b6118d1612818565b6118db6000612873565b565b6003602052600090815260409020805481906118f890615988565b80601f016020809104026020016040519081016040528092919081815260200182805461192490615988565b80156119715780601f1061194657610100808354040283529160200191611971565b820191906000526020600020905b81548152906001019060200180831161195457829003601f168201915b5050505050905081565b600080600360008686604051611992929190615978565b6040518091039020815260200190815260200160002060010160008481526020019081","52602001600020805461165d90615988565b600681815481106119d757600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b611a036153be565b611a0b6153be565b6000611a1684611dee565b905060005b816020015151811015611bba57600082602001518281518110611a4057611a40615d03565b60200260200101519050600061ffff16816000015161ffff161415611a6b5760408101518452611ba7565b805161ffff1660011415611a885760408101516020850152611ba7565b805161ffff1660021415611ae457611a9f81611fd1565b60ff166003811115611ab357611ab3615891565b84604001906003811115611ac957611ac9615891565b90816003811115611adc57611adc615891565b905250611ba7565b805161ffff1660031415611b0f57611b05611b00826040015190565b613856565b6060850152611ba7565b805161ffff1660041415611b3957611b2681611fe2565b6001600160401b03166080850152611ba7565b805161ffff1660051415611b6357611b5081611fe2565b6001600160401b031660a0850152611ba7565b805161ffff1660061415611b8057604081015160c0850152611ba7565b805161ffff1660071415611ba757611ba1611b9c826040015190565b613931565b60e08501525b5080611bb281615d5c565b915050611a1b565b50909392505050565b611bcb615441565b600082604001516003811115611be357611be3615891565b1415611c0057611bf68260c00151613a4d565b6020015192915050565b600182604001516003811115611c1857611c18615891565b1415611c3557611c2b8260c00151613b0f565b6080015192915050565b600282604001516003811115611c4d57611c4d615891565b1415611c6a57611c608260c001516134a3565b6060015192915050565b600382604001516003811115611c8257611c82615891565b1415611c9f57611c958260c00151613c67565b6040015192915050565b604051636381e58960e11b815260206004820152602660248201527f676574436572744f776e65724f69643a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b606482015260840161049f565b604080516002808252606082810190935260009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611d11579050509050611d6a6000611d6585600001516001811115611d6057611d60615891565b611ffb565b61200f565b81600081518110611d7d57611d7d615d03565b6020026020010181905250611d976001846020015161207c565b81600181518110611daa57611daa615d03565b6020026020010181905250611dd66040518060400160405280600061ffff168152602001606081525090565b60208101829052611de6816120bf565b949350505050565b604080518082019091526000815260606020820152600682511015611e5657604051636381e58960e11b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e677468000000000000000000604482015260640161049f565b6040805180820190915260008082526060602083015290611e7f611e7a85846121c4565b6121ec565b61ffff168152611e90600683615d77565b91506000825b8551811015611eea57611ebb611eb687611eb1846002615d77565b61228d565b6122b7565b611ec6906006615d8f565b611ed69063ffffffff1682615d77565b905081611ee281615d5c565b925050611e96565b6000826001600160401b03811115611f0457611f046157be565b604051908082528060200260200182016040528015611f5157816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081611f225790505b509050600092505b8651851015611fbb5760408051606080820183526000808352602083015291810191909152611f888887613d46565b96509050808285611f9881615d5c565b965081518110611faa57611faa615d03565b602002602001018190525050611f59565b60208401525090949350505050565b6040015190565b600061042f60018360400151015190565b600061042f611ff660088460400151015190565b6123b6565b600081600181111561042f5761042f615891565b6040805160608082018352600080835260208301529181019190915260408051600180825281830190925260009160208201818036833701905050905061205860018483612574565b6040805160608101825261ffff959095168552600160208601528401525090919050565b60408051606080820183526000808352602083015291810191909152506040805160608101825261ffff939093168352815163ffffffff16602084015282015290565b606060006120cc83612585565b905060006120db826006615d8f565b63ffffffff166001600160401b038111156120f8576120f86157be565b6040519080825280601f01601f191660200182016040528015612122576020820181803683370190505b50905061213d600261213786600001516121ec565b836125f9565b612151600661214b846122b7565b8361260a565b600660005b6020860151518110156121ba57600061218b8760200151838151811061217e5761217e615d03565b6020026020010151612623565b90506121988382866126b2565b80516121a49084615d77565b92505080806121b290615d5c565b915050612156565b5090949350505050565b81516000906121d4836002615d77565b11156121df57600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b8160008151811061222f5761222f615d03565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160018151811061226057612260615d03565b60200101906001600160f81b031916908160001a90535060006122848260006121c4565b95945050505050565b815160009061229d836004615d77565b11156122a857600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b816000815181106122fa576122fa615d03565b60200101906001600160f81b031916908160001a9053508160021a60f81b8160018151811061232b5761232b615d03565b60200101906001600160f81b031916908160001a9053508160011a60f81b8160028151811061235c5761235c615d03565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160038151811061238d5761238d615d03565b60200101906001600160f81b031916908160001a905350600061228482600061228d565b015190565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b816000815181106123f9576123f9615d03565b60200101906001600160f81b031916908160001a9053508160061a60f81b8160018151811061242a5761242a615d03565b60200101906001600160f81b031916908160001a9053508160051a60f81b8160028151811061245b5761245b615d03565b60200101906001600160f81b031916908160001a9053508160041a60f81b8160038151811061248c5761248c615d03565b60200101906001600160f81b031916908160001a9053508160031a60f81b816004815181106124bd576124bd615d03565b60200101906001600160f81b031916908160001a9053508160021a60f81b816005815181106124ee576124ee615d03565b60200101906001600160f81b031916908160001a9053508160011a60f81b8160068151811061251f5761251f615d03565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160078151811061255057612550615d03565b60200101906001600160f81b031916908160001a9053506000612284826000613ea3565b909101600019810180519290915252565b600080805b6020840151518110156125f2576000846020015182815181106125af576125af615d03565b602002602001015190508060400151518360066125cc9190615d8f565b63ffffffff166125dc9190615d77565b92505080806125ea90615d5c565b91505061258a565b5092915050565b909101600119810180519290915252565b909101600319810180519290915252565b602001515190565b60606000826020015160066126389190615d8f565b63ffffffff166001600160401b03811115612655576126556157be565b6040519080825280601f01601f19166020018201604052801561267f576020820181803683370190505b509050612694600261213785600001516121ec565b6126a6600661214b85602001516122b7565b61042f60068460400151835b815181516126c663ffffffff831686615d77565b111561274657604051636381e58960e11b815260206004820152604260248201527f7661724279746573546f4279746573426967456e6469616e3a206f666673657460448201527f2069732067726561746572207468616e20746865206f7574707574206c656e676064820152610e8d60f31b608482015260a40161049f565b801580156127535761098b565b8483018051601f84168015602002818801018581018215602002838601015b8183101561278a578251815260209283019201612772565b5050509152505050505050565b82516060906127a68385615d77565b11156127b157600080fd5b6000826001600160401b038111156127cb576127cb6157be565b6040519080825280601f01601f1916602001820160405280156127f5576020820181803683370190505b5090506020808201908686010161280d828287613ed0565b509095945050505050565b6000546001600160a01b031633146118db57604051636381e58960e11b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161049f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b60006128ce826119fb565b90506000816040015160038111156128e8576128e8615891565b1461293657604051636381e58960e11b815260206004820152601e60248201527f77726f6e67207479706520666f72206263646e7320726f6f7420636572740000604482015260640161049f565b600061294961294483611bc3565b611cf7565b805190602001209050826001604051806040016040528060048152602001631c9bdbdd60e21b81525060405161297f9190615db7565b908152602001604051809103902090805190602001906129a092919061534a565b5060408051808201825260048152631c9bdbdd60e2","1b6020808301918252600085815260029091529290922090516129d8929061534a565b506040518181527f93e430b5dea7948b047f2309fc9ab945d4eea0d469ad3c8f561fdb6b88ff2a1e9060200160405180910390a1505050565b612a1961545c565b612a2161545c565b6000612a2c84611dee565b905060005b816020015151811015611bba57600082602001518281518110612a5657612a56615d03565b60200260200101519050600061ffff16816000015161ffff161415612a815760408101518452612b3f565b805161ffff1660011415612aac57612aa2612a9d826040015190565b6119fb565b6020850152612b3f565b805161ffff1660021415612ac95760408101516040850152612b3f565b805161ffff1660031415612b0957604080518082018252600080825260606020928301528251808401845290815291830151908201526060850152612b3f565b805161ffff1660041415612b265760408101516080850152612b3f565b805161ffff1660051415612b3f57604081015160a08501525b5080612b4a81615d5c565b915050612a31565b6000612b65826020015160600151611cf7565b80516020918201206000818152600290925260408220805491935090612b8a90615988565b905011612bcd57604051636381e58960e11b815260206004820152601060248201526f1a5cdcdd595c881b9bdd08199bdd5b9960821b604482015260640161049f565b6000818152600260205260408082209051612c8b91600191612bef9190615dd3565b90815260200160405180910390208054612c0890615988565b80601f0160208091040260200160405190810160405280929190818152602001828054612c3490615988565b8015612c815780601f10612c5657610100808354040283529160200191612c81565b820191906000526020600020905b815481529060010190602001808311612c6457829003601f168201915b50505050506119fb565b9050612cd6604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b8152508260e0015160400151613f4b90919063ffffffff16565b15612d1e57600080612cf5838660200151613f6190919063ffffffff16565b91509150818190612d1a57604051636381e58960e11b815260040161049f9190615781565b5050505b612d27836140f5565b612d7457604051636381e58960e11b815260206004820152601a60248201527f70746320747275737420726f6f742073696720696e76616c6964000000000000604482015260640161049f565b505050565b6000612d8b6129448360200151611bc3565b805190602001209050919050565b600061042f612da783612dac565b6133a2565b6060816020015151826000015110612e1b57604051636381e58960e11b815260206004820152602b60248201527f544c564974656d4d617056616c756553747265616d3a206f6666657374206f7560448201526a3a1037b310313ab33332b960a91b606482015260840161049f565b6000612e2f8360000151846020015161411f565b8051845191925090612e42906004615d77565b612e4c9190615d77565b9092525090565b612e5b6154b3565b612e636154b3565b6000612e6e84611dee565b905060005b816020015151811015611bba57600082602001518281518110612e9857612e98615d03565b60200260200101519050600561ffff16816000015161ffff161415612ed157612eca612ec5826040015190565b6141b3565b8452612f3f565b805161ffff166101011415612efd57612ef3612eee826040015190565b614240565b6020850152612f3f565b805161ffff166101001415612f2557612f1581614333565b63ffffffff166040850152612f3f565b805161ffff166101ff1415612f3f57604081015160608501525b5080612f4a81615d5c565b915050612e73565b60208101516060908190158015612f6b57506040830151155b15612ff05760408051600180825281830190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081612f85579050509050612fcd6000612fc88560000151614347565b61207c565b81600081518110612fe057612fe0615d03565b60200260200101819052506131c8565b6020830151158015906130065750604083015115155b1561317f576040805160038082526080820190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816130215790505090506130646000612fc88560000151614347565b8160008151811061307757613077615d03565b6020026020010181905250600060206001600160401b0381111561309d5761309d6157be565b6040519080825280601f01601f1916602001820160405280156130c7576020820181803683370190505b506020858101519082015290506130df60018261207c565b826001815181106130f2576130f2615d03565b6020026020010181905250600060206001600160401b03811115613118576131186157be565b6040519080825280601f01601f191660200182016040528015613142576020820181803683370190505b5060408601516020820152905061315a60028261207c565b8360028151811061316d5761316d615d03565b602002602001018190525050506131c8565b604051636381e58960e11b815260206004820152601760248201527f696e76616c69642063726f7373636861696e206c616e65000000000000000000604482015260640161049f565b604080518082019091526000815260606020820152611dd6565b6131ea6154e9565b825160208085019190912060009081526004825260408082208583526001019092522080546132a0919061321d90615988565b80601f016020809104026020016040519081016040528092919081815260200182805461324990615988565b80156132965780601f1061326b57610100808354040283529160200191613296565b820191906000526020600020905b81548152906001019060200180831161327957829003601f168201915b50505050506135de565b9392505050565b600080600360006132b785611cf7565b80519060200120815260200190815260200160002060000180546132da90615988565b9050119050919050565b6132ec61545c565b61042f600360006132fc85611cf7565b805190602001208152602001908152602001600020600001805461331f90615988565b80601f016020809104026020016040519081016040528092919081815260200182805461334b90615988565b80156133985780601f1061336d57610100808354040283529160200191613398565b820191906000526020600020905b81548152906001019060200180831161337b57829003601f168201915b5050505050612a11565b8051600090602081111561340557604051636381e58960e11b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b606482015260840161049f565b6000816001600160401b0381111561341f5761341f6157be565b6040519080825280601f01601f191660200182016040528015613449576020820181803683370190505b5084518152938201519190930151900392915050565b6000806003600061346f86611cf7565b8051906020012081526020019081526020016000206001016000848152602001908152602001600020805461042990615988565b6134ab615546565b6134b3615546565b60006134be84611dee565b905060005b816020015151811015611bba576000826020015182815181106134e8576134e8615d03565b60200260200101519050600061ffff16816000015161ffff16141561351357604081015184526135cb565b805161ffff166001141561353057604081015160208501526135cb565b805161ffff166002141561358c5761354781611fd1565b60ff16600281111561355b5761355b615891565b8460400190600281111561357157613571615891565b9081600281111561358457613584615891565b9052506135cb565b805161ffff16600314156135b2576135a8611b00826040015190565b60608501526135cb565b805161ffff16600414156135cb57604081015160808501525b50806135d681615d5c565b9150506134c3565b6135e66154e9565b6135ee6154e9565b60006135f984611dee565b905060005b816020015151811015611bba5760008260200151828151811061362357613623615d03565b60200260200101519050600061ffff16816000015161ffff1614156136585761364b81614333565b63ffffffff168452613768565b805161ffff166001141561367f5761366f81614333565b63ffffffff166020850152613768565b805161ffff166002141561369c5760408101516040850152613768565b805161ffff16600314156136c7576136bd6136b8826040015190565b6134a3565b6060850152613768565b805161ffff16600414156136ed576136e3612eee826040015190565b6080850152613768565b805161ffff16600514156137145761370481614333565b63ffffffff1660a0850152613768565b805161ffff166006141561373157604081015160c0850152613768565b805161ffff166007141561374e57604081015160e0850152613768565b805161ffff1660ff14156137685760408101516101008501525b508061377381615d5c565b9150506135fe565b60408051808201909152606080825260208201526132a06003600061379f86611cf7565b805190602001208152602001908152602001600020600101600084815260200190815260200160002080546137d390615988565b80601f01602080910402602001604051908101604052809291908181526020018280546137ff90615988565b801561384c5780601f106138215761010080835404028352916020019161384c565b820191906000526020600020905b81548152906001019060200180831161382f57829003601f168201915b5050505050614456565b61385e615441565b613866615441565b600061387184611dee565b905060005b816020015151811015611bba5760008260200151828151811061389b5761389b615d03565b60200260200101519050600061ffff16816000015161ffff161415613905576138c381611fd1565b60ff1660018111156138d7576138d7615891565b849060018111156138ea576138ea615891565b908160018111156138fd576138fd615891565b90525061391e565b805161ffff166001141561391e57604081015160208501525b508061392981615d5c565b915050613876565b61395c6040518060800160405280606081526020016060815260200160608152602001606081525090565b6139876040518060800160405280606081526020016060815260200160608152602001606081525090565b600061399284611dee565b905060005b816020015151811015611bba576000826020015182815181106139bc5761","39bc615d03565b60200260200101519050600061ffff16816000015161ffff1614156139e75760408101518452613a3a565b805161ffff1660011415613a045760408101516020850152613a3a565b805161ffff1660021415613a215760408101516040850152613a3a565b805161ffff1660031415613a3a57604081015160608501525b5080613a4581615d5c565b915050613997565b613a5561556c565b613a5d61556c565b6000613a6884611dee565b905060005b816020015151811015611bba57600082602001518281518110613a9257613a92615d03565b60200260200101519050600061ffff16816000015161ffff161415613abd5760408101518452613afc565b805161ffff1660011415613ae357613ad9611b00826040015190565b6020850152613afc565b805161ffff1660021415613afc57604081015160408501525b5080613b0781615d5c565b915050613a6d565b613b17615586565b613b1f615586565b6000613b2a84611dee565b905060005b816020015151811015611bba57600082602001518281518110613b5457613b54615d03565b60200260200101519050600061ffff16816000015161ffff161415613b7f5760408101518452613c54565b805161ffff1660011415613bdb57613b9681611fd1565b60ff166001811115613baa57613baa615891565b84602001906001811115613bc057613bc0615891565b90816001811115613bd357613bd3615891565b905250613c54565b805161ffff1660021415613bf85760408101516040850152613c54565b805161ffff1660031415613c155760408101516060850152613c54565b805161ffff1660041415613c3b57613c31611b00826040015190565b6080850152613c54565b805161ffff1660051415613c5457604081015160a08501525b5080613c5f81615d5c565b915050613b2f565b613c6f6155b6565b613c776155b6565b6000613c8284611dee565b905060005b816020015151811015611bba57600082602001518281518110613cac57613cac615d03565b60200260200101519050600061ffff16816000015161ffff161415613cd75760408101518452613d33565b805161ffff1660011415613cf45760408101516020850152613d33565b805161ffff1660031415613d1a57613d10611b00826040015190565b6040850152613d33565b805161ffff1660041415613d3357604081015160608501525b5080613d3e81615d5c565b915050613c87565b60408051606080820183526000808352602083015291810191909152600082845111613dc157604051636381e58960e11b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b606482015260840161049f565b6006831015613e0457604051636381e58960e11b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b604482015260640161049f565b60408051606080820183526000808352602083015291810191909152613e2d611e7a86866121c4565b61ffff168152613e3e600285615d77565b9350613e4d611eb6868661228d565b63ffffffff166020820152613e63600485615d77565b9350613e7a8585836020015163ffffffff16612797565b60408201526020810151613e949063ffffffff1685615d77565b935091508290505b9250929050565b8151600090613eb3836008615d77565b1115613ebe57600080fd5b5001600801516001600160401b031690565b60208110613f085781518352613ee7602084615d77565b9250613ef4602083615d77565b9150613f01602082615d2f565b9050613ed0565b80613f1257505050565b60006001613f21836020615d2f565b613f2d90610100615f53565b613f379190615d2f565b925184518416931916929092179092525050565b8051602091820120825192909101919091201490565b600060608183604001516003811115613f7c57613f7c615891565b1415613fdd576000613f918460c00151613a4d565b9050613fae8160200151866060015161450a90919063ffffffff16565b613fd757600060405180606001604052806028815260200161602d602891399250925050613e9c565b50614085565b600183604001516003811115613ff557613ff5615891565b141561406157600061400a8460c00151613b0f565b905060018160200151600181111561402457614024615891565b1461404e576000604051806080016040528060538152602001615fda605391399250925050613e9c565b60808101516060860151613fae9161450a565b60006040518060600160405280603d815260200161607c603d913991509150613e9c565b6140b18460e001516040015161409a85614535565b6140a38761465b565b8760e00151606001516147f0565b156140cf575050604080516020810190915260008152600190613e9c565b600060405180606001604052806027815260200161605560279139915091509250929050565b600061042f826080015161410c8460200151614535565b614115856149bd565b8560a001516147f0565b606061412c600484615d77565b9250600061413d611eb68585015190565b63ffffffff169050606081158015614160576040519150602082016040526141aa565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015614199578051835260209283019201614181565b5050848452601f01601f1916604052505b50949350505050565b60408051602081019091526060815260408051602081019091526060815260006141dc84611dee565b905060005b816020015151811015611bba5760008260200151828151811061420657614206615d03565b60200260200101519050600061ffff16816000015161ffff16141561422d57604081015184525b508061423881615d5c565b9150506141e1565b6142486155d7565b6142506155d7565b600061425b84611dee565b905060005b816020015151811015611bba5760008260200151828151811061428557614285615d03565b60200260200101519050600061ffff16816000015161ffff1614156142be576142b76142b2826040015190565b614ae7565b8452614320565b805161ffff16600114156142f15760006142d9826040015190565b90506142e6815182015190565b602086015250614320565b805161ffff166002141561432057600061430c826040015190565b9050614319815182015190565b6040860152505b508061432b81615d5c565b915050614260565b600061042f611eb660048460400151015190565b606080600083602001515111156143ee576040805160028082526060820190925290816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161436e5790505090506143ae6000846000015161207c565b816000815181106143c1576143c1615d03565b60200260200101819052506143db6001846020015161207c565b81600181518110612fe057612fe0615d03565b60408051600180825281830190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816144035790505090506144436000846000015161207c565b81600081518110611daa57611daa615d03565b60408051808201909152606080825260208201526040805180820190915260608082526020820152600061448984611dee565b905060005b816020015151811015611bba576000826020015182815181106144b3576144b3615d03565b60200260200101519050600061ffff16816000015161ffff1614156144de57604081015184526144f7565b805161ffff16600114156144f757604081015160208501525b508061450281615d5c565b91505061448e565b600061451582611cf7565b8051906020012061452584611cf7565b8051906020012014905092915050565b606060008260400151600381111561454f5761454f615891565b141561456a5761042f6145658360c00151613a4d565b614b9b565b60018260400151600381111561458257614582615891565b141561459d5761042f6145988360c00151613b0f565b614bb8565b6002826040015160038111156145b5576145b5615891565b14156145d05761042f6145cb8360c001516134a3565b614bd5565b6003826040015160038111156145e8576145e8615891565b14156146035761042f6145fe8360c00151613c67565b614bf2565b604051636381e58960e11b815260206004820152602660248201527f6765745261775075626c69634b65793a20636572742074797065206e6f7420736044820152651d5c1c1bdc9d60d21b606482015260840161049f565b604080516007808252610100820190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816146785790505090506146b86000846000015161207c565b816000815181106146cb576146cb615d03565b60200260200101819052506146e56001846020015161207c565b816001815181106146f8576146f8615d03565b60200260200101819052506147266002611d658560400151600381111561472157614721615891565b614c06565b8160028151811061473957614739615d03565b60200260200101819052506147566003612fc88560600151611cf7565b8160038151811061476957614769615d03565b602002602001018190525061478360048460800151614c1a565b8160048151811061479657614796615d03565b60200260200101819052506147b060058460a00151614c1a565b816005815181106147c3576147c3615d03565b60200260200101819052506147dd60068460c0015161207c565b81600681518110611daa57611daa615d03565b6000614833604051806040016040528060168152602001754b656363616b32353657697468536563703235366b3160501b81525086613f4b90919063ffffffff16565b61489c57604051636381e58960e11b815260206004820152603360248201527f6f6e6c7920737570706f7274204b454343414b3235365f574954485f534543506044820152723235364b31207369676e6174757265206e6f7760681b606482015260840161049f565b6041825110156148ef57604051636381e58960e11b815260206004820152601a60248201527f77726f6e6720736563703235366b3120736967206c656e677468000000000000604482015260640161049f565b601b8260408151811061490457614904615d03565b0160200151614916919060f81c615f5f565b60f81b8260408151811061492c5761492c615d03565b60200101906001600160f81b031916908160001a9053508351602085012060009061495e908551602087012085614c9a565b9050601b8360408151811061497557614975615d03565b0160200151614987919060f81c615f84565b60f81b8360408151811061499d5761499d615d03565b60200101906001600160f81b031916908160001a90535095","945050505050565b60408051600580825260c0820190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816149d9579050509050614a196000846000015161207c565b81600081518110614a2c57614a2c615d03565b6020026020010181905250614a496001612fc88560200151614cfb565b81600181518110614a5c57614a5c615d03565b6020026020010181905250614a766002846040015161207c565b81600281518110614a8957614a89615d03565b6020026020010181905250614aa7600384606001516020015161207c565b81600381518110614aba57614aba615d03565b6020026020010181905250614ad46004846080015161207c565b81600481518110611daa57611daa615d03565b604080518082019091526060808252602082015260408051808201909152606080825260208201526000614b1a84611dee565b905060005b816020015151811015611bba57600082602001518281518110614b4457614b44615d03565b60200260200101519050600061ffff16816000015161ffff161415614b6f5760408101518452614b88565b805161ffff1660011415614b8857604081015160208501525b5080614b9381615d5c565b915050614b1f565b606061042f82604001518360200151614ebb90919063ffffffff16565b606061042f8260a001518360800151614ebb90919063ffffffff16565b606061042f82608001518360600151614ebb90919063ffffffff16565b606081810151604083015161042f91614ebb565b600081600381111561042f5761042f615891565b60408051606080820183526000808352602083015291810191909152604080516008808252818301909252600091602082018180368337019050509050614c766008614c65856123b6565b908301600719810180519290915252565b6040805160608101825261ffff959095168552600860208601528401525090919050565b6000806000614ca98585614fdd565b90925090506000816004811115614cc257614cc2615891565b148015614ce05750856001600160a01b0316826001600160a01b0316145b80614cf15750614cf1868686615020565b9695505050505050565b604080516008808252610120820190925260609160009190816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081614d18579050509050614d586000846000015161207c565b81600081518110614d6b57614d6b615d03565b6020026020010181905250614d856001846020015161207c565b81600181518110614d9857614d98615d03565b6020026020010181905250614dc16002611d658560400151600381111561472157614721615891565b81600281518110614dd457614dd4615d03565b6020026020010181905250614df16003612fc88560600151611cf7565b81600381518110614e0457614e04615d03565b6020026020010181905250614e1e60048460800151614c1a565b81600481518110614e3157614e31615d03565b6020026020010181905250614e4b60058460a00151614c1a565b81600581518110614e5e57614e5e615d03565b6020026020010181905250614e7860068460c0015161207c565b81600681518110614e8b57614e8b615d03565b6020026020010181905250614ea86007612fc88560e0015161510c565b81600781518110611daa57611daa615d03565b6060600083516001811115614ed257614ed2615891565b14614f2e57604051636381e58960e11b815260206004820152602560248201527f6f6e6c7920737570706f727420583530395f5055424c49435f4b45595f494e466044820152644f206e6f7760d81b606482015260840161049f565b60408360200151511015614f8557604051636381e58960e11b815260206004820152601c60248201527f7075626c6963206b6579206c656e677468206e6f7420656e6f75746800000000604482015260640161049f565b60208301518051600090614f9b90604090615d2f565b60408051818152606081018252919250600091906020820181803683370190505092909101602081810151908401526040908101519083015250905092915050565b6000808251604114156150145760208301516040840151606085015160001a61500887828585615202565b94509450505050613e9c565b50600090506002613e9c565b6000806000856001600160a01b031663973e417a60e01b868660405160240161504a929190615fa7565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516150889190615db7565b600060405180830381855afa9150503d80600081146150c3576040519150601f19603f3d011682016040523d82523d6000602084013e6150c8565b606091505b50915091508180156150dc57506020815110155b8015614cf157508051634b9f20bd60e11b906151019083016020908101908401615fc0565b149695505050505050565b60408051600480825260a0820190925260609160009190816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816151285790505090506151686000846000015161207c565b8160008151811061517b5761517b615d03565b60200260200101819052506151956001846020015161207c565b816001815181106151a8576151a8615d03565b60200260200101819052506151c26002846040015161207c565b816002815181106151d5576151d5615d03565b60200260200101819052506151ef6003846060015161207c565b81600381518110611daa57611daa615d03565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561523957506000905060036152bd565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561528d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166152b6576000600192509250506152bd565b9150600090505b94509492505050565b8280546152d290615988565b90600052602060002090601f0160209004810192826152f4576000855561533a565b82601f1061530d5782800160ff1982351617855561533a565b8280016001018555821561533a579182015b8281111561533a57823582559160200191906001019061531f565b50615346929150615606565b5090565b82805461535690615988565b90600052602060002090601f016020900481019282615378576000855561533a565b82601f1061539157805160ff191683800117855561533a565b8280016001018555821561533a579182015b8281111561533a5782518255916020019190600101906153a3565b604080516101008101825260608082526020820152908101600081526020016153e5615441565b815260200160006001600160401b0316815260200160006001600160401b031681526020016060815260200161543c6040518060800160405280606081526020016060815260200160608152602001606081525090565b905290565b604080518082019091528060005b8152602001606081525090565b6040518060c00160405280606081526020016154766153be565b81526020016060815260200161549f604051806040016040528060008152602001606081525090565b815260200160608152602001606081525090565b6040805160a081019091526060608082019081528152602081016154d56155d7565b815260006020820152606060409091015290565b6040805161012081018252600080825260208201526060918101829052908101615511615546565b815260200161551e6155d7565b8152602001600063ffffffff1681526020016060815260200160608152602001606081525090565b6040805160a081018252606080825260208201529081016000815260200161544f615441565b60405180606001604052806060815260200161544f615441565b6040805160c08101909152606081526020810160008152602001606081526020016060815260200161544f615441565b6040518060800160405280606081526020016060815260200161544f615441565b6040805160a0810182526060808201818152608083019190915281526000602082018190529181019190915290565b5b808211156153465760008155600101615607565b60008083601f84011261562d57600080fd5b5081356001600160401b0381111561564457600080fd5b602083019150836020828501011115613e9c57600080fd5b6000806020838503121561566f57600080fd5b82356001600160401b0381111561568557600080fd5b6156918582860161561b565b90969095509350505050565b6000602082840312156156af57600080fd5b81356001600160a01b03811681146132a057600080fd5b6000806000604084860312156156db57600080fd5b83356001600160401b038111156156f157600080fd5b6156fd8682870161561b565b909450925050602084013563ffffffff8116811461571a57600080fd5b809150509250925092565b60005b83811015615740578181015183820152602001615728565b8381111561574f576000848401525b50505050565b6000815180845261576d816020860160208601615725565b601f01601f19169290920160200192915050565b6020815260006132a06020830184615755565b600381106104b157600080fd5b6000602082840312156157b357600080fd5b81356132a081615794565b63b95aa35560e01b600052604160045260246000fd5b60006001600160401b03808411156157ee576157ee6157be565b604051601f8501601f19908116603f01168101908282118183101715615816576158166157be565b8160405280935085815286868601111561582f57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561585b57600080fd5b81356001600160401b0381111561587157600080fd5b8201601f8101841361588257600080fd5b611de6848235602084016157d4565b63b95aa35560e01b600052602160045260246000fd5b600381106158b7576158b7615891565b9052565b6020808252825182820181905260009190848201906040850190845b818110156158fa576158ea8385516158a7565b92840192918401916001016158d7565b50909695505050505050565b60006020828403121561591857600080fd5b5035919050565b60008060006040848603121561593457600080fd5b83356001600160401b0381111561594a57600080fd5b6159568682870161561b565b909790965060209590950135949350505050565b6020810161042f82846158a7565b8183823760009101908152919050565b600181811c9082168061599c57607f821691505b602082108114156159bd5763b95aa35560e01b600052602260","045260246000fd5b50919050565b6000602082840312156159d557600080fd5b81516132a081615794565b604081016159ee82856158a7565b6001600160a01b039290921660209190910152919050565b6000815160a08452615a1b60a0850182615755565b905060208301518482036020860152615a348282615755565b9150506040830151615a4960408601826158a7565b5060608301518482036060860152805160028110615a6957615a69615891565b808352506020810151905060406020830152615a886040830182615755565b915050608083015184820360808601526122848282615755565b6000815160608452805160406060860152615ac060a0860182615755565b905060208201519150605f19858203016080860152615adf8183615755565b91505060208301516020850152604083015160408501528091505092915050565b805163ffffffff16825260006101206020830151615b26602086018263ffffffff169052565b506040830151816040860152615b3e82860182615755565b91505060608301518482036060860152615b588282615a06565b91505060808301518482036080860152615b728282615aa2565b91505060a0830151615b8c60a086018263ffffffff169052565b5060c083015184820360c0860152615ba48282615755565b91505060e083015184820360e0860152615bbe8282615755565b9150506101008084015185830382870152614cf18382615755565b606081526000615bec6060830186615b00565b82810360208401528451608082528051905060206080830152615c1260a0830182615755565b905060208601518282036020840152615c2b8282615aa2565b91505063ffffffff604087015116604083015260608601518282036060840152615c558282615755565b935050505060018060a01b0383166040830152949350505050565b600060208284031215615c8257600080fd5b815180151581146132a057600080fd5b604081526000615ca56040830185615aa2565b905082151560208301529392505050565b6040815260008351604080840152615cd16080840182615755565b90506020850151603f19848303016060850152615cee8282615755565b91505082810360208401526122848185615b00565b63b95aa35560e01b600052603260045260246000fd5b63b95aa35560e01b600052601160045260246000fd5b600082821015615d4157615d41615d19565b500390565b63b95aa35560e01b600052603160045260246000fd5b6000600019821415615d7057615d70615d19565b5060010190565b60008219821115615d8a57615d8a615d19565b500190565b600063ffffffff808316818516808303821115615dae57615dae615d19565b01949350505050565b60008251615dc9818460208701615725565b9190910192915050565b600080835481600182811c915080831680615def57607f831692505b6020808410821415615e0f5763b95aa35560e01b86526022600452602486fd5b818015615e235760018114615e3457615e61565b60ff19861689528489019650615e61565b60008a81526020902060005b86811015615e595781548b820152908501908301615e40565b505084890196505b509498975050505050505050565b600181815b80851115615eaa578160001904821115615e9057615e90615d19565b80851615615e9d57918102915b93841c9390800290615e74565b509250929050565b600082615ec15750600161042f565b81615ece5750600061042f565b8160018114615ee45760028114615eee57615f0a565b600191505061042f565b60ff841115615eff57615eff615d19565b50506001821b61042f565b5060208310610133831016604e8410600b8410161715615f2d575081810a61042f565b615f378383615e6f565b8060001904821115615f4b57615f4b615d19565b029392505050565b60006132a08383615eb2565b600060ff821660ff84168060ff03821115615f7c57615f7c615d19565b019392505050565b600060ff821660ff841680821015615f9e57615f9e615d19565b90039392505050565b828152604060208201526000611de66040830184615755565b600060208284031215615fd257600080fd5b505191905056fe63726f7373636861696e20636572742076616c69646174696f6e3a2072657175697265206263646e7320726f6f74206f7220646f6d61696e207370616365206f776e65722063657274206173207369676e657263726f7373636861696e20636572742076616c69646174696f6e3a2077726f6e67207369676e657263726f7373636861696e20636572742076616c69646174696f6e3a20696e76616c69642073696763726f7373636861696e20636572742076616c69646174696f6e3a2074797065206f66207369676e65722063657274206d757374206265206263646e73a2646970667358221220eb200a77e52a9ba207c2d28287a022db0486df88452e378d0d110fd3014f3ad064736f6c634300080b0033"}; public static final String SM_BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", SM_BINARY_ARRAY); - public static final String[] ABI_ARRAY = {"[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawRootBcdnsCert\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum PTCTypeEnum\",\"name\":\"ptcType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifierAddress\",\"type\":\"address\"}],\"name\":\"AddPtcVerifier\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"laneHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"LatestTpBta\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"ownerOid\",\"type\":\"bytes32\"}],\"name\":\"NewBcdnsCert\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes32\"}],\"name\":\"NewPtrTrustRoot\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVersionNum\",\"type\":\"uint256\"}],\"name\":\"NewVerifyAnchor\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum PTCTypeEnum\",\"name\":\"ptcType\",\"type\":\"uint8\"}],\"name\":\"RemovePtcVerifier\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"laneHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"SaveTpBta\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"}],\"internalType\":\"struct CrossChainChannel\",\"name\":\"channel\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"senderId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"receiverId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"struct CrossChainLane\",\"name\":\"tpbtaLane\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"name\":\"VerifyProof\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifierContract\",\"type\":\"address\"}],\"name\":\"addPtcVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawTpBta\",\"type\":\"bytes\"}],\"name\":\"addTpBta\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"bcdnsCertMap\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"tpbtaLane\",\"type\":\"bytes\"}],\"name\":\"getLatestTpBta\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes\"}],\"name\":\"getPTCTrustRoot\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"versionNum\",\"type\":\"uint256\"}],\"name\":\"getPTCVerifyAnchor\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedPTCType\",\"outputs\":[{\"internalType\":\"enum PTCTypeEnum[]\",\"name\":\"\",\"type\":\"uint8[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"tpbtaLane\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"tpBtaVersion\",\"type\":\"uint32\"}],\"name\":\"getTpBta\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes\"}],\"name\":\"hasPTCTrustRoot\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"versionNum\",\"type\":\"uint256\"}],\"name\":\"hasPTCVerifyAnchor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"tpbtaLane\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"tpBtaVersion\",\"type\":\"uint32\"}],\"name\":\"hasTpBta\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawRootBcdnsCert\",\"type\":\"bytes\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"ownerOidToBcdnsDomainSpaceMap\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"ptcTrustRootMap\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"rawPtcTrustRoot\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ptcTypeSupported\",\"outputs\":[{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"ptcType\",\"type\":\"uint8\"}],\"name\":\"removePtcVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"tpBtaMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"latestVersion\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawPtcTrustRoot\",\"type\":\"bytes\"}],\"name\":\"updatePTCTrustRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"verifierMap\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawTpProof\",\"type\":\"bytes\"}],\"name\":\"verifyProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"}; + public static final String[] ABI_ARRAY = {"[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawRootBcdnsCert\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum PTCTypeEnum\",\"name\":\"ptcType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifierAddress\",\"type\":\"address\"}],\"name\":\"AddPtcVerifier\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"laneHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"LatestTpBta\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"ownerOid\",\"type\":\"bytes32\"}],\"name\":\"NewBcdnsCert\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes32\"}],\"name\":\"NewPtrTrustRoot\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVersionNum\",\"type\":\"uint256\"}],\"name\":\"NewVerifyAnchor\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum PTCTypeEnum\",\"name\":\"ptcType\",\"type\":\"uint8\"}],\"name\":\"RemovePtcVerifier\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"laneHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"SaveTpBta\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"}],\"internalType\":\"struct CrossChainChannel\",\"name\":\"channel\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"senderId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"receiverId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"struct CrossChainLane\",\"name\":\"tpbtaLane\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"name\":\"VerifyProof\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifierContract\",\"type\":\"address\"}],\"name\":\"addPtcVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawTpBta\",\"type\":\"bytes\"}],\"name\":\"addTpBta\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"bcdnsCertMap\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"tpbtaLane\",\"type\":\"bytes\"}],\"name\":\"getLatestTpBta\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMonitorVerifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes\"}],\"name\":\"getPTCTrustRoot\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"versionNum\",\"type\":\"uint256\"}],\"name\":\"getPTCVerifyAnchor\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedPTCType\",\"outputs\":[{\"internalType\":\"enum PTCTypeEnum[]\",\"name\":\"\",\"type\":\"uint8[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"tpbtaLane\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"tpBtaVersion\",\"type\":\"uint32\"}],\"name\":\"getTpBta\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes\"}],\"name\":\"hasPTCTrustRoot\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"ptcOwnerOid\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"versionNum\",\"type\":\"uint256\"}],\"name\":\"hasPTCVerifyAnchor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"tpbtaLane\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"tpBtaVersion\",\"type\":\"uint32\"}],\"name\":\"hasTpBta\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawRootBcdnsCert\",\"type\":\"bytes\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"monitorVerifierAddr\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"ownerOidToBcdnsDomainSpaceMap\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"ptcTrustRootMap\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"rawPtcTrustRoot\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ptcTypeSupported\",\"outputs\":[{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"ptcType\",\"type\":\"uint8\"}],\"name\":\"removePtcVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMonitorVerifierAddr\",\"type\":\"address\"}],\"name\":\"setMonitorVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"tpBtaMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"latestVersion\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawPtcTrustRoot\",\"type\":\"bytes\"}],\"name\":\"updatePTCTrustRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum PTCTypeEnum\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"verifierMap\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"rawTpProof\",\"type\":\"bytes\"}],\"name\":\"verifyProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"}; public static final String ABI = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", ABI_ARRAY); @@ -52,6 +53,8 @@ public class PtcHub extends Contract { public static final String FUNC_GETLATESTTPBTA = "getLatestTpBta"; + public static final String FUNC_GETMONITORVERIFIER = "getMonitorVerifier"; + public static final String FUNC_GETPTCTRUSTROOT = "getPTCTrustRoot"; public static final String FUNC_GETPTCVERIFYANCHOR = "getPTCVerifyAnchor"; @@ -68,6 +71,8 @@ public class PtcHub extends Contract { public static final String FUNC_INIT = "init"; + public static final String FUNC_MONITORVERIFIERADDR = "monitorVerifierAddr"; + public static final String FUNC_OWNER = "owner"; public static final String FUNC_OWNEROIDTOBCDNSDOMAINSPACEMAP = "ownerOidToBcdnsDomainSpaceMap"; @@ -80,6 +85,8 @@ public class PtcHub extends Contract { public static final String FUNC_RENOUNCEOWNERSHIP = "renounceOwnership"; + public static final String FUNC_SETMONITORVERIFIER = "setMonitorVerifier"; + public static final String FUNC_TPBTAMAP = "tpBtaMap"; public static final String FUNC_TRANSFEROWNERSHIP = "transferOwnership"; @@ -90,48 +97,49 @@ public class PtcHub extends Contract { public static final String FUNC_VERIFYPROOF = "verifyProof"; - public static final Event ADDPTCVERIFIER_EVENT = new Event("AddPtcVerifier", + public static final Event ADDPTCVERIFIER_EVENT = new Event("AddPtcVerifier", Arrays.>asList(new TypeReference() {}, new TypeReference
() {})); ; - public static final Event INITIALIZED_EVENT = new Event("Initialized", + public static final Event INITIALIZED_EVENT = new Event("Initialized", Arrays.>asList(new TypeReference() {})); ; - public static final Event LATESTTPBTA_EVENT = new Event("LatestTpBta", + public static final Event LATESTTPBTA_EVENT = new Event("LatestTpBta", Arrays.>asList(new TypeReference() {}, new TypeReference() {})); ; - public static final Event NEWBCDNSCERT_EVENT = new Event("NewBcdnsCert", + public static final Event NEWBCDNSCERT_EVENT = new Event("NewBcdnsCert", Arrays.>asList(new TypeReference() {})); ; - public static final Event NEWPTRTRUSTROOT_EVENT = new Event("NewPtrTrustRoot", + public static final Event NEWPTRTRUSTROOT_EVENT = new Event("NewPtrTrustRoot", Arrays.>asList(new TypeReference() {})); ; - public static final Event NEWVERIFYANCHOR_EVENT = new Event("NewVerifyAnchor", + public static final Event NEWVERIFYANCHOR_EVENT = new Event("NewVerifyAnchor", Arrays.>asList(new TypeReference() {}, new TypeReference() {})); ; - public static final Event OWNERSHIPTRANSFERRED_EVENT = new Event("OwnershipTransferred", + public static final Event OWNERSHIPTRANSFERRED_EVENT = new Event("OwnershipTransferred", Arrays.>asList(new TypeReference
(true) {}, new TypeReference
(true) {})); ; - public static final Event REMOVEPTCVERIFIER_EVENT = new Event("RemovePtcVerifier", + public static final Event REMOVEPTCVERIFIER_EVENT = new Event("RemovePtcVerifier", Arrays.>asList(new TypeReference() {})); ; - public static final Event SAVETPBTA_EVENT = new Event("SaveTpBta", + public static final Event SAVETPBTA_EVENT = new Event("SaveTpBta", Arrays.>asList(new TypeReference() {}, new TypeReference() {})); ; - public static final Event VERIFYPROOF_EVENT = new Event("VerifyProof", + public static final Event VERIFYPROOF_EVENT = new Event("VerifyProof", Arrays.>asList(new TypeReference() {}, new TypeReference() {})); ; protected PtcHub(String contractAddress, Client client, CryptoKeyPair credential) { super(getBinary(client.getCryptoSuite()), contractAddress, client, credential); + this.transactionManager = new ProxySignTransactionManager(client); } public static String getBinary(CryptoSuite cryptoSuite) { @@ -389,40 +397,40 @@ public void subscribeVerifyProofEvent(EventSubCallback callback) { public TransactionReceipt addPtcVerifier(String verifierContract) { final Function function = new Function( - FUNC_ADDPTCVERIFIER, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(verifierContract)), + FUNC_ADDPTCVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(verifierContract)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodAddPtcVerifierRawFunction(String verifierContract) throws ContractException { - final Function function = new Function(FUNC_ADDPTCVERIFIER, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(verifierContract)), + final Function function = new Function(FUNC_ADDPTCVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(verifierContract)), Arrays.>asList()); return function; } public String getSignedTransactionForAddPtcVerifier(String verifierContract) { final Function function = new Function( - FUNC_ADDPTCVERIFIER, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(verifierContract)), + FUNC_ADDPTCVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(verifierContract)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String addPtcVerifier(String verifierContract, TransactionCallback callback) { final Function function = new Function( - FUNC_ADDPTCVERIFIER, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(verifierContract)), + FUNC_ADDPTCVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(verifierContract)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getAddPtcVerifierInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_ADDPTCVERIFIER, - Arrays.asList(), + final Function function = new Function(FUNC_ADDPTCVERIFIER, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -433,39 +441,39 @@ public Tuple1 getAddPtcVerifierInput(TransactionReceipt transactionRecei public TransactionReceipt addTpBta(byte[] rawTpBta) { final Function function = new Function( - FUNC_ADDTPBTA, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpBta)), + FUNC_ADDTPBTA, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpBta)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodAddTpBtaRawFunction(byte[] rawTpBta) throws ContractException { - final Function function = new Function(FUNC_ADDTPBTA, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpBta)), + final Function function = new Function(FUNC_ADDTPBTA, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpBta)), Arrays.>asList()); return function; } public String getSignedTransactionForAddTpBta(byte[] rawTpBta) { final Function function = new Function( - FUNC_ADDTPBTA, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpBta)), + FUNC_ADDTPBTA, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpBta)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String addTpBta(byte[] rawTpBta, TransactionCallback callback) { final Function function = new Function( - FUNC_ADDTPBTA, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpBta)), + FUNC_ADDTPBTA, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpBta)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getAddTpBtaInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_ADDTPBTA, - Arrays.asList(), + final Function function = new Function(FUNC_ADDTPBTA, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -475,183 +483,197 @@ public Tuple1 getAddTpBtaInput(TransactionReceipt transactionReceipt) { } public byte[] bcdnsCertMap(String param0) throws ContractException { - final Function function = new Function(FUNC_BCDNSCERTMAP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(param0)), + final Function function = new Function(FUNC_BCDNSCERTMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(param0)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodBcdnsCertMapRawFunction(String param0) throws ContractException { - final Function function = new Function(FUNC_BCDNSCERTMAP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(param0)), + final Function function = new Function(FUNC_BCDNSCERTMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(param0)), Arrays.>asList(new TypeReference() {})); return function; } public byte[] getLatestTpBta(byte[] tpbtaLane) throws ContractException { - final Function function = new Function(FUNC_GETLATESTTPBTA, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane)), + final Function function = new Function(FUNC_GETLATESTTPBTA, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodGetLatestTpBtaRawFunction(byte[] tpbtaLane) throws ContractException { - final Function function = new Function(FUNC_GETLATESTTPBTA, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane)), + final Function function = new Function(FUNC_GETLATESTTPBTA, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane)), Arrays.>asList(new TypeReference() {})); return function; } + public String getMonitorVerifier() throws ContractException { + final Function function = new Function(FUNC_GETMONITORVERIFIER, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodGetMonitorVerifierRawFunction() throws ContractException { + final Function function = new Function(FUNC_GETMONITORVERIFIER, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + public byte[] getPTCTrustRoot(byte[] ptcOwnerOid) throws ContractException { - final Function function = new Function(FUNC_GETPTCTRUSTROOT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid)), + final Function function = new Function(FUNC_GETPTCTRUSTROOT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodGetPTCTrustRootRawFunction(byte[] ptcOwnerOid) throws ContractException { - final Function function = new Function(FUNC_GETPTCTRUSTROOT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid)), + final Function function = new Function(FUNC_GETPTCTRUSTROOT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid)), Arrays.>asList(new TypeReference() {})); return function; } public byte[] getPTCVerifyAnchor(byte[] ptcOwnerOid, BigInteger versionNum) throws ContractException { - final Function function = new Function(FUNC_GETPTCVERIFYANCHOR, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(versionNum)), + final Function function = new Function(FUNC_GETPTCVERIFYANCHOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(versionNum)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodGetPTCVerifyAnchorRawFunction(byte[] ptcOwnerOid, BigInteger versionNum) throws ContractException { - final Function function = new Function(FUNC_GETPTCVERIFYANCHOR, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(versionNum)), + final Function function = new Function(FUNC_GETPTCVERIFYANCHOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(versionNum)), Arrays.>asList(new TypeReference() {})); return function; } public List getSupportedPTCType() throws ContractException { - final Function function = new Function(FUNC_GETSUPPORTEDPTCTYPE, - Arrays.asList(), + final Function function = new Function(FUNC_GETSUPPORTEDPTCTYPE, + Arrays.asList(), Arrays.>asList(new TypeReference>() {})); List result = (List) executeCallWithSingleValueReturn(function, List.class); return convertToNative(result); } public Function getMethodGetSupportedPTCTypeRawFunction() throws ContractException { - final Function function = new Function(FUNC_GETSUPPORTEDPTCTYPE, - Arrays.asList(), + final Function function = new Function(FUNC_GETSUPPORTEDPTCTYPE, + Arrays.asList(), Arrays.>asList(new TypeReference>() {})); return function; } public byte[] getTpBta(byte[] tpbtaLane, BigInteger tpBtaVersion) throws ContractException { - final Function function = new Function(FUNC_GETTPBTA, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(tpBtaVersion)), + final Function function = new Function(FUNC_GETTPBTA, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(tpBtaVersion)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodGetTpBtaRawFunction(byte[] tpbtaLane, BigInteger tpBtaVersion) throws ContractException { - final Function function = new Function(FUNC_GETTPBTA, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(tpBtaVersion)), + final Function function = new Function(FUNC_GETTPBTA, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(tpBtaVersion)), Arrays.>asList(new TypeReference() {})); return function; } public Boolean hasPTCTrustRoot(byte[] ptcOwnerOid) throws ContractException { - final Function function = new Function(FUNC_HASPTCTRUSTROOT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid)), + final Function function = new Function(FUNC_HASPTCTRUSTROOT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, Boolean.class); } public Function getMethodHasPTCTrustRootRawFunction(byte[] ptcOwnerOid) throws ContractException { - final Function function = new Function(FUNC_HASPTCTRUSTROOT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid)), + final Function function = new Function(FUNC_HASPTCTRUSTROOT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid)), Arrays.>asList(new TypeReference() {})); return function; } public Boolean hasPTCVerifyAnchor(byte[] ptcOwnerOid, BigInteger versionNum) throws ContractException { - final Function function = new Function(FUNC_HASPTCVERIFYANCHOR, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(versionNum)), + final Function function = new Function(FUNC_HASPTCVERIFYANCHOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(versionNum)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, Boolean.class); } public Function getMethodHasPTCVerifyAnchorRawFunction(byte[] ptcOwnerOid, BigInteger versionNum) throws ContractException { - final Function function = new Function(FUNC_HASPTCVERIFYANCHOR, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(versionNum)), + final Function function = new Function(FUNC_HASPTCVERIFYANCHOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(ptcOwnerOid), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(versionNum)), Arrays.>asList(new TypeReference() {})); return function; } public Boolean hasTpBta(byte[] tpbtaLane, BigInteger tpBtaVersion) throws ContractException { - final Function function = new Function(FUNC_HASTPBTA, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(tpBtaVersion)), + final Function function = new Function(FUNC_HASTPBTA, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(tpBtaVersion)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, Boolean.class); } public Function getMethodHasTpBtaRawFunction(byte[] tpbtaLane, BigInteger tpBtaVersion) throws ContractException { - final Function function = new Function(FUNC_HASTPBTA, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(tpBtaVersion)), + final Function function = new Function(FUNC_HASTPBTA, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(tpbtaLane), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint32(tpBtaVersion)), Arrays.>asList(new TypeReference() {})); return function; } public TransactionReceipt init(byte[] rawRootBcdnsCert) { final Function function = new Function( - FUNC_INIT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawRootBcdnsCert)), + FUNC_INIT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawRootBcdnsCert)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodInitRawFunction(byte[] rawRootBcdnsCert) throws ContractException { - final Function function = new Function(FUNC_INIT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawRootBcdnsCert)), + final Function function = new Function(FUNC_INIT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawRootBcdnsCert)), Arrays.>asList()); return function; } public String getSignedTransactionForInit(byte[] rawRootBcdnsCert) { final Function function = new Function( - FUNC_INIT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawRootBcdnsCert)), + FUNC_INIT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawRootBcdnsCert)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String init(byte[] rawRootBcdnsCert, TransactionCallback callback) { final Function function = new Function( - FUNC_INIT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawRootBcdnsCert)), + FUNC_INIT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawRootBcdnsCert)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getInitInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_INIT, - Arrays.asList(), + final Function function = new Function(FUNC_INIT, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -660,100 +682,114 @@ public Tuple1 getInitInput(TransactionReceipt transactionReceipt) { ); } + public String monitorVerifierAddr() throws ContractException { + final Function function = new Function(FUNC_MONITORVERIFIERADDR, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodMonitorVerifierAddrRawFunction() throws ContractException { + final Function function = new Function(FUNC_MONITORVERIFIERADDR, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + public String owner() throws ContractException { - final Function function = new Function(FUNC_OWNER, - Arrays.asList(), + final Function function = new Function(FUNC_OWNER, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return executeCallWithSingleValueReturn(function, String.class); } public Function getMethodOwnerRawFunction() throws ContractException { - final Function function = new Function(FUNC_OWNER, - Arrays.asList(), + final Function function = new Function(FUNC_OWNER, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return function; } public String ownerOidToBcdnsDomainSpaceMap(byte[] param0) throws ContractException { - final Function function = new Function(FUNC_OWNEROIDTOBCDNSDOMAINSPACEMAP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), + final Function function = new Function(FUNC_OWNEROIDTOBCDNSDOMAINSPACEMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, String.class); } public Function getMethodOwnerOidToBcdnsDomainSpaceMapRawFunction(byte[] param0) throws ContractException { - final Function function = new Function(FUNC_OWNEROIDTOBCDNSDOMAINSPACEMAP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), + final Function function = new Function(FUNC_OWNEROIDTOBCDNSDOMAINSPACEMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), Arrays.>asList(new TypeReference() {})); return function; } public byte[] ptcTrustRootMap(byte[] param0) throws ContractException { - final Function function = new Function(FUNC_PTCTRUSTROOTMAP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), + final Function function = new Function(FUNC_PTCTRUSTROOTMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodPtcTrustRootMapRawFunction(byte[] param0) throws ContractException { - final Function function = new Function(FUNC_PTCTRUSTROOTMAP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), + final Function function = new Function(FUNC_PTCTRUSTROOTMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), Arrays.>asList(new TypeReference() {})); return function; } public BigInteger ptcTypeSupported(BigInteger param0) throws ContractException { - final Function function = new Function(FUNC_PTCTYPESUPPORTED, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param0)), + final Function function = new Function(FUNC_PTCTYPESUPPORTED, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param0)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, BigInteger.class); } public Function getMethodPtcTypeSupportedRawFunction(BigInteger param0) throws ContractException { - final Function function = new Function(FUNC_PTCTYPESUPPORTED, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param0)), + final Function function = new Function(FUNC_PTCTYPESUPPORTED, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(param0)), Arrays.>asList(new TypeReference() {})); return function; } public TransactionReceipt removePtcVerifier(BigInteger ptcType) { final Function function = new Function( - FUNC_REMOVEPTCVERIFIER, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(ptcType)), + FUNC_REMOVEPTCVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(ptcType)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodRemovePtcVerifierRawFunction(BigInteger ptcType) throws ContractException { - final Function function = new Function(FUNC_REMOVEPTCVERIFIER, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(ptcType)), + final Function function = new Function(FUNC_REMOVEPTCVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(ptcType)), Arrays.>asList()); return function; } public String getSignedTransactionForRemovePtcVerifier(BigInteger ptcType) { final Function function = new Function( - FUNC_REMOVEPTCVERIFIER, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(ptcType)), + FUNC_REMOVEPTCVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(ptcType)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String removePtcVerifier(BigInteger ptcType, TransactionCallback callback) { final Function function = new Function( - FUNC_REMOVEPTCVERIFIER, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(ptcType)), + FUNC_REMOVEPTCVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(ptcType)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getRemovePtcVerifierInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_REMOVEPTCVERIFIER, - Arrays.asList(), + final Function function = new Function(FUNC_REMOVEPTCVERIFIER, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -764,85 +800,129 @@ public Tuple1 getRemovePtcVerifierInput(TransactionReceipt transacti public TransactionReceipt renounceOwnership() { final Function function = new Function( - FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodRenounceOwnershipRawFunction() throws ContractException { - final Function function = new Function(FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + final Function function = new Function(FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), Arrays.>asList()); return function; } public String getSignedTransactionForRenounceOwnership() { final Function function = new Function( - FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String renounceOwnership(TransactionCallback callback) { final Function function = new Function( - FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public TransactionReceipt setMonitorVerifier(String newMonitorVerifierAddr) { + final Function function = new Function( + FUNC_SETMONITORVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorVerifierAddr)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSetMonitorVerifierRawFunction(String newMonitorVerifierAddr) throws + ContractException { + final Function function = new Function(FUNC_SETMONITORVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorVerifierAddr)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForSetMonitorVerifier(String newMonitorVerifierAddr) { + final Function function = new Function( + FUNC_SETMONITORVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorVerifierAddr)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String setMonitorVerifier(String newMonitorVerifierAddr, TransactionCallback callback) { + final Function function = new Function( + FUNC_SETMONITORVERIFIER, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorVerifierAddr)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } + public Tuple1 getSetMonitorVerifierInput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SETMONITORVERIFIER, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (String) results.get(0).getValue() + ); + } + public BigInteger tpBtaMap(byte[] param0) throws ContractException { - final Function function = new Function(FUNC_TPBTAMAP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), + final Function function = new Function(FUNC_TPBTAMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, BigInteger.class); } public Function getMethodTpBtaMapRawFunction(byte[] param0) throws ContractException { - final Function function = new Function(FUNC_TPBTAMAP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), + final Function function = new Function(FUNC_TPBTAMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(param0)), Arrays.>asList(new TypeReference() {})); return function; } public TransactionReceipt transferOwnership(String newOwner) { final Function function = new Function( - FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodTransferOwnershipRawFunction(String newOwner) throws ContractException { - final Function function = new Function(FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + final Function function = new Function(FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Arrays.>asList()); return function; } public String getSignedTransactionForTransferOwnership(String newOwner) { final Function function = new Function( - FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String transferOwnership(String newOwner, TransactionCallback callback) { final Function function = new Function( - FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getTransferOwnershipInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_TRANSFEROWNERSHIP, - Arrays.asList(), + final Function function = new Function(FUNC_TRANSFEROWNERSHIP, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -853,40 +933,40 @@ public Tuple1 getTransferOwnershipInput(TransactionReceipt transactionRe public TransactionReceipt updatePTCTrustRoot(byte[] rawPtcTrustRoot) { final Function function = new Function( - FUNC_UPDATEPTCTRUSTROOT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawPtcTrustRoot)), + FUNC_UPDATEPTCTRUSTROOT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawPtcTrustRoot)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodUpdatePTCTrustRootRawFunction(byte[] rawPtcTrustRoot) throws ContractException { - final Function function = new Function(FUNC_UPDATEPTCTRUSTROOT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawPtcTrustRoot)), + final Function function = new Function(FUNC_UPDATEPTCTRUSTROOT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawPtcTrustRoot)), Arrays.>asList()); return function; } public String getSignedTransactionForUpdatePTCTrustRoot(byte[] rawPtcTrustRoot) { final Function function = new Function( - FUNC_UPDATEPTCTRUSTROOT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawPtcTrustRoot)), + FUNC_UPDATEPTCTRUSTROOT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawPtcTrustRoot)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String updatePTCTrustRoot(byte[] rawPtcTrustRoot, TransactionCallback callback) { final Function function = new Function( - FUNC_UPDATEPTCTRUSTROOT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawPtcTrustRoot)), + FUNC_UPDATEPTCTRUSTROOT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawPtcTrustRoot)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getUpdatePTCTrustRootInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_UPDATEPTCTRUSTROOT, - Arrays.asList(), + final Function function = new Function(FUNC_UPDATEPTCTRUSTROOT, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -896,54 +976,54 @@ public Tuple1 getUpdatePTCTrustRootInput(TransactionReceipt transactionR } public String verifierMap(BigInteger param0) throws ContractException { - final Function function = new Function(FUNC_VERIFIERMAP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(param0)), + final Function function = new Function(FUNC_VERIFIERMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(param0)), Arrays.>asList(new TypeReference
() {})); return executeCallWithSingleValueReturn(function, String.class); } public Function getMethodVerifierMapRawFunction(BigInteger param0) throws ContractException { - final Function function = new Function(FUNC_VERIFIERMAP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(param0)), + final Function function = new Function(FUNC_VERIFIERMAP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(param0)), Arrays.>asList(new TypeReference
() {})); return function; } public TransactionReceipt verifyProof(byte[] rawTpProof) { final Function function = new Function( - FUNC_VERIFYPROOF, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpProof)), + FUNC_VERIFYPROOF, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpProof)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodVerifyProofRawFunction(byte[] rawTpProof) throws ContractException { - final Function function = new Function(FUNC_VERIFYPROOF, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpProof)), + final Function function = new Function(FUNC_VERIFYPROOF, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpProof)), Arrays.>asList()); return function; } public String getSignedTransactionForVerifyProof(byte[] rawTpProof) { final Function function = new Function( - FUNC_VERIFYPROOF, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpProof)), + FUNC_VERIFYPROOF, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpProof)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String verifyProof(byte[] rawTpProof, TransactionCallback callback) { final Function function = new Function( - FUNC_VERIFYPROOF, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpProof)), + FUNC_VERIFYPROOF, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(rawTpProof)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getVerifyProofInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_VERIFYPROOF, - Arrays.asList(), + final Function function = new Function(FUNC_VERIFYPROOF, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( diff --git a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/SDPMsg.java b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/SDPMsg.java index 4b66ffa6..87b042bc 100644 --- a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/SDPMsg.java +++ b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos/abi/SDPMsg.java @@ -25,7 +25,9 @@ import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple2; import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple3; import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple4; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple5; import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple6; +import org.fisco.bcos.sdk.v3.codec.datatypes.generated.tuples.generated.Tuple7; import org.fisco.bcos.sdk.v3.contract.Contract; import org.fisco.bcos.sdk.v3.crypto.CryptoSuite; import org.fisco.bcos.sdk.v3.crypto.keypair.CryptoKeyPair; @@ -33,19 +35,20 @@ import org.fisco.bcos.sdk.v3.model.CryptoType; import org.fisco.bcos.sdk.v3.model.TransactionReceipt; import org.fisco.bcos.sdk.v3.model.callback.TransactionCallback; +import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.ProxySignTransactionManager; import org.fisco.bcos.sdk.v3.transaction.model.exception.ContractException; @SuppressWarnings("unchecked") public class SDPMsg extends Contract { - public static final String[] BINARY_ARRAY = {"60806040523480156200001157600080fd5b506200001d336200002d565b620000276200007d565b6200014c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a81b900460ff1615620000ec5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff600160a01b909104811610156200014a576000805460ff60a01b191660ff60a01b17905560405160ff81527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b615bc3806200015c6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063838a102c116100ad578063c09b261b11610071578063c09b261b14610275578063c1cecc5a14610288578063e1c7392a1461029b578063f2fde38b146102a3578063f76f703b146102b657600080fd5b8063838a102c1461020b5780638da5cb5b1461021e57806391198fcd1461022f578063a9d662af14610242578063b5db295a1461025557600080fd5b806360e8b9c9116100f457806360e8b9c9146101a55780636e109afe146101b8578063715018a6146101cb578063762f3d6e146101d35780638037d45e146101e657600080fd5b806305ca8da6146101315780630d9ae9e514610157578063203c2c851461017f5780633ac6dfb11461019457806356cb2d021461019c575b600080fd5b61014461013f366004614f30565b6102c9565b6040519081526020015b60405180910390f35b61016a610165366004614fbc565b610474565b60405163ffffffff909116815260200161014e565b61019261018d36600461503d565b61052e565b005b600254610144565b61014460025481565b6101926101b3366004615088565b61084f565b6101446101c63660046150b1565b6108f1565b610192610b1e565b6101446101e13660046150b1565b610b54565b6001546001600160a01b03165b6040516001600160a01b03909116815260200161014e565b6101926102193660046151a2565b610ceb565b6000546001600160a01b03166101f3565b61014461023d366004614f30565b610d44565b6001546101f3906001600160a01b031681565b61026861026336600461523a565b610e70565b60405161014e91906152d3565b610192610283366004615330565b610fb2565b610192610296366004615330565b611197565b610192611294565b6101926102b1366004615088565b6113c1565b6101926102c4366004615330565b611459565b6000604080516101208101825260028152600060208083018290528351601f8b0182900482028101820185528a81529193830191908b908b90819084018382808284376000920191909152505050908252506020810188905260400186610331576000610334565b60015b60ff16815260200161037f8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503392508c91506115a89050565b63ffffffff166001600160401b0316815260200163ffffffff8016815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810190925292835290920152506002549091506103fb908290611608565b6001546001600160a01b031663e41fb517336104168461180f565b6040518363ffffffff1660e01b81526004016104339291906153a9565b600060405180830381600087803b15801561044d57600080fd5b505af1158015610461573d6000803e3d6000fd5b5050505060200151979650505050505050565b6000600254848460405160200161048c9291906153d5565b60405160208183030381529060405280519060200120146104c85760405162461bcd60e51b81526004016104bf906153e5565b60405180910390fd5b600061050d88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250879150611a839050565b60009081526004602052604090205463ffffffff1698975050505050505050565b6000546001600160a01b031633146105585760405162461bcd60e51b81526004016104bf9061541c565b610560614e7f565b6105a283838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508593925050611ae09050565b60e081015160ff1661060d5760405162461bcd60e51b815260206004820152602e60248201527f5344505f4d53475f4552524f523a20746865206d6573736167652074696d656f60448201526d075744d65617375726520697320360941b60648201526084016104bf565b8060e0015160ff16600214156107ee5780610100015160076000836040015160405160200161063c9190615451565b6040516020818303038152906040528051906020012081526020019081526020016000206003015411156107805760208082015160009081526008909152604090205460ff166106eb5760405162461bcd60e51b815260206004820152603460248201527f5344505f4d53475f4552524f523a20657863657074696f6e206d657373616765604482015273081a185cda08191bd95cc81b9bdd08195e1a5cdd60621b60648201526084016104bf565b6106f484611c9a565b6001600160a01b031663f6d750e48260200151836040015184606001518560c001518660a001518761012001518861014001516040518863ffffffff1660e01b8152600401610749979695949392919061546d565b600060405180830381600087803b15801561076357600080fd5b505af1158015610777573d6000803e3d6000fd5b50505050610849565b60405162461bcd60e51b815260206004820152603f60248201527f5344505f4d53475f4552524f523a20746865206d657373616765206973206e6f60448201527f742074696d656f757420776974682074696d656f75744d65617375726520320060648201526084016104bf565b60405162461bcd60e51b815260206004820152602a60248201527f5344505f4d53475f4552524f523a20756e737570706f727465642074696d656f6044820152697574206d65617375726560b01b60648201526084016104bf565b50505050565b6000546001600160a01b031633146108795760405162461bcd60e51b81526004016104bf9061541c565b6001600160a01b0381166108cf5760405162461bcd60e51b815260206004820152601b60248201527f5344504d73673a20696e76616c696420616d20636f6e7472616374000000000060448201526064016104bf565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000600460ff841611156109475760405162461bcd60e51b815260206004820152601c60248201527f5344503a20696e76616c69642074696d656f7574206d6561737572650000000060448201526064016104bf565b604080516101608101825260038152600060208083018290528351601f8d0182900482028101820185528c81528b949293928301918e908e908190840183828082843760009201919091525050509082525060208101849052604001896109af5760006109b2565b60015b60ff1681526020016001600160401b0380168152602001610a0c8d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250339250889150611ccd9050565b63ffffffff1681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181019092529283529092015250600254909150610a82908290611d02565b6020808201516000908152600890915260409020805460ff19166001908117909155546001600160a01b031663e41fb51733610abd84611f66565b6040518363ffffffff1660e01b8152600401610ada9291906153a9565b600060405180830381600087803b158015610af457600080fd5b505af1158015610b08573d6000803e3d6000fd5b50505050602001519a9950505050505050505050565b6000546001600160a01b03163314610b485760405162461bcd60e51b81526004016104bf9061541c565b610b52600061226c565b565b6000600460ff84161115610baa5760405162461bcd60e51b815260206004820152601c60248201527f5344503a20696e76616c69642074696d656f7574206d6561737572650000000060448201526064016104bf565b604080516101608101825260038152600060208083018290528351601f8d0182900482028101820185528c81528b949293928301918e908e90819084018382808284376000920191909152505050908252506020810184905260400189610c12576000610c15565b60015b60ff168152602001610c608d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503392508891506115a89050565b63ffffffff166001600160401b0316815260200163ffffffff801681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181019092529283529092015250600254909150610a82908290611d02565b6000546001600160a01b03163314610d155760405162461bcd60e51b81526004016104bf9061541c565b80604051602001610d269190615451565b60408051601f19818403018152919052805160209091012060025550565b6000604080516101208101825260028152600060208083018290528351601f8b0182900482028101820185528a81529193830191908b908b90819084018382808284376000920191909152505050908252506020810188905260400186610dac576000610daf565b60015b60ff1681526020016001600160401b0380168152602001610e098a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503392508c9150611ccd9050565b63ffffffff16815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810190925292835290920152506002549091506103fb908290611608565b6040805160a0810182526000808252606060208301819052928201819052918101829052608081019190915260076000848460","4051602001610eb39291906153d5565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825160a08101909352805461ffff1683526001810180549192840191610eff906154db565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2b906154db565b8015610f785780601f10610f4d57610100808354040283529160200191610f78565b820191906000526020600020905b815481529060010190602001808311610f5b57829003601f168201915b505050918352505060028201546020820152600382015460408201526004909101546001600160401b031660609091015290505b92915050565b6001546001600160a01b0316331461100c5760405162461bcd60e51b815260206004820152601d60248201527f5344504d73673a206e6f742076616c696420616d20636f6e747261637400000060448201526064016104bf565b600061104d83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122bc92505050565b90508063ffffffff16600114156110a5576110a086868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061232192505050565b61118f565b8063ffffffff16600214156110f6576110a086868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123c792505050565b8063ffffffff1660031415611147576110a086868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061250992505050565b60405162461bcd60e51b815260206004820152601760248201527f756e737570706f72746564207364702076657273696f6e00000000000000000060448201526064016104bf565b505050505050565b6040805160a06020601f88018190040282018101909252608081018681526000928291908990899081908501838280828437600092019190915250505090825250602080820187905260408051601f8701839004830281018301825286815292019190869086908190840183828082843760009201919091525050509082525063ffffffff6020909101526001549091506001600160a01b031663e41fb517336112408461266c565b6040518363ffffffff1660e01b815260040161125d9291906153a9565b600060405180830381600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b5050505061118f565b600054600160a81b900460ff16158080156112bc57506000546001600160a01b90910460ff16105b806112dd5750303b1580156112dd5750600054600160a01b900460ff166001145b6113405760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104bf565b6000805460ff60a01b1916600160a01b179055801561136d576000805460ff60a81b1916600160a81b1790555b6113763361226c565b80156113be576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6000546001600160a01b031633146113eb5760405162461bcd60e51b81526004016104bf9061541c565b6001600160a01b0381166114505760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104bf565b6113be8161226c565b6040805160a06020601f88018190040282018101909252608081018681526000928291908990899081908501838280828437600092019190915250505090825250602080820187905260408051601f87018390048302810183018252868152920191908690869081908401838280828437600092019190915250505090825250604080516020601f8a018190048102820181019092528881529181019161151e918a908a90819084018382808284376000920191909152503392508a9150611ccd9050565b63ffffffff169052905060006115338261266c565b60015460405163e41fb51760e01b81529192506001600160a01b03169063e41fb5179061156690339085906004016153a9565b600060405180830381600087803b15801561158057600080fd5b505af1158015611594573d6000803e3d6000fd5b5050505050505050505050565b5050505050565b6000806115b6858585612787565b6000818152600560205260408120805492935063ffffffff9092169182916115dd83615526565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b816000015163ffffffff166002146116325760405162461bcd60e51b81526004016104bf9061554a565b63ffffffff8260e0015151111561165b5760405162461bcd60e51b81526004016104bf90615581565b60008260e0015151836040015151607961167591906155c8565b61167f91906155c8565b90506000816001600160401b0381111561169b5761169b615160565b6040519080825280601f01601f1916602001820160405280156116c5576020820181803683370190505b50845190915082906116ed9082906116e19063ff0000006155e0565b63ffffffff1690840152565b6116f760206127f6565b6117019082615608565b6040860151909150611714828285612a25565b80516117219060046155c8565b61172b9083615608565b6060870151818501529150611741602083615608565b915061175282876080015185612b13565b61175d600183615608565b915061176e828760a0015185612b24565b61177860406127f6565b6117829083615608565b9150611793828760c0015185612b35565b61179d60206127f6565b6117a79083615608565b91506117b8828760e0015185612a25565b60e0860151516117c99060046155c8565b6117d39083615608565b338185015291506117e5602083615608565b80840186905291506117f8602083615608565b505081516020928301209490910193909352505050565b6060816000015163ffffffff1660021461183b5760405162461bcd60e51b81526004016104bf9061554a565b63ffffffff8260e001515111156118645760405162461bcd60e51b81526004016104bf90615581565b60208201516118855760405162461bcd60e51b81526004016104bf9061561f565b6080820151600090600260ff9091161180156118df576101008401515160e0850151516040860151516118b99060596155c8565b6118c391906155c8565b6118ce9060046155c8565b6118d891906155c8565b9150611903565b60e0840151516040850151516118f69060596155c8565b61190091906155c8565b91505b6000826001600160401b0381111561191d5761191d615160565b6040519080825280601f01601f191660200182016040528015611947576020820181803683370190505b50855190915083906119639082906116e19063ff0000006155e0565b61196d60206127f6565b6119779082615608565b6020878101518285015290915061198e9082615608565b60408701519091506119a1828285612a25565b80516119ae9060046155c8565b6119b89083615608565b60608801518185015291506119ce602083615608565b91506119df82886080015185612b13565b6119ea600183615608565b91506119fb828860a0015185612b24565b611a0560406127f6565b611a0f9083615608565b9150611a20828860c0015185612b35565b611a2a60206127f6565b611a349083615608565b9150611a45828860e0015185612a25565b60e087015151611a569060046155c8565b611a609083615608565b91508315611a7857611a788288610100015185612a25565b509095945050505050565b600083604051602001611a969190615451565b60408051601f198184030181528282528051602091820120908301528101849052606081018390526080016040516020818303038152906040528051906020012090509392505050565b8051611aeb826122bc565b63ffffffff168352611afd6020612b46565b611b079082615608565b9050611b138183015190565b6020840152611b20602090565b611b2d9060ff1682615608565b90506000611b3b8284612b51565b604085018190528051909150611b529060046155c8565b611b5c9083615608565b9150611b688284015190565b6060850152611b78602083615608565b9150611b848284015190565b60ff166080850152611b97600183615608565b9150611ba38284015190565b6001600160401b031660a0850152611bbc600883615608565b9150611bc88284015190565b63ffffffff1660c0850152611bde600483615608565b9150611bea8284015190565b60ff1660e0850152611bfd600183615608565b91506000611c0b8385612b51565b9050611c1681612c57565b6101008601528051611c299060046155c8565b611c339084615608565b9250611c3f8385612b51565b610120860181905251611c539060046155c8565b611c5d9084615608565b9250600260ff16856080015160ff1611156115a157611c7c8385612b51565b610140860181905251611c909060046155c8565b61118f9084615608565b604080516020808252818301909252600091829190602082018180368337505050602081018490529050825b9392505050565b600080611cdb858585612787565b6000818152600360205260408120805492935063ffffffff9092169182916115dd83615526565b816000015163ffffffff16600314611d2c5760405162461bcd60e51b81526004016104bf9061554a565b63ffffffff826101200151511115611d565760405162461bcd60e51b81526004016104bf90615581565b6000611d66836101000151612d13565b90506000815184610120015151856040015151607e611d8591906155c8565b611d8f91906155c8565b611d9991906155c8565b90506000816001600160401b03811115611db557611db5615160565b6040519080825280601f01601f191660200182016040528015611ddf576020820181803683370190505b5085519091508290611e01908290611dfb9063ff0000006155e0565b84612b35565b611e0b60206127f6565b611e159082615608565b6040870151909150611e28828285612a25565b8051611e359060046155c8565b611e3f9083615608565b6060880151818501529150611e55602083615608565b9150611e6682886080015185612b13565b611e71600183615608565b9150611e82828860a0015185612b24565b611e8c60406127f6565b611e969083615608565b9150611ea7828860c001518561","2b35565b611eb160206127f6565b611ebb9083615608565b9150611ecc828860e0015185612b13565b611ed7600183615608565b9150611ee4828685612a25565b8451611ef19060046155c8565b611efb9083615608565b9150611f0d8288610120015185612a25565b61012087015151611f1f9060046155c8565b611f299083615608565b33818501529150611f3b602083615608565b8084018790529150611f4e602083615608565b50508151602092830120959091019490945250505050565b6060816000015163ffffffff16600314611f925760405162461bcd60e51b81526004016104bf9061554a565b63ffffffff826101200151511115611fbc5760405162461bcd60e51b81526004016104bf90615581565b6020820151611fdd5760405162461bcd60e51b81526004016104bf9061561f565b600080600260ff16846080015160ff161190506000612000856101000151612d13565b90508115612059576101408501515181516101208701515160408801515161202990605e6155c8565b61203391906155c8565b61203d91906155c8565b6120489060046155c8565b61205291906155c8565b925061208a565b80516101208601515160408701515161207390605e6155c8565b61207d91906155c8565b61208791906155c8565b92505b6000836001600160401b038111156120a4576120a4615160565b6040519080825280601f01601f1916602001820160405280156120ce576020820181803683370190505b50865190915084906120ea908290611dfb9063ff0000006155e0565b6120f460206127f6565b6120fe9082615608565b602088810151828501529091506121159082615608565b6040880151909150612128828285612a25565b80516121359060046155c8565b61213f9083615608565b6060890151818501529150612155602083615608565b915061216682896080015185612b13565b612171600183615608565b9150612182828960a0015185612b24565b61218c60406127f6565b6121969083615608565b91506121a7828960c0015185612b35565b6121b160206127f6565b6121bb9083615608565b91506121cc828960e0015185612b13565b6121d7600183615608565b91506121e4828585612a25565b83516121f19060046155c8565b6121fb9083615608565b915061220d8289610120015185612a25565b6101208801515161221f9060046155c8565b6122299083615608565b91508415612260576122418289610140015185612a25565b610140880151516122539060046155c8565b61225d9083615608565b91505b50909695505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8051601c81830101516000916001600160f81b03198083161415612317576040805160048082528183019092526000918291906020820181803683370190505095909201601d01516021860152505050600490910151919050565b5060019392505050565b60408051608081018252606080825260006020830181905292820181905281019190915261234f8183612dad565b60025481516040516123649190602001615451565b60405160208183030381529060405280519060200120146123975760405162461bcd60e51b81526004016104bf906153e5565b606081015163ffffffff90811614156123bb576123b685858584612f1e565b6115a1565b6115a185858584612f94565b604080516101208101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c082015260e0810182905261010081019190915261241981836131b1565b60025481604001516040516020016124319190615451565b60405160208183030381529060405280519060200120146124645760405162461bcd60e51b81526004016104bf906153e5565b608081015160ff16158061247f5750608081015160ff166001145b15612490576123b685858584613303565b608081015160ff16600214156124ac576123b6858585846134c0565b608081015160ff16600314156124c8576123b6858585846135ae565b60405162461bcd60e51b8152602060048201526016602482015275756e65787065637465642061746f6d696320666c616760501b60448201526064016104bf565b612511614e7f565b61251b8183611ae0565b60025481604001516040516020016125339190615451565b60405160208183030381529060405280519060200120146125965760405162461bcd60e51b815260206004820152601f60248201527f5344505f4d73673a2077726f6e6720726563656976696e6720646f6d61696e0060448201526064016104bf565b608081015160ff1615806125b15750608081015160ff166001145b156125c2576123b68585858461369b565b608081015160ff16600214156125de576123b685858584613918565b608081015160ff16600314156125fa576123b685858584613a43565b608081015160ff1660041415612616576123b685858584613b1f565b60405162461bcd60e51b815260206004820152602560248201527f5344505f4d53475f4552524f523a20756e65787065637465642061746f6d696360448201526420666c616760d81b60648201526084016104bf565b6060600061267d8360000151613ce3565b61268a8460400151613ce3565b6126959060046155c8565b6126a09060206155c8565b6126aa91906155c8565b90506000816001600160401b038111156126c6576126c6615160565b6040519080825280601f01601f1916602001820160405280156126f0576020820181803683370190505b508451909150829061270490829084613d2f565b845161270f90613ce3565b6127199082615608565b602086810151828501529091506127309082615608565b905061274181866060015184612b35565b61274b6020612b46565b6127559082615608565b905061276681866040015184613d2f565b6127738560400151613ce3565b61277d9082615608565b5090949350505050565b60008061279384613d8d565b905080856040516020016127a79190615451565b60408051601f1981840301815282825280516020918201209083019390935281019190915260608101849052608001604051602081830303815290604052805190602001209150509392505050565b60008160088114612903576010811461290c5760188114612915576020811461291e5760288114612927576030811461293057603881146129395760408114612942576048811461294b5760508114612954576058811461295d5760608114612966576068811461296f57607081146129785760788114612981576080811461298a5760888114612993576090811461299c57609881146129a55760a081146129ae5760a881146129b75760b081146129c05760b881146129c95760c081146129d25760c881146129db5760d081146129e45760d881146129ed5760e081146129f65760e881146129ff5760f08114612a085760f88114612a11576101008114612a1a5760209150612a1f565b60019150612a1f565b60029150612a1f565b60039150612a1f565b60049150612a1f565b60059150612a1f565b60069150612a1f565b60079150612a1f565b60089150612a1f565b60099150612a1f565b600a9150612a1f565b600b9150612a1f565b600c9150612a1f565b600d9150612a1f565b600e9150612a1f565b600f9150612a1f565b60109150612a1f565b60119150612a1f565b60129150612a1f565b60139150612a1f565b60149150612a1f565b60159150612a1f565b60169150612a1f565b60179150612a1f565b60189150612a1f565b60199150612a1f565b601a9150612a1f565b601b9150612a1f565b601c9150612a1f565b601d9150612a1f565b601e9150612a1f565b601f9150612a1f565b602091505b50919050565b8151612a32848284612b35565b612a3d600485615608565b93508063ffffffff16841015612ab05760405162461bcd60e51b815260206004820152603260248201527f7661724279746573546f42797465733a206f6666736574206c657373207468616044820152710dc40e8d0ca40d2dce0eae840d8cadccee8d60731b60648201526084016104bf565b612ac063ffffffff821685615608565b935080158015612acf576115a1565b8483018051601f84168015602002818801018581018215602002838601015b81831015612b06578251815260209283019201612aee565b5050509152505050505050565b909101600019810180519290915252565b909101600719810180519290915252565b909101600319810180519290915252565b6000610fac826127f6565b60606000612b5f8484015190565b63ffffffff169050612b72600485615608565b935083811115612bdd5760405162461bcd60e51b815260206004820152603060248201527f6279746573546f56617242797465733a206f6666736574206c6573732074686160448201526f6e206c656e677468206f6620626f647960801b60648201526084016104bf565b612be78185615608565b9350606081158015612c0457604051915060208201604052612c4e565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015612c3d578051835260209283019201612c25565b5050848452601f01601f1916604052505b50949350505050565b80516000906020811115612cb95760405162461bcd60e51b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b60648201526084016104bf565b6000816001600160401b03811115612cd357612cd3615160565b6040519080825280601f01601f191660200182016040528015612cfd576020820181803683370190505b5084518152938201519190930151900392915050565b60408051602080825281830190925260609160009190602082018180368337505060408051602080825281830190925292935060009291508082018180368337019050509050606084602084015260015b6020811015612c4e578060208501035181602085010351808203612da35760405193506020860151838501528284528260208501016040525050612c4e565b5050600101612d64565b80516000612dbb8284015190565b612dc69060206155e0565b905060008163ffffffff166001600160401b03811115612de857612de8615160565b6040519080825280601f01601f191660200182016040528015612e12576020820181803683370190505b509050612e20838583613dbb565b612e2981613ce3565b612e339084615608565b92506000612e418486015190565b9050612e4e602085615608565b93506000612e5c8587015190565b9050612e6860206127f6565b612e729086615608565b94506000612e808688015190565b612e8b9060206155e0565b905060008163ffffffff166001600160401b03811115612e","ad57612ead615160565b6040519080825280601f01601f191660200182016040528015612ed7576020820181803683370190505b509050612ee5878983613dbb565b612eee81613ce3565b612ef89088615608565b5093885250602087019190915263ffffffff166060860152604090940193909352505050565b612f2781613dfa565b6001600160a01b031663ff098be785858585604001516040518563ffffffff1660e01b8152600401612f5c9493929190615689565b600060405180830381600087803b158015612f7657600080fd5b505af1158015612f8a573d6000803e3d6000fd5b5050505050505050565b6000612fdb85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506020850151869150613e09565b90508063ffffffff16826060015163ffffffff161461303c5760405162461bcd60e51b815260206004820152601a60248201527f5344504d73673a2073657175656e6365206e6f7420657175616c00000000000060448201526064016104bf565b60006060600061304b85613dfa565b90506001600160a01b0381163b613094576000925060405180604001604052806014815260200173726563656976657220686173206e6f20636f646560601b8152509150613164565b604080860151905163c09b261b60e01b81526001600160a01b0383169163c09b261b916130c9918c918c918c91600401615689565b600060405180830381600087803b1580156130e357600080fd5b505af19250505080156130f4575060015b61315f576131006156c0565b806308c379a0141561312757506131156156dc565b806131205750613129565b9150613164565b505b3d808015613153576040519150601f19603f3d011682016040523d82523d6000602084013e613158565b606091505b5050613164565b600192505b7f5c739d2e6f1ca8bbfc6b71f12b702b9c87e02646edd83b3600d624abb67fab048888888488888860405161319f979695949392919061575a565b60405180910390a15050505050505050565b80516131bc826122bc565b63ffffffff1683526131ce6020612b46565b6131d89082615608565b90506131e48183015190565b60208401526131f1602090565b6131fe9060ff1682615608565b9050600061320c8284612b51565b6040850181905280519091506132239060046155c8565b61322d9083615608565b91506132398284015190565b6060850152613249602083615608565b91506132558284015190565b60ff166080850152613268600183615608565b91506132748284015190565b6001600160401b031660a085015261328d600883615608565b91506132998284015190565b63ffffffff1660c08501526132af600483615608565b91506132bb8284612b51565b60e08501819052516132ce9060046155c8565b6132d89083615608565b9150600260ff16846080015160ff161115610849576132f78284612b51565b61010085015250505050565b6000606063ffffffff80168360c0015163ffffffff16141561342957600061336b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050606087015160a0880151899250613e3e565b60008181526006602052604090205490915060ff16156133cd5760405162461bcd60e51b815260206004820181905260248201527f5344504d73673a206e6f6e636520686173206265656e2070726f63657373656460448201526064016104bf565b6133d987878787613e77565b6080860151919450925060ff1661340b5781836134095760405162461bcd60e51b81526004016104bf91906157aa565b505b6000908152600660205260409020805460ff1916600117905561343b565b61343586868686613fb1565b90925090505b7fd0831f2b07fd854a865c682cb68bd34a56d746ae81a34d87c820e51ab979c3d38360200151878787876040015161347289614194565b8960c001518a60a001518b608001518b8b60405161349a9b9a999897969594939291906157bd565b60405180910390a1608083015160ff166001141561118f5761118f8387878786866141a3565b6134c981614194565b6001600160a01b031663e5512e9782602001518686868660c001518760a001518860e001516040518863ffffffff1660e01b81526004016135109796959493929190615855565b600060405180830381600087803b15801561352a57600080fd5b505af115801561353e573d6000803e3d6000fd5b505050507fd0831f2b07fd854a865c682cb68bd34a56d746ae81a34d87c820e51ab979c3d38160200151858585856040015161357987614194565b8760c001518860a00151896080015160016040516135a09a999897969594939291906158a2565b60405180910390a150505050565b6135b781614194565b602082015160c083015160a084015160e0850151610100860151604051633db5d43960e21b81526001600160a01b03969096169563f6d750e4956136059590948c948c948c94600401615943565b600060405180830381600087803b15801561361f57600080fd5b505af1158015613633573d6000803e3d6000fd5b505050507fd0831f2b07fd854a865c682cb68bd34a56d746ae81a34d87c820e51ab979c3d38160200151858585856040015161366e87614194565b60c088015160a089015160808a01516101008b01516040516135a09a9998979695949392916001916157bd565b600060608260e0015160ff16600014806136bc57508260e0015160ff166002145b806136ce57508260e0015160ff166004145b6137325760405162461bcd60e51b815260206004820152602f60248201527f6f6e6c7920737570706f72742074696d656f7574206d65617375726520302c2060448201526e3220616e64203420666f72206e6f7760881b60648201526084016104bf565b8260e0015160ff166002141561378c5743836101000151116137875760405162461bcd60e51b815260206004820152600e60248201526d1b5cd9c81a5cc81d1a5b595bdd5d60921b60448201526064016104bf565b6137e1565b8260e0015160ff16600414156137e15742836101000151116137e15760405162461bcd60e51b815260206004820152600e60248201526d1b5cd9c81a5cc81d1a5b595bdd5d60921b60448201526064016104bf565b60c083015163ffffffff90811614156138375761380086868686614263565b6080850151919350915060ff166138325780826138305760405162461bcd60e51b81526004016104bf91906157aa565b505b613849565b613843868686866142f6565b90925090505b600080516020615b6e8339815191528360200151878787876040015161386e89614194565b8960c001518a60a001518b608001518b8b6040516138969b9a999897969594939291906157bd565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad283602001518460e001518561010001516040516138f29392919092835260ff919091166020830152604082015260600190565b60405180910390a1608083015160ff166001141561118f5761118f83878787868661443a565b61392181614194565b6001600160a01b031663e5512e9782602001518686868660c001518760a001518861012001516040518863ffffffff1660e01b81526004016139699796959493929190615855565b600060405180830381600087803b15801561398357600080fd5b505af1158015613997573d6000803e3d6000fd5b50505050600080516020615b6e833981519152816020015185858585604001516139c087614194565b8760c001518860a00151896080015160016040516139e79a999897969594939291906158a2565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e001518361010001516040516135a09392919092835260ff919091166020830152604082015260600190565b613a4c81614194565b602082015160c083015160a0840151610120850151610140860151604051633db5d43960e21b81526001600160a01b03969096169563f6d750e495613a9b9590948c948c948c94600401615943565b600060405180830381600087803b158015613ab557600080fd5b505af1158015613ac9573d6000803e3d6000fd5b50505050600080516020615b6e83398151915281602001518585858560400151613af287614194565b60c088015160a089015160808a01516101408b01516040516139e79a9998979695949392916001916157bd565b6000613b2f8261012001516144dd565b90508060400151600760008787604051602001613b4d9291906153d5565b604051602081830303815290604052805190602001208152602001908152602001600020600201819055508060800151600760008787604051602001613b949291906153d5565b60405160208183030381529060405280519060200120815260200190815260200160002060040160006101000a8154816001600160401b0302191690836001600160401b031602179055508060600151600760008787604051602001613bfb9291906153d5565b60405160208183030381529060405280519060200120815260200190815260200160002060030181905550600080516020615b6e83398151915282602001518686868660400151613c4b88614194565b60c089015160a08a015160808b01516101408c0151604051613c789a9998979695949392916001916157bd565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad282602001518360e00151846101000151604051613cd49392919092835260ff919091166020830152604082015260600190565b60405180910390a15050505050565b600060208251613cf391906159c9565b905060208251613d0391906159dd565b15613d165780613d12816159f1565b9150505b80613d20816159f1565b9150610fac9050602082615a0c565b600060208351613d3f91906159c9565b9050600060208451613d5191906159dd565b1115613d655780613d61816159f1565b9150505b60010160005b818110156115a1576020810284015183860152601f1990940193600101613d6b565b6040805160208082528183019092526000918291906020820181803683375050506020018390525090919050565b81830151600060208204600101601f831615613dd5576001015b5b8082101561118f578585015160208302850152602086039550600182019150613dd6565b6000610fac8260200151611c9a565b600080613e17858585611a83565b6000818152600460205260408120805492935063ffffffff9092169182916115dd83615526565b600084848484604051602001613e579493929190615a2b565b604051602081830303815290604052805190602001209050949350505050565b6000606060006060613e8885614194565b6001600160a01b03163b613ecb5750506040805180820190915260","14815273726563656976657220686173206e6f20636f646560601b6020820152600090613fa4565b613ed485614194565b6001600160a01b031663ff098be78989898960e001516040518563ffffffff1660e01b8152600401613f099493929190615689565b600060405180830381600087803b158015613f2357600080fd5b505af1925050508015613f34575060015b613f9f57613f406156c0565b806308c379a01415613f675750613f556156dc565b80613f605750613f69565b9050613fa4565b505b3d808015613f93576040519150601f19603f3d011682016040523d82523d6000602084013e613f98565b606091505b5050613fa4565b600191505b9097909650945050505050565b600060606000613ffc87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506060870151889150613e09565b90508063ffffffff168460c0015163ffffffff161461405d5760405162461bcd60e51b815260206004820152601a60248201527f5344504d73673a2073657175656e6365206e6f7420657175616c00000000000060448201526064016104bf565b60006060600061406c87614194565b90506001600160a01b0381163b6140b5576000925060405180604001604052806014815260200173726563656976657220686173206e6f20636f646560601b8152509150614185565b60e087015160405163c09b261b60e01b81526001600160a01b0383169163c09b261b916140ea918e918e918e91600401615689565b600060405180830381600087803b15801561410457600080fd5b505af1925050508015614115575060015b614180576141216156c0565b806308c379a0141561414857506141366156dc565b80614141575061414a565b9150614185565b505b3d808015614174576040519150601f19603f3d011682016040523d82523d6000602084013e614179565b606091505b5050614185565b600192505b50909890975095505050505050565b6000610fac8260600151611c9a565b60006141ae87614194565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050604088015260608701849052826141fe576003614201565b60025b60ff166080880152826142145781614225565b604051806020016040528060008152505b6101008801526001546001600160a01b031663e41fb517826142468a61180f565b6040518363ffffffff1660e01b81526004016115669291906153a9565b600060606000606061427485614194565b6001600160a01b03163b6142b7575050604080518082019091526014815273726563656976657220686173206e6f20636f646560601b6020820152600090613fa4565b6142c085614194565b6001600160a01b031663ff098be78989898961012001516040518563ffffffff1660e01b8152600401613f099493929190615689565b60006060600061434187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506060870151889150613e09565b90508063ffffffff168460c0015163ffffffff16146143ac5760405162461bcd60e51b815260206004820152602160248201527f5344505f4d53475f4552524f523a2073657175656e6365206e6f7420657175616044820152601b60fa1b60648201526084016104bf565b6000606060006143bb87614194565b90506001600160a01b0381163b614404576000925060405180604001604052806014815260200173726563656976657220686173206e6f20636f646560601b8152509150614185565b61012087015160405163c09b261b60e01b81526001600160a01b0383169163c09b261b916140ea918e918e918e91600401615689565b600061444587614194565b905085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408801526060870184905282614495576003614498565b60025b60ff166080880152826144ab57816144bc565b604051806020016040528060008152505b6101408801526001546001600160a01b031663e41fb517826142468a611f66565b6040805160a080820183526000808352606060208085018290528486018390528185018390526080808601849052865194850187528385529084018290529483018290528201819052928101839052909161453784614653565b905060005b81602001515181101561464a5760008260200151828151811061456157614561615a67565b60200260200101519050806000015161ffff1660001415614590576145858161482e565b61ffff168452614637565b806000015161ffff16600114156145b05760408101516020850152614637565b806000015161ffff16600214156145e0576145d660206145d1836040015190565b015190565b6040850152614637565b806000015161ffff166003141561460e576146046145ff826040015190565b612c57565b6060850152614637565b806000015161ffff16600414156146375761462881614842565b6001600160401b031660808501525b5080614642816159f1565b91505061453c565b50909392505050565b6040805180820190915260008152606060208201526006825110156146ba5760405162461bcd60e51b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e67746800000000000000000060448201526064016104bf565b60408051808201909152600080825260606020830152906146e36146de858461485b565b614883565b61ffff1681526146f46006836155c8565b91506000825b855181101561474e5761471f61471a876147158460026155c8565b614924565b61494e565b61472a9060066155e0565b61473a9063ffffffff16826155c8565b905081614746816159f1565b9250506146fa565b6000826001600160401b0381111561476857614768615160565b6040519080825280602002602001820160405280156147b557816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816147865790505b509050600092505b865185101561481f57604080516060808201835260008083526020830152918101919091526147ec8887614a48565b965090508082856147fc816159f1565b96508151811061480e5761480e615a67565b6020026020010181905250506147bd565b60208401525090949350505050565b6000610fac6146de60028460400151015190565b6000610fac61485660088460400151015190565b614ba3565b815160009061486b8360026155c8565b111561487657600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b816000815181106148c6576148c6615a67565b60200101906001600160f81b031916908160001a9053508160001a60f81b816001815181106148f7576148f7615a67565b60200101906001600160f81b031916908160001a905350600061491b82600061485b565b95945050505050565b81516000906149348360046155c8565b111561493f57600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b8160008151811061499157614991615a67565b60200101906001600160f81b031916908160001a9053508160021a60f81b816001815181106149c2576149c2615a67565b60200101906001600160f81b031916908160001a9053508160011a60f81b816002815181106149f3576149f3615a67565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600381518110614a2457614a24615a67565b60200101906001600160f81b031916908160001a905350600061491b826000614924565b60408051606080820183526000808352602083015291810191909152600082845111614ac25760405162461bcd60e51b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b60648201526084016104bf565b6006831015614b045760405162461bcd60e51b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b60448201526064016104bf565b60408051606080820183526000808352602083015291810191909152614b2d6146de868661485b565b61ffff168152614b3e6002856155c8565b9350614b4d61471a8686614924565b63ffffffff166020820152614b636004856155c8565b9350614b7a8585836020015163ffffffff16614d61565b60408201526020810151614b949063ffffffff16856155c8565b935091508290505b9250929050565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b81600081518110614be657614be6615a67565b60200101906001600160f81b031916908160001a9053508160061a60f81b81600181518110614c1757614c17615a67565b60200101906001600160f81b031916908160001a9053508160051a60f81b81600281518110614c4857614c48615a67565b60200101906001600160f81b031916908160001a9053508160041a60f81b81600381518110614c7957614c79615a67565b60200101906001600160f81b031916908160001a9053508160031a60f81b81600481518110614caa57614caa615a67565b60200101906001600160f81b031916908160001a9053508160021a60f81b81600581518110614cdb57614cdb615a67565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600681518110614d0c57614d0c615a67565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600781518110614d3d57614d3d615a67565b60200101906001600160f81b031916908160001a905350600061491b826000614dd7565b8251606090614d7083856155c8565b1115614d7b57600080fd5b6000826001600160401b03811115614d9557614d95615160565b6040519080825280601f01601f191660200182016040528015614dbf576020820181803683370190505b50905060208082019086860101611a78828287614e04565b8151600090614de78360086155c8565b1115614df257600080fd5b5001600801516001600160401b031690565b60208110614e3c5781518352614e1b6020846155c8565b9250614e286020836155c8565b9150614e35602082615608565b9050614e04565b80614e4657505050565b60006001614e55836020615608565b614e6190610100615b61565b614e6b9190615608565b925184518416931916929092179092525050565b604080516101608101825260008082526020820181905260609282018390528282018190","526080820181905260a0820181905260c0820181905260e08201819052610100820152610120810182905261014081019190915290565b60008083601f840112614eec57600080fd5b5081356001600160401b03811115614f0357600080fd5b602083019150836020828501011115614b9c57600080fd5b80358015158114614f2b57600080fd5b919050565b60008060008060008060808789031215614f4957600080fd5b86356001600160401b0380821115614f6057600080fd5b614f6c8a838b01614eda565b909850965060208901359550869150614f8760408a01614f1b565b94506060890135915080821115614f9d57600080fd5b50614faa89828a01614eda565b979a9699509497509295939492505050565b60008060008060008060808789031215614fd557600080fd5b86356001600160401b0380821115614fec57600080fd5b614ff88a838b01614eda565b909850965060208901359550604089013591508082111561501857600080fd5b5061502589828a01614eda565b979a9699509497949695606090950135949350505050565b60008060006040848603121561505257600080fd5b8335925060208401356001600160401b0381111561506f57600080fd5b61507b86828701614eda565b9497909650939450505050565b60006020828403121561509a57600080fd5b81356001600160a01b0381168114611cc657600080fd5b60008060008060008060008060c0898b0312156150cd57600080fd5b88356001600160401b03808211156150e457600080fd5b6150f08c838d01614eda565b909a50985060208b0135975088915061510b60408c01614f1b565b965060608b013591508082111561512157600080fd5b5061512e8b828c01614eda565b909550935050608089013560ff8116811461514857600080fd5b8092505060a089013590509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561519b5761519b615160565b6040525050565b600060208083850312156151b557600080fd5b82356001600160401b03808211156151cc57600080fd5b818501915085601f8301126151e057600080fd5b8135818111156151f2576151f2615160565b604051915061520a601f8201601f1916850183615176565b808252868482850101111561521e57600080fd5b8084840185840137600090820190930192909252509392505050565b6000806020838503121561524d57600080fd5b82356001600160401b0381111561526357600080fd5b61526f85828601614eda565b90969095509350505050565b60005b8381101561529657818101518382015260200161527e565b838111156108495750506000910152565b600081518084526152bf81602086016020860161527b565b601f01601f19169290920160200192915050565b6020815261ffff82511660208201526000602083015160a060408401526152fd60c08401826152a7565b905060408401516060840152606084015160808401526001600160401b0360808501511660a08401528091505092915050565b60008060008060006060868803121561534857600080fd5b85356001600160401b038082111561535f57600080fd5b61536b89838a01614eda565b909750955060208801359450604088013591508082111561538b57600080fd5b5061539888828901614eda565b969995985093965092949392505050565b6001600160a01b03831681526040602082018190526000906153cd908301846152a7565b949350505050565b8183823760009101908152919050565b6020808252601e908201527f5344504d73673a2077726f6e6720726563656976696e6720646f6d61696e0000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000825161546381846020870161527b565b9190910192915050565b87815260e06020820152600061548660e08301896152a7565b87604084015263ffffffff871660608401526001600160401b038616608084015282810360a08401526154b981866152a7565b905082810360c08401526154cd81856152a7565b9a9950505050505050505050565b600181811c908216806154ef57607f821691505b60208210811415612a1f57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff8083168181141561554057615540615510565b6001019392505050565b6020808252601f908201527f656e636f64655344504d6573736167653a2077726f6e672076657273696f6e00604082015260600190565b60208082526027908201527f656e636f64655344504d6573736167653a20626f6479206c656e677468206f76604082015266195c9b1a5b5a5d60ca1b606082015260800190565b600082198211156155db576155db615510565b500190565b600063ffffffff8083168185168083038211156155ff576155ff615510565b01949350505050565b60008282101561561a5761561a615510565b500390565b60208082526021908201527f656e636f64655344504d6573736167653a207a65726f206d65737361676520696040820152601960fa1b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600061569d606083018688615660565b84602084015282810360408401526156b581856152a7565b979650505050505050565b600060033d11156156d95760046000803e5060005160e01c5b90565b600060443d10156156ea5790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561571957505050505090565b82850191508151818111156157315750505050505090565b843d870101602082850101111561574b5750505050505090565b611a7860208286010187615176565b60c08152600061576e60c08301898b615660565b602083018890526001600160a01b038716604084015263ffffffff86166060840152841515608084015282810360a08401526154cd81856152a7565b602081526000611cc660208301846152a7565b60006101408d83528060208401526157d88184018d8f615660565b90508a604084015282810360608401526157f2818b6152a7565b6001600160a01b038a16608085015263ffffffff891660a08501526001600160401b03881660c085015260ff871660e0850152851515610100850152838103610120850152905061584381856152a7565b9e9d5050505050505050505050505050565b87815260c06020820152600061586f60c08301888a615660565b86604084015263ffffffff861660608401526001600160401b038516608084015282810360a08401526154cd81856152a7565b60006101408c83528060208401526158bd8184018c8e615660565b905089604084015282810360608401526158d7818a6152a7565b6001600160a01b03989098166080840152505063ffffffff9490941660a08501526001600160401b039290921660c084015260ff1660e083015215156101008201528082036101209091015260078152667375636365737360c81b602082015260400195945050505050565b88815260e06020820152600061595d60e08301898b615660565b87604084015263ffffffff871660608401526001600160401b038616608084015282810360a084015261599081866152a7565b905082810360c08401526159a481856152a7565b9b9a5050505050505050505050565b634e487b7160e01b600052601260045260246000fd5b6000826159d8576159d86159b3565b500490565b6000826159ec576159ec6159b3565b500690565b6000600019821415615a0557615a05615510565b5060010190565b6000816000190483118215151615615a2657615a26615510565b500290565b60008551615a3d818460208a0161527b565b9190910193845250602083019190915260c01b6001600160c01b0319166040820152604801919050565b634e487b7160e01b600052603260045260246000fd5b600181815b80851115615ab8578160001904821115615a9e57615a9e615510565b80851615615aab57918102915b93841c9390800290615a82565b509250929050565b600082615acf57506001610fac565b81615adc57506000610fac565b8160018114615af25760028114615afc57615b18565b6001915050610fac565b60ff841115615b0d57615b0d615510565b50506001821b610fac565b5060208310610133831016604e8410600b8410161715615b3b575081810a610fac565b615b458383615a7d565b8060001904821115615b5957615b59615510565b029392505050565b6000611cc68383615ac056fecf362ac32ec1d372722255e0e7a9b99808ee047e0d29b8439c3e69c6317ab289a26469706673582212206d92d5c7388184eb5a7e58b2a2b2f35118099e1633e32d6d24eecd400d5ce23e64736f6c634300080b0033"}; + public static final String[] BINARY_ARRAY = {"60806040523480156200001157600080fd5b506200001d336200002d565b620000276200007d565b6200014c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a81b900460ff1615620000ec5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff600160a01b909104811610156200014a576000805460ff60a01b191660ff60a01b17905560405160ff81527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b616320806200015c6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638da5cb5b116100f9578063d76ceb1711610097578063e552109211610071578063e5521092146103ab578063f2fde38b146103be578063f80babb1146103d1578063fc0baf08146103e457600080fd5b8063d76ceb171461037d578063e007d20214610390578063e1c7392a146103a357600080fd5b8063a9d662af116100d3578063a9d662af14610324578063b01d99a714610337578063b5db295a1461034a578063c09b261b1461036a57600080fd5b80638da5cb5b146102ed57806391198fcd146102fe57806393e68aa81461031157600080fd5b80636e109afe116101665780638037d45e116101405780638037d45e146102a3578063838a102c146102b4578063849d87a5146102c75780638d9c0618146102da57600080fd5b80636e109afe14610275578063715018a614610288578063762f3d6e1461029057600080fd5b80633ac6dfb1116101a25780633ac6dfb11461022c57806346f51ca91461023457806356cb2d021461025957806360e8b9c91461026257600080fd5b806305ca8da6146101c95780630d9ae9e5146101ef578063203c2c8514610217575b600080fd5b6101dc6101d7366004615378565b6103eb565b6040519081526020015b60405180910390f35b6102026101fd366004615404565b610476565b60405163ffffffff90911681526020016101e6565b61022a610225366004615485565b610530565b005b6003546101dc565b6001546001600160a01b03165b6040516001600160a01b0390911681526020016101e6565b6101dc60035481565b61022a6102703660046154e7565b610855565b6101dc610283366004615513565b6108f7565b61022a610988565b6101dc61029e366004615513565b6109be565b6002546001600160a01b0316610241565b61022a6102c23660046155fb565b6109ff565b6101dc6102d5366004615693565b610a58565b6101dc6102e8366004615693565b610c29565b6000546001600160a01b0316610241565b6101dc61030c366004615378565b610d86565b61022a61031f366004615730565b610dc3565b600254610241906001600160a01b031681565b6101dc610345366004615787565b610eee565b61035d61035836600461583d565b61113d565b6040516101e691906158d6565b61022a610378366004615933565b61127f565b61022a61038b366004615730565b611456565b6101dc61039e366004615787565b6115ca565b61022a611783565b600154610241906001600160a01b031681565b61022a6103cc3660046154e7565b6118b0565b61022a6103df3660046154e7565b611948565b6003610202565b600154604051636605dc7960e01b81526000916001600160a01b031690636605dc7990610428908a908a908a9033908b908b908b906004016159d5565b6020604051808303816000875af1158015610447573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046b9190615a28565b979650505050505050565b6000600354848460405160200161048e929190615a41565b60405160208183030381529060405280519060200120146104ca5760405162461bcd60e51b81526004016104c190615a51565b60405180910390fd5b600061050f88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508791506119dd9050565b60009081526005602052604090205463ffffffff1698975050505050505050565b6000546001600160a01b0316331461055a5760405162461bcd60e51b81526004016104c190615a88565b6105626152c7565b6105a483838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508593925050611a3a9050565b60e081015160ff1661060f5760405162461bcd60e51b815260206004820152602e60248201527f5344505f4d53475f4552524f523a20746865206d6573736167652074696d656f60448201526d075744d65617375726520697320360941b60648201526084016104c1565b8060e0015160ff16600214156107f45780610100015160086000836040015160405160200161063e9190615abd565b6040516020818303038152906040528051906020012081526020019081526020016000206003015411156107865760208082015160009081526009909152604090205460ff166106ed5760405162461bcd60e51b815260206004820152603460248201527f5344505f4d53475f4552524f523a20657863657074696f6e206d657373616765604482015273081a185cda08191bd95cc81b9bdd08195e1a5cdd60621b60648201526084016104c1565b6001546001600160a01b031663bccc247f61070786611bfe565b6020840151604080860151606087015160c088015160a08901516101208a01516101408b015195516001600160e01b031960e08b901b16815261074f98979690600401615ad9565b600060405180830381600087803b15801561076957600080fd5b505af115801561077d573d6000803e3d6000fd5b5050505061084f565b60405162461bcd60e51b815260206004820152603f60248201527f5344505f4d53475f4552524f523a20746865206d657373616765206973206e6f60448201527f742074696d656f757420776974682074696d656f75744d65617375726520320060648201526084016104c1565b60405162461bcd60e51b815260206004820152602a60248201527f5344505f4d53475f4552524f523a20756e737570706f727465642074696d656f6044820152697574206d65617375726560b01b60648201526084016104c1565b50505050565b6000546001600160a01b0316331461087f5760405162461bcd60e51b81526004016104c190615a88565b6001600160a01b0381166108d55760405162461bcd60e51b815260206004820152601b60248201527f5344504d73673a20696e76616c696420616d20636f6e7472616374000000000060448201526064016104c1565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600154604051634450f29160e01b81526000916001600160a01b031690634450f29190610938908c908c908c9033908d908d908d908d908d90600401615b5d565b6020604051808303816000875af1158015610957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097b9190615a28565b9998505050505050505050565b6000546001600160a01b031633146109b25760405162461bcd60e51b81526004016104c190615a88565b6109bc6000611c31565b565b600154604051633699f21760e01b81526000916001600160a01b031690633699f21790610938908c908c908c9033908d908d908d908d908d90600401615b5d565b6000546001600160a01b03163314610a295760405162461bcd60e51b81526004016104c190615a88565b80604051602001610a3a9190615abd565b60408051601f19818403018152919052805160209091012060035550565b6001546000906001600160a01b03163314610a855760405162461bcd60e51b81526004016104c190615bbe565b604080516101208101825260028152600060208083018290528351601f8c0182900482028101820185528b81529193830191908c908c90819084018382808284376000920191909152505050908252506020810189905260400186610aeb576000610aee565b60015b60ff1681526020016001600160401b0380168152602001610b488b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508d9150611c819050565b63ffffffff16815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181019092529283529092015250600354909150610baf908290611ce1565b6002546001600160a01b031663e41fb51787610bca84611ee8565b6040518363ffffffff1660e01b8152600401610be7929190615c00565b600060405180830381600087803b158015610c0157600080fd5b505af1158015610c15573d6000803e3d6000fd5b505050506020015198975050505050505050565b6001546000906001600160a01b03163314610c565760405162461bcd60e51b81526004016104c190615bbe565b604080516101208101825260028152600060208083018290528351601f8c0182900482028101820185528b81529193830191908c908c90819084018382808284376000920191909152505050908252506020810189905260400186610cbc576000610cbf565b60015b60ff168152602001610d0a8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508d915061215c9050565b63ffffffff166001600160401b0316815260200163ffffffff8016815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181019092529283529092015250600354909150610baf908290611ce1565b600154604051630762913160e11b81526000916001600160a01b031690630ec5226290610428908a908a908a9033908b908b908b906004016159d5565b6001546001600160a01b03163314610ded5760405162461bcd60e51b81526004016104c190615bbe565b6040805160a06020601f89018190040282018101909252608081018781526000928291908a908a9081908501838280828437600092019190915250505090825250602080820188905260408051601f8701839004830281018301825286815292019190869086908190840183828082843760009201919091525050509082525063ffffffff6020909101526002549091506001600160a01b031663e41fb51785610e9684612191565b6040518363ffffffff1660e01b","8152600401610eb3929190615c00565b600060405180830381600087803b158015610ecd57600080fd5b505af1158015610ee1573d6000803e3d6000fd5b5050505050505050505050565b6001546000906001600160a01b03163314610f1b5760405162461bcd60e51b81526004016104c190615bbe565b600460ff84161115610f665760405162461bcd60e51b815260206004820152601460248201527314d1140e881a5b9d985b1a59081d1a5b595bdd5d60621b60448201526064016104c1565b604080516101608101825260038152600060208083018290528351601f8e0182900482028101820185528d81528c949293928301918f908f90819084018382808284376000920191909152505050908252506020810184905260400189610fce576000610fd1565b60015b60ff1681526020016001600160401b038016815260200161102b8e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f9250889150611c819050565b63ffffffff1681526020018660ff16815260200185815260200188888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810190925292835290920152506003549091506110a19082906122ac565b6020808201516000908152600990915260409020805460ff191660011790556002546001600160a01b031663e41fb5178a6110db84612510565b6040518363ffffffff1660e01b81526004016110f8929190615c00565b600060405180830381600087803b15801561111257600080fd5b505af1158015611126573d6000803e3d6000fd5b50505050602001519b9a5050505050505050505050565b6040805160a08101825260008082526060602083018190529282018190529181018290526080810191909152600860008484604051602001611180929190615a41565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825160a08101909352805461ffff16835260018101805491928401916111cc90615c2c565b80601f01602080910402602001604051908101604052809291908181526020018280546111f890615c2c565b80156112455780601f1061121a57610100808354040283529160200191611245565b820191906000526020600020905b81548152906001019060200180831161122857829003601f168201915b505050918352505060028201546020820152600382015460408201526004909101546001600160401b031660609091015290505b92915050565b6002546001600160a01b031633146112d95760405162461bcd60e51b815260206004820152601d60248201527f5344504d73673a206e6f742076616c696420616d20636f6e747261637400000060448201526064016104c1565b600061131a83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061281692505050565b90508063ffffffff16600114156113725761136d86868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061287b92505050565b61144e565b8063ffffffff16600214156113c35761136d86868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061292192505050565b8063ffffffff16600314156114145761136d86868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a6392505050565b60405162461bcd60e51b815260206004820152600f60248201526e3130b21039b238103b32b939b4b7b760891b60448201526064016104c1565b505050505050565b6001546001600160a01b031633146114805760405162461bcd60e51b81526004016104c190615bbe565b6040805160a06020601f89018190040282018101909252608081018781526000928291908a908a9081908501838280828437600092019190915250505090825250602080820188905260408051601f87018390048302810183018252868152920191908690869081908401838280828437600092019190915250505090825250604080516020601f8b0181900481028201810190925289815291810191611545918b908b90819084018382808284376000920191909152508a92508b9150611c819050565b63ffffffff1690529050600061155a82612191565b60025460405163e41fb51760e01b81529192506001600160a01b03169063e41fb5179061158d9088908590600401615c00565b600060405180830381600087803b1580156115a757600080fd5b505af11580156115bb573d6000803e3d6000fd5b505050505b5050505050505050565b6001546000906001600160a01b031633146115f75760405162461bcd60e51b81526004016104c190615bbe565b600460ff841611156116425760405162461bcd60e51b815260206004820152601460248201527314d1140e881a5b9d985b1a59081d1a5b595bdd5d60621b60448201526064016104c1565b604080516101608101825260038152600060208083018290528351601f8e0182900482028101820185528d81528c949293928301918f908f908190840183828082843760009201919091525050509082525060208101849052604001896116aa5760006116ad565b60015b60ff1681526020016116f88e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f925088915061215c9050565b63ffffffff166001600160401b0316815260200163ffffffff801681526020018660ff16815260200185815260200188888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505060408051602081810190925292835290920152506003549091506110a19082906122ac565b600054600160a81b900460ff16158080156117ab57506000546001600160a01b90910460ff16105b806117cc5750303b1580156117cc5750600054600160a01b900460ff166001145b61182f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104c1565b6000805460ff60a01b1916600160a01b179055801561185c576000805460ff60a81b1916600160a81b1790555b61186533611c31565b80156118ad576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6000546001600160a01b031633146118da5760405162461bcd60e51b81526004016104c190615a88565b6001600160a01b03811661193f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104c1565b6118ad81611c31565b6000546001600160a01b031633146119725760405162461bcd60e51b81526004016104c190615a88565b6001600160a01b0381166119bb5760405162461bcd60e51b815260206004820152601060248201526f29a2281d103130b21036b7b734ba37b960811b60448201526064016104c1565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000836040516020016119f09190615abd565b60408051601f198184030181528282528051602091820120908301528101849052606081018390526080016040516020818303038152906040528051906020012090509392505050565b8051611a4582612816565b63ffffffff168352611a576020612bc6565b611a619082615c77565b9050611a6d8183015190565b6020840152611a7a602090565b611a879060ff1682615c77565b90506000611a958284612bd1565b604085018190528051909150611aac906004615c8e565b611ab69083615c77565b9150611ac28284015190565b6060850152611ad2602083615c77565b9150611ade8284015190565b60ff166080850152611af1600183615c77565b9150611afd8284015190565b6001600160401b031660a0850152611b16600883615c77565b9150611b228284015190565b63ffffffff1660c0850152611b38600483615c77565b9150611b448284015190565b60ff1660e0850152611b57600183615c77565b91506000611b658385612bd1565b9050611b7081612cd7565b6101008601528051611b83906004615c8e565b611b8d9084615c77565b9250611b998385612bd1565b610120860181905251611bad906004615c8e565b611bb79084615c77565b9250600260ff16856080015160ff161115611bf757611bd68385612bd1565b610140860181905251611bea906004615c8e565b611bf49084615c77565b92505b5050505050565b604080516020808252818301909252600091829190602082018180368337505050602081018490529050825b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080611c8f858585612d93565b6000818152600460205260408120805492935063ffffffff909216918291611cb683615ca6565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b816000015163ffffffff16600214611d0b5760405162461bcd60e51b81526004016104c190615cca565b63ffffffff8260e00151511115611d345760405162461bcd60e51b81526004016104c190615d01565b60008260e00151518360400151516079611d4e9190615c8e565b611d589190615c8e565b90506000816001600160401b03811115611d7457611d746155b9565b6040519080825280601f01601f191660200182016040528015611d9e576020820181803683370190505b5084519091508290611dc6908290611dba9063ff000000615d48565b63ffffffff1690840152565b611dd06020612e02565b611dda9082615c77565b6040860151909150611ded828285613031565b8051611dfa906004615c8e565b611e049083615c77565b6060870151818501529150611e1a602083615c77565b9150611e2b8287608001518561311f565b611e36600183615c77565b9150611e47828760a0015185613130565b611e516040612e02565b611e5b9083615c77565b9150611e6c828760c0015185613141565b611e766020612e02565b611e809083615c77565b9150611e91828760e0015185613031565b60e086015151611ea2906004615c8e565b61","1eac9083615c77565b33818501529150611ebe602083615c77565b8084018690529150611ed1602083615c77565b505081516020928301209490910193909352505050565b6060816000015163ffffffff16600214611f145760405162461bcd60e51b81526004016104c190615cca565b63ffffffff8260e00151511115611f3d5760405162461bcd60e51b81526004016104c190615d01565b6020820151611f5e5760405162461bcd60e51b81526004016104c190615d70565b6080820151600090600260ff909116118015611fb8576101008401515160e085015151604086015151611f92906059615c8e565b611f9c9190615c8e565b611fa7906004615c8e565b611fb19190615c8e565b9150611fdc565b60e084015151604085015151611fcf906059615c8e565b611fd99190615c8e565b91505b6000826001600160401b03811115611ff657611ff66155b9565b6040519080825280601f01601f191660200182016040528015612020576020820181803683370190505b508551909150839061203c908290611dba9063ff000000615d48565b6120466020612e02565b6120509082615c77565b602087810151828501529091506120679082615c77565b604087015190915061207a828285613031565b8051612087906004615c8e565b6120919083615c77565b60608801518185015291506120a7602083615c77565b91506120b88288608001518561311f565b6120c3600183615c77565b91506120d4828860a0015185613130565b6120de6040612e02565b6120e89083615c77565b91506120f9828860c0015185613141565b6121036020612e02565b61210d9083615c77565b915061211e828860e0015185613031565b60e08701515161212f906004615c8e565b6121399083615c77565b91508315612151576121518288610100015185613031565b509095945050505050565b60008061216a858585612d93565b6000818152600660205260408120805492935063ffffffff909216918291611cb683615ca6565b606060006121a28360000151613152565b6121af8460400151613152565b6121ba906004615c8e565b6121c5906020615c8e565b6121cf9190615c8e565b90506000816001600160401b038111156121eb576121eb6155b9565b6040519080825280601f01601f191660200182016040528015612215576020820181803683370190505b50845190915082906122299082908461319e565b845161223490613152565b61223e9082615c77565b602086810151828501529091506122559082615c77565b905061226681866060015184613141565b6122706020612bc6565b61227a9082615c77565b905061228b8186604001518461319e565b6122988560400151613152565b6122a29082615c77565b5090949350505050565b816000015163ffffffff166003146122d65760405162461bcd60e51b81526004016104c190615cca565b63ffffffff8261012001515111156123005760405162461bcd60e51b81526004016104c190615d01565b60006123108361010001516131fc565b90506000815184610120015151856040015151607e61232f9190615c8e565b6123399190615c8e565b6123439190615c8e565b90506000816001600160401b0381111561235f5761235f6155b9565b6040519080825280601f01601f191660200182016040528015612389576020820181803683370190505b50855190915082906123ab9082906123a59063ff000000615d48565b84613141565b6123b56020612e02565b6123bf9082615c77565b60408701519091506123d2828285613031565b80516123df906004615c8e565b6123e99083615c77565b60608801518185015291506123ff602083615c77565b91506124108288608001518561311f565b61241b600183615c77565b915061242c828860a0015185613130565b6124366040612e02565b6124409083615c77565b9150612451828860c0015185613141565b61245b6020612e02565b6124659083615c77565b9150612476828860e001518561311f565b612481600183615c77565b915061248e828685613031565b845161249b906004615c8e565b6124a59083615c77565b91506124b78288610120015185613031565b610120870151516124c9906004615c8e565b6124d39083615c77565b338185015291506124e5602083615c77565b80840187905291506124f8602083615c77565b50508151602092830120959091019490945250505050565b6060816000015163ffffffff1660031461253c5760405162461bcd60e51b81526004016104c190615cca565b63ffffffff8261012001515111156125665760405162461bcd60e51b81526004016104c190615d01565b60208201516125875760405162461bcd60e51b81526004016104c190615d70565b600080600260ff16846080015160ff1611905060006125aa8561010001516131fc565b9050811561260357610140850151518151610120870151516040880151516125d390605e615c8e565b6125dd9190615c8e565b6125e79190615c8e565b6125f2906004615c8e565b6125fc9190615c8e565b9250612634565b80516101208601515160408701515161261d90605e615c8e565b6126279190615c8e565b6126319190615c8e565b92505b6000836001600160401b0381111561264e5761264e6155b9565b6040519080825280601f01601f191660200182016040528015612678576020820181803683370190505b50865190915084906126949082906123a59063ff000000615d48565b61269e6020612e02565b6126a89082615c77565b602088810151828501529091506126bf9082615c77565b60408801519091506126d2828285613031565b80516126df906004615c8e565b6126e99083615c77565b60608901518185015291506126ff602083615c77565b91506127108289608001518561311f565b61271b600183615c77565b915061272c828960a0015185613130565b6127366040612e02565b6127409083615c77565b9150612751828960c0015185613141565b61275b6020612e02565b6127659083615c77565b9150612776828960e001518561311f565b612781600183615c77565b915061278e828585613031565b835161279b906004615c8e565b6127a59083615c77565b91506127b78289610120015185613031565b610120880151516127c9906004615c8e565b6127d39083615c77565b9150841561280a576127eb8289610140015185613031565b610140880151516127fd906004615c8e565b6128079083615c77565b91505b50909695505050505050565b8051601c81830101516000916001600160f81b03198083161415612871576040805160048082528183019092526000918291906020820181803683370190505095909201601d01516021860152505050600490910151919050565b5060019392505050565b6040805160808101825260608082526000602083018190529282018190528101919091526128a98183613296565b60035481516040516128be9190602001615abd565b60405160208183030381529060405280519060200120146128f15760405162461bcd60e51b81526004016104c190615a51565b606081015163ffffffff90811614156129155761291085858584613407565b611bf7565b611bf785858584613477565b604080516101208101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c082015260e08101829052610100810191909152612973818361369a565b600354816040015160405160200161298b9190615abd565b60405160208183030381529060405280519060200120146129be5760405162461bcd60e51b81526004016104c190615a51565b608081015160ff1615806129d95750608081015160ff166001145b156129ea57612910858585846137ec565b608081015160ff1660021415612a0657612910858585846139a9565b608081015160ff1660031415612a225761291085858584613a9b565b60405162461bcd60e51b8152602060048201526016602482015275756e65787065637465642061746f6d696320666c616760501b60448201526064016104c1565b612a6b6152c7565b612a758183611a3a565b6003548160400151604051602001612a8d9190615abd565b6040516020818303038152906040528051906020012014612af05760405162461bcd60e51b815260206004820152601f60248201527f5344505f4d73673a2077726f6e6720726563656976696e6720646f6d61696e0060448201526064016104c1565b608081015160ff161580612b0b5750608081015160ff166001145b15612b1c5761291085858584613b8c565b608081015160ff1660021415612b385761291085858584613e09565b608081015160ff1660031415612b545761291085858584613f3a565b608081015160ff1660041415612b70576129108585858461401a565b60405162461bcd60e51b815260206004820152602560248201527f5344505f4d53475f4552524f523a20756e65787065637465642061746f6d696360448201526420666c616760d81b60648201526084016104c1565b600061127982612e02565b60606000612bdf8484015190565b63ffffffff169050612bf2600485615c77565b935083811115612c5d5760405162461bcd60e51b815260206004820152603060248201527f6279746573546f56617242797465733a206f6666736574206c6573732074686160448201526f6e206c656e677468206f6620626f647960801b60648201526084016104c1565b612c678185615c77565b9350606081158015612c8457604051915060208201604052612cce565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015612cbd578051835260209283019201612ca5565b5050848452601f01601f1916604052505b50949350505050565b80516000906020811115612d395760405162461bcd60e51b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b60648201526084016104c1565b6000816001600160401b03811115612d5357612d536155b9565b6040519080825280601f01601f191660200182016040528015612d7d576020820181803683370190505b5084518152938201519190930151900392915050565b600080612d9f846141de565b90508085604051602001612db39190615abd565b60408051601f1981840301815282825280516020918201209083019390935281019190915260608101849052608001604051602081830303815290604052805190602001209150509392505050565b60008160088114612f0f5760108114612f185760188114612f215760208114612f2a5760288114612f335760308114612f3c5760388114612f455760408114612f4e5760488114612f575760508114612f605760588114612f695760608114612f725760688114612f7b5760708114612f845760788114612f8d5760808114612f965760888114612f9f5760908114612fa85760988114612fb15760a08114612f","ba5760a88114612fc35760b08114612fcc5760b88114612fd55760c08114612fde5760c88114612fe75760d08114612ff05760d88114612ff95760e081146130025760e8811461300b5760f081146130145760f8811461301d576101008114613026576020915061302b565b6001915061302b565b6002915061302b565b6003915061302b565b6004915061302b565b6005915061302b565b6006915061302b565b6007915061302b565b6008915061302b565b6009915061302b565b600a915061302b565b600b915061302b565b600c915061302b565b600d915061302b565b600e915061302b565b600f915061302b565b6010915061302b565b6011915061302b565b6012915061302b565b6013915061302b565b6014915061302b565b6015915061302b565b6016915061302b565b6017915061302b565b6018915061302b565b6019915061302b565b601a915061302b565b601b915061302b565b601c915061302b565b601d915061302b565b601e915061302b565b601f915061302b565b602091505b50919050565b815161303e848284613141565b613049600485615c77565b93508063ffffffff168410156130bc5760405162461bcd60e51b815260206004820152603260248201527f7661724279746573546f42797465733a206f6666736574206c657373207468616044820152710dc40e8d0ca40d2dce0eae840d8cadccee8d60731b60648201526084016104c1565b6130cc63ffffffff821685615c77565b9350801580156130db57611bf7565b8483018051601f84168015602002818801018581018215602002838601015b818310156131125782518152602092830192016130fa565b5050509152505050505050565b909101600019810180519290915252565b909101600719810180519290915252565b909101600319810180519290915252565b6000602082516131629190615dc7565b9050602082516131729190615ddb565b15613185578061318181615def565b9150505b8061318f81615def565b91506112799050602082615e0a565b6000602083516131ae9190615dc7565b90506000602084516131c09190615ddb565b11156131d457806131d081615def565b9150505b60010160005b81811015611bf7576020810284015183860152601f19909401936001016131da565b60408051602080825281830190925260609160009190602082018180368337505060408051602080825281830190925292935060009291508082018180368337019050509050606084602084015260015b6020811015612cce57806020850103518160208501035180820361328c5760405193506020860151838501528284528260208501016040525050612cce565b505060010161324d565b805160006132a48284015190565b6132af906020615d48565b905060008163ffffffff166001600160401b038111156132d1576132d16155b9565b6040519080825280601f01601f1916602001820160405280156132fb576020820181803683370190505b50905061330983858361420c565b61331281613152565b61331c9084615c77565b9250600061332a8486015190565b9050613337602085615c77565b935060006133458587015190565b90506133516020612e02565b61335b9086615c77565b945060006133698688015190565b613374906020615d48565b905060008163ffffffff166001600160401b03811115613396576133966155b9565b6040519080825280601f01601f1916602001820160405280156133c0576020820181803683370190505b5090506133ce87898361420c565b6133d781613152565b6133e19088615c77565b5093885250602087019190915263ffffffff166060860152604090940193909352505050565b6001546001600160a01b0316634d7c70858585856134248661424b565b86604001516040518663ffffffff1660e01b8152600401613449959493929190615e29565b600060405180830381600087803b15801561346357600080fd5b505af11580156115c0573d6000803e3d6000fd5b60006134be85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050602085015186915061425a565b90508063ffffffff16826060015163ffffffff161461351f5760405162461bcd60e51b815260206004820152601a60248201527f5344504d73673a2073657175656e6365206e6f7420657175616c00000000000060448201526064016104c1565b60006060600061352e8561424b565b90506001600160a01b0381163b613577576000925060405180604001604052806014815260200173726563656976657220686173206e6f20636f646560601b815250915061364d565b60015460408087015190516308d491bb60e31b81526001600160a01b03909216916346a48dd8916135b2918c918c918c918891600401615e29565b600060405180830381600087803b1580156135cc57600080fd5b505af19250505080156135dd575060015b613648576135e9615e71565b806308c379a0141561361057506135fe615e8d565b806136095750613612565b915061364d565b505b3d80801561363c576040519150601f19603f3d011682016040523d82523d6000602084013e613641565b606091505b505061364d565b600192505b7f5c739d2e6f1ca8bbfc6b71f12b702b9c87e02646edd83b3600d624abb67fab04888888848888886040516136889796959493929190615f0b565b60405180910390a15050505050505050565b80516136a582612816565b63ffffffff1683526136b76020612bc6565b6136c19082615c77565b90506136cd8183015190565b60208401526136da602090565b6136e79060ff1682615c77565b905060006136f58284612bd1565b60408501819052805190915061370c906004615c8e565b6137169083615c77565b91506137228284015190565b6060850152613732602083615c77565b915061373e8284015190565b60ff166080850152613751600183615c77565b915061375d8284015190565b6001600160401b031660a0850152613776600883615c77565b91506137828284015190565b63ffffffff1660c0850152613798600483615c77565b91506137a48284612bd1565b60e08501819052516137b7906004615c8e565b6137c19083615c77565b9150600260ff16846080015160ff16111561084f576137e08284612bd1565b61010085015250505050565b6000606063ffffffff80168360c0015163ffffffff16141561391257600061385487878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050606087015160a088015189925061428f565b60008181526007602052604090205490915060ff16156138b65760405162461bcd60e51b815260206004820181905260248201527f5344504d73673a206e6f6e636520686173206265656e2070726f63657373656460448201526064016104c1565b6138c2878787876142c8565b6080860151919450925060ff166138f45781836138f25760405162461bcd60e51b81526004016104c19190615f5b565b505b6000908152600760205260409020805460ff19166001179055613924565b61391e86868686614406565b90925090505b7fd0831f2b07fd854a865c682cb68bd34a56d746ae81a34d87c820e51ab979c3d38360200151878787876040015161395b896145ef565b8960c001518a60a001518b608001518b8b6040516139839b9a99989796959493929190615f6e565b60405180910390a1608083015160ff166001141561144e5761144e8387878786866145fe565b6001546001600160a01b0316637fd2ac436139c3836145ef565b83602001518787878760c001518860a001518960e001516040518963ffffffff1660e01b81526004016139fd989796959493929190616006565b600060405180830381600087803b158015613a1757600080fd5b505af1158015613a2b573d6000803e3d6000fd5b505050507fd0831f2b07fd854a865c682cb68bd34a56d746ae81a34d87c820e51ab979c3d381602001518585858560400151613a66876145ef565b8760c001518860a0015189608001516001604051613a8d9a99989796959493929190616061565b60405180910390a150505050565b6001546001600160a01b031663bccc247f613ab5836145ef565b83602001518787878760c001518860a001518960e001518a61010001516040518a63ffffffff1660e01b8152600401613af699989796959493929190616102565b600060405180830381600087803b158015613b1057600080fd5b505af1158015613b24573d6000803e3d6000fd5b505050507fd0831f2b07fd854a865c682cb68bd34a56d746ae81a34d87c820e51ab979c3d381602001518585858560400151613b5f876145ef565b60c088015160a089015160808a01516101008b0151604051613a8d9a999897969594939291600191615f6e565b600060608260e0015160ff1660001480613bad57508260e0015160ff166002145b80613bbf57508260e0015160ff166004145b613c235760405162461bcd60e51b815260206004820152602f60248201527f6f6e6c7920737570706f72742074696d656f7574206d65617375726520302c2060448201526e3220616e64203420666f72206e6f7760881b60648201526084016104c1565b8260e0015160ff1660021415613c7d574383610100015111613c785760405162461bcd60e51b815260206004820152600e60248201526d1b5cd9c81a5cc81d1a5b595bdd5d60921b60448201526064016104c1565b613cd2565b8260e0015160ff1660041415613cd2574283610100015111613cd25760405162461bcd60e51b815260206004820152600e60248201526d1b5cd9c81a5cc81d1a5b595bdd5d60921b60448201526064016104c1565b60c083015163ffffffff9081161415613d2857613cf1868686866146a1565b6080850151919350915060ff16613d23578082613d215760405162461bcd60e51b81526004016104c19190615f5b565b505b613d3a565b613d3486868686614738565b90925090505b6000805160206162cb83398151915283602001518787878760400151613d5f896145ef565b8960c001518a60a001518b608001518b8b604051613d879b9a99989796959493929190615f6e565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad283602001518460e00151856101000151604051613de39392919092835260ff919091166020830152604082015260600190565b60405180910390a1608083015160ff166001141561144e5761144e838787878686614882565b6001546001600160a01b0316637fd2ac43613e23836145ef565b602084015160c085015160a08601516101208701516040516001600160e01b031960e088901b168152613e609594938c938c938c93600401616006565b600060405180830381600087803b158015613e7a57600080fd5b505af1158015613e8e573d6000803e3d6000fd5b505050506000805160206162cb8339815191528160","2001518585858560400151613eb7876145ef565b8760c001518860a0015189608001516001604051613ede9a99989796959493929190616061565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e00151836101000151604051613a8d9392919092835260ff919091166020830152604082015260600190565b6001546001600160a01b031663bccc247f613f54836145ef565b83602001518787878760c001518860a001518961012001518a61014001516040518a63ffffffff1660e01b8152600401613f9699989796959493929190616102565b600060405180830381600087803b158015613fb057600080fd5b505af1158015613fc4573d6000803e3d6000fd5b505050506000805160206162cb83398151915281602001518585858560400151613fed876145ef565b60c088015160a089015160808a01516101408b0151604051613ede9a999897969594939291600191615f6e565b600061402a826101200151614925565b90508060400151600860008787604051602001614048929190615a41565b60405160208183030381529060405280519060200120815260200190815260200160002060020181905550806080015160086000878760405160200161408f929190615a41565b60405160208183030381529060405280519060200120815260200190815260200160002060040160006101000a8154816001600160401b0302191690836001600160401b0316021790555080606001516008600087876040516020016140f6929190615a41565b604051602081830303815290604052805190602001208152602001908152602001600020600301819055506000805160206162cb83398151915282602001518686868660400151614146886145ef565b60c089015160a08a015160808b01516101408c01516040516141739a999897969594939291600191615f6e565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad282602001518360e001518461010001516040516141cf9392919092835260ff919091166020830152604082015260600190565b60405180910390a15050505050565b6040805160208082528183019092526000918291906020820181803683375050506020018390525090919050565b81830151600060208204600101601f831615614226576001015b5b8082101561144e578585015160208302850152602086039550600182019150614227565b60006112798260200151611bfe565b6000806142688585856119dd565b6000818152600560205260408120805492935063ffffffff909216918291611cb683615ca6565b6000848484846040516020016142a89493929190616188565b604051602081830303815290604052805190602001209050949350505050565b60006060600060606142d9856145ef565b6001600160a01b03163b61431c575050604080518082019091526014815273726563656976657220686173206e6f20636f646560601b60208201526000906143f9565b6001546001600160a01b0316639465cfa48989896143398a6145ef565b8a60e001516040518663ffffffff1660e01b815260040161435e959493929190615e29565b600060405180830381600087803b15801561437857600080fd5b505af1925050508015614389575060015b6143f457614395615e71565b806308c379a014156143bc57506143aa615e8d565b806143b557506143be565b90506143f9565b505b3d8080156143e8576040519150601f19603f3d011682016040523d82523d6000602084013e6143ed565b606091505b50506143f9565b600191505b9097909650945050505050565b60006060600061445187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050606087015188915061425a565b90508063ffffffff168460c0015163ffffffff16146144b25760405162461bcd60e51b815260206004820152601a60248201527f5344504d73673a2073657175656e6365206e6f7420657175616c00000000000060448201526064016104c1565b6000606060006144c1876145ef565b90506001600160a01b0381163b61450a576000925060405180604001604052806014815260200173726563656976657220686173206e6f20636f646560601b81525091506145e0565b60015460e0880151604051636bc704b360e01b81526001600160a01b0390921691636bc704b391614545918e918e918e918891600401615e29565b600060405180830381600087803b15801561455f57600080fd5b505af1925050508015614570575060015b6145db5761457c615e71565b806308c379a014156145a35750614591615e8d565b8061459c57506145a5565b91506145e0565b505b3d8080156145cf576040519150601f19603f3d011682016040523d82523d6000602084013e6145d4565b606091505b50506145e0565b600192505b50909890975095505050505050565b60006112798260600151611bfe565b6000614609876145ef565b905085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506040880152606087018490528261465957600361465c565b60025b60ff1660808801528261466f5781614680565b604051806020016040528060008152505b6101008801526002546001600160a01b031663e41fb51782610e968a611ee8565b60006060600060606146b2856145ef565b6001600160a01b03163b6146f5575050604080518082019091526014815273726563656976657220686173206e6f20636f646560601b60208201526000906143f9565b6001546001600160a01b03166327bdcf648989896147128a6145ef565b8a61012001516040518663ffffffff1660e01b815260040161435e959493929190615e29565b60006060600061478387878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050606087015188915061425a565b90508063ffffffff168460c0015163ffffffff16146147ee5760405162461bcd60e51b815260206004820152602160248201527f5344505f4d53475f4552524f523a2073657175656e6365206e6f7420657175616044820152601b60fa1b60648201526084016104c1565b6000606060006147fd876145ef565b90506001600160a01b0381163b614846576000925060405180604001604052806014815260200173726563656976657220686173206e6f20636f646560601b81525091506145e0565b600154610120880151604051630dbc0e0b60e41b81526001600160a01b039092169163dbc0e0b091614545918e918e918e918891600401615e29565b600061488d876145ef565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050604088015260608701849052826148dd5760036148e0565b60025b60ff166080880152826148f35781614904565b604051806020016040528060008152505b6101408801526002546001600160a01b031663e41fb51782610e968a612510565b6040805160a080820183526000808352606060208085018290528486018390528185018390526080808601849052865194850187528385529084018290529483018290528201819052928101839052909161497f84614a9b565b905060005b816020015151811015614a92576000826020015182815181106149a9576149a96161c4565b60200260200101519050806000015161ffff16600014156149d8576149cd81614c76565b61ffff168452614a7f565b806000015161ffff16600114156149f85760408101516020850152614a7f565b806000015161ffff1660021415614a2857614a1e6020614a19836040015190565b015190565b6040850152614a7f565b806000015161ffff1660031415614a5657614a4c614a47826040015190565b612cd7565b6060850152614a7f565b806000015161ffff1660041415614a7f57614a7081614c8a565b6001600160401b031660808501525b5080614a8a81615def565b915050614984565b50909392505050565b604080518082019091526000815260606020820152600682511015614b025760405162461bcd60e51b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e67746800000000000000000060448201526064016104c1565b6040805180820190915260008082526060602083015290614b2b614b268584614ca3565b614ccb565b61ffff168152614b3c600683615c8e565b91506000825b8551811015614b9657614b67614b6287614b5d846002615c8e565b614d6c565b614d96565b614b72906006615d48565b614b829063ffffffff1682615c8e565b905081614b8e81615def565b925050614b42565b6000826001600160401b03811115614bb057614bb06155b9565b604051908082528060200260200182016040528015614bfd57816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081614bce5790505b509050600092505b8651851015614c675760408051606080820183526000808352602083015291810191909152614c348887614e90565b96509050808285614c4481615def565b965081518110614c5657614c566161c4565b602002602001018190525050614c05565b60208401525090949350505050565b6000611279614b2660028460400151015190565b6000611279614c9e60088460400151015190565b614feb565b8151600090614cb3836002615c8e565b1115614cbe57600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b81600081518110614d0e57614d0e6161c4565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600181518110614d3f57614d3f6161c4565b60200101906001600160f81b031916908160001a9053506000614d63826000614ca3565b95945050505050565b8151600090614d7c836004615c8e565b1115614d8757600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b81600081518110614dd957614dd96161c4565b60200101906001600160f81b031916908160001a9053508160021a60f81b81600181518110614e0a57614e0a6161c4565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600281518110614e3b57614e3b6161c4565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600381518110614e6c57614e6c6161c4565b60200101906001600160f81b031916908160001a9053506000614d63826000614d6c565b60408051606080820183526000808352602083","015291810191909152600082845111614f0a5760405162461bcd60e51b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b60648201526084016104c1565b6006831015614f4c5760405162461bcd60e51b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b60448201526064016104c1565b60408051606080820183526000808352602083015291810191909152614f75614b268686614ca3565b61ffff168152614f86600285615c8e565b9350614f95614b628686614d6c565b63ffffffff166020820152614fab600485615c8e565b9350614fc28585836020015163ffffffff166151a9565b60408201526020810151614fdc9063ffffffff1685615c8e565b935091508290505b9250929050565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b8160008151811061502e5761502e6161c4565b60200101906001600160f81b031916908160001a9053508160061a60f81b8160018151811061505f5761505f6161c4565b60200101906001600160f81b031916908160001a9053508160051a60f81b81600281518110615090576150906161c4565b60200101906001600160f81b031916908160001a9053508160041a60f81b816003815181106150c1576150c16161c4565b60200101906001600160f81b031916908160001a9053508160031a60f81b816004815181106150f2576150f26161c4565b60200101906001600160f81b031916908160001a9053508160021a60f81b81600581518110615123576151236161c4565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600681518110615154576151546161c4565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600781518110615185576151856161c4565b60200101906001600160f81b031916908160001a9053506000614d6382600061521f565b82516060906151b88385615c8e565b11156151c357600080fd5b6000826001600160401b038111156151dd576151dd6155b9565b6040519080825280601f01601f191660200182016040528015615207576020820181803683370190505b5090506020808201908686010161215182828761524c565b815160009061522f836008615c8e565b111561523a57600080fd5b5001600801516001600160401b031690565b602081106152845781518352615263602084615c8e565b9250615270602083615c8e565b915061527d602082615c77565b905061524c565b8061528e57505050565b6000600161529d836020615c77565b6152a9906101006162be565b6152b39190615c77565b925184518416931916929092179092525050565b604080516101608101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c0820181905260e08201819052610100820152610120810182905261014081019190915290565b60008083601f84011261533457600080fd5b5081356001600160401b0381111561534b57600080fd5b602083019150836020828501011115614fe457600080fd5b8035801515811461537357600080fd5b919050565b6000806000806000806080878903121561539157600080fd5b86356001600160401b03808211156153a857600080fd5b6153b48a838b01615322565b9098509650602089013595508691506153cf60408a01615363565b945060608901359150808211156153e557600080fd5b506153f289828a01615322565b979a9699509497509295939492505050565b6000806000806000806080878903121561541d57600080fd5b86356001600160401b038082111561543457600080fd5b6154408a838b01615322565b909850965060208901359550604089013591508082111561546057600080fd5b5061546d89828a01615322565b979a9699509497949695606090950135949350505050565b60008060006040848603121561549a57600080fd5b8335925060208401356001600160401b038111156154b757600080fd5b6154c386828701615322565b9497909650939450505050565b80356001600160a01b038116811461537357600080fd5b6000602082840312156154f957600080fd5b611c2a826154d0565b803560ff8116811461537357600080fd5b60008060008060008060008060c0898b03121561552f57600080fd5b88356001600160401b038082111561554657600080fd5b6155528c838d01615322565b909a50985060208b0135975088915061556d60408c01615363565b965060608b013591508082111561558357600080fd5b506155908b828c01615322565b90955093506155a3905060808a01615502565b915060a089013590509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156155f4576155f46155b9565b6040525050565b6000602080838503121561560e57600080fd5b82356001600160401b038082111561562557600080fd5b818501915085601f83011261563957600080fd5b81358181111561564b5761564b6155b9565b6040519150615663601f8201601f19168501836155cf565b808252868482850101111561567757600080fd5b8084840185840137600090820190930192909252509392505050565b600080600080600080600060a0888a0312156156ae57600080fd5b87356001600160401b03808211156156c557600080fd5b6156d18b838c01615322565b909950975060208a013596508791506156ec60408b016154d0565b95506156fa60608b01615363565b945060808a013591508082111561571057600080fd5b5061571d8a828b01615322565b989b979a50959850939692959293505050565b6000806000806000806080878903121561574957600080fd5b86356001600160401b038082111561576057600080fd5b61576c8a838b01615322565b9098509650602089013595508691506153cf60408a016154d0565b600080600080600080600080600060e08a8c0312156157a557600080fd5b89356001600160401b03808211156157bc57600080fd5b6157c88d838e01615322565b909b50995060208c013598508991506157e360408d016154d0565b97506157f160608d01615363565b965060808c013591508082111561580757600080fd5b506158148c828d01615322565b9095509350615827905060a08b01615502565b915060c08a013590509295985092959850929598565b6000806020838503121561585057600080fd5b82356001600160401b0381111561586657600080fd5b61587285828601615322565b90969095509350505050565b60005b83811015615899578181015183820152602001615881565b8381111561084f5750506000910152565b600081518084526158c281602086016020860161587e565b601f01601f19169290920160200192915050565b6020815261ffff82511660208201526000602083015160a0604084015261590060c08401826158aa565b905060408401516060840152606084015160808401526001600160401b0360808501511660a08401528091505092915050565b60008060008060006060868803121561594b57600080fd5b85356001600160401b038082111561596257600080fd5b61596e89838a01615322565b909750955060208801359450604088013591508082111561598e57600080fd5b5061599b88828901615322565b969995985093965092949392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60a0815260006159e960a08301898b6159ac565b602083018890526001600160a01b038716604084015285151560608401528281036080840152615a1a8185876159ac565b9a9950505050505050505050565b600060208284031215615a3a57600080fd5b5051919050565b8183823760009101908152919050565b6020808252601e908201527f5344504d73673a2077726f6e6720726563656976696e6720646f6d61696e0000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008251615acf81846020870161587e565b9190910192915050565b6001600160a01b03891681526020810188905261010060408201819052600090615b058382018a6158aa565b905087606084015263ffffffff871660808401526001600160401b03861660a084015282810360c0840152615b3a81866158aa565b905082810360e0840152615b4e81856158aa565b9b9a5050505050505050505050565b60e081526000615b7160e083018b8d6159ac565b602083018a90526001600160a01b038916604084015287151560608401528281036080840152615ba28187896159ac565b60ff9590951660a0840152505060c00152979650505050505050565b60208082526022908201527f5344504d73673a206e6f742076616c6964206d6f6e69746f7220636f6e74726160408201526118dd60f21b606082015260800190565b6001600160a01b0383168152604060208201819052600090615c24908301846158aa565b949350505050565b600181811c90821680615c4057607f821691505b6020821081141561302b57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015615c8957615c89615c61565b500390565b60008219821115615ca157615ca1615c61565b500190565b600063ffffffff80831681811415615cc057615cc0615c61565b6001019392505050565b6020808252601f908201527f656e636f64655344504d6573736167653a2077726f6e672076657273696f6e00604082015260600190565b60208082526027908201527f656e636f64655344504d6573736167653a20626f6479206c656e677468206f76604082015266195c9b1a5b5a5d60ca1b606082015260800190565b600063ffffffff808316818516808303821115615d6757615d67615c61565b01949350505050565b60208082526021908201527f656e636f64655344504d6573736167653a207a65726f206d65737361676520696040820152601960fa1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082615dd657615dd6615db1565b500490565b600082615dea57615dea615db1565b500690565b6000600019821415615e0357615e03615c61565b5060010190565b6000816000190483118215151615615e2457615e24615c61565b500290565b608081526000615e3d6080830187896159ac565b602083018690526001600160a01b03851660408401528281036060840152615e6581856158aa565b98975050505050505050565b600060033d1115615e8a5760046000803e5060005160e01c5b90565b600060443d1015615e9b5790565b6040516003193d81","016004833e81513d6001600160401b038160248401118184111715615eca57505050505090565b8285019150815181811115615ee25750505050505090565b843d8701016020828501011115615efc5750505050505090565b612151602082860101876155cf565b60c081526000615f1f60c08301898b6159ac565b602083018890526001600160a01b038716604084015263ffffffff86166060840152841515608084015282810360a0840152615a1a81856158aa565b602081526000611c2a60208301846158aa565b60006101408d8352806020840152615f898184018d8f6159ac565b90508a60408401528281036060840152615fa3818b6158aa565b6001600160a01b038a16608085015263ffffffff891660a08501526001600160401b03881660c085015260ff871660e08501528515156101008501528381036101208501529050615ff481856158aa565b9e9d5050505050505050505050505050565b60018060a01b038916815287602082015260e06040820152600061602e60e08301888a6159ac565b86606084015263ffffffff861660808401526001600160401b03851660a084015282810360c0840152615b4e81856158aa565b60006101408c835280602084015261607c8184018c8e6159ac565b90508960408401528281036060840152616096818a6158aa565b6001600160a01b03989098166080840152505063ffffffff9490941660a08501526001600160401b039290921660c084015260ff1660e083015215156101008201528082036101209091015260078152667375636365737360c81b602082015260400195945050505050565b6001600160a01b038a168152602081018990526101006040820181905260009061612f8382018a8c6159ac565b905087606084015263ffffffff871660808401526001600160401b03861660a084015282810360c084015261616481866158aa565b905082810360e084015261617881856158aa565b9c9b505050505050505050505050565b6000855161619a818460208a0161587e565b9190910193845250602083019190915260c01b6001600160c01b0319166040820152604801919050565b634e487b7160e01b600052603260045260246000fd5b600181815b808511156162155781600019048211156161fb576161fb615c61565b8085161561620857918102915b93841c93908002906161df565b509250929050565b60008261622c57506001611279565b8161623957506000611279565b816001811461624f576002811461625957616275565b6001915050611279565b60ff84111561626a5761626a615c61565b50506001821b611279565b5060208310610133831016604e8410600b8410161715616298575081810a611279565b6162a283836161da565b80600019048211156162b6576162b6615c61565b029392505050565b6000611c2a838361621d56fecf362ac32ec1d372722255e0e7a9b99808ee047e0d29b8439c3e69c6317ab289a2646970667358221220098a15c0b696b07cc7f62e38fe4129e02f4031047abe0bd8173a1c5b4ab76da564736f6c634300080b0033"}; public static final String BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", BINARY_ARRAY); - public static final String[] SM_BINARY_ARRAY = {"60806040523480156200001157600080fd5b506200001d336200002d565b620000276200007d565b6200014d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b600054600160a81b900460ff1615620000ed57604051636381e58960e11b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff600160a01b909104811610156200014b576000805460ff60a01b191660ff60a01b17905560405160ff81527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa9060200160405180910390a15b565b615bfc806200015d6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063710631db116100ad578063b510a39211610071578063b510a39214610266578063d86e29e214610277578063e0c9e1ed1461027f578063f0faf11714610292578063f7d579c7146102ba57600080fd5b8063710631db1461021257806385e9ae14146102255780639118310214610238578063947f76311461024b578063abf915cd1461025e57600080fd5b806344a2c079116100f457806344a2c079146101b65780635089e2c8146101be57806360e6fbc4146101e3578063638704bd146101f657806365699d8d146101ff57600080fd5b80630204ebc21461013157806309c527541461014657806316cad12a1461016f578063281cf5e6146101825780634183bc3f14610195575b600080fd5b61014461013f366004614f54565b6102cd565b005b610159610154366004614fcd565b6103ce565b6040516101669190615066565b60405180910390f35b61014461017d3660046150c3565b610510565b610144610190366004614f54565b6105b6565b6101a86101a3366004615101565b610795565b604051908152602001610166565b6002546101a8565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610166565b6101a86101f13660046151b0565b6109c9565b6101a860025481565b61014461020d366004614f54565b610b6e565b6101446102203660046150c3565b610cb6565b61014461023336600461527e565b610d5a565b6101a8610246366004615101565b610db4565b6001546101cb906001600160a01b031681565b610144610f46565b6001546001600160a01b03166101cb565b610144611073565b61014461028d366004615316565b6110aa565b6102a56102a0366004615361565b6113d0565b60405163ffffffff9091168152602001610166565b6101a86102c83660046151b0565b611482565b6040805160a06020601f88018190040282018101909252608081018681526000928291908990899081908501838280828437600092019190915250505090825250602080820187905260408051601f8701839004830281018301825286815292019190869086908190840183828082843760009201919091525050509082525063ffffffff6020909101526001549091506001600160a01b031663317c40ab33610376846115bb565b6040518363ffffffff1660e01b81526004016103939291906153e2565b600060405180830381600087803b1580156103ad57600080fd5b505af11580156103c1573d6000803e3d6000fd5b505050505b505050505050565b6040805160a0810182526000808252606060208301819052928201819052918101829052608081019190915260076000848460405160200161041192919061540e565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825160a08101909352805461ffff168352600181018054919284019161045d9061541e565b80601f01602080910402602001604051908101604052809291908181526020018280546104899061541e565b80156104d65780601f106104ab576101008083540402835291602001916104d6565b820191906000526020600020905b8154815290600101906020018083116104b957829003601f168201915b505050918352505060028201546020820152600382015460408201526004909101546001600160401b031660609091015290505b92915050565b6000546001600160a01b0316331461054457604051636381e58960e11b815260040161053b90615453565b60405180910390fd5b6001600160a01b0381166105aa57604051636381e58960e11b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161053b565b6105b3816116d6565b50565b6001546001600160a01b0316331461061157604051636381e58960e11b815260206004820152601d60248201527f5344504d73673a206e6f742076616c696420616d20636f6e7472616374000000604482015260640161053b565b600061065283838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061172692505050565b90508063ffffffff16600114156106aa576106a586868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061178b92505050565b6103c6565b8063ffffffff16600214156106fb576106a586868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061183292505050565b8063ffffffff166003141561074c576106a586868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061197692505050565b604051636381e58960e11b815260206004820152601760248201527f756e737570706f72746564207364702076657273696f6e000000000000000000604482015260640161053b565b6000600460ff841611156107ec57604051636381e58960e11b815260206004820152601c60248201527f5344503a20696e76616c69642074696d656f7574206d65617375726500000000604482015260640161053b565b604080516101608101825260038152600060208083018290528351601f8d0182900482028101820185528c81528b949293928301918e908e90819084018382808284376000920191909152505050908252506020810184905260400189610854576000610857565b60015b60ff1681526020016108a28d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250339250889150611adb9050565b63ffffffff166001600160401b0316815260200163ffffffff801681526020018660ff16815260200185815260200188888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050604080516020818101909252928352909201525060025490915061092d908290611b3b565b6020808201516000908152600890915260409020805460ff19166001908117909155546001600160a01b031663317c40ab3361096884611da1565b6040518363ffffffff1660e01b81526004016109859291906153e2565b600060405180830381600087803b15801561099f57600080fd5b505af11580156109b3573d6000803e3d6000fd5b50505050602001519a9950505050505050505050565b6000604080516101208101825260028152600060208083018290528351601f8b0182900482028101820185528a81529193830191908b908b90819084018382808284376000920191909152505050908252506020810188905260400186610a31576000610a34565b60015b60ff1681526020016001600160401b0380168152602001610a8e8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503392508c91506120aa9050565b63ffffffff16815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181019092529283529092015250600254909150610af59082906120df565b6001546001600160a01b031663317c40ab33610b10846122e8565b6040518363ffffffff1660e01b8152600401610b2d9291906153e2565b600060405180830381600087803b158015610b4757600080fd5b505af1158015610b5b573d6000803e3d6000fd5b5050505060200151979650505050505050565b6040805160a06020601f88018190040282018101909252608081018681526000928291908990899081908501838280828437600092019190915250505090825250602080820187905260408051601f87018390048302810183018252868152920191908690869081908401838280828437600092019190915250505090825250604080516020601f8a0181900481028201810190925288815291810191610c33918a908a90819084018382808284376000920191909152503392508a91506120aa9050565b63ffffffff16905290506000610c48826115bb565b60015460405163317c40ab60e01b81529192506001600160a01b03169063317c40ab90610c7b90339085906004016153e2565b600060405180830381600087803b158015610c9557600080fd5b505af1158015610ca9573d6000803e3d6000fd5b5050505050505050505050565b6000546001600160a01b03163314610ce157604051636381e58960e11b815260040161053b90615453565b6001600160a01b038116610d3857604051636381e58960e11b815260206004820152601b60248201527f5344504d73673a20696e76616c696420616d20636f6e74726163740000000000604482015260640161053b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610d8557604051636381e58960e11b815260040161053b90615453565b80604051602001610d969190615488565b60408051601f19818403018152919052805160209091012060025550565b6000600460ff84161115610e0b57604051636381e58960e11b815260206004820152601c60248201527f5344503a20696e76616c69642074696d656f7574206d65617375726500000000604482015260640161053b565b604080516101608101825260038152600060208083018290528351601f8d0182900482028101820185528c81528b949293928301918e908e90819084018382808284376000920191909152505050908252506020810184905260400189610e73576000610e76565b60015b60ff1681526020016001600160401b0380168152602001610ed08d8d8080601f016020809104026020016040","5190810160405280939291908181526020018383808284376000920191909152503392508891506120aa9050565b63ffffffff1681526020018660ff16815260200185815260200188888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050604080516020818101909252928352909201525060025490915061092d908290611b3b565b600054600160a81b900460ff1615808015610f6e57506000546001600160a01b90910460ff16105b80610f8f5750303b158015610f8f5750600054600160a01b900460ff166001145b610ff357604051636381e58960e11b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161053b565b6000805460ff60a01b1916600160a01b1790558015611020576000805460ff60a81b1916600160a81b1790555b611029336116d6565b80156105b3576000805460ff60a81b19169055604051600181527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa9060200160405180910390a150565b6000546001600160a01b0316331461109e57604051636381e58960e11b815260040161053b90615453565b6110a860006116d6565b565b6000546001600160a01b031633146110d557604051636381e58960e11b815260040161053b90615453565b6110dd614eb8565b61111f83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859392505061255f9050565b60e081015160ff1661118b57604051636381e58960e11b815260206004820152602e60248201527f5344505f4d53475f4552524f523a20746865206d6573736167652074696d656f60448201526d075744d65617375726520697320360941b606482015260840161053b565b8060e0015160ff166002141561136e578061010001516007600083604001516040516020016111ba9190615488565b6040516020818303038152906040528051906020012081526020019081526020016000206003015411156112ff5760208082015160009081526008909152604090205460ff1661126a57604051636381e58960e11b815260206004820152603460248201527f5344505f4d53475f4552524f523a20657863657074696f6e206d657373616765604482015273081a185cda08191bd95cc81b9bdd08195e1a5cdd60621b606482015260840161053b565b61127384612719565b6001600160a01b031663d417dd188260200151836040015184606001518560c001518660a001518761012001518861014001516040518863ffffffff1660e01b81526004016112c897969594939291906154a4565b600060405180830381600087803b1580156112e257600080fd5b505af11580156112f6573d6000803e3d6000fd5b505050506113ca565b604051636381e58960e11b815260206004820152603f60248201527f5344505f4d53475f4552524f523a20746865206d657373616765206973206e6f60448201527f742074696d656f757420776974682074696d656f75744d656173757265203200606482015260840161053b565b604051636381e58960e11b815260206004820152602a60248201527f5344505f4d53475f4552524f523a20756e737570706f727465642074696d656f6044820152697574206d65617375726560b01b606482015260840161053b565b50505050565b600060025484846040516020016113e892919061540e565b604051602081830303815290604052805190602001201461141c57604051636381e58960e11b815260040161053b90615512565b600061146188888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a925087915061274c9050565b60009081526004602052604090205463ffffffff1698975050505050505050565b6000604080516101208101825260028152600060208083018290528351601f8b0182900482028101820185528a81529193830191908b908b908190840183828082843760009201919091525050509082525060208101889052604001866114ea5760006114ed565b60015b60ff1681526020016115388a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503392508c9150611adb9050565b63ffffffff166001600160401b0316815260200163ffffffff8016815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181019092529283529092015250600254909150610af59082906120df565b5050505050565b606060006115cc83600001516127a9565b6115d984604001516127a9565b6115e490600461555f565b6115ef90602061555f565b6115f9919061555f565b90506000816001600160401b038111156116155761161561523c565b6040519080825280601f01601f19166020018201604052801561163f576020820181803683370190505b5084519091508290611653908290846127f5565b845161165e906127a9565b6116689082615577565b6020868101518285015290915061167f9082615577565b905061169081866060015184612853565b61169a6020612864565b6116a49082615577565b90506116b5818660400151846127f5565b6116c285604001516127a9565b6116cc9082615577565b5090949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b8051601c81830101516000916001600160f81b03198083161415611781576040805160048082528183019092526000918291906020820181803683370190505095909201601d01516021860152505050600490910151919050565b5060019392505050565b6040805160808101825260608082526000602083018190529282018190528101919091526117b9818361286f565b60025481516040516117ce9190602001615488565b604051602081830303815290604052805190602001201461180257604051636381e58960e11b815260040161053b90615512565b606081015163ffffffff908116141561182657611821858585846129e0565b6115b4565b6115b485858584612a56565b604080516101208101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c082015260e081018290526101008101919091526118848183612c74565b600254816040015160405160200161189c9190615488565b60405160208183030381529060405280519060200120146118d057604051636381e58960e11b815260040161053b90615512565b608081015160ff1615806118eb5750608081015160ff166001145b156118fc5761182185858584612dc6565b608081015160ff16600214156119185761182185858584612f85565b608081015160ff16600314156119345761182185858584613073565b604051636381e58960e11b8152602060048201526016602482015275756e65787065637465642061746f6d696320666c616760501b604482015260640161053b565b61197e614eb8565b611988818361255f565b60025481604001516040516020016119a09190615488565b6040516020818303038152906040528051906020012014611a0457604051636381e58960e11b815260206004820152601f60248201527f5344505f4d73673a2077726f6e6720726563656976696e6720646f6d61696e00604482015260640161053b565b608081015160ff161580611a1f5750608081015160ff166001145b15611a305761182185858584613160565b608081015160ff1660021415611a4c57611821858585846133e1565b608081015160ff1660031415611a68576118218585858461350c565b608081015160ff1660041415611a8457611821858585846135e8565b604051636381e58960e11b815260206004820152602560248201527f5344505f4d53475f4552524f523a20756e65787065637465642061746f6d696360448201526420666c616760d81b606482015260840161053b565b600080611ae98585856137ac565b6000818152600560205260408120805492935063ffffffff909216918291611b108361558e565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b816000015163ffffffff16600314611b6657604051636381e58960e11b815260040161053b906155b2565b63ffffffff826101200151511115611b9157604051636381e58960e11b815260040161053b906155e9565b6000611ba183610100015161381b565b90506000815184610120015151856040015151607e611bc0919061555f565b611bca919061555f565b611bd4919061555f565b90506000816001600160401b03811115611bf057611bf061523c565b6040519080825280601f01601f191660200182016040528015611c1a576020820181803683370190505b5085519091508290611c3c908290611c369063ff000000615630565b84612853565b611c4660206138be565b611c509082615577565b6040870151909150611c63828285613aed565b8051611c7090600461555f565b611c7a9083615577565b6060880151818501529150611c90602083615577565b9150611ca182886080015185613bdc565b611cac600183615577565b9150611cbd828860a0015185613bed565b611cc760406138be565b611cd19083615577565b9150611ce2828860c0015185612853565b611cec60206138be565b611cf69083615577565b9150611d07828860e0015185613bdc565b611d12600183615577565b9150611d1f828685613aed565b8451611d2c90600461555f565b611d369083615577565b9150611d488288610120015185613aed565b61012087015151611d5a90600461555f565b611d649083615577565b33818501529150611d76602083615577565b8084018790529150611d89602083615577565b50508151602092830120959091019490945250505050565b6060816000015163ffffffff16600314611dce57604051636381e58960e11b815260040161053b906155b2565b63ffffffff826101200151511115611df957604051636381e58960e11b815260040161053b906155e9565b6020820151611e1b57604051636381e58960e11b815260040161053b90615658565b600080600260ff16846080015160ff161190506000611e3e85610100015161381b565b90508115611e975761014085015151815161012087015151604088015151611e6790605e61555f565b611e71919061555f565b611e7b919061555f565b611e8690600461555f565b611e90919061555f565b9250611ec8565b8051610120860151516040","87015151611eb190605e61555f565b611ebb919061555f565b611ec5919061555f565b92505b6000836001600160401b03811115611ee257611ee261523c565b6040519080825280601f01601f191660200182016040528015611f0c576020820181803683370190505b5086519091508490611f28908290611c369063ff000000615630565b611f3260206138be565b611f3c9082615577565b60208881015182850152909150611f539082615577565b6040880151909150611f66828285613aed565b8051611f7390600461555f565b611f7d9083615577565b6060890151818501529150611f93602083615577565b9150611fa482896080015185613bdc565b611faf600183615577565b9150611fc0828960a0015185613bed565b611fca60406138be565b611fd49083615577565b9150611fe5828960c0015185612853565b611fef60206138be565b611ff99083615577565b915061200a828960e0015185613bdc565b612015600183615577565b9150612022828585613aed565b835161202f90600461555f565b6120399083615577565b915061204b8289610120015185613aed565b6101208801515161205d90600461555f565b6120679083615577565b9150841561209e5761207f8289610140015185613aed565b6101408801515161209190600461555f565b61209b9083615577565b91505b50909695505050505050565b6000806120b88585856137ac565b6000818152600360205260408120805492935063ffffffff909216918291611b108361558e565b816000015163ffffffff1660021461210a57604051636381e58960e11b815260040161053b906155b2565b63ffffffff8260e0015151111561213457604051636381e58960e11b815260040161053b906155e9565b60008260e0015151836040015151607961214e919061555f565b612158919061555f565b90506000816001600160401b038111156121745761217461523c565b6040519080825280601f01601f19166020018201604052801561219e576020820181803683370190505b50845190915082906121c69082906121ba9063ff000000615630565b63ffffffff1690840152565b6121d060206138be565b6121da9082615577565b60408601519091506121ed828285613aed565b80516121fa90600461555f565b6122049083615577565b606087015181850152915061221a602083615577565b915061222b82876080015185613bdc565b612236600183615577565b9150612247828760a0015185613bed565b61225160406138be565b61225b9083615577565b915061226c828760c0015185612853565b61227660206138be565b6122809083615577565b9150612291828760e0015185613aed565b60e0860151516122a290600461555f565b6122ac9083615577565b338185015291506122be602083615577565b80840186905291506122d1602083615577565b505081516020928301209490910193909352505050565b6060816000015163ffffffff1660021461231557604051636381e58960e11b815260040161053b906155b2565b63ffffffff8260e0015151111561233f57604051636381e58960e11b815260040161053b906155e9565b602082015161236157604051636381e58960e11b815260040161053b90615658565b6080820151600090600260ff9091161180156123bb576101008401515160e08501515160408601515161239590605961555f565b61239f919061555f565b6123aa90600461555f565b6123b4919061555f565b91506123df565b60e0840151516040850151516123d290605961555f565b6123dc919061555f565b91505b6000826001600160401b038111156123f9576123f961523c565b6040519080825280601f01601f191660200182016040528015612423576020820181803683370190505b508551909150839061243f9082906121ba9063ff000000615630565b61244960206138be565b6124539082615577565b6020878101518285015290915061246a9082615577565b604087015190915061247d828285613aed565b805161248a90600461555f565b6124949083615577565b60608801518185015291506124aa602083615577565b91506124bb82886080015185613bdc565b6124c6600183615577565b91506124d7828860a0015185613bed565b6124e160406138be565b6124eb9083615577565b91506124fc828860c0015185612853565b61250660206138be565b6125109083615577565b9150612521828860e0015185613aed565b60e08701515161253290600461555f565b61253c9083615577565b91508315612554576125548288610100015185613aed565b509095945050505050565b805161256a82611726565b63ffffffff16835261257c6020612864565b6125869082615577565b90506125928183015190565b602084015261259f602090565b6125ac9060ff1682615577565b905060006125ba8284613bfe565b6040850181905280519091506125d190600461555f565b6125db9083615577565b91506125e78284015190565b60608501526125f7602083615577565b91506126038284015190565b60ff166080850152612616600183615577565b91506126228284015190565b6001600160401b031660a085015261263b600883615577565b91506126478284015190565b63ffffffff1660c085015261265d600483615577565b91506126698284015190565b60ff1660e085015261267c600183615577565b9150600061268a8385613bfe565b905061269581613d04565b61010086015280516126a890600461555f565b6126b29084615577565b92506126be8385613bfe565b6101208601819052516126d290600461555f565b6126dc9084615577565b9250600260ff16856080015160ff1611156115b4576126fb8385613bfe565b61014086018190525161270f90600461555f565b6103c69084615577565b604080516020808252818301909252600091829190602082018180368337505050602081018490529050825b9392505050565b60008360405160200161275f9190615488565b60408051601f198184030181528282528051602091820120908301528101849052606081018390526080016040516020818303038152906040528051906020012090509392505050565b6000602082516127b991906156af565b9050602082516127c991906156c3565b156127dc57806127d8816156d7565b9150505b806127e6816156d7565b915061050a90506020826156f2565b60006020835161280591906156af565b905060006020845161281791906156c3565b111561282b5780612827816156d7565b9150505b60010160005b818110156115b4576020810284015183860152601f1990940193600101612831565b909101600319810180519290915252565b600061050a826138be565b8051600061287d8284015190565b612888906020615630565b905060008163ffffffff166001600160401b038111156128aa576128aa61523c565b6040519080825280601f01601f1916602001820160405280156128d4576020820181803683370190505b5090506128e2838583613dc1565b6128eb816127a9565b6128f59084615577565b925060006129038486015190565b9050612910602085615577565b9350600061291e8587015190565b905061292a60206138be565b6129349086615577565b945060006129428688015190565b61294d906020615630565b905060008163ffffffff166001600160401b0381111561296f5761296f61523c565b6040519080825280601f01601f191660200182016040528015612999576020820181803683370190505b5090506129a7878983613dc1565b6129b0816127a9565b6129ba9088615577565b5093885250602087019190915263ffffffff166060860152604090940193909352505050565b6129e981613e00565b6001600160a01b031663e5b813ad85858585604001516040518563ffffffff1660e01b8152600401612a1e949392919061573a565b600060405180830381600087803b158015612a3857600080fd5b505af1158015612a4c573d6000803e3d6000fd5b5050505050505050565b6000612a9d85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506020850151869150613e0f565b90508063ffffffff16826060015163ffffffff1614612aff57604051636381e58960e11b815260206004820152601a60248201527f5344504d73673a2073657175656e6365206e6f7420657175616c000000000000604482015260640161053b565b600060606000612b0e85613e00565b90506001600160a01b0381163b612b57576000925060405180604001604052806014815260200173726563656976657220686173206e6f20636f646560601b8152509150612c27565b604080860151905163140e7af360e11b81526001600160a01b0383169163281cf5e691612b8c918c918c918c9160040161573a565b600060405180830381600087803b158015612ba657600080fd5b505af1925050508015612bb7575060015b612c2257612bc3615771565b8063c703cb121415612bea5750612bd861578d565b80612be35750612bec565b9150612c27565b505b3d808015612c16576040519150601f19603f3d011682016040523d82523d6000602084013e612c1b565b606091505b5050612c27565b600192505b7fa7b67603ab1ccc49bd49f413615eec42635893f21e8a6ecf8bd542465fa536e788888884888888604051612c62979695949392919061580b565b60405180910390a15050505050505050565b8051612c7f82611726565b63ffffffff168352612c916020612864565b612c9b9082615577565b9050612ca78183015190565b6020840152612cb4602090565b612cc19060ff1682615577565b90506000612ccf8284613bfe565b604085018190528051909150612ce690600461555f565b612cf09083615577565b9150612cfc8284015190565b6060850152612d0c602083615577565b9150612d188284015190565b60ff166080850152612d2b600183615577565b9150612d378284015190565b6001600160401b031660a0850152612d50600883615577565b9150612d5c8284015190565b63ffffffff1660c0850152612d72600483615577565b9150612d7e8284613bfe565b60e0850181905251612d9190600461555f565b612d9b9083615577565b9150600260ff16846080015160ff1611156113ca57612dba8284613bfe565b61010085015250505050565b6000606063ffffffff80168360c0015163ffffffff161415612eee576000612e2e87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050606087015160a0880151899250613e44565b60008181526006602052604090205490915060ff1615612e9157604051636381e58960e11b815260206004820181905260248201527f5344504d73673a206e6f6e636520686173206265656e2070726f636573736564604482015260640161053b565b612e9d87878787613e7d565b6080860151","919450925060ff16612ed0578183612ece57604051636381e58960e11b815260040161053b919061585b565b505b6000908152600660205260409020805460ff19166001179055612f00565b612efa86868686613fb7565b90925090505b7fe5b48da3ec5c2477fc166b4d1382803ec27d0bd0a8e507b7b5919a94dbee8c1d83602001518787878760400151612f378961419b565b8960c001518a60a001518b608001518b8b604051612f5f9b9a9998979695949392919061586e565b60405180910390a1608083015160ff16600114156103c6576103c68387878786866141aa565b612f8e8161419b565b6001600160a01b031663fbec456382602001518686868660c001518760a001518860e001516040518863ffffffff1660e01b8152600401612fd59796959493929190615906565b600060405180830381600087803b158015612fef57600080fd5b505af1158015613003573d6000803e3d6000fd5b505050507fe5b48da3ec5c2477fc166b4d1382803ec27d0bd0a8e507b7b5919a94dbee8c1d8160200151858585856040015161303e8761419b565b8760c001518860a00151896080015160016040516130659a99989796959493929190615953565b60405180910390a150505050565b61307c8161419b565b602082015160c083015160a084015160e0850151610100860151604051631a82fba360e31b81526001600160a01b03969096169563d417dd18956130ca9590948c948c948c946004016159f4565b600060405180830381600087803b1580156130e457600080fd5b505af11580156130f8573d6000803e3d6000fd5b505050507fe5b48da3ec5c2477fc166b4d1382803ec27d0bd0a8e507b7b5919a94dbee8c1d816020015185858585604001516131338761419b565b60c088015160a089015160808a01516101008b01516040516130659a99989796959493929160019161586e565b600060608260e0015160ff166000148061318157508260e0015160ff166002145b8061319357508260e0015160ff166004145b6131f857604051636381e58960e11b815260206004820152602f60248201527f6f6e6c7920737570706f72742074696d656f7574206d65617375726520302c2060448201526e3220616e64203420666f72206e6f7760881b606482015260840161053b565b8260e0015160ff166002141561325357438361010001511161324e57604051636381e58960e11b815260206004820152600e60248201526d1b5cd9c81a5cc81d1a5b595bdd5d60921b604482015260640161053b565b6132a9565b8260e0015160ff16600414156132a95742836101000151116132a957604051636381e58960e11b815260206004820152600e60248201526d1b5cd9c81a5cc81d1a5b595bdd5d60921b604482015260640161053b565b60c083015163ffffffff9081161415613300576132c88686868661426a565b6080850151919350915060ff166132fb5780826132f957604051636381e58960e11b815260040161053b919061585b565b505b613312565b61330c868686866142fd565b90925090505b600080516020615ba7833981519152836020015187878787604001516133378961419b565b8960c001518a60a001518b608001518b8b60405161335f9b9a9998979695949392919061586e565b60405180910390a17f1004fc84ea78f1fe82b0602bce1da56b8c8d936d74474e76308ef7054ed6951b83602001518460e001518561010001516040516133bb9392919092835260ff919091166020830152604082015260600190565b60405180910390a1608083015160ff16600114156103c6576103c6838787878686614442565b6133ea8161419b565b6001600160a01b031663fbec456382602001518686868660c001518760a001518861012001516040518863ffffffff1660e01b81526004016134329796959493929190615906565b600060405180830381600087803b15801561344c57600080fd5b505af1158015613460573d6000803e3d6000fd5b50505050600080516020615ba7833981519152816020015185858585604001516134898761419b565b8760c001518860a00151896080015160016040516134b09a99989796959493929190615953565b60405180910390a17f1004fc84ea78f1fe82b0602bce1da56b8c8d936d74474e76308ef7054ed6951b81602001518260e001518361010001516040516130659392919092835260ff919091166020830152604082015260600190565b6135158161419b565b602082015160c083015160a0840151610120850151610140860151604051631a82fba360e31b81526001600160a01b03969096169563d417dd18956135649590948c948c948c946004016159f4565b600060405180830381600087803b15801561357e57600080fd5b505af1158015613592573d6000803e3d6000fd5b50505050600080516020615ba7833981519152816020015185858585604001516135bb8761419b565b60c088015160a089015160808a01516101408b01516040516134b09a99989796959493929160019161586e565b60006135f88261012001516144e5565b9050806040015160076000878760405160200161361692919061540e565b60405160208183030381529060405280519060200120815260200190815260200160002060020181905550806080015160076000878760405160200161365d92919061540e565b60405160208183030381529060405280519060200120815260200190815260200160002060040160006101000a8154816001600160401b0302191690836001600160401b0316021790555080606001516007600087876040516020016136c492919061540e565b60405160208183030381529060405280519060200120815260200190815260200160002060030181905550600080516020615ba7833981519152826020015186868686604001516137148861419b565b60c089015160a08a015160808b01516101408c01516040516137419a99989796959493929160019161586e565b60405180910390a17f1004fc84ea78f1fe82b0602bce1da56b8c8d936d74474e76308ef7054ed6951b82602001518360e0015184610100015160405161379d9392919092835260ff919091166020830152604082015260600190565b60405180910390a15050505050565b6000806137b88461465b565b905080856040516020016137cc9190615488565b60408051601f1981840301815282825280516020918201209083019390935281019190915260608101849052608001604051602081830303815290604052805190602001209150509392505050565b60408051602080825281830190925260609160009190602082018180368337505060408051602080825281830190925292935060009291508082018180368337019050509050606084602084015260015b60208110156138b55780602085010351816020850103518082036138ab57604051935060208601518385015282845282602085010160405250506138b5565b505060010161386c565b50949350505050565b600081600881146139cb57601081146139d457601881146139dd57602081146139e657602881146139ef57603081146139f85760388114613a015760408114613a0a5760488114613a135760508114613a1c5760588114613a255760608114613a2e5760688114613a375760708114613a405760788114613a495760808114613a525760888114613a5b5760908114613a645760988114613a6d5760a08114613a765760a88114613a7f5760b08114613a885760b88114613a915760c08114613a9a5760c88114613aa35760d08114613aac5760d88114613ab55760e08114613abe5760e88114613ac75760f08114613ad05760f88114613ad9576101008114613ae25760209150613ae7565b60019150613ae7565b60029150613ae7565b60039150613ae7565b60049150613ae7565b60059150613ae7565b60069150613ae7565b60079150613ae7565b60089150613ae7565b60099150613ae7565b600a9150613ae7565b600b9150613ae7565b600c9150613ae7565b600d9150613ae7565b600e9150613ae7565b600f9150613ae7565b60109150613ae7565b60119150613ae7565b60129150613ae7565b60139150613ae7565b60149150613ae7565b60159150613ae7565b60169150613ae7565b60179150613ae7565b60189150613ae7565b60199150613ae7565b601a9150613ae7565b601b9150613ae7565b601c9150613ae7565b601d9150613ae7565b601e9150613ae7565b601f9150613ae7565b602091505b50919050565b8151613afa848284612853565b613b05600485615577565b93508063ffffffff16841015613b7957604051636381e58960e11b815260206004820152603260248201527f7661724279746573546f42797465733a206f6666736574206c657373207468616044820152710dc40e8d0ca40d2dce0eae840d8cadccee8d60731b606482015260840161053b565b613b8963ffffffff821685615577565b935080158015613b98576115b4565b8483018051601f84168015602002818801018581018215602002838601015b81831015613bcf578251815260209283019201613bb7565b5050509152505050505050565b909101600019810180519290915252565b909101600719810180519290915252565b60606000613c0c8484015190565b63ffffffff169050613c1f600485615577565b935083811115613c8b57604051636381e58960e11b815260206004820152603060248201527f6279746573546f56617242797465733a206f6666736574206c6573732074686160448201526f6e206c656e677468206f6620626f647960801b606482015260840161053b565b613c958185615577565b9350606081158015613cb2576040519150602082016040526138b5565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015613ceb578051835260209283019201613cd3565b5050848452601f01601f19166040525050949350505050565b80516000906020811115613d6757604051636381e58960e11b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b606482015260840161053b565b6000816001600160401b03811115613d8157613d8161523c565b6040519080825280601f01601f191660200182016040528015613dab576020820181803683370190505b5084518152938201519190930151900392915050565b81830151600060208204600101601f831615613ddb576001015b5b808210156103c6578585015160208302850152602086039550600182019150613ddc565b600061050a8260200151612719565b600080613e1d85858561274c565b6000818152600460205260408120805492935063ffffffff909216918291611b108361558e565b600084848484604051602001613e5d9493929190615a64565b604051602081830303815290604052805190602001209050949350505050565b6000606060006060613e8e8561419b565b6001600160a01b03163b613ed157505060408051","8082019091526014815273726563656976657220686173206e6f20636f646560601b6020820152600090613faa565b613eda8561419b565b6001600160a01b031663e5b813ad8989898960e001516040518563ffffffff1660e01b8152600401613f0f949392919061573a565b600060405180830381600087803b158015613f2957600080fd5b505af1925050508015613f3a575060015b613fa557613f46615771565b8063c703cb121415613f6d5750613f5b61578d565b80613f665750613f6f565b9050613faa565b505b3d808015613f99576040519150601f19603f3d011682016040523d82523d6000602084013e613f9e565b606091505b5050613faa565b600191505b9097909650945050505050565b60006060600061400287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506060870151889150613e0f565b90508063ffffffff168460c0015163ffffffff161461406457604051636381e58960e11b815260206004820152601a60248201527f5344504d73673a2073657175656e6365206e6f7420657175616c000000000000604482015260640161053b565b6000606060006140738761419b565b90506001600160a01b0381163b6140bc576000925060405180604001604052806014815260200173726563656976657220686173206e6f20636f646560601b815250915061418c565b60e087015160405163140e7af360e11b81526001600160a01b0383169163281cf5e6916140f1918e918e918e9160040161573a565b600060405180830381600087803b15801561410b57600080fd5b505af192505050801561411c575060015b61418757614128615771565b8063c703cb12141561414f575061413d61578d565b806141485750614151565b915061418c565b505b3d80801561417b576040519150601f19603f3d011682016040523d82523d6000602084013e614180565b606091505b505061418c565b600192505b50909890975095505050505050565b600061050a8260600151612719565b60006141b58761419b565b905085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408801526060870184905282614205576003614208565b60025b60ff1660808801528261421b578161422c565b604051806020016040528060008152505b6101008801526001546001600160a01b031663317c40ab8261424d8a6122e8565b6040518363ffffffff1660e01b8152600401610c7b9291906153e2565b600060606000606061427b8561419b565b6001600160a01b03163b6142be575050604080518082019091526014815273726563656976657220686173206e6f20636f646560601b6020820152600090613faa565b6142c78561419b565b6001600160a01b031663e5b813ad8989898961012001516040518563ffffffff1660e01b8152600401613f0f949392919061573a565b60006060600061434887878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506060870151889150613e0f565b90508063ffffffff168460c0015163ffffffff16146143b457604051636381e58960e11b815260206004820152602160248201527f5344505f4d53475f4552524f523a2073657175656e6365206e6f7420657175616044820152601b60fa1b606482015260840161053b565b6000606060006143c38761419b565b90506001600160a01b0381163b61440c576000925060405180604001604052806014815260200173726563656976657220686173206e6f20636f646560601b815250915061418c565b61012087015160405163140e7af360e11b81526001600160a01b0383169163281cf5e6916140f1918e918e918e9160040161573a565b600061444d8761419b565b905085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506040880152606087018490528261449d5760036144a0565b60025b60ff166080880152826144b357816144c4565b604051806020016040528060008152505b6101408801526001546001600160a01b031663317c40ab8261424d8a611da1565b6040805160a080820183526000808352606060208085018290528486018390528185018390526080808601849052865194850187528385529084018290529483018290528201819052928101839052909161453f84614689565b905060005b8160200151518110156146525760008260200151828151811061456957614569615aa0565b60200260200101519050806000015161ffff16600014156145985761458d81614865565b61ffff16845261463f565b806000015161ffff16600114156145b8576040810151602085015261463f565b806000015161ffff16600214156145e8576145de60206145d9836040015190565b015190565b604085015261463f565b806000015161ffff16600314156146165761460c614607826040015190565b613d04565b606085015261463f565b806000015161ffff166004141561463f5761463081614879565b6001600160401b031660808501525b508061464a816156d7565b915050614544565b50909392505050565b6040805160208082528183019092526000918291906020820181803683375050506020018390525090919050565b6040805180820190915260008152606060208201526006825110156146f157604051636381e58960e11b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e677468000000000000000000604482015260640161053b565b604080518082019091526000808252606060208301529061471a6147158584614892565b6148ba565b61ffff16815261472b60068361555f565b91506000825b8551811015614785576147566147518761474c84600261555f565b61495b565b614985565b614761906006615630565b6147719063ffffffff168261555f565b90508161477d816156d7565b925050614731565b6000826001600160401b0381111561479f5761479f61523c565b6040519080825280602002602001820160405280156147ec57816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816147bd5790505b509050600092505b865185101561485657604080516060808201835260008083526020830152918101919091526148238887614a7f565b96509050808285614833816156d7565b96508151811061484557614845615aa0565b6020026020010181905250506147f4565b60208401525090949350505050565b600061050a61471560028460400151015190565b600061050a61488d60088460400151015190565b614bdc565b81516000906148a283600261555f565b11156148ad57600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b816000815181106148fd576148fd615aa0565b60200101906001600160f81b031916908160001a9053508160001a60f81b8160018151811061492e5761492e615aa0565b60200101906001600160f81b031916908160001a9053506000614952826000614892565b95945050505050565b815160009061496b83600461555f565b111561497657600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b816000815181106149c8576149c8615aa0565b60200101906001600160f81b031916908160001a9053508160021a60f81b816001815181106149f9576149f9615aa0565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600281518110614a2a57614a2a615aa0565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600381518110614a5b57614a5b615aa0565b60200101906001600160f81b031916908160001a905350600061495282600061495b565b60408051606080820183526000808352602083015291810191909152600082845111614afa57604051636381e58960e11b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b606482015260840161053b565b6006831015614b3d57604051636381e58960e11b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b604482015260640161053b565b60408051606080820183526000808352602083015291810191909152614b666147158686614892565b61ffff168152614b7760028561555f565b9350614b86614751868661495b565b63ffffffff166020820152614b9c60048561555f565b9350614bb38585836020015163ffffffff16614d9a565b60408201526020810151614bcd9063ffffffff168561555f565b935091508290505b9250929050565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b81600081518110614c1f57614c1f615aa0565b60200101906001600160f81b031916908160001a9053508160061a60f81b81600181518110614c5057614c50615aa0565b60200101906001600160f81b031916908160001a9053508160051a60f81b81600281518110614c8157614c81615aa0565b60200101906001600160f81b031916908160001a9053508160041a60f81b81600381518110614cb257614cb2615aa0565b60200101906001600160f81b031916908160001a9053508160031a60f81b81600481518110614ce357614ce3615aa0565b60200101906001600160f81b031916908160001a9053508160021a60f81b81600581518110614d1457614d14615aa0565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600681518110614d4557614d45615aa0565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600781518110614d7657614d76615aa0565b60200101906001600160f81b031916908160001a9053506000614952826000614e10565b8251606090614da9838561555f565b1115614db457600080fd5b6000826001600160401b03811115614dce57614dce61523c565b6040519080825280601f01601f191660200182016040528015614df8576020820181803683370190505b50905060208082019086860101612554828287614e3d565b8151600090614e2083600861555f565b1115614e2b57600080fd5b5001600801516001600160401b031690565b60208110614e755781518352614e5460208461555f565b9250614e6160208361555f565b9150614e6e602082615577565b9050614e3d565b80614e7f57505050565b60006001614e8e836020615577565b614e9a90610100615b9a565b614ea49190615577","565b925184518416931916929092179092525050565b604080516101608101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c0820181905260e08201819052610100820152610120810182905261014081019190915290565b60008083601f840112614f2557600080fd5b5081356001600160401b03811115614f3c57600080fd5b602083019150836020828501011115614bd557600080fd5b600080600080600060608688031215614f6c57600080fd5b85356001600160401b0380821115614f8357600080fd5b614f8f89838a01614f13565b9097509550602088013594506040880135915080821115614faf57600080fd5b50614fbc88828901614f13565b969995985093965092949392505050565b60008060208385031215614fe057600080fd5b82356001600160401b03811115614ff657600080fd5b61500285828601614f13565b90969095509350505050565b60005b83811015615029578181015183820152602001615011565b838111156113ca5750506000910152565b6000815180845261505281602086016020860161500e565b601f01601f19169290920160200192915050565b6020815261ffff82511660208201526000602083015160a0604084015261509060c084018261503a565b905060408401516060840152606084015160808401526001600160401b0360808501511660a08401528091505092915050565b6000602082840312156150d557600080fd5b81356001600160a01b038116811461274557600080fd5b803580151581146150fc57600080fd5b919050565b60008060008060008060008060c0898b03121561511d57600080fd5b88356001600160401b038082111561513457600080fd5b6151408c838d01614f13565b909a50985060208b0135975088915061515b60408c016150ec565b965060608b013591508082111561517157600080fd5b5061517e8b828c01614f13565b909550935050608089013560ff8116811461519857600080fd5b8092505060a089013590509295985092959890939650565b600080600080600080608087890312156151c957600080fd5b86356001600160401b03808211156151e057600080fd5b6151ec8a838b01614f13565b90985096506020890135955086915061520760408a016150ec565b9450606089013591508082111561521d57600080fd5b5061522a89828a01614f13565b979a9699509497509295939492505050565b63b95aa35560e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156152775761527761523c565b6040525050565b6000602080838503121561529157600080fd5b82356001600160401b03808211156152a857600080fd5b818501915085601f8301126152bc57600080fd5b8135818111156152ce576152ce61523c565b60405191506152e6601f8201601f1916850183615252565b80825286848285010111156152fa57600080fd5b8084840185840137600090820190930192909252509392505050565b60008060006040848603121561532b57600080fd5b8335925060208401356001600160401b0381111561534857600080fd5b61535486828701614f13565b9497909650939450505050565b6000806000806000806080878903121561537a57600080fd5b86356001600160401b038082111561539157600080fd5b61539d8a838b01614f13565b90985096506020890135955060408901359150808211156153bd57600080fd5b506153ca89828a01614f13565b979a9699509497949695606090950135949350505050565b6001600160a01b03831681526040602082018190526000906154069083018461503a565b949350505050565b8183823760009101908152919050565b600181811c9082168061543257607f821691505b60208210811415613ae75763b95aa35560e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000825161549a81846020870161500e565b9190910192915050565b87815260e0602082015260006154bd60e083018961503a565b87604084015263ffffffff871660608401526001600160401b038616608084015282810360a08401526154f0818661503a565b905082810360c0840152615504818561503a565b9a9950505050505050505050565b6020808252601e908201527f5344504d73673a2077726f6e6720726563656976696e6720646f6d61696e0000604082015260600190565b63b95aa35560e01b600052601160045260246000fd5b6000821982111561557257615572615549565b500190565b60008282101561558957615589615549565b500390565b600063ffffffff808316818114156155a8576155a8615549565b6001019392505050565b6020808252601f908201527f656e636f64655344504d6573736167653a2077726f6e672076657273696f6e00604082015260600190565b60208082526027908201527f656e636f64655344504d6573736167653a20626f6479206c656e677468206f76604082015266195c9b1a5b5a5d60ca1b606082015260800190565b600063ffffffff80831681851680830382111561564f5761564f615549565b01949350505050565b60208082526021908201527f656e636f64655344504d6573736167653a207a65726f206d65737361676520696040820152601960fa1b606082015260800190565b63b95aa35560e01b600052601260045260246000fd5b6000826156be576156be615699565b500490565b6000826156d2576156d2615699565b500690565b60006000198214156156eb576156eb615549565b5060010190565b600081600019048311821515161561570c5761570c615549565b500290565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600061574e606083018688615711565b8460208401528281036040840152615766818561503a565b979650505050505050565b600060033d111561578a5760046000803e5060005160e01c5b90565b600060443d101561579b5790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156157ca57505050505090565b82850191508151818111156157e25750505050505090565b843d87010160208285010111156157fc5750505050505090565b61255460208286010187615252565b60c08152600061581f60c08301898b615711565b602083018890526001600160a01b038716604084015263ffffffff86166060840152841515608084015282810360a0840152615504818561503a565b602081526000612745602083018461503a565b60006101408d83528060208401526158898184018d8f615711565b90508a604084015282810360608401526158a3818b61503a565b6001600160a01b038a16608085015263ffffffff891660a08501526001600160401b03881660c085015260ff871660e085015285151561010085015283810361012085015290506158f4818561503a565b9e9d5050505050505050505050505050565b87815260c06020820152600061592060c08301888a615711565b86604084015263ffffffff861660608401526001600160401b038516608084015282810360a0840152615504818561503a565b60006101408c835280602084015261596e8184018c8e615711565b90508960408401528281036060840152615988818a61503a565b6001600160a01b03989098166080840152505063ffffffff9490941660a08501526001600160401b039290921660c084015260ff1660e083015215156101008201528082036101209091015260078152667375636365737360c81b602082015260400195945050505050565b88815260e060208201526000615a0e60e08301898b615711565b87604084015263ffffffff871660608401526001600160401b038616608084015282810360a0840152615a41818661503a565b905082810360c0840152615a55818561503a565b9b9a5050505050505050505050565b60008551615a76818460208a0161500e565b9190910193845250602083019190915260c01b6001600160c01b0319166040820152604801919050565b63b95aa35560e01b600052603260045260246000fd5b600181815b80851115615af1578160001904821115615ad757615ad7615549565b80851615615ae457918102915b93841c9390800290615abb565b509250929050565b600082615b085750600161050a565b81615b155750600061050a565b8160018114615b2b5760028114615b3557615b51565b600191505061050a565b60ff841115615b4657615b46615549565b50506001821b61050a565b5060208310610133831016604e8410600b8410161715615b74575081810a61050a565b615b7e8383615ab6565b8060001904821115615b9257615b92615549565b029392505050565b60006127458383615af956fed9ba89f3055586e080520bb7f889d74607fb690663921504f30701bbe605253ba2646970667358221220ac591cd19ef68a939e97c733aad766fc94cd0676c114c18467665beebf3cbfb064736f6c634300080b0033"}; + public static final String[] SM_BINARY_ARRAY = {"60806040523480156200001157600080fd5b506200001d336200002d565b620000276200007d565b6200014d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b600054600160a81b900460ff1615620000ed57604051636381e58960e11b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff600160a01b909104811610156200014b576000805460ff60a01b191660ff60a01b17905560405160ff81527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa9060200160405180910390a15b565b61635e806200015d6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063910e45af116100f9578063b510a39211610097578063e87f683c11610071578063e87f683c1461039f578063f03dc288146103b2578063f0faf117146103c5578063f7d579c7146103d857600080fd5b8063b510a39214610373578063d86e29e214610384578063e0c9e1ed1461038c57600080fd5b8063a1a5d522116100d3578063a1a5d5221461032d578063a1d7aeb314610340578063abf915cd14610358578063af9bca871461036057600080fd5b8063910e45af146102f45780639118310214610307578063947f76311461031a57600080fd5b80634bc161f911610166578063638704bd11610140578063638704bd146102b25780636e29b4fb146102bb578063710631db146102ce57806385e9ae14146102e157600080fd5b80634bc161f9146102695780635089e2c81461028e57806360e6fbc41461029f57600080fd5b806336f35354116101a257806336f353541461021a5780634183bc3f1461022d5780634363a7ea1461024e57806344a2c0791461026157600080fd5b806309c52754146101c957806316cad12a146101f2578063281cf5e614610207575b600080fd5b6101dc6101d73660046153a1565b6103eb565b6040516101e9919061543a565b60405180910390f35b6102056102003660046154b3565b61052d565b005b6102056102153660046154ce565b6105d3565b6102056102283660046154b3565b6107ac565b61024061023b366004615568565b610843565b6040519081526020016101e9565b61024061025c36600461560e565b6108d4565b600354610240565b6001546001600160a01b03165b6040516001600160a01b0390911681526020016101e9565b6000546001600160a01b0316610276565b6102406102ad3660046156c4565b610b25565b61024060035481565b6102406102c9366004615750565b610bb0565b6102056102dc3660046154b3565b610d82565b6102056102ef36600461582f565b610e26565b6102056103023660046158c7565b610e80565b610240610315366004615568565b610fac565b600254610276906001600160a01b031681565b61020561033b3660046158c7565b610fed565b60035b60405163ffffffff90911681526020016101e9565b610205611162565b61024061036e366004615750565b61128f565b6002546001600160a01b0316610276565b6102056113ed565b61020561039a36600461591e565b611424565b6102406103ad36600461560e565b61174e565b600154610276906001600160a01b031681565b6103436103d3366004615969565b611909565b6102406103e63660046156c4565b6119bb565b6040805160a0810182526000808252606060208301819052928201819052918101829052608081019190915260086000848460405160200161042e9291906159ea565b60408051601f198184030181529181528151602092830120835282820193909352908201600020825160a08101909352805461ffff168352600181018054919284019161047a906159fa565b80601f01602080910402602001604051908101604052809291908181526020018280546104a6906159fa565b80156104f35780601f106104c8576101008083540402835291602001916104f3565b820191906000526020600020905b8154815290600101906020018083116104d657829003601f168201915b505050918352505060028201546020820152600382015460408201526004909101546001600160401b031660609091015290505b92915050565b6000546001600160a01b0316331461056157604051636381e58960e11b815260040161055890615a2f565b60405180910390fd5b6001600160a01b0381166105c757604051636381e58960e11b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610558565b6105d0816119f8565b50565b6002546001600160a01b0316331461062e57604051636381e58960e11b815260206004820152601d60248201527f5344504d73673a206e6f742076616c696420616d20636f6e74726163740000006044820152606401610558565b600061066f83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a4f92505050565b90508063ffffffff16600114156106c7576106c286868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ab492505050565b6107a4565b8063ffffffff1660021415610718576106c286868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b5b92505050565b8063ffffffff1660031415610769576106c286868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c9f92505050565b604051636381e58960e11b815260206004820152600f60248201526e3130b21039b238103b32b939b4b7b760891b6044820152606401610558565b505050505050565b6000546001600160a01b031633146107d757604051636381e58960e11b815260040161055890615a2f565b6001600160a01b03811661082157604051636381e58960e11b815260206004820152601060248201526f29a2281d103130b21036b7b734ba37b960811b6044820152606401610558565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60015460405163b494e8ef60e01b81526000916001600160a01b03169063b494e8ef90610884908c908c908c9033908d908d908d908d908d90600401615a8d565b6020604051808303816000875af11580156108a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c79190615aee565b9998505050505050505050565b6001546000906001600160a01b0316331461090257604051636381e58960e11b815260040161055890615b07565b600460ff8416111561094e57604051636381e58960e11b815260206004820152601460248201527314d1140e881a5b9d985b1a59081d1a5b595bdd5d60621b6044820152606401610558565b604080516101608101825260038152600060208083018290528351601f8e0182900482028101820185528d81528c949293928301918f908f908190840183828082843760009201919091525050509082525060208101849052604001896109b65760006109b9565b60015b60ff1681526020016001600160401b0380168152602001610a138e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f9250889150611e049050565b63ffffffff1681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181019092529283529092015250600354909150610a89908290611e64565b6020808201516000908152600990915260409020805460ff191660011790556002546001600160a01b031663317c40ab8a610ac3846120ca565b6040518363ffffffff1660e01b8152600401610ae0929190615b49565b600060405180830381600087803b158015610afa57600080fd5b505af1158015610b0e573d6000803e3d6000fd5b50505050602001519b9a5050505050505050505050565b60015460405163b25ec36b60e01b81526000916001600160a01b03169063b25ec36b90610b62908a908a908a9033908b908b908b90600401615b75565b6020604051808303816000875af1158015610b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba59190615aee565b979650505050505050565b6001546000906001600160a01b03163314610bde57604051636381e58960e11b815260040161055890615b07565b604080516101208101825260028152600060208083018290528351601f8c0182900482028101820185528b81529193830191908c908c90819084018382808284376000920191909152505050908252506020810189905260400186610c44576000610c47565b60015b60ff1681526020016001600160401b0380168152602001610ca18b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508d9150611e049050565b63ffffffff16815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181019092529283529092015250600354909150610d089082906123d3565b6002546001600160a01b031663317c40ab87610d23846125dc565b6040518363ffffffff1660e01b8152600401610d40929190615b49565b600060405180830381600087803b158015610d5a57600080fd5b505af1158015610d6e573d6000803e3d6000fd5b505050506020015198975050505050505050565b6000546001600160a01b03163314610dad57604051636381e58960e11b815260040161055890615a2f565b6001600160a01b038116610e0457604051636381e58960e11b815260206004820152601b60248201527f5344504d73673a20696e76616c696420616d20636f6e747261637400000000006044820152606401610558565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610e5157604051636381e58960e11b815260040161055890615a2f565b80604051602001610e629190615bc8565b60408051601f19818403018152919052805160209091012060035550565b6001546001600160a01b03163314610eab57604051636381e58960e11b8152600401","61055890615b07565b6040805160a06020601f89018190040282018101909252608081018781526000928291908a908a9081908501838280828437600092019190915250505090825250602080820188905260408051601f8701839004830281018301825286815292019190869086908190840183828082843760009201919091525050509082525063ffffffff6020909101526002549091506001600160a01b031663317c40ab85610f5484612853565b6040518363ffffffff1660e01b8152600401610f71929190615b49565b600060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b5050505050505050505050565b6001546040516374a1f0d760e11b81526000916001600160a01b03169063e943e1ae90610884908c908c908c9033908d908d908d908d908d90600401615a8d565b6001546001600160a01b0316331461101857604051636381e58960e11b815260040161055890615b07565b6040805160a06020601f89018190040282018101909252608081018781526000928291908a908a9081908501838280828437600092019190915250505090825250602080820188905260408051601f87018390048302810183018252868152920191908690869081908401838280828437600092019190915250505090825250604080516020601f8b01819004810282018101909252898152918101916110dd918b908b90819084018382808284376000920191909152508a92508b9150611e049050565b63ffffffff169052905060006110f282612853565b60025460405163317c40ab60e01b81529192506001600160a01b03169063317c40ab906111259088908590600401615b49565b600060405180830381600087803b15801561113f57600080fd5b505af1158015611153573d6000803e3d6000fd5b505050505b5050505050505050565b600054600160a81b900460ff161580801561118a57506000546001600160a01b90910460ff16105b806111ab5750303b1580156111ab5750600054600160a01b900460ff166001145b61120f57604051636381e58960e11b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610558565b6000805460ff60a01b1916600160a01b179055801561123c576000805460ff60a81b1916600160a81b1790555b611245336119f8565b80156105d0576000805460ff60a81b19169055604051600181527f962aa9df107bcee798aa1cede27b2de7fab57a1daae7109874a9a9170136cbfa9060200160405180910390a150565b6001546000906001600160a01b031633146112bd57604051636381e58960e11b815260040161055890615b07565b604080516101208101825260028152600060208083018290528351601f8c0182900482028101820185528b81529193830191908c908c90819084018382808284376000920191909152505050908252506020810189905260400186611323576000611326565b60015b60ff1681526020016113718b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508d915061296e9050565b63ffffffff166001600160401b0316815260200163ffffffff8016815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181019092529283529092015250600354909150610d089082906123d3565b6000546001600160a01b0316331461141857604051636381e58960e11b815260040161055890615a2f565b61142260006119f8565b565b6000546001600160a01b0316331461144f57604051636381e58960e11b815260040161055890615a2f565b611457615305565b61149983838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525085939250506129a39050565b60e081015160ff1661150557604051636381e58960e11b815260206004820152602e60248201527f5344505f4d53475f4552524f523a20746865206d6573736167652074696d656f60448201526d075744d65617375726520697320360941b6064820152608401610558565b8060e0015160ff16600214156116ec578061010001516008600083604001516040516020016115349190615bc8565b60405160208183030381529060405280519060200120815260200190815260200160002060030154111561167d5760208082015160009081526009909152604090205460ff166115e457604051636381e58960e11b815260206004820152603460248201527f5344505f4d53475f4552524f523a20657863657074696f6e206d657373616765604482015273081a185cda08191bd95cc81b9bdd08195e1a5cdd60621b6064820152608401610558565b6001546001600160a01b0316637f7af9f46115fe86612b5d565b6020840151604080860151606087015160c088015160a08901516101208a01516101408b015195516001600160e01b031960e08b901b16815261164698979690600401615be4565b600060405180830381600087803b15801561166057600080fd5b505af1158015611674573d6000803e3d6000fd5b50505050611748565b604051636381e58960e11b815260206004820152603f60248201527f5344505f4d53475f4552524f523a20746865206d657373616765206973206e6f60448201527f742074696d656f757420776974682074696d656f75744d6561737572652032006064820152608401610558565b604051636381e58960e11b815260206004820152602a60248201527f5344505f4d53475f4552524f523a20756e737570706f727465642074696d656f6044820152697574206d65617375726560b01b6064820152608401610558565b50505050565b6001546000906001600160a01b0316331461177c57604051636381e58960e11b815260040161055890615b07565b600460ff841611156117c857604051636381e58960e11b815260206004820152601460248201527314d1140e881a5b9d985b1a59081d1a5b595bdd5d60621b6044820152606401610558565b604080516101608101825260038152600060208083018290528351601f8e0182900482028101820185528d81528c949293928301918f908f90819084018382808284376000920191909152505050908252506020810184905260400189611830576000611833565b60015b60ff16815260200161187e8e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f925088915061296e9050565b63ffffffff166001600160401b0316815260200163ffffffff801681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250506040805160208181019092529283529092015250600354909150610a89908290611e64565b600060035484846040516020016119219291906159ea565b604051602081830303815290604052805190602001201461195557604051636381e58960e11b815260040161055890615c68565b600061199a88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250879150612b909050565b60009081526005602052604090205463ffffffff1698975050505050505050565b60015460405163beb51d4f60e01b81526000916001600160a01b03169063beb51d4f90610b62908a908a908a9033908b908b908b90600401615b75565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5c7c30d4a0f08950cb23be4132957b357fa5dfdb0fcf218f81b86a1c036e47d09190a35050565b5050505050565b8051601c81830101516000916001600160f81b03198083161415611aaa576040805160048082528183019092526000918291906020820181803683370190505095909201601d01516021860152505050600490910151919050565b5060019392505050565b604080516080810182526060808252600060208301819052928201819052810191909152611ae28183612bed565b6003548151604051611af79190602001615bc8565b6040516020818303038152906040528051906020012014611b2b57604051636381e58960e11b815260040161055890615c68565b606081015163ffffffff9081161415611b4f57611b4a85858584612d5e565b611a48565b611a4885858584612dce565b604080516101208101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c082015260e08101829052610100810191909152611bad8183612ff2565b6003548160400151604051602001611bc59190615bc8565b6040516020818303038152906040528051906020012014611bf957604051636381e58960e11b815260040161055890615c68565b608081015160ff161580611c145750608081015160ff166001145b15611c2557611b4a85858584613144565b608081015160ff1660021415611c4157611b4a85858584613303565b608081015160ff1660031415611c5d57611b4a858585846133f5565b604051636381e58960e11b8152602060048201526016602482015275756e65787065637465642061746f6d696320666c616760501b6044820152606401610558565b611ca7615305565b611cb181836129a3565b6003548160400151604051602001611cc99190615bc8565b6040516020818303038152906040528051906020012014611d2d57604051636381e58960e11b815260206004820152601f60248201527f5344505f4d73673a2077726f6e6720726563656976696e6720646f6d61696e006044820152606401610558565b608081015160ff161580611d485750608081015160ff166001145b15611d5957611b4a858585846134e6565b608081015160ff1660021415611d7557611b4a85858584613767565b608081015160ff1660031415611d9157611b4a85858584613898565b608081015160ff1660041415611dad57611b4a85858584613978565b604051636381e58960e11b815260206004820152602560248201527f5344505f4d53475f4552524f523a20756e65787065637465642061746f6d696360448201526420666c616760d81b6064820152608401610558565b600080611e12858585613b3c565b6000818152600460205260408120805492935063ffffffff909216918291611e3983615cb5565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b816000015163ffffffff16600314611e8f57604051636381e58960e11b815260040161055890615cd9565b63ffffffff826101200151511115611eba5760","4051636381e58960e11b815260040161055890615d10565b6000611eca836101000151613bab565b90506000815184610120015151856040015151607e611ee99190615d57565b611ef39190615d57565b611efd9190615d57565b90506000816001600160401b03811115611f1957611f196157ed565b6040519080825280601f01601f191660200182016040528015611f43576020820181803683370190505b5085519091508290611f65908290611f5f9063ff000000615d6f565b84613c4e565b611f6f6020613c5f565b611f799082615d97565b6040870151909150611f8c828285613e8e565b8051611f99906004615d57565b611fa39083615d97565b6060880151818501529150611fb9602083615d97565b9150611fca82886080015185613f7d565b611fd5600183615d97565b9150611fe6828860a0015185613f8e565b611ff06040613c5f565b611ffa9083615d97565b915061200b828860c0015185613c4e565b6120156020613c5f565b61201f9083615d97565b9150612030828860e0015185613f7d565b61203b600183615d97565b9150612048828685613e8e565b8451612055906004615d57565b61205f9083615d97565b91506120718288610120015185613e8e565b61012087015151612083906004615d57565b61208d9083615d97565b3381850152915061209f602083615d97565b80840187905291506120b2602083615d97565b50508151602092830120959091019490945250505050565b6060816000015163ffffffff166003146120f757604051636381e58960e11b815260040161055890615cd9565b63ffffffff82610120015151111561212257604051636381e58960e11b815260040161055890615d10565b602082015161214457604051636381e58960e11b815260040161055890615dae565b600080600260ff16846080015160ff161190506000612167856101000151613bab565b905081156121c0576101408501515181516101208701515160408801515161219090605e615d57565b61219a9190615d57565b6121a49190615d57565b6121af906004615d57565b6121b99190615d57565b92506121f1565b8051610120860151516040870151516121da90605e615d57565b6121e49190615d57565b6121ee9190615d57565b92505b6000836001600160401b0381111561220b5761220b6157ed565b6040519080825280601f01601f191660200182016040528015612235576020820181803683370190505b5086519091508490612251908290611f5f9063ff000000615d6f565b61225b6020613c5f565b6122659082615d97565b6020888101518285015290915061227c9082615d97565b604088015190915061228f828285613e8e565b805161229c906004615d57565b6122a69083615d97565b60608901518185015291506122bc602083615d97565b91506122cd82896080015185613f7d565b6122d8600183615d97565b91506122e9828960a0015185613f8e565b6122f36040613c5f565b6122fd9083615d97565b915061230e828960c0015185613c4e565b6123186020613c5f565b6123229083615d97565b9150612333828960e0015185613f7d565b61233e600183615d97565b915061234b828585613e8e565b8351612358906004615d57565b6123629083615d97565b91506123748289610120015185613e8e565b61012088015151612386906004615d57565b6123909083615d97565b915084156123c7576123a88289610140015185613e8e565b610140880151516123ba906004615d57565b6123c49083615d97565b91505b50909695505050505050565b816000015163ffffffff166002146123fe57604051636381e58960e11b815260040161055890615cd9565b63ffffffff8260e0015151111561242857604051636381e58960e11b815260040161055890615d10565b60008260e001515183604001515160796124429190615d57565b61244c9190615d57565b90506000816001600160401b03811115612468576124686157ed565b6040519080825280601f01601f191660200182016040528015612492576020820181803683370190505b50845190915082906124ba9082906124ae9063ff000000615d6f565b63ffffffff1690840152565b6124c46020613c5f565b6124ce9082615d97565b60408601519091506124e1828285613e8e565b80516124ee906004615d57565b6124f89083615d97565b606087015181850152915061250e602083615d97565b915061251f82876080015185613f7d565b61252a600183615d97565b915061253b828760a0015185613f8e565b6125456040613c5f565b61254f9083615d97565b9150612560828760c0015185613c4e565b61256a6020613c5f565b6125749083615d97565b9150612585828760e0015185613e8e565b60e086015151612596906004615d57565b6125a09083615d97565b338185015291506125b2602083615d97565b80840186905291506125c5602083615d97565b505081516020928301209490910193909352505050565b6060816000015163ffffffff1660021461260957604051636381e58960e11b815260040161055890615cd9565b63ffffffff8260e0015151111561263357604051636381e58960e11b815260040161055890615d10565b602082015161265557604051636381e58960e11b815260040161055890615dae565b6080820151600090600260ff9091161180156126af576101008401515160e085015151604086015151612689906059615d57565b6126939190615d57565b61269e906004615d57565b6126a89190615d57565b91506126d3565b60e0840151516040850151516126c6906059615d57565b6126d09190615d57565b91505b6000826001600160401b038111156126ed576126ed6157ed565b6040519080825280601f01601f191660200182016040528015612717576020820181803683370190505b50855190915083906127339082906124ae9063ff000000615d6f565b61273d6020613c5f565b6127479082615d97565b6020878101518285015290915061275e9082615d97565b6040870151909150612771828285613e8e565b805161277e906004615d57565b6127889083615d97565b606088015181850152915061279e602083615d97565b91506127af82886080015185613f7d565b6127ba600183615d97565b91506127cb828860a0015185613f8e565b6127d56040613c5f565b6127df9083615d97565b91506127f0828860c0015185613c4e565b6127fa6020613c5f565b6128049083615d97565b9150612815828860e0015185613e8e565b60e087015151612826906004615d57565b6128309083615d97565b91508315612848576128488288610100015185613e8e565b509095945050505050565b606060006128648360000151613f9f565b6128718460400151613f9f565b61287c906004615d57565b612887906020615d57565b6128919190615d57565b90506000816001600160401b038111156128ad576128ad6157ed565b6040519080825280601f01601f1916602001820160405280156128d7576020820181803683370190505b50845190915082906128eb90829084613feb565b84516128f690613f9f565b6129009082615d97565b602086810151828501529091506129179082615d97565b905061292881866060015184613c4e565b6129326020614049565b61293c9082615d97565b905061294d81866040015184613feb565b61295a8560400151613f9f565b6129649082615d97565b5090949350505050565b60008061297c858585613b3c565b6000818152600660205260408120805492935063ffffffff909216918291611e3983615cb5565b80516129ae82611a4f565b63ffffffff1683526129c06020614049565b6129ca9082615d97565b90506129d68183015190565b60208401526129e3602090565b6129f09060ff1682615d97565b905060006129fe8284614054565b604085018190528051909150612a15906004615d57565b612a1f9083615d97565b9150612a2b8284015190565b6060850152612a3b602083615d97565b9150612a478284015190565b60ff166080850152612a5a600183615d97565b9150612a668284015190565b6001600160401b031660a0850152612a7f600883615d97565b9150612a8b8284015190565b63ffffffff1660c0850152612aa1600483615d97565b9150612aad8284015190565b60ff1660e0850152612ac0600183615d97565b91506000612ace8385614054565b9050612ad98161415a565b6101008601528051612aec906004615d57565b612af69084615d97565b9250612b028385614054565b610120860181905251612b16906004615d57565b612b209084615d97565b9250600260ff16856080015160ff161115611a4857612b3f8385614054565b610140860181905251612b53906004615d57565b6107a49084615d97565b604080516020808252818301909252600091829190602082018180368337505050602081018490529050825b9392505050565b600083604051602001612ba39190615bc8565b60408051601f198184030181528282528051602091820120908301528101849052606081018390526080016040516020818303038152906040528051906020012090509392505050565b80516000612bfb8284015190565b612c06906020615d6f565b905060008163ffffffff166001600160401b03811115612c2857612c286157ed565b6040519080825280601f01601f191660200182016040528015612c52576020820181803683370190505b509050612c60838583614217565b612c6981613f9f565b612c739084615d97565b92506000612c818486015190565b9050612c8e602085615d97565b93506000612c9c8587015190565b9050612ca86020613c5f565b612cb29086615d97565b94506000612cc08688015190565b612ccb906020615d6f565b905060008163ffffffff166001600160401b03811115612ced57612ced6157ed565b6040519080825280601f01601f191660200182016040528015612d17576020820181803683370190505b509050612d25878983614217565b612d2e81613f9f565b612d389088615d97565b5093885250602087019190915263ffffffff166060860152604090940193909352505050565b6001546001600160a01b031663708dc744858585612d7b86614256565b86604001516040518663ffffffff1660e01b8152600401612da0959493929190615def565b600060405180830381600087803b158015612dba57600080fd5b505af1158015611158573d6000803e3d6000fd5b6000612e1585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506020850151869150614265565b90508063ffffffff16826060015163ffffffff1614612e7757604051636381e58960e11b815260206004820152601a60248201527f5344504d73673a2073657175656e6365206e6f7420657175616c0000000000006044820152606401610558565b600060606000612e8685614256565b90506001600160a01b0381163b612ecf576000925060405180604001","604052806014815260200173726563656976657220686173206e6f20636f646560601b8152509150612fa5565b60015460408087015190516330b126b560e11b81526001600160a01b03909216916361624d6a91612f0a918c918c918c918891600401615def565b600060405180830381600087803b158015612f2457600080fd5b505af1925050508015612f35575060015b612fa057612f41615e37565b8063c703cb121415612f685750612f56615e53565b80612f615750612f6a565b9150612fa5565b505b3d808015612f94576040519150601f19603f3d011682016040523d82523d6000602084013e612f99565b606091505b5050612fa5565b600192505b7fa7b67603ab1ccc49bd49f413615eec42635893f21e8a6ecf8bd542465fa536e788888884888888604051612fe09796959493929190615ed1565b60405180910390a15050505050505050565b8051612ffd82611a4f565b63ffffffff16835261300f6020614049565b6130199082615d97565b90506130258183015190565b6020840152613032602090565b61303f9060ff1682615d97565b9050600061304d8284614054565b604085018190528051909150613064906004615d57565b61306e9083615d97565b915061307a8284015190565b606085015261308a602083615d97565b91506130968284015190565b60ff1660808501526130a9600183615d97565b91506130b58284015190565b6001600160401b031660a08501526130ce600883615d97565b91506130da8284015190565b63ffffffff1660c08501526130f0600483615d97565b91506130fc8284614054565b60e085018190525161310f906004615d57565b6131199083615d97565b9150600260ff16846080015160ff161115611748576131388284614054565b61010085015250505050565b6000606063ffffffff80168360c0015163ffffffff16141561326c5760006131ac87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050606087015160a088015189925061429a565b60008181526007602052604090205490915060ff161561320f57604051636381e58960e11b815260206004820181905260248201527f5344504d73673a206e6f6e636520686173206265656e2070726f6365737365646044820152606401610558565b61321b878787876142d3565b6080860151919450925060ff1661324e57818361324c57604051636381e58960e11b81526004016105589190615f21565b505b6000908152600760205260409020805460ff1916600117905561327e565b61327886868686614411565b90925090505b7fe5b48da3ec5c2477fc166b4d1382803ec27d0bd0a8e507b7b5919a94dbee8c1d836020015187878787604001516132b5896145fb565b8960c001518a60a001518b608001518b8b6040516132dd9b9a99989796959493929190615f34565b60405180910390a1608083015160ff16600114156107a4576107a483878787868661460a565b6001546001600160a01b0316639752402c61331d836145fb565b83602001518787878760c001518860a001518960e001516040518963ffffffff1660e01b8152600401613357989796959493929190615fcc565b600060405180830381600087803b15801561337157600080fd5b505af1158015613385573d6000803e3d6000fd5b505050507fe5b48da3ec5c2477fc166b4d1382803ec27d0bd0a8e507b7b5919a94dbee8c1d816020015185858585604001516133c0876145fb565b8760c001518860a00151896080015160016040516133e79a99989796959493929190616027565b60405180910390a150505050565b6001546001600160a01b0316637f7af9f461340f836145fb565b83602001518787878760c001518860a001518960e001518a61010001516040518a63ffffffff1660e01b8152600401613450999897969594939291906160c8565b600060405180830381600087803b15801561346a57600080fd5b505af115801561347e573d6000803e3d6000fd5b505050507fe5b48da3ec5c2477fc166b4d1382803ec27d0bd0a8e507b7b5919a94dbee8c1d816020015185858585604001516134b9876145fb565b60c088015160a089015160808a01516101008b01516040516133e79a999897969594939291600191615f34565b600060608260e0015160ff166000148061350757508260e0015160ff166002145b8061351957508260e0015160ff166004145b61357e57604051636381e58960e11b815260206004820152602f60248201527f6f6e6c7920737570706f72742074696d656f7574206d65617375726520302c2060448201526e3220616e64203420666f72206e6f7760881b6064820152608401610558565b8260e0015160ff16600214156135d95743836101000151116135d457604051636381e58960e11b815260206004820152600e60248201526d1b5cd9c81a5cc81d1a5b595bdd5d60921b6044820152606401610558565b61362f565b8260e0015160ff166004141561362f57428361010001511161362f57604051636381e58960e11b815260206004820152600e60248201526d1b5cd9c81a5cc81d1a5b595bdd5d60921b6044820152606401610558565b60c083015163ffffffff90811614156136865761364e868686866146ad565b6080850151919350915060ff1661368157808261367f57604051636381e58960e11b81526004016105589190615f21565b505b613698565b61369286868686614744565b90925090505b600080516020616309833981519152836020015187878787604001516136bd896145fb565b8960c001518a60a001518b608001518b8b6040516136e59b9a99989796959493929190615f34565b60405180910390a17f1004fc84ea78f1fe82b0602bce1da56b8c8d936d74474e76308ef7054ed6951b83602001518460e001518561010001516040516137419392919092835260ff919091166020830152604082015260600190565b60405180910390a1608083015160ff16600114156107a4576107a483878787868661488f565b6001546001600160a01b0316639752402c613781836145fb565b602084015160c085015160a08601516101208701516040516001600160e01b031960e088901b1681526137be9594938c938c938c93600401615fcc565b600060405180830381600087803b1580156137d857600080fd5b505af11580156137ec573d6000803e3d6000fd5b5050505060008051602061630983398151915281602001518585858560400151613815876145fb565b8760c001518860a001518960800151600160405161383c9a99989796959493929190616027565b60405180910390a17f1004fc84ea78f1fe82b0602bce1da56b8c8d936d74474e76308ef7054ed6951b81602001518260e001518361010001516040516133e79392919092835260ff919091166020830152604082015260600190565b6001546001600160a01b0316637f7af9f46138b2836145fb565b83602001518787878760c001518860a001518961012001518a61014001516040518a63ffffffff1660e01b81526004016138f4999897969594939291906160c8565b600060405180830381600087803b15801561390e57600080fd5b505af1158015613922573d6000803e3d6000fd5b505050506000805160206163098339815191528160200151858585856040015161394b876145fb565b60c088015160a089015160808a01516101408b015160405161383c9a999897969594939291600191615f34565b6000613988826101200151614932565b905080604001516008600087876040516020016139a69291906159ea565b6040516020818303038152906040528051906020012081526020019081526020016000206002018190555080608001516008600087876040516020016139ed9291906159ea565b60405160208183030381529060405280519060200120815260200190815260200160002060040160006101000a8154816001600160401b0302191690836001600160401b031602179055508060600151600860008787604051602001613a549291906159ea565b6040516020818303038152906040528051906020012081526020019081526020016000206003018190555060008051602061630983398151915282602001518686868660400151613aa4886145fb565b60c089015160a08a015160808b01516101408c0151604051613ad19a999897969594939291600191615f34565b60405180910390a17f1004fc84ea78f1fe82b0602bce1da56b8c8d936d74474e76308ef7054ed6951b82602001518360e00151846101000151604051613b2d9392919092835260ff919091166020830152604082015260600190565b60405180910390a15050505050565b600080613b4884614aa8565b90508085604051602001613b5c9190615bc8565b60408051601f1981840301815282825280516020918201209083019390935281019190915260608101849052608001604051602081830303815290604052805190602001209150509392505050565b60408051602080825281830190925260609160009190602082018180368337505060408051602080825281830190925292935060009291508082018180368337019050509050606084602084015260015b6020811015613c45578060208501035181602085010351808203613c3b5760405193506020860151838501528284528260208501016040525050613c45565b5050600101613bfc565b50949350505050565b909101600319810180519290915252565b60008160088114613d6c5760108114613d755760188114613d7e5760208114613d875760288114613d905760308114613d995760388114613da25760408114613dab5760488114613db45760508114613dbd5760588114613dc65760608114613dcf5760688114613dd85760708114613de15760788114613dea5760808114613df35760888114613dfc5760908114613e055760988114613e0e5760a08114613e175760a88114613e205760b08114613e295760b88114613e325760c08114613e3b5760c88114613e445760d08114613e4d5760d88114613e565760e08114613e5f5760e88114613e685760f08114613e715760f88114613e7a576101008114613e835760209150613e88565b60019150613e88565b60029150613e88565b60039150613e88565b60049150613e88565b60059150613e88565b60069150613e88565b60079150613e88565b60089150613e88565b60099150613e88565b600a9150613e88565b600b9150613e88565b600c9150613e88565b600d9150613e88565b600e9150613e88565b600f9150613e88565b60109150613e88565b60119150613e88565b60129150613e88565b60139150613e88565b60149150613e88565b60159150613e88565b60169150613e88565b60179150613e88565b60189150613e88565b60199150613e88565b601a9150613e88565b601b9150613e88565b601c9150613e88565b601d9150613e88565b601e9150613e88565b601f9150613e88565b602091505b50919050565b8151613e9b848284613c4e565b613ea660048561","5d97565b93508063ffffffff16841015613f1a57604051636381e58960e11b815260206004820152603260248201527f7661724279746573546f42797465733a206f6666736574206c657373207468616044820152710dc40e8d0ca40d2dce0eae840d8cadccee8d60731b6064820152608401610558565b613f2a63ffffffff821685615d97565b935080158015613f3957611a48565b8483018051601f84168015602002818801018581018215602002838601015b81831015613f70578251815260209283019201613f58565b5050509152505050505050565b909101600019810180519290915252565b909101600719810180519290915252565b600060208251613faf9190616164565b905060208251613fbf9190616178565b15613fd25780613fce8161618c565b9150505b80613fdc8161618c565b915061052790506020826161a7565b600060208351613ffb9190616164565b905060006020845161400d9190616178565b1115614021578061401d8161618c565b9150505b60010160005b81811015611a48576020810284015183860152601f1990940193600101614027565b600061052782613c5f565b606060006140628484015190565b63ffffffff169050614075600485615d97565b9350838111156140e157604051636381e58960e11b815260206004820152603060248201527f6279746573546f56617242797465733a206f6666736574206c6573732074686160448201526f6e206c656e677468206f6620626f647960801b6064820152608401610558565b6140eb8185615d97565b935060608115801561410857604051915060208201604052613c45565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015614141578051835260209283019201614129565b5050848452601f01601f19166040525050949350505050565b805160009060208111156141bd57604051636381e58960e11b815260206004820152602360248201527f333262797465732062696720696e7465676572206174206d6f737420666f72206044820152626e6f7760e81b6064820152608401610558565b6000816001600160401b038111156141d7576141d76157ed565b6040519080825280601f01601f191660200182016040528015614201576020820181803683370190505b5084518152938201519190930151900392915050565b81830151600060208204600101601f831615614231576001015b5b808210156107a4578585015160208302850152602086039550600182019150614232565b60006105278260200151612b5d565b600080614273858585612b90565b6000818152600560205260408120805492935063ffffffff909216918291611e3983615cb5565b6000848484846040516020016142b394939291906161c6565b604051602081830303815290604052805190602001209050949350505050565b60006060600060606142e4856145fb565b6001600160a01b03163b614327575050604080518082019091526014815273726563656976657220686173206e6f20636f646560601b6020820152600090614404565b6001546001600160a01b0316636460c2ea8989896143448a6145fb565b8a60e001516040518663ffffffff1660e01b8152600401614369959493929190615def565b600060405180830381600087803b15801561438357600080fd5b505af1925050508015614394575060015b6143ff576143a0615e37565b8063c703cb1214156143c757506143b5615e53565b806143c057506143c9565b9050614404565b505b3d8080156143f3576040519150601f19603f3d011682016040523d82523d6000602084013e6143f8565b606091505b5050614404565b600191505b9097909650945050505050565b60006060600061445c87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506060870151889150614265565b90508063ffffffff168460c0015163ffffffff16146144be57604051636381e58960e11b815260206004820152601a60248201527f5344504d73673a2073657175656e6365206e6f7420657175616c0000000000006044820152606401610558565b6000606060006144cd876145fb565b90506001600160a01b0381163b614516576000925060405180604001604052806014815260200173726563656976657220686173206e6f20636f646560601b81525091506145ec565b60015460e08801516040516328ae399160e11b81526001600160a01b039092169163515c732291614551918e918e918e918891600401615def565b600060405180830381600087803b15801561456b57600080fd5b505af192505050801561457c575060015b6145e757614588615e37565b8063c703cb1214156145af575061459d615e53565b806145a857506145b1565b91506145ec565b505b3d8080156145db576040519150601f19603f3d011682016040523d82523d6000602084013e6145e0565b606091505b50506145ec565b600192505b50909890975095505050505050565b60006105278260600151612b5d565b6000614615876145fb565b905085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408801526060870184905282614665576003614668565b60025b60ff1660808801528261467b578161468c565b604051806020016040528060008152505b6101008801526002546001600160a01b031663317c40ab82610f548a6125dc565b60006060600060606146be856145fb565b6001600160a01b03163b614701575050604080518082019091526014815273726563656976657220686173206e6f20636f646560601b6020820152600090614404565b6001546001600160a01b0316631d312fb189898961471e8a6145fb565b8a61012001516040518663ffffffff1660e01b8152600401614369959493929190615def565b60006060600061478f87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506060870151889150614265565b90508063ffffffff168460c0015163ffffffff16146147fb57604051636381e58960e11b815260206004820152602160248201527f5344505f4d53475f4552524f523a2073657175656e6365206e6f7420657175616044820152601b60fa1b6064820152608401610558565b60006060600061480a876145fb565b90506001600160a01b0381163b614853576000925060405180604001604052806014815260200173726563656976657220686173206e6f20636f646560601b81525091506145ec565b6001546101208801516040516307286e1560e11b81526001600160a01b0390921691630e50dc2a91614551918e918e918e918891600401615def565b600061489a876145fb565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050604088015260608701849052826148ea5760036148ed565b60025b60ff166080880152826149005781614911565b604051806020016040528060008152505b6101408801526002546001600160a01b031663317c40ab82610f548a6120ca565b6040805160a080820183526000808352606060208085018290528486018390528185018390526080808601849052865194850187528385529084018290529483018290528201819052928101839052909161498c84614ad6565b905060005b816020015151811015614a9f576000826020015182815181106149b6576149b6616202565b60200260200101519050806000015161ffff16600014156149e5576149da81614cb2565b61ffff168452614a8c565b806000015161ffff1660011415614a055760408101516020850152614a8c565b806000015161ffff1660021415614a3557614a2b6020614a26836040015190565b015190565b6040850152614a8c565b806000015161ffff1660031415614a6357614a59614a54826040015190565b61415a565b6060850152614a8c565b806000015161ffff1660041415614a8c57614a7d81614cc6565b6001600160401b031660808501525b5080614a978161618c565b915050614991565b50909392505050565b6040805160208082528183019092526000918291906020820181803683375050506020018390525090919050565b604080518082019091526000815260606020820152600682511015614b3e57604051636381e58960e11b815260206004820152601760248201527f696c6c6567616c207261772064617461206c656e6774680000000000000000006044820152606401610558565b6040805180820190915260008082526060602083015290614b67614b628584614cdf565b614d07565b61ffff168152614b78600683615d57565b91506000825b8551811015614bd257614ba3614b9e87614b99846002615d57565b614da8565b614dd2565b614bae906006615d6f565b614bbe9063ffffffff1682615d57565b905081614bca8161618c565b925050614b7e565b6000826001600160401b03811115614bec57614bec6157ed565b604051908082528060200260200182016040528015614c3957816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081614c0a5790505b509050600092505b8651851015614ca35760408051606080820183526000808352602083015291810191909152614c708887614ecc565b96509050808285614c808161618c565b965081518110614c9257614c92616202565b602002602001018190525050614c41565b60208401525090949350505050565b6000610527614b6260028460400151015190565b6000610527614cda60088460400151015190565b615029565b8151600090614cef836002615d57565b1115614cfa57600080fd5b50016002015161ffff1690565b60408051600280825281830190925260009160f084901b9183916020820181803683370190505090508160011a60f81b81600081518110614d4a57614d4a616202565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600181518110614d7b57614d7b616202565b60200101906001600160f81b031916908160001a9053506000614d9f826000614cdf565b95945050505050565b8151600090614db8836004615d57565b1115614dc357600080fd5b50016004015163ffffffff1690565b60408051600480825281830190925260009160e084901b9183916020820181803683370190505090508160031a60f81b81600081518110614e1557614e15616202565b60200101906001600160f81b031916908160001a9053508160021a60f81b81600181518110614e4657614e46616202565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600281518110614e7757614e77616202565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600381518110614ea857614e","a8616202565b60200101906001600160f81b031916908160001a9053506000614d9f826000614da8565b60408051606080820183526000808352602083015291810191909152600082845111614f4757604051636381e58960e11b815260206004820152602360248201527f6c656e677468206f66207261772064617461206c657373207468616e206f66666044820152621cd95d60ea1b6064820152608401610558565b6006831015614f8a57604051636381e58960e11b815260206004820152600e60248201526d1a5b1b1959d85b081bd9999cd95d60921b6044820152606401610558565b60408051606080820183526000808352602083015291810191909152614fb3614b628686614cdf565b61ffff168152614fc4600285615d57565b9350614fd3614b9e8686614da8565b63ffffffff166020820152614fe9600485615d57565b93506150008585836020015163ffffffff166151e7565b6040820152602081015161501a9063ffffffff1685615d57565b935091508290505b9250929050565b60408051600880825281830190925260009160c084901b9183916020820181803683370190505090508160071a60f81b8160008151811061506c5761506c616202565b60200101906001600160f81b031916908160001a9053508160061a60f81b8160018151811061509d5761509d616202565b60200101906001600160f81b031916908160001a9053508160051a60f81b816002815181106150ce576150ce616202565b60200101906001600160f81b031916908160001a9053508160041a60f81b816003815181106150ff576150ff616202565b60200101906001600160f81b031916908160001a9053508160031a60f81b8160048151811061513057615130616202565b60200101906001600160f81b031916908160001a9053508160021a60f81b8160058151811061516157615161616202565b60200101906001600160f81b031916908160001a9053508160011a60f81b8160068151811061519257615192616202565b60200101906001600160f81b031916908160001a9053508160001a60f81b816007815181106151c3576151c3616202565b60200101906001600160f81b031916908160001a9053506000614d9f82600061525d565b82516060906151f68385615d57565b111561520157600080fd5b6000826001600160401b0381111561521b5761521b6157ed565b6040519080825280601f01601f191660200182016040528015615245576020820181803683370190505b5090506020808201908686010161284882828761528a565b815160009061526d836008615d57565b111561527857600080fd5b5001600801516001600160401b031690565b602081106152c257815183526152a1602084615d57565b92506152ae602083615d57565b91506152bb602082615d97565b905061528a565b806152cc57505050565b600060016152db836020615d97565b6152e7906101006162fc565b6152f19190615d97565b925184518416931916929092179092525050565b604080516101608101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c0820181905260e08201819052610100820152610120810182905261014081019190915290565b60008083601f84011261537257600080fd5b5081356001600160401b0381111561538957600080fd5b60208301915083602082850101111561502257600080fd5b600080602083850312156153b457600080fd5b82356001600160401b038111156153ca57600080fd5b6153d685828601615360565b90969095509350505050565b60005b838110156153fd5781810151838201526020016153e5565b838111156117485750506000910152565b600081518084526154268160208601602086016153e2565b601f01601f19169290920160200192915050565b6020815261ffff82511660208201526000602083015160a0604084015261546460c084018261540e565b905060408401516060840152606084015160808401526001600160401b0360808501511660a08401528091505092915050565b80356001600160a01b03811681146154ae57600080fd5b919050565b6000602082840312156154c557600080fd5b612b8982615497565b6000806000806000606086880312156154e657600080fd5b85356001600160401b03808211156154fd57600080fd5b61550989838a01615360565b909750955060208801359450604088013591508082111561552957600080fd5b5061553688828901615360565b969995985093965092949392505050565b803580151581146154ae57600080fd5b803560ff811681146154ae57600080fd5b60008060008060008060008060c0898b03121561558457600080fd5b88356001600160401b038082111561559b57600080fd5b6155a78c838d01615360565b909a50985060208b013597508891506155c260408c01615547565b965060608b01359150808211156155d857600080fd5b506155e58b828c01615360565b90955093506155f8905060808a01615557565b915060a089013590509295985092959890939650565b600080600080600080600080600060e08a8c03121561562c57600080fd5b89356001600160401b038082111561564357600080fd5b61564f8d838e01615360565b909b50995060208c0135985089915061566a60408d01615497565b975061567860608d01615547565b965060808c013591508082111561568e57600080fd5b5061569b8c828d01615360565b90955093506156ae905060a08b01615557565b915060c08a013590509295985092959850929598565b600080600080600080608087890312156156dd57600080fd5b86356001600160401b03808211156156f457600080fd5b6157008a838b01615360565b90985096506020890135955086915061571b60408a01615547565b9450606089013591508082111561573157600080fd5b5061573e89828a01615360565b979a9699509497509295939492505050565b600080600080600080600060a0888a03121561576b57600080fd5b87356001600160401b038082111561578257600080fd5b61578e8b838c01615360565b909950975060208a013596508791506157a960408b01615497565b95506157b760608b01615547565b945060808a01359150808211156157cd57600080fd5b506157da8a828b01615360565b989b979a50959850939692959293505050565b63b95aa35560e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715615828576158286157ed565b6040525050565b6000602080838503121561584257600080fd5b82356001600160401b038082111561585957600080fd5b818501915085601f83011261586d57600080fd5b81358181111561587f5761587f6157ed565b6040519150615897601f8201601f1916850183615803565b80825286848285010111156158ab57600080fd5b8084840185840137600090820190930192909252509392505050565b600080600080600080608087890312156158e057600080fd5b86356001600160401b03808211156158f757600080fd5b6159038a838b01615360565b90985096506020890135955086915061571b60408a01615497565b60008060006040848603121561593357600080fd5b8335925060208401356001600160401b0381111561595057600080fd5b61595c86828701615360565b9497909650939450505050565b6000806000806000806080878903121561598257600080fd5b86356001600160401b038082111561599957600080fd5b6159a58a838b01615360565b90985096506020890135955060408901359150808211156159c557600080fd5b506159d289828a01615360565b979a9699509497949695606090950135949350505050565b8183823760009101908152919050565b600181811c90821680615a0e57607f821691505b60208210811415613e885763b95aa35560e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60e081526000615aa160e083018b8d615a64565b602083018a90526001600160a01b038916604084015287151560608401528281036080840152615ad2818789615a64565b60ff9590951660a0840152505060c00152979650505050505050565b600060208284031215615b0057600080fd5b5051919050565b60208082526022908201527f5344504d73673a206e6f742076616c6964206d6f6e69746f7220636f6e74726160408201526118dd60f21b606082015260800190565b6001600160a01b0383168152604060208201819052600090615b6d9083018461540e565b949350505050565b60a081526000615b8960a08301898b615a64565b602083018890526001600160a01b038716604084015285151560608401528281036080840152615bba818587615a64565b9a9950505050505050505050565b60008251615bda8184602087016153e2565b9190910192915050565b6001600160a01b03891681526020810188905261010060408201819052600090615c108382018a61540e565b905087606084015263ffffffff871660808401526001600160401b03861660a084015282810360c0840152615c45818661540e565b905082810360e0840152615c59818561540e565b9b9a5050505050505050505050565b6020808252601e908201527f5344504d73673a2077726f6e6720726563656976696e6720646f6d61696e0000604082015260600190565b63b95aa35560e01b600052601160045260246000fd5b600063ffffffff80831681811415615ccf57615ccf615c9f565b6001019392505050565b6020808252601f908201527f656e636f64655344504d6573736167653a2077726f6e672076657273696f6e00604082015260600190565b60208082526027908201527f656e636f64655344504d6573736167653a20626f6479206c656e677468206f76604082015266195c9b1a5b5a5d60ca1b606082015260800190565b60008219821115615d6a57615d6a615c9f565b500190565b600063ffffffff808316818516808303821115615d8e57615d8e615c9f565b01949350505050565b600082821015615da957615da9615c9f565b500390565b60208082526021908201527f656e636f64655344504d6573736167653a207a65726f206d65737361676520696040820152601960fa1b606082015260800190565b608081526000615e03608083018789615a64565b602083018690526001600160a01b03851660408401528281036060840152615e2b818561540e565b98975050505050505050565b600060033d1115615e505760046000803e5060005160e01c5b90565b600060443d1015615e615790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615e9057505050505090565b8285019150815181811115615ea857505050","50505090565b843d8701016020828501011115615ec25750505050505090565b61284860208286010187615803565b60c081526000615ee560c08301898b615a64565b602083018890526001600160a01b038716604084015263ffffffff86166060840152841515608084015282810360a0840152615bba818561540e565b602081526000612b89602083018461540e565b60006101408d8352806020840152615f4f8184018d8f615a64565b90508a60408401528281036060840152615f69818b61540e565b6001600160a01b038a16608085015263ffffffff891660a08501526001600160401b03881660c085015260ff871660e08501528515156101008501528381036101208501529050615fba818561540e565b9e9d5050505050505050505050505050565b60018060a01b038916815287602082015260e060408201526000615ff460e08301888a615a64565b86606084015263ffffffff861660808401526001600160401b03851660a084015282810360c0840152615c59818561540e565b60006101408c83528060208401526160428184018c8e615a64565b9050896040840152828103606084015261605c818a61540e565b6001600160a01b03989098166080840152505063ffffffff9490941660a08501526001600160401b039290921660c084015260ff1660e083015215156101008201528082036101209091015260078152667375636365737360c81b602082015260400195945050505050565b6001600160a01b038a16815260208101899052610100604082018190526000906160f58382018a8c615a64565b905087606084015263ffffffff871660808401526001600160401b03861660a084015282810360c084015261612a818661540e565b905082810360e084015261613e818561540e565b9c9b505050505050505050505050565b63b95aa35560e01b600052601260045260246000fd5b6000826161735761617361614e565b500490565b6000826161875761618761614e565b500690565b60006000198214156161a0576161a0615c9f565b5060010190565b60008160001904831182151516156161c1576161c1615c9f565b500290565b600085516161d8818460208a016153e2565b9190910193845250602083019190915260c01b6001600160c01b0319166040820152604801919050565b63b95aa35560e01b600052603260045260246000fd5b600181815b8085111561625357816000190482111561623957616239615c9f565b8085161561624657918102915b93841c939080029061621d565b509250929050565b60008261626a57506001610527565b8161627757506000610527565b816001811461628d5760028114616297576162b3565b6001915050610527565b60ff8411156162a8576162a8615c9f565b50506001821b610527565b5060208310610133831016604e8410600b84101617156162d6575081810a610527565b6162e08383616218565b80600019048211156162f4576162f4615c9f565b029392505050565b6000612b89838361625b56fed9ba89f3055586e080520bb7f889d74607fb690663921504f30701bbe605253ba26469706673582212209e378f5ce3118a0858bcb978b09559c3be181c40b5f84c3b188d1f3202dfa98d64736f6c634300080b0033"}; public static final String SM_BINARY = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", SM_BINARY_ARRAY); - public static final String[] ABI_ARRAY = {"[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"timeoutMeasure\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"}],\"name\":\"MessageV3TimeoutInfo\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"atomicFlag\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"errMsg\",\"type\":\"string\"}],\"name\":\"ReceiveMessageV2\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"atomicFlag\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"errMsg\",\"type\":\"string\"}],\"name\":\"ReceiveMessageV3\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"errMsg\",\"type\":\"string\"}],\"name\":\"receiveMessage\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"amAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAmAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLocalDomain\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"localDomainHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"}],\"name\":\"querySDPMessageSeq\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"recvDomain\",\"type\":\"string\"}],\"name\":\"queryValidatedBlockStateByDomain\",\"outputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"version\",\"type\":\"uint16\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"blockHeight\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"blockTimestamp\",\"type\":\"uint64\"}],\"internalType\":\"struct BlockState\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"pkg\",\"type\":\"bytes\"}],\"name\":\"recvMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"exceptionMsgAuthor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"exceptionMsgPkg\",\"type\":\"bytes\"}],\"name\":\"recvOffChainException\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendMessageV2\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"_timeoutMeasure\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_timeout\",\"type\":\"uint256\"}],\"name\":\"sendMessageV3\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendUnorderedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendUnorderedMessageV2\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"_timeoutMeasure\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_timeout\",\"type\":\"uint256\"}],\"name\":\"sendUnorderedMessageV3\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAmContract\",\"type\":\"address\"}],\"name\":\"setAmContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"name\":\"setLocalDomain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnershi","p\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"}; + public static final String[] ABI_ARRAY = {"[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"timeoutMeasure\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timeout\",\"type\":\"uint256\"}],\"name\":\"MessageV3TimeoutInfo\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"atomicFlag\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"errMsg\",\"type\":\"string\"}],\"name\":\"ReceiveMessageV2\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"atomicFlag\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"errMsg\",\"type\":\"string\"}],\"name\":\"ReceiveMessageV3\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiverID\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"sequence\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"errMsg\",\"type\":\"string\"}],\"name\":\"receiveMessage\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"amAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAmAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLocalDomain\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMonitorAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMonitorRoutingVersion\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"localDomainHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"monitorAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"}],\"name\":\"querySDPMessageSeq\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"recvDomain\",\"type\":\"string\"}],\"name\":\"queryValidatedBlockStateByDomain\",\"outputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"version\",\"type\":\"uint16\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"blockHeight\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"blockTimestamp\",\"type\":\"uint64\"}],\"internalType\":\"struct BlockState\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"senderDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"senderID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"pkg\",\"type\":\"bytes\"}],\"name\":\"recvMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"exceptionMsgAuthor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"exceptionMsgPkg\",\"type\":\"bytes\"}],\"name\":\"recvOffChainException\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"senderID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendMessageV2\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"senderID\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendMessageV2FromMonitor\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"_timeoutMeasure\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_timeout\",\"type\":\"uint256\"}],\"name\":\"sendMessageV3\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"senderID\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"_timeoutMeasure\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_timeout\",\"type\":\"uint256\"}],\"name\":\"sendMessageV3FromMonitor\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"st","ring\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"senderID\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendUnorderedMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendUnorderedMessageV2\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"senderID\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"sendUnorderedMessageV2FromMonitor\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"_timeoutMeasure\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_timeout\",\"type\":\"uint256\"}],\"name\":\"sendUnorderedMessageV3\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiverDomain\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"receiverID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"senderID\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"atomic\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"_timeoutMeasure\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_timeout\",\"type\":\"uint256\"}],\"name\":\"sendUnorderedMessageV3FromMonitor\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAmContract\",\"type\":\"address\"}],\"name\":\"setAmContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"name\":\"setLocalDomain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMonitorAddress\",\"type\":\"address\"}],\"name\":\"setMonitorContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"}; public static final String ABI = org.fisco.bcos.sdk.v3.utils.StringUtils.joinAll("", ABI_ARRAY); @@ -55,10 +58,16 @@ public class SDPMsg extends Contract { public static final String FUNC_GETLOCALDOMAIN = "getLocalDomain"; + public static final String FUNC_GETMONITORADDRESS = "getMonitorAddress"; + + public static final String FUNC_GETMONITORROUTINGVERSION = "getMonitorRoutingVersion"; + public static final String FUNC_INIT = "init"; public static final String FUNC_LOCALDOMAINHASH = "localDomainHash"; + public static final String FUNC_MONITORADDRESS = "monitorAddress"; + public static final String FUNC_OWNER = "owner"; public static final String FUNC_QUERYSDPMESSAGESEQ = "querySDPMessageSeq"; @@ -75,46 +84,57 @@ public class SDPMsg extends Contract { public static final String FUNC_SENDMESSAGEV2 = "sendMessageV2"; + public static final String FUNC_SENDMESSAGEV2FROMMONITOR = "sendMessageV2FromMonitor"; + public static final String FUNC_SENDMESSAGEV3 = "sendMessageV3"; + public static final String FUNC_SENDMESSAGEV3FROMMONITOR = "sendMessageV3FromMonitor"; + public static final String FUNC_SENDUNORDEREDMESSAGE = "sendUnorderedMessage"; public static final String FUNC_SENDUNORDEREDMESSAGEV2 = "sendUnorderedMessageV2"; + public static final String FUNC_SENDUNORDEREDMESSAGEV2FROMMONITOR = "sendUnorderedMessageV2FromMonitor"; + public static final String FUNC_SENDUNORDEREDMESSAGEV3 = "sendUnorderedMessageV3"; + public static final String FUNC_SENDUNORDEREDMESSAGEV3FROMMONITOR = "sendUnorderedMessageV3FromMonitor"; + public static final String FUNC_SETAMCONTRACT = "setAmContract"; public static final String FUNC_SETLOCALDOMAIN = "setLocalDomain"; + public static final String FUNC_SETMONITORCONTRACT = "setMonitorContract"; + public static final String FUNC_TRANSFEROWNERSHIP = "transferOwnership"; - public static final Event INITIALIZED_EVENT = new Event("Initialized", + public static final Event INITIALIZED_EVENT = new Event("Initialized", Arrays.>asList(new TypeReference() {})); ; - public static final Event MESSAGEV3TIMEOUTINFO_EVENT = new Event("MessageV3TimeoutInfo", + public static final Event MESSAGEV3TIMEOUTINFO_EVENT = new Event("MessageV3TimeoutInfo", Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); ; - public static final Event OWNERSHIPTRANSFERRED_EVENT = new Event("OwnershipTransferred", + public static final Event OWNERSHIPTRANSFERRED_EVENT = new Event("OwnershipTransferred", Arrays.>asList(new TypeReference
(true) {}, new TypeReference
(true) {})); ; - public static final Event RECEIVEMESSAGEV2_EVENT = new Event("ReceiveMessageV2", + public static final Event RECEIVEMESSAGEV2_EVENT = new Event("ReceiveMessageV2", Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); ; - public static final Event RECEIVEMESSAGEV3_EVENT = new Event("ReceiveMessageV3", + public static final Event RECEIVEMESSAGEV3_EVENT = new Event("ReceiveMessageV3", Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); ; - public static final Event RECEIVEMESSAGE_EVENT = new Event("receiveMessage", + public static final Event RECEIVEMESSAGE_EVENT = new Event("receiveMessage", Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); ; protected SDPMsg(String contractAddress, Client client, CryptoKeyPair credential) { super(getBinary(client.getCryptoSuite()), contractAddress, client, credential); + this.transactionManager = new ProxySignTransactionManager(client); } public static String getBinary(CryptoSuite cryptoSuite) { @@ -296,159 +316,201 @@ public void subscribeReceiveMessageEvent(EventSubCallback callback) { } public String amAddress() throws ContractException { - final Function function = new Function(FUNC_AMADDRESS, - Arrays.asList(), + final Function function = new Function(FUNC_AMADDRESS, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return executeCallWithSingleValueReturn(function, String.class); } public Function getMethodAmAddressRawFunction() throws ContractException { - final Function function = new Function(FUNC_AMADDRESS, - Arrays.asList(), + final Function function = new Function(FUNC_AMADDRESS, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return function; } public String getAmAddress() throws ContractException { - final Function function = new Function(FUNC_GETAMADDRESS, - Arrays.asList(), + final Function function = new Function(FUNC_GETAMADDRESS, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return executeCallWithSingleValueReturn(function, String.class); } public Function getMethodGetAmAddressRawFunction() throws ContractException { - final Function function = new Function(FUNC_GETAMADDRESS, - Arrays.asList(), + final Function function = new Function(FUNC_GETAMADDRESS, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return function; } public byte[] getLocalDomain() throws ContractException { - final Function function = new Function(FUNC_GETLOCALDOMAIN, - Arrays.asList(), + final Function function = new Function(FUNC_GETLOCALDOMAIN, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodGetLocalDomainRawFunction() throws ContractException { - final Function function = new Function(FUNC_GETLOCALDOMAIN, - Arrays.asList(), + final Function function = new Function(FUNC_GETLOCALDOMAIN, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } + public String getMonitorAddress() throws ContractException { + final Function function = new Function(FUNC_GETMONITORADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodGetMonitorAddressRawFunction() throws ContractException { + final Function function = new Function(FUNC_GETMONITORADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + + public BigInteger getMonitorRoutingVersion() throws ContractException { + final Function function = new Function(FUNC_GETMONITORROUTINGVERSION, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + return executeCallWithSingleValueReturn(function, BigInteger.class); + } + + public Function getMethodGetMonitorRoutingVersionRawFunction() throws ContractException { + final Function function = new Function(FUNC_GETMONITORROUTINGVERSION, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + return function; + } + public TransactionReceipt init() { final Function function = new Function( - FUNC_INIT, - Arrays.asList(), + FUNC_INIT, + Arrays.asList(), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodInitRawFunction() throws ContractException { - final Function function = new Function(FUNC_INIT, - Arrays.asList(), + final Function function = new Function(FUNC_INIT, + Arrays.asList(), Arrays.>asList()); return function; } public String getSignedTransactionForInit() { final Function function = new Function( - FUNC_INIT, - Arrays.asList(), + FUNC_INIT, + Arrays.asList(), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String init(TransactionCallback callback) { final Function function = new Function( - FUNC_INIT, - Arrays.asList(), + FUNC_INIT, + Arrays.asList(), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public byte[] localDomainHash() throws ContractException { - final Function function = new Function(FUNC_LOCALDOMAINHASH, - Arrays.asList(), + final Function function = new Function(FUNC_LOCALDOMAINHASH, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, byte[].class); } public Function getMethodLocalDomainHashRawFunction() throws ContractException { - final Function function = new Function(FUNC_LOCALDOMAINHASH, - Arrays.asList(), + final Function function = new Function(FUNC_LOCALDOMAINHASH, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); return function; } + public String monitorAddress() throws ContractException { + final Function function = new Function(FUNC_MONITORADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return executeCallWithSingleValueReturn(function, String.class); + } + + public Function getMethodMonitorAddressRawFunction() throws ContractException { + final Function function = new Function(FUNC_MONITORADDRESS, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + return function; + } + public String owner() throws ContractException { - final Function function = new Function(FUNC_OWNER, - Arrays.asList(), + final Function function = new Function(FUNC_OWNER, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return executeCallWithSingleValueReturn(function, String.class); } public Function getMethodOwnerRawFunction() throws ContractException { - final Function function = new Function(FUNC_OWNER, - Arrays.asList(), + final Function function = new Function(FUNC_OWNER, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); return function; } public BigInteger querySDPMessageSeq(String senderDomain, byte[] senderID, String receiverDomain, byte[] receiverID) throws ContractException { - final Function function = new Function(FUNC_QUERYSDPMESSAGESEQ, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID)), + final Function function = new Function(FUNC_QUERYSDPMESSAGESEQ, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, BigInteger.class); } public Function getMethodQuerySDPMessageSeqRawFunction(String senderDomain, byte[] senderID, String receiverDomain, byte[] receiverID) throws ContractException { - final Function function = new Function(FUNC_QUERYSDPMESSAGESEQ, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID)), + final Function function = new Function(FUNC_QUERYSDPMESSAGESEQ, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID)), Arrays.>asList(new TypeReference() {})); return function; } public BlockState queryValidatedBlockStateByDomain(String recvDomain) throws ContractException { - final Function function = new Function(FUNC_QUERYVALIDATEDBLOCKSTATEBYDOMAIN, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(recvDomain)), + final Function function = new Function(FUNC_QUERYVALIDATEDBLOCKSTATEBYDOMAIN, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(recvDomain)), Arrays.>asList(new TypeReference() {})); return executeCallWithSingleValueReturn(function, BlockState.class); } public Function getMethodQueryValidatedBlockStateByDomainRawFunction(String recvDomain) throws ContractException { - final Function function = new Function(FUNC_QUERYVALIDATEDBLOCKSTATEBYDOMAIN, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(recvDomain)), + final Function function = new Function(FUNC_QUERYVALIDATEDBLOCKSTATEBYDOMAIN, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(recvDomain)), Arrays.>asList(new TypeReference() {})); return function; } public TransactionReceipt recvMessage(String senderDomain, byte[] senderID, byte[] pkg) { final Function function = new Function( - FUNC_RECVMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(pkg)), + FUNC_RECVMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(pkg)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodRecvMessageRawFunction(String senderDomain, byte[] senderID, byte[] pkg) throws ContractException { - final Function function = new Function(FUNC_RECVMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(pkg)), + final Function function = new Function(FUNC_RECVMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(pkg)), Arrays.>asList()); return function; } @@ -456,10 +518,10 @@ public Function getMethodRecvMessageRawFunction(String senderDomain, byte[] send public String getSignedTransactionForRecvMessage(String senderDomain, byte[] senderID, byte[] pkg) { final Function function = new Function( - FUNC_RECVMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(pkg)), + FUNC_RECVMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(pkg)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -467,10 +529,10 @@ public String getSignedTransactionForRecvMessage(String senderDomain, byte[] sen public String recvMessage(String senderDomain, byte[] senderID, byte[] pkg, TransactionCallback callback) { final Function function = new Function( - FUNC_RECVMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(pkg)), + FUNC_RECVMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(senderDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(pkg)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -478,14 +540,14 @@ public String recvMessage(String senderDomain, byte[] senderID, byte[] pkg, public Tuple3 getRecvMessageInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_RECVMESSAGE, - Arrays.asList(), + final Function function = new Function(FUNC_RECVMESSAGE, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple3( - (String) results.get(0).getValue(), - (byte[]) results.get(1).getValue(), + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), (byte[]) results.get(2).getValue() ); } @@ -493,18 +555,18 @@ public Tuple3 getRecvMessageInput( public TransactionReceipt recvOffChainException(byte[] exceptionMsgAuthor, byte[] exceptionMsgPkg) { final Function function = new Function( - FUNC_RECVOFFCHAINEXCEPTION, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(exceptionMsgAuthor), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(exceptionMsgPkg)), + FUNC_RECVOFFCHAINEXCEPTION, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(exceptionMsgAuthor), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(exceptionMsgPkg)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodRecvOffChainExceptionRawFunction(byte[] exceptionMsgAuthor, byte[] exceptionMsgPkg) throws ContractException { - final Function function = new Function(FUNC_RECVOFFCHAINEXCEPTION, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(exceptionMsgAuthor), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(exceptionMsgPkg)), + final Function function = new Function(FUNC_RECVOFFCHAINEXCEPTION, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(exceptionMsgAuthor), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(exceptionMsgPkg)), Arrays.>asList()); return function; } @@ -512,9 +574,9 @@ public Function getMethodRecvOffChainExceptionRawFunction(byte[] exceptionMsgAut public String getSignedTransactionForRecvOffChainException(byte[] exceptionMsgAuthor, byte[] exceptionMsgPkg) { final Function function = new Function( - FUNC_RECVOFFCHAINEXCEPTION, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(exceptionMsgAuthor), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(exceptionMsgPkg)), + FUNC_RECVOFFCHAINEXCEPTION, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(exceptionMsgAuthor), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(exceptionMsgPkg)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -522,9 +584,9 @@ public String getSignedTransactionForRecvOffChainException(byte[] exceptionMsgAu public String recvOffChainException(byte[] exceptionMsgAuthor, byte[] exceptionMsgPkg, TransactionCallback callback) { final Function function = new Function( - FUNC_RECVOFFCHAINEXCEPTION, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(exceptionMsgAuthor), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(exceptionMsgPkg)), + FUNC_RECVOFFCHAINEXCEPTION, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(exceptionMsgAuthor), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(exceptionMsgPkg)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -532,125 +594,130 @@ public String recvOffChainException(byte[] exceptionMsgAuthor, byte[] exceptionM public Tuple2 getRecvOffChainExceptionInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_RECVOFFCHAINEXCEPTION, - Arrays.asList(), + final Function function = new Function(FUNC_RECVOFFCHAINEXCEPTION, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple2( - (byte[]) results.get(0).getValue(), + (byte[]) results.get(0).getValue(), (byte[]) results.get(1).getValue() ); } public TransactionReceipt renounceOwnership() { final Function function = new Function( - FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodRenounceOwnershipRawFunction() throws ContractException { - final Function function = new Function(FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + final Function function = new Function(FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), Arrays.>asList()); return function; } public String getSignedTransactionForRenounceOwnership() { final Function function = new Function( - FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String renounceOwnership(TransactionCallback callback) { final Function function = new Function( - FUNC_RENOUNCEOWNERSHIP, - Arrays.asList(), + FUNC_RENOUNCEOWNERSHIP, + Arrays.asList(), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } - public TransactionReceipt sendMessage(String receiverDomain, byte[] receiverID, + public TransactionReceipt sendMessage(String receiverDomain, byte[] receiverID, String senderID, byte[] message) { final Function function = new Function( - FUNC_SENDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodSendMessageRawFunction(String receiverDomain, byte[] receiverID, - byte[] message) throws ContractException { - final Function function = new Function(FUNC_SENDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + String senderID, byte[] message) throws ContractException { + final Function function = new Function(FUNC_SENDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Arrays.>asList()); return function; } public String getSignedTransactionForSendMessage(String receiverDomain, byte[] receiverID, - byte[] message) { + String senderID, byte[] message) { final Function function = new Function( - FUNC_SENDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return createSignedTransaction(function); } - public String sendMessage(String receiverDomain, byte[] receiverID, byte[] message, - TransactionCallback callback) { + public String sendMessage(String receiverDomain, byte[] receiverID, String senderID, + byte[] message, TransactionCallback callback) { final Function function = new Function( - FUNC_SENDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } - public Tuple3 getSendMessageInput( + public Tuple4 getSendMessageInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SENDMESSAGE, - Arrays.asList(), - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + final Function function = new Function(FUNC_SENDMESSAGE, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); - return new Tuple3( + return new Tuple4( - (String) results.get(0).getValue(), - (byte[]) results.get(1).getValue(), - (byte[]) results.get(2).getValue() + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (byte[]) results.get(3).getValue() ); } public TransactionReceipt sendMessageV2(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message) { final Function function = new Function( - FUNC_SENDMESSAGEV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodSendMessageV2RawFunction(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message) throws ContractException { - final Function function = new Function(FUNC_SENDMESSAGEV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + final Function function = new Function(FUNC_SENDMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Arrays.>asList(new TypeReference() {})); return function; } @@ -658,11 +725,11 @@ public Function getMethodSendMessageV2RawFunction(String receiverDomain, byte[] public String getSignedTransactionForSendMessageV2(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message) { final Function function = new Function( - FUNC_SENDMESSAGEV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -670,11 +737,11 @@ public String getSignedTransactionForSendMessageV2(String receiverDomain, byte[] public String sendMessageV2(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message, TransactionCallback callback) { final Function function = new Function( - FUNC_SENDMESSAGEV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -682,23 +749,104 @@ public String sendMessageV2(String receiverDomain, byte[] receiverID, Boolean at public Tuple4 getSendMessageV2Input( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SENDMESSAGEV2, - Arrays.asList(), + final Function function = new Function(FUNC_SENDMESSAGEV2, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple4( - (String) results.get(0).getValue(), - (byte[]) results.get(1).getValue(), - (Boolean) results.get(2).getValue(), + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (Boolean) results.get(2).getValue(), (byte[]) results.get(3).getValue() ); } public Tuple1 getSendMessageV2Output(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getOutput(); - final Function function = new Function(FUNC_SENDMESSAGEV2, - Arrays.asList(), + final Function function = new Function(FUNC_SENDMESSAGEV2, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (byte[]) results.get(0).getValue() + ); + } + + public TransactionReceipt sendMessageV2FromMonitor(String receiverDomain, byte[] receiverID, + String senderID, Boolean atomic, byte[] message) { + final Function function = new Function( + FUNC_SENDMESSAGEV2FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendMessageV2FromMonitorRawFunction(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message) throws + ContractException { + final Function function = new Function(FUNC_SENDMESSAGEV2FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String getSignedTransactionForSendMessageV2FromMonitor(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message) { + final Function function = new Function( + FUNC_SENDMESSAGEV2FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendMessageV2FromMonitor(String receiverDomain, byte[] receiverID, + String senderID, Boolean atomic, byte[] message, TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDMESSAGEV2FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple5 getSendMessageV2FromMonitorInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDMESSAGEV2FROMMONITOR, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple5( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (Boolean) results.get(3).getValue(), + (byte[]) results.get(4).getValue() + ); + } + + public Tuple1 getSendMessageV2FromMonitorOutput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getOutput(); + final Function function = new Function(FUNC_SENDMESSAGEV2FROMMONITOR, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -710,13 +858,13 @@ public Tuple1 getSendMessageV2Output(TransactionReceipt transactionRecei public TransactionReceipt sendMessageV3(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message, BigInteger _timeoutMeasure, BigInteger _timeout) { final Function function = new Function( - FUNC_SENDMESSAGEV3, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + FUNC_SENDMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), Collections.>emptyList(), 0); return executeTransaction(function); } @@ -724,13 +872,13 @@ public TransactionReceipt sendMessageV3(String receiverDomain, byte[] receiverID public Function getMethodSendMessageV3RawFunction(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message, BigInteger _timeoutMeasure, BigInteger _timeout) throws ContractException { - final Function function = new Function(FUNC_SENDMESSAGEV3, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + final Function function = new Function(FUNC_SENDMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), Arrays.>asList(new TypeReference() {})); return function; } @@ -738,13 +886,13 @@ public Function getMethodSendMessageV3RawFunction(String receiverDomain, byte[] public String getSignedTransactionForSendMessageV3(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message, BigInteger _timeoutMeasure, BigInteger _timeout) { final Function function = new Function( - FUNC_SENDMESSAGEV3, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + FUNC_SENDMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -753,13 +901,13 @@ public String sendMessageV3(String receiverDomain, byte[] receiverID, Boolean at byte[] message, BigInteger _timeoutMeasure, BigInteger _timeout, TransactionCallback callback) { final Function function = new Function( - FUNC_SENDMESSAGEV3, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + FUNC_SENDMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -767,25 +915,119 @@ public String sendMessageV3(String receiverDomain, byte[] receiverID, Boolean at public Tuple6 getSendMessageV3Input( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SENDMESSAGEV3, - Arrays.asList(), + final Function function = new Function(FUNC_SENDMESSAGEV3, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple6( - (String) results.get(0).getValue(), - (byte[]) results.get(1).getValue(), - (Boolean) results.get(2).getValue(), - (byte[]) results.get(3).getValue(), - (BigInteger) results.get(4).getValue(), + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (Boolean) results.get(2).getValue(), + (byte[]) results.get(3).getValue(), + (BigInteger) results.get(4).getValue(), (BigInteger) results.get(5).getValue() ); } public Tuple1 getSendMessageV3Output(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getOutput(); - final Function function = new Function(FUNC_SENDMESSAGEV3, - Arrays.asList(), + final Function function = new Function(FUNC_SENDMESSAGEV3, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (byte[]) results.get(0).getValue() + ); + } + + public TransactionReceipt sendMessageV3FromMonitor(String receiverDomain, byte[] receiverID, + String senderID, Boolean atomic, byte[] message, BigInteger _timeoutMeasure, + BigInteger _timeout) { + final Function function = new Function( + FUNC_SENDMESSAGEV3FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendMessageV3FromMonitorRawFunction(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message, + BigInteger _timeoutMeasure, BigInteger _timeout) throws ContractException { + final Function function = new Function(FUNC_SENDMESSAGEV3FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String getSignedTransactionForSendMessageV3FromMonitor(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message, + BigInteger _timeoutMeasure, BigInteger _timeout) { + final Function function = new Function( + FUNC_SENDMESSAGEV3FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendMessageV3FromMonitor(String receiverDomain, byte[] receiverID, + String senderID, Boolean atomic, byte[] message, BigInteger _timeoutMeasure, + BigInteger _timeout, TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDMESSAGEV3FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple7 getSendMessageV3FromMonitorInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDMESSAGEV3FROMMONITOR, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple7( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (Boolean) results.get(3).getValue(), + (byte[]) results.get(4).getValue(), + (BigInteger) results.get(5).getValue(), + (BigInteger) results.get(6).getValue() + ); + } + + public Tuple1 getSendMessageV3FromMonitorOutput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getOutput(); + final Function function = new Function(FUNC_SENDMESSAGEV3FROMMONITOR, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -795,82 +1037,87 @@ public Tuple1 getSendMessageV3Output(TransactionReceipt transactionRecei } public TransactionReceipt sendUnorderedMessage(String receiverDomain, byte[] receiverID, - byte[] message) { + String senderID, byte[] message) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodSendUnorderedMessageRawFunction(String receiverDomain, - byte[] receiverID, byte[] message) throws ContractException { - final Function function = new Function(FUNC_SENDUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + byte[] receiverID, String senderID, byte[] message) throws ContractException { + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Arrays.>asList()); return function; } public String getSignedTransactionForSendUnorderedMessage(String receiverDomain, - byte[] receiverID, byte[] message) { + byte[] receiverID, String senderID, byte[] message) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return createSignedTransaction(function); } - public String sendUnorderedMessage(String receiverDomain, byte[] receiverID, byte[] message, - TransactionCallback callback) { + public String sendUnorderedMessage(String receiverDomain, byte[] receiverID, String senderID, + byte[] message, TransactionCallback callback) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGE, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDUNORDEREDMESSAGE, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } - public Tuple3 getSendUnorderedMessageInput( + public Tuple4 getSendUnorderedMessageInput( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SENDUNORDEREDMESSAGE, - Arrays.asList(), - Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGE, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); - return new Tuple3( + return new Tuple4( - (String) results.get(0).getValue(), - (byte[]) results.get(1).getValue(), - (byte[]) results.get(2).getValue() + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (byte[]) results.get(3).getValue() ); } public TransactionReceipt sendUnorderedMessageV2(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGEV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDUNORDEREDMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodSendUnorderedMessageV2RawFunction(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message) throws ContractException { - final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Arrays.>asList(new TypeReference() {})); return function; } @@ -878,11 +1125,11 @@ public Function getMethodSendUnorderedMessageV2RawFunction(String receiverDomain public String getSignedTransactionForSendUnorderedMessageV2(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGEV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDUNORDEREDMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -890,11 +1137,11 @@ public String getSignedTransactionForSendUnorderedMessageV2(String receiverDomai public String sendUnorderedMessageV2(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message, TransactionCallback callback) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGEV2, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + FUNC_SENDUNORDEREDMESSAGEV2, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -902,23 +1149,105 @@ public String sendUnorderedMessageV2(String receiverDomain, byte[] receiverID, B public Tuple4 getSendUnorderedMessageV2Input( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV2, - Arrays.asList(), + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV2, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple4( - (String) results.get(0).getValue(), - (byte[]) results.get(1).getValue(), - (Boolean) results.get(2).getValue(), + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (Boolean) results.get(2).getValue(), (byte[]) results.get(3).getValue() ); } public Tuple1 getSendUnorderedMessageV2Output(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getOutput(); - final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV2, - Arrays.asList(), + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV2, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (byte[]) results.get(0).getValue() + ); + } + + public TransactionReceipt sendUnorderedMessageV2FromMonitor(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message) { + final Function function = new Function( + FUNC_SENDUNORDEREDMESSAGEV2FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendUnorderedMessageV2FromMonitorRawFunction(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message) throws + ContractException { + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV2FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String getSignedTransactionForSendUnorderedMessageV2FromMonitor(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message) { + final Function function = new Function( + FUNC_SENDUNORDEREDMESSAGEV2FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendUnorderedMessageV2FromMonitor(String receiverDomain, byte[] receiverID, + String senderID, Boolean atomic, byte[] message, TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDUNORDEREDMESSAGEV2FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple5 getSendUnorderedMessageV2FromMonitorInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV2FROMMONITOR, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple5( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (Boolean) results.get(3).getValue(), + (byte[]) results.get(4).getValue() + ); + } + + public Tuple1 getSendUnorderedMessageV2FromMonitorOutput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getOutput(); + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV2FROMMONITOR, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -930,13 +1259,13 @@ public Tuple1 getSendUnorderedMessageV2Output(TransactionReceipt transac public TransactionReceipt sendUnorderedMessageV3(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message, BigInteger _timeoutMeasure, BigInteger _timeout) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGEV3, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + FUNC_SENDUNORDEREDMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), Collections.>emptyList(), 0); return executeTransaction(function); } @@ -944,13 +1273,13 @@ public TransactionReceipt sendUnorderedMessageV3(String receiverDomain, byte[] r public Function getMethodSendUnorderedMessageV3RawFunction(String receiverDomain, byte[] receiverID, Boolean atomic, byte[] message, BigInteger _timeoutMeasure, BigInteger _timeout) throws ContractException { - final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV3, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), Arrays.>asList(new TypeReference() {})); return function; } @@ -959,13 +1288,13 @@ public String getSignedTransactionForSendUnorderedMessageV3(String receiverDomai byte[] receiverID, Boolean atomic, byte[] message, BigInteger _timeoutMeasure, BigInteger _timeout) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGEV3, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + FUNC_SENDUNORDEREDMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), Collections.>emptyList(), 0); return createSignedTransaction(function); } @@ -974,13 +1303,13 @@ public String sendUnorderedMessageV3(String receiverDomain, byte[] receiverID, B byte[] message, BigInteger _timeoutMeasure, BigInteger _timeout, TransactionCallback callback) { final Function function = new Function( - FUNC_SENDUNORDEREDMESSAGEV3, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), - new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), - new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), - new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + FUNC_SENDUNORDEREDMESSAGEV3, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } @@ -988,25 +1317,120 @@ public String sendUnorderedMessageV3(String receiverDomain, byte[] receiverID, B public Tuple6 getSendUnorderedMessageV3Input( TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV3, - Arrays.asList(), + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV3, + Arrays.asList(), Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple6( - (String) results.get(0).getValue(), - (byte[]) results.get(1).getValue(), - (Boolean) results.get(2).getValue(), - (byte[]) results.get(3).getValue(), - (BigInteger) results.get(4).getValue(), + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (Boolean) results.get(2).getValue(), + (byte[]) results.get(3).getValue(), + (BigInteger) results.get(4).getValue(), (BigInteger) results.get(5).getValue() ); } public Tuple1 getSendUnorderedMessageV3Output(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getOutput(); - final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV3, - Arrays.asList(), + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV3, + Arrays.asList(), + Arrays.>asList(new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (byte[]) results.get(0).getValue() + ); + } + + public TransactionReceipt sendUnorderedMessageV3FromMonitor(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message, + BigInteger _timeoutMeasure, BigInteger _timeout) { + final Function function = new Function( + FUNC_SENDUNORDEREDMESSAGEV3FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSendUnorderedMessageV3FromMonitorRawFunction(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message, + BigInteger _timeoutMeasure, BigInteger _timeout) throws ContractException { + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV3FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + Arrays.>asList(new TypeReference() {})); + return function; + } + + public String getSignedTransactionForSendUnorderedMessageV3FromMonitor(String receiverDomain, + byte[] receiverID, String senderID, Boolean atomic, byte[] message, + BigInteger _timeoutMeasure, BigInteger _timeout) { + final Function function = new Function( + FUNC_SENDUNORDEREDMESSAGEV3FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String sendUnorderedMessageV3FromMonitor(String receiverDomain, byte[] receiverID, + String senderID, Boolean atomic, byte[] message, BigInteger _timeoutMeasure, + BigInteger _timeout, TransactionCallback callback) { + final Function function = new Function( + FUNC_SENDUNORDEREDMESSAGEV3FROMMONITOR, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(receiverDomain), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Bytes32(receiverID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Address(senderID), + new org.fisco.bcos.sdk.v3.codec.datatypes.Bool(atomic), + new org.fisco.bcos.sdk.v3.codec.datatypes.DynamicBytes(message), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint8(_timeoutMeasure), + new org.fisco.bcos.sdk.v3.codec.datatypes.generated.Uint256(_timeout)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple7 getSendUnorderedMessageV3FromMonitorInput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV3FROMMONITOR, + Arrays.asList(), + Arrays.>asList(new TypeReference() {}, new TypeReference() {}, new TypeReference
() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {}, new TypeReference() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple7( + + (String) results.get(0).getValue(), + (byte[]) results.get(1).getValue(), + (String) results.get(2).getValue(), + (Boolean) results.get(3).getValue(), + (byte[]) results.get(4).getValue(), + (BigInteger) results.get(5).getValue(), + (BigInteger) results.get(6).getValue() + ); + } + + public Tuple1 getSendUnorderedMessageV3FromMonitorOutput( + TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getOutput(); + final Function function = new Function(FUNC_SENDUNORDEREDMESSAGEV3FROMMONITOR, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -1017,40 +1441,40 @@ public Tuple1 getSendUnorderedMessageV3Output(TransactionReceipt transac public TransactionReceipt setAmContract(String newAmContract) { final Function function = new Function( - FUNC_SETAMCONTRACT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newAmContract)), + FUNC_SETAMCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newAmContract)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodSetAmContractRawFunction(String newAmContract) throws ContractException { - final Function function = new Function(FUNC_SETAMCONTRACT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newAmContract)), + final Function function = new Function(FUNC_SETAMCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newAmContract)), Arrays.>asList()); return function; } public String getSignedTransactionForSetAmContract(String newAmContract) { final Function function = new Function( - FUNC_SETAMCONTRACT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newAmContract)), + FUNC_SETAMCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newAmContract)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String setAmContract(String newAmContract, TransactionCallback callback) { final Function function = new Function( - FUNC_SETAMCONTRACT, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newAmContract)), + FUNC_SETAMCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newAmContract)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getSetAmContractInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SETAMCONTRACT, - Arrays.asList(), + final Function function = new Function(FUNC_SETAMCONTRACT, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -1061,39 +1485,39 @@ public Tuple1 getSetAmContractInput(TransactionReceipt transactionReceip public TransactionReceipt setLocalDomain(String domain) { final Function function = new Function( - FUNC_SETLOCALDOMAIN, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain)), + FUNC_SETLOCALDOMAIN, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodSetLocalDomainRawFunction(String domain) throws ContractException { - final Function function = new Function(FUNC_SETLOCALDOMAIN, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain)), + final Function function = new Function(FUNC_SETLOCALDOMAIN, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain)), Arrays.>asList()); return function; } public String getSignedTransactionForSetLocalDomain(String domain) { final Function function = new Function( - FUNC_SETLOCALDOMAIN, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain)), + FUNC_SETLOCALDOMAIN, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String setLocalDomain(String domain, TransactionCallback callback) { final Function function = new Function( - FUNC_SETLOCALDOMAIN, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain)), + FUNC_SETLOCALDOMAIN, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Utf8String(domain)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getSetLocalDomainInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_SETLOCALDOMAIN, - Arrays.asList(), + final Function function = new Function(FUNC_SETLOCALDOMAIN, + Arrays.asList(), Arrays.>asList(new TypeReference() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( @@ -1102,42 +1526,86 @@ public Tuple1 getSetLocalDomainInput(TransactionReceipt transactionRecei ); } + public TransactionReceipt setMonitorContract(String newMonitorAddress) { + final Function function = new Function( + FUNC_SETMONITORCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorAddress)), + Collections.>emptyList(), 0); + return executeTransaction(function); + } + + public Function getMethodSetMonitorContractRawFunction(String newMonitorAddress) throws + ContractException { + final Function function = new Function(FUNC_SETMONITORCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorAddress)), + Arrays.>asList()); + return function; + } + + public String getSignedTransactionForSetMonitorContract(String newMonitorAddress) { + final Function function = new Function( + FUNC_SETMONITORCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorAddress)), + Collections.>emptyList(), 0); + return createSignedTransaction(function); + } + + public String setMonitorContract(String newMonitorAddress, TransactionCallback callback) { + final Function function = new Function( + FUNC_SETMONITORCONTRACT, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newMonitorAddress)), + Collections.>emptyList(), 0); + return asyncExecuteTransaction(function, callback); + } + + public Tuple1 getSetMonitorContractInput(TransactionReceipt transactionReceipt) { + String data = transactionReceipt.getInput().substring(10); + final Function function = new Function(FUNC_SETMONITORCONTRACT, + Arrays.asList(), + Arrays.>asList(new TypeReference
() {})); + List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); + return new Tuple1( + + (String) results.get(0).getValue() + ); + } + public TransactionReceipt transferOwnership(String newOwner) { final Function function = new Function( - FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Collections.>emptyList(), 0); return executeTransaction(function); } public Function getMethodTransferOwnershipRawFunction(String newOwner) throws ContractException { - final Function function = new Function(FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + final Function function = new Function(FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Arrays.>asList()); return function; } public String getSignedTransactionForTransferOwnership(String newOwner) { final Function function = new Function( - FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Collections.>emptyList(), 0); return createSignedTransaction(function); } public String transferOwnership(String newOwner, TransactionCallback callback) { final Function function = new Function( - FUNC_TRANSFEROWNERSHIP, - Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), + FUNC_TRANSFEROWNERSHIP, + Arrays.asList(new org.fisco.bcos.sdk.v3.codec.datatypes.Address(newOwner)), Collections.>emptyList(), 0); return asyncExecuteTransaction(function, callback); } public Tuple1 getTransferOwnershipInput(TransactionReceipt transactionReceipt) { String data = transactionReceipt.getInput().substring(10); - final Function function = new Function(FUNC_TRANSFEROWNERSHIP, - Arrays.asList(), + final Function function = new Function(FUNC_TRANSFEROWNERSHIP, + Arrays.asList(), Arrays.>asList(new TypeReference
() {})); List results = this.functionReturnDecoder.decode(data, function.getOutputParameters()); return new Tuple1( diff --git a/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSMonitorV123CompatibilityTest.java b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSMonitorV123CompatibilityTest.java new file mode 100644 index 00000000..77f48ea7 --- /dev/null +++ b/acb-sdk/pluginset/fiscobcos/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/fiscobcos/FISCOBCOSMonitorV123CompatibilityTest.java @@ -0,0 +1,106 @@ +/* + * Copyright 2023 Ant Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); + */ +package com.alipay.antchain.bridge.plugins.fiscobcos; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.Monitor; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.MonitorVerifier; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.PtcHub; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.SDPMsg; +import org.junit.Assert; +import org.junit.Test; + +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; + +public class FISCOBCOSMonitorV123CompatibilityTest { + + @Test + public void generatedContractsExposeMonitorRoutingForEverySdpVersion() throws Exception { + Assert.assertTrue(SDPMsg.ABI_ARRAY.length > 1); + Assert.assertTrue(new ObjectMapper().readTree(SDPMsg.ABI).isArray()); + Assert.assertTrue(SDPMsg.ABI.contains("getMonitorRoutingVersion")); + Assert.assertTrue(SDPMsg.ABI.contains("setMonitorContract")); + Assert.assertTrue(SDPMsg.ABI.contains("sendMessageV2")); + Assert.assertTrue(SDPMsg.ABI.contains("sendMessageV3")); + Assert.assertTrue(SDPMsg.ABI.contains("sendMessageV2FromMonitor")); + Assert.assertTrue(SDPMsg.ABI.contains("sendMessageV3FromMonitor")); + Assert.assertTrue(SDPMsg.ABI.contains("sendUnorderedMessageV2")); + Assert.assertTrue(SDPMsg.ABI.contains("sendUnorderedMessageV3")); + Assert.assertTrue(SDPMsg.ABI.contains("sendUnorderedMessageV2FromMonitor")); + Assert.assertTrue(SDPMsg.ABI.contains("sendUnorderedMessageV3FromMonitor")); + Assert.assertFalse(SDPMsg.BINARY.isEmpty()); + } + + @Test + public void generatedMonitorSupportsExactReceiveSideUnwrapAndPtcVerifier() { + Assert.assertTrue(Monitor.ABI.contains("getImplementationVersion")); + Assert.assertTrue(Monitor.ABI.contains("recvMessage")); + Assert.assertTrue(Monitor.ABI.contains("recvUnorderedMessage")); + Assert.assertTrue(Monitor.ABI.contains("recvMessageV2FromSDP")); + Assert.assertTrue(Monitor.ABI.contains("recvMessageV3FromSDP")); + Assert.assertTrue(Monitor.ABI.contains("recvUnorderedMessageV2FromSDP")); + Assert.assertTrue(Monitor.ABI.contains("recvUnorderedMessageV3FromSDP")); + Assert.assertTrue(Monitor.ABI.contains("ackOnSuccessFromSDP")); + Assert.assertTrue(Monitor.ABI.contains("ackOnErrorFromSDP")); + Assert.assertTrue(Monitor.ABI.contains("setMonitorVerifier")); + Assert.assertTrue(MonitorVerifier.ABI.contains("setPtcHubAddress")); + Assert.assertTrue(PtcHub.ABI.contains("getMonitorVerifier")); + Assert.assertTrue(PtcHub.ABI.contains("setMonitorVerifier")); + Assert.assertFalse(Monitor.BINARY.isEmpty()); + Assert.assertFalse(MonitorVerifier.BINARY.isEmpty()); + Assert.assertFalse(PtcHub.BINARY.isEmpty()); + } + + @Test + public void bbcMonitorControlUsesProtocolEnum() { + Assert.assertEquals( + BigInteger.ONE, + FISCOBCOSBBCService.requireProtocolMonitorControl(1)); + Assert.assertEquals( + BigInteger.valueOf(2), + FISCOBCOSBBCService.requireProtocolMonitorControl(2)); + Assert.assertEquals( + BigInteger.valueOf(3), + FISCOBCOSBBCService.requireProtocolMonitorControl(3)); + try { + FISCOBCOSBBCService.requireProtocolMonitorControl(0); + Assert.fail("unsupported BBC monitor control must be rejected"); + } catch (IllegalArgumentException expected) { + Assert.assertTrue(expected.getMessage().contains("expected 1")); + } + } + + @Test + public void configPreservesExplicitPersistentAccountFile() throws Exception { + FISCOBCOSConfig config = new FISCOBCOSConfig(); + config.setAccountFilePath("/run/secrets/fisco04/account.pem"); + config.setAccountPassword("test-password"); + + FISCOBCOSConfig decoded = FISCOBCOSConfig.fromJsonString(config.toJsonString()); + Assert.assertEquals(config.getAccountFilePath(), decoded.getAccountFilePath()); + Assert.assertEquals(config.getAccountPassword(), decoded.getAccountPassword()); + } + + @Test + public void sendAuthMessagePayloadSupportsBytesAndStringHex() { + byte[] message = "fisco-auth-message".getBytes(StandardCharsets.UTF_8); + Assert.assertArrayEquals( + message, + FISCOBCOSBBCService.decodeAuthMessageEventPayload(message)); + Assert.assertArrayEquals( + message, + FISCOBCOSBBCService.decodeAuthMessageEventPayload( + "0x666973636f2d617574682d6d657373616765")); + + try { + FISCOBCOSBBCService.decodeAuthMessageEventPayload("not-hex"); + Assert.fail("malformed string event payload must be rejected"); + } catch (IllegalArgumentException expected) { + Assert.assertTrue(expected.getMessage().contains("valid hex")); + } + } +} diff --git a/acb-sdk/pluginset/fiscobcos/onchain-plugin/README.md b/acb-sdk/pluginset/fiscobcos/onchain-plugin/README.md index b60f91dc..19258613 100644 --- a/acb-sdk/pluginset/fiscobcos/onchain-plugin/README.md +++ b/acb-sdk/pluginset/fiscobcos/onchain-plugin/README.md @@ -10,6 +10,11 @@ > FISCO BCOS平台完全兼容Solidity智能合约。如需了解链上插件合约的具体实现,请参考[Ethereum2.0链上插件合约示例](https://github.com/AntChainOpenLabs/AntChainBridge/tree/main/acb-sdk/pluginset/fiscobcos/onchain-plugin)。 +本插件的 AuthMsg、SDP、PTC 与 Monitor 合约和 Ethereum3 插件共用同一套 +`ethereum3/onchain-plugin/solidity/sys` 源码,以避免不同 EVM 插件的协议实现漂移。 +当前 SDP 实现将 V1、V2、V3 的请求消息统一路由到 Monitor,ACK 消息保持直达; +Monitor 在接收侧严格解封装后再调用业务合约。 + ## 开发注意事项 ### Solidity 版本 @@ -34,4 +39,12 @@ FISCO-Java-SDK 在处理 bytes32 类型时存在限制。使用 Java 代码调 ```bash bash contract2java.sh solidity -p com.alipay.antchain.bridge.plugins.fiscobcos -s ./contracts/solidity/sys --no-analysis -``` \ No newline at end of file +``` + +仓库提供了可重复生成脚本,参数为 FISCO Console 根目录: + +```bash +./generate_monitor_wrappers.sh /path/to/fisco-console +``` + +该脚本只更新 `SDPMsg`、`Monitor`、`MonitorVerifier` 三个 Java 包装类。 diff --git a/acb-sdk/pluginset/fiscobcos/onchain-plugin/generate_monitor_wrappers.sh b/acb-sdk/pluginset/fiscobcos/onchain-plugin/generate_monitor_wrappers.sh new file mode 100755 index 00000000..1b59ef9c --- /dev/null +++ b/acb-sdk/pluginset/fiscobcos/onchain-plugin/generate_monitor_wrappers.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [[ $# -ne 1 ]]; then + echo "usage: $0 /path/to/fisco-console" + exit 2 +fi + +console_dir=$1 +plugin_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +sdk_dir=$(cd "$plugin_dir/../.." && pwd) +source_dir="$sdk_dir/ethereum3/onchain-plugin/solidity/sys" +output_dir="$plugin_dir/offchain-plugin/src/main/java" +generated_dir=$(mktemp -d) + +trap 'rm -rf "$generated_dir"' EXIT + +"$console_dir/contract2java.sh" solidity \ + --package com.alipay.antchain.bridge.plugins.fiscobcos.abi \ + --sol "$source_dir" \ + --output "$generated_dir" \ + --no-analysis + +package_dir=com/alipay/antchain/bridge/plugins/fiscobcos/abi +for contract in SDPMsg Monitor MonitorVerifier PtcHub CommitteePtcVerifier AppContract; do + cp "$generated_dir/$package_dir/$contract.java" "$output_dir/$package_dir/$contract.java" +done + +echo "generated FISCO SDP/Monitor/PTC wrappers from $source_dir" diff --git a/acb-sdk/pluginset/fiscobcos3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos3/FISCOBCOSBBCService.java b/acb-sdk/pluginset/fiscobcos3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos3/FISCOBCOSBBCService.java index 8659b8e2..0f5d395e 100644 --- a/acb-sdk/pluginset/fiscobcos3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos3/FISCOBCOSBBCService.java +++ b/acb-sdk/pluginset/fiscobcos3/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/fiscobcos3/FISCOBCOSBBCService.java @@ -58,6 +58,7 @@ import java.io.IOException; import java.math.BigInteger; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.Future; import java.util.stream.Collectors; @@ -70,6 +71,10 @@ public class FISCOBCOSBBCService extends AbstractBBCService { static private String TX_RECEIPT_STATUS_SUCCESS = "0x0"; + private static final BigInteger SDP_MONITOR_ROUTING_VERSION = BigInteger.valueOf(2L); + + private static final BigInteger MONITOR_IMPLEMENTATION_VERSION = BigInteger.valueOf(3L); + private FISCOBCOSConfig config; private BcosSDK sdk; @@ -670,9 +675,15 @@ public void setupSDPMessageContract() { } if (ObjectUtil.isNotNull(this.bbcContext.getSdpContract()) && StrUtil.isNotEmpty(this.bbcContext.getSdpContract().getContractAddress())) { - // If the contract has been pre-deployed and the contract address is configured in the configuration file, - // there is no need to redeploy. - return; + try { + assertSdpMonitorRoutingSupported( + this.bbcContext.getSdpContract().getContractAddress()); + return; + } catch (IllegalStateException e) { + getBBCLogger().warn( + "replace legacy FISCO SDP {} during explicit BBC reconciliation", + this.bbcContext.getSdpContract().getContractAddress()); + } } // 2. deploy contract @@ -692,6 +703,9 @@ public void setupSDPMessageContract() { sdpContract.setContractAddress(sdpMsg.getContractAddress()); sdpContract.setStatus(ContractStatusEnum.CONTRACT_DEPLOYED); bbcContext.setSdpContract(sdpContract); + config.setSdpContractAddressDeployed(sdpMsg.getContractAddress()); + bbcContext.setConfForBlockchainClient( + config.toJsonString().getBytes(StandardCharsets.UTF_8)); getBBCLogger().info("setup sdp contract successful: {}", sdpMsg.getContractAddress()); } else { throw new RuntimeException("failed to get deploy sdpMsg tx receipt"); @@ -883,7 +897,15 @@ public void setupMonitorContract() { } if (ObjectUtil.isNotNull(this.bbcContext.getMonitorContract()) && StrUtil.isNotEmpty(this.bbcContext.getMonitorContract().getContractAddress())) { - return; + try { + assertMonitorImplementationSupported( + this.bbcContext.getMonitorContract().getContractAddress()); + return; + } catch (IllegalStateException e) { + getBBCLogger().warn( + "replace legacy FISCO Monitor {} during explicit BBC reconciliation", + this.bbcContext.getMonitorContract().getContractAddress()); + } } // 1. Deploy MonitorVerifier @@ -958,6 +980,46 @@ public void setupMonitorContract() { monitorAddress, monitorVerifierAddress); } + private void assertSdpMonitorRoutingSupported(String sdpAddress) { + try { + SDPMsg sdp = SDPMsg.load(sdpAddress, client, keyPair); + BigInteger routingVersion = sdp.getMonitorRoutingVersion(); + if (!SDP_MONITOR_ROUTING_VERSION.equals(routingVersion)) { + throw new IllegalStateException( + String.format( + "unsupported SDP monitor routing version %s at %s", + routingVersion, + sdpAddress)); + } + } catch (Exception e) { + throw new IllegalStateException( + String.format( + "FISCO SDP %s predates V1/V2 receive-side Monitor routing", + sdpAddress), + e); + } + } + + private void assertMonitorImplementationSupported(String monitorAddress) { + try { + Monitor monitor = Monitor.load(monitorAddress, client, keyPair); + BigInteger implementationVersion = monitor.getImplementationVersion(); + if (!MONITOR_IMPLEMENTATION_VERSION.equals(implementationVersion)) { + throw new IllegalStateException( + String.format( + "unsupported Monitor implementation version %s at %s", + implementationVersion, + monitorAddress)); + } + } catch (Exception e) { + throw new IllegalStateException( + String.format( + "FISCO Monitor %s lacks exact envelope decode and receive-side routing", + monitorAddress), + e); + } + } + @Override public void setProtocolInMonitor(String contractAddress) { if (ObjectUtil.isNull(this.bbcContext) diff --git a/acb-sdk/pluginset/fiscobcos3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/fiscobcos3/FISCOBCOSMonitorDemoFlowTest.java b/acb-sdk/pluginset/fiscobcos3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/fiscobcos3/FISCOBCOSMonitorDemoFlowTest.java index 06096029..85d138f0 100644 --- a/acb-sdk/pluginset/fiscobcos3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/fiscobcos3/FISCOBCOSMonitorDemoFlowTest.java +++ b/acb-sdk/pluginset/fiscobcos3/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/fiscobcos3/FISCOBCOSMonitorDemoFlowTest.java @@ -72,10 +72,12 @@ public void test02SendMonitoredMessage() { public void test03QueryReceiver() throws Exception { ReceiverContract receiver = ReceiverContract.load( requiredProperty("fisco.demo.receiver"), service.getClient(), service.getKeyPair()); - System.out.println("FISCO_LAST_ORDERED_MSG=" - + new String(receiver.getLastMsg(), StandardCharsets.UTF_8)); - System.out.println("FISCO_LAST_UNORDERED_MSG=" - + new String(receiver.getLastUnorderedMsg(), StandardCharsets.UTF_8)); + String expected = System.getProperty("fisco.demo.message", "fisco-monitor-demo"); + String ordered = new String(receiver.getLastMsg(), StandardCharsets.UTF_8); + String unordered = new String(receiver.getLastUnorderedMsg(), StandardCharsets.UTF_8); + Assert.assertEquals("business contract received monitor envelope or padding", expected, ordered); + System.out.println("FISCO_LAST_ORDERED_MSG=" + ordered); + System.out.println("FISCO_LAST_UNORDERED_MSG=" + unordered); } @Test diff --git a/acb-sdk/pluginset/fiscobcos3/onchain-plugin/solidity/Monitor.sol b/acb-sdk/pluginset/fiscobcos3/onchain-plugin/solidity/Monitor.sol index 25f662e0..625b3d5a 100644 --- a/acb-sdk/pluginset/fiscobcos3/onchain-plugin/solidity/Monitor.sol +++ b/acb-sdk/pluginset/fiscobcos3/onchain-plugin/solidity/Monitor.sol @@ -3,8 +3,12 @@ pragma solidity ^0.4.22; pragma experimental ABIEncoderV2; import "./interfaces/ISDPMessage.sol"; +import "./interfaces/IContractUsingSDP.sol"; import "./interfaces/IMonitorVerifier.sol"; import "./lib/utils/Ownable.sol"; +import "./lib/utils/BytesToTypes.sol"; +import "./lib/utils/SizeOf.sol"; +import "./lib/utils/TypesToBytes.sol"; /** * @dev Monitor contract for FISCO BCOS cross-chain monitoring. @@ -19,6 +23,7 @@ import "./lib/utils/Ownable.sol"; */ contract Monitor is Ownable { + uint32 constant IMPLEMENTATION_VERSION = 3; uint32 constant MONITOR_CLOSE = 1; uint32 constant MONITOR_OPEN = 2; uint32 constant MONITOR_ROLLBACK = 3; @@ -41,11 +46,21 @@ contract Monitor is Ownable { event MonitorOrderApplied(uint32 orderType, bytes orderData); event MessageSent(address indexed sender, string receiverDomain, bytes32 receiverID); event MessageBlocked(address indexed sender, string receiverDomain, bytes32 receiverID, string reason); + event MessageReceived(string senderDomain, bytes32 indexed sender, address indexed receiver, uint32 monitorType, bool unordered); + + modifier onlySubProtocol() { + require(msg.sender == sdpAddress, "Monitor: sender is not sdp"); + _; + } constructor() public { monitorControl = MONITOR_OPEN; } + function getImplementationVersion() external pure returns (uint32) { + return IMPLEMENTATION_VERSION; + } + function setSdpAddress(address _sdpAddress) external onlyOwner { require(_sdpAddress != address(0), "Monitor: invalid sdp address"); sdpAddress = _sdpAddress; @@ -57,6 +72,10 @@ contract Monitor is Ownable { } function setMonitorControl(uint32 _control) external onlyOwner { + require( + _control == MONITOR_CLOSE || _control == MONITOR_OPEN || _control == MONITOR_ROLLBACK, + "Monitor: invalid monitor control" + ); monitorControl = _control; } @@ -69,21 +88,143 @@ contract Monitor is Ownable { bytes32 receiverID, bytes message ) external { - require(monitorControl != MONITOR_CLOSE, "Monitor: cross-chain messaging is closed"); - - bytes32 senderKey = bytes32(uint256(msg.sender)); - if (senderBlacklist[senderKey]) { - emit MessageBlocked(msg.sender, receiverDomain, receiverID, "sender blacklisted"); - revert("Monitor: sender is in blacklist"); + if (monitorControl == MONITOR_OPEN) { + bytes32 senderKey = bytes32(uint256(msg.sender)); + if (senderBlacklist[senderKey]) { + emit MessageBlocked(msg.sender, receiverDomain, receiverID, "sender blacklisted"); + revert("Monitor: sender is in blacklist"); + } + if (receiverBlacklist[receiverID]) { + emit MessageBlocked(msg.sender, receiverDomain, receiverID, "receiver blacklisted"); + revert("Monitor: receiver is in blacklist"); + } } - if (receiverBlacklist[receiverID]) { - emit MessageBlocked(msg.sender, receiverDomain, receiverID, "receiver blacklisted"); - revert("Monitor: receiver is in blacklist"); + + bytes memory rawMonitorMessage = _encodeMonitorMessage(monitorControl, message); + emit MessageSent(msg.sender, receiverDomain, receiverID); + ISDPMessage(sdpAddress).sendMessage(receiverDomain, receiverID, msg.sender, rawMonitorMessage); + } + + function sendUnorderedMonitorMessage( + string receiverDomain, + bytes32 receiverID, + bytes message + ) external { + if (monitorControl == MONITOR_OPEN) { + bytes32 senderKey = bytes32(uint256(msg.sender)); + require(!senderBlacklist[senderKey], "Monitor: sender is in blacklist"); + require(!receiverBlacklist[receiverID], "Monitor: receiver is in blacklist"); } + bytes memory rawMonitorMessage = _encodeMonitorMessage(monitorControl, message); emit MessageSent(msg.sender, receiverDomain, receiverID); + ISDPMessage(sdpAddress).sendUnorderedMessage(receiverDomain, receiverID, msg.sender, rawMonitorMessage); + } + + function recvMessageFromSDP( + string senderDomain, + bytes32 author, + address receiverID, + bytes rawMessage + ) external onlySubProtocol { + uint32 monitorType; + bytes memory message; + (monitorType, message) = _decodeMonitorMessage(rawMessage); + IContractUsingSDP(receiverID).recvMessage(senderDomain, author, message); + emit MessageReceived(senderDomain, author, receiverID, monitorType, false); + } + + function recvUnorderedMessageFromSDP( + string senderDomain, + bytes32 author, + address receiverID, + bytes rawMessage + ) external onlySubProtocol { + uint32 monitorType; + bytes memory message; + (monitorType, message) = _decodeMonitorMessage(rawMessage); + IContractUsingSDP(receiverID).recvUnorderedMessage(senderDomain, author, message); + emit MessageReceived(senderDomain, author, receiverID, monitorType, true); + } + + function _encodeMonitorMessage(uint32 monitorType, bytes message) internal pure returns (bytes memory) { + bytes memory monitorMsg = new bytes(0); + uint256 monitorMsgSize = SizeOf.sizeOfBytes(monitorMsg); + uint256 messageSize = SizeOf.sizeOfBytes(message); + bytes memory rawMessage = new bytes(4 + monitorMsgSize + messageSize); + uint256 offset = rawMessage.length; + + TypesToBytes.uint32ToBytes(offset, monitorType, rawMessage); + offset -= SizeOf.sizeOfUint(32); + + TypesToBytes.stringToBytes(offset, monitorMsg, rawMessage); + offset -= monitorMsgSize; - ISDPMessage(sdpAddress).sendMessage(receiverDomain, receiverID, msg.sender, message); + TypesToBytes.stringToBytes(offset, message, rawMessage); + return rawMessage; + } + + function _decodeMonitorMessage(bytes rawMessage) + internal + pure + returns (uint32 monitorType, bytes memory message) + { + uint256 offset = rawMessage.length; + require(offset >= 68, "Monitor: malformed monitor message"); + + monitorType = _readUint32AtEnd(rawMessage, offset); + require( + monitorType == MONITOR_CLOSE || monitorType == MONITOR_OPEN || monitorType == MONITOR_ROLLBACK, + "Monitor: invalid monitor type" + ); + offset -= SizeOf.sizeOfUint(32); + + bytes memory monitorMsg; + (monitorMsg, offset) = _decodeReversePaddedBytes(rawMessage, offset); + (message, offset) = _decodeReversePaddedBytes(rawMessage, offset); + require(offset == 0, "Monitor: trailing monitor message data"); + } + + /** + * Decode the legacy reverse-padded variable-bytes representation without + * relying on compiler-sensitive assembly memory alignment. + */ + function _decodeReversePaddedBytes(bytes rawMessage, uint256 endOffset) + internal + pure + returns (bytes memory value, uint256 nextOffset) + { + require(endOffset >= 32, "Monitor: malformed variable bytes"); + uint256 length = uint256(_readUint32AtEnd(rawMessage, endOffset)); + uint256 wordCount = (length + 31) / 32; + uint256 paddedLength = wordCount * 32; + require(endOffset >= 32 + paddedLength, "Monitor: variable bytes out of bounds"); + + nextOffset = endOffset - 32 - paddedLength; + value = new bytes(length); + for (uint256 logicalWord = 0; logicalWord < wordCount; logicalWord++) { + uint256 sourceOffset = nextOffset + (wordCount - 1 - logicalWord) * 32; + uint256 targetOffset = logicalWord * 32; + uint256 copyLength = length - targetOffset; + if (copyLength > 32) { + copyLength = 32; + } + for (uint256 i = 0; i < copyLength; i++) { + value[targetOffset + i] = rawMessage[sourceOffset + i]; + } + } + } + + function _readUint32AtEnd(bytes rawMessage, uint256 endOffset) + internal + pure + returns (uint32) + { + require(endOffset >= 4 && endOffset <= rawMessage.length, "Monitor: uint32 out of bounds"); + return (uint32(uint8(rawMessage[endOffset - 4])) << 24) + | (uint32(uint8(rawMessage[endOffset - 3])) << 16) + | (uint32(uint8(rawMessage[endOffset - 2])) << 8) + | uint32(uint8(rawMessage[endOffset - 1])); } /** diff --git a/acb-sdk/pluginset/fiscobcos3/onchain-plugin/solidity/SDPMsg.sol b/acb-sdk/pluginset/fiscobcos3/onchain-plugin/solidity/SDPMsg.sol index 0545db44..9f46a015 100644 --- a/acb-sdk/pluginset/fiscobcos3/onchain-plugin/solidity/SDPMsg.sol +++ b/acb-sdk/pluginset/fiscobcos3/onchain-plugin/solidity/SDPMsg.sol @@ -4,6 +4,7 @@ pragma solidity ^0.4.22; import "./interfaces/ISDPMessage.sol"; import "./interfaces/IAuthMessage.sol"; import "./interfaces/IContractUsingSDP.sol"; +import "./interfaces/IContractUsingMonitor.sol"; import "./interfaces/IContractWithAcks.sol"; import "./lib/sdp/SDPLib.sol"; import "./lib/utils/Ownable.sol"; @@ -14,6 +15,10 @@ contract SDPMsg is ISDPMessage, Ownable { string constant RECV_UNORDERED_MSG_METHOD_SIGN = "recvUnorderedMessage(string,bytes32,bytes)"; string constant RECV_ORDERED_MSG_METHOD_SIGN = "recvMessage(string,bytes32,bytes)"; + string constant RECV_MONITOR_UNORDERED_MSG_METHOD_SIGN = "recvUnorderedMessageFromSDP(string,bytes32,address,bytes)"; + string constant RECV_MONITOR_ORDERED_MSG_METHOD_SIGN = "recvMessageFromSDP(string,bytes32,address,bytes)"; + + uint32 constant MONITOR_ROUTING_VERSION = 2; uint8 constant SDP_V2_ATOMIC_FLAG_NONE_ATOMIC = 0; @@ -69,6 +74,10 @@ contract SDPMsg is ISDPMessage, Ownable { monitorAddress = newMonitorAddress; } + function getMonitorRoutingVersion() external pure returns (uint32) { + return MONITOR_ROUTING_VERSION; + } + function getAmAddress() external view returns (address) { return amAddress; } @@ -251,16 +260,31 @@ contract SDPMsg is ISDPMessage, Ownable { string memory errMsg; address receiver = sdpMessage.getReceiverAddress(); - res = receiver.call(abi.encodeWithSignature( - RECV_ORDERED_MSG_METHOD_SIGN, - senderDomain, senderID, sdpMessage.message)); + if (monitorAddress == address(0)) { + res = receiver.call(abi.encodeWithSignature( + RECV_ORDERED_MSG_METHOD_SIGN, + senderDomain, senderID, sdpMessage.message)); + } else { + res = monitorAddress.call(abi.encodeWithSignature( + RECV_MONITOR_ORDERED_MSG_METHOD_SIGN, + senderDomain, senderID, receiver, sdpMessage.message)); + } emit receiveMessage(senderDomain, senderID, receiver, seqExpected, res, errMsg); } function _routeUnorderedMessage(string senderDomain, bytes32 senderID, SDPLib.SDPMessage memory sdpMessage) internal { - IContractUsingSDP(sdpMessage.getReceiverAddress()) - .recvUnorderedMessage(senderDomain, senderID, sdpMessage.message); + address receiver = sdpMessage.getReceiverAddress(); + if (monitorAddress == address(0)) { + IContractUsingSDP(receiver).recvUnorderedMessage(senderDomain, senderID, sdpMessage.message); + } else { + IContractUsingMonitor(monitorAddress).recvUnorderedMessageFromSDP( + senderDomain, + senderID, + receiver, + sdpMessage.message + ); + } } function _processSDPv2(string senderDomain, bytes32 senderID, bytes memory pkg) internal { @@ -324,9 +348,15 @@ contract SDPMsg is ISDPMessage, Ownable { string memory errMsg; address receiver = sdpMessage.getReceiverAddress(); - res = receiver.call(abi.encodeWithSignature( - RECV_ORDERED_MSG_METHOD_SIGN, - senderDomain, senderID, sdpMessage.message)); + if (monitorAddress == address(0)) { + res = receiver.call(abi.encodeWithSignature( + RECV_ORDERED_MSG_METHOD_SIGN, + senderDomain, senderID, sdpMessage.message)); + } else { + res = monitorAddress.call(abi.encodeWithSignature( + RECV_MONITOR_ORDERED_MSG_METHOD_SIGN, + senderDomain, senderID, receiver, sdpMessage.message)); + } return (res, errMsg); } @@ -335,9 +365,16 @@ contract SDPMsg is ISDPMessage, Ownable { bool res = false; string memory errMsg; - res = sdpMessage.getReceiverAddress().call(abi.encodeWithSignature( - RECV_UNORDERED_MSG_METHOD_SIGN, - senderDomain, senderID, sdpMessage.message)); + address receiver = sdpMessage.getReceiverAddress(); + if (monitorAddress == address(0)) { + res = receiver.call(abi.encodeWithSignature( + RECV_UNORDERED_MSG_METHOD_SIGN, + senderDomain, senderID, sdpMessage.message)); + } else { + res = monitorAddress.call(abi.encodeWithSignature( + RECV_MONITOR_UNORDERED_MSG_METHOD_SIGN, + senderDomain, senderID, receiver, sdpMessage.message)); + } return (res, errMsg); } diff --git a/acb-sdk/pluginset/fiscobcos3/onchain-plugin/solidity/interfaces/IContractUsingMonitor.sol b/acb-sdk/pluginset/fiscobcos3/onchain-plugin/solidity/interfaces/IContractUsingMonitor.sol new file mode 100644 index 00000000..cdcf77b4 --- /dev/null +++ b/acb-sdk/pluginset/fiscobcos3/onchain-plugin/solidity/interfaces/IContractUsingMonitor.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.4.22; + +interface IContractUsingMonitor { + function recvUnorderedMessageFromSDP( + string senderDomain, + bytes32 author, + address receiverID, + bytes message + ) external; + + function recvMessageFromSDP( + string senderDomain, + bytes32 author, + address receiverID, + bytes message + ) external; +} diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCContext.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCContext.java index 68441d02..9bf149c6 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCContext.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCContext.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.annotation.JSONField; import com.alipay.antchain.bridge.commons.bbc.AbstractBBCContext; import com.alipay.antchain.bridge.commons.bbc.syscontract.AuthMessageContract; import com.alipay.antchain.bridge.commons.bbc.syscontract.ContractStatusEnum; @@ -26,16 +27,26 @@ public class Mychain020BBCContext extends AbstractBBCContext { private static final String EVM_CONTRACT_KEY = "evm"; private static final String WASM_CONTRACT_KEY = "wasm"; + @JSONField(serialize = false, deserialize = false) private AMContractClientEVM amContractClientEVM; + @JSONField(serialize = false, deserialize = false) private AMContractClientWASM amContractClientWASM; + @JSONField(serialize = false, deserialize = false) private AMContractClientTeeWASM amContractClientTeeWASM; + @JSONField(serialize = false, deserialize = false) private SDPContractClientEVM sdpContractClientEVM; + @JSONField(serialize = false, deserialize = false) private SDPContractClientWASM sdpContractClientWASM; + @JSONField(serialize = false, deserialize = false) private SDPContractClientTeeWASM sdpContractClientTeeWASM; + @JSONField(serialize = false, deserialize = false) private PtcContractEvm ptcContractEvm; + @JSONField(serialize = false, deserialize = false) private MonitorContractClientEVM monitorContractClientEVM; + @JSONField(serialize = false, deserialize = false) private MonitorVerifierContractEVM monitorVerifierContractEVM; + @JSONField(serialize = false, deserialize = false) private final Logger logger; // 可靠上链相关 diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java index 3dc4b8be..a27473e4 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCService.java @@ -1,6 +1,7 @@ package com.alipay.antchain.bridge.plugins.mychain020; import java.math.BigInteger; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Set; @@ -24,6 +25,7 @@ import com.alipay.antchain.bridge.plugins.lib.BBCService; import com.alipay.antchain.bridge.plugins.mychain020.contract.AMContractClientEVM; import com.alipay.antchain.bridge.plugins.mychain020.contract.AMContractClientWASM; +import com.alipay.antchain.bridge.plugins.mychain020.model.ContractAddressInfo; import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; import com.alipay.antchain.bridge.plugins.mychain020.utils.ContractUtils; import com.alipay.antchain.bridge.plugins.mychain020.utils.MychainUtils; @@ -31,6 +33,7 @@ import com.alipay.mychain.sdk.api.utils.Utils; import com.alipay.mychain.sdk.common.VMTypeEnum; import com.alipay.mychain.sdk.domain.block.Block; +import com.alipay.mychain.sdk.domain.account.Identity; import com.alipay.mychain.sdk.domain.spv.BlockHeaderInfo; import com.alipay.mychain.sdk.domain.transaction.LogEntry; import com.alipay.mychain.sdk.domain.transaction.Transaction; @@ -232,6 +235,11 @@ public void setupSDPMessageContract() { throw new RuntimeException("[Mychain020BBCService] empty bbc context"); } + // setup-bbccontracts is repeatable and is also used to reconcile + // upgraded system contracts. Do not downgrade a fully wired SDP to + // CONTRACT_DEPLOYED merely because its address already exists. + boolean sdpWasReady = context.isSDPReady(mychain020Client.isTeeChain()); + try { if (mychain020Client.isTeeChain()) { @@ -291,7 +299,9 @@ public void setupSDPMessageContract() { MychainUtils.contractAddrFormat( context.getSdpContractClientEVM().getContractAddress(), context.getSdpContractClientWASM().getContractAddress()), - ContractStatusEnum.CONTRACT_DEPLOYED) + sdpWasReady + ? ContractStatusEnum.CONTRACT_READY + : ContractStatusEnum.CONTRACT_DEPLOYED) ); } } @@ -1070,6 +1080,11 @@ public void setupPTCContract() { throw new RuntimeException("empty ptc hub contract in context after deployment"); } + if (!context.getPtcContractEvm().reconcileRootBcdnsCert( + this.mychain020Client.getConfig().getBcdnsRootCertPem())) { + throw new RuntimeException("reconcile ptc hub BCDNS root failed"); + } + PTCContract ptcContract = new PTCContract(); ptcContract.setContractAddress(MychainUtils.contractAddrFormat(context.getPtcContractEvm().getContractAddress(), "")); ptcContract.setStatus(context.getPtcContractEvm().getStatus()); @@ -1097,12 +1112,23 @@ public void setupMonitorContract() { try { if (StrUtil.isNotEmpty(context.getMonitorContractClientEVM().getContractAddress()) - && !context.getMonitorContractClientEVM().isImplementationVersionSupported()) { + && !context.getMonitorContractClientEVM().ensureImplementationSupported()) { getBBCLogger().info( - "[Mychain020BBCService] upgrade monitor contract for {} from legacy implementation {}", + "[Mychain020BBCService] failed to upgrade legacy monitor contract for {}: {}", mychain020Client.getPrimary(), context.getMonitorContractClientEVM().getContractAddress()); - context.getMonitorContractClientEVM().resetDeployment(); + throw new RuntimeException("upgrade legacy monitor for receive-side routing failed"); + } + + if (ObjectUtil.isNotNull(context.getPtcContractEvm()) + && StrUtil.isNotEmpty(context.getPtcContractEvm().getContractAddress()) + && !context.getPtcContractEvm().ensureMonitorVerifierSupport()) { + throw new RuntimeException("upgrade legacy ptc hub for monitor support failed"); + } + if (ObjectUtil.isNotNull(context.getSdpContractClientEVM()) + && StrUtil.isNotEmpty(context.getSdpContractClientEVM().getContractAddress()) + && !context.getSdpContractClientEVM().ensureMonitorSupport()) { + throw new RuntimeException("upgrade legacy sdp for monitor support failed"); } if (!context.getMonitorVerifierContractEVM().deployContract()) { @@ -1136,6 +1162,13 @@ public void setupMonitorContract() { monitorContract.setStatus(context.getMonitorContractClientEVM().getStatus()); context.setMonitorContract(monitorContract); + mychain020Client.getConfig().setMonitorContractName( + context.getMonitorContractClientEVM().getContractAddress()); + mychain020Client.getConfig().setMonitorVerifierContractName( + context.getMonitorVerifierContractEVM().getContractAddress()); + context.setConfForBlockchainClient( + mychain020Client.getConfig().toJsonString().getBytes(StandardCharsets.UTF_8)); + getBBCLogger().info( "[Mychain020BBCService] monitor contract deployed for {}, monitor: {}, verifier: {}", mychain020Client.getPrimary(), @@ -1163,9 +1196,10 @@ public void setProtocolInMonitor(String contractAddress) { throw new RuntimeException("monitor contract is not deployed"); } - String sdpContractName = StrUtil.isNotEmpty(contractAddress) ? - contractAddress : - context.getSdpContractClientEVM().getContractAddress(); + String sdpContractName = resolveEvmContractName( + contractAddress, + context.getSdpContractClientEVM().getContractAddress(), + "sdp"); context.getMonitorContractClientEVM().setProtocol(sdpContractName); } @@ -1181,9 +1215,10 @@ public void setMonitorContract(String monitorContractName) { throw new RuntimeException("sdp contract is not deployed"); } - String monitorName = StrUtil.isNotEmpty(monitorContractName) ? - monitorContractName : - context.getMonitorContractClientEVM().getContractAddress(); + String monitorName = resolveEvmContractName( + monitorContractName, + context.getMonitorContractClientEVM().getContractAddress(), + "monitor"); context.getSdpContractClientEVM().setMonitorContract(monitorName); } @@ -1203,15 +1238,54 @@ public void setMonitorControl(int monitorType) { public void setPtcHubInMonitorVerifier(String contractAddress) { getBBCLogger().info("[Mychain020BBCService] set ptc hub in monitor verifier for {}", mychain020Client.getPrimary()); - if (ObjectUtil.isNull(context.getMonitorVerifierContractEVM()) - || StrUtil.isEmpty(context.getMonitorVerifierContractEVM().getContractAddress())) { + if (ObjectUtil.isNull(context.getMonitorVerifierContractEVM())) { throw new RuntimeException("monitor verifier contract is not deployed"); } - String ptcHubContractName = StrUtil.isNotEmpty(contractAddress) ? - contractAddress : - context.getPtcContractEvm().getContractAddress(); - context.getMonitorVerifierContractEVM().setPtcHubAddress(ptcHubContractName); + String ptcHubContractName = resolveEvmContractName( + contractAddress, + context.getPtcContractEvm().getContractAddress(), + "ptc hub"); + if (StrUtil.isNotEmpty(context.getMonitorVerifierContractEVM().getContractAddress())) { + context.getMonitorVerifierContractEVM().setPtcHubAddress(ptcHubContractName); + return; + } + if (ObjectUtil.isNull(context.getMonitorContractClientEVM()) + || StrUtil.isEmpty(context.getMonitorContractClientEVM().getContractAddress())) { + throw new RuntimeException("monitor verifier contract is not deployed"); + } + + Identity verifierIdentity = context.getMonitorContractClientEVM().getMonitorVerifierIdentity(); + context.getMonitorVerifierContractEVM().setPtcHubAddress(ptcHubContractName, verifierIdentity); + } + + /** + * Common relayer contexts persist Mychain multi-VM addresses as JSON. The + * EVM monitor contracts must hash the contained EVM contract name, not the + * serialized wrapper itself. + */ + private String resolveEvmContractName(String suppliedAddress, + String fallbackAddress, + String contractType) { + String address = StrUtil.isNotEmpty(suppliedAddress) ? suppliedAddress : fallbackAddress; + if (StrUtil.isEmpty(address)) { + throw new RuntimeException(StrUtil.format("{} contract is not deployed", contractType)); + } + if (!address.trim().startsWith("{")) { + return address; + } + + try { + String evmContractName = ContractAddressInfo.decode(address).getEvmContractAddress(); + if (StrUtil.isEmpty(evmContractName)) { + throw new RuntimeException(StrUtil.format( + "{} address does not contain an EVM contract", contractType)); + } + return evmContractName; + } catch (RuntimeException exception) { + throw new RuntimeException(StrUtil.format( + "invalid serialized {} contract address", contractType), exception); + } } @Override diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVM.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVM.java index 9219e3af..d8d4bd17 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVM.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVM.java @@ -11,6 +11,8 @@ import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; import com.alipay.mychain.sdk.api.utils.Utils; import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.crypto.hash.Hash; +import com.alipay.mychain.sdk.domain.account.Identity; import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; import com.alipay.mychain.sdk.errorcode.ErrorCode; import com.alipay.mychain.sdk.vm.EVMOutput; @@ -24,10 +26,12 @@ @Setter public class MonitorContractClientEVM { - public static final int SUPPORTED_IMPLEMENTATION_VERSION = 3; + public static final int SUPPORTED_IMPLEMENTATION_VERSION = 6; private static final String MONITOR_EVM_CONTRACT_PREFIX = "MONITOR_EVM_CONTRACT_"; + private static final String MONITOR_EVM_RUNTIME_PATH = "/contract/v1/solidity/Monitor.bin-runtime"; private static final String GET_IMPLEMENTATION_VERSION_SIGN = "getImplementationVersion()"; + private static final String GET_MONITOR_VERIFIER_SIGN = "getMonitorVerifier()"; private static final String SET_SDP_ADDRESS_SIGN = "setSdpAddress(identity)"; private static final String SET_MONITOR_VERIFIER_ADDRESS_SIGN = "setMonitorVerifierAddress(identity)"; private static final String SET_MONITOR_CONTROL_SIGN = "setMonitorControl(uint32)"; @@ -44,6 +48,22 @@ public MonitorContractClientEVM(Mychain020Client mychain020Client, Logger logger this.logger = logger; } + public String getContractAddress() { + return contractAddress; + } + + public void setContractAddress(String contractAddress) { + this.contractAddress = contractAddress; + } + + public ContractStatusEnum getStatus() { + return status; + } + + public void setStatus(ContractStatusEnum status) { + this.status = status; + } + public boolean deployContract() { if (StrUtil.isNotEmpty(this.contractAddress)) { return true; @@ -89,9 +109,58 @@ public boolean isImplementationVersionSupported() { } } - public void resetDeployment() { - this.contractAddress = null; - this.status = null; + /** + * Upgrade a legacy Monitor in place so that its identity, verifier, + * protocol wiring and policy state are preserved. Monitor V4 only appends + * receive-side entry points and does not change the existing storage + * layout. Monitor V5 additionally routes SDP V2/V3 request and ACK paths + * through the same monitor envelope used by V1, and exposes matching + * receive-side entry points for all three SDP versions. Monitor V6 replaces + * the compiler-sensitive assembly decoder so non-word-aligned business + * payloads are preserved byte-for-byte on Mychain. + */ + public boolean ensureImplementationSupported() { + if (isImplementationVersionSupported()) { + return true; + } + if (StrUtil.isEmpty(this.contractAddress)) { + logger.error("cannot upgrade an empty monitor contract"); + return false; + } + + logger.info( + "Upgrade legacy Monitor {} with runtime {}", + this.contractAddress, + MONITOR_EVM_RUNTIME_PATH); + if (!mychain020Client.upgradeContract( + MONITOR_EVM_RUNTIME_PATH, + this.contractAddress, + VMTypeEnum.EVM)) { + logger.error("failed to upgrade legacy Monitor {}", this.contractAddress); + return false; + } + + boolean supported = isImplementationVersionSupported(); + if (!supported) { + logger.error("Monitor {} is still unsupported after upgrade", this.contractAddress); + } + return supported; + } + + public Identity getMonitorVerifierIdentity() { + TransactionReceipt receipt = mychain020Client.localCallContract( + this.contractAddress, + new EVMParameter(GET_MONITOR_VERIFIER_SIGN)); + if (ObjectUtil.isEmpty(receipt) + || receipt.getResult() != ErrorCode.SUCCESS.getErrorCode() + || ObjectUtil.isEmpty(receipt.getOutput()) + || receipt.getOutput().length != 32) { + throw new CallContractException( + this.contractAddress, + "", + "monitor verifier identity is unavailable"); + } + return new Identity(new Hash(receipt.getOutput())); } public void setProtocol(String sdpContractName) { diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorVerifierContractEVM.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorVerifierContractEVM.java index 6ebd28e9..ce09860d 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorVerifierContractEVM.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorVerifierContractEVM.java @@ -9,6 +9,7 @@ import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; import com.alipay.mychain.sdk.api.utils.Utils; import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.domain.account.Identity; import com.alipay.mychain.sdk.vm.EVMParameter; import lombok.Getter; import lombok.Setter; @@ -32,6 +33,22 @@ public MonitorVerifierContractEVM(Mychain020Client mychain020Client, Logger logg this.logger = logger; } + public String getContractAddress() { + return contractAddress; + } + + public void setContractAddress(String contractAddress) { + this.contractAddress = contractAddress; + } + + public ContractStatusEnum getStatus() { + return status; + } + + public void setStatus(ContractStatusEnum status) { + this.status = status; + } + public boolean deployContract() { if (StrUtil.isNotEmpty(this.contractAddress)) { return true; @@ -54,10 +71,16 @@ public boolean deployContract() { } public void setPtcHubAddress(String ptcHubContractName) { + setPtcHubAddress(ptcHubContractName, null); + } + + public void setPtcHubAddress(String ptcHubContractName, Identity verifierContractIdentity) { EVMParameter parameters = new EVMParameter(SET_PTC_HUB_ADDRESS_SIGN); parameters.addIdentity(Utils.getIdentityByName(ptcHubContractName, mychain020Client.getConfig().getMychainHashType())); - SendResponseResult result = mychain020Client.callContract(this.contractAddress, parameters, true); + SendResponseResult result = verifierContractIdentity == null + ? mychain020Client.callContract(this.contractAddress, parameters, true) + : mychain020Client.callContract(verifierContractIdentity, parameters, true); if (!result.isSuccess()) { throw new CallContractException(this.contractAddress, result.getTxId(), result.getErrorMessage()); } diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvm.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvm.java index f3948727..3a48f720 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvm.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvm.java @@ -41,6 +41,7 @@ import com.alipay.mychain.sdk.api.utils.Utils; import com.alipay.mychain.sdk.common.VMTypeEnum; import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; import com.alipay.mychain.sdk.message.transaction.TransactionReceiptResponse; import com.alipay.mychain.sdk.vm.EVMOutput; import com.alipay.mychain.sdk.vm.EVMParameter; @@ -52,6 +53,16 @@ public class PtcContractEvm extends PTCContract implements AbstractPtcContract { private static final String PTC_HUB_EVM_CONTRACT_PREFIX = "PTC_HUB_EVM_CONTRACT_"; + private static final String PTC_HUB_EVM_RUNTIME_PATH = "/contract/v1/solidity/PtcHub.bin-runtime"; + + private static final String GET_MONITOR_VERIFIER_SIGN = "getMonitorVerifier()"; + + private static final String GET_IMPLEMENTATION_VERSION_SIGN = "getImplementationVersion()"; + + private static final BigInteger ROOT_RECONCILIATION_IMPLEMENTATION_VERSION = BigInteger.valueOf(2L); + + private static final long LEGACY_METHOD_NOT_FOUND_RESULT = 10201L; + private Mychain020Client mychain020Client; private final Logger logger; @@ -122,6 +133,65 @@ public void updatePTCTrustRoot(PTCTrustRoot ptcTrustRoot) { ptcTrustRoot.getPtcCredentialSubject().getApplicant().toHex(), result.getTxId()); } + public boolean reconcileRootBcdnsCert(String bcdnsRootCertPem) { + if (!ensureRootReconciliationSupport()) { + return false; + } + AbstractCrossChainCertificate bcdnsRootCert = + CrossChainCertificateUtil.readCrossChainCertificateFromPem(bcdnsRootCertPem.getBytes()); + if (bcdnsRootCert.getType() != CrossChainCertificateTypeEnum.BCDNS_TRUST_ROOT_CERTIFICATE) { + throw new IllegalArgumentException("PTC hub requires a BCDNS trust root certificate"); + } + + EVMParameter parameters = new EVMParameter("reconcileRootBcdnsCert(bytes)"); + parameters.addBytes(bcdnsRootCert.encode()); + SendResponseResult result = mychain020Client.callContract(this.getContractAddress(), parameters, true); + if (!result.isSuccess()) { + throw new CallContractException(getContractAddress(), result.getTxId(), result.getErrorMessage()); + } + logger.info("Reconciled PTC hub {} with the configured BCDNS root in tx {}", + getContractAddress(), result.getTxId()); + return true; + } + + public boolean ensureRootReconciliationSupport() { + if (StrUtil.isEmpty(this.getContractAddress())) { + return false; + } + BigInteger version = queryImplementationVersion(); + if (version.compareTo(ROOT_RECONCILIATION_IMPLEMENTATION_VERSION) >= 0) { + return true; + } + + logger.info("Upgrade legacy PTC hub {} for BCDNS root reconciliation", getContractAddress()); + if (!mychain020Client.upgradeContract( + PTC_HUB_EVM_RUNTIME_PATH, + getContractAddress(), + VMTypeEnum.EVM)) { + logger.error("failed to upgrade PTC hub {} for BCDNS root reconciliation", getContractAddress()); + return false; + } + return queryImplementationVersion().compareTo(ROOT_RECONCILIATION_IMPLEMENTATION_VERSION) >= 0; + } + + private BigInteger queryImplementationVersion() { + TransactionReceipt receipt = mychain020Client.localCallContract( + this.getContractAddress(), + new EVMParameter(GET_IMPLEMENTATION_VERSION_SIGN)); + if (ObjectUtil.isEmpty(receipt)) { + throw new IllegalStateException("empty PTC hub implementation-version receipt"); + } + if (receipt.getResult() == LEGACY_METHOD_NOT_FOUND_RESULT) { + return BigInteger.ZERO; + } + if (receipt.getResult() != ErrorCode.SUCCESS.getErrorCode() + || ObjectUtil.isEmpty(receipt.getOutput())) { + throw new IllegalStateException( + StrUtil.format("unexpected PTC hub implementation-version result: {}", receipt.getResult())); + } + return new BigInteger(1, receipt.getOutput()); + } + public void setCommitteeVerifier(String committeeVerifierName) { EVMParameter parameters = new EVMParameter("addPtcVerifier(identity)"); parameters.addIdentity(Utils.getIdentityByName(committeeVerifierName, mychain020Client.getConfig().getMychainHashType())); @@ -149,6 +219,75 @@ public void setMonitorVerifier(String monitorVerifierName) { logger.info("Set monitor verifier {} with tx {} successfully!", monitorVerifierName, result.getTxId()); } + /** + * Upgrade a PTC Hub deployed before monitor support was introduced while + * preserving the contract identity and its existing trust data. + * + *

The regulatory PTC Hub appends only {@code monitorVerifierAddr} to the + * legacy storage layout. Mychain's update-contract operation replaces the + * runtime code at the existing identity, so the BCDNS certificate, PTC + * trust roots, verify anchors and TpBTAs remain available.

+ */ + public boolean ensureMonitorVerifierSupport() { + if (isMonitorVerifierSupported()) { + return true; + } + if (StrUtil.isEmpty(this.getContractAddress())) { + logger.error("cannot upgrade an empty ptc hub contract"); + return false; + } + + logger.info( + "Upgrade legacy PTC hub {} with monitor-enabled runtime {}", + this.getContractAddress(), + PTC_HUB_EVM_RUNTIME_PATH); + if (!mychain020Client.upgradeContract( + PTC_HUB_EVM_RUNTIME_PATH, + this.getContractAddress(), + VMTypeEnum.EVM)) { + logger.error("failed to upgrade legacy ptc hub {}", this.getContractAddress()); + return false; + } + + boolean supported = isMonitorVerifierSupported(); + if (!supported) { + logger.error("ptc hub {} still lacks monitor support after upgrade", this.getContractAddress()); + } + return supported; + } + + public boolean isMonitorVerifierSupported() { + if (StrUtil.isEmpty(this.getContractAddress())) { + return false; + } + + try { + TransactionReceipt receipt = mychain020Client.localCallContract( + this.getContractAddress(), + new EVMParameter(GET_MONITOR_VERIFIER_SIGN)); + if (ObjectUtil.isEmpty(receipt)) { + throw new IllegalStateException("empty ptc hub capability probe receipt"); + } + if (receipt.getResult() == LEGACY_METHOD_NOT_FOUND_RESULT) { + return false; + } + if (receipt.getResult() != ErrorCode.SUCCESS.getErrorCode() + || ObjectUtil.isEmpty(receipt.getOutput())) { + throw new IllegalStateException( + StrUtil.format( + "unexpected ptc hub capability probe result: {}", + receipt.getResult())); + } + return true; + } catch (Exception e) { + throw new IllegalStateException( + StrUtil.format( + "failed to probe monitor support on ptc hub {}", + this.getContractAddress()), + e); + } + } + public String getCommitteeVerifier() { EVMParameter parameters = new EVMParameter("verifierMap(uint8)"); parameters.addUint(BigInteger.valueOf(PTCTypeEnum.COMMITTEE.ordinal())); diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVM.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVM.java index da83941f..02429396 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVM.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVM.java @@ -5,6 +5,7 @@ import java.util.UUID; import cn.hutool.core.util.HexUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alipay.antchain.bridge.commons.bbc.syscontract.ContractStatusEnum; import com.alipay.antchain.bridge.commons.bbc.syscontract.SDPContract; @@ -16,6 +17,7 @@ import com.alipay.mychain.sdk.common.VMTypeEnum; import com.alipay.mychain.sdk.crypto.hash.Hash; import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; import com.alipay.mychain.sdk.vm.EVMOutput; import com.alipay.mychain.sdk.vm.EVMParameter; import lombok.Getter; @@ -29,8 +31,12 @@ public class SDPContractClientEVM extends SDPContract implements AbstractSDPCont private static final String SDP_EVM_CONTRACT_PREFIX = "SDP_EVM_CONTRACT_"; + private static final String SDP_EVM_RUNTIME_PATH = "/contract/v1/solidity/SDPMsg.bin-runtime"; + public static final int SUPPORTED_MONITOR_ROUTING_VERSION = 4; + private static final String SET_AM_CONTRACT_AND_DOMAIN_SIGN = "SetAmContractAndDomain(identity,string)"; private static final String SET_MONITOR_CONTRACT_SIGN = "setMonitorContract(identity)"; + private static final String GET_MONITOR_ROUTING_VERSION_SIGN = "getMonitorRoutingVersion()"; private static final String RECV_OFF_CHAIN_EXCEPTION_SIGN = "recvOffChainException(bytes32,bytes)"; private static final String UPDATE_VERIFIED_INFO_SIGN = "updateVerifiedInfo(string,bytes32,uint64,uint64)"; private static final String QUERY_VALIDATED_BLOCK_STATE_BY_DOMAIN_SIGN = "queryValidatedBlockStateByDomain(string)"; @@ -38,6 +44,8 @@ public class SDPContractClientEVM extends SDPContract implements AbstractSDPCont private static final String BLOCK_STATE_CLS = "(uint16,string,bytes32,uint256,uint64)"; + private static final long LEGACY_METHOD_NOT_FOUND_RESULT = 10201L; + private Mychain020Client mychain020Client; private String localDomain; @@ -49,6 +57,14 @@ public SDPContractClientEVM(Mychain020Client mychain020Client, Logger logger) { this.logger = logger; } + public String getLocalDomain() { + return localDomain; + } + + public void setLocalDomain(String localDomain) { + this.localDomain = localDomain; + } + public void setMonitorContract(String monitorContractName) { EVMParameter parameters = new EVMParameter(SET_MONITOR_CONTRACT_SIGN); parameters.addIdentity(Utils.getIdentityByName( @@ -63,6 +79,73 @@ public void setMonitorContract(String monitorContractName) { } } + /** + * Upgrade an SDP contract deployed before regulatory monitor support was + * added. The monitor address is appended after every legacy storage field + * in the regulatory contract, so the existing domain, sequence and block + * state data remain at their original slots. + */ + public boolean ensureMonitorSupport() { + if (isMonitorSupported()) { + return true; + } + if (StrUtil.isEmpty(this.getContractAddress())) { + logger.error("cannot upgrade an empty sdp contract"); + return false; + } + + logger.info( + "Upgrade legacy SDP {} with monitor-enabled runtime {}", + this.getContractAddress(), + SDP_EVM_RUNTIME_PATH); + if (!mychain020Client.upgradeContract( + SDP_EVM_RUNTIME_PATH, + this.getContractAddress(), + VMTypeEnum.EVM)) { + logger.error("failed to upgrade legacy sdp {}", this.getContractAddress()); + return false; + } + + boolean supported = isMonitorSupported(); + if (!supported) { + logger.error("sdp {} still lacks monitor support after upgrade", this.getContractAddress()); + } + return supported; + } + + public boolean isMonitorSupported() { + if (StrUtil.isEmpty(this.getContractAddress())) { + return false; + } + + try { + TransactionReceipt receipt = mychain020Client.localCallContract( + this.getContractAddress(), + new EVMParameter(GET_MONITOR_ROUTING_VERSION_SIGN)); + if (ObjectUtil.isEmpty(receipt)) { + throw new IllegalStateException("empty sdp capability probe receipt"); + } + if (receipt.getResult() == LEGACY_METHOD_NOT_FOUND_RESULT) { + return false; + } + if (receipt.getResult() != ErrorCode.SUCCESS.getErrorCode() + || ObjectUtil.isEmpty(receipt.getOutput())) { + throw new IllegalStateException( + StrUtil.format( + "unexpected sdp capability probe result: {}", + receipt.getResult())); + } + BigInteger version = new EVMOutput(Hex.toHexString(receipt.getOutput())).getUint(); + return BigInteger.valueOf(SUPPORTED_MONITOR_ROUTING_VERSION).equals(version); + } catch (Exception e) { + throw new IllegalStateException( + StrUtil.format( + "failed to probe monitor support on sdp {}", + this.getContractAddress()), + e); + } + } + @Override public boolean setAmContractAndDomain(String amContractName) { EVMParameter parameters = new EVMParameter(SET_AM_CONTRACT_AND_DOMAIN_SIGN); diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/model/ContractAddressInfo.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/model/ContractAddressInfo.java index 12481c84..bae1b2af 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/model/ContractAddressInfo.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/model/ContractAddressInfo.java @@ -38,6 +38,18 @@ public static ContractAddressInfo decode(String json) { return JSON.parseObject(json, ContractAddressInfo.class); } + public static String resolveEvmContractAddress(String contractAddress) { + if (StrUtil.isBlank(contractAddress) || contractAddress.trim().charAt(0) != '{') { + return contractAddress; + } + + String evmContractAddress = decode(contractAddress).getEvmContractAddress(); + if (StrUtil.isBlank(evmContractAddress)) { + throw new IllegalArgumentException("missing evm contract address: " + contractAddress); + } + return evmContractAddress; + } + @JSONField(name = "evm") private String evmContractAddress; diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/sdk/Mychain020Client.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/sdk/Mychain020Client.java index 18141ae5..364fd80b 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/sdk/Mychain020Client.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/java/com/alipay/antchain/bridge/plugins/mychain020/sdk/Mychain020Client.java @@ -133,12 +133,32 @@ public boolean shutdown() { // ==================================================== 合约相关接口 public SendResponseResult callContract(String contractName, Parameters parameters, boolean sync) { + return callContract( + Utils.getIdentityByName(contractName, config.getMychainHashType()), + contractName, + parameters, + sync); + } + + /** + * Calls a contract whose Mychain identity was recovered from another + * on-chain system contract. This is required for legacy contexts which did + * not persist the randomly generated monitor-verifier contract name. + */ + public SendResponseResult callContract(Identity contractIdentity, Parameters parameters, boolean sync) { + return callContract(contractIdentity, contractIdentity.hexStrValue(), parameters, sync); + } + + private SendResponseResult callContract(Identity contractIdentity, + String contractLabel, + Parameters parameters, + boolean sync) { String account = config.getMychainAnchorAccount(); VMTypeEnum vmType = MychainUtils.getSupportedParameterType(parameters); logger.info("call {} contractName {}.{}", vmType, - contractName, + contractLabel, vmType == VMTypeEnum.EVM ? ((EVMParameter) parameters).getMethodSignature() : ((WASMParameter) parameters).getMethodSignature()); @@ -146,7 +166,7 @@ public SendResponseResult callContract(String contractName, Parameters parameter try { CallContractRequest request = new CallContractRequest( Utils.getIdentityByName(account, config.getMychainHashType()), - Utils.getIdentityByName(contractName, config.getMychainHashType()), + contractIdentity, parameters, BigInteger.ZERO, vmType diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/Monitor.bin-runtime b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/Monitor.bin-runtime new file mode 100644 index 00000000..121848a2 --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/Monitor.bin-runtime @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50600436106102275760003560e01c806396d8b69211610130578063bc327e40116100b8578063cd6be5b81161007c578063cd6be5b814610610578063d16352af1461062e578063e8913e8f1461064c578063ed4724c31461067c578063fed209e2146106ac57610227565b8063bc327e401461057e578063c2450b501461059c578063c3cd569d146105ba578063ca4f1d12146105d8578063cd616e1e146105f457610227565b8063a2799df0116100ff578063a2799df0146104f0578063b1fa0c6d1461050c578063b92e9fe814610528578063baad6f5e14610544578063bbc16e481461056257610227565b806396d8b69214610456578063980113c714610472578063980c8e75146104a25780639f62a9f9146104c057610227565b806365a6371f116101b3578063760f791811610182578063760f7918146103b25780637e117431146103ce5780638ba69094146103fe5780638da5cb5b1461041c57806392c4f2441461043a57610227565b806365a6371f146103525780636a766c071461036e578063715018a61461038a578063754b377c1461039457610227565b806326ddd415116101fa57806326ddd415146102b05780632b9ff60b146102e0578063387868ae146102fc57806340b6b1dd1461031a5780634c63280e1461033657610227565b80631f56086f1461022c57806321bbc11d1461024857806323ae474b146102645780632644ef0514610294575b600080fd5b61024660048036038101906102419190612d93565b6106ca565b005b610262600480360381019061025d9190612e7b565b610769565b005b61027e60048036038101906102799190612fad565b6108f4565b60405161028b91906130a8565b60405180910390f35b6102ae60048036038101906102a991906130ff565b6109d0565b005b6102ca60048036038101906102c5919061312c565b610a44565b6040516102d791906130a8565b60405180910390f35b6102fa60048036038101906102f59190613436565b610b1a565b005b610304610bd8565b604051610311919061354f565b60405180910390f35b610334600480360381019061032f919061356a565b610bde565b005b610350600480360381019061034b9190612e7b565b610d1b565b005b61036c6004803603810190610367919061356a565b610ea6565b005b61038860048036038101906103839190612d93565b610f88565b005b610392611025565b005b61039c611081565b6040516103a99190613620565b60405180910390f35b6103cc60048036038101906103c7919061363b565b611086565b005b6103e860048036038101906103e39190612fad565b611141565b6040516103f591906130a8565b60405180910390f35b61040661121d565b6040516104139190613620565b60405180910390f35b610424611222565b604051610431919061354f565b60405180910390f35b610454600480360381019061044f9190612d93565b61122b565b005b610470600480360381019061046b9190613715565b6112c8565b005b61048c600480360381019061048791906137fe565b611419565b604051610499919061383a565b60405180910390f35b6104aa611439565b6040516104b79190613620565b60405180910390f35b6104da60048036038101906104d591906137fe565b611453565b6040516104e7919061383a565b60405180910390f35b61050a60048036038101906105059190613855565b611473565b005b6105266004803603810190610521919061356a565b6114f2565b005b610542600480360381019061053d919061356a565b61162f565b005b61054c611711565b6040516105599190613620565b60405180910390f35b61057c60048036038101906105779190613855565b611716565b005b610586611795565b6040516105939190613620565b60405180910390f35b6105a461179e565b6040516105b1919061354f565b60405180910390f35b6105c26117a8565b6040516105cf9190613620565b60405180910390f35b6105f260048036038101906105ed919061356a565b6117ad565b005b61060e6004803603810190610609919061356a565b61188f565b005b610618611971565b6040516106259190613620565b60405180910390f35b610636611987565b604051610643919061354f565b60405180910390f35b6106666004803603810190610661919061312c565b611991565b60405161067391906130a8565b60405180910390f35b61069660048036038101906106919190612d93565b611a67565b6040516106a3919061383a565b60405180910390f35b6106b4611aa4565b6040516106c1919061354f565b60405180910390f35b6106d2611aaa565b6106da611222565b1461071a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610711906138f2565b60405180910390fd5b6000810361075d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075490613984565b60405180910390fd5b61076681611ab2565b50565b600263ffffffff16600360009054906101000a900463ffffffff1663ffffffff16036107d9576107993384611af1565b6107d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cf906139f0565b60405180910390fd5b5b600061083b600360009054906101000a900463ffffffff1684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611b62565b9050600154636bba080887878733866040518663ffffffff1660e01b815260040161086a959493929190613ac5565b600060405180830381600087803b15801561088457600080fd5b505af1158015610898573d6000803e3d6000fd5b50505050337f659e3ab83f50d3afa2f903375db8e7f6b2d1edfc58028278faec635a67feb199878787600360009054906101000a900463ffffffff166040516108e49493929190613b1a565b60405180910390a2505050505050565b6000600154331461093a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190613ba6565b60405180910390fd5b6000610948888a8888611c91565b905060015463d582d1a88c8c8c8c8c878b8b6040518963ffffffff1660e01b815260040161097d989796959493929190613be4565b6020604051808303816000875af115801561099c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c09190613c78565b9150509998505050505050505050565b6109d8611aaa565b6109e0611222565b14610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a17906138f2565b60405180910390fd5b80600360006101000a81548163ffffffff021916908363ffffffff16021790555050565b60006001543314610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190613ba6565b60405180910390fd5b6000610a9886888686611c91565b905060015463c730cf528a8a8a8a8a876040518763ffffffff1660e01b8152600401610ac996959493929190613ca5565b6020604051808303816000875af1158015610ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0c9190613c78565b915050979650505050505050565b6001543314610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5590613ba6565b60405180910390fd5b6000610b6983611d6d565b915050886383c6d5a2898989898987896040518863ffffffff1660e01b8152600401610b9b9796959493929190613d5b565b600060405180830381600087803b158015610bb557600080fd5b505af1158015610bc9573d6000803e3d6000fd5b50505050505050505050505050565b60015481565b6001543314610c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1990613ba6565b60405180910390fd5b600080610c7284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d6d565b9150915084639e417731898989856040518563ffffffff1660e01b8152600401610c9f9493929190613ddf565b600060405180830381600087803b158015610cb957600080fd5b505af1158015610ccd573d6000803e3d6000fd5b5050505084867fb5d068f7a6b866ef7b54643b3a644cc24a769c2be51c192b5311c89c2ca9f8a98a8a866000604051610d099493929190613e26565b60405180910390a35050505050505050565b600263ffffffff16600360009054906101000a900463ffffffff1663ffffffff1603610d8b57610d4b3384611af1565b610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d81906139f0565b60405180910390fd5b5b6000610ded600360009054906101000a900463ffffffff1684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611b62565b90506001546389223f8087878733866040518663ffffffff1660e01b8152600401610e1c959493929190613ac5565b600060405180830381600087803b158015610e3657600080fd5b505af1158015610e4a573d6000803e3d6000fd5b50505050337f659e3ab83f50d3afa2f903375db8e7f6b2d1edfc58028278faec635a67feb199878787600360009054906101000a900463ffffffff16604051610e969493929190613b1a565b60405180910390a2505050505050565b6001543314610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee190613ba6565b60405180910390fd5b610f8086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506001611ecb565b505050505050565b610f90611aaa565b610f98611222565b14610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf906138f2565b60405180910390fd5b6000810361101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290613ed8565b60405180910390fd5b8060028190555050565b61102d611aaa565b611035611222565b14611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c906138f2565b60405180910390fd5b61107f6000611ab2565b565b600681565b60015433146110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190613ba6565b60405180910390fd5b60006110d582611d6d565b9150508763153903588888888888876040518763ffffffff1660e01b815260040161110596959493929190613ef8565b600060405180830381600087803b15801561111f57600080fd5b505af1158015611133573d6000803e3d6000fd5b505050505050505050505050565b60006001543314611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90613ba6565b60405180910390fd5b6000611195888a8888611c91565b90506001546326ca2c898c8c8c8c8c878b8b6040518963ffffffff1660e01b81526004016111ca989796959493929190613be4565b6020604051808303816000875af11580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d9190613c78565b9150509998505050505050505050565b600281565b60008054905090565b611233611aaa565b61123b611222565b1461127b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611272906138f2565b60405180910390fd5b600081036112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b590613fb3565b60405180910390fd5b8060018190555050565b60006002540361130d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113049061401f565b60405180910390fd5b6002546342660bb489898989898989896040518963ffffffff1660e01b815260040161134098979695949392919061406c565b6020604051808303816000875af115801561135f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138391906140ea565b6113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614189565b60405180910390fd5b61140f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611fdf565b5050505050505050565b60046020528060005260406000206000915054906101000a900460ff1681565b6000600360009054906101000a900463ffffffff16905090565b60056020528060005260406000206000915054906101000a900460ff1681565b61147b611aaa565b611483611222565b146114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba906138f2565b60405180910390fd5b806004600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6001543314611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d90613ba6565b60405180910390fd5b60008061158684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d6d565b9150915084632e00b395898989856040518563ffffffff1660e01b81526004016115b39493929190613ddf565b600060405180830381600087803b1580156115cd57600080fd5b505af11580156115e1573d6000803e3d6000fd5b5050505084867fb5d068f7a6b866ef7b54643b3a644cc24a769c2be51c192b5311c89c2ca9f8a98a8a86600160405161161d9493929190613e26565b60405180910390a35050505050505050565b6001543314611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a90613ba6565b60405180910390fd5b61170986868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506000611ecb565b505050505050565b600181565b61171e611aaa565b611726611222565b14611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d906138f2565b60405180910390fd5b806005600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006006905090565b6000600254905090565b600381565b60015433146117f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e890613ba6565b60405180910390fd5b61188786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506000611ecb565b505050505050565b60015433146118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca90613ba6565b60405180910390fd5b61196986868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506001611ecb565b505050505050565b600360009054906101000a900463ffffffff1681565b6000600154905090565b600060015433146119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce90613ba6565b60405180910390fd5b60006119e586888686611c91565b905060015463d5dd79138a8a8a8a8a876040518763ffffffff1660e01b8152600401611a1696959493929190613ca5565b6020604051808303816000875af1158015611a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a599190613c78565b915050979650505050505050565b6000600263ffffffff16600360009054906101000a900463ffffffff1663ffffffff16141580611a9d5750611a9c3383611af1565b5b9050919050565b60025481565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b6000600460008460001b815260200190815260200160002060009054906101000a900460ff1615611b255760009050611b5c565b600560008360001b815260200190815260200160002060009054906101000a900460ff1615611b575760009050611b5c565b600190505b92915050565b606060008067ffffffffffffffff811115611b8057611b7f61322a565b5b6040519080825280601f01601f191660200182016040528015611bb25781602001600182028036833780820191505090505b5090506000611bc0826122a4565b90506000611bcd856122a4565b9050600081836004611bdf91906141d8565b611be991906141d8565b67ffffffffffffffff811115611c0257611c0161322a565b5b6040519080825280601f01601f191660200182016040528015611c345781602001600182028036833780820191505090505b509050600081519050611c488189846122fc565b611c526020612313565b81611c5d919061422e565b9050611c6a818684612325565b8381611c76919061422e565b9050611c83818884612325565b819550505050505092915050565b6060600263ffffffff16600360009054906101000a900463ffffffff1663ffffffff1603611d0357611cc38585611af1565b611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf9906139f0565b60405180910390fd5b5b611d63600360009054906101000a900463ffffffff1684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611b62565b9050949350505050565b600060606000835190506044811015611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db2906142d4565b60405180910390fd5b611dc58482612390565b9250600163ffffffff168363ffffffff161480611dee5750600263ffffffff168363ffffffff16145b80611e055750600363ffffffff168363ffffffff16145b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90614340565b60405180910390fd5b611e4e6020612313565b81611e59919061422e565b90506060611e6785836124cc565b8093508192505050611e7985836124cc565b809350819450505060008214611ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebb906143d2565b60405180910390fd5b5050915091565b600080611ed784611d6d565b915091508215611f3f5784632e00b3958888846040518463ffffffff1660e01b8152600401611f08939291906143f2565b600060405180830381600087803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b50505050611f99565b84639e4177318888846040518463ffffffff1660e01b8152600401611f66939291906143f2565b600060405180830381600087803b158015611f8057600080fd5b505af1158015611f94573d6000803e3d6000fd5b505050505b84867fb5d068f7a6b866ef7b54643b3a644cc24a769c2be51c192b5311c89c2ca9f8a9898587604051611fce93929190614437565b60405180910390a350505050505050565b6000806000611fed84612731565b925092509250600080600f601c8663ffffffff16901c169050600160ff16600160038360ff16901c1660ff16036120ea576000600782169050600060ff168160ff1614806120415750600160ff168160ff16145b612080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612077906144e7565b60405180910390fd5b60008060ff168260ff16149050806004600088815260200190815260200160002060006101000a81548160ff021916908315150217905550806005600087815260200190815260200160002060006101000a81548160ff0219169083151502179055506001935050505b6000600f60188763ffffffff16901c169050600160ff16600160038360ff16901c1660ff16036121c8576000600782169050600060ff168160ff1603612151576001600360006101000a81548163ffffffff021916908363ffffffff1602179055506121c2565b600160ff168160ff1603612186576002600360006101000a81548163ffffffff021916908363ffffffff1602179055506121c1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b890614579565b60405180910390fd5b5b60019350505b82612208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ff906145e5565b60405180910390fd5b7f2b85d1f7cd875ea76b4e6036c4b9adfa98f64b8695afacb50009649d23abe630868686600460008a815260200190815260200160002060009054906101000a900460ff16600560008a815260200190815260200160002060009054906101000a900460ff16600360009054906101000a900463ffffffff1660405161229396959493929190614605565b60405180910390a150505050505050565b6000602082516122b49190614695565b90506000602083516122c691906146c6565b146122da5780806122d6906146f7565b9150505b80806122e5906146f7565b9150506020816122f5919061473f565b9050919050565b828101600481038051848352808252505050505050565b600061231e8261289c565b9050919050565b6000602083516123359190614695565b905060006020845161234791906146c6565b111561235c578080612358906146f7565b9150505b60006001820191505b81811015612389576020810284015185840152602085039450600181019050612365565b5050505050565b6000600482101580156123a4575082518211155b6123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da906147e5565b60405180910390fd5b826001836123f1919061422e565b8151811061240257612401614805565b5b602001015160f81c60f81b60f81c60ff16600884600285612423919061422e565b8151811061243457612433614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b60108560038661245d919061422e565b8151811061246e5761246d614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b601886600487612497919061422e565b815181106124a8576124a7614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b171717905092915050565b606060006020831015612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b906148a6565b60405180910390fd5b60006125208585612390565b63ffffffff16905060006020601f8361253991906141d8565b6125439190614695565b90506000602082612554919061473f565b905080602061256391906141d8565b8610156125a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259c90614938565b60405180910390fd5b806020876125b3919061422e565b6125bd919061422e565b93508267ffffffffffffffff8111156125d9576125d861322a565b5b6040519080825280601f01601f19166020018201604052801561260b5781602001600182028036833780820191505090505b50945060005b8281101561272657600060208260018661262b919061422e565b612635919061422e565b61263f919061473f565b8661264a91906141d8565b9050600060208361265b919061473f565b90506000818761266b919061422e565b9050602081111561267b57602090505b60005b8181101561270f578b818561269391906141d8565b815181106126a4576126a3614805565b5b602001015160f81c60f81b8a82856126bc91906141d8565b815181106126cd576126cc614805565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612707906146f7565b91505061267e565b50505050808061271e906146f7565b915050612611565b505050509250929050565b600080600080845190506127458582612acb565b90506127518582612acb565b90506004811015612797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278e906149a4565b60405180910390fd5b6127ad856004836127a8919061422e565b612ba7565b93506004816127bc919061422e565b90506127c88582612acb565b9050602081101561280e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280590614a10565b60405180910390fd5b60208161281b919061422e565b90506128278582612cd6565b92506128338582612acb565b90506020811015612879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287090614a7c565b60405180910390fd5b602081612886919061422e565b90506128928582612cd6565b9150509193909250565b600081600881146129a957601081146129b257601881146129bb57602081146129c457602881146129cd57603081146129d657603881146129df57604081146129e857604881146129f157605081146129fa5760588114612a035760608114612a0c5760688114612a155760708114612a1e5760788114612a275760808114612a305760888114612a395760908114612a425760988114612a4b5760a08114612a545760a88114612a5d5760b08114612a665760b88114612a6f5760c08114612a785760c88114612a815760d08114612a8a5760d88114612a935760e08114612a9c5760e88114612aa55760f08114612aae5760f88114612ab7576101008114612ac05760209150612ac5565b60019150612ac5565b60029150612ac5565b60039150612ac5565b60049150612ac5565b60059150612ac5565b60069150612ac5565b60079150612ac5565b60089150612ac5565b60099150612ac5565b600a9150612ac5565b600b9150612ac5565b600c9150612ac5565b600d9150612ac5565b600e9150612ac5565b600f9150612ac5565b60109150612ac5565b60119150612ac5565b60129150612ac5565b60139150612ac5565b60149150612ac5565b60159150612ac5565b60169150612ac5565b60179150612ac5565b60189150612ac5565b60199150612ac5565b601a9150612ac5565b601b9150612ac5565b601c9150612ac5565b601d9150612ac5565b601e9150612ac5565b601f9150612ac5565b602091505b50919050565b60006004821015612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890614b0e565b60405180910390fd5b6000612b2984600485612b24919061422e565b612ba7565b905060048163ffffffff16612b3e91906141d8565b831015612b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7790614ba0565b60405180910390fd5b60048163ffffffff1684612b94919061422e565b612b9e919061422e565b91505092915050565b60008251600483612bb891906141d8565b1115612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf0906147e5565b60405180910390fd5b82600383612c0791906141d8565b81518110612c1857612c17614805565b5b602001015160f81c60f81b60f81c60ff16600884600285612c3991906141d8565b81518110612c4a57612c49614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b601085600186612c7391906141d8565b81518110612c8457612c83614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b6018868681518110612cb257612cb1614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b171717905092915050565b60008251602083612ce791906141d8565b1115612d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1f90614c0c565b60405180910390fd5b81602084010151905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6000612d6082612d4b565b9050919050565b612d7081612d55565b8114612d7b57600080fd5b50565b600081359050612d8d81612d67565b92915050565b600060208284031215612da957612da8612d41565b5b6000612db784828501612d7e565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612de557612de4612dc0565b5b8235905067ffffffffffffffff811115612e0257612e01612dc5565b5b602083019150836001820283011115612e1e57612e1d612dca565b5b9250929050565b60008083601f840112612e3b57612e3a612dc0565b5b8235905067ffffffffffffffff811115612e5857612e57612dc5565b5b602083019150836001820283011115612e7457612e73612dca565b5b9250929050565b600080600080600060608688031215612e9757612e96612d41565b5b600086013567ffffffffffffffff811115612eb557612eb4612d46565b5b612ec188828901612dcf565b95509550506020612ed488828901612d7e565b935050604086013567ffffffffffffffff811115612ef557612ef4612d46565b5b612f0188828901612e25565b92509250509295509295909350565b60008115159050919050565b612f2581612f10565b8114612f3057600080fd5b50565b600081359050612f4281612f1c565b92915050565b600060ff82169050919050565b612f5e81612f48565b8114612f6957600080fd5b50565b600081359050612f7b81612f55565b92915050565b612f8a81612d4b565b8114612f9557600080fd5b50565b600081359050612fa781612f81565b92915050565b600080600080600080600080600060e08a8c031215612fcf57612fce612d41565b5b60008a013567ffffffffffffffff811115612fed57612fec612d46565b5b612ff98c828d01612dcf565b9950995050602061300c8c828d01612d7e565b975050604061301d8c828d01612d7e565b965050606061302e8c828d01612f33565b95505060808a013567ffffffffffffffff81111561304f5761304e612d46565b5b61305b8c828d01612e25565b945094505060a061306e8c828d01612f6c565b92505060c061307f8c828d01612f98565b9150509295985092959850929598565b6000819050919050565b6130a28161308f565b82525050565b60006020820190506130bd6000830184613099565b92915050565b600063ffffffff82169050919050565b6130dc816130c3565b81146130e757600080fd5b50565b6000813590506130f9816130d3565b92915050565b60006020828403121561311557613114612d41565b5b6000613123848285016130ea565b91505092915050565b600080600080600080600060a0888a03121561314b5761314a612d41565b5b600088013567ffffffffffffffff81111561316957613168612d46565b5b6131758a828b01612dcf565b975097505060206131888a828b01612d7e565b95505060406131998a828b01612d7e565b94505060606131aa8a828b01612f33565b935050608088013567ffffffffffffffff8111156131cb576131ca612d46565b5b6131d78a828b01612e25565b925092505092959891949750929550565b6131f18161308f565b81146131fc57600080fd5b50565b60008135905061320e816131e8565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61326282613219565b810181811067ffffffffffffffff821117156132815761328061322a565b5b80604052505050565b6000613294612d37565b90506132a08282613259565b919050565b600067ffffffffffffffff8211156132c0576132bf61322a565b5b6132c982613219565b9050602081019050919050565b82818337600083830152505050565b60006132f86132f3846132a5565b61328a565b90508281526020810184848401111561331457613313613214565b5b61331f8482856132d6565b509392505050565b600082601f83011261333c5761333b612dc0565b5b813561334c8482602086016132e5565b91505092915050565b600067ffffffffffffffff82169050919050565b61337281613355565b811461337d57600080fd5b50565b60008135905061338f81613369565b92915050565b600067ffffffffffffffff8211156133b0576133af61322a565b5b6133b982613219565b9050602081019050919050565b60006133d96133d484613395565b61328a565b9050828152602081018484840111156133f5576133f4613214565b5b6134008482856132d6565b509392505050565b600082601f83011261341d5761341c612dc0565b5b813561342d8482602086016133c6565b91505092915050565b600080600080600080600080610100898b03121561345757613456612d41565b5b60006134658b828c01612d7e565b98505060206134768b828c016131ff565b975050604089013567ffffffffffffffff81111561349757613496612d46565b5b6134a38b828c01613327565b96505060606134b48b828c01612d7e565b95505060806134c58b828c016130ea565b94505060a06134d68b828c01613380565b93505060c089013567ffffffffffffffff8111156134f7576134f6612d46565b5b6135038b828c01613408565b92505060e089013567ffffffffffffffff81111561352457613523612d46565b5b6135308b828c01613327565b9150509295985092959890939650565b61354981612d55565b82525050565b60006020820190506135646000830184613540565b92915050565b6000806000806000806080878903121561358757613586612d41565b5b600087013567ffffffffffffffff8111156135a5576135a4612d46565b5b6135b189828a01612dcf565b965096505060206135c489828a01612d7e565b94505060406135d589828a01612d7e565b935050606087013567ffffffffffffffff8111156135f6576135f5612d46565b5b61360289828a01612e25565b92509250509295509295509295565b61361a816130c3565b82525050565b60006020820190506136356000830184613611565b92915050565b600080600080600080600060e0888a03121561365a57613659612d41565b5b60006136688a828b01612d7e565b97505060206136798a828b016131ff565b965050604088013567ffffffffffffffff81111561369a57613699612d46565b5b6136a68a828b01613327565b95505060606136b78a828b01612d7e565b94505060806136c88a828b016130ea565b93505060a06136d98a828b01613380565b92505060c088013567ffffffffffffffff8111156136fa576136f9612d46565b5b6137068a828b01613408565b91505092959891949750929550565b6000806000806000806000806080898b03121561373557613734612d41565b5b600089013567ffffffffffffffff81111561375357613752612d46565b5b61375f8b828c01612dcf565b9850985050602089013567ffffffffffffffff81111561378257613781612d46565b5b61378e8b828c01612dcf565b9650965050604089013567ffffffffffffffff8111156137b1576137b0612d46565b5b6137bd8b828c01612e25565b9450945050606089013567ffffffffffffffff8111156137e0576137df612d46565b5b6137ec8b828c01612e25565b92509250509295985092959890939650565b60006020828403121561381457613813612d41565b5b6000613822848285016131ff565b91505092915050565b61383481612f10565b82525050565b600060208201905061384f600083018461382b565b92915050565b6000806040838503121561386c5761386b612d41565b5b600061387a858286016131ff565b925050602061388b85828601612f33565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138dc602083613895565b91506138e7826138a6565b602082019050919050565b6000602082019050818103600083015261390b816138cf565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b600061396e602783613895565b915061397982613912565b604082019050919050565b6000602082019050818103600083015261399d81613961565b9050919050565b7f4d6f6e69746f723a20707265206d6f6e69746f72696e6720626c6f636b656400600082015250565b60006139da601f83613895565b91506139e5826139a4565b602082019050919050565b60006020820190508181036000830152613a09816139cd565b9050919050565b6000613a1c8385613895565b9350613a298385846132d6565b613a3283613219565b840190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a77578082015181840152602081019050613a5c565b83811115613a86576000848401525b50505050565b6000613a9782613a3d565b613aa18185613a48565b9350613ab1818560208601613a59565b613aba81613219565b840191505092915050565b60006080820190508181036000830152613ae0818789613a10565b9050613aef6020830186613540565b613afc6040830185613540565b8181036060830152613b0e8184613a8c565b90509695505050505050565b60006060820190508181036000830152613b35818688613a10565b9050613b446020830185613540565b613b516040830184613611565b95945050505050565b7f4d6f6e69746f723a2073656e646572206973206e6f7420736470000000000000600082015250565b6000613b90601a83613895565b9150613b9b82613b5a565b602082019050919050565b60006020820190508181036000830152613bbf81613b83565b9050919050565b613bcf81612f48565b82525050565b613bde81612d4b565b82525050565b600060e0820190508181036000830152613bff818a8c613a10565b9050613c0e6020830189613540565b613c1b6040830188613540565b613c28606083018761382b565b8181036080830152613c3a8186613a8c565b9050613c4960a0830185613bc6565b613c5660c0830184613bd5565b9998505050505050505050565b600081519050613c72816131e8565b92915050565b600060208284031215613c8e57613c8d612d41565b5b6000613c9c84828501613c63565b91505092915050565b600060a0820190508181036000830152613cc081888a613a10565b9050613ccf6020830187613540565b613cdc6040830186613540565b613ce9606083018561382b565b8181036080830152613cfb8184613a8c565b9050979650505050505050565b600081519050919050565b6000613d1e82613d08565b613d288185613895565b9350613d38818560208601613a59565b613d4181613219565b840191505092915050565b613d5581613355565b82525050565b600060e082019050613d70600083018a613099565b8181036020830152613d828189613d13565b9050613d916040830188613540565b613d9e6060830187613611565b613dab6080830186613d4c565b81810360a0830152613dbd8185613a8c565b905081810360c0830152613dd18184613d13565b905098975050505050505050565b60006060820190508181036000830152613dfa818688613a10565b9050613e096020830185613540565b8181036040830152613e1b8184613a8c565b905095945050505050565b60006060820190508181036000830152613e41818688613a10565b9050613e506020830185613611565b613e5d604083018461382b565b95945050505050565b7f4d6f6e69746f723a20696e76616c69642076657269666965722061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ec2602183613895565b9150613ecd82613e66565b604082019050919050565b60006020820190508181036000830152613ef181613eb5565b9050919050565b600060c082019050613f0d6000830189613099565b8181036020830152613f1f8188613d13565b9050613f2e6040830187613540565b613f3b6060830186613611565b613f486080830185613d4c565b81810360a0830152613f5a8184613a8c565b9050979650505050505050565b7f4d6f6e69746f723a20696e76616c696420736470206164647265737300000000600082015250565b6000613f9d601c83613895565b9150613fa882613f67565b602082019050919050565b60006020820190508181036000830152613fcc81613f90565b9050919050565b7f4d6f6e69746f723a207665726966696572206e6f742073657400000000000000600082015250565b6000614009601983613895565b915061401482613fd3565b602082019050919050565b6000602082019050818103600083015261403881613ffc565b9050919050565b600061404b8385613a48565b93506140588385846132d6565b61406183613219565b840190509392505050565b60006080820190508181036000830152614087818a8c613a10565b9050818103602083015261409c81888a613a10565b905081810360408301526140b181868861403f565b905081810360608301526140c681848661403f565b90509998505050505050505050565b6000815190506140e481612f1c565b92915050565b600060208284031215614100576140ff612d41565b5b600061410e848285016140d5565b91505092915050565b7f4d6f6e69746f723a20696e76616c6964206d6f6e69746f72206f72646572207360008201527f69676e6174757265000000000000000000000000000000000000000000000000602082015250565b6000614173602883613895565b915061417e82614117565b604082019050919050565b600060208201905081810360008301526141a281614166565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141e382612d4b565b91506141ee83612d4b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614223576142226141a9565b5b828201905092915050565b600061423982612d4b565b915061424483612d4b565b925082821015614257576142566141a9565b5b828203905092915050565b7f4d6f6e69746f723a206d616c666f726d6564206d6f6e69746f72206d6573736160008201527f6765000000000000000000000000000000000000000000000000000000000000602082015250565b60006142be602283613895565b91506142c982614262565b604082019050919050565b600060208201905081810360008301526142ed816142b1565b9050919050565b7f4d6f6e69746f723a20696e76616c6964206d6f6e69746f722074797065000000600082015250565b600061432a601d83613895565b9150614335826142f4565b602082019050919050565b600060208201905081810360008301526143598161431d565b9050919050565b7f4d6f6e69746f723a20747261696c696e67206d6f6e69746f72206d657373616760008201527f6520646174610000000000000000000000000000000000000000000000000000602082015250565b60006143bc602683613895565b91506143c782614360565b604082019050919050565b600060208201905081810360008301526143eb816143af565b9050919050565b6000606082019050818103600083015261440c8186613d13565b905061441b6020830185613540565b818103604083015261442d8184613a8c565b9050949350505050565b600060608201905081810360008301526144518186613d13565b90506144606020830185613611565b61446d604083018461382b565b949350505050565b7f4d6f6e69746f723a20756e737570706f7274656420626c61636b6c697374206160008201527f6374696f6e000000000000000000000000000000000000000000000000000000602082015250565b60006144d1602583613895565b91506144dc82614475565b604082019050919050565b60006020820190508181036000830152614500816144c4565b9050919050565b7f4d6f6e69746f723a20756e737570706f7274656420636f6e74726f6c2061637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b6000614563602383613895565b915061456e82614507565b604082019050919050565b6000602082019050818103600083015261459281614556565b9050919050565b7f4d6f6e69746f723a20756e737570706f72746564206f72646572207479706500600082015250565b60006145cf601f83613895565b91506145da82614599565b602082019050919050565b600060208201905081810360008301526145fe816145c2565b9050919050565b600060c08201905061461a6000830189613611565b6146276020830188613099565b6146346040830187613099565b614641606083018661382b565b61464e608083018561382b565b61465b60a0830184613611565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146a082612d4b565b91506146ab83612d4b565b9250826146bb576146ba614666565b5b828204905092915050565b60006146d182612d4b565b91506146dc83612d4b565b9250826146ec576146eb614666565b5b828206905092915050565b600061470282612d4b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614734576147336141a9565b5b600182019050919050565b600061474a82612d4b565b915061475583612d4b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561478e5761478d6141a9565b5b828202905092915050565b7f4d6f6e69746f723a2075696e743332206f7574206f6620626f756e6473000000600082015250565b60006147cf601d83613895565b91506147da82614799565b602082019050919050565b600060208201905081810360008301526147fe816147c2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4d6f6e69746f723a206d616c666f726d6564207661726961626c65206279746560008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614890602183613895565b915061489b82614834565b604082019050919050565b600060208201905081810360008301526148bf81614883565b9050919050565b7f4d6f6e69746f723a207661726961626c65206279746573206f7574206f66206260008201527f6f756e6473000000000000000000000000000000000000000000000000000000602082015250565b6000614922602583613895565b915061492d826148c6565b604082019050919050565b6000602082019050818103600083015261495181614915565b9050919050565b7f4d6f6e69746f723a206d697373696e67206f7264657220747970650000000000600082015250565b600061498e601b83613895565b915061499982614958565b602082019050919050565b600060208201905081810360008301526149bd81614981565b9050919050565b7f4d6f6e69746f723a206d697373696e672073656e646572000000000000000000600082015250565b60006149fa601783613895565b9150614a05826149c4565b602082019050919050565b60006020820190508181036000830152614a29816149ed565b9050919050565b7f4d6f6e69746f723a206d697373696e6720726563656976657200000000000000600082015250565b6000614a66601983613895565b9150614a7182614a30565b602082019050919050565b60006020820190508181036000830152614a9581614a59565b9050919050565b7f4d6f6e69746f723a206d616c666f726d6564207661726961626c65206669656c60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614af8602183613895565b9150614b0382614a9c565b604082019050919050565b60006020820190508181036000830152614b2781614aeb565b9050919050565b7f4d6f6e69746f723a207472756e6361746564207661726961626c65206669656c60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b8a602183613895565b9150614b9582614b2e565b604082019050919050565b60006020820190508181036000830152614bb981614b7d565b9050919050565b7f4d6f6e69746f723a2062797465733332206f7574206f6620626f756e64730000600082015250565b6000614bf6601e83613895565b9150614c0182614bc0565b602082019050919050565b60006020820190508181036000830152614c2581614be9565b905091905056fea3646970667358221220a30e06981edd8f6841063d15bd2b945e20f3aab8d3deceaa7940d31d4cf57cff64736f6c637827302e382e31342d63692e323032322e362e32302b636f6d6d69742e66633963623232362e6d6f646b636f6d70696c655f6d6f6461310066 \ No newline at end of file diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/MonitorVerifier.bin-runtime b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/MonitorVerifier.bin-runtime new file mode 100644 index 00000000..cc524171 --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/MonitorVerifier.bin-runtime @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50600436106100885760003560e01c8063715018a61161005b578063715018a6146101135780637c02741c1461011d5780638da5cb5b14610139578063b85653091461015757610088565b806316a772221461008d5780631a383f18146100ab5780631f56086f146100c757806342660bb4146100e3575b600080fd5b610095610175565b6040516100a29190612292565b60405180910390f35b6100c560048036038101906100c0919061231c565b61017f565b005b6100e160048036038101906100dc9190612395565b61040b565b005b6100fd60048036038101906100f89190612418565b6104aa565b60405161010a919061251c565b60405180910390f35b61011b61075e565b005b61013760048036038101906101329190612395565b6107ba565b005b610141610857565b60405161014e9190612292565b60405180910390f35b61015f610860565b60405161016c9190612292565b60405180910390f35b6000600254905090565b60025433146101c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ba906125ba565b60405180910390fd5b600061021283838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610866565b905060008160000151511161025c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102539061264c565b60405180910390fd5b60005b8160400151518110156103cb576000826040015182815181106102855761028461266c565b5b6020026020010151905061029c8160000151610a12565b156103b757806001600085600001516040516020016102bb9190612715565b60405160208183030381529060405280519060200120815260200190815260200160002060008201518160000190805190602001906102fb929190612038565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002016000820151816000019080519060200190610341929190612038565b50602082015181600101908051906020019061035e9291906120be565b5050509050507f230737f2e1fbf1b92f0400e43a64348087d049d8b6907223832bf0246b9c8f49836000015182600001518360400151602001516040516103a7939291906127cb565b60405180910390a1505050610407565b5080806103c390612846565b91505061025f565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fe90612900565b60405180910390fd5b5050565b610413610b24565b61041b610857565b1461045b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104529061296c565b60405180910390fd5b6000810361049e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610495906129fe565b60405180910390fd5b6104a781610b2c565b50565b600080600160008b8b6040516020016104c4929190612a52565b604051602081830303815290604052805190602001208152602001908152602001600020905060008160000180546104fb90612a9a565b90501161053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053490612900565b60405180910390fd5b61074f88888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506106c0836002016040518060400160405290816000820180546105a790612a9a565b80601f01602080910402602001604051908101604052809291908181526020018280546105d390612a9a565b80156106205780601f106105f557610100808354040283529160200191610620565b820191906000526020600020905b81548152906001019060200180831161060357829003601f168201915b5050505050815260200160018201805461063990612a9a565b80601f016020809104026020016040519081016040528092919081815260200182805461066590612a9a565b80156106b25780601f10610687576101008083540402835291602001916106b2565b820191906000526020600020905b81548152906001019060200180831161069557829003601f168201915b505050505081525050610b6b565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610c46565b91505098975050505050505050565b610766610b24565b61076e610857565b146107ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a59061296c565b60405180910390fd5b6107b86000610b2c565b565b6107c2610b24565b6107ca610857565b1461080a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108019061296c565b60405180910390fd5b6000810361084d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084490612b3d565b60405180910390fd5b8060028190555050565b60008054905090565b60025481565b61086e612144565b610876612144565b600061088184610e26565b905060005b816020015151811015610a07576000826020015182815181106108ac576108ab61266c565b5b60200260200101519050600061ffff16816000015161ffff16036108e0576108d381610fd8565b84600001819052506109f3565b600161ffff16816000015161ffff16036109125761090561090082610fe6565b610ff4565b84602001819052506109f2565b600261ffff16816000015161ffff16036109f157600061093182611091565b9050600061093e826110ba565b67ffffffffffffffff81111561095757610956612b5d565b5b60405190808252806020026020018201604052801561099057816020015b61097d61216b565b8152602001906001900390816109755790505b50905060005b61099f83611106565b156109e4576109b56109b08461111b565b6111ad565b8282806109c190612846565b9350815181106109d4576109d361266c565b5b6020026020010181905250610996565b8187604001819052505050505b5b5b5080806109ff90612846565b915050610886565b508192505050919050565b6000806040518060400160405280600781526020017f6d6f6e69746f720000000000000000000000000000000000000000000000000081525090506000839050815181511015610a6757600092505050610b1f565b60005b8251811015610b1757828181518110610a8657610a8561266c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916828281518110610ac657610ac561266c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610b045760009350505050610b1f565b8080610b0f90612846565b915050610a6a565b506001925050505b919050565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b606060408260200151511015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad90612bd8565b60405180910390fd5b600082602001519050600060408251610bcf9190612bf8565b90506000604067ffffffffffffffff811115610bee57610bed612b5d565b5b6040519080825280601f01601f191660200182016040528015610c205781602001600182028036833780820191505090505b509050816020840101516020820152816040840101516040820152809350505050919050565b6000610c906040518060400160405280601681526020017f4b656363616b32353657697468536563703235366b3100000000000000000000815250866112bb90919063ffffffff16565b610ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc690612c9e565b60405180910390fd5b604182511015610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b90612d0a565b60405180910390fd5b601b82604081518110610d2a57610d2961266c565b5b602001015160f81c60f81b60f81c610d429190612d37565b60f81b82604081518110610d5957610d5861266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000610da4610d96866112d6565b858051906020012085611332565b9050601b83604081518110610dbc57610dbb61266c565b5b602001015160f81c60f81b60f81c610dd49190612d6e565b60f81b83604081518110610deb57610dea61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080915050949350505050565b610e2e612194565b600682511015610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a90612dee565b60405180910390fd5b6000610e7d612194565b610e8f610e8a8584611395565b6113c4565b816000019061ffff16908161ffff1681525050600682610eaf9190612e0e565b91506000808390505b8551811015610f1157610edf610eda87600284610ed59190612e0e565b6114ef565b611520565b6006610eeb9190612e74565b63ffffffff1681610efc9190612e0e565b90508180610f0990612846565b925050610eb8565b60008267ffffffffffffffff811115610f2d57610f2c612b5d565b5b604051908082528060200260200182016040528015610f6657816020015b610f536121b2565b815260200190600190039081610f4b5790505b509050600092505b8651851015610fc257610f7f6121b2565b610f898887611701565b809750819250505080828580610f9e90612846565b965081518110610fb157610fb061266c565b5b602002602001018190525050610f6e565b8084602001819052508395505050505050919050565b606081604001519050919050565b606081604001519050919050565b610ffc6121dd565b6110046121dd565b600061100f84610e26565b905060005b8160200151518110156110865760008260200151828151811061103a5761103961266c565b5b60200260200101519050600061ffff16816000015161ffff16036110725761106961106482610fe6565b611849565b84600001819052505b50808061107e90612846565b915050611014565b508192505050919050565b6110996121f6565b60405180604001604052806000815260200183604001518152509050919050565b6000808260000151905060005b6110d084611106565b156110f2576110de8461111b565b5080806110ea90612846565b9150506110c7565b818460000181815250508092505050919050565b60008160200151518260000151109050919050565b6060816020015151826000015110611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612f20565b60405180910390fd5b600061117c83600001518460200151611918565b90508051600484600001516111919190612e0e565b61119b9190612e0e565b83600001818152505080915050919050565b6111b561216b565b6111bd61216b565b60006111c884610e26565b905060005b8160200151518110156112b0576000826020015182815181106111f3576111f261266c565b5b60200260200101519050600061ffff16816000015161ffff16036112275761121a81610fd8565b846000018190525061129c565b600161ffff16816000015161ffff160361126c576000611246826119bf565b60ff1611611255576000611258565b60015b84602001901515908115158152505061129b565b600261ffff16816000015161ffff160361129a5761129161128c82610fe6565b6119d7565b84604001819052505b5b5b5080806112a890612846565b9150506111cd565b508192505050919050565b60008180519060200120838051906020012014905092915050565b60006002826040516112e89190612f7c565b602060405180830381855afa158015611305573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906113289190612fc9565b60001c9050919050565b60008060006113418585611a97565b915091506000600481111561135957611358612ff6565b5b81600481111561136c5761136b612ff6565b5b14801561137857508582145b8061138a5750611389868686611ae8565b5b925050509392505050565b600082516002836113a69190612e0e565b11156113b157600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff8111156113ea576113e9612b5d565b5b6040519080825280601f01601f19166020018201604052801561141c5781602001600182028036833780820191505090505b509050816001600281106114335761143261266c565b5b1a60f81b8160008151811061144b5761144a61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006002811061148e5761148d61266c565b5b1a60f81b816001815181106114a6576114a561266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006114e2826000611395565b9050809350505050919050565b600082516004836115009190612e0e565b111561150b57600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff81111561154657611545612b5d565b5b6040519080825280601f01601f1916602001820160405280156115785781602001600182028036833780820191505090505b5090508160036004811061158f5761158e61266c565b5b1a60f81b816000815181106115a7576115a661266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816002600481106115ea576115e961266c565b5b1a60f81b816001815181106116025761160161266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816001600481106116455761164461266c565b5b1a60f81b8160028151811061165d5761165c61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600481106116a05761169f61266c565b5b1a60f81b816003815181106116b8576116b761266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006116f48260006114ef565b9050809350505050919050565b6117096121b2565b60008284511161174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590613097565b60405180910390fd5b6006831015611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990613103565b60405180910390fd5b61179a6121b2565b6117ac6117a78686611395565b6113c4565b816000019061ffff16908161ffff16815250506002846117cc9190612e0e565b93506117e06117db86866114ef565b611520565b816020019063ffffffff16908163ffffffff16815250506004846118049190612e0e565b935061181b8585836020015163ffffffff16611c16565b8160400181905250806020015163ffffffff16846118399190612e0e565b9350808492509250509250929050565b611851612210565b611859612210565b600061186484610e26565b905060005b81602001515181101561190d5760008260200151828151811061188f5761188e61266c565b5b60200260200101519050600061ffff16816000015161ffff16036118c3576118b681610fd8565b84600001819052506118f9565b600161ffff16816000015161ffff16036118f8576118e081611cab565b846020019063ffffffff16908163ffffffff16815250505b5b50808061190590612846565b915050611869565b508192505050919050565b60606004836119279190612e0e565b9250600061193d6119388585611ccb565b611cd9565b63ffffffff1690506060811560008114611962576040519150602082016040526119b3565b6040519150601f8316801560200281840101848101888315602002848a0101015b818310156119a05780518352602083019250602081019050611983565b50858552601f19601f8301166040525050505b50809250505092915050565b60006119d060018360400151611eba565b9050919050565b6119df612230565b6119e7612230565b60006119f284610e26565b905060005b816020015151811015611a8c57600082602001518281518110611a1d57611a1c61266c565b5b60200260200101519050600061ffff16816000015161ffff1603611a5157611a4481610fd8565b8460000181905250611a78565b600161ffff16816000015161ffff1603611a7757611a6e81610fe6565b84602001819052505b5b508080611a8490612846565b9150506119f7565b508192505050919050565b6000806041835103611ad85760008060006020860151925060408601519150606086015160001a9050611acc87828585611ec8565b94509450505050611ae1565b60006002915091505b9250929050565b600080600085631626ba7e60e01b8686604051602401611b09929190613132565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611b739190612f7c565b600060405180830381855afa9150503d8060008114611bae576040519150601f19603f3d011682016040523d82523d6000602084013e611bb3565b606091505b5091509150818015611bc757506020815110155b8015611c0b5750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681806020019051810190611c099190612fc9565b145b925050509392505050565b606083518284611c269190612e0e565b1115611c3157600080fd5b60008267ffffffffffffffff811115611c4d57611c4c612b5d565b5b6040519080825280601f01601f191660200182016040528015611c7f5781602001600182028036833780820191505090505b5090506000806020830191508560208801019050611c9e828287611f7e565b8293505050509392505050565b6000611cc4611cbf60048460400151611ccb565b611520565b9050919050565b600082820151905092915050565b6000808260e01b90506000600467ffffffffffffffff811115611cff57611cfe612b5d565b5b6040519080825280601f01601f191660200182016040528015611d315781602001600182028036833780820191505090505b50905081600360048110611d4857611d4761266c565b5b1a60f81b81600081518110611d6057611d5f61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260048110611da357611da261266c565b5b1a60f81b81600181518110611dbb57611dba61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160048110611dfe57611dfd61266c565b5b1a60f81b81600281518110611e1657611e1561266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060048110611e5957611e5861266c565b5b1a60f81b81600381518110611e7157611e7061266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611ead826000612007565b9050809350505050919050565b600082820151905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611f03576000600391509150611f75565b600060018787878760405160008152602001604052604051611f289493929190613171565b6020604051602081039080840390855afa158015611f4a573d6000803e3d6000fd5b50505060206040510351905060008103611f6c57600060019250925050611f75565b80600092509250505b94509492505050565b5b60208110611fbd5781518352602083611f989190612e0e565b9250602082611fa79190612e0e565b9150602081611fb69190612bf8565b9050611f7f565b60008103156120025760006001826020611fd79190612bf8565b610100611fe491906132e9565b611fee9190612bf8565b905080198351168185511681811786525050505b505050565b600082516004836120189190612e0e565b111561202357600080fd5b63ffffffff8260048501015116905092915050565b82805461204490612a9a565b90600052602060002090601f01602090048101928261206657600085556120ad565b82601f1061207f57805160ff19168380011785556120ad565b828001600101855582156120ad579182015b828111156120ac578251825591602001919060010190612091565b5b5090506120ba919061224a565b5090565b8280546120ca90612a9a565b90600052602060002090601f0160209004810192826120ec5760008555612133565b82601f1061210557805160ff1916838001178555612133565b82800160010185558215612133579182015b82811115612132578251825591602001919060010190612117565b5b509050612140919061224a565b5090565b60405180606001604052806060815260200161215e6121dd565b8152602001606081525090565b60405180606001604052806060815260200160001515815260200161218e612230565b81525090565b6040518060400160405280600061ffff168152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b60405180602001604052806121f0612210565b81525090565b604051806040016040528060008152602001606081525090565b604051806040016040528060608152602001600063ffffffff1681525090565b604051806040016040528060608152602001606081525090565b5b8082111561226357600081600090555060010161224b565b5090565b6000819050919050565b600061227c82612267565b9050919050565b61228c81612271565b82525050565b60006020820190506122a76000830184612283565b92915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126122dc576122db6122b7565b5b8235905067ffffffffffffffff8111156122f9576122f86122bc565b5b602083019150836001820283011115612315576123146122c1565b5b9250929050565b60008060208385031215612333576123326122ad565b5b600083013567ffffffffffffffff811115612351576123506122b2565b5b61235d858286016122c6565b92509250509250929050565b61237281612271565b811461237d57600080fd5b50565b60008135905061238f81612369565b92915050565b6000602082840312156123ab576123aa6122ad565b5b60006123b984828501612380565b91505092915050565b60008083601f8401126123d8576123d76122b7565b5b8235905067ffffffffffffffff8111156123f5576123f46122bc565b5b602083019150836001820283011115612411576124106122c1565b5b9250929050565b6000806000806000806000806080898b031215612438576124376122ad565b5b600089013567ffffffffffffffff811115612456576124556122b2565b5b6124628b828c016123c2565b9850985050602089013567ffffffffffffffff811115612485576124846122b2565b5b6124918b828c016123c2565b9650965050604089013567ffffffffffffffff8111156124b4576124b36122b2565b5b6124c08b828c016122c6565b9450945050606089013567ffffffffffffffff8111156124e3576124e26122b2565b5b6124ef8b828c016122c6565b92509250509295985092959890939650565b60008115159050919050565b61251681612501565b82525050565b6000602082019050612531600083018461250d565b92915050565b600082825260208201905092915050565b7f4d6f6e69746f7256657269666965723a2063616c6c6572206973206e6f74205060008201527f7463487562000000000000000000000000000000000000000000000000000000602082015250565b60006125a4602583612537565b91506125af82612548565b604082019050919050565b600060208201905081810360008301526125d381612597565b9050919050565b7f4d6f6e69746f7256657269666965723a20656d70747920636f6d6d697474656560008201527f2069640000000000000000000000000000000000000000000000000000000000602082015250565b6000612636602383612537565b9150612641826125da565b604082019050919050565b6000602082019050818103600083015261266581612629565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600081905092915050565b60005b838110156126cf5780820151818401526020810190506126b4565b838111156126de576000848401525b50505050565b60006126ef8261269b565b6126f981856126a6565b93506127098185602086016126b1565b80840191505092915050565b600061272182846126e4565b915081905092915050565b6000601f19601f8301169050919050565b60006127488261269b565b6127528185612537565b93506127628185602086016126b1565b61276b8161272c565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b600061279d82612776565b6127a78185612781565b93506127b78185602086016126b1565b6127c08161272c565b840191505092915050565b600060608201905081810360008301526127e5818661273d565b905081810360208301526127f9818561273d565b9050818103604083015261280d8184612792565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061285182612267565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361288357612882612817565b5b600182019050919050565b7f4d6f6e69746f7256657269666965723a206d6f6e69746f72206e6f6465206e6f60008201527f7420666f756e6400000000000000000000000000000000000000000000000000602082015250565b60006128ea602783612537565b91506128f58261288e565b604082019050919050565b60006020820190508181036000830152612919816128dd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612956602083612537565b915061296182612920565b602082019050919050565b6000602082019050818103600083015261298581612949565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b60006129e8602783612537565b91506129f38261298c565b604082019050919050565b60006020820190508181036000830152612a17816129db565b9050919050565b82818337600083830152505050565b6000612a3983856126a6565b9350612a46838584612a1e565b82840190509392505050565b6000612a5f828486612a2d565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ab257607f821691505b602082108103612ac557612ac4612a6b565b5b50919050565b7f4d6f6e69746f7256657269666965723a20696e76616c6964205074634875622060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b6000612b27602783612537565b9150612b3282612acb565b604082019050919050565b60006020820190508181036000830152612b5681612b1a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f7075626c6963206b6579206c656e677468206e6f7420656e6f75746800000000600082015250565b6000612bc2601c83612537565b9150612bcd82612b8c565b602082019050919050565b60006020820190508181036000830152612bf181612bb5565b9050919050565b6000612c0382612267565b9150612c0e83612267565b925082821015612c2157612c20612817565b5b828203905092915050565b7f6f6e6c7920737570706f7274204b454343414b3235365f574954485f5345435060008201527f3235364b31207369676e6174757265206e6f7700000000000000000000000000602082015250565b6000612c88603383612537565b9150612c9382612c2c565b604082019050919050565b60006020820190508181036000830152612cb781612c7b565b9050919050565b7f77726f6e6720736563703235366b3120736967206c656e677468000000000000600082015250565b6000612cf4601a83612537565b9150612cff82612cbe565b602082019050919050565b60006020820190508181036000830152612d2381612ce7565b9050919050565b600060ff82169050919050565b6000612d4282612d2a565b9150612d4d83612d2a565b92508260ff03821115612d6357612d62612817565b5b828201905092915050565b6000612d7982612d2a565b9150612d8483612d2a565b925082821015612d9757612d96612817565b5b828203905092915050565b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b6000612dd8601783612537565b9150612de382612da2565b602082019050919050565b60006020820190508181036000830152612e0781612dcb565b9050919050565b6000612e1982612267565b9150612e2483612267565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e5957612e58612817565b5b828201905092915050565b600063ffffffff82169050919050565b6000612e7f82612e64565b9150612e8a83612e64565b92508263ffffffff03821115612ea357612ea2612817565b5b828201905092915050565b7f4279746573417272617953747265616d3a206f6666657374206f7574206f662060008201527f6275666665720000000000000000000000000000000000000000000000000000602082015250565b6000612f0a602683612537565b9150612f1582612eae565b604082019050919050565b60006020820190508181036000830152612f3981612efd565b9050919050565b600081905092915050565b6000612f5682612776565b612f608185612f40565b9350612f708185602086016126b1565b80840191505092915050565b6000612f888284612f4b565b915081905092915050565b6000819050919050565b612fa681612f93565b8114612fb157600080fd5b50565b600081519050612fc381612f9d565b92915050565b600060208284031215612fdf57612fde6122ad565b5b6000612fed84828501612fb4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b6000613081602383612537565b915061308c82613025565b604082019050919050565b600060208201905081810360008301526130b081613074565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b60006130ed600e83612537565b91506130f8826130b7565b602082019050919050565b6000602082019050818103600083015261311c816130e0565b9050919050565b61312c81612f93565b82525050565b60006040820190506131476000830185613123565b81810360208301526131598184612792565b90509392505050565b61316b81612d2a565b82525050565b60006080820190506131866000830187613123565b6131936020830186613162565b6131a06040830185613123565b6131ad6060830184613123565b95945050505050565b60008160011c9050919050565b6000808291508390505b600185111561320d578086048111156131e9576131e8612817565b5b60018516156131f85780820291505b8081029050613206856131b6565b94506131cd565b94509492505050565b60008261322657600190506132e2565b8161323457600090506132e2565b816001811461324a576002811461325457613283565b60019150506132e2565b60ff84111561326657613265612817565b5b8360020a91508482111561327d5761327c612817565b5b506132e2565b5060208310610133831016604e8410600b84101617156132b85782820a9050838111156132b3576132b2612817565b5b6132e2565b6132c584848460016131c3565b925090508184048111156132dc576132db612817565b5b81810290505b9392505050565b60006132f482612267565b91506132ff83612267565b925061332c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613216565b90509291505056fea3646970667358221220c239e11ca8dad75c5cdd9d06bd232409562605d36650b11ae9a5e253a4e566e464736f6c637827302e382e31342d63692e323032322e362e32302b636f6d6d69742e66633963623232362e6d6f646b636f6d70696c655f6d6f6461310066 \ No newline at end of file diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/MonitorVerifier_sol_MonitorVerifier.bin b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/MonitorVerifier_sol_MonitorVerifier.bin index 7a8cb2f3..33a00803 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/MonitorVerifier_sol_MonitorVerifier.bin +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/MonitorVerifier_sol_MonitorVerifier.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b5062000032620000266200003860201b60201c565b6200004060201b60201c565b6200007f565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b613378806200008f6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063715018a61161005b578063715018a6146101135780637c02741c1461011d5780638da5cb5b14610139578063b85653091461015757610088565b806316a772221461008d5780631a383f18146100ab5780631f56086f146100c757806342660bb4146100e3575b600080fd5b610095610175565b6040516100a29190612292565b60405180910390f35b6100c560048036038101906100c0919061231c565b61017f565b005b6100e160048036038101906100dc9190612395565b61040b565b005b6100fd60048036038101906100f89190612418565b6104aa565b60405161010a919061251c565b60405180910390f35b61011b61075e565b005b61013760048036038101906101329190612395565b6107ba565b005b610141610857565b60405161014e9190612292565b60405180910390f35b61015f610860565b60405161016c9190612292565b60405180910390f35b6000600254905090565b60025433146101c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ba906125ba565b60405180910390fd5b600061021283838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610866565b905060008160000151511161025c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102539061264c565b60405180910390fd5b60005b8160400151518110156103cb576000826040015182815181106102855761028461266c565b5b6020026020010151905061029c8160000151610a12565b156103b757806001600085600001516040516020016102bb9190612715565b60405160208183030381529060405280519060200120815260200190815260200160002060008201518160000190805190602001906102fb929190612038565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002016000820151816000019080519060200190610341929190612038565b50602082015181600101908051906020019061035e9291906120be565b5050509050507f230737f2e1fbf1b92f0400e43a64348087d049d8b6907223832bf0246b9c8f49836000015182600001518360400151602001516040516103a7939291906127cb565b60405180910390a1505050610407565b5080806103c390612846565b91505061025f565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fe90612900565b60405180910390fd5b5050565b610413610b24565b61041b610857565b1461045b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104529061296c565b60405180910390fd5b6000810361049e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610495906129fe565b60405180910390fd5b6104a781610b2c565b50565b600080600160008b8b6040516020016104c4929190612a52565b604051602081830303815290604052805190602001208152602001908152602001600020905060008160000180546104fb90612a9a565b90501161053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053490612900565b60405180910390fd5b61074f88888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506106c0836002016040518060400160405290816000820180546105a790612a9a565b80601f01602080910402602001604051908101604052809291908181526020018280546105d390612a9a565b80156106205780601f106105f557610100808354040283529160200191610620565b820191906000526020600020905b81548152906001019060200180831161060357829003601f168201915b5050505050815260200160018201805461063990612a9a565b80601f016020809104026020016040519081016040528092919081815260200182805461066590612a9a565b80156106b25780601f10610687576101008083540402835291602001916106b2565b820191906000526020600020905b81548152906001019060200180831161069557829003601f168201915b505050505081525050610b6b565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610c46565b91505098975050505050505050565b610766610b24565b61076e610857565b146107ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a59061296c565b60405180910390fd5b6107b86000610b2c565b565b6107c2610b24565b6107ca610857565b1461080a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108019061296c565b60405180910390fd5b6000810361084d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084490612b3d565b60405180910390fd5b8060028190555050565b60008054905090565b60025481565b61086e612144565b610876612144565b600061088184610e26565b905060005b816020015151811015610a07576000826020015182815181106108ac576108ab61266c565b5b60200260200101519050600061ffff16816000015161ffff16036108e0576108d381610fd8565b84600001819052506109f3565b600161ffff16816000015161ffff16036109125761090561090082610fe6565b610ff4565b84602001819052506109f2565b600261ffff16816000015161ffff16036109f157600061093182611091565b9050600061093e826110ba565b67ffffffffffffffff81111561095757610956612b5d565b5b60405190808252806020026020018201604052801561099057816020015b61097d61216b565b8152602001906001900390816109755790505b50905060005b61099f83611106565b156109e4576109b56109b08461111b565b6111ad565b8282806109c190612846565b9350815181106109d4576109d361266c565b5b6020026020010181905250610996565b8187604001819052505050505b5b5b5080806109ff90612846565b915050610886565b508192505050919050565b6000806040518060400160405280600781526020017f6d6f6e69746f720000000000000000000000000000000000000000000000000081525090506000839050815181511015610a6757600092505050610b1f565b60005b8251811015610b1757828181518110610a8657610a8561266c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916828281518110610ac657610ac561266c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610b045760009350505050610b1f565b8080610b0f90612846565b915050610a6a565b506001925050505b919050565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b606060408260200151511015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad90612bd8565b60405180910390fd5b600082602001519050600060408251610bcf9190612bf8565b90506000604067ffffffffffffffff811115610bee57610bed612b5d565b5b6040519080825280601f01601f191660200182016040528015610c205781602001600182028036833780820191505090505b509050816020840101516020820152816040840101516040820152809350505050919050565b6000610c906040518060400160405280601681526020017f4b656363616b32353657697468536563703235366b3100000000000000000000815250866112bb90919063ffffffff16565b610ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc690612c9e565b60405180910390fd5b604182511015610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b90612d0a565b60405180910390fd5b601b82604081518110610d2a57610d2961266c565b5b602001015160f81c60f81b60f81c610d429190612d37565b60f81b82604081518110610d5957610d5861266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000610da4610d96866112d6565b858051906020012085611332565b9050601b83604081518110610dbc57610dbb61266c565b5b602001015160f81c60f81b60f81c610dd49190612d6e565b60f81b83604081518110610deb57610dea61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080915050949350505050565b610e2e612194565b600682511015610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a90612dee565b60405180910390fd5b6000610e7d612194565b610e8f610e8a8584611395565b6113c4565b816000019061ffff16908161ffff1681525050600682610eaf9190612e0e565b91506000808390505b8551811015610f1157610edf610eda87600284610ed59190612e0e565b6114ef565b611520565b6006610eeb9190612e74565b63ffffffff1681610efc9190612e0e565b90508180610f0990612846565b925050610eb8565b60008267ffffffffffffffff811115610f2d57610f2c612b5d565b5b604051908082528060200260200182016040528015610f6657816020015b610f536121b2565b815260200190600190039081610f4b5790505b509050600092505b8651851015610fc257610f7f6121b2565b610f898887611701565b809750819250505080828580610f9e90612846565b965081518110610fb157610fb061266c565b5b602002602001018190525050610f6e565b8084602001819052508395505050505050919050565b606081604001519050919050565b606081604001519050919050565b610ffc6121dd565b6110046121dd565b600061100f84610e26565b905060005b8160200151518110156110865760008260200151828151811061103a5761103961266c565b5b60200260200101519050600061ffff16816000015161ffff16036110725761106961106482610fe6565b611849565b84600001819052505b50808061107e90612846565b915050611014565b508192505050919050565b6110996121f6565b60405180604001604052806000815260200183604001518152509050919050565b6000808260000151905060005b6110d084611106565b156110f2576110de8461111b565b5080806110ea90612846565b9150506110c7565b818460000181815250508092505050919050565b60008160200151518260000151109050919050565b6060816020015151826000015110611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612f20565b60405180910390fd5b600061117c83600001518460200151611918565b90508051600484600001516111919190612e0e565b61119b9190612e0e565b83600001818152505080915050919050565b6111b561216b565b6111bd61216b565b60006111c884610e26565b905060005b8160200151518110156112b0576000826020015182815181106111f3576111f261266c565b5b60200260200101519050600061ffff16816000015161ffff16036112275761121a81610fd8565b846000018190525061129c565b600161ffff16816000015161ffff160361126c576000611246826119bf565b60ff1611611255576000611258565b60015b84602001901515908115158152505061129b565b600261ffff16816000015161ffff160361129a5761129161128c82610fe6565b6119d7565b84604001819052505b5b5b5080806112a890612846565b9150506111cd565b508192505050919050565b60008180519060200120838051906020012014905092915050565b60006002826040516112e89190612f7c565b602060405180830381855afa158015611305573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906113289190612fc9565b60001c9050919050565b60008060006113418585611a97565b915091506000600481111561135957611358612ff6565b5b81600481111561136c5761136b612ff6565b5b14801561137857508582145b8061138a5750611389868686611ae8565b5b925050509392505050565b600082516002836113a69190612e0e565b11156113b157600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff8111156113ea576113e9612b5d565b5b6040519080825280601f01601f19166020018201604052801561141c5781602001600182028036833780820191505090505b509050816001600281106114335761143261266c565b5b1a60f81b8160008151811061144b5761144a61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006002811061148e5761148d61266c565b5b1a60f81b816001815181106114a6576114a561266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006114e2826000611395565b9050809350505050919050565b600082516004836115009190612e0e565b111561150b57600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff81111561154657611545612b5d565b5b6040519080825280601f01601f1916602001820160405280156115785781602001600182028036833780820191505090505b5090508160036004811061158f5761158e61266c565b5b1a60f81b816000815181106115a7576115a661266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816002600481106115ea576115e961266c565b5b1a60f81b816001815181106116025761160161266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816001600481106116455761164461266c565b5b1a60f81b8160028151811061165d5761165c61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600481106116a05761169f61266c565b5b1a60f81b816003815181106116b8576116b761266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006116f48260006114ef565b9050809350505050919050565b6117096121b2565b60008284511161174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590613097565b60405180910390fd5b6006831015611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990613103565b60405180910390fd5b61179a6121b2565b6117ac6117a78686611395565b6113c4565b816000019061ffff16908161ffff16815250506002846117cc9190612e0e565b93506117e06117db86866114ef565b611520565b816020019063ffffffff16908163ffffffff16815250506004846118049190612e0e565b935061181b8585836020015163ffffffff16611c16565b8160400181905250806020015163ffffffff16846118399190612e0e565b9350808492509250509250929050565b611851612210565b611859612210565b600061186484610e26565b905060005b81602001515181101561190d5760008260200151828151811061188f5761188e61266c565b5b60200260200101519050600061ffff16816000015161ffff16036118c3576118b681610fd8565b84600001819052506118f9565b600161ffff16816000015161ffff16036118f8576118e081611cab565b846020019063ffffffff16908163ffffffff16815250505b5b50808061190590612846565b915050611869565b508192505050919050565b60606004836119279190612e0e565b9250600061193d6119388585611ccb565b611cd9565b63ffffffff1690506060811560008114611962576040519150602082016040526119b3565b6040519150601f8316801560200281840101848101888315602002848a0101015b818310156119a05780518352602083019250602081019050611983565b50858552601f19601f8301166040525050505b50809250505092915050565b60006119d060018360400151611eba565b9050919050565b6119df612230565b6119e7612230565b60006119f284610e26565b905060005b816020015151811015611a8c57600082602001518281518110611a1d57611a1c61266c565b5b60200260200101519050600061ffff16816000015161ffff1603611a5157611a4481610fd8565b8460000181905250611a78565b600161ffff16816000015161ffff1603611a7757611a6e81610fe6565b84602001819052505b5b508080611a8490612846565b9150506119f7565b508192505050919050565b6000806041835103611ad85760008060006020860151925060408601519150606086015160001a9050611acc87828585611ec8565b94509450505050611ae1565b60006002915091505b9250929050565b600080600085631626ba7e60e01b8686604051602401611b09929190613132565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611b739190612f7c565b600060405180830381855afa9150503d8060008114611bae576040519150601f19603f3d011682016040523d82523d6000602084013e611bb3565b606091505b5091509150818015611bc757506020815110155b8015611c0b5750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681806020019051810190611c099190612fc9565b145b925050509392505050565b606083518284611c269190612e0e565b1115611c3157600080fd5b60008267ffffffffffffffff811115611c4d57611c4c612b5d565b5b6040519080825280601f01601f191660200182016040528015611c7f5781602001600182028036833780820191505090505b5090506000806020830191508560208801019050611c9e828287611f7e565b8293505050509392505050565b6000611cc4611cbf60048460400151611ccb565b611520565b9050919050565b600082820151905092915050565b6000808260e01b90506000600467ffffffffffffffff811115611cff57611cfe612b5d565b5b6040519080825280601f01601f191660200182016040528015611d315781602001600182028036833780820191505090505b50905081600360048110611d4857611d4761266c565b5b1a60f81b81600081518110611d6057611d5f61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260048110611da357611da261266c565b5b1a60f81b81600181518110611dbb57611dba61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160048110611dfe57611dfd61266c565b5b1a60f81b81600281518110611e1657611e1561266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060048110611e5957611e5861266c565b5b1a60f81b81600381518110611e7157611e7061266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611ead826000612007565b9050809350505050919050565b600082820151905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611f03576000600391509150611f75565b600060018787878760405160008152602001604052604051611f289493929190613171565b6020604051602081039080840390855afa158015611f4a573d6000803e3d6000fd5b50505060206040510351905060008103611f6c57600060019250925050611f75565b80600092509250505b94509492505050565b5b60208110611fbd5781518352602083611f989190612e0e565b9250602082611fa79190612e0e565b9150602081611fb69190612bf8565b9050611f7f565b60008103156120025760006001826020611fd79190612bf8565b610100611fe491906132e9565b611fee9190612bf8565b905080198351168185511681811786525050505b505050565b600082516004836120189190612e0e565b111561202357600080fd5b63ffffffff8260048501015116905092915050565b82805461204490612a9a565b90600052602060002090601f01602090048101928261206657600085556120ad565b82601f1061207f57805160ff19168380011785556120ad565b828001600101855582156120ad579182015b828111156120ac578251825591602001919060010190612091565b5b5090506120ba919061224a565b5090565b8280546120ca90612a9a565b90600052602060002090601f0160209004810192826120ec5760008555612133565b82601f1061210557805160ff1916838001178555612133565b82800160010185558215612133579182015b82811115612132578251825591602001919060010190612117565b5b509050612140919061224a565b5090565b60405180606001604052806060815260200161215e6121dd565b8152602001606081525090565b60405180606001604052806060815260200160001515815260200161218e612230565b81525090565b6040518060400160405280600061ffff168152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b60405180602001604052806121f0612210565b81525090565b604051806040016040528060008152602001606081525090565b604051806040016040528060608152602001600063ffffffff1681525090565b604051806040016040528060608152602001606081525090565b5b8082111561226357600081600090555060010161224b565b5090565b6000819050919050565b600061227c82612267565b9050919050565b61228c81612271565b82525050565b60006020820190506122a76000830184612283565b92915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126122dc576122db6122b7565b5b8235905067ffffffffffffffff8111156122f9576122f86122bc565b5b602083019150836001820283011115612315576123146122c1565b5b9250929050565b60008060208385031215612333576123326122ad565b5b600083013567ffffffffffffffff811115612351576123506122b2565b5b61235d858286016122c6565b92509250509250929050565b61237281612271565b811461237d57600080fd5b50565b60008135905061238f81612369565b92915050565b6000602082840312156123ab576123aa6122ad565b5b60006123b984828501612380565b91505092915050565b60008083601f8401126123d8576123d76122b7565b5b8235905067ffffffffffffffff8111156123f5576123f46122bc565b5b602083019150836001820283011115612411576124106122c1565b5b9250929050565b6000806000806000806000806080898b031215612438576124376122ad565b5b600089013567ffffffffffffffff811115612456576124556122b2565b5b6124628b828c016123c2565b9850985050602089013567ffffffffffffffff811115612485576124846122b2565b5b6124918b828c016123c2565b9650965050604089013567ffffffffffffffff8111156124b4576124b36122b2565b5b6124c08b828c016122c6565b9450945050606089013567ffffffffffffffff8111156124e3576124e26122b2565b5b6124ef8b828c016122c6565b92509250509295985092959890939650565b60008115159050919050565b61251681612501565b82525050565b6000602082019050612531600083018461250d565b92915050565b600082825260208201905092915050565b7f4d6f6e69746f7256657269666965723a2063616c6c6572206973206e6f74205060008201527f7463487562000000000000000000000000000000000000000000000000000000602082015250565b60006125a4602583612537565b91506125af82612548565b604082019050919050565b600060208201905081810360008301526125d381612597565b9050919050565b7f4d6f6e69746f7256657269666965723a20656d70747920636f6d6d697474656560008201527f2069640000000000000000000000000000000000000000000000000000000000602082015250565b6000612636602383612537565b9150612641826125da565b604082019050919050565b6000602082019050818103600083015261266581612629565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600081905092915050565b60005b838110156126cf5780820151818401526020810190506126b4565b838111156126de576000848401525b50505050565b60006126ef8261269b565b6126f981856126a6565b93506127098185602086016126b1565b80840191505092915050565b600061272182846126e4565b915081905092915050565b6000601f19601f8301169050919050565b60006127488261269b565b6127528185612537565b93506127628185602086016126b1565b61276b8161272c565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b600061279d82612776565b6127a78185612781565b93506127b78185602086016126b1565b6127c08161272c565b840191505092915050565b600060608201905081810360008301526127e5818661273d565b905081810360208301526127f9818561273d565b9050818103604083015261280d8184612792565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061285182612267565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361288357612882612817565b5b600182019050919050565b7f4d6f6e69746f7256657269666965723a206d6f6e69746f72206e6f6465206e6f60008201527f7420666f756e6400000000000000000000000000000000000000000000000000602082015250565b60006128ea602783612537565b91506128f58261288e565b604082019050919050565b60006020820190508181036000830152612919816128dd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612956602083612537565b915061296182612920565b602082019050919050565b6000602082019050818103600083015261298581612949565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b60006129e8602783612537565b91506129f38261298c565b604082019050919050565b60006020820190508181036000830152612a17816129db565b9050919050565b82818337600083830152505050565b6000612a3983856126a6565b9350612a46838584612a1e565b82840190509392505050565b6000612a5f828486612a2d565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ab257607f821691505b602082108103612ac557612ac4612a6b565b5b50919050565b7f4d6f6e69746f7256657269666965723a20696e76616c6964205074634875622060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b6000612b27602783612537565b9150612b3282612acb565b604082019050919050565b60006020820190508181036000830152612b5681612b1a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f7075626c6963206b6579206c656e677468206e6f7420656e6f75746800000000600082015250565b6000612bc2601c83612537565b9150612bcd82612b8c565b602082019050919050565b60006020820190508181036000830152612bf181612bb5565b9050919050565b6000612c0382612267565b9150612c0e83612267565b925082821015612c2157612c20612817565b5b828203905092915050565b7f6f6e6c7920737570706f7274204b454343414b3235365f574954485f5345435060008201527f3235364b31207369676e6174757265206e6f7700000000000000000000000000602082015250565b6000612c88603383612537565b9150612c9382612c2c565b604082019050919050565b60006020820190508181036000830152612cb781612c7b565b9050919050565b7f77726f6e6720736563703235366b3120736967206c656e677468000000000000600082015250565b6000612cf4601a83612537565b9150612cff82612cbe565b602082019050919050565b60006020820190508181036000830152612d2381612ce7565b9050919050565b600060ff82169050919050565b6000612d4282612d2a565b9150612d4d83612d2a565b92508260ff03821115612d6357612d62612817565b5b828201905092915050565b6000612d7982612d2a565b9150612d8483612d2a565b925082821015612d9757612d96612817565b5b828203905092915050565b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b6000612dd8601783612537565b9150612de382612da2565b602082019050919050565b60006020820190508181036000830152612e0781612dcb565b9050919050565b6000612e1982612267565b9150612e2483612267565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e5957612e58612817565b5b828201905092915050565b600063ffffffff82169050919050565b6000612e7f82612e64565b9150612e8a83612e64565b92508263ffffffff03821115612ea357612ea2612817565b5b828201905092915050565b7f4279746573417272617953747265616d3a206f6666657374206f7574206f662060008201527f6275666665720000000000000000000000000000000000000000000000000000602082015250565b6000612f0a602683612537565b9150612f1582612eae565b604082019050919050565b60006020820190508181036000830152612f3981612efd565b9050919050565b600081905092915050565b6000612f5682612776565b612f608185612f40565b9350612f708185602086016126b1565b80840191505092915050565b6000612f888284612f4b565b915081905092915050565b6000819050919050565b612fa681612f93565b8114612fb157600080fd5b50565b600081519050612fc381612f9d565b92915050565b600060208284031215612fdf57612fde6122ad565b5b6000612fed84828501612fb4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b6000613081602383612537565b915061308c82613025565b604082019050919050565b600060208201905081810360008301526130b081613074565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b60006130ed600e83612537565b91506130f8826130b7565b602082019050919050565b6000602082019050818103600083015261311c816130e0565b9050919050565b61312c81612f93565b82525050565b60006040820190506131476000830185613123565b81810360208301526131598184612792565b90509392505050565b61316b81612d2a565b82525050565b60006080820190506131866000830187613123565b6131936020830186613162565b6131a06040830185613123565b6131ad6060830184613123565b95945050505050565b60008160011c9050919050565b6000808291508390505b600185111561320d578086048111156131e9576131e8612817565b5b60018516156131f85780820291505b8081029050613206856131b6565b94506131cd565b94509492505050565b60008261322657600190506132e2565b8161323457600090506132e2565b816001811461324a576002811461325457613283565b60019150506132e2565b60ff84111561326657613265612817565b5b8360020a91508482111561327d5761327c612817565b5b506132e2565b5060208310610133831016604e8410600b84101617156132b85782820a9050838111156132b3576132b2612817565b5b6132e2565b6132c584848460016131c3565b925090508184048111156132dc576132db612817565b5b81810290505b9392505050565b60006132f482612267565b91506132ff83612267565b925061332c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613216565b90509291505056fea36469706673582212205a6e378bafc1097c95635a5f0b4da17ecd991568eae0f1076d724709a82d4b7564736f6c634300080e6b636f6d70696c655f6d6f6461300041 \ No newline at end of file +60806040523480156200001157600080fd5b5062000032620000266200003860201b60201c565b6200004060201b60201c565b6200007f565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b61339d806200008f6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063715018a61161005b578063715018a6146101135780637c02741c1461011d5780638da5cb5b14610139578063b85653091461015757610088565b806316a772221461008d5780631a383f18146100ab5780631f56086f146100c757806342660bb4146100e3575b600080fd5b610095610175565b6040516100a29190612292565b60405180910390f35b6100c560048036038101906100c0919061231c565b61017f565b005b6100e160048036038101906100dc9190612395565b61040b565b005b6100fd60048036038101906100f89190612418565b6104aa565b60405161010a919061251c565b60405180910390f35b61011b61075e565b005b61013760048036038101906101329190612395565b6107ba565b005b610141610857565b60405161014e9190612292565b60405180910390f35b61015f610860565b60405161016c9190612292565b60405180910390f35b6000600254905090565b60025433146101c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ba906125ba565b60405180910390fd5b600061021283838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610866565b905060008160000151511161025c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102539061264c565b60405180910390fd5b60005b8160400151518110156103cb576000826040015182815181106102855761028461266c565b5b6020026020010151905061029c8160000151610a12565b156103b757806001600085600001516040516020016102bb9190612715565b60405160208183030381529060405280519060200120815260200190815260200160002060008201518160000190805190602001906102fb929190612038565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002016000820151816000019080519060200190610341929190612038565b50602082015181600101908051906020019061035e9291906120be565b5050509050507f230737f2e1fbf1b92f0400e43a64348087d049d8b6907223832bf0246b9c8f49836000015182600001518360400151602001516040516103a7939291906127cb565b60405180910390a1505050610407565b5080806103c390612846565b91505061025f565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fe90612900565b60405180910390fd5b5050565b610413610b24565b61041b610857565b1461045b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104529061296c565b60405180910390fd5b6000810361049e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610495906129fe565b60405180910390fd5b6104a781610b2c565b50565b600080600160008b8b6040516020016104c4929190612a52565b604051602081830303815290604052805190602001208152602001908152602001600020905060008160000180546104fb90612a9a565b90501161053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053490612900565b60405180910390fd5b61074f88888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506106c0836002016040518060400160405290816000820180546105a790612a9a565b80601f01602080910402602001604051908101604052809291908181526020018280546105d390612a9a565b80156106205780601f106105f557610100808354040283529160200191610620565b820191906000526020600020905b81548152906001019060200180831161060357829003601f168201915b5050505050815260200160018201805461063990612a9a565b80601f016020809104026020016040519081016040528092919081815260200182805461066590612a9a565b80156106b25780601f10610687576101008083540402835291602001916106b2565b820191906000526020600020905b81548152906001019060200180831161069557829003601f168201915b505050505081525050610b6b565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610c46565b91505098975050505050505050565b610766610b24565b61076e610857565b146107ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a59061296c565b60405180910390fd5b6107b86000610b2c565b565b6107c2610b24565b6107ca610857565b1461080a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108019061296c565b60405180910390fd5b6000810361084d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084490612b3d565b60405180910390fd5b8060028190555050565b60008054905090565b60025481565b61086e612144565b610876612144565b600061088184610e26565b905060005b816020015151811015610a07576000826020015182815181106108ac576108ab61266c565b5b60200260200101519050600061ffff16816000015161ffff16036108e0576108d381610fd8565b84600001819052506109f3565b600161ffff16816000015161ffff16036109125761090561090082610fe6565b610ff4565b84602001819052506109f2565b600261ffff16816000015161ffff16036109f157600061093182611091565b9050600061093e826110ba565b67ffffffffffffffff81111561095757610956612b5d565b5b60405190808252806020026020018201604052801561099057816020015b61097d61216b565b8152602001906001900390816109755790505b50905060005b61099f83611106565b156109e4576109b56109b08461111b565b6111ad565b8282806109c190612846565b9350815181106109d4576109d361266c565b5b6020026020010181905250610996565b8187604001819052505050505b5b5b5080806109ff90612846565b915050610886565b508192505050919050565b6000806040518060400160405280600781526020017f6d6f6e69746f720000000000000000000000000000000000000000000000000081525090506000839050815181511015610a6757600092505050610b1f565b60005b8251811015610b1757828181518110610a8657610a8561266c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916828281518110610ac657610ac561266c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610b045760009350505050610b1f565b8080610b0f90612846565b915050610a6a565b506001925050505b919050565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b606060408260200151511015610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad90612bd8565b60405180910390fd5b600082602001519050600060408251610bcf9190612bf8565b90506000604067ffffffffffffffff811115610bee57610bed612b5d565b5b6040519080825280601f01601f191660200182016040528015610c205781602001600182028036833780820191505090505b509050816020840101516020820152816040840101516040820152809350505050919050565b6000610c906040518060400160405280601681526020017f4b656363616b32353657697468536563703235366b3100000000000000000000815250866112bb90919063ffffffff16565b610ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc690612c9e565b60405180910390fd5b604182511015610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b90612d0a565b60405180910390fd5b601b82604081518110610d2a57610d2961266c565b5b602001015160f81c60f81b60f81c610d429190612d37565b60f81b82604081518110610d5957610d5861266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000610da4610d96866112d6565b858051906020012085611332565b9050601b83604081518110610dbc57610dbb61266c565b5b602001015160f81c60f81b60f81c610dd49190612d6e565b60f81b83604081518110610deb57610dea61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080915050949350505050565b610e2e612194565b600682511015610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a90612dee565b60405180910390fd5b6000610e7d612194565b610e8f610e8a8584611395565b6113c4565b816000019061ffff16908161ffff1681525050600682610eaf9190612e0e565b91506000808390505b8551811015610f1157610edf610eda87600284610ed59190612e0e565b6114ef565b611520565b6006610eeb9190612e74565b63ffffffff1681610efc9190612e0e565b90508180610f0990612846565b925050610eb8565b60008267ffffffffffffffff811115610f2d57610f2c612b5d565b5b604051908082528060200260200182016040528015610f6657816020015b610f536121b2565b815260200190600190039081610f4b5790505b509050600092505b8651851015610fc257610f7f6121b2565b610f898887611701565b809750819250505080828580610f9e90612846565b965081518110610fb157610fb061266c565b5b602002602001018190525050610f6e565b8084602001819052508395505050505050919050565b606081604001519050919050565b606081604001519050919050565b610ffc6121dd565b6110046121dd565b600061100f84610e26565b905060005b8160200151518110156110865760008260200151828151811061103a5761103961266c565b5b60200260200101519050600061ffff16816000015161ffff16036110725761106961106482610fe6565b611849565b84600001819052505b50808061107e90612846565b915050611014565b508192505050919050565b6110996121f6565b60405180604001604052806000815260200183604001518152509050919050565b6000808260000151905060005b6110d084611106565b156110f2576110de8461111b565b5080806110ea90612846565b9150506110c7565b818460000181815250508092505050919050565b60008160200151518260000151109050919050565b6060816020015151826000015110611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612f20565b60405180910390fd5b600061117c83600001518460200151611918565b90508051600484600001516111919190612e0e565b61119b9190612e0e565b83600001818152505080915050919050565b6111b561216b565b6111bd61216b565b60006111c884610e26565b905060005b8160200151518110156112b0576000826020015182815181106111f3576111f261266c565b5b60200260200101519050600061ffff16816000015161ffff16036112275761121a81610fd8565b846000018190525061129c565b600161ffff16816000015161ffff160361126c576000611246826119bf565b60ff1611611255576000611258565b60015b84602001901515908115158152505061129b565b600261ffff16816000015161ffff160361129a5761129161128c82610fe6565b6119d7565b84604001819052505b5b5b5080806112a890612846565b9150506111cd565b508192505050919050565b60008180519060200120838051906020012014905092915050565b60006002826040516112e89190612f7c565b602060405180830381855afa158015611305573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906113289190612fc9565b60001c9050919050565b60008060006113418585611a97565b915091506000600481111561135957611358612ff6565b5b81600481111561136c5761136b612ff6565b5b14801561137857508582145b8061138a5750611389868686611ae8565b5b925050509392505050565b600082516002836113a69190612e0e565b11156113b157600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff8111156113ea576113e9612b5d565b5b6040519080825280601f01601f19166020018201604052801561141c5781602001600182028036833780820191505090505b509050816001600281106114335761143261266c565b5b1a60f81b8160008151811061144b5761144a61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006002811061148e5761148d61266c565b5b1a60f81b816001815181106114a6576114a561266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006114e2826000611395565b9050809350505050919050565b600082516004836115009190612e0e565b111561150b57600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff81111561154657611545612b5d565b5b6040519080825280601f01601f1916602001820160405280156115785781602001600182028036833780820191505090505b5090508160036004811061158f5761158e61266c565b5b1a60f81b816000815181106115a7576115a661266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816002600481106115ea576115e961266c565b5b1a60f81b816001815181106116025761160161266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816001600481106116455761164461266c565b5b1a60f81b8160028151811061165d5761165c61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600481106116a05761169f61266c565b5b1a60f81b816003815181106116b8576116b761266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006116f48260006114ef565b9050809350505050919050565b6117096121b2565b60008284511161174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590613097565b60405180910390fd5b6006831015611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990613103565b60405180910390fd5b61179a6121b2565b6117ac6117a78686611395565b6113c4565b816000019061ffff16908161ffff16815250506002846117cc9190612e0e565b93506117e06117db86866114ef565b611520565b816020019063ffffffff16908163ffffffff16815250506004846118049190612e0e565b935061181b8585836020015163ffffffff16611c16565b8160400181905250806020015163ffffffff16846118399190612e0e565b9350808492509250509250929050565b611851612210565b611859612210565b600061186484610e26565b905060005b81602001515181101561190d5760008260200151828151811061188f5761188e61266c565b5b60200260200101519050600061ffff16816000015161ffff16036118c3576118b681610fd8565b84600001819052506118f9565b600161ffff16816000015161ffff16036118f8576118e081611cab565b846020019063ffffffff16908163ffffffff16815250505b5b50808061190590612846565b915050611869565b508192505050919050565b60606004836119279190612e0e565b9250600061193d6119388585611ccb565b611cd9565b63ffffffff1690506060811560008114611962576040519150602082016040526119b3565b6040519150601f8316801560200281840101848101888315602002848a0101015b818310156119a05780518352602083019250602081019050611983565b50858552601f19601f8301166040525050505b50809250505092915050565b60006119d060018360400151611eba565b9050919050565b6119df612230565b6119e7612230565b60006119f284610e26565b905060005b816020015151811015611a8c57600082602001518281518110611a1d57611a1c61266c565b5b60200260200101519050600061ffff16816000015161ffff1603611a5157611a4481610fd8565b8460000181905250611a78565b600161ffff16816000015161ffff1603611a7757611a6e81610fe6565b84602001819052505b5b508080611a8490612846565b9150506119f7565b508192505050919050565b6000806041835103611ad85760008060006020860151925060408601519150606086015160001a9050611acc87828585611ec8565b94509450505050611ae1565b60006002915091505b9250929050565b600080600085631626ba7e60e01b8686604051602401611b09929190613132565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611b739190612f7c565b600060405180830381855afa9150503d8060008114611bae576040519150601f19603f3d011682016040523d82523d6000602084013e611bb3565b606091505b5091509150818015611bc757506020815110155b8015611c0b5750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681806020019051810190611c099190612fc9565b145b925050509392505050565b606083518284611c269190612e0e565b1115611c3157600080fd5b60008267ffffffffffffffff811115611c4d57611c4c612b5d565b5b6040519080825280601f01601f191660200182016040528015611c7f5781602001600182028036833780820191505090505b5090506000806020830191508560208801019050611c9e828287611f7e565b8293505050509392505050565b6000611cc4611cbf60048460400151611ccb565b611520565b9050919050565b600082820151905092915050565b6000808260e01b90506000600467ffffffffffffffff811115611cff57611cfe612b5d565b5b6040519080825280601f01601f191660200182016040528015611d315781602001600182028036833780820191505090505b50905081600360048110611d4857611d4761266c565b5b1a60f81b81600081518110611d6057611d5f61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260048110611da357611da261266c565b5b1a60f81b81600181518110611dbb57611dba61266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160048110611dfe57611dfd61266c565b5b1a60f81b81600281518110611e1657611e1561266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060048110611e5957611e5861266c565b5b1a60f81b81600381518110611e7157611e7061266c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611ead826000612007565b9050809350505050919050565b600082820151905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611f03576000600391509150611f75565b600060018787878760405160008152602001604052604051611f289493929190613171565b6020604051602081039080840390855afa158015611f4a573d6000803e3d6000fd5b50505060206040510351905060008103611f6c57600060019250925050611f75565b80600092509250505b94509492505050565b5b60208110611fbd5781518352602083611f989190612e0e565b9250602082611fa79190612e0e565b9150602081611fb69190612bf8565b9050611f7f565b60008103156120025760006001826020611fd79190612bf8565b610100611fe491906132e9565b611fee9190612bf8565b905080198351168185511681811786525050505b505050565b600082516004836120189190612e0e565b111561202357600080fd5b63ffffffff8260048501015116905092915050565b82805461204490612a9a565b90600052602060002090601f01602090048101928261206657600085556120ad565b82601f1061207f57805160ff19168380011785556120ad565b828001600101855582156120ad579182015b828111156120ac578251825591602001919060010190612091565b5b5090506120ba919061224a565b5090565b8280546120ca90612a9a565b90600052602060002090601f0160209004810192826120ec5760008555612133565b82601f1061210557805160ff1916838001178555612133565b82800160010185558215612133579182015b82811115612132578251825591602001919060010190612117565b5b509050612140919061224a565b5090565b60405180606001604052806060815260200161215e6121dd565b8152602001606081525090565b60405180606001604052806060815260200160001515815260200161218e612230565b81525090565b6040518060400160405280600061ffff168152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b60405180602001604052806121f0612210565b81525090565b604051806040016040528060008152602001606081525090565b604051806040016040528060608152602001600063ffffffff1681525090565b604051806040016040528060608152602001606081525090565b5b8082111561226357600081600090555060010161224b565b5090565b6000819050919050565b600061227c82612267565b9050919050565b61228c81612271565b82525050565b60006020820190506122a76000830184612283565b92915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126122dc576122db6122b7565b5b8235905067ffffffffffffffff8111156122f9576122f86122bc565b5b602083019150836001820283011115612315576123146122c1565b5b9250929050565b60008060208385031215612333576123326122ad565b5b600083013567ffffffffffffffff811115612351576123506122b2565b5b61235d858286016122c6565b92509250509250929050565b61237281612271565b811461237d57600080fd5b50565b60008135905061238f81612369565b92915050565b6000602082840312156123ab576123aa6122ad565b5b60006123b984828501612380565b91505092915050565b60008083601f8401126123d8576123d76122b7565b5b8235905067ffffffffffffffff8111156123f5576123f46122bc565b5b602083019150836001820283011115612411576124106122c1565b5b9250929050565b6000806000806000806000806080898b031215612438576124376122ad565b5b600089013567ffffffffffffffff811115612456576124556122b2565b5b6124628b828c016123c2565b9850985050602089013567ffffffffffffffff811115612485576124846122b2565b5b6124918b828c016123c2565b9650965050604089013567ffffffffffffffff8111156124b4576124b36122b2565b5b6124c08b828c016122c6565b9450945050606089013567ffffffffffffffff8111156124e3576124e26122b2565b5b6124ef8b828c016122c6565b92509250509295985092959890939650565b60008115159050919050565b61251681612501565b82525050565b6000602082019050612531600083018461250d565b92915050565b600082825260208201905092915050565b7f4d6f6e69746f7256657269666965723a2063616c6c6572206973206e6f74205060008201527f7463487562000000000000000000000000000000000000000000000000000000602082015250565b60006125a4602583612537565b91506125af82612548565b604082019050919050565b600060208201905081810360008301526125d381612597565b9050919050565b7f4d6f6e69746f7256657269666965723a20656d70747920636f6d6d697474656560008201527f2069640000000000000000000000000000000000000000000000000000000000602082015250565b6000612636602383612537565b9150612641826125da565b604082019050919050565b6000602082019050818103600083015261266581612629565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600081905092915050565b60005b838110156126cf5780820151818401526020810190506126b4565b838111156126de576000848401525b50505050565b60006126ef8261269b565b6126f981856126a6565b93506127098185602086016126b1565b80840191505092915050565b600061272182846126e4565b915081905092915050565b6000601f19601f8301169050919050565b60006127488261269b565b6127528185612537565b93506127628185602086016126b1565b61276b8161272c565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b600061279d82612776565b6127a78185612781565b93506127b78185602086016126b1565b6127c08161272c565b840191505092915050565b600060608201905081810360008301526127e5818661273d565b905081810360208301526127f9818561273d565b9050818103604083015261280d8184612792565b9050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061285182612267565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361288357612882612817565b5b600182019050919050565b7f4d6f6e69746f7256657269666965723a206d6f6e69746f72206e6f6465206e6f60008201527f7420666f756e6400000000000000000000000000000000000000000000000000602082015250565b60006128ea602783612537565b91506128f58261288e565b604082019050919050565b60006020820190508181036000830152612919816128dd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612956602083612537565b915061296182612920565b602082019050919050565b6000602082019050818103600083015261298581612949565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b60006129e8602783612537565b91506129f38261298c565b604082019050919050565b60006020820190508181036000830152612a17816129db565b9050919050565b82818337600083830152505050565b6000612a3983856126a6565b9350612a46838584612a1e565b82840190509392505050565b6000612a5f828486612a2d565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ab257607f821691505b602082108103612ac557612ac4612a6b565b5b50919050565b7f4d6f6e69746f7256657269666965723a20696e76616c6964205074634875622060008201527f6164647265737300000000000000000000000000000000000000000000000000602082015250565b6000612b27602783612537565b9150612b3282612acb565b604082019050919050565b60006020820190508181036000830152612b5681612b1a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f7075626c6963206b6579206c656e677468206e6f7420656e6f75746800000000600082015250565b6000612bc2601c83612537565b9150612bcd82612b8c565b602082019050919050565b60006020820190508181036000830152612bf181612bb5565b9050919050565b6000612c0382612267565b9150612c0e83612267565b925082821015612c2157612c20612817565b5b828203905092915050565b7f6f6e6c7920737570706f7274204b454343414b3235365f574954485f5345435060008201527f3235364b31207369676e6174757265206e6f7700000000000000000000000000602082015250565b6000612c88603383612537565b9150612c9382612c2c565b604082019050919050565b60006020820190508181036000830152612cb781612c7b565b9050919050565b7f77726f6e6720736563703235366b3120736967206c656e677468000000000000600082015250565b6000612cf4601a83612537565b9150612cff82612cbe565b602082019050919050565b60006020820190508181036000830152612d2381612ce7565b9050919050565b600060ff82169050919050565b6000612d4282612d2a565b9150612d4d83612d2a565b92508260ff03821115612d6357612d62612817565b5b828201905092915050565b6000612d7982612d2a565b9150612d8483612d2a565b925082821015612d9757612d96612817565b5b828203905092915050565b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b6000612dd8601783612537565b9150612de382612da2565b602082019050919050565b60006020820190508181036000830152612e0781612dcb565b9050919050565b6000612e1982612267565b9150612e2483612267565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e5957612e58612817565b5b828201905092915050565b600063ffffffff82169050919050565b6000612e7f82612e64565b9150612e8a83612e64565b92508263ffffffff03821115612ea357612ea2612817565b5b828201905092915050565b7f4279746573417272617953747265616d3a206f6666657374206f7574206f662060008201527f6275666665720000000000000000000000000000000000000000000000000000602082015250565b6000612f0a602683612537565b9150612f1582612eae565b604082019050919050565b60006020820190508181036000830152612f3981612efd565b9050919050565b600081905092915050565b6000612f5682612776565b612f608185612f40565b9350612f708185602086016126b1565b80840191505092915050565b6000612f888284612f4b565b915081905092915050565b6000819050919050565b612fa681612f93565b8114612fb157600080fd5b50565b600081519050612fc381612f9d565b92915050565b600060208284031215612fdf57612fde6122ad565b5b6000612fed84828501612fb4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b6000613081602383612537565b915061308c82613025565b604082019050919050565b600060208201905081810360008301526130b081613074565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b60006130ed600e83612537565b91506130f8826130b7565b602082019050919050565b6000602082019050818103600083015261311c816130e0565b9050919050565b61312c81612f93565b82525050565b60006040820190506131476000830185613123565b81810360208301526131598184612792565b90509392505050565b61316b81612d2a565b82525050565b60006080820190506131866000830187613123565b6131936020830186613162565b6131a06040830185613123565b6131ad6060830184613123565b95945050505050565b60008160011c9050919050565b6000808291508390505b600185111561320d578086048111156131e9576131e8612817565b5b60018516156131f85780820291505b8081029050613206856131b6565b94506131cd565b94509492505050565b60008261322657600190506132e2565b8161323457600090506132e2565b816001811461324a576002811461325457613283565b60019150506132e2565b60ff84111561326657613265612817565b5b8360020a91508482111561327d5761327c612817565b5b506132e2565b5060208310610133831016604e8410600b84101617156132b85782820a9050838111156132b3576132b2612817565b5b6132e2565b6132c584848460016131c3565b925090508184048111156132dc576132db612817565b5b81810290505b9392505050565b60006132f482612267565b91506132ff83612267565b925061332c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613216565b90509291505056fea3646970667358221220c239e11ca8dad75c5cdd9d06bd232409562605d36650b11ae9a5e253a4e566e464736f6c637827302e382e31342d63692e323032322e362e32302b636f6d6d69742e66633963623232362e6d6f646b636f6d70696c655f6d6f6461300066 \ No newline at end of file diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/Monitor_sol_Monitor.bin b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/Monitor_sol_Monitor.bin index 011bc6a3..f49e737e 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/Monitor_sol_Monitor.bin +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/Monitor_sol_Monitor.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b5062000032620000266200005a60201b60201c565b6200006260201b60201c565b6002600360006101000a81548163ffffffff021916908363ffffffff160217905550620000a1565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b612b6780620000b16000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c8063980113c7116100de578063bc327e4011610097578063cd6be5b811610071578063cd6be5b8146103ec578063d16352af1461040a578063ed4724c314610428578063fed209e21461045857610173565b8063bc327e4014610392578063c2450b50146103b0578063c3cd569d146103ce57610173565b8063980113c7146102be578063980c8e75146102ee5780639f62a9f91461030c578063a2799df01461033c578063baad6f5e14610358578063bbc16e481461037657610173565b8063715018a611610130578063715018a614610222578063754b377c1461022c5780638ba690941461024a5780638da5cb5b1461026857806392c4f2441461028657806396d8b692146102a257610173565b80631f56086f1461017857806321bbc11d146101945780632644ef05146101b0578063387868ae146101cc5780634c63280e146101ea5780636a766c0714610206575b600080fd5b610192600480360381019061018d919061194c565b610476565b005b6101ae60048036038101906101a99190611a34565b610515565b005b6101ca60048036038101906101c59190611b05565b610678565b005b6101d46106ec565b6040516101e19190611b41565b60405180910390f35b61020460048036038101906101ff9190611a34565b6106f2565b005b610220600480360381019061021b919061194c565b610855565b005b61022a6108f2565b005b61023461094e565b6040516102419190611b6b565b60405180910390f35b610252610953565b60405161025f9190611b6b565b60405180910390f35b610270610958565b60405161027d9190611b41565b60405180910390f35b6102a0600480360381019061029b919061194c565b610961565b005b6102bc60048036038101906102b79190611b86565b6109fe565b005b6102d860048036038101906102d39190611ca5565b610b4f565b6040516102e59190611ced565b60405180910390f35b6102f6610b6f565b6040516103039190611b6b565b60405180910390f35b61032660048036038101906103219190611ca5565b610b89565b6040516103339190611ced565b60405180910390f35b61035660048036038101906103519190611d34565b610ba9565b005b610360610c28565b60405161036d9190611b6b565b60405180910390f35b610390600480360381019061038b9190611d34565b610c2d565b005b61039a610cac565b6040516103a79190611b6b565b60405180910390f35b6103b8610cb5565b6040516103c59190611b41565b60405180910390f35b6103d6610cbf565b6040516103e39190611b6b565b60405180910390f35b6103f4610cc4565b6040516104019190611b6b565b60405180910390f35b610412610cda565b60405161041f9190611b41565b60405180910390f35b610442600480360381019061043d919061194c565b610ce4565b60405161044f9190611ced565b60405180910390f35b610460610cf6565b60405161046d9190611b41565b60405180910390f35b61047e610cfc565b610486610958565b146104c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104bd90611dd1565b60405180910390fd5b60008103610509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050090611e63565b60405180910390fd5b61051281610d04565b50565b61051e83610d43565b61055d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055490611ecf565b60405180910390fd5b60006105bf600360009054906101000a900463ffffffff1684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610e14565b9050600154636bba080887878733866040518663ffffffff1660e01b81526004016105ee959493929190611fc4565b600060405180830381600087803b15801561060857600080fd5b505af115801561061c573d6000803e3d6000fd5b50505050337f659e3ab83f50d3afa2f903375db8e7f6b2d1edfc58028278faec635a67feb199878787600360009054906101000a900463ffffffff166040516106689493929190612019565b60405180910390a2505050505050565b610680610cfc565b610688610958565b146106c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bf90611dd1565b60405180910390fd5b80600360006101000a81548163ffffffff021916908363ffffffff16021790555050565b60015481565b6106fb83610d43565b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073190611ecf565b60405180910390fd5b600061079c600360009054906101000a900463ffffffff1684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610e14565b90506001546389223f8087878733866040518663ffffffff1660e01b81526004016107cb959493929190611fc4565b600060405180830381600087803b1580156107e557600080fd5b505af11580156107f9573d6000803e3d6000fd5b50505050337f659e3ab83f50d3afa2f903375db8e7f6b2d1edfc58028278faec635a67feb199878787600360009054906101000a900463ffffffff166040516108459493929190612019565b60405180910390a2505050505050565b61085d610cfc565b610865610958565b146108a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089c90611dd1565b60405180910390fd5b600081036108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df906120cb565b60405180910390fd5b8060028190555050565b6108fa610cfc565b610902610958565b14610942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093990611dd1565b60405180910390fd5b61094c6000610d04565b565b600381565b600281565b60008054905090565b610969610cfc565b610971610958565b146109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890611dd1565b60405180910390fd5b600081036109f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109eb90612137565b60405180910390fd5b8060018190555050565b600060025403610a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3a906121a3565b60405180910390fd5b6002546342660bb489898989898989896040518963ffffffff1660e01b8152600401610a769897969594939291906121f0565b6020604051808303816000875af1158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab9919061226e565b610af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aef9061230d565b60405180910390fd5b610b4582828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610f43565b5050505050505050565b60046020528060005260406000206000915054906101000a900460ff1681565b6000600360009054906101000a900463ffffffff16905090565b60056020528060005260406000206000915054906101000a900460ff1681565b610bb1610cfc565b610bb9610958565b14610bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf090611dd1565b60405180910390fd5b806004600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600181565b610c35610cfc565b610c3d610958565b14610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490611dd1565b60405180910390fd5b806005600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006003905090565b6000600254905090565b600381565b600360009054906101000a900463ffffffff1681565b6000600154905090565b6000610cef82610d43565b9050919050565b60025481565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b6000600163ffffffff16600360009054906101000a900463ffffffff1663ffffffff1603610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d90612379565b60405180910390fd5b600460003360001b815260200190815260200160002060009054906101000a900460ff1615610dd85760009050610e0f565b600560008360001b815260200190815260200160002060009054906101000a900460ff1615610e0a5760009050610e0f565b600190505b919050565b606060008067ffffffffffffffff811115610e3257610e31612399565b5b6040519080825280601f01601f191660200182016040528015610e645781602001600182028036833780820191505090505b5090506000610e7282611208565b90506000610e7f85611208565b9050600081836004610e9191906123f7565b610e9b91906123f7565b67ffffffffffffffff811115610eb457610eb3612399565b5b6040519080825280601f01601f191660200182016040528015610ee65781602001600182028036833780820191505090505b509050600081519050610efa818984611260565b610f046020611277565b81610f0f919061244d565b9050610f1c818684611289565b8381610f28919061244d565b9050610f35818884611289565b819550505050505092915050565b6000806000610f51846112f4565b925092509250600080600f601c8663ffffffff16901c169050600160ff16600160038360ff16901c1660ff160361104e576000600782169050600060ff168160ff161480610fa55750600160ff168160ff16145b610fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb906124f3565b60405180910390fd5b60008060ff168260ff16149050806004600088815260200190815260200160002060006101000a81548160ff021916908315150217905550806005600087815260200190815260200160002060006101000a81548160ff0219169083151502179055506001935050505b6000600f60188763ffffffff16901c169050600160ff16600160038360ff16901c1660ff160361112c576000600782169050600060ff168160ff16036110b5576001600360006101000a81548163ffffffff021916908363ffffffff160217905550611126565b600160ff168160ff16036110ea576002600360006101000a81548163ffffffff021916908363ffffffff160217905550611125565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c90612585565b60405180910390fd5b5b60019350505b8261116c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611163906125f1565b60405180910390fd5b7f2b85d1f7cd875ea76b4e6036c4b9adfa98f64b8695afacb50009649d23abe630868686600460008a815260200190815260200160002060009054906101000a900460ff16600560008a815260200190815260200160002060009054906101000a900460ff16600360009054906101000a900463ffffffff166040516111f796959493929190612620565b60405180910390a150505050505050565b60006020825161121891906126b0565b905060006020835161122a91906126e1565b1461123e57808061123a90612712565b9150505b808061124990612712565b915050602081611259919061275a565b9050919050565b828101600481038051848352808252505050505050565b60006112828261145f565b9050919050565b60006020835161129991906126b0565b90506000602084516112ab91906126e1565b11156112c05780806112bc90612712565b9150505b60006001820191505b818110156112ed5760208102840151858401526020850394506001810190506112c9565b5050505050565b60008060008084519050611308858261168e565b9050611314858261168e565b9050600481101561135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135190612800565b60405180910390fd5b6113708560048361136b919061244d565b61176a565b935060048161137f919061244d565b905061138b858261168e565b905060208110156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c89061286c565b60405180910390fd5b6020816113de919061244d565b90506113ea8582611899565b92506113f6858261168e565b9050602081101561143c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611433906128d8565b60405180910390fd5b602081611449919061244d565b90506114558582611899565b9150509193909250565b6000816008811461156c5760108114611575576018811461157e57602081146115875760288114611590576030811461159957603881146115a257604081146115ab57604881146115b457605081146115bd57605881146115c657606081146115cf57606881146115d857607081146115e157607881146115ea57608081146115f357608881146115fc5760908114611605576098811461160e5760a081146116175760a881146116205760b081146116295760b881146116325760c0811461163b5760c881146116445760d0811461164d5760d881146116565760e0811461165f5760e881146116685760f081146116715760f8811461167a5761010081146116835760209150611688565b60019150611688565b60029150611688565b60039150611688565b60049150611688565b60059150611688565b60069150611688565b60079150611688565b60089150611688565b60099150611688565b600a9150611688565b600b9150611688565b600c9150611688565b600d9150611688565b600e9150611688565b600f9150611688565b60109150611688565b60119150611688565b60129150611688565b60139150611688565b60149150611688565b60159150611688565b60169150611688565b60179150611688565b60189150611688565b60199150611688565b601a9150611688565b601b9150611688565b601c9150611688565b601d9150611688565b601e9150611688565b601f9150611688565b602091505b50919050565b600060048210156116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb9061296a565b60405180910390fd5b60006116ec846004856116e7919061244d565b61176a565b905060048163ffffffff1661170191906123f7565b831015611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a906129fc565b60405180910390fd5b60048163ffffffff1684611757919061244d565b611761919061244d565b91505092915050565b6000825160048361177b91906123f7565b11156117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b390612a68565b60405180910390fd5b826003836117ca91906123f7565b815181106117db576117da612a88565b5b602001015160f81c60f81b60f81c60ff166008846002856117fc91906123f7565b8151811061180d5761180c612a88565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b60108560018661183691906123f7565b8151811061184757611846612a88565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b601886868151811061187557611874612a88565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b171717905092915050565b600082516020836118aa91906123f7565b11156118eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e290612b03565b60405180910390fd5b81602084010151905092915050565b600080fd5b600080fd5b6000819050919050565b600061191982611904565b9050919050565b6119298161190e565b811461193457600080fd5b50565b60008135905061194681611920565b92915050565b600060208284031215611962576119616118fa565b5b600061197084828501611937565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261199e5761199d611979565b5b8235905067ffffffffffffffff8111156119bb576119ba61197e565b5b6020830191508360018202830111156119d7576119d6611983565b5b9250929050565b60008083601f8401126119f4576119f3611979565b5b8235905067ffffffffffffffff811115611a1157611a1061197e565b5b602083019150836001820283011115611a2d57611a2c611983565b5b9250929050565b600080600080600060608688031215611a5057611a4f6118fa565b5b600086013567ffffffffffffffff811115611a6e57611a6d6118ff565b5b611a7a88828901611988565b95509550506020611a8d88828901611937565b935050604086013567ffffffffffffffff811115611aae57611aad6118ff565b5b611aba888289016119de565b92509250509295509295909350565b600063ffffffff82169050919050565b611ae281611ac9565b8114611aed57600080fd5b50565b600081359050611aff81611ad9565b92915050565b600060208284031215611b1b57611b1a6118fa565b5b6000611b2984828501611af0565b91505092915050565b611b3b8161190e565b82525050565b6000602082019050611b566000830184611b32565b92915050565b611b6581611ac9565b82525050565b6000602082019050611b806000830184611b5c565b92915050565b6000806000806000806000806080898b031215611ba657611ba56118fa565b5b600089013567ffffffffffffffff811115611bc457611bc36118ff565b5b611bd08b828c01611988565b9850985050602089013567ffffffffffffffff811115611bf357611bf26118ff565b5b611bff8b828c01611988565b9650965050604089013567ffffffffffffffff811115611c2257611c216118ff565b5b611c2e8b828c016119de565b9450945050606089013567ffffffffffffffff811115611c5157611c506118ff565b5b611c5d8b828c016119de565b92509250509295985092959890939650565b6000819050919050565b611c8281611c6f565b8114611c8d57600080fd5b50565b600081359050611c9f81611c79565b92915050565b600060208284031215611cbb57611cba6118fa565b5b6000611cc984828501611c90565b91505092915050565b60008115159050919050565b611ce781611cd2565b82525050565b6000602082019050611d026000830184611cde565b92915050565b611d1181611cd2565b8114611d1c57600080fd5b50565b600081359050611d2e81611d08565b92915050565b60008060408385031215611d4b57611d4a6118fa565b5b6000611d5985828601611c90565b9250506020611d6a85828601611d1f565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611dbb602083611d74565b9150611dc682611d85565b602082019050919050565b60006020820190508181036000830152611dea81611dae565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b6000611e4d602783611d74565b9150611e5882611df1565b604082019050919050565b60006020820190508181036000830152611e7c81611e40565b9050919050565b7f4d6f6e69746f723a20707265206d6f6e69746f72696e6720626c6f636b656400600082015250565b6000611eb9601f83611d74565b9150611ec482611e83565b602082019050919050565b60006020820190508181036000830152611ee881611eac565b9050919050565b82818337600083830152505050565b6000601f19601f8301169050919050565b6000611f1b8385611d74565b9350611f28838584611eef565b611f3183611efe565b840190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611f76578082015181840152602081019050611f5b565b83811115611f85576000848401525b50505050565b6000611f9682611f3c565b611fa08185611f47565b9350611fb0818560208601611f58565b611fb981611efe565b840191505092915050565b60006080820190508181036000830152611fdf818789611f0f565b9050611fee6020830186611b32565b611ffb6040830185611b32565b818103606083015261200d8184611f8b565b90509695505050505050565b60006060820190508181036000830152612034818688611f0f565b90506120436020830185611b32565b6120506040830184611b5c565b95945050505050565b7f4d6f6e69746f723a20696e76616c69642076657269666965722061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006120b5602183611d74565b91506120c082612059565b604082019050919050565b600060208201905081810360008301526120e4816120a8565b9050919050565b7f4d6f6e69746f723a20696e76616c696420736470206164647265737300000000600082015250565b6000612121601c83611d74565b915061212c826120eb565b602082019050919050565b6000602082019050818103600083015261215081612114565b9050919050565b7f4d6f6e69746f723a207665726966696572206e6f742073657400000000000000600082015250565b600061218d601983611d74565b915061219882612157565b602082019050919050565b600060208201905081810360008301526121bc81612180565b9050919050565b60006121cf8385611f47565b93506121dc838584611eef565b6121e583611efe565b840190509392505050565b6000608082019050818103600083015261220b818a8c611f0f565b9050818103602083015261222081888a611f0f565b905081810360408301526122358186886121c3565b9050818103606083015261224a8184866121c3565b90509998505050505050505050565b60008151905061226881611d08565b92915050565b600060208284031215612284576122836118fa565b5b600061229284828501612259565b91505092915050565b7f4d6f6e69746f723a20696e76616c6964206d6f6e69746f72206f72646572207360008201527f69676e6174757265000000000000000000000000000000000000000000000000602082015250565b60006122f7602883611d74565b91506123028261229b565b604082019050919050565b60006020820190508181036000830152612326816122ea565b9050919050565b7f4d6f6e69746f723a206d6f6e69746f7220636c6f736564000000000000000000600082015250565b6000612363601783611d74565b915061236e8261232d565b602082019050919050565b6000602082019050818103600083015261239281612356565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061240282611904565b915061240d83611904565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612442576124416123c8565b5b828201905092915050565b600061245882611904565b915061246383611904565b925082821015612476576124756123c8565b5b828203905092915050565b7f4d6f6e69746f723a20756e737570706f7274656420626c61636b6c697374206160008201527f6374696f6e000000000000000000000000000000000000000000000000000000602082015250565b60006124dd602583611d74565b91506124e882612481565b604082019050919050565b6000602082019050818103600083015261250c816124d0565b9050919050565b7f4d6f6e69746f723a20756e737570706f7274656420636f6e74726f6c2061637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b600061256f602383611d74565b915061257a82612513565b604082019050919050565b6000602082019050818103600083015261259e81612562565b9050919050565b7f4d6f6e69746f723a20756e737570706f72746564206f72646572207479706500600082015250565b60006125db601f83611d74565b91506125e6826125a5565b602082019050919050565b6000602082019050818103600083015261260a816125ce565b9050919050565b61261a81611c6f565b82525050565b600060c0820190506126356000830189611b5c565b6126426020830188612611565b61264f6040830187612611565b61265c6060830186611cde565b6126696080830185611cde565b61267660a0830184611b5c565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006126bb82611904565b91506126c683611904565b9250826126d6576126d5612681565b5b828204905092915050565b60006126ec82611904565b91506126f783611904565b92508261270757612706612681565b5b828206905092915050565b600061271d82611904565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361274f5761274e6123c8565b5b600182019050919050565b600061276582611904565b915061277083611904565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156127a9576127a86123c8565b5b828202905092915050565b7f4d6f6e69746f723a206d697373696e67206f7264657220747970650000000000600082015250565b60006127ea601b83611d74565b91506127f5826127b4565b602082019050919050565b60006020820190508181036000830152612819816127dd565b9050919050565b7f4d6f6e69746f723a206d697373696e672073656e646572000000000000000000600082015250565b6000612856601783611d74565b915061286182612820565b602082019050919050565b6000602082019050818103600083015261288581612849565b9050919050565b7f4d6f6e69746f723a206d697373696e6720726563656976657200000000000000600082015250565b60006128c2601983611d74565b91506128cd8261288c565b602082019050919050565b600060208201905081810360008301526128f1816128b5565b9050919050565b7f4d6f6e69746f723a206d616c666f726d6564207661726961626c65206669656c60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000612954602183611d74565b915061295f826128f8565b604082019050919050565b6000602082019050818103600083015261298381612947565b9050919050565b7f4d6f6e69746f723a207472756e6361746564207661726961626c65206669656c60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006129e6602183611d74565b91506129f18261298a565b604082019050919050565b60006020820190508181036000830152612a15816129d9565b9050919050565b7f4d6f6e69746f723a2075696e743332206f7574206f6620626f756e6473000000600082015250565b6000612a52601d83611d74565b9150612a5d82612a1c565b602082019050919050565b60006020820190508181036000830152612a8181612a45565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4d6f6e69746f723a2062797465733332206f7574206f6620626f756e64730000600082015250565b6000612aed601e83611d74565b9150612af882612ab7565b602082019050919050565b60006020820190508181036000830152612b1c81612ae0565b905091905056fea36469706673582212208a3b9ff90f25683938611a641b50016ad366d076dc2198eefdf987922b8210c764736f6c634300080e6b636f6d70696c655f6d6f6461300041 \ No newline at end of file +60806040523480156200001157600080fd5b5062000032620000266200005a60201b60201c565b6200006260201b60201c565b6002600360006101000a81548163ffffffff021916908363ffffffff160217905550620000a1565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b614c9580620000b16000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806396d8b69211610130578063bc327e40116100b8578063cd6be5b81161007c578063cd6be5b814610610578063d16352af1461062e578063e8913e8f1461064c578063ed4724c31461067c578063fed209e2146106ac57610227565b8063bc327e401461057e578063c2450b501461059c578063c3cd569d146105ba578063ca4f1d12146105d8578063cd616e1e146105f457610227565b8063a2799df0116100ff578063a2799df0146104f0578063b1fa0c6d1461050c578063b92e9fe814610528578063baad6f5e14610544578063bbc16e481461056257610227565b806396d8b69214610456578063980113c714610472578063980c8e75146104a25780639f62a9f9146104c057610227565b806365a6371f116101b3578063760f791811610182578063760f7918146103b25780637e117431146103ce5780638ba69094146103fe5780638da5cb5b1461041c57806392c4f2441461043a57610227565b806365a6371f146103525780636a766c071461036e578063715018a61461038a578063754b377c1461039457610227565b806326ddd415116101fa57806326ddd415146102b05780632b9ff60b146102e0578063387868ae146102fc57806340b6b1dd1461031a5780634c63280e1461033657610227565b80631f56086f1461022c57806321bbc11d1461024857806323ae474b146102645780632644ef0514610294575b600080fd5b61024660048036038101906102419190612d93565b6106ca565b005b610262600480360381019061025d9190612e7b565b610769565b005b61027e60048036038101906102799190612fad565b6108f4565b60405161028b91906130a8565b60405180910390f35b6102ae60048036038101906102a991906130ff565b6109d0565b005b6102ca60048036038101906102c5919061312c565b610a44565b6040516102d791906130a8565b60405180910390f35b6102fa60048036038101906102f59190613436565b610b1a565b005b610304610bd8565b604051610311919061354f565b60405180910390f35b610334600480360381019061032f919061356a565b610bde565b005b610350600480360381019061034b9190612e7b565b610d1b565b005b61036c6004803603810190610367919061356a565b610ea6565b005b61038860048036038101906103839190612d93565b610f88565b005b610392611025565b005b61039c611081565b6040516103a99190613620565b60405180910390f35b6103cc60048036038101906103c7919061363b565b611086565b005b6103e860048036038101906103e39190612fad565b611141565b6040516103f591906130a8565b60405180910390f35b61040661121d565b6040516104139190613620565b60405180910390f35b610424611222565b604051610431919061354f565b60405180910390f35b610454600480360381019061044f9190612d93565b61122b565b005b610470600480360381019061046b9190613715565b6112c8565b005b61048c600480360381019061048791906137fe565b611419565b604051610499919061383a565b60405180910390f35b6104aa611439565b6040516104b79190613620565b60405180910390f35b6104da60048036038101906104d591906137fe565b611453565b6040516104e7919061383a565b60405180910390f35b61050a60048036038101906105059190613855565b611473565b005b6105266004803603810190610521919061356a565b6114f2565b005b610542600480360381019061053d919061356a565b61162f565b005b61054c611711565b6040516105599190613620565b60405180910390f35b61057c60048036038101906105779190613855565b611716565b005b610586611795565b6040516105939190613620565b60405180910390f35b6105a461179e565b6040516105b1919061354f565b60405180910390f35b6105c26117a8565b6040516105cf9190613620565b60405180910390f35b6105f260048036038101906105ed919061356a565b6117ad565b005b61060e6004803603810190610609919061356a565b61188f565b005b610618611971565b6040516106259190613620565b60405180910390f35b610636611987565b604051610643919061354f565b60405180910390f35b6106666004803603810190610661919061312c565b611991565b60405161067391906130a8565b60405180910390f35b61069660048036038101906106919190612d93565b611a67565b6040516106a3919061383a565b60405180910390f35b6106b4611aa4565b6040516106c1919061354f565b60405180910390f35b6106d2611aaa565b6106da611222565b1461071a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610711906138f2565b60405180910390fd5b6000810361075d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075490613984565b60405180910390fd5b61076681611ab2565b50565b600263ffffffff16600360009054906101000a900463ffffffff1663ffffffff16036107d9576107993384611af1565b6107d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cf906139f0565b60405180910390fd5b5b600061083b600360009054906101000a900463ffffffff1684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611b62565b9050600154636bba080887878733866040518663ffffffff1660e01b815260040161086a959493929190613ac5565b600060405180830381600087803b15801561088457600080fd5b505af1158015610898573d6000803e3d6000fd5b50505050337f659e3ab83f50d3afa2f903375db8e7f6b2d1edfc58028278faec635a67feb199878787600360009054906101000a900463ffffffff166040516108e49493929190613b1a565b60405180910390a2505050505050565b6000600154331461093a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190613ba6565b60405180910390fd5b6000610948888a8888611c91565b905060015463d582d1a88c8c8c8c8c878b8b6040518963ffffffff1660e01b815260040161097d989796959493929190613be4565b6020604051808303816000875af115801561099c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c09190613c78565b9150509998505050505050505050565b6109d8611aaa565b6109e0611222565b14610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a17906138f2565b60405180910390fd5b80600360006101000a81548163ffffffff021916908363ffffffff16021790555050565b60006001543314610a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8190613ba6565b60405180910390fd5b6000610a9886888686611c91565b905060015463c730cf528a8a8a8a8a876040518763ffffffff1660e01b8152600401610ac996959493929190613ca5565b6020604051808303816000875af1158015610ae8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0c9190613c78565b915050979650505050505050565b6001543314610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5590613ba6565b60405180910390fd5b6000610b6983611d6d565b915050886383c6d5a2898989898987896040518863ffffffff1660e01b8152600401610b9b9796959493929190613d5b565b600060405180830381600087803b158015610bb557600080fd5b505af1158015610bc9573d6000803e3d6000fd5b50505050505050505050505050565b60015481565b6001543314610c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1990613ba6565b60405180910390fd5b600080610c7284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d6d565b9150915084639e417731898989856040518563ffffffff1660e01b8152600401610c9f9493929190613ddf565b600060405180830381600087803b158015610cb957600080fd5b505af1158015610ccd573d6000803e3d6000fd5b5050505084867fb5d068f7a6b866ef7b54643b3a644cc24a769c2be51c192b5311c89c2ca9f8a98a8a866000604051610d099493929190613e26565b60405180910390a35050505050505050565b600263ffffffff16600360009054906101000a900463ffffffff1663ffffffff1603610d8b57610d4b3384611af1565b610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d81906139f0565b60405180910390fd5b5b6000610ded600360009054906101000a900463ffffffff1684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611b62565b90506001546389223f8087878733866040518663ffffffff1660e01b8152600401610e1c959493929190613ac5565b600060405180830381600087803b158015610e3657600080fd5b505af1158015610e4a573d6000803e3d6000fd5b50505050337f659e3ab83f50d3afa2f903375db8e7f6b2d1edfc58028278faec635a67feb199878787600360009054906101000a900463ffffffff16604051610e969493929190613b1a565b60405180910390a2505050505050565b6001543314610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee190613ba6565b60405180910390fd5b610f8086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506001611ecb565b505050505050565b610f90611aaa565b610f98611222565b14610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf906138f2565b60405180910390fd5b6000810361101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290613ed8565b60405180910390fd5b8060028190555050565b61102d611aaa565b611035611222565b14611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c906138f2565b60405180910390fd5b61107f6000611ab2565b565b600681565b60015433146110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190613ba6565b60405180910390fd5b60006110d582611d6d565b9150508763153903588888888888876040518763ffffffff1660e01b815260040161110596959493929190613ef8565b600060405180830381600087803b15801561111f57600080fd5b505af1158015611133573d6000803e3d6000fd5b505050505050505050505050565b60006001543314611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117e90613ba6565b60405180910390fd5b6000611195888a8888611c91565b90506001546326ca2c898c8c8c8c8c878b8b6040518963ffffffff1660e01b81526004016111ca989796959493929190613be4565b6020604051808303816000875af11580156111e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120d9190613c78565b9150509998505050505050505050565b600281565b60008054905090565b611233611aaa565b61123b611222565b1461127b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611272906138f2565b60405180910390fd5b600081036112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b590613fb3565b60405180910390fd5b8060018190555050565b60006002540361130d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113049061401f565b60405180910390fd5b6002546342660bb489898989898989896040518963ffffffff1660e01b815260040161134098979695949392919061406c565b6020604051808303816000875af115801561135f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138391906140ea565b6113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614189565b60405180910390fd5b61140f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611fdf565b5050505050505050565b60046020528060005260406000206000915054906101000a900460ff1681565b6000600360009054906101000a900463ffffffff16905090565b60056020528060005260406000206000915054906101000a900460ff1681565b61147b611aaa565b611483611222565b146114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba906138f2565b60405180910390fd5b806004600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6001543314611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d90613ba6565b60405180910390fd5b60008061158684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d6d565b9150915084632e00b395898989856040518563ffffffff1660e01b81526004016115b39493929190613ddf565b600060405180830381600087803b1580156115cd57600080fd5b505af11580156115e1573d6000803e3d6000fd5b5050505084867fb5d068f7a6b866ef7b54643b3a644cc24a769c2be51c192b5311c89c2ca9f8a98a8a86600160405161161d9493929190613e26565b60405180910390a35050505050505050565b6001543314611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a90613ba6565b60405180910390fd5b61170986868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506000611ecb565b505050505050565b600181565b61171e611aaa565b611726611222565b14611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d906138f2565b60405180910390fd5b806005600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006006905090565b6000600254905090565b600381565b60015433146117f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e890613ba6565b60405180910390fd5b61188786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506000611ecb565b505050505050565b60015433146118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca90613ba6565b60405180910390fd5b61196986868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506001611ecb565b505050505050565b600360009054906101000a900463ffffffff1681565b6000600154905090565b600060015433146119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce90613ba6565b60405180910390fd5b60006119e586888686611c91565b905060015463d5dd79138a8a8a8a8a876040518763ffffffff1660e01b8152600401611a1696959493929190613ca5565b6020604051808303816000875af1158015611a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a599190613c78565b915050979650505050505050565b6000600263ffffffff16600360009054906101000a900463ffffffff1663ffffffff16141580611a9d5750611a9c3383611af1565b5b9050919050565b60025481565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b6000600460008460001b815260200190815260200160002060009054906101000a900460ff1615611b255760009050611b5c565b600560008360001b815260200190815260200160002060009054906101000a900460ff1615611b575760009050611b5c565b600190505b92915050565b606060008067ffffffffffffffff811115611b8057611b7f61322a565b5b6040519080825280601f01601f191660200182016040528015611bb25781602001600182028036833780820191505090505b5090506000611bc0826122a4565b90506000611bcd856122a4565b9050600081836004611bdf91906141d8565b611be991906141d8565b67ffffffffffffffff811115611c0257611c0161322a565b5b6040519080825280601f01601f191660200182016040528015611c345781602001600182028036833780820191505090505b509050600081519050611c488189846122fc565b611c526020612313565b81611c5d919061422e565b9050611c6a818684612325565b8381611c76919061422e565b9050611c83818884612325565b819550505050505092915050565b6060600263ffffffff16600360009054906101000a900463ffffffff1663ffffffff1603611d0357611cc38585611af1565b611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf9906139f0565b60405180910390fd5b5b611d63600360009054906101000a900463ffffffff1684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611b62565b9050949350505050565b600060606000835190506044811015611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db2906142d4565b60405180910390fd5b611dc58482612390565b9250600163ffffffff168363ffffffff161480611dee5750600263ffffffff168363ffffffff16145b80611e055750600363ffffffff168363ffffffff16145b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b90614340565b60405180910390fd5b611e4e6020612313565b81611e59919061422e565b90506060611e6785836124cc565b8093508192505050611e7985836124cc565b809350819450505060008214611ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebb906143d2565b60405180910390fd5b5050915091565b600080611ed784611d6d565b915091508215611f3f5784632e00b3958888846040518463ffffffff1660e01b8152600401611f08939291906143f2565b600060405180830381600087803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b50505050611f99565b84639e4177318888846040518463ffffffff1660e01b8152600401611f66939291906143f2565b600060405180830381600087803b158015611f8057600080fd5b505af1158015611f94573d6000803e3d6000fd5b505050505b84867fb5d068f7a6b866ef7b54643b3a644cc24a769c2be51c192b5311c89c2ca9f8a9898587604051611fce93929190614437565b60405180910390a350505050505050565b6000806000611fed84612731565b925092509250600080600f601c8663ffffffff16901c169050600160ff16600160038360ff16901c1660ff16036120ea576000600782169050600060ff168160ff1614806120415750600160ff168160ff16145b612080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612077906144e7565b60405180910390fd5b60008060ff168260ff16149050806004600088815260200190815260200160002060006101000a81548160ff021916908315150217905550806005600087815260200190815260200160002060006101000a81548160ff0219169083151502179055506001935050505b6000600f60188763ffffffff16901c169050600160ff16600160038360ff16901c1660ff16036121c8576000600782169050600060ff168160ff1603612151576001600360006101000a81548163ffffffff021916908363ffffffff1602179055506121c2565b600160ff168160ff1603612186576002600360006101000a81548163ffffffff021916908363ffffffff1602179055506121c1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b890614579565b60405180910390fd5b5b60019350505b82612208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ff906145e5565b60405180910390fd5b7f2b85d1f7cd875ea76b4e6036c4b9adfa98f64b8695afacb50009649d23abe630868686600460008a815260200190815260200160002060009054906101000a900460ff16600560008a815260200190815260200160002060009054906101000a900460ff16600360009054906101000a900463ffffffff1660405161229396959493929190614605565b60405180910390a150505050505050565b6000602082516122b49190614695565b90506000602083516122c691906146c6565b146122da5780806122d6906146f7565b9150505b80806122e5906146f7565b9150506020816122f5919061473f565b9050919050565b828101600481038051848352808252505050505050565b600061231e8261289c565b9050919050565b6000602083516123359190614695565b905060006020845161234791906146c6565b111561235c578080612358906146f7565b9150505b60006001820191505b81811015612389576020810284015185840152602085039450600181019050612365565b5050505050565b6000600482101580156123a4575082518211155b6123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da906147e5565b60405180910390fd5b826001836123f1919061422e565b8151811061240257612401614805565b5b602001015160f81c60f81b60f81c60ff16600884600285612423919061422e565b8151811061243457612433614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b60108560038661245d919061422e565b8151811061246e5761246d614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b601886600487612497919061422e565b815181106124a8576124a7614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b171717905092915050565b606060006020831015612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b906148a6565b60405180910390fd5b60006125208585612390565b63ffffffff16905060006020601f8361253991906141d8565b6125439190614695565b90506000602082612554919061473f565b905080602061256391906141d8565b8610156125a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259c90614938565b60405180910390fd5b806020876125b3919061422e565b6125bd919061422e565b93508267ffffffffffffffff8111156125d9576125d861322a565b5b6040519080825280601f01601f19166020018201604052801561260b5781602001600182028036833780820191505090505b50945060005b8281101561272657600060208260018661262b919061422e565b612635919061422e565b61263f919061473f565b8661264a91906141d8565b9050600060208361265b919061473f565b90506000818761266b919061422e565b9050602081111561267b57602090505b60005b8181101561270f578b818561269391906141d8565b815181106126a4576126a3614805565b5b602001015160f81c60f81b8a82856126bc91906141d8565b815181106126cd576126cc614805565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612707906146f7565b91505061267e565b50505050808061271e906146f7565b915050612611565b505050509250929050565b600080600080845190506127458582612acb565b90506127518582612acb565b90506004811015612797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278e906149a4565b60405180910390fd5b6127ad856004836127a8919061422e565b612ba7565b93506004816127bc919061422e565b90506127c88582612acb565b9050602081101561280e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280590614a10565b60405180910390fd5b60208161281b919061422e565b90506128278582612cd6565b92506128338582612acb565b90506020811015612879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287090614a7c565b60405180910390fd5b602081612886919061422e565b90506128928582612cd6565b9150509193909250565b600081600881146129a957601081146129b257601881146129bb57602081146129c457602881146129cd57603081146129d657603881146129df57604081146129e857604881146129f157605081146129fa5760588114612a035760608114612a0c5760688114612a155760708114612a1e5760788114612a275760808114612a305760888114612a395760908114612a425760988114612a4b5760a08114612a545760a88114612a5d5760b08114612a665760b88114612a6f5760c08114612a785760c88114612a815760d08114612a8a5760d88114612a935760e08114612a9c5760e88114612aa55760f08114612aae5760f88114612ab7576101008114612ac05760209150612ac5565b60019150612ac5565b60029150612ac5565b60039150612ac5565b60049150612ac5565b60059150612ac5565b60069150612ac5565b60079150612ac5565b60089150612ac5565b60099150612ac5565b600a9150612ac5565b600b9150612ac5565b600c9150612ac5565b600d9150612ac5565b600e9150612ac5565b600f9150612ac5565b60109150612ac5565b60119150612ac5565b60129150612ac5565b60139150612ac5565b60149150612ac5565b60159150612ac5565b60169150612ac5565b60179150612ac5565b60189150612ac5565b60199150612ac5565b601a9150612ac5565b601b9150612ac5565b601c9150612ac5565b601d9150612ac5565b601e9150612ac5565b601f9150612ac5565b602091505b50919050565b60006004821015612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890614b0e565b60405180910390fd5b6000612b2984600485612b24919061422e565b612ba7565b905060048163ffffffff16612b3e91906141d8565b831015612b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7790614ba0565b60405180910390fd5b60048163ffffffff1684612b94919061422e565b612b9e919061422e565b91505092915050565b60008251600483612bb891906141d8565b1115612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf0906147e5565b60405180910390fd5b82600383612c0791906141d8565b81518110612c1857612c17614805565b5b602001015160f81c60f81b60f81c60ff16600884600285612c3991906141d8565b81518110612c4a57612c49614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b601085600186612c7391906141d8565b81518110612c8457612c83614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b6018868681518110612cb257612cb1614805565b5b602001015160f81c60f81b60f81c60ff1663ffffffff16901b171717905092915050565b60008251602083612ce791906141d8565b1115612d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1f90614c0c565b60405180910390fd5b81602084010151905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6000612d6082612d4b565b9050919050565b612d7081612d55565b8114612d7b57600080fd5b50565b600081359050612d8d81612d67565b92915050565b600060208284031215612da957612da8612d41565b5b6000612db784828501612d7e565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612de557612de4612dc0565b5b8235905067ffffffffffffffff811115612e0257612e01612dc5565b5b602083019150836001820283011115612e1e57612e1d612dca565b5b9250929050565b60008083601f840112612e3b57612e3a612dc0565b5b8235905067ffffffffffffffff811115612e5857612e57612dc5565b5b602083019150836001820283011115612e7457612e73612dca565b5b9250929050565b600080600080600060608688031215612e9757612e96612d41565b5b600086013567ffffffffffffffff811115612eb557612eb4612d46565b5b612ec188828901612dcf565b95509550506020612ed488828901612d7e565b935050604086013567ffffffffffffffff811115612ef557612ef4612d46565b5b612f0188828901612e25565b92509250509295509295909350565b60008115159050919050565b612f2581612f10565b8114612f3057600080fd5b50565b600081359050612f4281612f1c565b92915050565b600060ff82169050919050565b612f5e81612f48565b8114612f6957600080fd5b50565b600081359050612f7b81612f55565b92915050565b612f8a81612d4b565b8114612f9557600080fd5b50565b600081359050612fa781612f81565b92915050565b600080600080600080600080600060e08a8c031215612fcf57612fce612d41565b5b60008a013567ffffffffffffffff811115612fed57612fec612d46565b5b612ff98c828d01612dcf565b9950995050602061300c8c828d01612d7e565b975050604061301d8c828d01612d7e565b965050606061302e8c828d01612f33565b95505060808a013567ffffffffffffffff81111561304f5761304e612d46565b5b61305b8c828d01612e25565b945094505060a061306e8c828d01612f6c565b92505060c061307f8c828d01612f98565b9150509295985092959850929598565b6000819050919050565b6130a28161308f565b82525050565b60006020820190506130bd6000830184613099565b92915050565b600063ffffffff82169050919050565b6130dc816130c3565b81146130e757600080fd5b50565b6000813590506130f9816130d3565b92915050565b60006020828403121561311557613114612d41565b5b6000613123848285016130ea565b91505092915050565b600080600080600080600060a0888a03121561314b5761314a612d41565b5b600088013567ffffffffffffffff81111561316957613168612d46565b5b6131758a828b01612dcf565b975097505060206131888a828b01612d7e565b95505060406131998a828b01612d7e565b94505060606131aa8a828b01612f33565b935050608088013567ffffffffffffffff8111156131cb576131ca612d46565b5b6131d78a828b01612e25565b925092505092959891949750929550565b6131f18161308f565b81146131fc57600080fd5b50565b60008135905061320e816131e8565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61326282613219565b810181811067ffffffffffffffff821117156132815761328061322a565b5b80604052505050565b6000613294612d37565b90506132a08282613259565b919050565b600067ffffffffffffffff8211156132c0576132bf61322a565b5b6132c982613219565b9050602081019050919050565b82818337600083830152505050565b60006132f86132f3846132a5565b61328a565b90508281526020810184848401111561331457613313613214565b5b61331f8482856132d6565b509392505050565b600082601f83011261333c5761333b612dc0565b5b813561334c8482602086016132e5565b91505092915050565b600067ffffffffffffffff82169050919050565b61337281613355565b811461337d57600080fd5b50565b60008135905061338f81613369565b92915050565b600067ffffffffffffffff8211156133b0576133af61322a565b5b6133b982613219565b9050602081019050919050565b60006133d96133d484613395565b61328a565b9050828152602081018484840111156133f5576133f4613214565b5b6134008482856132d6565b509392505050565b600082601f83011261341d5761341c612dc0565b5b813561342d8482602086016133c6565b91505092915050565b600080600080600080600080610100898b03121561345757613456612d41565b5b60006134658b828c01612d7e565b98505060206134768b828c016131ff565b975050604089013567ffffffffffffffff81111561349757613496612d46565b5b6134a38b828c01613327565b96505060606134b48b828c01612d7e565b95505060806134c58b828c016130ea565b94505060a06134d68b828c01613380565b93505060c089013567ffffffffffffffff8111156134f7576134f6612d46565b5b6135038b828c01613408565b92505060e089013567ffffffffffffffff81111561352457613523612d46565b5b6135308b828c01613327565b9150509295985092959890939650565b61354981612d55565b82525050565b60006020820190506135646000830184613540565b92915050565b6000806000806000806080878903121561358757613586612d41565b5b600087013567ffffffffffffffff8111156135a5576135a4612d46565b5b6135b189828a01612dcf565b965096505060206135c489828a01612d7e565b94505060406135d589828a01612d7e565b935050606087013567ffffffffffffffff8111156135f6576135f5612d46565b5b61360289828a01612e25565b92509250509295509295509295565b61361a816130c3565b82525050565b60006020820190506136356000830184613611565b92915050565b600080600080600080600060e0888a03121561365a57613659612d41565b5b60006136688a828b01612d7e565b97505060206136798a828b016131ff565b965050604088013567ffffffffffffffff81111561369a57613699612d46565b5b6136a68a828b01613327565b95505060606136b78a828b01612d7e565b94505060806136c88a828b016130ea565b93505060a06136d98a828b01613380565b92505060c088013567ffffffffffffffff8111156136fa576136f9612d46565b5b6137068a828b01613408565b91505092959891949750929550565b6000806000806000806000806080898b03121561373557613734612d41565b5b600089013567ffffffffffffffff81111561375357613752612d46565b5b61375f8b828c01612dcf565b9850985050602089013567ffffffffffffffff81111561378257613781612d46565b5b61378e8b828c01612dcf565b9650965050604089013567ffffffffffffffff8111156137b1576137b0612d46565b5b6137bd8b828c01612e25565b9450945050606089013567ffffffffffffffff8111156137e0576137df612d46565b5b6137ec8b828c01612e25565b92509250509295985092959890939650565b60006020828403121561381457613813612d41565b5b6000613822848285016131ff565b91505092915050565b61383481612f10565b82525050565b600060208201905061384f600083018461382b565b92915050565b6000806040838503121561386c5761386b612d41565b5b600061387a858286016131ff565b925050602061388b85828601612f33565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138dc602083613895565b91506138e7826138a6565b602082019050919050565b6000602082019050818103600083015261390b816138cf565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b600061396e602783613895565b915061397982613912565b604082019050919050565b6000602082019050818103600083015261399d81613961565b9050919050565b7f4d6f6e69746f723a20707265206d6f6e69746f72696e6720626c6f636b656400600082015250565b60006139da601f83613895565b91506139e5826139a4565b602082019050919050565b60006020820190508181036000830152613a09816139cd565b9050919050565b6000613a1c8385613895565b9350613a298385846132d6565b613a3283613219565b840190509392505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a77578082015181840152602081019050613a5c565b83811115613a86576000848401525b50505050565b6000613a9782613a3d565b613aa18185613a48565b9350613ab1818560208601613a59565b613aba81613219565b840191505092915050565b60006080820190508181036000830152613ae0818789613a10565b9050613aef6020830186613540565b613afc6040830185613540565b8181036060830152613b0e8184613a8c565b90509695505050505050565b60006060820190508181036000830152613b35818688613a10565b9050613b446020830185613540565b613b516040830184613611565b95945050505050565b7f4d6f6e69746f723a2073656e646572206973206e6f7420736470000000000000600082015250565b6000613b90601a83613895565b9150613b9b82613b5a565b602082019050919050565b60006020820190508181036000830152613bbf81613b83565b9050919050565b613bcf81612f48565b82525050565b613bde81612d4b565b82525050565b600060e0820190508181036000830152613bff818a8c613a10565b9050613c0e6020830189613540565b613c1b6040830188613540565b613c28606083018761382b565b8181036080830152613c3a8186613a8c565b9050613c4960a0830185613bc6565b613c5660c0830184613bd5565b9998505050505050505050565b600081519050613c72816131e8565b92915050565b600060208284031215613c8e57613c8d612d41565b5b6000613c9c84828501613c63565b91505092915050565b600060a0820190508181036000830152613cc081888a613a10565b9050613ccf6020830187613540565b613cdc6040830186613540565b613ce9606083018561382b565b8181036080830152613cfb8184613a8c565b9050979650505050505050565b600081519050919050565b6000613d1e82613d08565b613d288185613895565b9350613d38818560208601613a59565b613d4181613219565b840191505092915050565b613d5581613355565b82525050565b600060e082019050613d70600083018a613099565b8181036020830152613d828189613d13565b9050613d916040830188613540565b613d9e6060830187613611565b613dab6080830186613d4c565b81810360a0830152613dbd8185613a8c565b905081810360c0830152613dd18184613d13565b905098975050505050505050565b60006060820190508181036000830152613dfa818688613a10565b9050613e096020830185613540565b8181036040830152613e1b8184613a8c565b905095945050505050565b60006060820190508181036000830152613e41818688613a10565b9050613e506020830185613611565b613e5d604083018461382b565b95945050505050565b7f4d6f6e69746f723a20696e76616c69642076657269666965722061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ec2602183613895565b9150613ecd82613e66565b604082019050919050565b60006020820190508181036000830152613ef181613eb5565b9050919050565b600060c082019050613f0d6000830189613099565b8181036020830152613f1f8188613d13565b9050613f2e6040830187613540565b613f3b6060830186613611565b613f486080830185613d4c565b81810360a0830152613f5a8184613a8c565b9050979650505050505050565b7f4d6f6e69746f723a20696e76616c696420736470206164647265737300000000600082015250565b6000613f9d601c83613895565b9150613fa882613f67565b602082019050919050565b60006020820190508181036000830152613fcc81613f90565b9050919050565b7f4d6f6e69746f723a207665726966696572206e6f742073657400000000000000600082015250565b6000614009601983613895565b915061401482613fd3565b602082019050919050565b6000602082019050818103600083015261403881613ffc565b9050919050565b600061404b8385613a48565b93506140588385846132d6565b61406183613219565b840190509392505050565b60006080820190508181036000830152614087818a8c613a10565b9050818103602083015261409c81888a613a10565b905081810360408301526140b181868861403f565b905081810360608301526140c681848661403f565b90509998505050505050505050565b6000815190506140e481612f1c565b92915050565b600060208284031215614100576140ff612d41565b5b600061410e848285016140d5565b91505092915050565b7f4d6f6e69746f723a20696e76616c6964206d6f6e69746f72206f72646572207360008201527f69676e6174757265000000000000000000000000000000000000000000000000602082015250565b6000614173602883613895565b915061417e82614117565b604082019050919050565b600060208201905081810360008301526141a281614166565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141e382612d4b565b91506141ee83612d4b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614223576142226141a9565b5b828201905092915050565b600061423982612d4b565b915061424483612d4b565b925082821015614257576142566141a9565b5b828203905092915050565b7f4d6f6e69746f723a206d616c666f726d6564206d6f6e69746f72206d6573736160008201527f6765000000000000000000000000000000000000000000000000000000000000602082015250565b60006142be602283613895565b91506142c982614262565b604082019050919050565b600060208201905081810360008301526142ed816142b1565b9050919050565b7f4d6f6e69746f723a20696e76616c6964206d6f6e69746f722074797065000000600082015250565b600061432a601d83613895565b9150614335826142f4565b602082019050919050565b600060208201905081810360008301526143598161431d565b9050919050565b7f4d6f6e69746f723a20747261696c696e67206d6f6e69746f72206d657373616760008201527f6520646174610000000000000000000000000000000000000000000000000000602082015250565b60006143bc602683613895565b91506143c782614360565b604082019050919050565b600060208201905081810360008301526143eb816143af565b9050919050565b6000606082019050818103600083015261440c8186613d13565b905061441b6020830185613540565b818103604083015261442d8184613a8c565b9050949350505050565b600060608201905081810360008301526144518186613d13565b90506144606020830185613611565b61446d604083018461382b565b949350505050565b7f4d6f6e69746f723a20756e737570706f7274656420626c61636b6c697374206160008201527f6374696f6e000000000000000000000000000000000000000000000000000000602082015250565b60006144d1602583613895565b91506144dc82614475565b604082019050919050565b60006020820190508181036000830152614500816144c4565b9050919050565b7f4d6f6e69746f723a20756e737570706f7274656420636f6e74726f6c2061637460008201527f696f6e0000000000000000000000000000000000000000000000000000000000602082015250565b6000614563602383613895565b915061456e82614507565b604082019050919050565b6000602082019050818103600083015261459281614556565b9050919050565b7f4d6f6e69746f723a20756e737570706f72746564206f72646572207479706500600082015250565b60006145cf601f83613895565b91506145da82614599565b602082019050919050565b600060208201905081810360008301526145fe816145c2565b9050919050565b600060c08201905061461a6000830189613611565b6146276020830188613099565b6146346040830187613099565b614641606083018661382b565b61464e608083018561382b565b61465b60a0830184613611565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146a082612d4b565b91506146ab83612d4b565b9250826146bb576146ba614666565b5b828204905092915050565b60006146d182612d4b565b91506146dc83612d4b565b9250826146ec576146eb614666565b5b828206905092915050565b600061470282612d4b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614734576147336141a9565b5b600182019050919050565b600061474a82612d4b565b915061475583612d4b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561478e5761478d6141a9565b5b828202905092915050565b7f4d6f6e69746f723a2075696e743332206f7574206f6620626f756e6473000000600082015250565b60006147cf601d83613895565b91506147da82614799565b602082019050919050565b600060208201905081810360008301526147fe816147c2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4d6f6e69746f723a206d616c666f726d6564207661726961626c65206279746560008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614890602183613895565b915061489b82614834565b604082019050919050565b600060208201905081810360008301526148bf81614883565b9050919050565b7f4d6f6e69746f723a207661726961626c65206279746573206f7574206f66206260008201527f6f756e6473000000000000000000000000000000000000000000000000000000602082015250565b6000614922602583613895565b915061492d826148c6565b604082019050919050565b6000602082019050818103600083015261495181614915565b9050919050565b7f4d6f6e69746f723a206d697373696e67206f7264657220747970650000000000600082015250565b600061498e601b83613895565b915061499982614958565b602082019050919050565b600060208201905081810360008301526149bd81614981565b9050919050565b7f4d6f6e69746f723a206d697373696e672073656e646572000000000000000000600082015250565b60006149fa601783613895565b9150614a05826149c4565b602082019050919050565b60006020820190508181036000830152614a29816149ed565b9050919050565b7f4d6f6e69746f723a206d697373696e6720726563656976657200000000000000600082015250565b6000614a66601983613895565b9150614a7182614a30565b602082019050919050565b60006020820190508181036000830152614a9581614a59565b9050919050565b7f4d6f6e69746f723a206d616c666f726d6564207661726961626c65206669656c60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614af8602183613895565b9150614b0382614a9c565b604082019050919050565b60006020820190508181036000830152614b2781614aeb565b9050919050565b7f4d6f6e69746f723a207472756e6361746564207661726961626c65206669656c60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b8a602183613895565b9150614b9582614b2e565b604082019050919050565b60006020820190508181036000830152614bb981614b7d565b9050919050565b7f4d6f6e69746f723a2062797465733332206f7574206f6620626f756e64730000600082015250565b6000614bf6601e83613895565b9150614c0182614bc0565b602082019050919050565b60006020820190508181036000830152614c2581614be9565b905091905056fea3646970667358221220a30e06981edd8f6841063d15bd2b945e20f3aab8d3deceaa7940d31d4cf57cff64736f6c637827302e382e31342d63692e323032322e362e32302b636f6d6d69742e66633963623232362e6d6f646b636f6d70696c655f6d6f6461300066 \ No newline at end of file diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/PtcHub.bin-runtime b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/PtcHub.bin-runtime new file mode 100644 index 00000000..500118ed --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/PtcHub.bin-runtime @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50600436106101a95760003560e01c806395e8fcee116100f9578063bc327e4011610097578063d919581711610071578063d9195817146104de578063dde185461461050e578063e1ceb0301461053e578063fe8cc1e31461056e576101a9565b8063bc327e4014610472578063c2450b5014610490578063c3292b6d146104ae576101a9565b8063ad86bc03116100d3578063ad86bc03146103d6578063adc64a1814610406578063adf22b3f14610436578063ae14961d14610454576101a9565b806395e8fcee146103825780639646a30b1461039e578063a1d6c964146103ba576101a9565b80632534ddcc1161016657806373d6c7bd1161014057806373d6c7bd146102d45780637adcff0c146103045780638da5cb5b1461033457806390157ffb14610352576101a9565b80632534ddcc1461029257806355c265fe146102ae578063715018a6146102ca576101a9565b806304802a34146101ae5780630604420e146101ca57806309158b21146101fa57806312dabd3a1461022a5780631f56086f1461025a578063251459ef14610276575b600080fd5b6101c860048036038101906101c391906167ce565b61059e565b005b6101e460048036038101906101df91906167ce565b61097b565b6040516101f191906168b4565b60405180910390f35b610214600480360381019061020f919061690c565b610a3b565b60405161022191906169b0565b60405180910390f35b610244600480360381019061023f9190616a07565b610a6f565b6040516102519190616a82565b60405180910390f35b610274600480360381019061026f9190616adb565b610acd565b005b610290600480360381019061028b91906167ce565b610b24565b005b6102ac60048036038101906102a79190616adb565b610b7d565b005b6102c860048036038101906102c391906167ce565b610bd2565b005b6102d2610f21565b005b6102ee60048036038101906102e991906167ce565b610f35565b6040516102fb9190616a82565b60405180910390f35b61031e60048036038101906103199190616b2d565b610f7b565b60405161032b9190616b69565b60405180910390f35b61033c610f93565b6040516103499190616b69565b60405180910390f35b61036c60048036038101906103679190616bba565b610f9c565b6040516103799190616c3c565b60405180910390f35b61039c600480360381019061039791906167ce565b61103c565b005b6103b860048036038101906103b39190616adb565b6112b6565b005b6103d460048036038101906103cf9190616b2d565b611464565b005b6103f060048036038101906103eb9190616bba565b6116b4565b6040516103fd9190616c6d565b60405180910390f35b610420600480360381019061041b9190616bba565b6116d2565b60405161042d91906168b4565b60405180910390f35b61043e611778565b60405161044b9190616d46565b60405180910390f35b61045c611805565b6040516104699190616b69565b60405180910390f35b61047a61180b565b6040516104879190616d77565b60405180910390f35b610498611814565b6040516104a59190616b69565b60405180910390f35b6104c860048036038101906104c39190616d92565b61181e565b6040516104d59190616a82565b60405180910390f35b6104f860048036038101906104f39190616a07565b611876565b60405161050591906168b4565b60405180910390f35b61052860048036038101906105239190616d92565b61194e565b60405161053591906168b4565b60405180910390f35b61055860048036038101906105539190616f22565b611a20565b60405161056591906168b4565b60405180910390f35b610588600480360381019061058391906167ce565b611ad6565b60405161059591906168b4565b60405180910390f35b6105a6612df3565b60006105f583838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612e45565b9050610608816060015160600151613070565b610647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063e90616fb7565b60405180910390fd5b600061065a8260600151606001516130ad565b9050600061066b8360400151613172565b905061067f8360600151606001518261322e565b6106be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b590617023565b60405180910390fd5b6000600560006106d5856020015160c0015161327d565b6040015160028111156106eb576106ea616939565b5b60028111156106fd576106fc616939565b5b815260200190815260200160002054905060008103610751576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107489061708f565b60405180910390fd5b8063bff3093b61076986606001516060015185613402565b866040518363ffffffff1660e01b8152600401610787929190617431565b6020604051808303816000875af11580156107a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ca9190617494565b610809576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108009061750d565b60405180910390fd5b600061081885608001516134d9565b8051906020012090506000600460008381526020019081526020016000209050856020015163ffffffff168160000154101561089f57856020015163ffffffff1681600001819055507f14f6dcf24001d9e8910255539bf10f0a01ba6fcb712bdcd812fe528b9ad798d1828760200151604051610896929190617577565b60405180910390a15b8787826001016000896020015163ffffffff16815260200190815260200160002091906108cd929190616234565b507f8796377aabd0d7feac50b0be12f810cac9a467a6ccd01c3bb79e50e2da8fd1f2828760200151604051610903929190617577565b60405180910390a160006007541461097157600754631a383f188760e001516040518263ffffffff1660e01b815260040161093e91906168b4565b600060405180830381600087803b15801561095857600080fd5b505af115801561096c573d6000803e3d6000fd5b505050505b5050505050505050565b60606003600084846040516109919291906175d0565b6040518091039020815260200190815260200160002060000180546109b590617618565b80601f01602080910402602001604051908101604052809291908181526020018280546109e190617618565b8015610a2e5780601f10610a0357610100808354040283529160200191610a2e565b820191906000526020600020905b815481529060010190602001808311610a1157829003601f168201915b5050505050905092915050565b60068181548110610a4b57600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b600080600460008686604051610a869291906175d0565b6040518091039020815260200190815260200160002060010160008463ffffffff1681526020019081526020016000208054610ac190617618565b90501190509392505050565b610ad5612df3565b60008103610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f906176bb565b60405180910390fd5b610b21816137bd565b50565b610b2c612df3565b610b7982828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506137fc565b5050565b610b85612df3565b60008103610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf90617727565b60405180910390fd5b8060078190555050565b6000610c2183838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613991565b90506000610c3282602001516134d9565b9050600060046000838051906020012081526020019081526020016000206001016000846040015163ffffffff1681526020019081526020016000208054610c7990617618565b905011610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290617793565b60405180910390fd5b6000610cd182846040015163ffffffff16613ac9565b9050610ce4816060015160600151613070565b610d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1a90616fb7565b60405180910390fd5b6000610d368260600151606001516130ad565b90506000610d478360400151613172565b9050610d5b8360600151606001518261322e565b610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190617023565b60405180910390fd5b600060056000610db1856020015160c0015161327d565b604001516002811115610dc757610dc6616939565b5b6002811115610dd957610dd8616939565b5b815260200190815260200160002054905060008103610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e249061708f565b60405180910390fd5b6000816348a3c57086896040518363ffffffff1660e01b8152600401610e5492919061784e565b6020604051808303816000875af1158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e979190617494565b90507f4d2d7be42668dce2927650393613e408fc71274deac16f825eb0a869a5667e8c856080015182604051610ece9291906178d5565b60405180910390a180610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90617951565b60405180910390fd5b505050505050505050565b610f29612df3565b610f3360006137bd565b565b600080600360008585604051610f4c9291906175d0565b604051809103902081526020019081526020016000206000018054610f7090617618565b905011905092915050565b60056020528060005260406000206000915090505481565b60008054905090565b60026020528060005260406000206000915090508054610fbb90617618565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe790617618565b80156110345780601f1061100957610100808354040283529160200191611034565b820191906000526020600020905b81548152906001019060200180831161101757829003601f168201915b505050505081565b611044612df3565b600061109383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613b98565b905061109e81613d0c565b60006110a982613f56565b9050600060036000838152602001908152602001600020905060008160000180546110d390617618565b905011156111ca5784848260000191906110ee929190616234565b505b6110fd8360600151613f7b565b156111c55760006111118460600151613f90565b90506000826001016000838152602001908152602001600020805461113590617618565b9050036111b0576111498460600151613faa565b82600101600083815260200190815260200160002090805190602001906111719291906162ba565b507f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce83826040516111a3929190617971565b60405180910390a16111bf565b6111bd8460600151613faa565b505b506110f0565b6112af565b84848260000191906111dd929190616234565b505b6111ec8360600151613f7b565b156112775760006112008460600151613f90565b905061120f8460600151613faa565b82600101600083815260200190815260200160002090805190602001906112379291906162ba565b507f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce8382604051611269929190617971565b60405180910390a1506111df565b7fc115cf6e41eccaaf9dbe48f3cbf3e82c176644e35bf1cae0839627723d980a0d826040516112a6919061799a565b60405180910390a15b5050505050565b6112be612df3565b60008163b93ba39c6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156112f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131b91906179ca565b905060006005600083600281111561133657611335616939565b5b600281111561134857611347616939565b5b81526020019081526020016000205414611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138e90617a43565b60405180910390fd5b60068190806001815401808255809150506001900390600052602060002090602091828204019190069091909190916101000a81548160ff021916908360028111156113e6576113e5616939565b5b0217905550816005600083600281111561140357611402616939565b5b600281111561141557611414616939565b5b8152602001908152602001600020819055507f30469544067c713d17864302c985ca87e4822f68e28079cbf956f9deab7c8fff8183604051611458929190617a63565b60405180910390a15050565b61146c612df3565b60006005600083600281111561148557611484616939565b5b600281111561149757611496616939565b5b815260200190815260200160002054036114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd90617ad8565b60405180910390fd5b6000600190505b60068054905081101561163e5781600281111561150d5761150c616939565b5b6006828154811061152157611520617af8565b5b90600052602060002090602091828204019190069054906101000a900460ff16600281111561155357611552616939565b5b0361162b576006600160068054905061156c9190617b56565b8154811061157d5761157c617af8565b5b90600052602060002090602091828204019190069054906101000a900460ff16600682815481106115b1576115b0617af8565b5b90600052602060002090602091828204019190066101000a81548160ff021916908360028111156115e5576115e4616939565b5b021790555060068054806115fc576115fb617b8a565b5b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561163e565b808061163690617bb9565b9150506114ed565b506005600082600281111561165657611655616939565b5b600281111561166857611667616939565b5b8152602001908152602001600020600090557f4ae9b990c01f3cf6322d2f72f0c0a7eefdcdb12b782e47f420dbc75314d7f508816040516116a991906169b0565b60405180910390a150565b60046020528060005260406000206000915090508060000154905081565b60036020528060005260406000206000915090508060000180546116f590617618565b80601f016020809104026020016040519081016040528092919081815260200182805461172190617618565b801561176e5780601f106117435761010080835404028352916020019161176e565b820191906000526020600020905b81548152906001019060200180831161175157829003601f168201915b5050505050905081565b606060068054806020026020016040519081016040528092919081815260200182805480156117fb57602002820191906000526020600020906000905b82829054906101000a900460ff1660028111156117d5576117d4616939565b5b815260200190600101906020826000010492830192600103820291508084116117b55790505b5050505050905090565b60075481565b60006002905090565b6000600754905090565b6000806003600086866040516118359291906175d0565b604051809103902081526020019081526020016000206001016000848152602001908152602001600020805461186a90617618565b90501190509392505050565b606060046000858560405161188c9291906175d0565b6040518091039020815260200190815260200160002060010160008363ffffffff16815260200190815260200160002080546118c790617618565b80601f01602080910402602001604051908101604052809291908181526020018280546118f390617618565b80156119405780601f1061191557610100808354040283529160200191611940565b820191906000526020600020905b81548152906001019060200180831161192357829003601f168201915b505050505090509392505050565b60606003600085856040516119649291906175d0565b604051809103902081526020019081526020016000206001016000838152602001908152602001600020805461199990617618565b80601f01602080910402602001604051908101604052809291908181526020018280546119c590617618565b8015611a125780601f106119e757610100808354040283529160200191611a12565b820191906000526020600020905b8154815290600101906020018083116119f557829003601f168201915b505050505090509392505050565b6001818051602081018201805184825260208301602085012081835280955050505050506000915090508054611a5590617618565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8190617618565b8015611ace5780601f10611aa357610100808354040283529160200191611ace565b820191906000526020600020905b815481529060010190602001808311611ab157829003601f168201915b505050505081565b60606000600460008585604051611aee9291906175d0565b604051809103902081526020019081526020016000209050806001016000826000015481526020019081526020016000208054611b2a90617618565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5690617618565b8015611ba35780601f10611b7857610100808354040283529160200191611ba3565b820191906000526020600020905b815481529060010190602001808311611b8657829003601f168201915b505050505091505092915050565b611bb9616340565b611bc1616340565b6000611bcc84612048565b905060005b816020015151811015611de257600082602001518281518110611bf757611bf6617af8565b5b60200260200101519050600061ffff16816000015161ffff1603611c2b57611c1e816121fa565b8460000181905250611dce565b600161ffff16816000015161ffff1603611c5557611c48816121fa565b8460200181905250611dcd565b600261ffff16816000015161ffff1603611cbb57611c7281612208565b60ff166003811115611c8757611c86616939565b5b84604001906003811115611c9e57611c9d616939565b5b90816003811115611cb257611cb1616939565b5b81525050611dcc565b600361ffff16816000015161ffff1603611ced57611ce0611cdb82612220565b61403c565b8460600181905250611dcb565b600461ffff16816000015161ffff1603611d2e57611d0a8161222e565b846080019067ffffffffffffffff16908167ffffffffffffffff1681525050611dca565b600561ffff16816000015161ffff1603611d6f57611d4b8161222e565b8460a0019067ffffffffffffffff16908167ffffffffffffffff1681525050611dc9565b600661ffff16816000015161ffff1603611d9957611d8c81612220565b8460c00181905250611dc8565b600761ffff16816000015161ffff1603611dc757611dbe611db982612220565b614138565b8460e001819052505b5b5b5b5b5b5b5b508080611dda90617bb9565b915050611bd1565b508192505050919050565b611df56163b7565b60006003811115611e0957611e08616939565b5b82604001516003811115611e2057611e1f616939565b5b03611e3d57611e328260c0015161424e565b602001519050611f4f565b60016003811115611e5157611e50616939565b5b82604001516003811115611e6857611e67616939565b5b03611e8557611e7a8260c00151614341565b608001519050611f4f565b60026003811115611e9957611e98616939565b5b82604001516003811115611eb057611eaf616939565b5b03611ecd57611ec28260c0015161327d565b606001519050611f4f565b600380811115611ee057611edf616939565b5b82604001516003811115611ef757611ef6616939565b5b03611f1457611f098260c001516144f1565b604001519050611f4f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4690617c73565b60405180910390fd5b919050565b60606000600267ffffffffffffffff811115611f7357611f72616df7565b5b604051908082528060200260200182016040528015611fac57816020015b611f996163e3565b815260200190600190039081611f915790505b509050611fd86000611fd385600001516001811115611fce57611fcd616939565b5b61224e565b61226a565b81600081518110611fec57611feb617af8565b5b6020026020010181905250612006600184602001516122ff565b8160018151811061201a57612019617af8565b5b602002602001018190525061202d61640e565b81816020018190525061203f81612335565b92505050919050565b61205061640e565b600682511015612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90617cdf565b60405180910390fd5b600061209f61640e565b6120b16120ac8584612451565b612480565b816000019061ffff16908161ffff16815250506006826120d19190617cff565b91506000808390505b8551811015612133576121016120fc876002846120f79190617cff565b6125ab565b6125dc565b600661210d9190617d55565b63ffffffff168161211e9190617cff565b9050818061212b90617bb9565b9250506120da565b60008267ffffffffffffffff81111561214f5761214e616df7565b5b60405190808252806020026020018201604052801561218857816020015b6121756163e3565b81526020019060019003908161216d5790505b509050600092505b86518510156121e4576121a16163e3565b6121ab888761460f565b8097508192505050808285806121c090617bb9565b9650815181106121d3576121d2617af8565b5b602002602001018190525050612190565b8084602001819052508395505050505050919050565b606081604001519050919050565b6000612219600183604001516127bd565b9050919050565b606081604001519050919050565b6000612247612242600884604001516127cb565b6127d9565b9050919050565b600081600181111561226357612262616939565b5b9050919050565b6122726163e3565b6000600167ffffffffffffffff81111561228f5761228e616df7565b5b6040519080825280601f01601f1916602001820160405280156122c15781602001600182028036833780820191505090505b5090506122d060018483612b26565b60405180606001604052808561ffff168152602001600163ffffffff1681526020018281525091505092915050565b6123076163e3565b60405180606001604052808461ffff168152602001835163ffffffff16815260200183815250905092915050565b6060600061234283612b3d565b905060006006826123539190617d55565b63ffffffff1667ffffffffffffffff81111561237257612371616df7565b5b6040519080825280601f01601f1916602001820160405280156123a45781602001600182028036833780820191505090505b5090506123bf60026123b98660000151612480565b83612bbd565b6123d360066123cd846125dc565b83612bd4565b60006006905060005b6123e586612beb565b8110156124455760006124158760200151838151811061240857612407617af8565b5b6020026020010151612bfa565b9050612422838286612cac565b80518361242f9190617cff565b925050808061243d90617bb9565b9150506123dc565b50819350505050919050565b600082516002836124629190617cff565b111561246d57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff8111156124a6576124a5616df7565b5b6040519080825280601f01601f1916602001820160405280156124d85781602001600182028036833780820191505090505b509050816001600281106124ef576124ee617af8565b5b1a60f81b8160008151811061250757612506617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006002811061254a57612549617af8565b5b1a60f81b8160018151811061256257612561617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061259e826000612451565b9050809350505050919050565b600082516004836125bc9190617cff565b11156125c757600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff81111561260257612601616df7565b5b6040519080825280601f01601f1916602001820160405280156126345781602001600182028036833780820191505090505b5090508160036004811061264b5761264a617af8565b5b1a60f81b8160008151811061266357612662617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816002600481106126a6576126a5617af8565b5b1a60f81b816001815181106126be576126bd617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160016004811061270157612700617af8565b5b1a60f81b8160028151811061271957612718617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006004811061275c5761275b617af8565b5b1a60f81b8160038151811061277457612773617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006127b08260006125ab565b9050809350505050919050565b600082820151905092915050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff8111156127ff576127fe616df7565b5b6040519080825280601f01601f1916602001820160405280156128315781602001600182028036833780820191505090505b5090508160076008811061284857612847617af8565b5b1a60f81b816000815181106128605761285f617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816006600881106128a3576128a2617af8565b5b1a60f81b816001815181106128bb576128ba617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816005600881106128fe576128fd617af8565b5b1a60f81b8160028151811061291657612915617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160046008811061295957612958617af8565b5b1a60f81b8160038151811061297157612970617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816003600881106129b4576129b3617af8565b5b1a60f81b816004815181106129cc576129cb617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260088110612a0f57612a0e617af8565b5b1a60f81b81600581518110612a2757612a26617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160088110612a6a57612a69617af8565b5b1a60f81b81600681518110612a8257612a81617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060088110612ac557612ac4617af8565b5b1a60f81b81600781518110612add57612adc617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612b19826000614757565b9050809350505050919050565b828101600181038051848352808252505050505050565b6000806000905060005b612b5084612beb565b811015612bb357600084602001518281518110612b7057612b6f617af8565b5b60200260200101519050806040015151600684612b8d9190617d55565b63ffffffff16612b9d9190617cff565b9250508080612bab90617bb9565b915050612b47565b5080915050919050565b828101600281038051848352808252505050505050565b828101600481038051848352808252505050505050565b60008160200151519050919050565b6060600060068360200151612c0f9190617d55565b63ffffffff1667ffffffffffffffff811115612c2e57612c2d616df7565b5b6040519080825280601f01601f191660200182016040528015612c605781602001600182028036833780820191505090505b509050612c7b6002612c758560000151612480565b83612bbd565b612c936006612c8d85602001516125dc565b83612bd4565b612ca36006846040015183612cac565b80915050919050565b60008251905081518163ffffffff1685612cc69190617cff565b1115612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90617e27565b60405180910390fd5b801560008103612d57578483018051601f84168015602002818801018581018215602002838601015b81831015612d4d5782518152602083019250602081019050612d30565b5083855250505050505b5050505050565b606083518284612d6e9190617cff565b1115612d7957600080fd5b60008267ffffffffffffffff811115612d9557612d94616df7565b5b6040519080825280601f01601f191660200182016040528015612dc75781602001600182028036833780820191505090505b5090506000806020830191508560208801019050612de682828761478c565b8293505050509392505050565b612dfb614815565b612e03610f93565b14612e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3a90617e93565b60405180910390fd5b565b612e4d61642c565b612e5561642c565b6000612e6084612048565b905060005b81602001515181101561306557600082602001518281518110612e8b57612e8a617af8565b5b60200260200101519050600061ffff16816000015161ffff1603612ece57612eb28161481d565b846000019063ffffffff16908163ffffffff1681525050613051565b600161ffff16816000015161ffff1603612f0757612eeb8161481d565b846020019063ffffffff16908163ffffffff1681525050613050565b600261ffff16816000015161ffff1603612f3157612f248161483d565b846040018190525061304f565b600361ffff16816000015161ffff1603612f6357612f56612f5182612220565b61327d565b846060018190525061304e565b600461ffff16816000015161ffff1603612f9557612f88612f8382612220565b61484b565b846080018190525061304d565b600561ffff16816000015161ffff1603612fce57612fb28161481d565b8460a0019063ffffffff16908163ffffffff168152505061304c565b600661ffff16816000015161ffff1603612ff857612feb816121fa565b8460c0018190525061304b565b600761ffff16816000015161ffff16036130225761301581612220565b8460e0018190525061304a565b60ff61ffff16816000015161ffff16036130495761303f81612220565b8461010001819052505b5b5b5b5b5b5b5b5b50808061305d90617bb9565b915050612e65565b508192505050919050565b6000806003600061308085611f54565b80519060200120815260200190815260200160002060000180546130a390617618565b9050119050919050565b6130b5616496565b61316b600360006130c585611f54565b80519060200120815260200190815260200160002060000180546130e890617618565b80601f016020809104026020016040519081016040528092919081815260200182805461311490617618565b80156131615780601f1061313657610100808354040283529160200191613161565b820191906000526020600020905b81548152906001019060200180831161314457829003601f168201915b5050505050613b98565b9050919050565b6000808251905060208111156131bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b490617f25565b60405180910390fd5b60008167ffffffffffffffff8111156131d9576131d8616df7565b5b6040519080825280601f01601f19166020018201604052801561320b5781602001600182028036833780820191505090505b509050600084518252828501518383015180820392505050809350505050919050565b6000806003600061323e86611f54565b8051906020012081526020019081526020016000206001016000848152602001908152602001600020805461327290617618565b905011905092915050565b6132856164d8565b61328d6164d8565b600061329884612048565b905060005b8160200151518110156133f7576000826020015182815181106132c3576132c2617af8565b5b60200260200101519050600061ffff16816000015161ffff16036132f7576132ea816121fa565b84600001819052506133e3565b600161ffff16816000015161ffff160361332157613314816121fa565b84602001819052506133e2565b600261ffff16816000015161ffff16036133875761333e81612208565b60ff16600281111561335357613352616939565b5b8460400190600281111561336a57613369616939565b5b9081600281111561337e5761337d616939565b5b815250506133e1565b600361ffff16816000015161ffff16036133b9576133ac6133a782612220565b61403c565b84606001819052506133e0565b600461ffff16816000015161ffff16036133df576133d681612220565b84608001819052505b5b5b5b5b5080806133ef90617bb9565b91505061329d565b508192505050919050565b61340a61651f565b6134d16003600061341a86611f54565b8051906020012081526020019081526020016000206001016000848152602001908152602001600020805461344e90617618565b80601f016020809104026020016040519081016040528092919081815260200182805461347a90617618565b80156134c75780601f1061349c576101008083540402835291602001916134c7565b820191906000526020600020905b8154815290600101906020018083116134aa57829003601f168201915b5050505050614960565b905092915050565b6060806000801b83602001511480156134f857506000801b8360400151145b1561358f57600167ffffffffffffffff81111561351857613517616df7565b5b60405190808252806020026020018201604052801561355157816020015b61353e6163e3565b8152602001906001900390816135365790505b50905061356b60006135668560000151614a20565b6122ff565b8160008151811061357f5761357e617af8565b5b602002602001018190525061379a565b6000801b8360200151141580156135ad57506000801b836040015114155b1561375e57600367ffffffffffffffff8111156135cd576135cc616df7565b5b60405190808252806020026020018201604052801561360657816020015b6135f36163e3565b8152602001906001900390816135eb5790505b509050613620600061361b8560000151614a20565b6122ff565b8160008151811061363457613633617af8565b5b60200260200101819052506000602067ffffffffffffffff81111561365c5761365b616df7565b5b6040519080825280601f01601f19166020018201604052801561368e5781602001600182028036833780820191505090505b5090506136a16020856020015183614b92565b6136ac6001826122ff565b826001815181106136c0576136bf617af8565b5b60200260200101819052506000602067ffffffffffffffff8111156136e8576136e7616df7565b5b6040519080825280601f01601f19166020018201604052801561371a5781602001600182028036833780820191505090505b50905061372d6020866040015183614b92565b6137386002826122ff565b8360028151811061374c5761374b617af8565b5b60200260200101819052505050613799565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379090617f91565b60405180910390fd5b5b6137a261640e565b8181602001819052506137b481612335565b92505050919050565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b600061380782611bb1565b90506000600381111561381d5761381c616939565b5b8160400151600381111561383457613833616939565b5b14613874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386b90617ffd565b60405180910390fd5b600061388761388283611ded565b611f54565b8051906020012090508260016040518060400160405280600481526020017f726f6f74000000000000000000000000000000000000000000000000000000008152506040516138d69190618059565b908152602001604051809103902090805190602001906138f79291906162ba565b506040518060400160405280600481526020017f726f6f7400000000000000000000000000000000000000000000000000000000815250600260008381526020019081526020016000209080519060200190613954929190616539565b507f7c787bfbe942686b5f41acec151012ca79c6b81c1c5a23cee512781cf3d5b9bb81604051613984919061799a565b60405180910390a1505050565b6139996165bf565b6139a16165bf565b60006139ac84612048565b905060005b816020015151811015613abe576000826020015182815181106139d7576139d6617af8565b5b60200260200101519050600561ffff16816000015161ffff1603613a1357613a06613a0182612220565b614b9c565b8460000181905250613aaa565b61010161ffff16816000015161ffff1603613a4657613a39613a3482612220565b61484b565b8460200181905250613aa9565b61010061ffff16816000015161ffff1603613a8057613a648161481d565b846040019063ffffffff16908163ffffffff1681525050613aa8565b6101ff61ffff16816000015161ffff1603613aa757613a9e81612220565b84606001819052505b5b5b5b508080613ab690617bb9565b9150506139b1565b508192505050919050565b613ad161642c565b613b90600460008580519060200120815260200190815260200160002060010160008481526020019081526020016000208054613b0d90617618565b80601f0160208091040260200160405190810160405280929190818152602001828054613b3990617618565b8015613b865780601f10613b5b57610100808354040283529160200191613b86565b820191906000526020600020905b815481529060010190602001808311613b6957829003601f168201915b5050505050612e45565b905092915050565b613ba0616496565b613ba8616496565b6000613bb384612048565b905060005b816020015151811015613d0157600082602001518281518110613bde57613bdd617af8565b5b60200260200101519050600061ffff16816000015161ffff1603613c1257613c05816121fa565b8460000181905250613ced565b600161ffff16816000015161ffff1603613c4457613c37613c3282612220565b611bb1565b8460200181905250613cec565b600261ffff16816000015161ffff1603613c6e57613c6181612220565b8460400181905250613ceb565b600361ffff16816000015161ffff1603613c9857613c8b81614c31565b8460600181905250613cea565b600461ffff16816000015161ffff1603613cc257613cb5816121fa565b8460800181905250613ce9565b600561ffff16816000015161ffff1603613ce857613cdf81612220565b8460a001819052505b5b5b5b5b5b508080613cf990617bb9565b915050613bb8565b508192505050919050565b6000613d1f826020015160600151611f54565b8051906020012090506000600260008381526020019081526020016000208054613d4890617618565b905011613d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d81906180bc565b60405180910390fd5b6000613e4d600160026000858152602001908152602001600020604051613db19190618170565b90815260200160405180910390208054613dca90617618565b80601f0160208091040260200160405190810160405280929190818152602001828054613df690617618565b8015613e435780601f10613e1857610100808354040283529160200191613e43565b820191906000526020600020905b815481529060010190602001808311613e2657829003601f168201915b5050505050611bb1565b9050613e9f6040518060400160405280601681526020017f4b656363616b32353657697468536563703235366b31000000000000000000008152508260e0015160400151614c5a90919063ffffffff16565b15613f0957600080613ebe838660200151614c7590919063ffffffff16565b91509150818190613f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613efc9190616c3c565b60405180910390fd5b5050505b613f1283614e7b565b613f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f48906181d3565b60405180910390fd5b505050565b6000613f6d613f688360200151611ded565b611f54565b805190602001209050919050565b60008160200151518260000151109050919050565b6000613fa3613f9e83613faa565b613172565b9050919050565b6060816020015151826000015110613ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fee90618265565b60405180910390fd5b600061400b83600001518460200151614eac565b90508051600484600001516140209190617cff565b61402a9190617cff565b83600001818152505080915050919050565b6140446163b7565b61404c6163b7565b600061405784612048565b905060005b81602001515181101561412d5760008260200151828151811061408257614081617af8565b5b60200260200101519050600061ffff16816000015161ffff16036140f2576140a981612208565b60ff1660018111156140be576140bd616939565b5b846000019060018111156140d5576140d4616939565b5b908160018111156140e9576140e8616939565b5b81525050614119565b600161ffff16816000015161ffff16036141185761410f81612220565b84602001819052505b5b50808061412590617bb9565b91505061405c565b508192505050919050565b6141406165f9565b6141486165f9565b600061415384612048565b905060005b8160200151518110156142435760008260200151828151811061417e5761417d617af8565b5b60200260200101519050600061ffff16816000015161ffff16036141b2576141a5816121fa565b846000018190525061422f565b600161ffff16816000015161ffff16036141dc576141cf81612220565b846020018190525061422e565b600261ffff16816000015161ffff1603614206576141f9816121fa565b846040018190525061422d565b600361ffff16816000015161ffff160361422c5761422381612220565b84606001819052505b5b5b5b50808061423b90617bb9565b915050614158565b508192505050919050565b614256616621565b61425e616621565b600061426984612048565b905060005b8160200151518110156143365760008260200151828151811061429457614293617af8565b5b60200260200101519050600061ffff16816000015161ffff16036142c8576142bb816121fa565b8460000181905250614322565b600161ffff16816000015161ffff16036142fa576142ed6142e882612220565b61403c565b8460200181905250614321565b600261ffff16816000015161ffff16036143205761431781612220565b84604001819052505b5b5b50808061432e90617bb9565b91505061426e565b508192505050919050565b614349616648565b614351616648565b600061435c84612048565b905060005b8160200151518110156144e65760008260200151828151811061438757614386617af8565b5b60200260200101519050600061ffff16816000015161ffff16036143bb576143ae816121fa565b84600001819052506144d2565b600161ffff16816000015161ffff1603614421576143d881612208565b60ff1660018111156143ed576143ec616939565b5b8460200190600181111561440457614403616939565b5b9081600181111561441857614417616939565b5b815250506144d1565b600261ffff16816000015161ffff160361444b5761443e816121fa565b84604001819052506144d0565b600361ffff16816000015161ffff160361447557614468816121fa565b84606001819052506144cf565b600461ffff16816000015161ffff16036144a75761449a61449582612220565b61403c565b84608001819052506144ce565b600561ffff16816000015161ffff16036144cd576144c481612220565b8460a001819052505b5b5b5b5b5b5080806144de90617bb9565b915050614361565b508192505050919050565b6144f9616696565b614501616696565b600061450c84612048565b905060005b8160200151518110156146045760008260200151828151811061453757614536617af8565b5b60200260200101519050600061ffff16816000015161ffff160361456b5761455e816121fa565b84600001819052506145f0565b600161ffff16816000015161ffff160361459557614588816121fa565b84602001819052506145ef565b600361ffff16816000015161ffff16036145c7576145ba6145b582612220565b61403c565b84604001819052506145ee565b600461ffff16816000015161ffff16036145ed576145e481612220565b84606001819052505b5b5b5b5080806145fc90617bb9565b915050614511565b508192505050919050565b6146176163e3565b60008284511161465c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614653906182f7565b60405180910390fd5b60068310156146a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161469790618363565b60405180910390fd5b6146a86163e3565b6146ba6146b58686612451565b612480565b816000019061ffff16908161ffff16815250506002846146da9190617cff565b93506146ee6146e986866125ab565b6125dc565b816020019063ffffffff16908163ffffffff16815250506004846147129190617cff565b93506147298585836020015163ffffffff16612d5e565b8160400181905250806020015163ffffffff16846147479190617cff565b9350808492509250509250929050565b600082516008836147689190617cff565b111561477357600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b602081106147cb57815183526020836147a69190617cff565b92506020826147b59190617cff565b91506020816147c49190617b56565b905061478d565b600081031561481057600060018260206147e59190617b56565b6101006147f291906184b6565b6147fc9190617b56565b905080198351168185511681811786525050505b505050565b600033905090565b600061483661483160048460400151614f53565b6125dc565b9050919050565b606081604001519050919050565b6148536166c4565b61485b6166c4565b600061486684612048565b905060005b8160200151518110156149555760008260200151828151811061489157614890617af8565b5b60200260200101519050600061ffff16816000015161ffff16036148cd576148c06148bb82612220565b614f61565b8460000181905250614941565b600161ffff16816000015161ffff16036149085760006148ec82612220565b90506148f9815182615021565b85602001818152505050614940565b600261ffff16816000015161ffff160361493f57600061492782612220565b9050614934815182615021565b856040018181525050505b5b5b50808061494d90617bb9565b91505061486b565b508192505050919050565b61496861651f565b61497061651f565b600061497b84612048565b905060005b816020015151811015614a15576000826020015182815181106149a6576149a5617af8565b5b60200260200101519050600061ffff16816000015161ffff16036149da576149cd8161483d565b8460000181905250614a01565b600161ffff16816000015161ffff1603614a00576149f781612220565b84602001819052505b5b508080614a0d90617bb9565b915050614980565b508192505050919050565b60608060008360200151511115614ae957600267ffffffffffffffff811115614a4c57614a4b616df7565b5b604051908082528060200260200182016040528015614a8557816020015b614a726163e3565b815260200190600190039081614a6a5790505b509050614a976000846000015161502f565b81600081518110614aab57614aaa617af8565b5b6020026020010181905250614ac56001846020015161502f565b81600181518110614ad957614ad8617af8565b5b6020026020010181905250614b6f565b600167ffffffffffffffff811115614b0457614b03616df7565b5b604051908082528060200260200182016040528015614b3d57816020015b614b2a6163e3565b815260200190600190039081614b225790505b509050614b4f6000846000015161502f565b81600081518110614b6357614b62617af8565b5b60200260200101819052505b614b7761640e565b818160200181905250614b8981612335565b92505050919050565b8183820152505050565b614ba46166f1565b614bac6166f1565b6000614bb784612048565b905060005b816020015151811015614c2657600082602001518281518110614be257614be1617af8565b5b60200260200101519050600061ffff16816000015161ffff1603614c1257614c0981612220565b84600001819052505b508080614c1e90617bb9565b915050614bbc565b508192505050919050565b614c39616704565b60405180604001604052806000815260200183604001518152509050919050565b60008180519060200120838051906020012014905092915050565b6000606060006003811115614c8d57614c8c616939565b5b83604001516003811115614ca457614ca3616939565b5b03614d04576000614cb88460c0015161424e565b9050614cd58160200151866060015161506b90919063ffffffff16565b614cfe5760006040518060600160405280602881526020016189cd602891399250925050614e74565b50614e08565b60016003811115614d1857614d17616939565b5b83604001516003811115614d2f57614d2e616939565b5b03614de3576000614d438460c00151614341565b9050600180811115614d5857614d57616939565b5b81602001516001811115614d6f57614d6e616939565b5b14614d9957600060405180608001604052806053815260200161897a605391399250925050614e74565b614db48160800151866060015161506b90919063ffffffff16565b614ddd5760006040518060600160405280602881526020016189cd602891399250925050614e74565b50614e07565b60006040518060600160405280603d8152602001618916603d913991509150614e74565b5b614e348460e0015160400151614e1d85615096565b614e2687615207565b8760e00151606001516153e9565b15614e545760016040518060200160405280600081525091509150614e74565b600060405180606001604052806027815260200161895360279139915091505b9250929050565b6000614ea58260800151614e928460200151615096565b614e9b856155c9565b8560a001516153e9565b9050919050565b6060600483614ebb9190617cff565b92506000614ed1614ecc8585614f53565b615739565b63ffffffff1690506060811560008114614ef657604051915060208201604052614f47565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015614f345780518352602083019250602081019050614f17565b50858552601f19601f8301166040525050505b50809250505092915050565b600082820151905092915050565b614f6961671e565b614f7161671e565b6000614f7c84612048565b905060005b81602001515181101561501657600082602001518281518110614fa757614fa6617af8565b5b60200260200101519050600061ffff16816000015161ffff1603614fdb57614fce816121fa565b8460000181905250615002565b600161ffff16816000015161ffff160361500157614ff8816121fa565b84602001819052505b5b50808061500e90617bb9565b915050614f81565b508192505050919050565b600082820151905092915050565b6150376163e3565b600082905060405180606001604052808561ffff168152602001825163ffffffff1681526020018281525091505092915050565b600061507682611f54565b8051906020012061508684611f54565b8051906020012014905092915050565b6060600060038111156150ac576150ab616939565b5b826040015160038111156150c3576150c2616939565b5b036150e4576150dd6150d88360c0015161424e565b61591a565b9050615202565b600160038111156150f8576150f7616939565b5b8260400151600381111561510f5761510e616939565b5b03615130576151296151248360c00151614341565b61593e565b9050615202565b6002600381111561514457615143616939565b5b8260400151600381111561515b5761515a616939565b5b0361517c576151756151708360c0015161327d565b615962565b9050615202565b60038081111561518f5761518e616939565b5b826040015160038111156151a6576151a5616939565b5b036151c7576151c06151bb8360c001516144f1565b615986565b9050615202565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151f990618573565b60405180910390fd5b919050565b60606000600767ffffffffffffffff81111561522657615225616df7565b5b60405190808252806020026020018201604052801561525f57816020015b61524c6163e3565b8152602001906001900390816152445790505b5090506152716000846000015161502f565b8160008151811061528557615284617af8565b5b602002602001018190525061529f6001846020015161502f565b816001815181106152b3576152b2617af8565b5b60200260200101819052506152e760026152e2856040015160038111156152dd576152dc616939565b5b6159aa565b61226a565b816002815181106152fb576152fa617af8565b5b602002602001018190525061531d60036153188560600151611f54565b6122ff565b8160038151811061533157615330617af8565b5b602002602001018190525061534b600484608001516159c6565b8160048151811061535f5761535e617af8565b5b602002602001018190525061537960058460a001516159c6565b8160058151811061538d5761538c617af8565b5b60200260200101819052506153a760068460c001516122ff565b816006815181106153bb576153ba617af8565b5b60200260200101819052506153ce61640e565b8181602001819052506153e081612335565b92505050919050565b60006154336040518060400160405280601681526020017f4b656363616b32353657697468536563703235366b310000000000000000000081525086614c5a90919063ffffffff16565b615472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161546990618605565b60405180910390fd5b6041825110156154b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016154ae90618671565b60405180910390fd5b601b826040815181106154cd576154cc617af8565b5b602001015160f81c60f81b60f81c6154e5919061869e565b60f81b826040815181106154fc576154fb617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061554761553986615a63565b858051906020012085615abf565b9050601b8360408151811061555f5761555e617af8565b5b602001015160f81c60f81b60f81c61557791906186d5565b60f81b8360408151811061558e5761558d617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080915050949350505050565b60606000600567ffffffffffffffff8111156155e8576155e7616df7565b5b60405190808252806020026020018201604052801561562157816020015b61560e6163e3565b8152602001906001900390816156065790505b5090506156336000846000015161502f565b8160008151811061564757615646617af8565b5b602002602001018190525061566960016156648560200151615b22565b6122ff565b8160018151811061567d5761567c617af8565b5b6020026020010181905250615697600284604001516122ff565b816002815181106156ab576156aa617af8565b5b60200260200101819052506156c960038460600151602001516122ff565b816003815181106156dd576156dc617af8565b5b60200260200101819052506156f76004846080015161502f565b8160048151811061570b5761570a617af8565b5b602002602001018190525061571e61640e565b81816020018190525061573081612335565b92505050919050565b6000808260e01b90506000600467ffffffffffffffff81111561575f5761575e616df7565b5b6040519080825280601f01601f1916602001820160405280156157915781602001600182028036833780820191505090505b509050816003600481106157a8576157a7617af8565b5b1a60f81b816000815181106157c0576157bf617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160026004811061580357615802617af8565b5b1a60f81b8160018151811061581b5761581a617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160016004811061585e5761585d617af8565b5b1a60f81b8160028151811061587657615875617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600481106158b9576158b8617af8565b5b1a60f81b816003815181106158d1576158d0617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061590d826000615d3a565b9050809350505050919050565b606061593782604001518360200151615d6b90919063ffffffff16565b9050919050565b606061595b8260a001518360800151615d6b90919063ffffffff16565b9050919050565b606061597f82608001518360600151615d6b90919063ffffffff16565b9050919050565b60606159a382606001518360400151615d6b90919063ffffffff16565b9050919050565b60008160038111156159bf576159be616939565b5b9050919050565b6159ce6163e3565b6000600867ffffffffffffffff8111156159eb576159ea616df7565b5b6040519080825280601f01601f191660200182016040528015615a1d5781602001600182028036833780820191505090505b509050615a346008615a2e856127d9565b83615eb2565b60405180606001604052808561ffff168152602001600863ffffffff1681526020018281525091505092915050565b6000600282604051615a75919061873a565b602060405180830381855afa158015615a92573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190615ab59190618766565b60001c9050919050565b6000806000615ace8585615ec9565b9150915060006004811115615ae657615ae5616939565b5b816004811115615af957615af8616939565b5b148015615b0557508582145b80615b175750615b16868686615f1a565b5b925050509392505050565b60606000600867ffffffffffffffff811115615b4157615b40616df7565b5b604051908082528060200260200182016040528015615b7a57816020015b615b676163e3565b815260200190600190039081615b5f5790505b509050615b8c6000846000015161502f565b81600081518110615ba057615b9f617af8565b5b6020026020010181905250615bba6001846020015161502f565b81600181518110615bce57615bcd617af8565b5b6020026020010181905250615c026002615bfd85604001516003811115615bf857615bf7616939565b5b6159aa565b61226a565b81600281518110615c1657615c15617af8565b5b6020026020010181905250615c386003615c338560600151611f54565b6122ff565b81600381518110615c4c57615c4b617af8565b5b6020026020010181905250615c66600484608001516159c6565b81600481518110615c7a57615c79617af8565b5b6020026020010181905250615c9460058460a001516159c6565b81600581518110615ca857615ca7617af8565b5b6020026020010181905250615cc260068460c001516122ff565b81600681518110615cd657615cd5617af8565b5b6020026020010181905250615cf86007615cf38560e00151616048565b6122ff565b81600781518110615d0c57615d0b617af8565b5b6020026020010181905250615d1f61640e565b818160200181905250615d3181612335565b92505050919050565b60008251600483615d4b9190617cff565b1115615d5657600080fd5b63ffffffff8260048501015116905092915050565b606060006001811115615d8157615d80616939565b5b83600001516001811115615d9857615d97616939565b5b14615dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615dcf90618805565b60405180910390fd5b60408360200151511015615e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615e1890618871565b60405180910390fd5b600083602001519050600060408251615e3a9190617b56565b90506000604067ffffffffffffffff811115615e5957615e58616df7565b5b6040519080825280601f01601f191660200182016040528015615e8b5781602001600182028036833780820191505090505b50905081602084010151602082015281604084010151604082015280935050505092915050565b828101600881038051848352808252505050505050565b6000806041835103615f0a5760008060006020860151925060408601519150606086015160001a9050615efe8782858561617e565b94509450505050615f13565b60006002915091505b9250929050565b600080600085631626ba7e60e01b8686604051602401615f3b929190618891565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051615fa5919061873a565b600060405180830381855afa9150503d8060008114615fe0576040519150601f19603f3d011682016040523d82523d6000602084013e615fe5565b606091505b5091509150818015615ff957506020815110155b801561603d5750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168180602001905181019061603b9190618766565b145b925050509392505050565b60606000600467ffffffffffffffff81111561606757616066616df7565b5b6040519080825280602002602001820160405280156160a057816020015b61608d6163e3565b8152602001906001900390816160855790505b5090506160b26000846000015161502f565b816000815181106160c6576160c5617af8565b5b60200260200101819052506160e0600184602001516122ff565b816001815181106160f4576160f3617af8565b5b602002602001018190525061610e6002846040015161502f565b8160028151811061612257616121617af8565b5b602002602001018190525061613c600384606001516122ff565b816003815181106161505761614f617af8565b5b602002602001018190525061616361640e565b81816020018190525061617581612335565b92505050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156161b957600060039150915061622b565b6000600187878787604051600081526020016040526040516161de94939291906188d0565b6020604051602081039080840390855afa158015616200573d6000803e3d6000fd5b505050602060405103519050600081036162225760006001925092505061622b565b80600092509250505b94509492505050565b82805461624090617618565b90600052602060002090601f01602090048101928261626257600085556162a9565b82601f1061627b57803560ff19168380011785556162a9565b828001600101855582156162a9579182015b828111156162a857823582559160200191906001019061628d565b5b5090506162b69190616738565b5090565b8280546162c690617618565b90600052602060002090601f0160209004810192826162e8576000855561632f565b82601f1061630157805160ff191683800117855561632f565b8280016001018555821561632f579182015b8281111561632e578251825591602001919060010190616313565b5b50905061633c9190616738565b5090565b60405180610100016040528060608152602001606081526020016000600381111561636e5761636d616939565b5b815260200161637b6163b7565b8152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001606081526020016163b16165f9565b81525090565b6040518060400160405280600060018111156163d6576163d5616939565b5b8152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b604051806101200160405280600063ffffffff168152602001600063ffffffff168152602001606081526020016164616164d8565b815260200161646e6166c4565b8152602001600063ffffffff1681526020016060815260200160608152602001606081525090565b6040518060c00160405280606081526020016164b0616340565b8152602001606081526020016164c4616704565b815260200160608152602001606081525090565b6040518060a0016040528060608152602001606081526020016000600281111561650557616504616939565b5b81526020016165126163b7565b8152602001606081525090565b604051806040016040528060608152602001606081525090565b82805461654590617618565b90600052602060002090601f01602090048101928261656757600085556165ae565b82601f1061658057805160ff19168380011785556165ae565b828001600101855582156165ae579182015b828111156165ad578251825591602001919060010190616592565b5b5090506165bb9190616738565b5090565b60405180608001604052806165d26166f1565b81526020016165df6166c4565b8152602001600063ffffffff168152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b60405180606001604052806060815260200161663b6163b7565b8152602001606081525090565b6040518060c00160405280606081526020016000600181111561666e5761666d616939565b5b815260200160608152602001606081526020016166896163b7565b8152602001606081525090565b604051806080016040528060608152602001606081526020016166b76163b7565b8152602001606081525090565b60405180606001604052806166d761671e565b815260200160008019168152602001600080191681525090565b6040518060200160405280606081525090565b604051806040016040528060008152602001606081525090565b604051806040016040528060608152602001606081525090565b5b80821115616751576000816000905550600101616739565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261678e5761678d616769565b5b8235905067ffffffffffffffff8111156167ab576167aa61676e565b5b6020830191508360018202830111156167c7576167c6616773565b5b9250929050565b600080602083850312156167e5576167e461675f565b5b600083013567ffffffffffffffff81111561680357616802616764565b5b61680f85828601616778565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561685557808201518184015260208101905061683a565b83811115616864576000848401525b50505050565b6000601f19601f8301169050919050565b60006168868261681b565b6168908185616826565b93506168a0818560208601616837565b6168a98161686a565b840191505092915050565b600060208201905081810360008301526168ce818461687b565b905092915050565b6000819050919050565b6168e9816168d6565b81146168f457600080fd5b50565b600081359050616906816168e0565b92915050565b6000602082840312156169225761692161675f565b5b6000616930848285016168f7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061697957616978616939565b5b50565b600081905061698a82616968565b919050565b600061699a8261697c565b9050919050565b6169aa8161698f565b82525050565b60006020820190506169c560008301846169a1565b92915050565b600063ffffffff82169050919050565b6169e4816169cb565b81146169ef57600080fd5b50565b600081359050616a01816169db565b92915050565b600080600060408486031215616a2057616a1f61675f565b5b600084013567ffffffffffffffff811115616a3e57616a3d616764565b5b616a4a86828701616778565b93509350506020616a5d868287016169f2565b9150509250925092565b60008115159050919050565b616a7c81616a67565b82525050565b6000602082019050616a976000830184616a73565b92915050565b6000616aa8826168d6565b9050919050565b616ab881616a9d565b8114616ac357600080fd5b50565b600081359050616ad581616aaf565b92915050565b600060208284031215616af157616af061675f565b5b6000616aff84828501616ac6565b91505092915050565b60038110616b1557600080fd5b50565b600081359050616b2781616b08565b92915050565b600060208284031215616b4357616b4261675f565b5b6000616b5184828501616b18565b91505092915050565b616b6381616a9d565b82525050565b6000602082019050616b7e6000830184616b5a565b92915050565b6000819050919050565b616b9781616b84565b8114616ba257600080fd5b50565b600081359050616bb481616b8e565b92915050565b600060208284031215616bd057616bcf61675f565b5b6000616bde84828501616ba5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000616c0e82616be7565b616c188185616bf2565b9350616c28818560208601616837565b616c318161686a565b840191505092915050565b60006020820190508181036000830152616c568184616c03565b905092915050565b616c67816168d6565b82525050565b6000602082019050616c826000830184616c5e565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b616cbd8161698f565b82525050565b6000616ccf8383616cb4565b60208301905092915050565b6000602082019050919050565b6000616cf382616c88565b616cfd8185616c93565b9350616d0883616ca4565b8060005b83811015616d39578151616d208882616cc3565b9750616d2b83616cdb565b925050600181019050616d0c565b5085935050505092915050565b60006020820190508181036000830152616d608184616ce8565b905092915050565b616d71816169cb565b82525050565b6000602082019050616d8c6000830184616d68565b92915050565b600080600060408486031215616dab57616daa61675f565b5b600084013567ffffffffffffffff811115616dc957616dc8616764565b5b616dd586828701616778565b93509350506020616de8868287016168f7565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b616e2f8261686a565b810181811067ffffffffffffffff82111715616e4e57616e4d616df7565b5b80604052505050565b6000616e61616755565b9050616e6d8282616e26565b919050565b600067ffffffffffffffff821115616e8d57616e8c616df7565b5b616e968261686a565b9050602081019050919050565b82818337600083830152505050565b6000616ec5616ec084616e72565b616e57565b905082815260208101848484011115616ee157616ee0616df2565b5b616eec848285616ea3565b509392505050565b600082601f830112616f0957616f08616769565b5b8135616f19848260208601616eb2565b91505092915050565b600060208284031215616f3857616f3761675f565b5b600082013567ffffffffffffffff811115616f5657616f55616764565b5b616f6284828501616ef4565b91505092915050565b7f6e6f2070746320747275737420726f6f7420666f756e64000000000000000000600082015250565b6000616fa1601783616bf2565b9150616fac82616f6b565b602082019050919050565b60006020820190508181036000830152616fd081616f94565b9050919050565b7f6e6f207074632076657269667920616e63686f7220666f756e64000000000000600082015250565b600061700d601a83616bf2565b915061701882616fd7565b602082019050919050565b6000602082019050818103600083015261703c81617000565b9050919050565b7f6e6f207074632076656966696572207365740000000000000000000000000000600082015250565b6000617079601283616bf2565b915061708482617043565b602082019050919050565b600060208201905081810360008301526170a88161706c565b9050919050565b600082825260208201905092915050565b60006170cb8261681b565b6170d581856170af565b93506170e5818560208601616837565b6170ee8161686a565b840191505092915050565b6000604083016000830151848203600086015261711682826170c0565b9150506020830151848203602086015261713082826170c0565b9150508091505092915050565b617146816169cb565b82525050565b600082825260208201905092915050565b600061716882616be7565b617172818561714c565b9350617182818560208601616837565b61718b8161686a565b840191505092915050565b600281106171a7576171a6616939565b5b50565b60008190506171b882617196565b919050565b60006171c8826171aa565b9050919050565b6171d8816171bd565b82525050565b60006040830160008301516171f660008601826171cf565b506020830151848203602086015261720e82826170c0565b9150508091505092915050565b600060a0830160008301518482036000860152617238828261715d565b91505060208301518482036020860152617252828261715d565b91505060408301516172676040860182616cb4565b506060830151848203606086015261727f82826171de565b9150506080830151848203608086015261729982826170c0565b9150508091505092915050565b600060408301600083015184820360008601526172c3828261715d565b915050602083015184820360208601526172dd828261715d565b9150508091505092915050565b6172f381616b84565b82525050565b6000606083016000830151848203600086015261731682826172a6565b915050602083015161732b60208601826172ea565b50604083015161733e60408601826172ea565b508091505092915050565b600061012083016000830151617362600086018261713d565b506020830151617375602086018261713d565b506040830151848203604086015261738d82826170c0565b915050606083015184820360608601526173a7828261721b565b915050608083015184820360808601526173c182826172f9565b91505060a08301516173d660a086018261713d565b5060c083015184820360c08601526173ee828261715d565b91505060e083015184820360e086015261740882826170c0565b91505061010083015184820361010086015261742482826170c0565b9150508091505092915050565b6000604082019050818103600083015261744b81856170f9565b9050818103602083015261745f8184617349565b90509392505050565b61747181616a67565b811461747c57600080fd5b50565b60008151905061748e81617468565b92915050565b6000602082840312156174aa576174a961675f565b5b60006174b88482850161747f565b91505092915050565b7f6661696c656420746f2076657269667920747062746100000000000000000000600082015250565b60006174f7601683616bf2565b9150617502826174c1565b602082019050919050565b60006020820190508181036000830152617526816174ea565b9050919050565b61753681616b84565b82525050565b6000819050919050565b600061756161755c617557846169cb565b61753c565b6168d6565b9050919050565b61757181617546565b82525050565b600060408201905061758c600083018561752d565b6175996020830184617568565b9392505050565b600081905092915050565b60006175b783856175a0565b93506175c4838584616ea3565b82840190509392505050565b60006175dd8284866175ab565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061763057607f821691505b602082108103617643576176426175e9565b5b50919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b60006176a5602783616bf2565b91506176b082617649565b604082019050919050565b600060208201905081810360008301526176d481617698565b9050919050565b7f5074634875623a20696e76616c6964206d6f6e69746f72207665726966696572600082015250565b6000617711602083616bf2565b915061771c826176db565b602082019050919050565b6000602082019050818103600083015261774081617704565b9050919050565b7f27747062746127206e6f7420666f756e64000000000000000000000000000000600082015250565b600061777d601183616bf2565b915061778882617747565b602082019050919050565b600060208201905081810360008301526177ac81617770565b9050919050565b600060208301600083015184820360008601526177d082826170c0565b9150508091505092915050565b600060808301600083015184820360008601526177fa82826177b3565b9150506020830151848203602086015261781482826172f9565b9150506040830151617829604086018261713d565b506060830151848203606086015261784182826170c0565b9150508091505092915050565b600060408201905081810360008301526178688185617349565b9050818103602083015261787c81846177dd565b90509392505050565b600060608301600083015184820360008601526178a282826172a6565b91505060208301516178b760208601826172ea565b5060408301516178ca60408601826172ea565b508091505092915050565b600060408201905081810360008301526178ef8185617885565b90506178fe6020830184616a73565b9392505050565b7f766572696679206e6f7420706173730000000000000000000000000000000000600082015250565b600061793b600f83616bf2565b915061794682617905565b602082019050919050565b6000602082019050818103600083015261796a8161792e565b9050919050565b6000604082019050617986600083018561752d565b6179936020830184616c5e565b9392505050565b60006020820190506179af600083018461752d565b92915050565b6000815190506179c481616b08565b92915050565b6000602082840312156179e0576179df61675f565b5b60006179ee848285016179b5565b91505092915050565b7f70746320766572696669657220616c7265616479206578697374730000000000600082015250565b6000617a2d601b83616bf2565b9150617a38826179f7565b602082019050919050565b60006020820190508181036000830152617a5c81617a20565b9050919050565b6000604082019050617a7860008301856169a1565b617a856020830184616b5a565b9392505050565b7f707463207665726966696572206e6f7420657869737473000000000000000000600082015250565b6000617ac2601783616bf2565b9150617acd82617a8c565b602082019050919050565b60006020820190508181036000830152617af181617ab5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000617b61826168d6565b9150617b6c836168d6565b925082821015617b7f57617b7e617b27565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000617bc4826168d6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203617bf657617bf5617b27565b5b600182019050919050565b7f676574436572744f776e65724f69643a20636572742074797065206e6f74207360008201527f7570706f72740000000000000000000000000000000000000000000000000000602082015250565b6000617c5d602683616bf2565b9150617c6882617c01565b604082019050919050565b60006020820190508181036000830152617c8c81617c50565b9050919050565b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b6000617cc9601783616bf2565b9150617cd482617c93565b602082019050919050565b60006020820190508181036000830152617cf881617cbc565b9050919050565b6000617d0a826168d6565b9150617d15836168d6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115617d4a57617d49617b27565b5b828201905092915050565b6000617d60826169cb565b9150617d6b836169cb565b92508263ffffffff03821115617d8457617d83617b27565b5b828201905092915050565b7f7661724279746573546f4279746573426967456e6469616e3a206f666673657460008201527f2069732067726561746572207468616e20746865206f7574707574206c656e6760208201527f7468000000000000000000000000000000000000000000000000000000000000604082015250565b6000617e11604283616bf2565b9150617e1c82617d8f565b606082019050919050565b60006020820190508181036000830152617e4081617e04565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617e7d602083616bf2565b9150617e8882617e47565b602082019050919050565b60006020820190508181036000830152617eac81617e70565b9050919050565b7f333262797465732062696720696e7465676572206174206d6f737420666f722060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b6000617f0f602383616bf2565b9150617f1a82617eb3565b604082019050919050565b60006020820190508181036000830152617f3e81617f02565b9050919050565b7f696e76616c69642063726f7373636861696e206c616e65000000000000000000600082015250565b6000617f7b601783616bf2565b9150617f8682617f45565b602082019050919050565b60006020820190508181036000830152617faa81617f6e565b9050919050565b7f77726f6e67207479706520666f72206263646e7320726f6f7420636572740000600082015250565b6000617fe7601e83616bf2565b9150617ff282617fb1565b602082019050919050565b6000602082019050818103600083015261801681617fda565b9050919050565b600081905092915050565b600061803382616be7565b61803d818561801d565b935061804d818560208601616837565b80840191505092915050565b60006180658284618028565b915081905092915050565b7f697373756572206e6f7420666f756e6400000000000000000000000000000000600082015250565b60006180a6601083616bf2565b91506180b182618070565b602082019050919050565b600060208201905081810360008301526180d581618099565b9050919050565b60008190508160005260206000209050919050565b600081546180fe81617618565b618108818661801d565b94506001821660008114618123576001811461813457618167565b60ff19831686528186019350618167565b61813d856180dc565b60005b8381101561815f57815481890152600182019150602081019050618140565b838801955050505b50505092915050565b600061817c82846180f1565b915081905092915050565b7f70746320747275737420726f6f742073696720696e76616c6964000000000000600082015250565b60006181bd601a83616bf2565b91506181c882618187565b602082019050919050565b600060208201905081810360008301526181ec816181b0565b9050919050565b7f544c564974656d4d617056616c756553747265616d3a206f6666657374206f7560008201527f74206f6620627566666572000000000000000000000000000000000000000000602082015250565b600061824f602b83616bf2565b915061825a826181f3565b604082019050919050565b6000602082019050818103600083015261827e81618242565b9050919050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b60006182e1602383616bf2565b91506182ec82618285565b604082019050919050565b60006020820190508181036000830152618310816182d4565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b600061834d600e83616bf2565b915061835882618317565b602082019050919050565b6000602082019050818103600083015261837c81618340565b9050919050565b60008160011c9050919050565b6000808291508390505b60018511156183da578086048111156183b6576183b5617b27565b5b60018516156183c55780820291505b80810290506183d385618383565b945061839a565b94509492505050565b6000826183f357600190506184af565b8161840157600090506184af565b8160018114618417576002811461842157618450565b60019150506184af565b60ff84111561843357618432617b27565b5b8360020a91508482111561844a57618449617b27565b5b506184af565b5060208310610133831016604e8410600b84101617156184855782820a9050838111156184805761847f617b27565b5b6184af565b6184928484846001618390565b925090508184048111156184a9576184a8617b27565b5b81810290505b9392505050565b60006184c1826168d6565b91506184cc836168d6565b92506184f97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846183e3565b905092915050565b7f6765745261775075626c69634b65793a20636572742074797065206e6f74207360008201527f7570706f72740000000000000000000000000000000000000000000000000000602082015250565b600061855d602683616bf2565b915061856882618501565b604082019050919050565b6000602082019050818103600083015261858c81618550565b9050919050565b7f6f6e6c7920737570706f7274204b454343414b3235365f574954485f5345435060008201527f3235364b31207369676e6174757265206e6f7700000000000000000000000000602082015250565b60006185ef603383616bf2565b91506185fa82618593565b604082019050919050565b6000602082019050818103600083015261861e816185e2565b9050919050565b7f77726f6e6720736563703235366b3120736967206c656e677468000000000000600082015250565b600061865b601a83616bf2565b915061866682618625565b602082019050919050565b6000602082019050818103600083015261868a8161864e565b9050919050565b600060ff82169050919050565b60006186a982618691565b91506186b483618691565b92508260ff038211156186ca576186c9617b27565b5b828201905092915050565b60006186e082618691565b91506186eb83618691565b9250828210156186fe576186fd617b27565b5b828203905092915050565b60006187148261681b565b61871e81856175a0565b935061872e818560208601616837565b80840191505092915050565b60006187468284618709565b915081905092915050565b60008151905061876081616b8e565b92915050565b60006020828403121561877c5761877b61675f565b5b600061878a84828501618751565b91505092915050565b7f6f6e6c7920737570706f727420583530395f5055424c49435f4b45595f494e4660008201527f4f206e6f77000000000000000000000000000000000000000000000000000000602082015250565b60006187ef602583616bf2565b91506187fa82618793565b604082019050919050565b6000602082019050818103600083015261881e816187e2565b9050919050565b7f7075626c6963206b6579206c656e677468206e6f7420656e6f75746800000000600082015250565b600061885b601c83616bf2565b915061886682618825565b602082019050919050565b6000602082019050818103600083015261888a8161884e565b9050919050565b60006040820190506188a6600083018561752d565b81810360208301526188b8818461687b565b90509392505050565b6188ca81618691565b82525050565b60006080820190506188e5600083018761752d565b6188f260208301866188c1565b6188ff604083018561752d565b61890c606083018461752d565b9594505050505056fe63726f7373636861696e20636572742076616c69646174696f6e3a2074797065206f66207369676e65722063657274206d757374206265206263646e7363726f7373636861696e20636572742076616c69646174696f6e3a20696e76616c69642073696763726f7373636861696e20636572742076616c69646174696f6e3a2072657175697265206263646e7320726f6f74206f7220646f6d61696e207370616365206f776e65722063657274206173207369676e657263726f7373636861696e20636572742076616c69646174696f6e3a2077726f6e67207369676e6572a3646970667358221220179bcc44ceaa9aab24594e14cff7454aa52b71af896df615a3d59105d3b7e4d064736f6c637827302e382e31342d63692e323032322e362e32302b636f6d6d69742e66633963623232362e6d6f646b636f6d70696c655f6d6f6461310066 \ No newline at end of file diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/PtcHub_sol_PtcHub.bin b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/PtcHub_sol_PtcHub.bin index 0b1ee4d5..e077e3a0 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/PtcHub_sol_PtcHub.bin +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/PtcHub_sol_PtcHub.bin @@ -1 +1 @@ -6080604052348015630000001257600080fd5b50604051630000bb21380380630000bb218339818101604052810190630000003c91906300002c0c565b63000000606300000053630000007b60201b60201c565b630000008360201b60201c565b63000000738163000000c260201b60201c565b5063000034a3565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b600063000000dd8263000002a960201b6300001adf1760201c565b90506000600381111563000000f95763000000f86300002c65565b5b8160400151600381111563000001165763000001156300002c65565b5b14630000015c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016300000153906300002cf9565b60405180910390fd5b6000630000018f630000017c8363000005cf60201b6300001d1b1760201c565b63000007a660201b6300001e821760201c565b8051906020012090508260016040518060400160405280600481526020017f726f6f740000000000000000000000000000000000000000000000000000000081525060405163000001e291906300002d70565b90815260200160405180910390209080519060200190630000020792919063000026c9565b506040518060400160405280600481526020017f726f6f740000000000000000000000000000000000000000000000000000000081525060026000838152602001908152602001600020908051906020019063000002689291906300002765565b507f7c787bfbe942686b5f41acec151012ca79c6b81c1c5a23cee512781cf3d5b9bb81604051630000029c91906300002da8565b60405180910390a1505050565b63000002b56300002801565b63000002c16300002801565b600063000002dc8463000008fe60201b6300001f761760201c565b905060005b81602001515181101563000005c457600082602001518281518110630000030f57630000030e6300002dc7565b5b60200260200101519050600061ffff16816000015161ffff16036300000357576300000348816300000b4060201b63000021281760201c565b846000018190525063000005aa565b600161ffff16816000015161ffff16036300000395576300000386816300000b4060201b63000021281760201c565b846020018190525063000005a9565b600261ffff16816000015161ffff160363000004215763000003c4816300000b4e60201b63000021361760201c565b60ff16600381111563000003df5763000003de6300002c65565b5b8460400190600381111563000003fc5763000003fb6300002c65565b5b9081600381111563000004165763000004156300002c65565b5b8152505063000005a8565b600361ffff16816000015161ffff160363000004715763000004626300000455826300000b7660201b630000214e1760201c565b6300000b8460201b60201c565b846060018190525063000005a7565b600461ffff16816000015161ffff160363000004c65763000004a0816300000cde60201b630000215c1760201c565b846080019067ffffffffffffffff16908167ffffffffffffffff168152505063000005a6565b600561ffff16816000015161ffff1603630000051b5763000004f5816300000cde60201b630000215c1760201c565b8460a0019067ffffffffffffffff16908167ffffffffffffffff168152505063000005a5565b600661ffff16816000015161ffff1603630000055957630000054a816300000b7660201b630000214e1760201c565b8460c0018190525063000005a4565b600761ffff16816000015161ffff160363000005a357630000059a630000058d826300000b7660201b630000214e1760201c565b6300000d1e60201b60201c565b8460e001819052505b5b5b5b5b5b5b5b50808063000005ba906300002e2f565b91505063000002e1565b508192505050919050565b63000005db6300002886565b6000600381111563000005f55763000005f46300002c65565b5b8260400151600381111563000006125763000006116300002c65565b5b03630000063d5763000006308260c001516300000ea860201b60201c565b60200151905063000007a1565b6001600381111563000006575763000006566300002c65565b5b8260400151600381111563000006745763000006736300002c65565b5b03630000069f5763000006928260c00151630000100560201b60201c565b60800151905063000007a1565b6002600381111563000006b95763000006b86300002c65565b5b8260400151600381111563000006d65763000006d56300002c65565b5b0363000007015763000006f48260c00151630000126d60201b60201c565b60600151905063000007a1565b600380811115630000071a5763000007196300002c65565b5b8260400151600381111563000007375763000007366300002c65565b5b0363000007625763000007558260c00151630000149660201b60201c565b60400151905063000007a1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016300000798906300002efb565b60405180910390fd5b919050565b60606000600267ffffffffffffffff81111563000007cb5763000007ca6300002a7f565b5b604051908082528060200260200182016040528015630000080c57816020015b63000007f763000028b8565b81526020019060019003908163000007eb5790505b509050630000085e6000630000084b8560000151600181111563000008385763000008376300002c65565b5b630000163260201b630000217c1760201c565b630000165460201b63000021981760201c565b8160008151811063000008785763000008776300002dc7565b5b602002602001018190525063000008a260018460200151630000170560201b630000222d1760201c565b8160018151811063000008bc5763000008bb6300002dc7565b5b602002602001018190525063000008d363000028e3565b81816020018190525063000008f581630000173f60201b63000022631760201c565b92505050919050565b630000090a63000028e3565b6006825110156300000955576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401630000094c906300002f73565b60405180910390fd5b6000630000096363000028e3565b63000009956300000982858463000018f960201b630000237f1760201c565b630000192e60201b63000023ae1760201c565b816000019061ffff16908161ffff168152505060068263000009b991906300002f97565b91506000808390505b85518110156300000a4f576300000a0f63000009fc8760028463000009e991906300002f97565b6300001a8360201b63000024d91760201c565b6300001aba60201b630000250a1760201c565b60066300000a1f9190630000300b565b63ffffffff16816300000a3491906300002f97565b905081806300000a45906300002e2f565b92505063000009c2565b60008267ffffffffffffffff8111156300000a71576300000a706300002a7f565b5b6040519080825280602002602001820160405280156300000ab257816020015b6300000a9d63000028b8565b8152602001906001900390816300000a915790505b509050600092505b86518510156300000b2a576300000ad163000028b8565b6300000ae588876300001cdd60201b60201c565b8097508192505050808285806300000afe906300002e2f565b9650815181106300000b17576300000b166300002dc7565b5b6020026020010181905250506300000aba565b8084602001819052508395505050505050919050565b606081604001519050919050565b60006300000b6f600183604001516300001e9560201b63000026eb1760201c565b9050919050565b606081604001519050919050565b6300000b906300002886565b6300000b9c6300002886565b60006300000bb78463000008fe60201b6300001f761760201c565b905060005b8160200151518110156300000cd3576000826020015182815181106300000bea576300000be96300002dc7565b5b60200260200101519050600061ffff16816000015161ffff16036300000c80576300000c23816300000b4e60201b63000021361760201c565b60ff1660018111156300000c3e576300000c3d6300002c65565b5b846000019060018111156300000c5b576300000c5a6300002c65565b5b908160018111156300000c75576300000c746300002c65565b5b815250506300000cb9565b600161ffff16816000015161ffff16036300000cb8576300000caf816300000b7660201b630000214e1760201c565b84602001819052505b5b5080806300000cc9906300002e2f565b9150506300000bbc565b508192505050919050565b60006300000d176300000d04600884604001516300001ea360201b63000026f91760201c565b6300001eb160201b63000027071760201c565b9050919050565b6300000d2a6300002901565b6300000d366300002901565b60006300000d518463000008fe60201b6300001f761760201c565b905060005b8160200151518110156300000e9d576000826020015182815181106300000d84576300000d836300002dc7565b5b60200260200101519050600061ffff16816000015161ffff16036300000dcc576300000dbd816300000b4060201b63000021281760201c565b84600001819052506300000e83565b600161ffff16816000015161ffff16036300000e0a576300000dfb816300000b7660201b630000214e1760201c565b84602001819052506300000e82565b600261ffff16816000015161ffff16036300000e48576300000e39816300000b4060201b63000021281760201c565b84604001819052506300000e81565b600361ffff16816000015161ffff16036300000e80576300000e77816300000b7660201b630000214e1760201c565b84606001819052505b5b5b5b5080806300000e93906300002e2f565b9150506300000d56565b508192505050919050565b6300000eb46300002929565b6300000ec06300002929565b60006300000edb8463000008fe60201b6300001f761760201c565b905060005b8160200151518110156300000ffa576000826020015182815181106300000f0e576300000f0d6300002dc7565b5b60200260200101519050600061ffff16816000015161ffff16036300000f56576300000f47816300000b4060201b63000021281760201c565b84600001819052506300000fe0565b600161ffff16816000015161ffff16036300000fa6576300000f976300000f8a826300000b7660201b630000214e1760201c565b6300000b8460201b60201c565b84602001819052506300000fdf565b600261ffff16816000015161ffff16036300000fde576300000fd5816300000b7660201b630000214e1760201c565b84604001819052505b5b5b5080806300000ff0906300002e2f565b9150506300000ee0565b508192505050919050565b63000010116300002954565b630000101d6300002954565b600063000010388463000008fe60201b6300001f761760201c565b905060005b816020015151811015630000126257600082602001518281518110630000106b57630000106a6300002dc7565b5b60200260200101519050600061ffff16816000015161ffff160363000010b35763000010a4816300000b4060201b63000021281760201c565b84600001819052506300001248565b600161ffff16816000015161ffff1603630000113f5763000010e2816300000b4e60201b63000021361760201c565b60ff16600181111563000010fd5763000010fc6300002c65565b5b84602001906001811115630000111a5763000011196300002c65565b5b9081600181111563000011345763000011336300002c65565b5b815250506300001247565b600261ffff16816000015161ffff1603630000117d57630000116e816300000b4060201b63000021281760201c565b84604001819052506300001246565b600361ffff16816000015161ffff160363000011bb5763000011ac816300000b4060201b63000021281760201c565b84606001819052506300001245565b600461ffff16816000015161ffff1603630000120b5763000011fc63000011ef826300000b7660201b630000214e1760201c565b6300000b8460201b60201c565b84608001819052506300001244565b600561ffff16816000015161ffff1603630000124357630000123a816300000b7660201b630000214e1760201c565b8460a001819052505b5b5b5b5b5b5080806300001258906300002e2f565b915050630000103d565b508192505050919050565b630000127963000029ac565b630000128563000029ac565b600063000012a08463000008fe60201b6300001f761760201c565b905060005b816020015151811015630000148b5760008260200151828151811063000012d35763000012d26300002dc7565b5b60200260200101519050600061ffff16816000015161ffff1603630000131b57630000130c816300000b4060201b63000021281760201c565b84600001819052506300001471565b600161ffff16816000015161ffff1603630000135957630000134a816300000b4060201b63000021281760201c565b84602001819052506300001470565b600261ffff16816000015161ffff160363000013e5576300001388816300000b4e60201b63000021361760201c565b60ff16600281111563000013a35763000013a26300002c65565b5b8460400190600281111563000013c05763000013bf6300002c65565b5b9081600281111563000013da5763000013d96300002c65565b5b81525050630000146f565b600361ffff16816000015161ffff160363000014355763000014266300001419826300000b7660201b630000214e1760201c565b6300000b8460201b60201c565b8460600181905250630000146e565b600461ffff16816000015161ffff1603630000146d576300001464816300000b7660201b630000214e1760201c565b84608001819052505b5b5b5b5b5080806300001481906300002e2f565b91505063000012a5565b508192505050919050565b63000014a263000029fd565b63000014ae63000029fd565b600063000014c98463000008fe60201b6300001f761760201c565b905060005b81602001515181101563000016275760008260200151828151811063000014fc5763000014fb6300002dc7565b5b60200260200101519050600061ffff16816000015161ffff16036300001544576300001535816300000b4060201b63000021281760201c565b8460000181905250630000160d565b600161ffff16816000015161ffff16036300001582576300001573816300000b4060201b63000021281760201c565b8460200181905250630000160c565b600361ffff16816000015161ffff160363000015d25763000015c363000015b6826300000b7660201b630000214e1760201c565b6300000b8460201b60201c565b8460400181905250630000160b565b600461ffff16816000015161ffff1603630000160a576300001601816300000b7660201b630000214e1760201c565b84606001819052505b5b5b5b508080630000161d906300002e2f565b91505063000014ce565b508192505050919050565b6000816001811115630000164d57630000164c6300002c65565b5b9050919050565b630000166063000028b8565b6000600167ffffffffffffffff81111563000016835763000016826300002a7f565b5b6040519080825280601f01601f19166020018201604052801563000016b75781602001600182028036833780820191505090505b50905063000016d660018483630000227060201b6300002a541760201c565b60405180606001604052808561ffff168152602001600163ffffffff1681526020018281525091505092915050565b630000171163000028b8565b60405180606001604052808461ffff168152602001835163ffffffff16815260200183815250905092915050565b60606000630000175c83630000228760201b6300002a6b1760201c565b9050600060068263000017719190630000300b565b63ffffffff1667ffffffffffffffff81111563000017965763000017956300002a7f565b5b6040519080825280601f01601f19166020018201604052801563000017ca5781602001600182028036833780820191505090505b5090506300001805600263000017f18660000151630000192e60201b63000023ae1760201c565b83630000232d60201b6300002aeb1760201c565b630000183960066300001825846300001aba60201b630000250a1760201c565b83630000234460201b6300002b021760201c565b60006006905060005b630000185b86630000235b60201b6300002b191760201c565b81101563000018ed57600063000018a38760200151838151811063000018885763000018876300002dc7565b5b6020026020010151630000236a60201b6300002b281760201c565b905063000018c0838286630000247860201b6300002bda1760201c565b80518363000018d191906300002f97565b925050808063000018e3906300002e2f565b9150506300001842565b50819350505050919050565b60008251600283630000190e91906300002f97565b1115630000191b57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff811115630000195a5763000019596300002a7f565b5b6040519080825280601f01601f191660200182016040528015630000198e5781602001600182028036833780820191505090505b5090508160016002811063000019ab5763000019aa6300002dc7565b5b1a60f81b8160008151811063000019c95763000019c86300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600281106300001a12576300001a116300002dc7565b5b1a60f81b816001815181106300001a30576300001a2f6300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006300001a7682600063000018f960201b60201c565b9050809350505050919050565b600082516004836300001a9891906300002f97565b11156300001aa557600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff8111156300001ae6576300001ae56300002a7f565b5b6040519080825280601f01601f1916602001820160405280156300001b1a5781602001600182028036833780820191505090505b509050816003600481106300001b37576300001b366300002dc7565b5b1a60f81b816000815181106300001b55576300001b546300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816002600481106300001b9e576300001b9d6300002dc7565b5b1a60f81b816001815181106300001bbc576300001bbb6300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816001600481106300001c05576300001c046300002dc7565b5b1a60f81b816002815181106300001c23576300001c226300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600481106300001c6c576300001c6b6300002dc7565b5b1a60f81b816003815181106300001c8a576300001c896300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006300001cd08260006300001a8360201b60201c565b9050809350505050919050565b6300001ce963000028b8565b6000828451116300001d34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016300001d2b9063000030cd565b60405180910390fd5b60068310156300001d7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016300001d75906300003145565b60405180910390fd5b6300001d8a63000028b8565b6300001dbc6300001da9868663000018f960201b630000237f1760201c565b630000192e60201b63000023ae1760201c565b816000019061ffff16908161ffff16815250506002846300001de091906300002f97565b93506300001e146300001e0186866300001a8360201b63000024d91760201c565b6300001aba60201b630000250a1760201c565b816020019063ffffffff16908163ffffffff16815250506004846300001e3c91906300002f97565b93506300001e638585836020015163ffffffff16630000253a60201b6300002c8c1760201c565b8160400181905250806020015163ffffffff16846300001e8591906300002f97565b9350808492509250509250929050565b600082820151905092915050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff8111156300001edd576300001edc6300002a7f565b5b6040519080825280601f01601f1916602001820160405280156300001f115781602001600182028036833780820191505090505b509050816007600881106300001f2e576300001f2d6300002dc7565b5b1a60f81b816000815181106300001f4c576300001f4b6300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816006600881106300001f95576300001f946300002dc7565b5b1a60f81b816001815181106300001fb3576300001fb26300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816005600881106300001ffc576300001ffb6300002dc7565b5b1a60f81b81600281518110630000201a5763000020196300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160046008811063000020635763000020626300002dc7565b5b1a60f81b8160038151811063000020815763000020806300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160036008811063000020ca5763000020c96300002dc7565b5b1a60f81b8160048151811063000020e85763000020e76300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160026008811063000021315763000021306300002dc7565b5b1a60f81b81600581518110630000214f57630000214e6300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160016008811063000021985763000021976300002dc7565b5b1a60f81b8160068151811063000021b65763000021b56300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006008811063000021ff5763000021fe6300002dc7565b5b1a60f81b81600781518110630000221d57630000221c6300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000630000226382600063000025e760201b60201c565b9050809350505050919050565b828101600181038051848352808252505050505050565b6000806000905060005b63000022aa84630000235b60201b6300002b191760201c565b81101563000023235760008460200151828151811063000022d25763000022d16300002dc7565b5b6020026020010151905080604001515160068463000022f39190630000300b565b63ffffffff16630000230791906300002f97565b92505080806300002319906300002e2f565b9150506300002291565b5080915050919050565b828101600281038051848352808252505050505050565b828101600481038051848352808252505050505050565b60008160200151519050919050565b606060006006836020015163000023839190630000300b565b63ffffffff1667ffffffffffffffff81111563000023a85763000023a76300002a7f565b5b6040519080825280601f01601f19166020018201604052801563000023dc5781602001600182028036833780820191505090505b5090506300002417600263000024038560000151630000192e60201b63000023ae1760201c565b83630000232d60201b6300002aeb1760201c565b630000244f6006630000243b85602001516300001aba60201b630000250a1760201c565b83630000234460201b6300002b021760201c565b630000246f6006846040015183630000247860201b6300002bda1760201c565b80915050919050565b60008251905081518163ffffffff1685630000249691906300002f97565b111563000024dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040163000024d4906300003209565b60405180910390fd5b8015600081036300002533578483018051601f84168015602002818801018581018215602002838601015b81831015630000252957825181526020830192506020810190506300002508565b5083855250505050505b5050505050565b606083518284630000254e91906300002f97565b1115630000255b57600080fd5b60008267ffffffffffffffff811115630000257d57630000257c6300002a7f565b5b6040519080825280601f01601f19166020018201604052801563000025b15781602001600182028036833780820191505090505b509050600080602083019150856020880101905063000025da828287630000262260201b60201c565b8293505050509392505050565b6000825160088363000025fc91906300002f97565b1115630000260957600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b6020811063000026715781518352602083630000264291906300002f97565b9250602082630000265591906300002f97565b915060208163000026689190630000322d565b90506300002623565b600081031563000026c4576000600182602063000026919190630000322d565b61010063000026a2919063000033e4565b63000026b09190630000322d565b905080198351168185511681811786525050505b505050565b82805463000026d990630000346a565b90600052602060002090601f01602090048101928263000026ff57600085556300002750565b82601f10630000271c57805160ff19168380011785556300002750565b828001600101855582156300002750579182015b82811115630000274f5782518255916020019190600101906300002730565b5b509050630000276191906300002a2f565b5090565b828054630000277590630000346a565b90600052602060002090601f016020900481019282630000279b576000855563000027ec565b82601f1063000027b857805160ff191683800117855563000027ec565b8280016001018555821563000027ec579182015b8281111563000027eb57825182559160200191906001019063000027cc565b5b50905063000027fd91906300002a2f565b5090565b60405180610100016040528060608152602001606081526020016000600381111563000028355763000028346300002c65565b5b815260200163000028466300002886565b8152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016060815260200163000028806300002901565b81525090565b60405180604001604052806000600181111563000028ab5763000028aa6300002c65565b5b8152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b60405180606001604052806060815260200163000029476300002886565b8152602001606081525090565b6040518060c001604052806060815260200160006001811115630000298057630000297f6300002c65565b5b81526020016060815260200160608152602001630000299f6300002886565b8152602001606081525090565b6040518060a0016040528060608152602001606081526020016000600281111563000029df5763000029de6300002c65565b5b815260200163000029f06300002886565b8152602001606081525090565b604051806080016040528060608152602001606081526020016300002a226300002886565b8152602001606081525090565b5b808211156300002a4c5760008160009055506001016300002a30565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6300002abb826300002a6e565b810181811067ffffffffffffffff821117156300002ae0576300002adf6300002a7f565b5b80604052505050565b60006300002af76300002a50565b90506300002b0782826300002aae565b919050565b600067ffffffffffffffff8211156300002b2d576300002b2c6300002a7f565b5b6300002b3a826300002a6e565b9050602081019050919050565b60005b838110156300002b695780820151818401526020810190506300002b4a565b838111156300002b7a576000848401525b50505050565b60006300002b9b6300002b94846300002b0c565b6300002ae9565b9050828152602081018484840111156300002bbd576300002bbc6300002a69565b5b6300002bcc8482856300002b47565b509392505050565b600082601f8301126300002bef576300002bee6300002a64565b5b81516300002c038482602086016300002b80565b91505092915050565b6000602082840312156300002c28576300002c276300002a5a565b5b600082015167ffffffffffffffff8111156300002c4c576300002c4b6300002a5f565b5b6300002c5c848285016300002bd4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600082825260208201905092915050565b7f77726f6e67207479706520666f72206263646e7320726f6f7420636572740000600082015250565b60006300002cdf601e836300002c94565b91506300002cee826300002ca5565b602082019050919050565b600060208201905081810360008301526300002d16816300002cce565b9050919050565b600081519050919050565b600081905092915050565b60006300002d42826300002d1d565b6300002d5081856300002d28565b93506300002d648185602086016300002b47565b80840191505092915050565b60006300002d8082846300002d33565b915081905092915050565b6000819050919050565b6300002da2816300002d8b565b82525050565b60006020820190506300002dc160008301846300002d95565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006300002e3e826300002e25565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036300002e76576300002e756300002df6565b5b600182019050919050565b7f676574436572744f776e65724f69643a20636572742074797065206e6f74207360008201527f7570706f72740000000000000000000000000000000000000000000000000000602082015250565b60006300002ee16026836300002c94565b91506300002ef0826300002e81565b604082019050919050565b600060208201905081810360008301526300002f18816300002ed0565b9050919050565b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b60006300002f596017836300002c94565b91506300002f68826300002f1f565b602082019050919050565b600060208201905081810360008301526300002f90816300002f48565b9050919050565b60006300002fa6826300002e25565b91506300002fb5836300002e25565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156300002ff0576300002fef6300002df6565b5b828201905092915050565b600063ffffffff82169050919050565b6000630000301a826300002ffb565b91506300003029836300002ffb565b92508263ffffffff0382111563000030485763000030476300002df6565b5b828201905092915050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b600063000030b36023836300002c94565b915063000030c2826300003053565b604082019050919050565b6000602082019050818103600083015263000030ea8163000030a2565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b6000630000312b600e836300002c94565b9150630000313a8263000030f1565b602082019050919050565b60006020820190508181036000830152630000316281630000311a565b9050919050565b7f7661724279746573546f4279746573426967456e6469616e3a206f666673657460008201527f2069732067726561746572207468616e20746865206f7574707574206c656e6760208201527f7468000000000000000000000000000000000000000000000000000000000000604082015250565b600063000031ef6042836300002c94565b915063000031fe826300003169565b606082019050919050565b6000602082019050818103600083015263000032268163000031de565b9050919050565b6000630000323c826300002e25565b9150630000324b836300002e25565b92508282101563000032645763000032636300002df6565b5b828203905092915050565b60008160011c9050919050565b6000808291508390505b600185111563000032d65780860481111563000032aa5763000032a96300002df6565b5b600185161563000032bb5780820291505b808102905063000032cd85630000326f565b94506300003286565b94509492505050565b60008263000032f3576001905063000033dd565b816300003305576000905063000033dd565b816001811463000033215760028114630000332d57630000336a565b600191505063000033dd565b60ff84111563000033455763000033446300002df6565b5b8360020a91508482111563000033625763000033616300002df6565b5b5063000033dd565b5060208310610133831016604e8410600b841016171563000033a95782820a90508381111563000033a25763000033a16300002df6565b5b63000033dd565b63000033ba8484846001630000327c565b9250905081840481111563000033d75763000033d66300002df6565b5b81810290505b9392505050565b600063000033f3826300002e25565b91506300003402836300002e25565b925063000034337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848463000032df565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680630000348457607f821691505b602082108103630000349d57630000349c630000343b565b5b50919050565b61866d8063000034b46000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806395e8fcee116100de578063ae14961d11610097578063d919581711610071578063d91958171461046e578063dde185461461049e578063e1ceb030146104ce578063fe8cc1e3146104fe57610173565b8063ae14961d14610402578063c2450b5014610420578063c3292b6d1461043e57610173565b806395e8fcee146103305780639646a30b1461034c578063a1d6c96414610368578063ad86bc0314610384578063adc64a18146103b4578063adf22b3f146103e457610173565b806355c265fe1161013057806355c265fe1461025c578063715018a61461027857806373d6c7bd146102825780637adcff0c146102b25780638da5cb5b146102e257806390157ffb1461030057610173565b806304802a34146101785780630604420e1461019457806309158b21146101c457806312dabd3a146101f45780631f56086f146102245780632534ddcc14610240575b600080fd5b610192600480360381019061018d91906164e1565b61052e565b005b6101ae60048036038101906101a991906164e1565b61090b565b6040516101bb91906165c7565b60405180910390f35b6101de60048036038101906101d9919061661f565b6109cb565b6040516101eb91906166c3565b60405180910390f35b61020e6004803603810190610209919061671a565b6109ff565b60405161021b9190616795565b60405180910390f35b61023e600480360381019061023991906167ee565b610a5d565b005b61025a600480360381019061025591906167ee565b610ab4565b005b610276600480360381019061027191906164e1565b610b09565b005b610280610e58565b005b61029c600480360381019061029791906164e1565b610e6c565b6040516102a99190616795565b60405180910390f35b6102cc60048036038101906102c79190616840565b610eb2565b6040516102d9919061687c565b60405180910390f35b6102ea610eca565b6040516102f7919061687c565b60405180910390f35b61031a600480360381019061031591906168cd565b610ed3565b604051610327919061694f565b60405180910390f35b61034a600480360381019061034591906164e1565b610f73565b005b610366600480360381019061036191906167ee565b6111ed565b005b610382600480360381019061037d9190616840565b61139b565b005b61039e600480360381019061039991906168cd565b6115eb565b6040516103ab9190616980565b60405180910390f35b6103ce60048036038101906103c991906168cd565b611609565b6040516103db91906165c7565b60405180910390f35b6103ec6116af565b6040516103f99190616a59565b60405180910390f35b61040a61173c565b604051610417919061687c565b60405180910390f35b610428611742565b604051610435919061687c565b60405180910390f35b61045860048036038101906104539190616a7b565b61174c565b6040516104659190616795565b60405180910390f35b6104886004803603810190610483919061671a565b6117a4565b60405161049591906165c7565b60405180910390f35b6104b860048036038101906104b39190616a7b565b61187c565b6040516104c591906165c7565b60405180910390f35b6104e860048036038101906104e39190616c0b565b61194e565b6040516104f591906165c7565b60405180910390f35b610518600480360381019061051391906164e1565b611a04565b60405161052591906165c7565b60405180910390f35b610536612d21565b600061058583838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612d73565b9050610598816060015160600151612f9e565b6105d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ce90616ca0565b60405180910390fd5b60006105ea826060015160600151612fdb565b905060006105fb83604001516130a0565b905061060f8360600151606001518261315c565b61064e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064590616d0c565b60405180910390fd5b600060056000610665856020015160c001516131ab565b60400151600281111561067b5761067a61664c565b5b600281111561068d5761068c61664c565b5b8152602001908152602001600020549050600081036106e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d890616d78565b60405180910390fd5b8063bff3093b6106f986606001516060015185613330565b866040518363ffffffff1660e01b815260040161071792919061711a565b6020604051808303816000875af1158015610736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075a919061717d565b610799576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610790906171f6565b60405180910390fd5b60006107a88560800151613407565b8051906020012090506000600460008381526020019081526020016000209050856020015163ffffffff168160000154101561082f57856020015163ffffffff1681600001819055507f14f6dcf24001d9e8910255539bf10f0a01ba6fcb712bdcd812fe528b9ad798d1828760200151604051610826929190617260565b60405180910390a15b8787826001016000896020015163ffffffff168152602001908152602001600020919061085d929190615fcd565b507f8796377aabd0d7feac50b0be12f810cac9a467a6ccd01c3bb79e50e2da8fd1f2828760200151604051610893929190617260565b60405180910390a160006007541461090157600754631a383f188760e001516040518263ffffffff1660e01b81526004016108ce91906165c7565b600060405180830381600087803b1580156108e857600080fd5b505af11580156108fc573d6000803e3d6000fd5b505050505b5050505050505050565b60606003600084846040516109219291906172b9565b60405180910390208152602001908152602001600020600001805461094590617301565b80601f016020809104026020016040519081016040528092919081815260200182805461097190617301565b80156109be5780601f10610993576101008083540402835291602001916109be565b820191906000526020600020905b8154815290600101906020018083116109a157829003601f168201915b5050505050905092915050565b600681815481106109db57600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b600080600460008686604051610a169291906172b9565b6040518091039020815260200190815260200160002060010160008463ffffffff1681526020019081526020016000208054610a5190617301565b90501190509392505050565b610a65612d21565b60008103610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f906173a4565b60405180910390fd5b610ab1816136eb565b50565b610abc612d21565b60008103610aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af690617410565b60405180910390fd5b8060078190555050565b6000610b5883838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061372a565b90506000610b698260200151613407565b9050600060046000838051906020012081526020019081526020016000206001016000846040015163ffffffff1681526020019081526020016000208054610bb090617301565b905011610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be99061747c565b60405180910390fd5b6000610c0882846040015163ffffffff16613862565b9050610c1b816060015160600151612f9e565b610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5190616ca0565b60405180910390fd5b6000610c6d826060015160600151612fdb565b90506000610c7e83604001516130a0565b9050610c928360600151606001518261315c565b610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890616d0c565b60405180910390fd5b600060056000610ce8856020015160c001516131ab565b604001516002811115610cfe57610cfd61664c565b5b6002811115610d1057610d0f61664c565b5b815260200190815260200160002054905060008103610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90616d78565b60405180910390fd5b6000816348a3c57086896040518363ffffffff1660e01b8152600401610d8b929190617537565b6020604051808303816000875af1158015610daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dce919061717d565b90507f4d2d7be42668dce2927650393613e408fc71274deac16f825eb0a869a5667e8c856080015182604051610e059291906175be565b60405180910390a180610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e449061763a565b60405180910390fd5b505050505050505050565b610e60612d21565b610e6a60006136eb565b565b600080600360008585604051610e839291906172b9565b604051809103902081526020019081526020016000206000018054610ea790617301565b905011905092915050565b60056020528060005260406000206000915090505481565b60008054905090565b60026020528060005260406000206000915090508054610ef290617301565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1e90617301565b8015610f6b5780601f10610f4057610100808354040283529160200191610f6b565b820191906000526020600020905b815481529060010190602001808311610f4e57829003601f168201915b505050505081565b610f7b612d21565b6000610fca83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613931565b9050610fd581613aa5565b6000610fe082613cef565b90506000600360008381526020019081526020016000209050600081600001805461100a90617301565b90501115611101578484826000019190611025929190615fcd565b505b6110348360600151613d14565b156110fc5760006110488460600151613d29565b90506000826001016000838152602001908152602001600020805461106c90617301565b9050036110e7576110808460600151613d43565b82600101600083815260200190815260200160002090805190602001906110a8929190616053565b507f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce83826040516110da92919061765a565b60405180910390a16110f6565b6110f48460600151613d43565b505b50611027565b6111e6565b8484826000019190611114929190615fcd565b505b6111238360600151613d14565b156111ae5760006111378460600151613d29565b90506111468460600151613d43565b826001016000838152602001908152602001600020908051906020019061116e929190616053565b507f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce83826040516111a092919061765a565b60405180910390a150611116565b7fc115cf6e41eccaaf9dbe48f3cbf3e82c176644e35bf1cae0839627723d980a0d826040516111dd9190617683565b60405180910390a15b5050505050565b6111f5612d21565b60008163b93ba39c6040518163ffffffff1660e01b81526004016020604051808303816000875af115801561122e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125291906176b3565b905060006005600083600281111561126d5761126c61664c565b5b600281111561127f5761127e61664c565b5b815260200190815260200160002054146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c59061772c565b60405180910390fd5b60068190806001815401808255809150506001900390600052602060002090602091828204019190069091909190916101000a81548160ff0219169083600281111561131d5761131c61664c565b5b0217905550816005600083600281111561133a5761133961664c565b5b600281111561134c5761134b61664c565b5b8152602001908152602001600020819055507f30469544067c713d17864302c985ca87e4822f68e28079cbf956f9deab7c8fff818360405161138f92919061774c565b60405180910390a15050565b6113a3612d21565b6000600560008360028111156113bc576113bb61664c565b5b60028111156113ce576113cd61664c565b5b8152602001908152602001600020540361141d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611414906177c1565b60405180910390fd5b6000600190505b600680549050811015611575578160028111156114445761144361664c565b5b60068281548110611458576114576177e1565b5b90600052602060002090602091828204019190069054906101000a900460ff16600281111561148a5761148961664c565b5b0361156257600660016006805490506114a3919061783f565b815481106114b4576114b36177e1565b5b90600052602060002090602091828204019190069054906101000a900460ff16600682815481106114e8576114e76177e1565b5b90600052602060002090602091828204019190066101000a81548160ff0219169083600281111561151c5761151b61664c565b5b0217905550600680548061153357611532617873565b5b60019003818190600052602060002090602091828204019190066101000a81549060ff02191690559055611575565b808061156d906178a2565b915050611424565b506005600082600281111561158d5761158c61664c565b5b600281111561159f5761159e61664c565b5b8152602001908152602001600020600090557f4ae9b990c01f3cf6322d2f72f0c0a7eefdcdb12b782e47f420dbc75314d7f508816040516115e091906166c3565b60405180910390a150565b60046020528060005260406000206000915090508060000154905081565b600360205280600052604060002060009150905080600001805461162c90617301565b80601f016020809104026020016040519081016040528092919081815260200182805461165890617301565b80156116a55780601f1061167a576101008083540402835291602001916116a5565b820191906000526020600020905b81548152906001019060200180831161168857829003601f168201915b5050505050905081565b6060600680548060200260200160405190810160405280929190818152602001828054801561173257602002820191906000526020600020906000905b82829054906101000a900460ff16600281111561170c5761170b61664c565b5b815260200190600101906020826000010492830192600103820291508084116116ec5790505b5050505050905090565b60075481565b6000600754905090565b6000806003600086866040516117639291906172b9565b604051809103902081526020019081526020016000206001016000848152602001908152602001600020805461179890617301565b90501190509392505050565b60606004600085856040516117ba9291906172b9565b6040518091039020815260200190815260200160002060010160008363ffffffff16815260200190815260200160002080546117f590617301565b80601f016020809104026020016040519081016040528092919081815260200182805461182190617301565b801561186e5780601f106118435761010080835404028352916020019161186e565b820191906000526020600020905b81548152906001019060200180831161185157829003601f168201915b505050505090509392505050565b60606003600085856040516118929291906172b9565b60405180910390208152602001908152602001600020600101600083815260200190815260200160002080546118c790617301565b80601f01602080910402602001604051908101604052809291908181526020018280546118f390617301565b80156119405780601f1061191557610100808354040283529160200191611940565b820191906000526020600020905b81548152906001019060200180831161192357829003601f168201915b505050505090509392505050565b600181805160208101820180518482526020830160208501208183528095505050505050600091509050805461198390617301565b80601f01602080910402602001604051908101604052809291908181526020018280546119af90617301565b80156119fc5780601f106119d1576101008083540402835291602001916119fc565b820191906000526020600020905b8154815290600101906020018083116119df57829003601f168201915b505050505081565b60606000600460008585604051611a1c9291906172b9565b604051809103902081526020019081526020016000209050806001016000826000015481526020019081526020016000208054611a5890617301565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8490617301565b8015611ad15780601f10611aa657610100808354040283529160200191611ad1565b820191906000526020600020905b815481529060010190602001808311611ab457829003601f168201915b505050505091505092915050565b611ae76160d9565b611aef6160d9565b6000611afa84611f76565b905060005b816020015151811015611d1057600082602001518281518110611b2557611b246177e1565b5b60200260200101519050600061ffff16816000015161ffff1603611b5957611b4c81612128565b8460000181905250611cfc565b600161ffff16816000015161ffff1603611b8357611b7681612128565b8460200181905250611cfb565b600261ffff16816000015161ffff1603611be957611ba081612136565b60ff166003811115611bb557611bb461664c565b5b84604001906003811115611bcc57611bcb61664c565b5b90816003811115611be057611bdf61664c565b5b81525050611cfa565b600361ffff16816000015161ffff1603611c1b57611c0e611c098261214e565b613dd5565b8460600181905250611cf9565b600461ffff16816000015161ffff1603611c5c57611c388161215c565b846080019067ffffffffffffffff16908167ffffffffffffffff1681525050611cf8565b600561ffff16816000015161ffff1603611c9d57611c798161215c565b8460a0019067ffffffffffffffff16908167ffffffffffffffff1681525050611cf7565b600661ffff16816000015161ffff1603611cc757611cba8161214e565b8460c00181905250611cf6565b600761ffff16816000015161ffff1603611cf557611cec611ce78261214e565b613ed1565b8460e001819052505b5b5b5b5b5b5b5b508080611d08906178a2565b915050611aff565b508192505050919050565b611d23616150565b60006003811115611d3757611d3661664c565b5b82604001516003811115611d4e57611d4d61664c565b5b03611d6b57611d608260c00151613fe7565b602001519050611e7d565b60016003811115611d7f57611d7e61664c565b5b82604001516003811115611d9657611d9561664c565b5b03611db357611da88260c001516140da565b608001519050611e7d565b60026003811115611dc757611dc661664c565b5b82604001516003811115611dde57611ddd61664c565b5b03611dfb57611df08260c001516131ab565b606001519050611e7d565b600380811115611e0e57611e0d61664c565b5b82604001516003811115611e2557611e2461664c565b5b03611e4257611e378260c0015161428a565b604001519050611e7d565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e749061795c565b60405180910390fd5b919050565b60606000600267ffffffffffffffff811115611ea157611ea0616ae0565b5b604051908082528060200260200182016040528015611eda57816020015b611ec761617c565b815260200190600190039081611ebf5790505b509050611f066000611f0185600001516001811115611efc57611efb61664c565b5b61217c565b612198565b81600081518110611f1a57611f196177e1565b5b6020026020010181905250611f346001846020015161222d565b81600181518110611f4857611f476177e1565b5b6020026020010181905250611f5b6161a7565b818160200181905250611f6d81612263565b92505050919050565b611f7e6161a7565b600682511015611fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fba906179c8565b60405180910390fd5b6000611fcd6161a7565b611fdf611fda858461237f565b6123ae565b816000019061ffff16908161ffff1681525050600682611fff91906179e8565b91506000808390505b85518110156120615761202f61202a8760028461202591906179e8565b6124d9565b61250a565b600661203b9190617a3e565b63ffffffff168161204c91906179e8565b90508180612059906178a2565b925050612008565b60008267ffffffffffffffff81111561207d5761207c616ae0565b5b6040519080825280602002602001820160405280156120b657816020015b6120a361617c565b81526020019060019003908161209b5790505b509050600092505b8651851015612112576120cf61617c565b6120d988876143a8565b8097508192505050808285806120ee906178a2565b965081518110612101576121006177e1565b5b6020026020010181905250506120be565b8084602001819052508395505050505050919050565b606081604001519050919050565b6000612147600183604001516126eb565b9050919050565b606081604001519050919050565b6000612175612170600884604001516126f9565b612707565b9050919050565b60008160018111156121915761219061664c565b5b9050919050565b6121a061617c565b6000600167ffffffffffffffff8111156121bd576121bc616ae0565b5b6040519080825280601f01601f1916602001820160405280156121ef5781602001600182028036833780820191505090505b5090506121fe60018483612a54565b60405180606001604052808561ffff168152602001600163ffffffff1681526020018281525091505092915050565b61223561617c565b60405180606001604052808461ffff168152602001835163ffffffff16815260200183815250905092915050565b6060600061227083612a6b565b905060006006826122819190617a3e565b63ffffffff1667ffffffffffffffff8111156122a05761229f616ae0565b5b6040519080825280601f01601f1916602001820160405280156122d25781602001600182028036833780820191505090505b5090506122ed60026122e786600001516123ae565b83612aeb565b61230160066122fb8461250a565b83612b02565b60006006905060005b61231386612b19565b81101561237357600061234387602001518381518110612336576123356177e1565b5b6020026020010151612b28565b9050612350838286612bda565b80518361235d91906179e8565b925050808061236b906178a2565b91505061230a565b50819350505050919050565b6000825160028361239091906179e8565b111561239b57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff8111156123d4576123d3616ae0565b5b6040519080825280601f01601f1916602001820160405280156124065781602001600182028036833780820191505090505b5090508160016002811061241d5761241c6177e1565b5b1a60f81b81600081518110612435576124346177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060028110612478576124776177e1565b5b1a60f81b816001815181106124905761248f6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006124cc82600061237f565b9050809350505050919050565b600082516004836124ea91906179e8565b11156124f557600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff8111156125305761252f616ae0565b5b6040519080825280601f01601f1916602001820160405280156125625781602001600182028036833780820191505090505b50905081600360048110612579576125786177e1565b5b1a60f81b81600081518110612591576125906177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816002600481106125d4576125d36177e1565b5b1a60f81b816001815181106125ec576125eb6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160016004811061262f5761262e6177e1565b5b1a60f81b81600281518110612647576126466177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006004811061268a576126896177e1565b5b1a60f81b816003815181106126a2576126a16177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006126de8260006124d9565b9050809350505050919050565b600082820151905092915050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff81111561272d5761272c616ae0565b5b6040519080825280601f01601f19166020018201604052801561275f5781602001600182028036833780820191505090505b50905081600760088110612776576127756177e1565b5b1a60f81b8160008151811061278e5761278d6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816006600881106127d1576127d06177e1565b5b1a60f81b816001815181106127e9576127e86177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160056008811061282c5761282b6177e1565b5b1a60f81b81600281518110612844576128436177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600460088110612887576128866177e1565b5b1a60f81b8160038151811061289f5761289e6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816003600881106128e2576128e16177e1565b5b1a60f81b816004815181106128fa576128f96177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160026008811061293d5761293c6177e1565b5b1a60f81b81600581518110612955576129546177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160088110612998576129976177e1565b5b1a60f81b816006815181106129b0576129af6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600881106129f3576129f26177e1565b5b1a60f81b81600781518110612a0b57612a0a6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612a478260006144f0565b9050809350505050919050565b828101600181038051848352808252505050505050565b6000806000905060005b612a7e84612b19565b811015612ae157600084602001518281518110612a9e57612a9d6177e1565b5b60200260200101519050806040015151600684612abb9190617a3e565b63ffffffff16612acb91906179e8565b9250508080612ad9906178a2565b915050612a75565b5080915050919050565b828101600281038051848352808252505050505050565b828101600481038051848352808252505050505050565b60008160200151519050919050565b6060600060068360200151612b3d9190617a3e565b63ffffffff1667ffffffffffffffff811115612b5c57612b5b616ae0565b5b6040519080825280601f01601f191660200182016040528015612b8e5781602001600182028036833780820191505090505b509050612ba96002612ba385600001516123ae565b83612aeb565b612bc16006612bbb856020015161250a565b83612b02565b612bd16006846040015183612bda565b80915050919050565b60008251905081518163ffffffff1685612bf491906179e8565b1115612c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2c90617b10565b60405180910390fd5b801560008103612c85578483018051601f84168015602002818801018581018215602002838601015b81831015612c7b5782518152602083019250602081019050612c5e565b5083855250505050505b5050505050565b606083518284612c9c91906179e8565b1115612ca757600080fd5b60008267ffffffffffffffff811115612cc357612cc2616ae0565b5b6040519080825280601f01601f191660200182016040528015612cf55781602001600182028036833780820191505090505b5090506000806020830191508560208801019050612d14828287614525565b8293505050509392505050565b612d296145ae565b612d31610eca565b14612d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6890617b7c565b60405180910390fd5b565b612d7b6161c5565b612d836161c5565b6000612d8e84611f76565b905060005b816020015151811015612f9357600082602001518281518110612db957612db86177e1565b5b60200260200101519050600061ffff16816000015161ffff1603612dfc57612de0816145b6565b846000019063ffffffff16908163ffffffff1681525050612f7f565b600161ffff16816000015161ffff1603612e3557612e19816145b6565b846020019063ffffffff16908163ffffffff1681525050612f7e565b600261ffff16816000015161ffff1603612e5f57612e52816145d6565b8460400181905250612f7d565b600361ffff16816000015161ffff1603612e9157612e84612e7f8261214e565b6131ab565b8460600181905250612f7c565b600461ffff16816000015161ffff1603612ec357612eb6612eb18261214e565b6145e4565b8460800181905250612f7b565b600561ffff16816000015161ffff1603612efc57612ee0816145b6565b8460a0019063ffffffff16908163ffffffff1681525050612f7a565b600661ffff16816000015161ffff1603612f2657612f1981612128565b8460c00181905250612f79565b600761ffff16816000015161ffff1603612f5057612f438161214e565b8460e00181905250612f78565b60ff61ffff16816000015161ffff1603612f7757612f6d8161214e565b8461010001819052505b5b5b5b5b5b5b5b5b508080612f8b906178a2565b915050612d93565b508192505050919050565b60008060036000612fae85611e82565b8051906020012081526020019081526020016000206000018054612fd190617301565b9050119050919050565b612fe361622f565b61309960036000612ff385611e82565b805190602001208152602001908152602001600020600001805461301690617301565b80601f016020809104026020016040519081016040528092919081815260200182805461304290617301565b801561308f5780601f106130645761010080835404028352916020019161308f565b820191906000526020600020905b81548152906001019060200180831161307257829003601f168201915b5050505050613931565b9050919050565b6000808251905060208111156130eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e290617c0e565b60405180910390fd5b60008167ffffffffffffffff81111561310757613106616ae0565b5b6040519080825280601f01601f1916602001820160405280156131395781602001600182028036833780820191505090505b509050600084518252828501518383015180820392505050809350505050919050565b6000806003600061316c86611e82565b805190602001208152602001908152602001600020600101600084815260200190815260200160002080546131a090617301565b905011905092915050565b6131b3616271565b6131bb616271565b60006131c684611f76565b905060005b816020015151811015613325576000826020015182815181106131f1576131f06177e1565b5b60200260200101519050600061ffff16816000015161ffff16036132255761321881612128565b8460000181905250613311565b600161ffff16816000015161ffff160361324f5761324281612128565b8460200181905250613310565b600261ffff16816000015161ffff16036132b55761326c81612136565b60ff1660028111156132815761328061664c565b5b846040019060028111156132985761329761664c565b5b908160028111156132ac576132ab61664c565b5b8152505061330f565b600361ffff16816000015161ffff16036132e7576132da6132d58261214e565b613dd5565b846060018190525061330e565b600461ffff16816000015161ffff160361330d576133048161214e565b84608001819052505b5b5b5b5b50808061331d906178a2565b9150506131cb565b508192505050919050565b6133386162b8565b6133ff6003600061334886611e82565b8051906020012081526020019081526020016000206001016000848152602001908152602001600020805461337c90617301565b80601f01602080910402602001604051908101604052809291908181526020018280546133a890617301565b80156133f55780601f106133ca576101008083540402835291602001916133f5565b820191906000526020600020905b8154815290600101906020018083116133d857829003601f168201915b50505050506146f9565b905092915050565b6060806000801b836020015114801561342657506000801b8360400151145b156134bd57600167ffffffffffffffff81111561344657613445616ae0565b5b60405190808252806020026020018201604052801561347f57816020015b61346c61617c565b8152602001906001900390816134645790505b509050613499600061349485600001516147b9565b61222d565b816000815181106134ad576134ac6177e1565b5b60200260200101819052506136c8565b6000801b8360200151141580156134db57506000801b836040015114155b1561368c57600367ffffffffffffffff8111156134fb576134fa616ae0565b5b60405190808252806020026020018201604052801561353457816020015b61352161617c565b8152602001906001900390816135195790505b50905061354e600061354985600001516147b9565b61222d565b81600081518110613562576135616177e1565b5b60200260200101819052506000602067ffffffffffffffff81111561358a57613589616ae0565b5b6040519080825280601f01601f1916602001820160405280156135bc5781602001600182028036833780820191505090505b5090506135cf602085602001518361492b565b6135da60018261222d565b826001815181106135ee576135ed6177e1565b5b60200260200101819052506000602067ffffffffffffffff81111561361657613615616ae0565b5b6040519080825280601f01601f1916602001820160405280156136485781602001600182028036833780820191505090505b50905061365b602086604001518361492b565b61366660028261222d565b8360028151811061367a576136796177e1565b5b602002602001018190525050506136c7565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136be90617c7a565b60405180910390fd5b5b6136d06161a7565b8181602001819052506136e281612263565b92505050919050565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b6137326162d2565b61373a6162d2565b600061374584611f76565b905060005b816020015151811015613857576000826020015182815181106137705761376f6177e1565b5b60200260200101519050600561ffff16816000015161ffff16036137ac5761379f61379a8261214e565b614935565b8460000181905250613843565b61010161ffff16816000015161ffff16036137df576137d26137cd8261214e565b6145e4565b8460200181905250613842565b61010061ffff16816000015161ffff1603613819576137fd816145b6565b846040019063ffffffff16908163ffffffff1681525050613841565b6101ff61ffff16816000015161ffff1603613840576138378161214e565b84606001819052505b5b5b5b50808061384f906178a2565b91505061374a565b508192505050919050565b61386a6161c5565b6139296004600085805190602001208152602001908152602001600020600101600084815260200190815260200160002080546138a690617301565b80601f01602080910402602001604051908101604052809291908181526020018280546138d290617301565b801561391f5780601f106138f45761010080835404028352916020019161391f565b820191906000526020600020905b81548152906001019060200180831161390257829003601f168201915b5050505050612d73565b905092915050565b61393961622f565b61394161622f565b600061394c84611f76565b905060005b816020015151811015613a9a57600082602001518281518110613977576139766177e1565b5b60200260200101519050600061ffff16816000015161ffff16036139ab5761399e81612128565b8460000181905250613a86565b600161ffff16816000015161ffff16036139dd576139d06139cb8261214e565b611adf565b8460200181905250613a85565b600261ffff16816000015161ffff1603613a07576139fa8161214e565b8460400181905250613a84565b600361ffff16816000015161ffff1603613a3157613a24816149ca565b8460600181905250613a83565b600461ffff16816000015161ffff1603613a5b57613a4e81612128565b8460800181905250613a82565b600561ffff16816000015161ffff1603613a8157613a788161214e565b8460a001819052505b5b5b5b5b5b508080613a92906178a2565b915050613951565b508192505050919050565b6000613ab8826020015160600151611e82565b8051906020012090506000600260008381526020019081526020016000208054613ae190617301565b905011613b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1a90617ce6565b60405180910390fd5b6000613be6600160026000858152602001908152602001600020604051613b4a9190617da5565b90815260200160405180910390208054613b6390617301565b80601f0160208091040260200160405190810160405280929190818152602001828054613b8f90617301565b8015613bdc5780601f10613bb157610100808354040283529160200191613bdc565b820191906000526020600020905b815481529060010190602001808311613bbf57829003601f168201915b5050505050611adf565b9050613c386040518060400160405280601681526020017f4b656363616b32353657697468536563703235366b31000000000000000000008152508260e00151604001516149f390919063ffffffff16565b15613ca257600080613c57838660200151614a0e90919063ffffffff16565b91509150818190613c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c95919061694f565b60405180910390fd5b5050505b613cab83614c14565b613cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ce190617e08565b60405180910390fd5b505050565b6000613d06613d018360200151611d1b565b611e82565b805190602001209050919050565b60008160200151518260000151109050919050565b6000613d3c613d3783613d43565b6130a0565b9050919050565b6060816020015151826000015110613d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d8790617e9a565b60405180910390fd5b6000613da483600001518460200151614c45565b9050805160048460000151613db991906179e8565b613dc391906179e8565b83600001818152505080915050919050565b613ddd616150565b613de5616150565b6000613df084611f76565b905060005b816020015151811015613ec657600082602001518281518110613e1b57613e1a6177e1565b5b60200260200101519050600061ffff16816000015161ffff1603613e8b57613e4281612136565b60ff166001811115613e5757613e5661664c565b5b84600001906001811115613e6e57613e6d61664c565b5b90816001811115613e8257613e8161664c565b5b81525050613eb2565b600161ffff16816000015161ffff1603613eb157613ea88161214e565b84602001819052505b5b508080613ebe906178a2565b915050613df5565b508192505050919050565b613ed961630c565b613ee161630c565b6000613eec84611f76565b905060005b816020015151811015613fdc57600082602001518281518110613f1757613f166177e1565b5b60200260200101519050600061ffff16816000015161ffff1603613f4b57613f3e81612128565b8460000181905250613fc8565b600161ffff16816000015161ffff1603613f7557613f688161214e565b8460200181905250613fc7565b600261ffff16816000015161ffff1603613f9f57613f9281612128565b8460400181905250613fc6565b600361ffff16816000015161ffff1603613fc557613fbc8161214e565b84606001819052505b5b5b5b508080613fd4906178a2565b915050613ef1565b508192505050919050565b613fef616334565b613ff7616334565b600061400284611f76565b905060005b8160200151518110156140cf5760008260200151828151811061402d5761402c6177e1565b5b60200260200101519050600061ffff16816000015161ffff16036140615761405481612128565b84600001819052506140bb565b600161ffff16816000015161ffff1603614093576140866140818261214e565b613dd5565b84602001819052506140ba565b600261ffff16816000015161ffff16036140b9576140b08161214e565b84604001819052505b5b5b5080806140c7906178a2565b915050614007565b508192505050919050565b6140e261635b565b6140ea61635b565b60006140f584611f76565b905060005b81602001515181101561427f576000826020015182815181106141205761411f6177e1565b5b60200260200101519050600061ffff16816000015161ffff16036141545761414781612128565b846000018190525061426b565b600161ffff16816000015161ffff16036141ba5761417181612136565b60ff1660018111156141865761418561664c565b5b8460200190600181111561419d5761419c61664c565b5b908160018111156141b1576141b061664c565b5b8152505061426a565b600261ffff16816000015161ffff16036141e4576141d781612128565b8460400181905250614269565b600361ffff16816000015161ffff160361420e5761420181612128565b8460600181905250614268565b600461ffff16816000015161ffff16036142405761423361422e8261214e565b613dd5565b8460800181905250614267565b600561ffff16816000015161ffff16036142665761425d8161214e565b8460a001819052505b5b5b5b5b5b508080614277906178a2565b9150506140fa565b508192505050919050565b6142926163a9565b61429a6163a9565b60006142a584611f76565b905060005b81602001515181101561439d576000826020015182815181106142d0576142cf6177e1565b5b60200260200101519050600061ffff16816000015161ffff1603614304576142f781612128565b8460000181905250614389565b600161ffff16816000015161ffff160361432e5761432181612128565b8460200181905250614388565b600361ffff16816000015161ffff16036143605761435361434e8261214e565b613dd5565b8460400181905250614387565b600461ffff16816000015161ffff16036143865761437d8161214e565b84606001819052505b5b5b5b508080614395906178a2565b9150506142aa565b508192505050919050565b6143b061617c565b6000828451116143f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016143ec90617f2c565b60405180910390fd5b6006831015614439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161443090617f98565b60405180910390fd5b61444161617c565b61445361444e868661237f565b6123ae565b816000019061ffff16908161ffff168152505060028461447391906179e8565b935061448761448286866124d9565b61250a565b816020019063ffffffff16908163ffffffff16815250506004846144ab91906179e8565b93506144c28585836020015163ffffffff16612c8c565b8160400181905250806020015163ffffffff16846144e091906179e8565b9350808492509250509250929050565b6000825160088361450191906179e8565b111561450c57600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b60208110614564578151835260208361453f91906179e8565b925060208261454e91906179e8565b915060208161455d919061783f565b9050614526565b60008103156145a9576000600182602061457e919061783f565b61010061458b91906180eb565b614595919061783f565b905080198351168185511681811786525050505b505050565b600033905090565b60006145cf6145ca60048460400151614cec565b61250a565b9050919050565b606081604001519050919050565b6145ec6163d7565b6145f46163d7565b60006145ff84611f76565b905060005b8160200151518110156146ee5760008260200151828151811061462a576146296177e1565b5b60200260200101519050600061ffff16816000015161ffff1603614666576146596146548261214e565b614cfa565b84600001819052506146da565b600161ffff16816000015161ffff16036146a15760006146858261214e565b9050614692815182614dba565b856020018181525050506146d9565b600261ffff16816000015161ffff16036146d85760006146c08261214e565b90506146cd815182614dba565b856040018181525050505b5b5b5080806146e6906178a2565b915050614604565b508192505050919050565b6147016162b8565b6147096162b8565b600061471484611f76565b905060005b8160200151518110156147ae5760008260200151828151811061473f5761473e6177e1565b5b60200260200101519050600061ffff16816000015161ffff160361477357614766816145d6565b846000018190525061479a565b600161ffff16816000015161ffff1603614799576147908161214e565b84602001819052505b5b5080806147a6906178a2565b915050614719565b508192505050919050565b6060806000836020015151111561488257600267ffffffffffffffff8111156147e5576147e4616ae0565b5b60405190808252806020026020018201604052801561481e57816020015b61480b61617c565b8152602001906001900390816148035790505b50905061483060008460000151614dc8565b81600081518110614844576148436177e1565b5b602002602001018190525061485e60018460200151614dc8565b81600181518110614872576148716177e1565b5b6020026020010181905250614908565b600167ffffffffffffffff81111561489d5761489c616ae0565b5b6040519080825280602002602001820160405280156148d657816020015b6148c361617c565b8152602001906001900390816148bb5790505b5090506148e860008460000151614dc8565b816000815181106148fc576148fb6177e1565b5b60200260200101819052505b6149106161a7565b81816020018190525061492281612263565b92505050919050565b8183820152505050565b61493d616404565b614945616404565b600061495084611f76565b905060005b8160200151518110156149bf5760008260200151828151811061497b5761497a6177e1565b5b60200260200101519050600061ffff16816000015161ffff16036149ab576149a28161214e565b84600001819052505b5080806149b7906178a2565b915050614955565b508192505050919050565b6149d2616417565b60405180604001604052806000815260200183604001518152509050919050565b60008180519060200120838051906020012014905092915050565b6000606060006003811115614a2657614a2561664c565b5b83604001516003811115614a3d57614a3c61664c565b5b03614a9d576000614a518460c00151613fe7565b9050614a6e81602001518660600151614e0490919063ffffffff16565b614a97576000604051806060016040528060288152602001618602602891399250925050614c0d565b50614ba1565b60016003811115614ab157614ab061664c565b5b83604001516003811115614ac857614ac761664c565b5b03614b7c576000614adc8460c001516140da565b9050600180811115614af157614af061664c565b5b81602001516001811115614b0857614b0761664c565b5b14614b325760006040518060800160405280605381526020016185af605391399250925050614c0d565b614b4d81608001518660600151614e0490919063ffffffff16565b614b76576000604051806060016040528060288152602001618602602891399250925050614c0d565b50614ba0565b60006040518060600160405280603d815260200161854b603d913991509150614c0d565b5b614bcd8460e0015160400151614bb685614e2f565b614bbf87614fa0565b8760e0015160600151615182565b15614bed5760016040518060200160405280600081525091509150614c0d565b600060405180606001604052806027815260200161858860279139915091505b9250929050565b6000614c3e8260800151614c2b8460200151614e2f565b614c3485615362565b8560a00151615182565b9050919050565b6060600483614c5491906179e8565b92506000614c6a614c658585614cec565b6154d2565b63ffffffff1690506060811560008114614c8f57604051915060208201604052614ce0565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015614ccd5780518352602083019250602081019050614cb0565b50858552601f19601f8301166040525050505b50809250505092915050565b600082820151905092915050565b614d02616431565b614d0a616431565b6000614d1584611f76565b905060005b816020015151811015614daf57600082602001518281518110614d4057614d3f6177e1565b5b60200260200101519050600061ffff16816000015161ffff1603614d7457614d6781612128565b8460000181905250614d9b565b600161ffff16816000015161ffff1603614d9a57614d9181612128565b84602001819052505b5b508080614da7906178a2565b915050614d1a565b508192505050919050565b600082820151905092915050565b614dd061617c565b600082905060405180606001604052808561ffff168152602001825163ffffffff1681526020018281525091505092915050565b6000614e0f82611e82565b80519060200120614e1f84611e82565b8051906020012014905092915050565b606060006003811115614e4557614e4461664c565b5b82604001516003811115614e5c57614e5b61664c565b5b03614e7d57614e76614e718360c00151613fe7565b6156b3565b9050614f9b565b60016003811115614e9157614e9061664c565b5b82604001516003811115614ea857614ea761664c565b5b03614ec957614ec2614ebd8360c001516140da565b6156d7565b9050614f9b565b60026003811115614edd57614edc61664c565b5b82604001516003811115614ef457614ef361664c565b5b03614f1557614f0e614f098360c001516131ab565b6156fb565b9050614f9b565b600380811115614f2857614f2761664c565b5b82604001516003811115614f3f57614f3e61664c565b5b03614f6057614f59614f548360c0015161428a565b61571f565b9050614f9b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614f92906181a8565b60405180910390fd5b919050565b60606000600767ffffffffffffffff811115614fbf57614fbe616ae0565b5b604051908082528060200260200182016040528015614ff857816020015b614fe561617c565b815260200190600190039081614fdd5790505b50905061500a60008460000151614dc8565b8160008151811061501e5761501d6177e1565b5b602002602001018190525061503860018460200151614dc8565b8160018151811061504c5761504b6177e1565b5b6020026020010181905250615080600261507b856040015160038111156150765761507561664c565b5b615743565b612198565b81600281518110615094576150936177e1565b5b60200260200101819052506150b660036150b18560600151611e82565b61222d565b816003815181106150ca576150c96177e1565b5b60200260200101819052506150e46004846080015161575f565b816004815181106150f8576150f76177e1565b5b602002602001018190525061511260058460a0015161575f565b81600581518110615126576151256177e1565b5b602002602001018190525061514060068460c0015161222d565b81600681518110615154576151536177e1565b5b60200260200101819052506151676161a7565b81816020018190525061517981612263565b92505050919050565b60006151cc6040518060400160405280601681526020017f4b656363616b32353657697468536563703235366b3100000000000000000000815250866149f390919063ffffffff16565b61520b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016152029061823a565b60405180910390fd5b604182511015615250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615247906182a6565b60405180910390fd5b601b82604081518110615266576152656177e1565b5b602001015160f81c60f81b60f81c61527e91906182d3565b60f81b82604081518110615295576152946177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006152e06152d2866157fc565b858051906020012085615858565b9050601b836040815181106152f8576152f76177e1565b5b602001015160f81c60f81b60f81c615310919061830a565b60f81b83604081518110615327576153266177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080915050949350505050565b60606000600567ffffffffffffffff81111561538157615380616ae0565b5b6040519080825280602002602001820160405280156153ba57816020015b6153a761617c565b81526020019060019003908161539f5790505b5090506153cc60008460000151614dc8565b816000815181106153e0576153df6177e1565b5b602002602001018190525061540260016153fd85602001516158bb565b61222d565b81600181518110615416576154156177e1565b5b60200260200101819052506154306002846040015161222d565b81600281518110615444576154436177e1565b5b6020026020010181905250615462600384606001516020015161222d565b81600381518110615476576154756177e1565b5b602002602001018190525061549060048460800151614dc8565b816004815181106154a4576154a36177e1565b5b60200260200101819052506154b76161a7565b8181602001819052506154c981612263565b92505050919050565b6000808260e01b90506000600467ffffffffffffffff8111156154f8576154f7616ae0565b5b6040519080825280601f01601f19166020018201604052801561552a5781602001600182028036833780820191505090505b50905081600360048110615541576155406177e1565b5b1a60f81b81600081518110615559576155586177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160026004811061559c5761559b6177e1565b5b1a60f81b816001815181106155b4576155b36177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816001600481106155f7576155f66177e1565b5b1a60f81b8160028151811061560f5761560e6177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060048110615652576156516177e1565b5b1a60f81b8160038151811061566a576156696177e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006156a6826000615ad3565b9050809350505050919050565b60606156d082604001518360200151615b0490919063ffffffff16565b9050919050565b60606156f48260a001518360800151615b0490919063ffffffff16565b9050919050565b606061571882608001518360600151615b0490919063ffffffff16565b9050919050565b606061573c82606001518360400151615b0490919063ffffffff16565b9050919050565b60008160038111156157585761575761664c565b5b9050919050565b61576761617c565b6000600867ffffffffffffffff81111561578457615783616ae0565b5b6040519080825280601f01601f1916602001820160405280156157b65781602001600182028036833780820191505090505b5090506157cd60086157c785612707565b83615c4b565b60405180606001604052808561ffff168152602001600863ffffffff1681526020018281525091505092915050565b600060028260405161580e919061836f565b602060405180830381855afa15801561582b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061584e919061839b565b60001c9050919050565b60008060006158678585615c62565b915091506000600481111561587f5761587e61664c565b5b8160048111156158925761589161664c565b5b14801561589e57508582145b806158b057506158af868686615cb3565b5b925050509392505050565b60606000600867ffffffffffffffff8111156158da576158d9616ae0565b5b60405190808252806020026020018201604052801561591357816020015b61590061617c565b8152602001906001900390816158f85790505b50905061592560008460000151614dc8565b81600081518110615939576159386177e1565b5b602002602001018190525061595360018460200151614dc8565b81600181518110615967576159666177e1565b5b602002602001018190525061599b6002615996856040015160038111156159915761599061664c565b5b615743565b612198565b816002815181106159af576159ae6177e1565b5b60200260200101819052506159d160036159cc8560600151611e82565b61222d565b816003815181106159e5576159e46177e1565b5b60200260200101819052506159ff6004846080015161575f565b81600481518110615a1357615a126177e1565b5b6020026020010181905250615a2d60058460a0015161575f565b81600581518110615a4157615a406177e1565b5b6020026020010181905250615a5b60068460c0015161222d565b81600681518110615a6f57615a6e6177e1565b5b6020026020010181905250615a916007615a8c8560e00151615de1565b61222d565b81600781518110615aa557615aa46177e1565b5b6020026020010181905250615ab86161a7565b818160200181905250615aca81612263565b92505050919050565b60008251600483615ae491906179e8565b1115615aef57600080fd5b63ffffffff8260048501015116905092915050565b606060006001811115615b1a57615b1961664c565b5b83600001516001811115615b3157615b3061664c565b5b14615b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b689061843a565b60405180910390fd5b60408360200151511015615bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615bb1906184a6565b60405180910390fd5b600083602001519050600060408251615bd3919061783f565b90506000604067ffffffffffffffff811115615bf257615bf1616ae0565b5b6040519080825280601f01601f191660200182016040528015615c245781602001600182028036833780820191505090505b50905081602084010151602082015281604084010151604082015280935050505092915050565b828101600881038051848352808252505050505050565b6000806041835103615ca35760008060006020860151925060408601519150606086015160001a9050615c9787828585615f17565b94509450505050615cac565b60006002915091505b9250929050565b600080600085631626ba7e60e01b8686604051602401615cd49291906184c6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051615d3e919061836f565b600060405180830381855afa9150503d8060008114615d79576040519150601f19603f3d011682016040523d82523d6000602084013e615d7e565b606091505b5091509150818015615d9257506020815110155b8015615dd65750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681806020019051810190615dd4919061839b565b145b925050509392505050565b60606000600467ffffffffffffffff811115615e0057615dff616ae0565b5b604051908082528060200260200182016040528015615e3957816020015b615e2661617c565b815260200190600190039081615e1e5790505b509050615e4b60008460000151614dc8565b81600081518110615e5f57615e5e6177e1565b5b6020026020010181905250615e796001846020015161222d565b81600181518110615e8d57615e8c6177e1565b5b6020026020010181905250615ea760028460400151614dc8565b81600281518110615ebb57615eba6177e1565b5b6020026020010181905250615ed56003846060015161222d565b81600381518110615ee957615ee86177e1565b5b6020026020010181905250615efc6161a7565b818160200181905250615f0e81612263565b92505050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115615f52576000600391509150615fc4565b600060018787878760405160008152602001604052604051615f779493929190618505565b6020604051602081039080840390855afa158015615f99573d6000803e3d6000fd5b50505060206040510351905060008103615fbb57600060019250925050615fc4565b80600092509250505b94509492505050565b828054615fd990617301565b90600052602060002090601f016020900481019282615ffb5760008555616042565b82601f1061601457803560ff1916838001178555616042565b82800160010185558215616042579182015b82811115616041578235825591602001919060010190616026565b5b50905061604f919061644b565b5090565b82805461605f90617301565b90600052602060002090601f01602090048101928261608157600085556160c8565b82601f1061609a57805160ff19168380011785556160c8565b828001600101855582156160c8579182015b828111156160c75782518255916020019190600101906160ac565b5b5090506160d5919061644b565b5090565b6040518061010001604052806060815260200160608152602001600060038111156161075761610661664c565b5b8152602001616114616150565b8152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016060815260200161614a61630c565b81525090565b60405180604001604052806000600181111561616f5761616e61664c565b5b8152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b604051806101200160405280600063ffffffff168152602001600063ffffffff168152602001606081526020016161fa616271565b81526020016162076163d7565b8152602001600063ffffffff1681526020016060815260200160608152602001606081525090565b6040518060c00160405280606081526020016162496160d9565b81526020016060815260200161625d616417565b815260200160608152602001606081525090565b6040518060a0016040528060608152602001606081526020016000600281111561629e5761629d61664c565b5b81526020016162ab616150565b8152602001606081525090565b604051806040016040528060608152602001606081525090565b60405180608001604052806162e5616404565b81526020016162f26163d7565b8152602001600063ffffffff168152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b60405180606001604052806060815260200161634e616150565b8152602001606081525090565b6040518060c0016040528060608152602001600060018111156163815761638061664c565b5b8152602001606081526020016060815260200161639c616150565b8152602001606081525090565b604051806080016040528060608152602001606081526020016163ca616150565b8152602001606081525090565b60405180606001604052806163ea616431565b815260200160008019168152602001600080191681525090565b6040518060200160405280606081525090565b604051806040016040528060008152602001606081525090565b604051806040016040528060608152602001606081525090565b5b8082111561646457600081600090555060010161644c565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126164a1576164a061647c565b5b8235905067ffffffffffffffff8111156164be576164bd616481565b5b6020830191508360018202830111156164da576164d9616486565b5b9250929050565b600080602083850312156164f8576164f7616472565b5b600083013567ffffffffffffffff81111561651657616515616477565b5b6165228582860161648b565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561656857808201518184015260208101905061654d565b83811115616577576000848401525b50505050565b6000601f19601f8301169050919050565b60006165998261652e565b6165a38185616539565b93506165b381856020860161654a565b6165bc8161657d565b840191505092915050565b600060208201905081810360008301526165e1818461658e565b905092915050565b6000819050919050565b6165fc816165e9565b811461660757600080fd5b50565b600081359050616619816165f3565b92915050565b60006020828403121561663557616634616472565b5b60006166438482850161660a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061668c5761668b61664c565b5b50565b600081905061669d8261667b565b919050565b60006166ad8261668f565b9050919050565b6166bd816166a2565b82525050565b60006020820190506166d860008301846166b4565b92915050565b600063ffffffff82169050919050565b6166f7816166de565b811461670257600080fd5b50565b600081359050616714816166ee565b92915050565b60008060006040848603121561673357616732616472565b5b600084013567ffffffffffffffff81111561675157616750616477565b5b61675d8682870161648b565b9350935050602061677086828701616705565b9150509250925092565b60008115159050919050565b61678f8161677a565b82525050565b60006020820190506167aa6000830184616786565b92915050565b60006167bb826165e9565b9050919050565b6167cb816167b0565b81146167d657600080fd5b50565b6000813590506167e8816167c2565b92915050565b60006020828403121561680457616803616472565b5b6000616812848285016167d9565b91505092915050565b6003811061682857600080fd5b50565b60008135905061683a8161681b565b92915050565b60006020828403121561685657616855616472565b5b60006168648482850161682b565b91505092915050565b616876816167b0565b82525050565b6000602082019050616891600083018461686d565b92915050565b6000819050919050565b6168aa81616897565b81146168b557600080fd5b50565b6000813590506168c7816168a1565b92915050565b6000602082840312156168e3576168e2616472565b5b60006168f1848285016168b8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000616921826168fa565b61692b8185616905565b935061693b81856020860161654a565b6169448161657d565b840191505092915050565b600060208201905081810360008301526169698184616916565b905092915050565b61697a816165e9565b82525050565b60006020820190506169956000830184616971565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6169d0816166a2565b82525050565b60006169e283836169c7565b60208301905092915050565b6000602082019050919050565b6000616a068261699b565b616a1081856169a6565b9350616a1b836169b7565b8060005b83811015616a4c578151616a3388826169d6565b9750616a3e836169ee565b925050600181019050616a1f565b5085935050505092915050565b60006020820190508181036000830152616a7381846169fb565b905092915050565b600080600060408486031215616a9457616a93616472565b5b600084013567ffffffffffffffff811115616ab257616ab1616477565b5b616abe8682870161648b565b93509350506020616ad18682870161660a565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b616b188261657d565b810181811067ffffffffffffffff82111715616b3757616b36616ae0565b5b80604052505050565b6000616b4a616468565b9050616b568282616b0f565b919050565b600067ffffffffffffffff821115616b7657616b75616ae0565b5b616b7f8261657d565b9050602081019050919050565b82818337600083830152505050565b6000616bae616ba984616b5b565b616b40565b905082815260208101848484011115616bca57616bc9616adb565b5b616bd5848285616b8c565b509392505050565b600082601f830112616bf257616bf161647c565b5b8135616c02848260208601616b9b565b91505092915050565b600060208284031215616c2157616c20616472565b5b600082013567ffffffffffffffff811115616c3f57616c3e616477565b5b616c4b84828501616bdd565b91505092915050565b7f6e6f2070746320747275737420726f6f7420666f756e64000000000000000000600082015250565b6000616c8a601783616905565b9150616c9582616c54565b602082019050919050565b60006020820190508181036000830152616cb981616c7d565b9050919050565b7f6e6f207074632076657269667920616e63686f7220666f756e64000000000000600082015250565b6000616cf6601a83616905565b9150616d0182616cc0565b602082019050919050565b60006020820190508181036000830152616d2581616ce9565b9050919050565b7f6e6f207074632076656966696572207365740000000000000000000000000000600082015250565b6000616d62601283616905565b9150616d6d82616d2c565b602082019050919050565b60006020820190508181036000830152616d9181616d55565b9050919050565b600082825260208201905092915050565b6000616db48261652e565b616dbe8185616d98565b9350616dce81856020860161654a565b616dd78161657d565b840191505092915050565b60006040830160008301518482036000860152616dff8282616da9565b91505060208301518482036020860152616e198282616da9565b9150508091505092915050565b616e2f816166de565b82525050565b600082825260208201905092915050565b6000616e51826168fa565b616e5b8185616e35565b9350616e6b81856020860161654a565b616e748161657d565b840191505092915050565b60028110616e9057616e8f61664c565b5b50565b6000819050616ea182616e7f565b919050565b6000616eb182616e93565b9050919050565b616ec181616ea6565b82525050565b6000604083016000830151616edf6000860182616eb8565b5060208301518482036020860152616ef78282616da9565b9150508091505092915050565b600060a0830160008301518482036000860152616f218282616e46565b91505060208301518482036020860152616f3b8282616e46565b9150506040830151616f5060408601826169c7565b5060608301518482036060860152616f688282616ec7565b91505060808301518482036080860152616f828282616da9565b9150508091505092915050565b60006040830160008301518482036000860152616fac8282616e46565b91505060208301518482036020860152616fc68282616e46565b9150508091505092915050565b616fdc81616897565b82525050565b60006060830160008301518482036000860152616fff8282616f8f565b91505060208301516170146020860182616fd3565b5060408301516170276040860182616fd3565b508091505092915050565b60006101208301600083015161704b6000860182616e26565b50602083015161705e6020860182616e26565b50604083015184820360408601526170768282616da9565b915050606083015184820360608601526170908282616f04565b915050608083015184820360808601526170aa8282616fe2565b91505060a08301516170bf60a0860182616e26565b5060c083015184820360c08601526170d78282616e46565b91505060e083015184820360e08601526170f18282616da9565b91505061010083015184820361010086015261710d8282616da9565b9150508091505092915050565b600060408201905081810360008301526171348185616de2565b905081810360208301526171488184617032565b90509392505050565b61715a8161677a565b811461716557600080fd5b50565b60008151905061717781617151565b92915050565b60006020828403121561719357617192616472565b5b60006171a184828501617168565b91505092915050565b7f6661696c656420746f2076657269667920747062746100000000000000000000600082015250565b60006171e0601683616905565b91506171eb826171aa565b602082019050919050565b6000602082019050818103600083015261720f816171d3565b9050919050565b61721f81616897565b82525050565b6000819050919050565b600061724a617245617240846166de565b617225565b6165e9565b9050919050565b61725a8161722f565b82525050565b60006040820190506172756000830185617216565b6172826020830184617251565b9392505050565b600081905092915050565b60006172a08385617289565b93506172ad838584616b8c565b82840190509392505050565b60006172c6828486617294565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061731957607f821691505b60208210810361732c5761732b6172d2565b5b50919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b600061738e602783616905565b915061739982617332565b604082019050919050565b600060208201905081810360008301526173bd81617381565b9050919050565b7f5074634875623a20696e76616c6964206d6f6e69746f72207665726966696572600082015250565b60006173fa602083616905565b9150617405826173c4565b602082019050919050565b60006020820190508181036000830152617429816173ed565b9050919050565b7f27747062746127206e6f7420666f756e64000000000000000000000000000000600082015250565b6000617466601183616905565b915061747182617430565b602082019050919050565b6000602082019050818103600083015261749581617459565b9050919050565b600060208301600083015184820360008601526174b98282616da9565b9150508091505092915050565b600060808301600083015184820360008601526174e3828261749c565b915050602083015184820360208601526174fd8282616fe2565b91505060408301516175126040860182616e26565b506060830151848203606086015261752a8282616da9565b9150508091505092915050565b600060408201905081810360008301526175518185617032565b9050818103602083015261756581846174c6565b90509392505050565b6000606083016000830151848203600086015261758b8282616f8f565b91505060208301516175a06020860182616fd3565b5060408301516175b36040860182616fd3565b508091505092915050565b600060408201905081810360008301526175d8818561756e565b90506175e76020830184616786565b9392505050565b7f766572696679206e6f7420706173730000000000000000000000000000000000600082015250565b6000617624600f83616905565b915061762f826175ee565b602082019050919050565b6000602082019050818103600083015261765381617617565b9050919050565b600060408201905061766f6000830185617216565b61767c6020830184616971565b9392505050565b60006020820190506176986000830184617216565b92915050565b6000815190506176ad8161681b565b92915050565b6000602082840312156176c9576176c8616472565b5b60006176d78482850161769e565b91505092915050565b7f70746320766572696669657220616c7265616479206578697374730000000000600082015250565b6000617716601b83616905565b9150617721826176e0565b602082019050919050565b6000602082019050818103600083015261774581617709565b9050919050565b600060408201905061776160008301856166b4565b61776e602083018461686d565b9392505050565b7f707463207665726966696572206e6f7420657869737473000000000000000000600082015250565b60006177ab601783616905565b91506177b682617775565b602082019050919050565b600060208201905081810360008301526177da8161779e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061784a826165e9565b9150617855836165e9565b92508282101561786857617867617810565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006178ad826165e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036178df576178de617810565b5b600182019050919050565b7f676574436572744f776e65724f69643a20636572742074797065206e6f74207360008201527f7570706f72740000000000000000000000000000000000000000000000000000602082015250565b6000617946602683616905565b9150617951826178ea565b604082019050919050565b6000602082019050818103600083015261797581617939565b9050919050565b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b60006179b2601783616905565b91506179bd8261797c565b602082019050919050565b600060208201905081810360008301526179e1816179a5565b9050919050565b60006179f3826165e9565b91506179fe836165e9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115617a3357617a32617810565b5b828201905092915050565b6000617a49826166de565b9150617a54836166de565b92508263ffffffff03821115617a6d57617a6c617810565b5b828201905092915050565b7f7661724279746573546f4279746573426967456e6469616e3a206f666673657460008201527f2069732067726561746572207468616e20746865206f7574707574206c656e6760208201527f7468000000000000000000000000000000000000000000000000000000000000604082015250565b6000617afa604283616905565b9150617b0582617a78565b606082019050919050565b60006020820190508181036000830152617b2981617aed565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617b66602083616905565b9150617b7182617b30565b602082019050919050565b60006020820190508181036000830152617b9581617b59565b9050919050565b7f333262797465732062696720696e7465676572206174206d6f737420666f722060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b6000617bf8602383616905565b9150617c0382617b9c565b604082019050919050565b60006020820190508181036000830152617c2781617beb565b9050919050565b7f696e76616c69642063726f7373636861696e206c616e65000000000000000000600082015250565b6000617c64601783616905565b9150617c6f82617c2e565b602082019050919050565b60006020820190508181036000830152617c9381617c57565b9050919050565b7f697373756572206e6f7420666f756e6400000000000000000000000000000000600082015250565b6000617cd0601083616905565b9150617cdb82617c9a565b602082019050919050565b60006020820190508181036000830152617cff81617cc3565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154617d3381617301565b617d3d8186617d06565b94506001821660008114617d585760018114617d6957617d9c565b60ff19831686528186019350617d9c565b617d7285617d11565b60005b83811015617d9457815481890152600182019150602081019050617d75565b838801955050505b50505092915050565b6000617db18284617d26565b915081905092915050565b7f70746320747275737420726f6f742073696720696e76616c6964000000000000600082015250565b6000617df2601a83616905565b9150617dfd82617dbc565b602082019050919050565b60006020820190508181036000830152617e2181617de5565b9050919050565b7f544c564974656d4d617056616c756553747265616d3a206f6666657374206f7560008201527f74206f6620627566666572000000000000000000000000000000000000000000602082015250565b6000617e84602b83616905565b9150617e8f82617e28565b604082019050919050565b60006020820190508181036000830152617eb381617e77565b9050919050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b6000617f16602383616905565b9150617f2182617eba565b604082019050919050565b60006020820190508181036000830152617f4581617f09565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b6000617f82600e83616905565b9150617f8d82617f4c565b602082019050919050565b60006020820190508181036000830152617fb181617f75565b9050919050565b60008160011c9050919050565b6000808291508390505b600185111561800f57808604811115617feb57617fea617810565b5b6001851615617ffa5780820291505b808102905061800885617fb8565b9450617fcf565b94509492505050565b60008261802857600190506180e4565b8161803657600090506180e4565b816001811461804c576002811461805657618085565b60019150506180e4565b60ff84111561806857618067617810565b5b8360020a91508482111561807f5761807e617810565b5b506180e4565b5060208310610133831016604e8410600b84101617156180ba5782820a9050838111156180b5576180b4617810565b5b6180e4565b6180c78484846001617fc5565b925090508184048111156180de576180dd617810565b5b81810290505b9392505050565b60006180f6826165e9565b9150618101836165e9565b925061812e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484618018565b905092915050565b7f6765745261775075626c69634b65793a20636572742074797065206e6f74207360008201527f7570706f72740000000000000000000000000000000000000000000000000000602082015250565b6000618192602683616905565b915061819d82618136565b604082019050919050565b600060208201905081810360008301526181c181618185565b9050919050565b7f6f6e6c7920737570706f7274204b454343414b3235365f574954485f5345435060008201527f3235364b31207369676e6174757265206e6f7700000000000000000000000000602082015250565b6000618224603383616905565b915061822f826181c8565b604082019050919050565b6000602082019050818103600083015261825381618217565b9050919050565b7f77726f6e6720736563703235366b3120736967206c656e677468000000000000600082015250565b6000618290601a83616905565b915061829b8261825a565b602082019050919050565b600060208201905081810360008301526182bf81618283565b9050919050565b600060ff82169050919050565b60006182de826182c6565b91506182e9836182c6565b92508260ff038211156182ff576182fe617810565b5b828201905092915050565b6000618315826182c6565b9150618320836182c6565b92508282101561833357618332617810565b5b828203905092915050565b60006183498261652e565b6183538185617289565b935061836381856020860161654a565b80840191505092915050565b600061837b828461833e565b915081905092915050565b600081519050618395816168a1565b92915050565b6000602082840312156183b1576183b0616472565b5b60006183bf84828501618386565b91505092915050565b7f6f6e6c7920737570706f727420583530395f5055424c49435f4b45595f494e4660008201527f4f206e6f77000000000000000000000000000000000000000000000000000000602082015250565b6000618424602583616905565b915061842f826183c8565b604082019050919050565b6000602082019050818103600083015261845381618417565b9050919050565b7f7075626c6963206b6579206c656e677468206e6f7420656e6f75746800000000600082015250565b6000618490601c83616905565b915061849b8261845a565b602082019050919050565b600060208201905081810360008301526184bf81618483565b9050919050565b60006040820190506184db6000830185617216565b81810360208301526184ed818461658e565b90509392505050565b6184ff816182c6565b82525050565b600060808201905061851a6000830187617216565b61852760208301866184f6565b6185346040830185617216565b6185416060830184617216565b9594505050505056fe63726f7373636861696e20636572742076616c69646174696f6e3a2074797065206f66207369676e65722063657274206d757374206265206263646e7363726f7373636861696e20636572742076616c69646174696f6e3a20696e76616c69642073696763726f7373636861696e20636572742076616c69646174696f6e3a2072657175697265206263646e7320726f6f74206f7220646f6d61696e207370616365206f776e65722063657274206173207369676e657263726f7373636861696e20636572742076616c69646174696f6e3a2077726f6e67207369676e6572a3646970667358221220d7c1c77c5710c0939f1b6cb19b0ac81caba159f3aeaf80417c5ae865adea023764736f6c634300080e6b636f6d70696c655f6d6f6461300041 \ No newline at end of file +6080604052348015630000001257600080fd5b50604051630000bf11380380630000bf118339818101604052810190630000003c91906300002c0c565b63000000606300000053630000007b60201b60201c565b630000008360201b60201c565b63000000738163000000c260201b60201c565b5063000034a3565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b600063000000dd8263000002a960201b6300001bb11760201c565b90506000600381111563000000f95763000000f86300002c65565b5b8160400151600381111563000001165763000001156300002c65565b5b14630000015c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016300000153906300002cf9565b60405180910390fd5b6000630000018f630000017c8363000005cf60201b6300001ded1760201c565b63000007a660201b6300001f541760201c565b8051906020012090508260016040518060400160405280600481526020017f726f6f740000000000000000000000000000000000000000000000000000000081525060405163000001e291906300002d70565b90815260200160405180910390209080519060200190630000020792919063000026c9565b506040518060400160405280600481526020017f726f6f740000000000000000000000000000000000000000000000000000000081525060026000838152602001908152602001600020908051906020019063000002689291906300002765565b507f7c787bfbe942686b5f41acec151012ca79c6b81c1c5a23cee512781cf3d5b9bb81604051630000029c91906300002da8565b60405180910390a1505050565b63000002b56300002801565b63000002c16300002801565b600063000002dc8463000008fe60201b63000020481760201c565b905060005b81602001515181101563000005c457600082602001518281518110630000030f57630000030e6300002dc7565b5b60200260200101519050600061ffff16816000015161ffff16036300000357576300000348816300000b4060201b63000021fa1760201c565b846000018190525063000005aa565b600161ffff16816000015161ffff16036300000395576300000386816300000b4060201b63000021fa1760201c565b846020018190525063000005a9565b600261ffff16816000015161ffff160363000004215763000003c4816300000b4e60201b63000022081760201c565b60ff16600381111563000003df5763000003de6300002c65565b5b8460400190600381111563000003fc5763000003fb6300002c65565b5b9081600381111563000004165763000004156300002c65565b5b8152505063000005a8565b600361ffff16816000015161ffff160363000004715763000004626300000455826300000b7660201b63000022201760201c565b6300000b8460201b60201c565b846060018190525063000005a7565b600461ffff16816000015161ffff160363000004c65763000004a0816300000cde60201b630000222e1760201c565b846080019067ffffffffffffffff16908167ffffffffffffffff168152505063000005a6565b600561ffff16816000015161ffff1603630000051b5763000004f5816300000cde60201b630000222e1760201c565b8460a0019067ffffffffffffffff16908167ffffffffffffffff168152505063000005a5565b600661ffff16816000015161ffff1603630000055957630000054a816300000b7660201b63000022201760201c565b8460c0018190525063000005a4565b600761ffff16816000015161ffff160363000005a357630000059a630000058d826300000b7660201b63000022201760201c565b6300000d1e60201b60201c565b8460e001819052505b5b5b5b5b5b5b5b50808063000005ba906300002e2f565b91505063000002e1565b508192505050919050565b63000005db6300002886565b6000600381111563000005f55763000005f46300002c65565b5b8260400151600381111563000006125763000006116300002c65565b5b03630000063d5763000006308260c001516300000ea860201b60201c565b60200151905063000007a1565b6001600381111563000006575763000006566300002c65565b5b8260400151600381111563000006745763000006736300002c65565b5b03630000069f5763000006928260c00151630000100560201b60201c565b60800151905063000007a1565b6002600381111563000006b95763000006b86300002c65565b5b8260400151600381111563000006d65763000006d56300002c65565b5b0363000007015763000006f48260c00151630000126d60201b60201c565b60600151905063000007a1565b600380811115630000071a5763000007196300002c65565b5b8260400151600381111563000007375763000007366300002c65565b5b0363000007625763000007558260c00151630000149660201b60201c565b60400151905063000007a1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016300000798906300002efb565b60405180910390fd5b919050565b60606000600267ffffffffffffffff81111563000007cb5763000007ca6300002a7f565b5b604051908082528060200260200182016040528015630000080c57816020015b63000007f763000028b8565b81526020019060019003908163000007eb5790505b509050630000085e6000630000084b8560000151600181111563000008385763000008376300002c65565b5b630000163260201b630000224e1760201c565b630000165460201b630000226a1760201c565b8160008151811063000008785763000008776300002dc7565b5b602002602001018190525063000008a260018460200151630000170560201b63000022ff1760201c565b8160018151811063000008bc5763000008bb6300002dc7565b5b602002602001018190525063000008d363000028e3565b81816020018190525063000008f581630000173f60201b63000023351760201c565b92505050919050565b630000090a63000028e3565b6006825110156300000955576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401630000094c906300002f73565b60405180910390fd5b6000630000096363000028e3565b63000009956300000982858463000018f960201b63000024511760201c565b630000192e60201b63000024801760201c565b816000019061ffff16908161ffff168152505060068263000009b991906300002f97565b91506000808390505b85518110156300000a4f576300000a0f63000009fc8760028463000009e991906300002f97565b6300001a8360201b63000025ab1760201c565b6300001aba60201b63000025dc1760201c565b60066300000a1f9190630000300b565b63ffffffff16816300000a3491906300002f97565b905081806300000a45906300002e2f565b92505063000009c2565b60008267ffffffffffffffff8111156300000a71576300000a706300002a7f565b5b6040519080825280602002602001820160405280156300000ab257816020015b6300000a9d63000028b8565b8152602001906001900390816300000a915790505b509050600092505b86518510156300000b2a576300000ad163000028b8565b6300000ae588876300001cdd60201b60201c565b8097508192505050808285806300000afe906300002e2f565b9650815181106300000b17576300000b166300002dc7565b5b6020026020010181905250506300000aba565b8084602001819052508395505050505050919050565b606081604001519050919050565b60006300000b6f600183604001516300001e9560201b63000027bd1760201c565b9050919050565b606081604001519050919050565b6300000b906300002886565b6300000b9c6300002886565b60006300000bb78463000008fe60201b63000020481760201c565b905060005b8160200151518110156300000cd3576000826020015182815181106300000bea576300000be96300002dc7565b5b60200260200101519050600061ffff16816000015161ffff16036300000c80576300000c23816300000b4e60201b63000022081760201c565b60ff1660018111156300000c3e576300000c3d6300002c65565b5b846000019060018111156300000c5b576300000c5a6300002c65565b5b908160018111156300000c75576300000c746300002c65565b5b815250506300000cb9565b600161ffff16816000015161ffff16036300000cb8576300000caf816300000b7660201b63000022201760201c565b84602001819052505b5b5080806300000cc9906300002e2f565b9150506300000bbc565b508192505050919050565b60006300000d176300000d04600884604001516300001ea360201b63000027cb1760201c565b6300001eb160201b63000027d91760201c565b9050919050565b6300000d2a6300002901565b6300000d366300002901565b60006300000d518463000008fe60201b63000020481760201c565b905060005b8160200151518110156300000e9d576000826020015182815181106300000d84576300000d836300002dc7565b5b60200260200101519050600061ffff16816000015161ffff16036300000dcc576300000dbd816300000b4060201b63000021fa1760201c565b84600001819052506300000e83565b600161ffff16816000015161ffff16036300000e0a576300000dfb816300000b7660201b63000022201760201c565b84602001819052506300000e82565b600261ffff16816000015161ffff16036300000e48576300000e39816300000b4060201b63000021fa1760201c565b84604001819052506300000e81565b600361ffff16816000015161ffff16036300000e80576300000e77816300000b7660201b63000022201760201c565b84606001819052505b5b5b5b5080806300000e93906300002e2f565b9150506300000d56565b508192505050919050565b6300000eb46300002929565b6300000ec06300002929565b60006300000edb8463000008fe60201b63000020481760201c565b905060005b8160200151518110156300000ffa576000826020015182815181106300000f0e576300000f0d6300002dc7565b5b60200260200101519050600061ffff16816000015161ffff16036300000f56576300000f47816300000b4060201b63000021fa1760201c565b84600001819052506300000fe0565b600161ffff16816000015161ffff16036300000fa6576300000f976300000f8a826300000b7660201b63000022201760201c565b6300000b8460201b60201c565b84602001819052506300000fdf565b600261ffff16816000015161ffff16036300000fde576300000fd5816300000b7660201b63000022201760201c565b84604001819052505b5b5b5080806300000ff0906300002e2f565b9150506300000ee0565b508192505050919050565b63000010116300002954565b630000101d6300002954565b600063000010388463000008fe60201b63000020481760201c565b905060005b816020015151811015630000126257600082602001518281518110630000106b57630000106a6300002dc7565b5b60200260200101519050600061ffff16816000015161ffff160363000010b35763000010a4816300000b4060201b63000021fa1760201c565b84600001819052506300001248565b600161ffff16816000015161ffff1603630000113f5763000010e2816300000b4e60201b63000022081760201c565b60ff16600181111563000010fd5763000010fc6300002c65565b5b84602001906001811115630000111a5763000011196300002c65565b5b9081600181111563000011345763000011336300002c65565b5b815250506300001247565b600261ffff16816000015161ffff1603630000117d57630000116e816300000b4060201b63000021fa1760201c565b84604001819052506300001246565b600361ffff16816000015161ffff160363000011bb5763000011ac816300000b4060201b63000021fa1760201c565b84606001819052506300001245565b600461ffff16816000015161ffff1603630000120b5763000011fc63000011ef826300000b7660201b63000022201760201c565b6300000b8460201b60201c565b84608001819052506300001244565b600561ffff16816000015161ffff1603630000124357630000123a816300000b7660201b63000022201760201c565b8460a001819052505b5b5b5b5b5b5080806300001258906300002e2f565b915050630000103d565b508192505050919050565b630000127963000029ac565b630000128563000029ac565b600063000012a08463000008fe60201b63000020481760201c565b905060005b816020015151811015630000148b5760008260200151828151811063000012d35763000012d26300002dc7565b5b60200260200101519050600061ffff16816000015161ffff1603630000131b57630000130c816300000b4060201b63000021fa1760201c565b84600001819052506300001471565b600161ffff16816000015161ffff1603630000135957630000134a816300000b4060201b63000021fa1760201c565b84602001819052506300001470565b600261ffff16816000015161ffff160363000013e5576300001388816300000b4e60201b63000022081760201c565b60ff16600281111563000013a35763000013a26300002c65565b5b8460400190600281111563000013c05763000013bf6300002c65565b5b9081600281111563000013da5763000013d96300002c65565b5b81525050630000146f565b600361ffff16816000015161ffff160363000014355763000014266300001419826300000b7660201b63000022201760201c565b6300000b8460201b60201c565b8460600181905250630000146e565b600461ffff16816000015161ffff1603630000146d576300001464816300000b7660201b63000022201760201c565b84608001819052505b5b5b5b5b5080806300001481906300002e2f565b91505063000012a5565b508192505050919050565b63000014a263000029fd565b63000014ae63000029fd565b600063000014c98463000008fe60201b63000020481760201c565b905060005b81602001515181101563000016275760008260200151828151811063000014fc5763000014fb6300002dc7565b5b60200260200101519050600061ffff16816000015161ffff16036300001544576300001535816300000b4060201b63000021fa1760201c565b8460000181905250630000160d565b600161ffff16816000015161ffff16036300001582576300001573816300000b4060201b63000021fa1760201c565b8460200181905250630000160c565b600361ffff16816000015161ffff160363000015d25763000015c363000015b6826300000b7660201b63000022201760201c565b6300000b8460201b60201c565b8460400181905250630000160b565b600461ffff16816000015161ffff1603630000160a576300001601816300000b7660201b63000022201760201c565b84606001819052505b5b5b5b508080630000161d906300002e2f565b91505063000014ce565b508192505050919050565b6000816001811115630000164d57630000164c6300002c65565b5b9050919050565b630000166063000028b8565b6000600167ffffffffffffffff81111563000016835763000016826300002a7f565b5b6040519080825280601f01601f19166020018201604052801563000016b75781602001600182028036833780820191505090505b50905063000016d660018483630000227060201b6300002b261760201c565b60405180606001604052808561ffff168152602001600163ffffffff1681526020018281525091505092915050565b630000171163000028b8565b60405180606001604052808461ffff168152602001835163ffffffff16815260200183815250905092915050565b60606000630000175c83630000228760201b6300002b3d1760201c565b9050600060068263000017719190630000300b565b63ffffffff1667ffffffffffffffff81111563000017965763000017956300002a7f565b5b6040519080825280601f01601f19166020018201604052801563000017ca5781602001600182028036833780820191505090505b5090506300001805600263000017f18660000151630000192e60201b63000024801760201c565b83630000232d60201b6300002bbd1760201c565b630000183960066300001825846300001aba60201b63000025dc1760201c565b83630000234460201b6300002bd41760201c565b60006006905060005b630000185b86630000235b60201b6300002beb1760201c565b81101563000018ed57600063000018a38760200151838151811063000018885763000018876300002dc7565b5b6020026020010151630000236a60201b6300002bfa1760201c565b905063000018c0838286630000247860201b6300002cac1760201c565b80518363000018d191906300002f97565b925050808063000018e3906300002e2f565b9150506300001842565b50819350505050919050565b60008251600283630000190e91906300002f97565b1115630000191b57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff811115630000195a5763000019596300002a7f565b5b6040519080825280601f01601f191660200182016040528015630000198e5781602001600182028036833780820191505090505b5090508160016002811063000019ab5763000019aa6300002dc7565b5b1a60f81b8160008151811063000019c95763000019c86300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600281106300001a12576300001a116300002dc7565b5b1a60f81b816001815181106300001a30576300001a2f6300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006300001a7682600063000018f960201b60201c565b9050809350505050919050565b600082516004836300001a9891906300002f97565b11156300001aa557600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff8111156300001ae6576300001ae56300002a7f565b5b6040519080825280601f01601f1916602001820160405280156300001b1a5781602001600182028036833780820191505090505b509050816003600481106300001b37576300001b366300002dc7565b5b1a60f81b816000815181106300001b55576300001b546300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816002600481106300001b9e576300001b9d6300002dc7565b5b1a60f81b816001815181106300001bbc576300001bbb6300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816001600481106300001c05576300001c046300002dc7565b5b1a60f81b816002815181106300001c23576300001c226300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600481106300001c6c576300001c6b6300002dc7565b5b1a60f81b816003815181106300001c8a576300001c896300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006300001cd08260006300001a8360201b60201c565b9050809350505050919050565b6300001ce963000028b8565b6000828451116300001d34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016300001d2b9063000030cd565b60405180910390fd5b60068310156300001d7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016300001d75906300003145565b60405180910390fd5b6300001d8a63000028b8565b6300001dbc6300001da9868663000018f960201b63000024511760201c565b630000192e60201b63000024801760201c565b816000019061ffff16908161ffff16815250506002846300001de091906300002f97565b93506300001e146300001e0186866300001a8360201b63000025ab1760201c565b6300001aba60201b63000025dc1760201c565b816020019063ffffffff16908163ffffffff16815250506004846300001e3c91906300002f97565b93506300001e638585836020015163ffffffff16630000253a60201b6300002d5e1760201c565b8160400181905250806020015163ffffffff16846300001e8591906300002f97565b9350808492509250509250929050565b600082820151905092915050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff8111156300001edd576300001edc6300002a7f565b5b6040519080825280601f01601f1916602001820160405280156300001f115781602001600182028036833780820191505090505b509050816007600881106300001f2e576300001f2d6300002dc7565b5b1a60f81b816000815181106300001f4c576300001f4b6300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816006600881106300001f95576300001f946300002dc7565b5b1a60f81b816001815181106300001fb3576300001fb26300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816005600881106300001ffc576300001ffb6300002dc7565b5b1a60f81b81600281518110630000201a5763000020196300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160046008811063000020635763000020626300002dc7565b5b1a60f81b8160038151811063000020815763000020806300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160036008811063000020ca5763000020c96300002dc7565b5b1a60f81b8160048151811063000020e85763000020e76300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160026008811063000021315763000021306300002dc7565b5b1a60f81b81600581518110630000214f57630000214e6300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160016008811063000021985763000021976300002dc7565b5b1a60f81b8160068151811063000021b65763000021b56300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006008811063000021ff5763000021fe6300002dc7565b5b1a60f81b81600781518110630000221d57630000221c6300002dc7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000630000226382600063000025e760201b60201c565b9050809350505050919050565b828101600181038051848352808252505050505050565b6000806000905060005b63000022aa84630000235b60201b6300002beb1760201c565b81101563000023235760008460200151828151811063000022d25763000022d16300002dc7565b5b6020026020010151905080604001515160068463000022f39190630000300b565b63ffffffff16630000230791906300002f97565b92505080806300002319906300002e2f565b9150506300002291565b5080915050919050565b828101600281038051848352808252505050505050565b828101600481038051848352808252505050505050565b60008160200151519050919050565b606060006006836020015163000023839190630000300b565b63ffffffff1667ffffffffffffffff81111563000023a85763000023a76300002a7f565b5b6040519080825280601f01601f19166020018201604052801563000023dc5781602001600182028036833780820191505090505b5090506300002417600263000024038560000151630000192e60201b63000024801760201c565b83630000232d60201b6300002bbd1760201c565b630000244f6006630000243b85602001516300001aba60201b63000025dc1760201c565b83630000234460201b6300002bd41760201c565b630000246f6006846040015183630000247860201b6300002cac1760201c565b80915050919050565b60008251905081518163ffffffff1685630000249691906300002f97565b111563000024dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040163000024d4906300003209565b60405180910390fd5b8015600081036300002533578483018051601f84168015602002818801018581018215602002838601015b81831015630000252957825181526020830192506020810190506300002508565b5083855250505050505b5050505050565b606083518284630000254e91906300002f97565b1115630000255b57600080fd5b60008267ffffffffffffffff811115630000257d57630000257c6300002a7f565b5b6040519080825280601f01601f19166020018201604052801563000025b15781602001600182028036833780820191505090505b509050600080602083019150856020880101905063000025da828287630000262260201b60201c565b8293505050509392505050565b6000825160088363000025fc91906300002f97565b1115630000260957600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b6020811063000026715781518352602083630000264291906300002f97565b9250602082630000265591906300002f97565b915060208163000026689190630000322d565b90506300002623565b600081031563000026c4576000600182602063000026919190630000322d565b61010063000026a2919063000033e4565b63000026b09190630000322d565b905080198351168185511681811786525050505b505050565b82805463000026d990630000346a565b90600052602060002090601f01602090048101928263000026ff57600085556300002750565b82601f10630000271c57805160ff19168380011785556300002750565b828001600101855582156300002750579182015b82811115630000274f5782518255916020019190600101906300002730565b5b509050630000276191906300002a2f565b5090565b828054630000277590630000346a565b90600052602060002090601f016020900481019282630000279b576000855563000027ec565b82601f1063000027b857805160ff191683800117855563000027ec565b8280016001018555821563000027ec579182015b8281111563000027eb57825182559160200191906001019063000027cc565b5b50905063000027fd91906300002a2f565b5090565b60405180610100016040528060608152602001606081526020016000600381111563000028355763000028346300002c65565b5b815260200163000028466300002886565b8152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681526020016060815260200163000028806300002901565b81525090565b60405180604001604052806000600181111563000028ab5763000028aa6300002c65565b5b8152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b60405180606001604052806060815260200163000029476300002886565b8152602001606081525090565b6040518060c001604052806060815260200160006001811115630000298057630000297f6300002c65565b5b81526020016060815260200160608152602001630000299f6300002886565b8152602001606081525090565b6040518060a0016040528060608152602001606081526020016000600281111563000029df5763000029de6300002c65565b5b815260200163000029f06300002886565b8152602001606081525090565b604051806080016040528060608152602001606081526020016300002a226300002886565b8152602001606081525090565b5b808211156300002a4c5760008160009055506001016300002a30565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6300002abb826300002a6e565b810181811067ffffffffffffffff821117156300002ae0576300002adf6300002a7f565b5b80604052505050565b60006300002af76300002a50565b90506300002b0782826300002aae565b919050565b600067ffffffffffffffff8211156300002b2d576300002b2c6300002a7f565b5b6300002b3a826300002a6e565b9050602081019050919050565b60005b838110156300002b695780820151818401526020810190506300002b4a565b838111156300002b7a576000848401525b50505050565b60006300002b9b6300002b94846300002b0c565b6300002ae9565b9050828152602081018484840111156300002bbd576300002bbc6300002a69565b5b6300002bcc8482856300002b47565b509392505050565b600082601f8301126300002bef576300002bee6300002a64565b5b81516300002c038482602086016300002b80565b91505092915050565b6000602082840312156300002c28576300002c276300002a5a565b5b600082015167ffffffffffffffff8111156300002c4c576300002c4b6300002a5f565b5b6300002c5c848285016300002bd4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600082825260208201905092915050565b7f77726f6e67207479706520666f72206263646e7320726f6f7420636572740000600082015250565b60006300002cdf601e836300002c94565b91506300002cee826300002ca5565b602082019050919050565b600060208201905081810360008301526300002d16816300002cce565b9050919050565b600081519050919050565b600081905092915050565b60006300002d42826300002d1d565b6300002d5081856300002d28565b93506300002d648185602086016300002b47565b80840191505092915050565b60006300002d8082846300002d33565b915081905092915050565b6000819050919050565b6300002da2816300002d8b565b82525050565b60006020820190506300002dc160008301846300002d95565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006300002e3e826300002e25565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036300002e76576300002e756300002df6565b5b600182019050919050565b7f676574436572744f776e65724f69643a20636572742074797065206e6f74207360008201527f7570706f72740000000000000000000000000000000000000000000000000000602082015250565b60006300002ee16026836300002c94565b91506300002ef0826300002e81565b604082019050919050565b600060208201905081810360008301526300002f18816300002ed0565b9050919050565b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b60006300002f596017836300002c94565b91506300002f68826300002f1f565b602082019050919050565b600060208201905081810360008301526300002f90816300002f48565b9050919050565b60006300002fa6826300002e25565b91506300002fb5836300002e25565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156300002ff0576300002fef6300002df6565b5b828201905092915050565b600063ffffffff82169050919050565b6000630000301a826300002ffb565b91506300003029836300002ffb565b92508263ffffffff0382111563000030485763000030476300002df6565b5b828201905092915050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b600063000030b36023836300002c94565b915063000030c2826300003053565b604082019050919050565b6000602082019050818103600083015263000030ea8163000030a2565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b6000630000312b600e836300002c94565b9150630000313a8263000030f1565b602082019050919050565b60006020820190508181036000830152630000316281630000311a565b9050919050565b7f7661724279746573546f4279746573426967456e6469616e3a206f666673657460008201527f2069732067726561746572207468616e20746865206f7574707574206c656e6760208201527f7468000000000000000000000000000000000000000000000000000000000000604082015250565b600063000031ef6042836300002c94565b915063000031fe826300003169565b606082019050919050565b6000602082019050818103600083015263000032268163000031de565b9050919050565b6000630000323c826300002e25565b9150630000324b836300002e25565b92508282101563000032645763000032636300002df6565b5b828203905092915050565b60008160011c9050919050565b6000808291508390505b600185111563000032d65780860481111563000032aa5763000032a96300002df6565b5b600185161563000032bb5780820291505b808102905063000032cd85630000326f565b94506300003286565b94509492505050565b60008263000032f3576001905063000033dd565b816300003305576000905063000033dd565b816001811463000033215760028114630000332d57630000336a565b600191505063000033dd565b60ff84111563000033455763000033446300002df6565b5b8360020a91508482111563000033625763000033616300002df6565b5b5063000033dd565b5060208310610133831016604e8410600b841016171563000033a95782820a90508381111563000033a25763000033a16300002df6565b5b63000033dd565b63000033ba8484846001630000327c565b9250905081840481111563000033d75763000033d66300002df6565b5b81810290505b9392505050565b600063000033f3826300002e25565b91506300003402836300002e25565b925063000034337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848463000032df565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680630000348457607f821691505b602082108103630000349d57630000349c630000343b565b5b50919050565b618a5d8063000034b46000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806395e8fcee116100f9578063bc327e4011610097578063d919581711610071578063d9195817146104de578063dde185461461050e578063e1ceb0301461053e578063fe8cc1e31461056e576101a9565b8063bc327e4014610472578063c2450b5014610490578063c3292b6d146104ae576101a9565b8063ad86bc03116100d3578063ad86bc03146103d6578063adc64a1814610406578063adf22b3f14610436578063ae14961d14610454576101a9565b806395e8fcee146103825780639646a30b1461039e578063a1d6c964146103ba576101a9565b80632534ddcc1161016657806373d6c7bd1161014057806373d6c7bd146102d45780637adcff0c146103045780638da5cb5b1461033457806390157ffb14610352576101a9565b80632534ddcc1461029257806355c265fe146102ae578063715018a6146102ca576101a9565b806304802a34146101ae5780630604420e146101ca57806309158b21146101fa57806312dabd3a1461022a5780631f56086f1461025a578063251459ef14610276575b600080fd5b6101c860048036038101906101c391906167ce565b61059e565b005b6101e460048036038101906101df91906167ce565b61097b565b6040516101f191906168b4565b60405180910390f35b610214600480360381019061020f919061690c565b610a3b565b60405161022191906169b0565b60405180910390f35b610244600480360381019061023f9190616a07565b610a6f565b6040516102519190616a82565b60405180910390f35b610274600480360381019061026f9190616adb565b610acd565b005b610290600480360381019061028b91906167ce565b610b24565b005b6102ac60048036038101906102a79190616adb565b610b7d565b005b6102c860048036038101906102c391906167ce565b610bd2565b005b6102d2610f21565b005b6102ee60048036038101906102e991906167ce565b610f35565b6040516102fb9190616a82565b60405180910390f35b61031e60048036038101906103199190616b2d565b610f7b565b60405161032b9190616b69565b60405180910390f35b61033c610f93565b6040516103499190616b69565b60405180910390f35b61036c60048036038101906103679190616bba565b610f9c565b6040516103799190616c3c565b60405180910390f35b61039c600480360381019061039791906167ce565b61103c565b005b6103b860048036038101906103b39190616adb565b6112b6565b005b6103d460048036038101906103cf9190616b2d565b611464565b005b6103f060048036038101906103eb9190616bba565b6116b4565b6040516103fd9190616c6d565b60405180910390f35b610420600480360381019061041b9190616bba565b6116d2565b60405161042d91906168b4565b60405180910390f35b61043e611778565b60405161044b9190616d46565b60405180910390f35b61045c611805565b6040516104699190616b69565b60405180910390f35b61047a61180b565b6040516104879190616d77565b60405180910390f35b610498611814565b6040516104a59190616b69565b60405180910390f35b6104c860048036038101906104c39190616d92565b61181e565b6040516104d59190616a82565b60405180910390f35b6104f860048036038101906104f39190616a07565b611876565b60405161050591906168b4565b60405180910390f35b61052860048036038101906105239190616d92565b61194e565b60405161053591906168b4565b60405180910390f35b61055860048036038101906105539190616f22565b611a20565b60405161056591906168b4565b60405180910390f35b610588600480360381019061058391906167ce565b611ad6565b60405161059591906168b4565b60405180910390f35b6105a6612df3565b60006105f583838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612e45565b9050610608816060015160600151613070565b610647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063e90616fb7565b60405180910390fd5b600061065a8260600151606001516130ad565b9050600061066b8360400151613172565b905061067f8360600151606001518261322e565b6106be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b590617023565b60405180910390fd5b6000600560006106d5856020015160c0015161327d565b6040015160028111156106eb576106ea616939565b5b60028111156106fd576106fc616939565b5b815260200190815260200160002054905060008103610751576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107489061708f565b60405180910390fd5b8063bff3093b61076986606001516060015185613402565b866040518363ffffffff1660e01b8152600401610787929190617431565b6020604051808303816000875af11580156107a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ca9190617494565b610809576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108009061750d565b60405180910390fd5b600061081885608001516134d9565b8051906020012090506000600460008381526020019081526020016000209050856020015163ffffffff168160000154101561089f57856020015163ffffffff1681600001819055507f14f6dcf24001d9e8910255539bf10f0a01ba6fcb712bdcd812fe528b9ad798d1828760200151604051610896929190617577565b60405180910390a15b8787826001016000896020015163ffffffff16815260200190815260200160002091906108cd929190616234565b507f8796377aabd0d7feac50b0be12f810cac9a467a6ccd01c3bb79e50e2da8fd1f2828760200151604051610903929190617577565b60405180910390a160006007541461097157600754631a383f188760e001516040518263ffffffff1660e01b815260040161093e91906168b4565b600060405180830381600087803b15801561095857600080fd5b505af115801561096c573d6000803e3d6000fd5b505050505b5050505050505050565b60606003600084846040516109919291906175d0565b6040518091039020815260200190815260200160002060000180546109b590617618565b80601f01602080910402602001604051908101604052809291908181526020018280546109e190617618565b8015610a2e5780601f10610a0357610100808354040283529160200191610a2e565b820191906000526020600020905b815481529060010190602001808311610a1157829003601f168201915b5050505050905092915050565b60068181548110610a4b57600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b600080600460008686604051610a869291906175d0565b6040518091039020815260200190815260200160002060010160008463ffffffff1681526020019081526020016000208054610ac190617618565b90501190509392505050565b610ad5612df3565b60008103610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f906176bb565b60405180910390fd5b610b21816137bd565b50565b610b2c612df3565b610b7982828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506137fc565b5050565b610b85612df3565b60008103610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf90617727565b60405180910390fd5b8060078190555050565b6000610c2183838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613991565b90506000610c3282602001516134d9565b9050600060046000838051906020012081526020019081526020016000206001016000846040015163ffffffff1681526020019081526020016000208054610c7990617618565b905011610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290617793565b60405180910390fd5b6000610cd182846040015163ffffffff16613ac9565b9050610ce4816060015160600151613070565b610d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1a90616fb7565b60405180910390fd5b6000610d368260600151606001516130ad565b90506000610d478360400151613172565b9050610d5b8360600151606001518261322e565b610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190617023565b60405180910390fd5b600060056000610db1856020015160c0015161327d565b604001516002811115610dc757610dc6616939565b5b6002811115610dd957610dd8616939565b5b815260200190815260200160002054905060008103610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e249061708f565b60405180910390fd5b6000816348a3c57086896040518363ffffffff1660e01b8152600401610e5492919061784e565b6020604051808303816000875af1158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e979190617494565b90507f4d2d7be42668dce2927650393613e408fc71274deac16f825eb0a869a5667e8c856080015182604051610ece9291906178d5565b60405180910390a180610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90617951565b60405180910390fd5b505050505050505050565b610f29612df3565b610f3360006137bd565b565b600080600360008585604051610f4c9291906175d0565b604051809103902081526020019081526020016000206000018054610f7090617618565b905011905092915050565b60056020528060005260406000206000915090505481565b60008054905090565b60026020528060005260406000206000915090508054610fbb90617618565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe790617618565b80156110345780601f1061100957610100808354040283529160200191611034565b820191906000526020600020905b81548152906001019060200180831161101757829003601f168201915b505050505081565b611044612df3565b600061109383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613b98565b905061109e81613d0c565b60006110a982613f56565b9050600060036000838152602001908152602001600020905060008160000180546110d390617618565b905011156111ca5784848260000191906110ee929190616234565b505b6110fd8360600151613f7b565b156111c55760006111118460600151613f90565b90506000826001016000838152602001908152602001600020805461113590617618565b9050036111b0576111498460600151613faa565b82600101600083815260200190815260200160002090805190602001906111719291906162ba565b507f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce83826040516111a3929190617971565b60405180910390a16111bf565b6111bd8460600151613faa565b505b506110f0565b6112af565b84848260000191906111dd929190616234565b505b6111ec8360600151613f7b565b156112775760006112008460600151613f90565b905061120f8460600151613faa565b82600101600083815260200190815260200160002090805190602001906112379291906162ba565b507f176999d0f8f8c628a9ada0c1090671dffa60ab4b6720f3d647a823aac2368fce8382604051611269929190617971565b60405180910390a1506111df565b7fc115cf6e41eccaaf9dbe48f3cbf3e82c176644e35bf1cae0839627723d980a0d826040516112a6919061799a565b60405180910390a15b5050505050565b6112be612df3565b60008163b93ba39c6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156112f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131b91906179ca565b905060006005600083600281111561133657611335616939565b5b600281111561134857611347616939565b5b81526020019081526020016000205414611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138e90617a43565b60405180910390fd5b60068190806001815401808255809150506001900390600052602060002090602091828204019190069091909190916101000a81548160ff021916908360028111156113e6576113e5616939565b5b0217905550816005600083600281111561140357611402616939565b5b600281111561141557611414616939565b5b8152602001908152602001600020819055507f30469544067c713d17864302c985ca87e4822f68e28079cbf956f9deab7c8fff8183604051611458929190617a63565b60405180910390a15050565b61146c612df3565b60006005600083600281111561148557611484616939565b5b600281111561149757611496616939565b5b815260200190815260200160002054036114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd90617ad8565b60405180910390fd5b6000600190505b60068054905081101561163e5781600281111561150d5761150c616939565b5b6006828154811061152157611520617af8565b5b90600052602060002090602091828204019190069054906101000a900460ff16600281111561155357611552616939565b5b0361162b576006600160068054905061156c9190617b56565b8154811061157d5761157c617af8565b5b90600052602060002090602091828204019190069054906101000a900460ff16600682815481106115b1576115b0617af8565b5b90600052602060002090602091828204019190066101000a81548160ff021916908360028111156115e5576115e4616939565b5b021790555060068054806115fc576115fb617b8a565b5b60019003818190600052602060002090602091828204019190066101000a81549060ff0219169055905561163e565b808061163690617bb9565b9150506114ed565b506005600082600281111561165657611655616939565b5b600281111561166857611667616939565b5b8152602001908152602001600020600090557f4ae9b990c01f3cf6322d2f72f0c0a7eefdcdb12b782e47f420dbc75314d7f508816040516116a991906169b0565b60405180910390a150565b60046020528060005260406000206000915090508060000154905081565b60036020528060005260406000206000915090508060000180546116f590617618565b80601f016020809104026020016040519081016040528092919081815260200182805461172190617618565b801561176e5780601f106117435761010080835404028352916020019161176e565b820191906000526020600020905b81548152906001019060200180831161175157829003601f168201915b5050505050905081565b606060068054806020026020016040519081016040528092919081815260200182805480156117fb57602002820191906000526020600020906000905b82829054906101000a900460ff1660028111156117d5576117d4616939565b5b815260200190600101906020826000010492830192600103820291508084116117b55790505b5050505050905090565b60075481565b60006002905090565b6000600754905090565b6000806003600086866040516118359291906175d0565b604051809103902081526020019081526020016000206001016000848152602001908152602001600020805461186a90617618565b90501190509392505050565b606060046000858560405161188c9291906175d0565b6040518091039020815260200190815260200160002060010160008363ffffffff16815260200190815260200160002080546118c790617618565b80601f01602080910402602001604051908101604052809291908181526020018280546118f390617618565b80156119405780601f1061191557610100808354040283529160200191611940565b820191906000526020600020905b81548152906001019060200180831161192357829003601f168201915b505050505090509392505050565b60606003600085856040516119649291906175d0565b604051809103902081526020019081526020016000206001016000838152602001908152602001600020805461199990617618565b80601f01602080910402602001604051908101604052809291908181526020018280546119c590617618565b8015611a125780601f106119e757610100808354040283529160200191611a12565b820191906000526020600020905b8154815290600101906020018083116119f557829003601f168201915b505050505090509392505050565b6001818051602081018201805184825260208301602085012081835280955050505050506000915090508054611a5590617618565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8190617618565b8015611ace5780601f10611aa357610100808354040283529160200191611ace565b820191906000526020600020905b815481529060010190602001808311611ab157829003601f168201915b505050505081565b60606000600460008585604051611aee9291906175d0565b604051809103902081526020019081526020016000209050806001016000826000015481526020019081526020016000208054611b2a90617618565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5690617618565b8015611ba35780601f10611b7857610100808354040283529160200191611ba3565b820191906000526020600020905b815481529060010190602001808311611b8657829003601f168201915b505050505091505092915050565b611bb9616340565b611bc1616340565b6000611bcc84612048565b905060005b816020015151811015611de257600082602001518281518110611bf757611bf6617af8565b5b60200260200101519050600061ffff16816000015161ffff1603611c2b57611c1e816121fa565b8460000181905250611dce565b600161ffff16816000015161ffff1603611c5557611c48816121fa565b8460200181905250611dcd565b600261ffff16816000015161ffff1603611cbb57611c7281612208565b60ff166003811115611c8757611c86616939565b5b84604001906003811115611c9e57611c9d616939565b5b90816003811115611cb257611cb1616939565b5b81525050611dcc565b600361ffff16816000015161ffff1603611ced57611ce0611cdb82612220565b61403c565b8460600181905250611dcb565b600461ffff16816000015161ffff1603611d2e57611d0a8161222e565b846080019067ffffffffffffffff16908167ffffffffffffffff1681525050611dca565b600561ffff16816000015161ffff1603611d6f57611d4b8161222e565b8460a0019067ffffffffffffffff16908167ffffffffffffffff1681525050611dc9565b600661ffff16816000015161ffff1603611d9957611d8c81612220565b8460c00181905250611dc8565b600761ffff16816000015161ffff1603611dc757611dbe611db982612220565b614138565b8460e001819052505b5b5b5b5b5b5b5b508080611dda90617bb9565b915050611bd1565b508192505050919050565b611df56163b7565b60006003811115611e0957611e08616939565b5b82604001516003811115611e2057611e1f616939565b5b03611e3d57611e328260c0015161424e565b602001519050611f4f565b60016003811115611e5157611e50616939565b5b82604001516003811115611e6857611e67616939565b5b03611e8557611e7a8260c00151614341565b608001519050611f4f565b60026003811115611e9957611e98616939565b5b82604001516003811115611eb057611eaf616939565b5b03611ecd57611ec28260c0015161327d565b606001519050611f4f565b600380811115611ee057611edf616939565b5b82604001516003811115611ef757611ef6616939565b5b03611f1457611f098260c001516144f1565b604001519050611f4f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4690617c73565b60405180910390fd5b919050565b60606000600267ffffffffffffffff811115611f7357611f72616df7565b5b604051908082528060200260200182016040528015611fac57816020015b611f996163e3565b815260200190600190039081611f915790505b509050611fd86000611fd385600001516001811115611fce57611fcd616939565b5b61224e565b61226a565b81600081518110611fec57611feb617af8565b5b6020026020010181905250612006600184602001516122ff565b8160018151811061201a57612019617af8565b5b602002602001018190525061202d61640e565b81816020018190525061203f81612335565b92505050919050565b61205061640e565b600682511015612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90617cdf565b60405180910390fd5b600061209f61640e565b6120b16120ac8584612451565b612480565b816000019061ffff16908161ffff16815250506006826120d19190617cff565b91506000808390505b8551811015612133576121016120fc876002846120f79190617cff565b6125ab565b6125dc565b600661210d9190617d55565b63ffffffff168161211e9190617cff565b9050818061212b90617bb9565b9250506120da565b60008267ffffffffffffffff81111561214f5761214e616df7565b5b60405190808252806020026020018201604052801561218857816020015b6121756163e3565b81526020019060019003908161216d5790505b509050600092505b86518510156121e4576121a16163e3565b6121ab888761460f565b8097508192505050808285806121c090617bb9565b9650815181106121d3576121d2617af8565b5b602002602001018190525050612190565b8084602001819052508395505050505050919050565b606081604001519050919050565b6000612219600183604001516127bd565b9050919050565b606081604001519050919050565b6000612247612242600884604001516127cb565b6127d9565b9050919050565b600081600181111561226357612262616939565b5b9050919050565b6122726163e3565b6000600167ffffffffffffffff81111561228f5761228e616df7565b5b6040519080825280601f01601f1916602001820160405280156122c15781602001600182028036833780820191505090505b5090506122d060018483612b26565b60405180606001604052808561ffff168152602001600163ffffffff1681526020018281525091505092915050565b6123076163e3565b60405180606001604052808461ffff168152602001835163ffffffff16815260200183815250905092915050565b6060600061234283612b3d565b905060006006826123539190617d55565b63ffffffff1667ffffffffffffffff81111561237257612371616df7565b5b6040519080825280601f01601f1916602001820160405280156123a45781602001600182028036833780820191505090505b5090506123bf60026123b98660000151612480565b83612bbd565b6123d360066123cd846125dc565b83612bd4565b60006006905060005b6123e586612beb565b8110156124455760006124158760200151838151811061240857612407617af8565b5b6020026020010151612bfa565b9050612422838286612cac565b80518361242f9190617cff565b925050808061243d90617bb9565b9150506123dc565b50819350505050919050565b600082516002836124629190617cff565b111561246d57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff8111156124a6576124a5616df7565b5b6040519080825280601f01601f1916602001820160405280156124d85781602001600182028036833780820191505090505b509050816001600281106124ef576124ee617af8565b5b1a60f81b8160008151811061250757612506617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006002811061254a57612549617af8565b5b1a60f81b8160018151811061256257612561617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061259e826000612451565b9050809350505050919050565b600082516004836125bc9190617cff565b11156125c757600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff81111561260257612601616df7565b5b6040519080825280601f01601f1916602001820160405280156126345781602001600182028036833780820191505090505b5090508160036004811061264b5761264a617af8565b5b1a60f81b8160008151811061266357612662617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816002600481106126a6576126a5617af8565b5b1a60f81b816001815181106126be576126bd617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160016004811061270157612700617af8565b5b1a60f81b8160028151811061271957612718617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006004811061275c5761275b617af8565b5b1a60f81b8160038151811061277457612773617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006127b08260006125ab565b9050809350505050919050565b600082820151905092915050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff8111156127ff576127fe616df7565b5b6040519080825280601f01601f1916602001820160405280156128315781602001600182028036833780820191505090505b5090508160076008811061284857612847617af8565b5b1a60f81b816000815181106128605761285f617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816006600881106128a3576128a2617af8565b5b1a60f81b816001815181106128bb576128ba617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816005600881106128fe576128fd617af8565b5b1a60f81b8160028151811061291657612915617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160046008811061295957612958617af8565b5b1a60f81b8160038151811061297157612970617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816003600881106129b4576129b3617af8565b5b1a60f81b816004815181106129cc576129cb617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260088110612a0f57612a0e617af8565b5b1a60f81b81600581518110612a2757612a26617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160088110612a6a57612a69617af8565b5b1a60f81b81600681518110612a8257612a81617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060088110612ac557612ac4617af8565b5b1a60f81b81600781518110612add57612adc617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612b19826000614757565b9050809350505050919050565b828101600181038051848352808252505050505050565b6000806000905060005b612b5084612beb565b811015612bb357600084602001518281518110612b7057612b6f617af8565b5b60200260200101519050806040015151600684612b8d9190617d55565b63ffffffff16612b9d9190617cff565b9250508080612bab90617bb9565b915050612b47565b5080915050919050565b828101600281038051848352808252505050505050565b828101600481038051848352808252505050505050565b60008160200151519050919050565b6060600060068360200151612c0f9190617d55565b63ffffffff1667ffffffffffffffff811115612c2e57612c2d616df7565b5b6040519080825280601f01601f191660200182016040528015612c605781602001600182028036833780820191505090505b509050612c7b6002612c758560000151612480565b83612bbd565b612c936006612c8d85602001516125dc565b83612bd4565b612ca36006846040015183612cac565b80915050919050565b60008251905081518163ffffffff1685612cc69190617cff565b1115612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90617e27565b60405180910390fd5b801560008103612d57578483018051601f84168015602002818801018581018215602002838601015b81831015612d4d5782518152602083019250602081019050612d30565b5083855250505050505b5050505050565b606083518284612d6e9190617cff565b1115612d7957600080fd5b60008267ffffffffffffffff811115612d9557612d94616df7565b5b6040519080825280601f01601f191660200182016040528015612dc75781602001600182028036833780820191505090505b5090506000806020830191508560208801019050612de682828761478c565b8293505050509392505050565b612dfb614815565b612e03610f93565b14612e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3a90617e93565b60405180910390fd5b565b612e4d61642c565b612e5561642c565b6000612e6084612048565b905060005b81602001515181101561306557600082602001518281518110612e8b57612e8a617af8565b5b60200260200101519050600061ffff16816000015161ffff1603612ece57612eb28161481d565b846000019063ffffffff16908163ffffffff1681525050613051565b600161ffff16816000015161ffff1603612f0757612eeb8161481d565b846020019063ffffffff16908163ffffffff1681525050613050565b600261ffff16816000015161ffff1603612f3157612f248161483d565b846040018190525061304f565b600361ffff16816000015161ffff1603612f6357612f56612f5182612220565b61327d565b846060018190525061304e565b600461ffff16816000015161ffff1603612f9557612f88612f8382612220565b61484b565b846080018190525061304d565b600561ffff16816000015161ffff1603612fce57612fb28161481d565b8460a0019063ffffffff16908163ffffffff168152505061304c565b600661ffff16816000015161ffff1603612ff857612feb816121fa565b8460c0018190525061304b565b600761ffff16816000015161ffff16036130225761301581612220565b8460e0018190525061304a565b60ff61ffff16816000015161ffff16036130495761303f81612220565b8461010001819052505b5b5b5b5b5b5b5b5b50808061305d90617bb9565b915050612e65565b508192505050919050565b6000806003600061308085611f54565b80519060200120815260200190815260200160002060000180546130a390617618565b9050119050919050565b6130b5616496565b61316b600360006130c585611f54565b80519060200120815260200190815260200160002060000180546130e890617618565b80601f016020809104026020016040519081016040528092919081815260200182805461311490617618565b80156131615780601f1061313657610100808354040283529160200191613161565b820191906000526020600020905b81548152906001019060200180831161314457829003601f168201915b5050505050613b98565b9050919050565b6000808251905060208111156131bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b490617f25565b60405180910390fd5b60008167ffffffffffffffff8111156131d9576131d8616df7565b5b6040519080825280601f01601f19166020018201604052801561320b5781602001600182028036833780820191505090505b509050600084518252828501518383015180820392505050809350505050919050565b6000806003600061323e86611f54565b8051906020012081526020019081526020016000206001016000848152602001908152602001600020805461327290617618565b905011905092915050565b6132856164d8565b61328d6164d8565b600061329884612048565b905060005b8160200151518110156133f7576000826020015182815181106132c3576132c2617af8565b5b60200260200101519050600061ffff16816000015161ffff16036132f7576132ea816121fa565b84600001819052506133e3565b600161ffff16816000015161ffff160361332157613314816121fa565b84602001819052506133e2565b600261ffff16816000015161ffff16036133875761333e81612208565b60ff16600281111561335357613352616939565b5b8460400190600281111561336a57613369616939565b5b9081600281111561337e5761337d616939565b5b815250506133e1565b600361ffff16816000015161ffff16036133b9576133ac6133a782612220565b61403c565b84606001819052506133e0565b600461ffff16816000015161ffff16036133df576133d681612220565b84608001819052505b5b5b5b5b5080806133ef90617bb9565b91505061329d565b508192505050919050565b61340a61651f565b6134d16003600061341a86611f54565b8051906020012081526020019081526020016000206001016000848152602001908152602001600020805461344e90617618565b80601f016020809104026020016040519081016040528092919081815260200182805461347a90617618565b80156134c75780601f1061349c576101008083540402835291602001916134c7565b820191906000526020600020905b8154815290600101906020018083116134aa57829003601f168201915b5050505050614960565b905092915050565b6060806000801b83602001511480156134f857506000801b8360400151145b1561358f57600167ffffffffffffffff81111561351857613517616df7565b5b60405190808252806020026020018201604052801561355157816020015b61353e6163e3565b8152602001906001900390816135365790505b50905061356b60006135668560000151614a20565b6122ff565b8160008151811061357f5761357e617af8565b5b602002602001018190525061379a565b6000801b8360200151141580156135ad57506000801b836040015114155b1561375e57600367ffffffffffffffff8111156135cd576135cc616df7565b5b60405190808252806020026020018201604052801561360657816020015b6135f36163e3565b8152602001906001900390816135eb5790505b509050613620600061361b8560000151614a20565b6122ff565b8160008151811061363457613633617af8565b5b60200260200101819052506000602067ffffffffffffffff81111561365c5761365b616df7565b5b6040519080825280601f01601f19166020018201604052801561368e5781602001600182028036833780820191505090505b5090506136a16020856020015183614b92565b6136ac6001826122ff565b826001815181106136c0576136bf617af8565b5b60200260200101819052506000602067ffffffffffffffff8111156136e8576136e7616df7565b5b6040519080825280601f01601f19166020018201604052801561371a5781602001600182028036833780820191505090505b50905061372d6020866040015183614b92565b6137386002826122ff565b8360028151811061374c5761374b617af8565b5b60200260200101819052505050613799565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379090617f91565b60405180910390fd5b5b6137a261640e565b8181602001819052506137b481612335565b92505050919050565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b600061380782611bb1565b90506000600381111561381d5761381c616939565b5b8160400151600381111561383457613833616939565b5b14613874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386b90617ffd565b60405180910390fd5b600061388761388283611ded565b611f54565b8051906020012090508260016040518060400160405280600481526020017f726f6f74000000000000000000000000000000000000000000000000000000008152506040516138d69190618059565b908152602001604051809103902090805190602001906138f79291906162ba565b506040518060400160405280600481526020017f726f6f7400000000000000000000000000000000000000000000000000000000815250600260008381526020019081526020016000209080519060200190613954929190616539565b507f7c787bfbe942686b5f41acec151012ca79c6b81c1c5a23cee512781cf3d5b9bb81604051613984919061799a565b60405180910390a1505050565b6139996165bf565b6139a16165bf565b60006139ac84612048565b905060005b816020015151811015613abe576000826020015182815181106139d7576139d6617af8565b5b60200260200101519050600561ffff16816000015161ffff1603613a1357613a06613a0182612220565b614b9c565b8460000181905250613aaa565b61010161ffff16816000015161ffff1603613a4657613a39613a3482612220565b61484b565b8460200181905250613aa9565b61010061ffff16816000015161ffff1603613a8057613a648161481d565b846040019063ffffffff16908163ffffffff1681525050613aa8565b6101ff61ffff16816000015161ffff1603613aa757613a9e81612220565b84606001819052505b5b5b5b508080613ab690617bb9565b9150506139b1565b508192505050919050565b613ad161642c565b613b90600460008580519060200120815260200190815260200160002060010160008481526020019081526020016000208054613b0d90617618565b80601f0160208091040260200160405190810160405280929190818152602001828054613b3990617618565b8015613b865780601f10613b5b57610100808354040283529160200191613b86565b820191906000526020600020905b815481529060010190602001808311613b6957829003601f168201915b5050505050612e45565b905092915050565b613ba0616496565b613ba8616496565b6000613bb384612048565b905060005b816020015151811015613d0157600082602001518281518110613bde57613bdd617af8565b5b60200260200101519050600061ffff16816000015161ffff1603613c1257613c05816121fa565b8460000181905250613ced565b600161ffff16816000015161ffff1603613c4457613c37613c3282612220565b611bb1565b8460200181905250613cec565b600261ffff16816000015161ffff1603613c6e57613c6181612220565b8460400181905250613ceb565b600361ffff16816000015161ffff1603613c9857613c8b81614c31565b8460600181905250613cea565b600461ffff16816000015161ffff1603613cc257613cb5816121fa565b8460800181905250613ce9565b600561ffff16816000015161ffff1603613ce857613cdf81612220565b8460a001819052505b5b5b5b5b5b508080613cf990617bb9565b915050613bb8565b508192505050919050565b6000613d1f826020015160600151611f54565b8051906020012090506000600260008381526020019081526020016000208054613d4890617618565b905011613d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d81906180bc565b60405180910390fd5b6000613e4d600160026000858152602001908152602001600020604051613db19190618170565b90815260200160405180910390208054613dca90617618565b80601f0160208091040260200160405190810160405280929190818152602001828054613df690617618565b8015613e435780601f10613e1857610100808354040283529160200191613e43565b820191906000526020600020905b815481529060010190602001808311613e2657829003601f168201915b5050505050611bb1565b9050613e9f6040518060400160405280601681526020017f4b656363616b32353657697468536563703235366b31000000000000000000008152508260e0015160400151614c5a90919063ffffffff16565b15613f0957600080613ebe838660200151614c7590919063ffffffff16565b91509150818190613f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613efc9190616c3c565b60405180910390fd5b5050505b613f1283614e7b565b613f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f48906181d3565b60405180910390fd5b505050565b6000613f6d613f688360200151611ded565b611f54565b805190602001209050919050565b60008160200151518260000151109050919050565b6000613fa3613f9e83613faa565b613172565b9050919050565b6060816020015151826000015110613ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fee90618265565b60405180910390fd5b600061400b83600001518460200151614eac565b90508051600484600001516140209190617cff565b61402a9190617cff565b83600001818152505080915050919050565b6140446163b7565b61404c6163b7565b600061405784612048565b905060005b81602001515181101561412d5760008260200151828151811061408257614081617af8565b5b60200260200101519050600061ffff16816000015161ffff16036140f2576140a981612208565b60ff1660018111156140be576140bd616939565b5b846000019060018111156140d5576140d4616939565b5b908160018111156140e9576140e8616939565b5b81525050614119565b600161ffff16816000015161ffff16036141185761410f81612220565b84602001819052505b5b50808061412590617bb9565b91505061405c565b508192505050919050565b6141406165f9565b6141486165f9565b600061415384612048565b905060005b8160200151518110156142435760008260200151828151811061417e5761417d617af8565b5b60200260200101519050600061ffff16816000015161ffff16036141b2576141a5816121fa565b846000018190525061422f565b600161ffff16816000015161ffff16036141dc576141cf81612220565b846020018190525061422e565b600261ffff16816000015161ffff1603614206576141f9816121fa565b846040018190525061422d565b600361ffff16816000015161ffff160361422c5761422381612220565b84606001819052505b5b5b5b50808061423b90617bb9565b915050614158565b508192505050919050565b614256616621565b61425e616621565b600061426984612048565b905060005b8160200151518110156143365760008260200151828151811061429457614293617af8565b5b60200260200101519050600061ffff16816000015161ffff16036142c8576142bb816121fa565b8460000181905250614322565b600161ffff16816000015161ffff16036142fa576142ed6142e882612220565b61403c565b8460200181905250614321565b600261ffff16816000015161ffff16036143205761431781612220565b84604001819052505b5b5b50808061432e90617bb9565b91505061426e565b508192505050919050565b614349616648565b614351616648565b600061435c84612048565b905060005b8160200151518110156144e65760008260200151828151811061438757614386617af8565b5b60200260200101519050600061ffff16816000015161ffff16036143bb576143ae816121fa565b84600001819052506144d2565b600161ffff16816000015161ffff1603614421576143d881612208565b60ff1660018111156143ed576143ec616939565b5b8460200190600181111561440457614403616939565b5b9081600181111561441857614417616939565b5b815250506144d1565b600261ffff16816000015161ffff160361444b5761443e816121fa565b84604001819052506144d0565b600361ffff16816000015161ffff160361447557614468816121fa565b84606001819052506144cf565b600461ffff16816000015161ffff16036144a75761449a61449582612220565b61403c565b84608001819052506144ce565b600561ffff16816000015161ffff16036144cd576144c481612220565b8460a001819052505b5b5b5b5b5b5080806144de90617bb9565b915050614361565b508192505050919050565b6144f9616696565b614501616696565b600061450c84612048565b905060005b8160200151518110156146045760008260200151828151811061453757614536617af8565b5b60200260200101519050600061ffff16816000015161ffff160361456b5761455e816121fa565b84600001819052506145f0565b600161ffff16816000015161ffff160361459557614588816121fa565b84602001819052506145ef565b600361ffff16816000015161ffff16036145c7576145ba6145b582612220565b61403c565b84604001819052506145ee565b600461ffff16816000015161ffff16036145ed576145e481612220565b84606001819052505b5b5b5b5080806145fc90617bb9565b915050614511565b508192505050919050565b6146176163e3565b60008284511161465c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614653906182f7565b60405180910390fd5b60068310156146a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161469790618363565b60405180910390fd5b6146a86163e3565b6146ba6146b58686612451565b612480565b816000019061ffff16908161ffff16815250506002846146da9190617cff565b93506146ee6146e986866125ab565b6125dc565b816020019063ffffffff16908163ffffffff16815250506004846147129190617cff565b93506147298585836020015163ffffffff16612d5e565b8160400181905250806020015163ffffffff16846147479190617cff565b9350808492509250509250929050565b600082516008836147689190617cff565b111561477357600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b602081106147cb57815183526020836147a69190617cff565b92506020826147b59190617cff565b91506020816147c49190617b56565b905061478d565b600081031561481057600060018260206147e59190617b56565b6101006147f291906184b6565b6147fc9190617b56565b905080198351168185511681811786525050505b505050565b600033905090565b600061483661483160048460400151614f53565b6125dc565b9050919050565b606081604001519050919050565b6148536166c4565b61485b6166c4565b600061486684612048565b905060005b8160200151518110156149555760008260200151828151811061489157614890617af8565b5b60200260200101519050600061ffff16816000015161ffff16036148cd576148c06148bb82612220565b614f61565b8460000181905250614941565b600161ffff16816000015161ffff16036149085760006148ec82612220565b90506148f9815182615021565b85602001818152505050614940565b600261ffff16816000015161ffff160361493f57600061492782612220565b9050614934815182615021565b856040018181525050505b5b5b50808061494d90617bb9565b91505061486b565b508192505050919050565b61496861651f565b61497061651f565b600061497b84612048565b905060005b816020015151811015614a15576000826020015182815181106149a6576149a5617af8565b5b60200260200101519050600061ffff16816000015161ffff16036149da576149cd8161483d565b8460000181905250614a01565b600161ffff16816000015161ffff1603614a00576149f781612220565b84602001819052505b5b508080614a0d90617bb9565b915050614980565b508192505050919050565b60608060008360200151511115614ae957600267ffffffffffffffff811115614a4c57614a4b616df7565b5b604051908082528060200260200182016040528015614a8557816020015b614a726163e3565b815260200190600190039081614a6a5790505b509050614a976000846000015161502f565b81600081518110614aab57614aaa617af8565b5b6020026020010181905250614ac56001846020015161502f565b81600181518110614ad957614ad8617af8565b5b6020026020010181905250614b6f565b600167ffffffffffffffff811115614b0457614b03616df7565b5b604051908082528060200260200182016040528015614b3d57816020015b614b2a6163e3565b815260200190600190039081614b225790505b509050614b4f6000846000015161502f565b81600081518110614b6357614b62617af8565b5b60200260200101819052505b614b7761640e565b818160200181905250614b8981612335565b92505050919050565b8183820152505050565b614ba46166f1565b614bac6166f1565b6000614bb784612048565b905060005b816020015151811015614c2657600082602001518281518110614be257614be1617af8565b5b60200260200101519050600061ffff16816000015161ffff1603614c1257614c0981612220565b84600001819052505b508080614c1e90617bb9565b915050614bbc565b508192505050919050565b614c39616704565b60405180604001604052806000815260200183604001518152509050919050565b60008180519060200120838051906020012014905092915050565b6000606060006003811115614c8d57614c8c616939565b5b83604001516003811115614ca457614ca3616939565b5b03614d04576000614cb88460c0015161424e565b9050614cd58160200151866060015161506b90919063ffffffff16565b614cfe5760006040518060600160405280602881526020016189cd602891399250925050614e74565b50614e08565b60016003811115614d1857614d17616939565b5b83604001516003811115614d2f57614d2e616939565b5b03614de3576000614d438460c00151614341565b9050600180811115614d5857614d57616939565b5b81602001516001811115614d6f57614d6e616939565b5b14614d9957600060405180608001604052806053815260200161897a605391399250925050614e74565b614db48160800151866060015161506b90919063ffffffff16565b614ddd5760006040518060600160405280602881526020016189cd602891399250925050614e74565b50614e07565b60006040518060600160405280603d8152602001618916603d913991509150614e74565b5b614e348460e0015160400151614e1d85615096565b614e2687615207565b8760e00151606001516153e9565b15614e545760016040518060200160405280600081525091509150614e74565b600060405180606001604052806027815260200161895360279139915091505b9250929050565b6000614ea58260800151614e928460200151615096565b614e9b856155c9565b8560a001516153e9565b9050919050565b6060600483614ebb9190617cff565b92506000614ed1614ecc8585614f53565b615739565b63ffffffff1690506060811560008114614ef657604051915060208201604052614f47565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015614f345780518352602083019250602081019050614f17565b50858552601f19601f8301166040525050505b50809250505092915050565b600082820151905092915050565b614f6961671e565b614f7161671e565b6000614f7c84612048565b905060005b81602001515181101561501657600082602001518281518110614fa757614fa6617af8565b5b60200260200101519050600061ffff16816000015161ffff1603614fdb57614fce816121fa565b8460000181905250615002565b600161ffff16816000015161ffff160361500157614ff8816121fa565b84602001819052505b5b50808061500e90617bb9565b915050614f81565b508192505050919050565b600082820151905092915050565b6150376163e3565b600082905060405180606001604052808561ffff168152602001825163ffffffff1681526020018281525091505092915050565b600061507682611f54565b8051906020012061508684611f54565b8051906020012014905092915050565b6060600060038111156150ac576150ab616939565b5b826040015160038111156150c3576150c2616939565b5b036150e4576150dd6150d88360c0015161424e565b61591a565b9050615202565b600160038111156150f8576150f7616939565b5b8260400151600381111561510f5761510e616939565b5b03615130576151296151248360c00151614341565b61593e565b9050615202565b6002600381111561514457615143616939565b5b8260400151600381111561515b5761515a616939565b5b0361517c576151756151708360c0015161327d565b615962565b9050615202565b60038081111561518f5761518e616939565b5b826040015160038111156151a6576151a5616939565b5b036151c7576151c06151bb8360c001516144f1565b615986565b9050615202565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151f990618573565b60405180910390fd5b919050565b60606000600767ffffffffffffffff81111561522657615225616df7565b5b60405190808252806020026020018201604052801561525f57816020015b61524c6163e3565b8152602001906001900390816152445790505b5090506152716000846000015161502f565b8160008151811061528557615284617af8565b5b602002602001018190525061529f6001846020015161502f565b816001815181106152b3576152b2617af8565b5b60200260200101819052506152e760026152e2856040015160038111156152dd576152dc616939565b5b6159aa565b61226a565b816002815181106152fb576152fa617af8565b5b602002602001018190525061531d60036153188560600151611f54565b6122ff565b8160038151811061533157615330617af8565b5b602002602001018190525061534b600484608001516159c6565b8160048151811061535f5761535e617af8565b5b602002602001018190525061537960058460a001516159c6565b8160058151811061538d5761538c617af8565b5b60200260200101819052506153a760068460c001516122ff565b816006815181106153bb576153ba617af8565b5b60200260200101819052506153ce61640e565b8181602001819052506153e081612335565b92505050919050565b60006154336040518060400160405280601681526020017f4b656363616b32353657697468536563703235366b310000000000000000000081525086614c5a90919063ffffffff16565b615472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161546990618605565b60405180910390fd5b6041825110156154b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016154ae90618671565b60405180910390fd5b601b826040815181106154cd576154cc617af8565b5b602001015160f81c60f81b60f81c6154e5919061869e565b60f81b826040815181106154fc576154fb617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061554761553986615a63565b858051906020012085615abf565b9050601b8360408151811061555f5761555e617af8565b5b602001015160f81c60f81b60f81c61557791906186d5565b60f81b8360408151811061558e5761558d617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080915050949350505050565b60606000600567ffffffffffffffff8111156155e8576155e7616df7565b5b60405190808252806020026020018201604052801561562157816020015b61560e6163e3565b8152602001906001900390816156065790505b5090506156336000846000015161502f565b8160008151811061564757615646617af8565b5b602002602001018190525061566960016156648560200151615b22565b6122ff565b8160018151811061567d5761567c617af8565b5b6020026020010181905250615697600284604001516122ff565b816002815181106156ab576156aa617af8565b5b60200260200101819052506156c960038460600151602001516122ff565b816003815181106156dd576156dc617af8565b5b60200260200101819052506156f76004846080015161502f565b8160048151811061570b5761570a617af8565b5b602002602001018190525061571e61640e565b81816020018190525061573081612335565b92505050919050565b6000808260e01b90506000600467ffffffffffffffff81111561575f5761575e616df7565b5b6040519080825280601f01601f1916602001820160405280156157915781602001600182028036833780820191505090505b509050816003600481106157a8576157a7617af8565b5b1a60f81b816000815181106157c0576157bf617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160026004811061580357615802617af8565b5b1a60f81b8160018151811061581b5761581a617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160016004811061585e5761585d617af8565b5b1a60f81b8160028151811061587657615875617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600481106158b9576158b8617af8565b5b1a60f81b816003815181106158d1576158d0617af8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061590d826000615d3a565b9050809350505050919050565b606061593782604001518360200151615d6b90919063ffffffff16565b9050919050565b606061595b8260a001518360800151615d6b90919063ffffffff16565b9050919050565b606061597f82608001518360600151615d6b90919063ffffffff16565b9050919050565b60606159a382606001518360400151615d6b90919063ffffffff16565b9050919050565b60008160038111156159bf576159be616939565b5b9050919050565b6159ce6163e3565b6000600867ffffffffffffffff8111156159eb576159ea616df7565b5b6040519080825280601f01601f191660200182016040528015615a1d5781602001600182028036833780820191505090505b509050615a346008615a2e856127d9565b83615eb2565b60405180606001604052808561ffff168152602001600863ffffffff1681526020018281525091505092915050565b6000600282604051615a75919061873a565b602060405180830381855afa158015615a92573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190615ab59190618766565b60001c9050919050565b6000806000615ace8585615ec9565b9150915060006004811115615ae657615ae5616939565b5b816004811115615af957615af8616939565b5b148015615b0557508582145b80615b175750615b16868686615f1a565b5b925050509392505050565b60606000600867ffffffffffffffff811115615b4157615b40616df7565b5b604051908082528060200260200182016040528015615b7a57816020015b615b676163e3565b815260200190600190039081615b5f5790505b509050615b8c6000846000015161502f565b81600081518110615ba057615b9f617af8565b5b6020026020010181905250615bba6001846020015161502f565b81600181518110615bce57615bcd617af8565b5b6020026020010181905250615c026002615bfd85604001516003811115615bf857615bf7616939565b5b6159aa565b61226a565b81600281518110615c1657615c15617af8565b5b6020026020010181905250615c386003615c338560600151611f54565b6122ff565b81600381518110615c4c57615c4b617af8565b5b6020026020010181905250615c66600484608001516159c6565b81600481518110615c7a57615c79617af8565b5b6020026020010181905250615c9460058460a001516159c6565b81600581518110615ca857615ca7617af8565b5b6020026020010181905250615cc260068460c001516122ff565b81600681518110615cd657615cd5617af8565b5b6020026020010181905250615cf86007615cf38560e00151616048565b6122ff565b81600781518110615d0c57615d0b617af8565b5b6020026020010181905250615d1f61640e565b818160200181905250615d3181612335565b92505050919050565b60008251600483615d4b9190617cff565b1115615d5657600080fd5b63ffffffff8260048501015116905092915050565b606060006001811115615d8157615d80616939565b5b83600001516001811115615d9857615d97616939565b5b14615dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615dcf90618805565b60405180910390fd5b60408360200151511015615e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615e1890618871565b60405180910390fd5b600083602001519050600060408251615e3a9190617b56565b90506000604067ffffffffffffffff811115615e5957615e58616df7565b5b6040519080825280601f01601f191660200182016040528015615e8b5781602001600182028036833780820191505090505b50905081602084010151602082015281604084010151604082015280935050505092915050565b828101600881038051848352808252505050505050565b6000806041835103615f0a5760008060006020860151925060408601519150606086015160001a9050615efe8782858561617e565b94509450505050615f13565b60006002915091505b9250929050565b600080600085631626ba7e60e01b8686604051602401615f3b929190618891565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051615fa5919061873a565b600060405180830381855afa9150503d8060008114615fe0576040519150601f19603f3d011682016040523d82523d6000602084013e615fe5565b606091505b5091509150818015615ff957506020815110155b801561603d5750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168180602001905181019061603b9190618766565b145b925050509392505050565b60606000600467ffffffffffffffff81111561606757616066616df7565b5b6040519080825280602002602001820160405280156160a057816020015b61608d6163e3565b8152602001906001900390816160855790505b5090506160b26000846000015161502f565b816000815181106160c6576160c5617af8565b5b60200260200101819052506160e0600184602001516122ff565b816001815181106160f4576160f3617af8565b5b602002602001018190525061610e6002846040015161502f565b8160028151811061612257616121617af8565b5b602002602001018190525061613c600384606001516122ff565b816003815181106161505761614f617af8565b5b602002602001018190525061616361640e565b81816020018190525061617581612335565b92505050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156161b957600060039150915061622b565b6000600187878787604051600081526020016040526040516161de94939291906188d0565b6020604051602081039080840390855afa158015616200573d6000803e3d6000fd5b505050602060405103519050600081036162225760006001925092505061622b565b80600092509250505b94509492505050565b82805461624090617618565b90600052602060002090601f01602090048101928261626257600085556162a9565b82601f1061627b57803560ff19168380011785556162a9565b828001600101855582156162a9579182015b828111156162a857823582559160200191906001019061628d565b5b5090506162b69190616738565b5090565b8280546162c690617618565b90600052602060002090601f0160209004810192826162e8576000855561632f565b82601f1061630157805160ff191683800117855561632f565b8280016001018555821561632f579182015b8281111561632e578251825591602001919060010190616313565b5b50905061633c9190616738565b5090565b60405180610100016040528060608152602001606081526020016000600381111561636e5761636d616939565b5b815260200161637b6163b7565b8152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001606081526020016163b16165f9565b81525090565b6040518060400160405280600060018111156163d6576163d5616939565b5b8152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b604051806101200160405280600063ffffffff168152602001600063ffffffff168152602001606081526020016164616164d8565b815260200161646e6166c4565b8152602001600063ffffffff1681526020016060815260200160608152602001606081525090565b6040518060c00160405280606081526020016164b0616340565b8152602001606081526020016164c4616704565b815260200160608152602001606081525090565b6040518060a0016040528060608152602001606081526020016000600281111561650557616504616939565b5b81526020016165126163b7565b8152602001606081525090565b604051806040016040528060608152602001606081525090565b82805461654590617618565b90600052602060002090601f01602090048101928261656757600085556165ae565b82601f1061658057805160ff19168380011785556165ae565b828001600101855582156165ae579182015b828111156165ad578251825591602001919060010190616592565b5b5090506165bb9190616738565b5090565b60405180608001604052806165d26166f1565b81526020016165df6166c4565b8152602001600063ffffffff168152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001606081525090565b60405180606001604052806060815260200161663b6163b7565b8152602001606081525090565b6040518060c00160405280606081526020016000600181111561666e5761666d616939565b5b815260200160608152602001606081526020016166896163b7565b8152602001606081525090565b604051806080016040528060608152602001606081526020016166b76163b7565b8152602001606081525090565b60405180606001604052806166d761671e565b815260200160008019168152602001600080191681525090565b6040518060200160405280606081525090565b604051806040016040528060008152602001606081525090565b604051806040016040528060608152602001606081525090565b5b80821115616751576000816000905550600101616739565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261678e5761678d616769565b5b8235905067ffffffffffffffff8111156167ab576167aa61676e565b5b6020830191508360018202830111156167c7576167c6616773565b5b9250929050565b600080602083850312156167e5576167e461675f565b5b600083013567ffffffffffffffff81111561680357616802616764565b5b61680f85828601616778565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561685557808201518184015260208101905061683a565b83811115616864576000848401525b50505050565b6000601f19601f8301169050919050565b60006168868261681b565b6168908185616826565b93506168a0818560208601616837565b6168a98161686a565b840191505092915050565b600060208201905081810360008301526168ce818461687b565b905092915050565b6000819050919050565b6168e9816168d6565b81146168f457600080fd5b50565b600081359050616906816168e0565b92915050565b6000602082840312156169225761692161675f565b5b6000616930848285016168f7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061697957616978616939565b5b50565b600081905061698a82616968565b919050565b600061699a8261697c565b9050919050565b6169aa8161698f565b82525050565b60006020820190506169c560008301846169a1565b92915050565b600063ffffffff82169050919050565b6169e4816169cb565b81146169ef57600080fd5b50565b600081359050616a01816169db565b92915050565b600080600060408486031215616a2057616a1f61675f565b5b600084013567ffffffffffffffff811115616a3e57616a3d616764565b5b616a4a86828701616778565b93509350506020616a5d868287016169f2565b9150509250925092565b60008115159050919050565b616a7c81616a67565b82525050565b6000602082019050616a976000830184616a73565b92915050565b6000616aa8826168d6565b9050919050565b616ab881616a9d565b8114616ac357600080fd5b50565b600081359050616ad581616aaf565b92915050565b600060208284031215616af157616af061675f565b5b6000616aff84828501616ac6565b91505092915050565b60038110616b1557600080fd5b50565b600081359050616b2781616b08565b92915050565b600060208284031215616b4357616b4261675f565b5b6000616b5184828501616b18565b91505092915050565b616b6381616a9d565b82525050565b6000602082019050616b7e6000830184616b5a565b92915050565b6000819050919050565b616b9781616b84565b8114616ba257600080fd5b50565b600081359050616bb481616b8e565b92915050565b600060208284031215616bd057616bcf61675f565b5b6000616bde84828501616ba5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000616c0e82616be7565b616c188185616bf2565b9350616c28818560208601616837565b616c318161686a565b840191505092915050565b60006020820190508181036000830152616c568184616c03565b905092915050565b616c67816168d6565b82525050565b6000602082019050616c826000830184616c5e565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b616cbd8161698f565b82525050565b6000616ccf8383616cb4565b60208301905092915050565b6000602082019050919050565b6000616cf382616c88565b616cfd8185616c93565b9350616d0883616ca4565b8060005b83811015616d39578151616d208882616cc3565b9750616d2b83616cdb565b925050600181019050616d0c565b5085935050505092915050565b60006020820190508181036000830152616d608184616ce8565b905092915050565b616d71816169cb565b82525050565b6000602082019050616d8c6000830184616d68565b92915050565b600080600060408486031215616dab57616daa61675f565b5b600084013567ffffffffffffffff811115616dc957616dc8616764565b5b616dd586828701616778565b93509350506020616de8868287016168f7565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b616e2f8261686a565b810181811067ffffffffffffffff82111715616e4e57616e4d616df7565b5b80604052505050565b6000616e61616755565b9050616e6d8282616e26565b919050565b600067ffffffffffffffff821115616e8d57616e8c616df7565b5b616e968261686a565b9050602081019050919050565b82818337600083830152505050565b6000616ec5616ec084616e72565b616e57565b905082815260208101848484011115616ee157616ee0616df2565b5b616eec848285616ea3565b509392505050565b600082601f830112616f0957616f08616769565b5b8135616f19848260208601616eb2565b91505092915050565b600060208284031215616f3857616f3761675f565b5b600082013567ffffffffffffffff811115616f5657616f55616764565b5b616f6284828501616ef4565b91505092915050565b7f6e6f2070746320747275737420726f6f7420666f756e64000000000000000000600082015250565b6000616fa1601783616bf2565b9150616fac82616f6b565b602082019050919050565b60006020820190508181036000830152616fd081616f94565b9050919050565b7f6e6f207074632076657269667920616e63686f7220666f756e64000000000000600082015250565b600061700d601a83616bf2565b915061701882616fd7565b602082019050919050565b6000602082019050818103600083015261703c81617000565b9050919050565b7f6e6f207074632076656966696572207365740000000000000000000000000000600082015250565b6000617079601283616bf2565b915061708482617043565b602082019050919050565b600060208201905081810360008301526170a88161706c565b9050919050565b600082825260208201905092915050565b60006170cb8261681b565b6170d581856170af565b93506170e5818560208601616837565b6170ee8161686a565b840191505092915050565b6000604083016000830151848203600086015261711682826170c0565b9150506020830151848203602086015261713082826170c0565b9150508091505092915050565b617146816169cb565b82525050565b600082825260208201905092915050565b600061716882616be7565b617172818561714c565b9350617182818560208601616837565b61718b8161686a565b840191505092915050565b600281106171a7576171a6616939565b5b50565b60008190506171b882617196565b919050565b60006171c8826171aa565b9050919050565b6171d8816171bd565b82525050565b60006040830160008301516171f660008601826171cf565b506020830151848203602086015261720e82826170c0565b9150508091505092915050565b600060a0830160008301518482036000860152617238828261715d565b91505060208301518482036020860152617252828261715d565b91505060408301516172676040860182616cb4565b506060830151848203606086015261727f82826171de565b9150506080830151848203608086015261729982826170c0565b9150508091505092915050565b600060408301600083015184820360008601526172c3828261715d565b915050602083015184820360208601526172dd828261715d565b9150508091505092915050565b6172f381616b84565b82525050565b6000606083016000830151848203600086015261731682826172a6565b915050602083015161732b60208601826172ea565b50604083015161733e60408601826172ea565b508091505092915050565b600061012083016000830151617362600086018261713d565b506020830151617375602086018261713d565b506040830151848203604086015261738d82826170c0565b915050606083015184820360608601526173a7828261721b565b915050608083015184820360808601526173c182826172f9565b91505060a08301516173d660a086018261713d565b5060c083015184820360c08601526173ee828261715d565b91505060e083015184820360e086015261740882826170c0565b91505061010083015184820361010086015261742482826170c0565b9150508091505092915050565b6000604082019050818103600083015261744b81856170f9565b9050818103602083015261745f8184617349565b90509392505050565b61747181616a67565b811461747c57600080fd5b50565b60008151905061748e81617468565b92915050565b6000602082840312156174aa576174a961675f565b5b60006174b88482850161747f565b91505092915050565b7f6661696c656420746f2076657269667920747062746100000000000000000000600082015250565b60006174f7601683616bf2565b9150617502826174c1565b602082019050919050565b60006020820190508181036000830152617526816174ea565b9050919050565b61753681616b84565b82525050565b6000819050919050565b600061756161755c617557846169cb565b61753c565b6168d6565b9050919050565b61757181617546565b82525050565b600060408201905061758c600083018561752d565b6175996020830184617568565b9392505050565b600081905092915050565b60006175b783856175a0565b93506175c4838584616ea3565b82840190509392505050565b60006175dd8284866175ab565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061763057607f821691505b602082108103617643576176426175e9565b5b50919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b60006176a5602783616bf2565b91506176b082617649565b604082019050919050565b600060208201905081810360008301526176d481617698565b9050919050565b7f5074634875623a20696e76616c6964206d6f6e69746f72207665726966696572600082015250565b6000617711602083616bf2565b915061771c826176db565b602082019050919050565b6000602082019050818103600083015261774081617704565b9050919050565b7f27747062746127206e6f7420666f756e64000000000000000000000000000000600082015250565b600061777d601183616bf2565b915061778882617747565b602082019050919050565b600060208201905081810360008301526177ac81617770565b9050919050565b600060208301600083015184820360008601526177d082826170c0565b9150508091505092915050565b600060808301600083015184820360008601526177fa82826177b3565b9150506020830151848203602086015261781482826172f9565b9150506040830151617829604086018261713d565b506060830151848203606086015261784182826170c0565b9150508091505092915050565b600060408201905081810360008301526178688185617349565b9050818103602083015261787c81846177dd565b90509392505050565b600060608301600083015184820360008601526178a282826172a6565b91505060208301516178b760208601826172ea565b5060408301516178ca60408601826172ea565b508091505092915050565b600060408201905081810360008301526178ef8185617885565b90506178fe6020830184616a73565b9392505050565b7f766572696679206e6f7420706173730000000000000000000000000000000000600082015250565b600061793b600f83616bf2565b915061794682617905565b602082019050919050565b6000602082019050818103600083015261796a8161792e565b9050919050565b6000604082019050617986600083018561752d565b6179936020830184616c5e565b9392505050565b60006020820190506179af600083018461752d565b92915050565b6000815190506179c481616b08565b92915050565b6000602082840312156179e0576179df61675f565b5b60006179ee848285016179b5565b91505092915050565b7f70746320766572696669657220616c7265616479206578697374730000000000600082015250565b6000617a2d601b83616bf2565b9150617a38826179f7565b602082019050919050565b60006020820190508181036000830152617a5c81617a20565b9050919050565b6000604082019050617a7860008301856169a1565b617a856020830184616b5a565b9392505050565b7f707463207665726966696572206e6f7420657869737473000000000000000000600082015250565b6000617ac2601783616bf2565b9150617acd82617a8c565b602082019050919050565b60006020820190508181036000830152617af181617ab5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000617b61826168d6565b9150617b6c836168d6565b925082821015617b7f57617b7e617b27565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000617bc4826168d6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203617bf657617bf5617b27565b5b600182019050919050565b7f676574436572744f776e65724f69643a20636572742074797065206e6f74207360008201527f7570706f72740000000000000000000000000000000000000000000000000000602082015250565b6000617c5d602683616bf2565b9150617c6882617c01565b604082019050919050565b60006020820190508181036000830152617c8c81617c50565b9050919050565b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b6000617cc9601783616bf2565b9150617cd482617c93565b602082019050919050565b60006020820190508181036000830152617cf881617cbc565b9050919050565b6000617d0a826168d6565b9150617d15836168d6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115617d4a57617d49617b27565b5b828201905092915050565b6000617d60826169cb565b9150617d6b836169cb565b92508263ffffffff03821115617d8457617d83617b27565b5b828201905092915050565b7f7661724279746573546f4279746573426967456e6469616e3a206f666673657460008201527f2069732067726561746572207468616e20746865206f7574707574206c656e6760208201527f7468000000000000000000000000000000000000000000000000000000000000604082015250565b6000617e11604283616bf2565b9150617e1c82617d8f565b606082019050919050565b60006020820190508181036000830152617e4081617e04565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617e7d602083616bf2565b9150617e8882617e47565b602082019050919050565b60006020820190508181036000830152617eac81617e70565b9050919050565b7f333262797465732062696720696e7465676572206174206d6f737420666f722060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b6000617f0f602383616bf2565b9150617f1a82617eb3565b604082019050919050565b60006020820190508181036000830152617f3e81617f02565b9050919050565b7f696e76616c69642063726f7373636861696e206c616e65000000000000000000600082015250565b6000617f7b601783616bf2565b9150617f8682617f45565b602082019050919050565b60006020820190508181036000830152617faa81617f6e565b9050919050565b7f77726f6e67207479706520666f72206263646e7320726f6f7420636572740000600082015250565b6000617fe7601e83616bf2565b9150617ff282617fb1565b602082019050919050565b6000602082019050818103600083015261801681617fda565b9050919050565b600081905092915050565b600061803382616be7565b61803d818561801d565b935061804d818560208601616837565b80840191505092915050565b60006180658284618028565b915081905092915050565b7f697373756572206e6f7420666f756e6400000000000000000000000000000000600082015250565b60006180a6601083616bf2565b91506180b182618070565b602082019050919050565b600060208201905081810360008301526180d581618099565b9050919050565b60008190508160005260206000209050919050565b600081546180fe81617618565b618108818661801d565b94506001821660008114618123576001811461813457618167565b60ff19831686528186019350618167565b61813d856180dc565b60005b8381101561815f57815481890152600182019150602081019050618140565b838801955050505b50505092915050565b600061817c82846180f1565b915081905092915050565b7f70746320747275737420726f6f742073696720696e76616c6964000000000000600082015250565b60006181bd601a83616bf2565b91506181c882618187565b602082019050919050565b600060208201905081810360008301526181ec816181b0565b9050919050565b7f544c564974656d4d617056616c756553747265616d3a206f6666657374206f7560008201527f74206f6620627566666572000000000000000000000000000000000000000000602082015250565b600061824f602b83616bf2565b915061825a826181f3565b604082019050919050565b6000602082019050818103600083015261827e81618242565b9050919050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b60006182e1602383616bf2565b91506182ec82618285565b604082019050919050565b60006020820190508181036000830152618310816182d4565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b600061834d600e83616bf2565b915061835882618317565b602082019050919050565b6000602082019050818103600083015261837c81618340565b9050919050565b60008160011c9050919050565b6000808291508390505b60018511156183da578086048111156183b6576183b5617b27565b5b60018516156183c55780820291505b80810290506183d385618383565b945061839a565b94509492505050565b6000826183f357600190506184af565b8161840157600090506184af565b8160018114618417576002811461842157618450565b60019150506184af565b60ff84111561843357618432617b27565b5b8360020a91508482111561844a57618449617b27565b5b506184af565b5060208310610133831016604e8410600b84101617156184855782820a9050838111156184805761847f617b27565b5b6184af565b6184928484846001618390565b925090508184048111156184a9576184a8617b27565b5b81810290505b9392505050565b60006184c1826168d6565b91506184cc836168d6565b92506184f97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846183e3565b905092915050565b7f6765745261775075626c69634b65793a20636572742074797065206e6f74207360008201527f7570706f72740000000000000000000000000000000000000000000000000000602082015250565b600061855d602683616bf2565b915061856882618501565b604082019050919050565b6000602082019050818103600083015261858c81618550565b9050919050565b7f6f6e6c7920737570706f7274204b454343414b3235365f574954485f5345435060008201527f3235364b31207369676e6174757265206e6f7700000000000000000000000000602082015250565b60006185ef603383616bf2565b91506185fa82618593565b604082019050919050565b6000602082019050818103600083015261861e816185e2565b9050919050565b7f77726f6e6720736563703235366b3120736967206c656e677468000000000000600082015250565b600061865b601a83616bf2565b915061866682618625565b602082019050919050565b6000602082019050818103600083015261868a8161864e565b9050919050565b600060ff82169050919050565b60006186a982618691565b91506186b483618691565b92508260ff038211156186ca576186c9617b27565b5b828201905092915050565b60006186e082618691565b91506186eb83618691565b9250828210156186fe576186fd617b27565b5b828203905092915050565b60006187148261681b565b61871e81856175a0565b935061872e818560208601616837565b80840191505092915050565b60006187468284618709565b915081905092915050565b60008151905061876081616b8e565b92915050565b60006020828403121561877c5761877b61675f565b5b600061878a84828501618751565b91505092915050565b7f6f6e6c7920737570706f727420583530395f5055424c49435f4b45595f494e4660008201527f4f206e6f77000000000000000000000000000000000000000000000000000000602082015250565b60006187ef602583616bf2565b91506187fa82618793565b604082019050919050565b6000602082019050818103600083015261881e816187e2565b9050919050565b7f7075626c6963206b6579206c656e677468206e6f7420656e6f75746800000000600082015250565b600061885b601c83616bf2565b915061886682618825565b602082019050919050565b6000602082019050818103600083015261888a8161884e565b9050919050565b60006040820190506188a6600083018561752d565b81810360208301526188b8818461687b565b90509392505050565b6188ca81618691565b82525050565b60006080820190506188e5600083018761752d565b6188f260208301866188c1565b6188ff604083018561752d565b61890c606083018461752d565b9594505050505056fe63726f7373636861696e20636572742076616c69646174696f6e3a2074797065206f66207369676e65722063657274206d757374206265206263646e7363726f7373636861696e20636572742076616c69646174696f6e3a20696e76616c69642073696763726f7373636861696e20636572742076616c69646174696f6e3a2072657175697265206263646e7320726f6f74206f7220646f6d61696e207370616365206f776e65722063657274206173207369676e657263726f7373636861696e20636572742076616c69646174696f6e3a2077726f6e67207369676e6572a3646970667358221220179bcc44ceaa9aab24594e14cff7454aa52b71af896df615a3d59105d3b7e4d064736f6c637827302e382e31342d63692e323032322e362e32302b636f6d6d69742e66633963623232362e6d6f646b636f6d70696c655f6d6f6461300066 \ No newline at end of file diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg.bin-runtime b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg.bin-runtime new file mode 100644 index 00000000..b4c55a30 --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg.bin-runtime @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50600436106101f05760003560e01c8063838a102c1161010f578063d582d1a8116100a2578063e5e5530011610071578063e5e55300146105db578063eaa71e90146105f7578063ed46aafa14610613578063fc0baf0814610643576101f0565b8063d582d1a81461052d578063d5dd79131461055d578063db37c08b1461058d578063e5521092146105bd576101f0565b8063b5db295a116100de578063b5db295a14610495578063c09b261b146104c5578063c730cf52146104e1578063d513f34a14610511576101f0565b8063838a102c1461042157806389223f801461043d5780638da5cb5b14610459578063a9d662af14610477576101f0565b806334d4725a11610187578063627523a411610156578063627523a4146103ad5780636bba0808146103dd578063715018a6146103f95780638037d45e14610403576101f0565b806334d4725a146103395780633ac6dfb11461035557806342f116bd1461037357806356cb2d021461038f576101f0565b8063203c2c85116101c3578063203c2c851461028d57806325601cdd146102a957806326ca2c89146102d9578063343e779214610309576101f0565b806304f25f96146101f55780630a6e15db146102115780630d9ae9e5146102415780631f56086f14610271575b600080fd5b61020f600480360381019061020a9190617509565b610661565b005b61022b6004803603810190610226919061759e565b6106c7565b60405161023891906175e6565b60405180910390f35b61025b60048036038101906102569190617637565b6106e7565b60405161026891906176fd565b60405180910390f35b61028b6004803603810190610286919061759e565b6107df565b005b6102a760048036038101906102a29190617718565b61087e565b005b6102c360048036038101906102be9190617778565b610bf3565b6040516102d091906176fd565b60405180910390f35b6102f360048036038101906102ee91906178b0565b610cf1565b60405161030091906179a1565b60405180910390f35b610323600480360381019061031e91906179bc565b610d63565b60405161033091906179a1565b60405180910390f35b610353600480360381019061034e9190617509565b610e05565b005b61035d610e6b565b60405161036a91906179a1565b60405180910390f35b61038d60048036038101906103889190617ba4565b610e75565b005b610397610f40565b6040516103a491906179a1565b60405180910390f35b6103c760048036038101906103c291906179bc565b610f46565b6040516103d491906179a1565b60405180910390f35b6103f760048036038101906103f29190617c00565b610fe8565b005b61040161104f565b005b61040b6110ab565b6040516104189190617cb6565b60405180910390f35b61043b60048036038101906104369190617cd1565b6110b5565b005b61045760048036038101906104529190617c00565b611135565b005b61046161119c565b60405161046e9190617cb6565b60405180910390f35b61047f6111a5565b60405161048c9190617cb6565b60405180910390f35b6104af60048036038101906104aa9190617d1a565b6111ab565b6040516104bc9190617ec3565b60405180910390f35b6104df60048036038101906104da9190617ee5565b6112f9565b005b6104fb60048036038101906104f69190617f7a565b611511565b60405161050891906179a1565b60405180910390f35b61052b6004803603810190610526919061759e565b61157f565b005b610547600480360381019061054291906178b0565b61161c565b60405161055491906179a1565b60405180910390f35b61057760048036038101906105729190617f7a565b61168e565b60405161058491906179a1565b60405180910390f35b6105a760048036038101906105a29190618036565b6116fc565b6040516105b491906179a1565b60405180910390f35b6105c56117a6565b6040516105d29190617cb6565b60405180910390f35b6105f560048036038101906105f09190618131565b6117ac565b005b610611600480360381019061060c919061759e565b61184a565b005b61062d60048036038101906106289190618036565b6118e7565b60405161063a91906179a1565b60405180910390f35b61064b611991565b60405161065891906176fd565b60405180910390f35b60006009541480610673575033600954145b6106b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a990618237565b60405180910390fd5b6106c085858533868661199a565b5050505050565b60086020528060005260406000206000915054906101000a900460ff1681565b600060025484846040516020016106ff929190618287565b6040516020818303038152906040528051906020012014610755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074c906182ec565b60405180910390fd5b60006107a688888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508785611acf565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6107e7611b2b565b6107ef61119c565b1461082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690618358565b60405180910390fd5b60008103610872576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610869906183ea565b60405180910390fd5b61087b81611b33565b50565b6008600033815260200190815260200160002060009054906101000a900460ff166108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590618456565b60405180910390fd5b6108e6617251565b61093d83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505082611b7290919063ffffffff16565b8060e0015160ff16600003610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e906184e8565b60405180910390fd5b8060e0015160ff16600203610bb2578061010001516006600083604001516040516020016109b59190618539565b604051602081830303815290604052805190602001208152602001908152602001600020600301541115610b7257600760008260200151815260200190815260200160002060009054906101000a900460ff16610a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3e906185c2565b60405180910390fd5b6000610a5285611db0565b9050600060095403610ae557806383c6d5a283602001518460400151856060015160001c8660c001518760a001518861012001518961014001516040518863ffffffff1660e01b8152600401610aae979695949392919061867f565b600060405180830381600087803b158015610ac857600080fd5b505af1158015610adc573d6000803e3d6000fd5b50505050610b6c565b600954632b9ff60b8284602001518560400151866060015160001c8760c001518860a001518961012001518a61014001516040518963ffffffff1660e01b8152600401610b39989796959493929190618703565b600060405180830381600087803b158015610b5357600080fd5b505af1158015610b67573d6000803e3d6000fd5b505050505b50610bad565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490618808565b60405180910390fd5b610bed565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be49061889a565b60405180910390fd5b50505050565b60006002548484604051602001610c0b929190618287565b6040516020818303038152906040528051906020012014610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c58906182ec565b60405180910390fd5b6000610cb888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508760001b8560001b611acf565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6000806009541480610d04575033600954145b610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a90618237565b60405180910390fd5b610d548a8a8a8a8a8a8a8a8a611e22565b90509998505050505050505050565b60008060095414610de95760095463e8913e8f888888338989896040518863ffffffff1660e01b8152600401610d9f9796959493929190618914565b6020604051808303816000875af1158015610dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de2919061898e565b9050610dfb565b610df8878787338888886120bc565b90505b9695505050505050565b60006009541480610e17575033600954145b610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d90618237565b60405180910390fd5b610e648585853386866122bf565b5050505050565b6000600254905090565b610e7d611b2b565b610e8561119c565b14610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc90618358565b60405180910390fd5b60008203610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90618a07565b60405180910390fd5b8160018190555080604051602001610f209190618539565b604051602081830303815290604052805190602001206002819055505050565b60025481565b60008060095414610fcc576009546326ddd415888888338989896040518863ffffffff1660e01b8152600401610f829796959493929190618914565b6020604051808303816000875af1158015610fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc5919061898e565b9050610fde565b610fdb8787873388888861244e565b90505b9695505050505050565b60006009541480610ffa575033600954145b611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090618237565b60405180910390fd5b6110478686868686866122bf565b505050505050565b611057611b2b565b61105f61119c565b1461109f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109690618358565b60405180910390fd5b6110a96000611b33565b565b6000600154905090565b6110bd611b2b565b6110c561119c565b14611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90618358565b60405180910390fd5b806040516020016111169190618539565b6040516020818303038152906040528051906020012060028190555050565b60006009541480611147575033600954145b611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90618237565b60405180910390fd5b61119486868686868661199a565b505050505050565b60008054905090565b60015481565b6111b36172cd565b6006600084846040516020016111ca929190618287565b6040516020818303038152906040528051906020012081526020019081526020016000206040518060a00160405290816000820160009054906101000a900461ffff1661ffff1661ffff16815260200160018201805461122990618a56565b80601f016020809104026020016040519081016040528092919081815260200182805461125590618a56565b80156112a25780601f10611277576101008083540402835291602001916112a2565b820191906000526020600020905b81548152906001019060200180831161128557829003601f168201915b5050505050815260200160028201548152602001600382015481526020016004820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905092915050565b336001541461133d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133490618ad3565b60405180910390fd5b61134a858585858561264b565b600061139983838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612652565b905060018163ffffffff16036113fe576113f986868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612715565b611501565b60028163ffffffff16036114615761145c86868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506127da565b611500565b60038163ffffffff16036114c4576114bf86868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612926565b6114ff565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690618b3f565b60405180910390fd5b5b5b611509612a96565b505050505050565b6000806009541480611524575033600954145b611563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155a90618237565b60405180910390fd5b6115728888888888888861244e565b9050979650505050505050565b611587611b2b565b61158f61119c565b146115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690618358565b60405180910390fd5b60008103611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990618a07565b60405180910390fd5b8060018190555050565b600080600954148061162f575033600954145b61166e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166590618237565b60405180910390fd5b61167f8a8a8a8a8a8a8a8a8a612a98565b90509998505050505050505050565b60008060095414806116a1575033600954145b6116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790618237565b60405180910390fd5b6116ef888888888888886120bc565b9050979650505050505050565b60008060095414611786576009546323ae474b8a8a8a338b8b8b8b8b6040518a63ffffffff1660e01b815260040161173c99989796959493929190618b7d565b6020604051808303816000875af115801561175b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177f919061898e565b905061179a565b611797898989338a8a8a8a8a612a98565b90505b98975050505050505050565b60095481565b6117b4611b2b565b6117bc61119c565b146117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390618358565b60405180910390fd5b600061180f858560001b8560001b611acf565b9050816004600083815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505050505050565b611852611b2b565b61185a61119c565b1461189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189190618358565b60405180910390fd5b600081036118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d490618c4a565b60405180910390fd5b8060098190555050565b6000806009541461197157600954637e1174318a8a8a338b8b8b8b8b6040518a63ffffffff1660e01b815260040161192799989796959493929190618b7d565b6020604051808303816000875af1158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061898e565b9050611985565b611982898989338a8a8a8a8a611e22565b90505b98975050505050505050565b60006004905090565b6119a78686868585612d38565b6000604051806080016040528088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018660001b815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200163ffffffff80168152509050600154639d24799885611a6f84612d3f565b6040518363ffffffff1660e01b8152600401611a8c929190618c6a565b600060405180830381600087803b158015611aa657600080fd5b505af1158015611aba573d6000803e3d6000fd5b50505050611ac6612e81565b50505050505050565b600083604051602001611ae29190618539565b604051602081830303815290604052805190602001208383604051602001611b0c93929190618cbb565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b600081519050611b8182612652565b836000019063ffffffff16908163ffffffff1681525050611ba26020612e83565b81611bad9190618d27565b9050611bb98183612e95565b836020018181525050611bca612ea3565b60ff1681611bd89190618d27565b90506000611be68284612eac565b905080846040018190525080516004611bff9190618d5b565b82611c0a9190618d27565b9150611c168284612e95565b846060018181525050611c27612ea3565b60ff1682611c359190618d27565b9150611c418284612f9c565b846080019060ff16908160ff1681525050600182611c5f9190618d27565b9150611c6b8284612faa565b8460a0019067ffffffffffffffff16908167ffffffffffffffff1681525050600882611c979190618d27565b9150611ca38284612fb8565b8460c0019063ffffffff16908163ffffffff1681525050600482611cc79190618d27565b9150611cd38284612f9c565b8460e0019060ff16908160ff1681525050600182611cf19190618d27565b91506000611cff8385612eac565b9050611d0a81612fc6565b8561010001818152505080516004611d229190618d5b565b83611d2d9190618d27565b9250611d398385612eac565b856101200181905250846101200151516004611d559190618d5b565b83611d609190618d27565b9250600260ff16856080015160ff161115611da957611d7f8385612eac565b856101400181905250846101400151516004611d9b9190618d5b565b83611da69190618d27565b92505b5050505050565b600080602067ffffffffffffffff811115611dce57611dcd617a79565b5b6040519080825280601f01601f191660200182016040528015611e005781602001600182028036833780820191505090505b509050611e0f60208483613082565b611e1a60208261308c565b915050919050565b60008060ff168360ff1610158015611e415750600460ff168360ff1611155b611e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7790618dfd565b60405180910390fd5b611e8d8a8a8a8888612d38565b60008860001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200189611f15576000611f18565b60015b60ff16815260200167ffffffffffffffff80168152602001611f7f8e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508c8661309a565b63ffffffff1681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200160405180602001604052806000815250815250905061200d6002548261313090919063ffffffff16565b6001600760008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d2479988a61204f8461342e565b6040518363ffffffff1660e01b815260040161206c929190618c6a565b600060405180830381600087803b15801561208657600080fd5b505af115801561209a573d6000803e3d6000fd5b505050506120a66137ee565b8060200151925050509998505050505050505050565b60006120cb8888888686612d38565b60008660001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200187612153576000612156565b60015b60ff1681526020016121ad8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a866137f0565b63ffffffff1667ffffffffffffffff16815260200163ffffffff8016815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020016040518060200160405280600081525081525090506122426002548261388690919063ffffffff16565b600154639d2479988861225484613b23565b6040518363ffffffff1660e01b8152600401612271929190618c6a565b600060405180830381600087803b15801561228b57600080fd5b505af115801561229f573d6000803e3d6000fd5b505050506122ab612e81565b806020015192505050979650505050505050565b6122cc8686868585613e55565b60008460001b90506000604051806080016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020016123ca8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050888661309a565b63ffffffff16815250905060006123e082612d3f565b9050600154639d24799887836040518363ffffffff1660e01b8152600401612409929190618c6a565b600060405180830381600087803b15801561242357600080fd5b505af1158015612437573d6000803e3d6000fd5b505050506124436137ee565b505050505050505050565b600061245d8888888686613e55565b60008660001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001838152602001876124e55760006124e8565b60015b60ff16815260200167ffffffffffffffff8016815260200161254f8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8661309a565b63ffffffff16815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020016040518060200160405280600081525081525090506125ce6002548261388690919063ffffffff16565b600154639d247998886125e084613b23565b6040518363ffffffff1660e01b81526004016125fd929190618c6a565b600060405180830381600087803b15801561261757600080fd5b505af115801561262b573d6000803e3d6000fd5b505050506126376137ee565b806020015192505050979650505050505050565b5050505050565b60008060008351905060048103602085010151915060ff60f81b827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361270957600080600467ffffffffffffffff8111156126b2576126b1617a79565b5b6040519080825280601f01601f1916602001820160405280156126e45781602001600182028036833780820191505090505b5090506003830360200186015160218201526004810151915081945050505050612710565b6001925050505b919050565b61271d61730d565b6127308282613e5c90919063ffffffff16565b60025481600001516040516020016127489190618539565b604051602081830303815290604052805190602001201461279e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612795906182ec565b60405180910390fd5b63ffffffff8016816060015163ffffffff16036127c6576127c185858584614010565b6127d3565b6127d2858585846140fc565b5b5050505050565b6127e261733e565b6127f5828261440090919063ffffffff16565b600254816040015160405160200161280d9190618539565b6040516020818303038152906040528051906020012014612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285a906182ec565b60405180910390fd5b600060ff16816080015160ff1614806128865750600160ff16816080015160ff16145b1561289c57612897858585846145b5565b61291f565b600260ff16816080015160ff16036128bf576128ba858585846146e5565b61291e565b600360ff16816080015160ff16036128e2576128dd8585858461485d565b61291d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291490618e69565b60405180910390fd5b5b5b5050505050565b61292e617251565b6129418282611b7290919063ffffffff16565b60025481604001516040516020016129599190618539565b60405160208183030381529060405280519060200120146129af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a690618ed5565b60405180910390fd5b600060ff16816080015160ff1614806129d25750600160ff16816080015160ff16145b156129e8576129e3858585846149ea565b612a8f565b600260ff16816080015160ff1603612a0b57612a0685858584614c83565b612a8e565b600360ff16816080015160ff1603612a2e57612a2985858584614e45565b612a8d565b600460ff16816080015160ff1603612a5157612a4c8585858461501c565b612a8c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8390618f67565b60405180910390fd5b5b5b5b5050505050565b565b60008060ff168360ff1610158015612ab75750600460ff168360ff1611155b612af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aed90618dfd565b60405180910390fd5b612b038a8a8a8888612d38565b60008860001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200189612b8b576000612b8e565b60015b60ff168152602001612be58e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508c866137f0565b63ffffffff1667ffffffffffffffff16815260200163ffffffff801681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050612c896002548261313090919063ffffffff16565b6001600760008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d2479988a612ccb8461342e565b6040518363ffffffff1660e01b8152600401612ce8929190618c6a565b600060405180830381600087803b158015612d0257600080fd5b505af1158015612d16573d6000803e3d6000fd5b50505050612d226137ee565b8060200151925050509998505050505050505050565b5050505050565b60606000612d5083600001516151e1565b60206004612d618660400151615239565b612d6b9190618d5b565b612d759190618d5b565b612d7f9190618d5b565b905060008167ffffffffffffffff811115612d9d57612d9c617a79565b5b6040519080825280601f01601f191660200182016040528015612dcf5781602001600182028036833780820191505090505b5090506000829050612de681866000015184615291565b612df385600001516151e1565b81612dfe9190618d27565b9050612e0f81866020015184613082565b612e17612ea3565b60ff1681612e259190618d27565b9050612e36818660600151846152fc565b612e406020612e83565b81612e4b9190618d27565b9050612e5c81866040015184615291565b612e698560400151615239565b81612e749190618d27565b9050819350505050919050565b565b6000612e8e82615313565b9050919050565b600082820151905092915050565b60006020905090565b60606000612eba8484612fb8565b63ffffffff169050600484612ecf9190618d27565b935083811115612f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0b90618ff9565b60405180910390fd5b8084612f209190618d27565b93506060811560008114612f3f57604051915060208201604052612f90565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015612f7d5780518352602083019250602081019050612f60565b50858552601f19601f8301166040525050505b50809250505092915050565b600082820151905092915050565b600082820151905092915050565b600082820151905092915050565b600080825190506020811115613011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130089061908b565b60405180910390fd5b60008167ffffffffffffffff81111561302d5761302c617a79565b5b6040519080825280601f01601f19166020018201604052801561305f5781602001600182028036833780820191505090505b509050600084518252828501518383015180820392505050809350505050919050565b8183820152505050565b600082820151905092915050565b6000806130a8858585615542565b905060006003600083815260200190815260200160002060009054906101000a900463ffffffff16905060036000838152602001908152602001600020600081819054906101000a900463ffffffff1680929190613105906190ab565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b6003826000015163ffffffff161461317d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317490619123565b60405180910390fd5b63ffffffff8261012001515111156131ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c1906191b5565b60405180910390fd5b60006131da8361010001516155ab565b90506000815184610120015151856040015151607e6131f99190618d5b565b6132039190618d5b565b61320d9190618d5b565b905060008167ffffffffffffffff81111561322b5761322a617a79565b5b6040519080825280601f01601f19166020018201604052801561325d5781602001600182028036833780820191505090505b50905060008290506132838163ff000000886000015161327d91906191d5565b846152fc565b61328d6020615313565b816132989190618d27565b90506000866040015190506132ae8282856156b4565b805160046132bc9190618d5b565b826132c79190618d27565b91506132d882886060015185613082565b6132e0612ea3565b60ff16826132ee9190618d27565b91506132ff82886080015185615788565b60018261330c9190618d27565b915061331d828860a001518561579f565b6133276040615313565b826133329190618d27565b9150613343828860c00151856152fc565b61334d6020615313565b826133589190618d27565b9150613369828860e0015185615788565b6001826133769190618d27565b91506133838286856156b4565b845160046133919190618d5b565b8261339c9190618d27565b91506133ae82886101200151856156b4565b8661012001515160046133c19190618d5b565b826133cc9190618d27565b91506133d98233856157b6565b6133e1612ea3565b60ff16826133ef9190618d27565b91506133fc828785613082565b613404612ea3565b60ff16826134129190618d27565b9150828051906020012087602001818152505050505050505050565b60606003826000015163ffffffff161461347d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347490619123565b60405180910390fd5b63ffffffff8261012001515111156134ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c1906191b5565b60405180910390fd5b6000801b826020015103613513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350a90619281565b60405180910390fd5b600080600260ff16846080015160ff1611905060006135368561010001516155ab565b9050811561359157846101400151516004825187610120015151886040015151605e6135629190618d5b565b61356c9190618d5b565b6135769190618d5b565b6135809190618d5b565b61358a9190618d5b565b92506135c3565b805185610120015151866040015151605e6135ac9190618d5b565b6135b69190618d5b565b6135c09190618d5b565b92505b60008367ffffffffffffffff8111156135df576135de617a79565b5b6040519080825280601f01601f1916602001820160405280156136115781602001600182028036833780820191505090505b50905060008490506136378163ff000000896000015161363191906191d5565b846152fc565b6136416020615313565b8161364c9190618d27565b905061365d81886020015184613082565b613665612ea3565b60ff16816136739190618d27565b90506000876040015190506136898282856156b4565b805160046136979190618d5b565b826136a29190618d27565b91506136b382896060015185613082565b6136bb612ea3565b60ff16826136c99190618d27565b91506136da82896080015185615788565b6001826136e79190618d27565b91506136f8828960a001518561579f565b6137026040615313565b8261370d9190618d27565b915061371e828960c00151856152fc565b6137286020615313565b826137339190618d27565b9150613744828960e0015185615788565b6001826137519190618d27565b915061375e8285856156b4565b8351600461376c9190618d5b565b826137779190618d27565b915061378982896101200151856156b4565b87610120015151600461379c9190618d5b565b826137a79190618d27565b915084156137e0576137bf82896101400151856156b4565b8761014001515160046137d29190618d5b565b826137dd9190618d27565b91505b829650505050505050919050565b565b6000806137fe858585615542565b905060006005600083815260200190815260200160002060009054906101000a900463ffffffff16905060056000838152602001908152602001600020600081819054906101000a900463ffffffff168092919061385b906190ab565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b6002826000015163ffffffff16146138d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ca90619123565b60405180910390fd5b63ffffffff8260e0015151111561391f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613916906191b5565b60405180910390fd5b60008260e001515183604001515160796139399190618d5b565b6139439190618d5b565b905060008167ffffffffffffffff81111561396157613960617a79565b5b6040519080825280601f01601f1916602001820160405280156139935781602001600182028036833780820191505090505b50905060008290506139bf8163ff00000087600001516139b391906191d5565b63ffffffff16846157c0565b6139c96020615313565b816139d49190618d27565b90506000856040015190506139ea8282856156b4565b805160046139f89190618d5b565b82613a039190618d27565b9150613a1482876060015185613082565b613a1c612ea3565b60ff1682613a2a9190618d27565b9150613a3b82876080015185615788565b600182613a489190618d27565b9150613a59828760a001518561579f565b613a636040615313565b82613a6e9190618d27565b9150613a7f828760c00151856152fc565b613a896020615313565b82613a949190618d27565b9150613aa5828760e00151856156b4565b8560e00151516004613ab79190618d5b565b82613ac29190618d27565b9150613acf8233856157b6565b613ad7612ea3565b60ff1682613ae59190618d27565b9150613af2828685613082565b613afa612ea3565b60ff1682613b089190618d27565b91508280519060200120866020018181525050505050505050565b60606002826000015163ffffffff1614613b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6990619123565b60405180910390fd5b63ffffffff8260e00151511115613bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bb5906191b5565b60405180910390fd5b6000801b826020015103613c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bfe90619281565b60405180910390fd5b600080600260ff16846080015160ff161190508015613c66578361010001515160048560e00151518660400151516059613c419190618d5b565b613c4b9190618d5b565b613c559190618d5b565b613c5f9190618d5b565b9150613c8b565b8360e00151518460400151516059613c7e9190618d5b565b613c889190618d5b565b91505b60008267ffffffffffffffff811115613ca757613ca6617a79565b5b6040519080825280601f01601f191660200182016040528015613cd95781602001600182028036833780820191505090505b5090506000839050613d058163ff0000008860000151613cf991906191d5565b63ffffffff16846157c0565b613d0f6020615313565b81613d1a9190618d27565b9050613d2b81876020015184613082565b613d33612ea3565b60ff1681613d419190618d27565b9050600086604001519050613d578282856156b4565b80516004613d659190618d5b565b82613d709190618d27565b9150613d8182886060015185613082565b613d89612ea3565b60ff1682613d979190618d27565b9150613da882886080015185615788565b600182613db59190618d27565b9150613dc6828860a001518561579f565b613dd06040615313565b82613ddb9190618d27565b9150613dec828860c00151856152fc565b613df66020615313565b82613e019190618d27565b9150613e12828860e00151856156b4565b8660e00151516004613e249190618d5b565b82613e2f9190618d27565b91508315613e4857613e4782886101000151856156b4565b5b8295505050505050919050565b5050505050565b60008151905060006020613e708385612fb8565b613e7a91906191d5565b905060008163ffffffff1667ffffffffffffffff811115613e9e57613e9d617a79565b5b6040519080825280601f01601f191660200182016040528015613ed05781602001600182028036833780820191505090505b509050613ede8385836157ca565b613ee781615239565b83613ef29190618d27565b92506000613f008486612e95565b9050613f0a612ea3565b60ff1684613f189190618d27565b93506000613f268587612fb8565b9050613f326020615313565b85613f3d9190618d27565b945060006020613f4d8789612fb8565b613f5791906191d5565b905060008163ffffffff1667ffffffffffffffff811115613f7b57613f7a617a79565b5b6040519080825280601f01601f191660200182016040528015613fad5781602001600182028036833780820191505090505b509050613fbb8789836157ca565b613fc481615239565b87613fcf9190618d27565b96508489600001819052508389602001818152505082896060019063ffffffff16908163ffffffff1681525050808960400181905250505050505050505050565b600061401b82615822565b905060006009540361408e5780632e00b39586868660001c86604001516040518563ffffffff1660e01b815260040161405794939291906192a1565b600060405180830381600087803b15801561407157600080fd5b505af1158015614085573d6000803e3d6000fd5b505050506140f5565b60095463b1fa0c6d86868660001c8587604001516040518663ffffffff1660e01b81526004016140c29594939291906192e8565b600060405180830381600087803b1580156140dc57600080fd5b505af11580156140f0573d6000803e3d6000fd5b505050505b5050505050565b600061415185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050848460200151615838565b90508063ffffffff16826060015163ffffffff16146141a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161419c90619389565b60405180910390fd5b6000606060006141b485615822565b90506000813b0361420057600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525091506143b3565b6000600954036142de5780639e41773189898960001c89604001516040518563ffffffff1660e01b815260040161423a94939291906192a1565b600060405180830381600087803b15801561425457600080fd5b505af1925050508015614265575060015b6142d4576142716193b6565b806308c379a00361429957506142856193d8565b80614290575061429b565b809250506142cf565b505b3d80600081146142c7576040519150601f19603f3d011682016040523d82523d6000602084013e6142cc565b606091505b50505b6142d9565b600192505b6143b2565b6009546340b6b1dd89898960001c858a604001516040518663ffffffff1660e01b81526004016143129594939291906192e8565b600060405180830381600087803b15801561432c57600080fd5b505af192505050801561433d575060015b6143ac576143496193b6565b806308c379a003614371575061435d6193d8565b806143685750614373565b809250506143a7565b505b3d806000811461439f576040519150601f19603f3d011682016040523d82523d6000602084013e6143a4565b606091505b50505b6143b1565b600192505b5b5b7fc5c107ebb3f0bb97a017b6d166d57ad3349b9114ef620914f2178b3559310abf888888848888886040516143ee9796959493929190619468565b60405180910390a15050505050505050565b60008151905061440f82612652565b836000019063ffffffff16908163ffffffff16815250506144306020612e83565b8161443b9190618d27565b90506144478183612e95565b836020018181525050614458612ea3565b60ff16816144669190618d27565b905060006144748284612eac565b90508084604001819052508051600461448d9190618d5b565b826144989190618d27565b91506144a48284612e95565b8460600181815250506144b5612ea3565b60ff16826144c39190618d27565b91506144cf8284612f9c565b846080019060ff16908160ff16815250506001826144ed9190618d27565b91506144f98284612faa565b8460a0019067ffffffffffffffff16908167ffffffffffffffff16815250506008826145259190618d27565b91506145318284612fb8565b8460c0019063ffffffff16908163ffffffff16815250506004826145559190618d27565b91506145618284612eac565b8460e001819052508360e0015151600461457b9190618d5b565b826145869190618d27565b9150600260ff16846080015160ff1611156145af576145a58284612eac565b8461010001819052505b50505050565b6000606063ffffffff80168360c0015163ffffffff1603614640576145dc868686866158ce565b8092508193505050600060ff16836080015160ff160361463b57818190614639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161463091906194d9565b60405180910390fd5b505b614655565b61464c86868686615afa565b80925081935050505b7f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d2398360200151878787876040015161468c89615dc8565b8960c001518a60a001518b608001518b8b6040516146b49b9a999897969594939291906194fb565b60405180910390a1600160ff16836080015160ff16036146dd576146dc838787878686615dde565b5b505050505050565b600060095403614770576146f881615dc8565b6315390358826020015186868660001c8660c001518760a001518860e001516040518863ffffffff1660e01b815260040161473997969594939291906195ae565b600060405180830381600087803b15801561475357600080fd5b505af1158015614767573d6000803e3d6000fd5b505050506147f1565b60095463760f791861478183615dc8565b836020015187878760001c8760c001518860a001518960e001516040518963ffffffff1660e01b81526004016147be98979695949392919061961f565b600060405180830381600087803b1580156147d857600080fd5b505af11580156147ec573d6000803e3d6000fd5b505050505b7f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d2398160200151858585856040015161482887615dc8565b8760c001518860a001518960800151600160405161484f9a999897969594939291906196ea565b60405180910390a150505050565b6000600954036148ef5761487081615dc8565b6383c6d5a2826020015186868660001c8660c001518760a001518860e001518961010001516040518963ffffffff1660e01b81526004016148b898979695949392919061979b565b600060405180830381600087803b1580156148d257600080fd5b505af11580156148e6573d6000803e3d6000fd5b50505050614977565b600954632b9ff60b61490083615dc8565b836020015187878760001c8760c001518860a001518960e001518a61010001516040518a63ffffffff1660e01b815260040161494499989796959493929190619821565b600060405180830381600087803b15801561495e57600080fd5b505af1158015614972573d6000803e3d6000fd5b505050505b7f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239816020015185858585604001516149ae87615dc8565b8760c001518860a00151896080015160018b61010001516040516149dc9b9a999897969594939291906194fb565b60405180910390a150505050565b6000606060008360e0015160ff161480614a0b575060028360e0015160ff16145b80614a1d575060048360e0015160ff16145b614a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a5390619928565b60405180910390fd5b60028360e0015160ff1603614ab7574383610100015111614ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614aa990619994565b60405180910390fd5b614b0f565b60048360e0015160ff1603614b0e574283610100015111614b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614b0490619994565b60405180910390fd5b5b5b63ffffffff80168360c0015163ffffffff1603614b9657614b3286868686615ef1565b8092508193505050600060ff16836080015160ff1603614b9157818190614b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614b8691906194d9565b60405180910390fd5b505b614bab565b614ba28686868661611f565b80925081935050505b7f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c983602001518787878760400151614be2896163ef565b8960c001518a60a001518b608001518b8b604051614c0a9b9a999897969594939291906194fb565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad283602001518460e00151856101000151604051614c52939291906199b4565b60405180910390a1600160ff16836080015160ff1603614c7b57614c7a838787878686616405565b5b505050505050565b600060095403614d0f57614c96816163ef565b6315390358826020015186868660001c8660c001518760a001518861012001516040518863ffffffff1660e01b8152600401614cd897969594939291906195ae565b600060405180830381600087803b158015614cf257600080fd5b505af1158015614d06573d6000803e3d6000fd5b50505050614d91565b60095463760f7918614d20836163ef565b836020015187878760001c8760c001518860a001518961012001516040518963ffffffff1660e01b8152600401614d5e98979695949392919061961f565b600060405180830381600087803b158015614d7857600080fd5b505af1158015614d8c573d6000803e3d6000fd5b505050505b7f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614dc8876163ef565b8760c001518860a0015189608001516001604051614def9a999897969594939291906196ea565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e00151836101000151604051614e37939291906199b4565b60405180910390a150505050565b600060095403614ed857614e58816163ef565b6383c6d5a2826020015186868660001c8660c001518760a001518861012001518961014001516040518963ffffffff1660e01b8152600401614ea198979695949392919061979b565b600060405180830381600087803b158015614ebb57600080fd5b505af1158015614ecf573d6000803e3d6000fd5b50505050614f61565b600954632b9ff60b614ee9836163ef565b836020015187878760001c8760c001518860a001518961012001518a61014001516040518a63ffffffff1660e01b8152600401614f2e99989796959493929190619821565b600060405180830381600087803b158015614f4857600080fd5b505af1158015614f5c573d6000803e3d6000fd5b505050505b7f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614f98876163ef565b8760c001518860a00151896080015160018b6101400151604051614fc69b9a999897969594939291906194fb565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e0015183610100015160405161500e939291906199b4565b60405180910390a150505050565b600061502c826101200151616518565b9050806040015160066000878760405160200161504a929190618287565b604051602081830303815290604052805190602001208152602001908152602001600020600201819055508060800151600660008787604051602001615091929190618287565b60405160208183030381529060405280519060200120815260200190815260200160002060040160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080606001516006600087876040516020016150fa929190618287565b604051602081830303815290604052805190602001208152602001908152602001600020600301819055507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c98260200151868686866040015161515c886163ef565b8860c001518960a001518a6080015160018c610140015160405161518a9b9a999897969594939291906194fb565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad282602001518360e001518461010001516040516151d2939291906199b4565b60405180910390a15050505050565b6000602082516151f19190619a1a565b90506000602083516152039190619a4b565b1461521757808061521390619a7c565b9150505b808061522290619a7c565b9150506020816152329190619ac4565b9050919050565b6000602082516152499190619a1a565b905060006020835161525b9190619a4b565b1461526f57808061526b90619a7c565b9150505b808061527a90619a7c565b91505060208161528a9190619ac4565b9050919050565b6000602083516152a19190619a1a565b90506000602084516152b39190619a4b565b11156152c85780806152c490619a7c565b9150505b60006001820191505b818110156152f55760208102840151858401526020850394506001810190506152d1565b5050505050565b828101600481038051848352808252505050505050565b6000816008811461542057601081146154295760188114615432576020811461543b5760288114615444576030811461544d5760388114615456576040811461545f57604881146154685760508114615471576058811461547a5760608114615483576068811461548c5760708114615495576078811461549e57608081146154a757608881146154b057609081146154b957609881146154c25760a081146154cb5760a881146154d45760b081146154dd5760b881146154e65760c081146154ef5760c881146154f85760d081146155015760d8811461550a5760e081146155135760e8811461551c5760f081146155255760f8811461552e576101008114615537576020915061553c565b6001915061553c565b6002915061553c565b6003915061553c565b6004915061553c565b6005915061553c565b6006915061553c565b6007915061553c565b6008915061553c565b6009915061553c565b600a915061553c565b600b915061553c565b600c915061553c565b600d915061553c565b600e915061553c565b600f915061553c565b6010915061553c565b6011915061553c565b6012915061553c565b6013915061553c565b6014915061553c565b6015915061553c565b6016915061553c565b6017915061553c565b6018915061553c565b6019915061553c565b601a915061553c565b601b915061553c565b601c915061553c565b601d915061553c565b601e915061553c565b601f915061553c565b602091505b50919050565b60008061554e8461667b565b905080856040516020016155629190618539565b604051602081830303815290604052805190602001208460405160200161558b93929190618cbb565b604051602081830303815290604052805190602001209150509392505050565b60606000602067ffffffffffffffff8111156155ca576155c9617a79565b5b6040519080825280601f01601f1916602001820160405280156155fc5781602001600182028036833780820191505090505b5090506000602067ffffffffffffffff81111561561c5761561b617a79565b5b6040519080825280601f01601f19166020018201604052801561564e5781602001600182028036833780820191505090505b509050606084602084015260015b60208110156156a857806020850103518160208501035180820361569b57604051935060208601518385015282845282602085010160405250506156a8565b505060018101905061565c565b50809350505050919050565b6000825190506156c58482846152fc565b6004846156d29190618d27565b93508063ffffffff1684101561571d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161571490619b90565b60405180910390fd5b8063ffffffff168461572f9190618d27565b9350801560008103615781578483018051601f84168015602002818801018581018215602002838601015b81831015615777578251815260208301925060208101905061575a565b5083855250505050505b5050505050565b828101600181038051848352808252505050505050565b828101600881038051848352808252505050505050565b8183820152505050565b8183820152505050565b60006020905060008085850151925060016020840401905060006020840611156157f5576001810190505b5b8082101561581a5785850151602083028501526020860395506001820191506157f6565b505050505050565b60006158318260200151611db0565b9050919050565b600080615846858585611acf565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905060046000838152602001908152602001600020600081819054906101000a900463ffffffff16809291906158a3906190ab565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b600060606000606060006158e186615dc8565b3b0361592857600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509050615ae9565b600061593386615dc8565b9050600060095403615a135780632e00b3958a8a8a60001c8a60e001516040518563ffffffff1660e01b815260040161596f94939291906192a1565b600060405180830381600087803b15801561598957600080fd5b505af192505050801561599a575060015b615a09576159a66193b6565b806308c379a0036159ce57506159ba6193d8565b806159c557506159d0565b80925050615a04565b505b3d80600081146159fc576040519150601f19603f3d011682016040523d82523d6000602084013e615a01565b606091505b50505b615a0e565b600192505b615ae7565b6009546365a6371f8a8a8a60001c858b60e001516040518663ffffffff1660e01b8152600401615a479594939291906192e8565b600060405180830381600087803b158015615a6157600080fd5b505af1925050508015615a72575060015b615ae157615a7e6193b6565b806308c379a003615aa65750615a926193d8565b80615a9d5750615aa8565b80925050615adc565b505b3d8060008114615ad4576040519150601f19603f3d011682016040523d82523d6000602084013e615ad9565b606091505b50505b615ae6565b600192505b5b505b818193509350505094509492505050565b600060606000615b5387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151615838565b90508063ffffffff168460c0015163ffffffff1614615ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b9e90619389565b60405180910390fd5b600060606000615bb687615dc8565b90506000813b03615c0257600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509150615db5565b600060095403615ce05780639e4177318b8b8b60001c8b60e001516040518563ffffffff1660e01b8152600401615c3c94939291906192a1565b600060405180830381600087803b158015615c5657600080fd5b505af1925050508015615c67575060015b615cd657615c736193b6565b806308c379a003615c9b5750615c876193d8565b80615c925750615c9d565b80925050615cd1565b505b3d8060008114615cc9576040519150601f19603f3d011682016040523d82523d6000602084013e615cce565b606091505b50505b615cdb565b600192505b615db4565b60095463b92e9fe88b8b8b60001c858c60e001516040518663ffffffff1660e01b8152600401615d149594939291906192e8565b600060405180830381600087803b158015615d2e57600080fd5b505af1925050508015615d3f575060015b615dae57615d4b6193b6565b806308c379a003615d735750615d5f6193d8565b80615d6a5750615d75565b80925050615da9565b505b3d8060008114615da1576040519150601f19603f3d011682016040523d82523d6000602084013e615da6565b606091505b50505b615db3565b600192505b5b5b8282955095505050505094509492505050565b6000615dd78260600151611db0565b9050919050565b6000615de987615dc8565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087604001819052508387606001818152505082615e4e576003615e51565b60025b876080019060ff16908160ff168152505082615e6d5781615e7e565b604051806020016040528060008152505b876101000181905250600154639d24799882615e998a613b23565b6040518363ffffffff1660e01b8152600401615eb6929190618c6a565b600060405180830381600087803b158015615ed057600080fd5b505af1158015615ee4573d6000803e3d6000fd5b5050505050505050505050565b60006060600060606000615f04866163ef565b3b03615f4b57600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f6465000000000000000000000000815250905061610e565b6000615f56866163ef565b90506000600954036160375780632e00b3958a8a8a60001c8a61012001516040518563ffffffff1660e01b8152600401615f9394939291906192a1565b600060405180830381600087803b158015615fad57600080fd5b505af1925050508015615fbe575060015b61602d57615fca6193b6565b806308c379a003615ff25750615fde6193d8565b80615fe95750615ff4565b80925050616028565b505b3d8060008114616020576040519150601f19603f3d011682016040523d82523d6000602084013e616025565b606091505b50505b616032565b600192505b61610c565b60095463cd616e1e8a8a8a60001c858b61012001516040518663ffffffff1660e01b815260040161606c9594939291906192e8565b600060405180830381600087803b15801561608657600080fd5b505af1925050508015616097575060015b616106576160a36193b6565b806308c379a0036160cb57506160b76193d8565b806160c257506160cd565b80925050616101565b505b3d80600081146160f9576040519150601f19603f3d011682016040523d82523d6000602084013e6160fe565b606091505b50505b61610b565b600192505b5b505b818193509350505094509492505050565b60006060600061617887878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151615838565b90508063ffffffff168460c0015163ffffffff16146161cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016161c390619c22565b60405180910390fd5b6000606060006161db876163ef565b90506000813b0361622757600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525091506163dc565b6000600954036163065780639e4177318b8b8b60001c8b61012001516040518563ffffffff1660e01b815260040161626294939291906192a1565b600060405180830381600087803b15801561627c57600080fd5b505af192505050801561628d575060015b6162fc576162996193b6565b806308c379a0036162c157506162ad6193d8565b806162b857506162c3565b809250506162f7565b505b3d80600081146162ef576040519150601f19603f3d011682016040523d82523d6000602084013e6162f4565b606091505b50505b616301565b600192505b6163db565b60095463ca4f1d128b8b8b60001c858c61012001516040518663ffffffff1660e01b815260040161633b9594939291906192e8565b600060405180830381600087803b15801561635557600080fd5b505af1925050508015616366575060015b6163d5576163726193b6565b806308c379a00361639a57506163866193d8565b80616391575061639c565b809250506163d0565b505b3d80600081146163c8576040519150601f19603f3d011682016040523d82523d6000602084013e6163cd565b606091505b50505b6163da565b600192505b5b5b8282955095505050505094509492505050565b60006163fe8260600151611db0565b9050919050565b6000616410876163ef565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087604001819052508387606001818152505082616475576003616478565b60025b876080019060ff16908160ff16815250508261649457816164a5565b604051806020016040528060008152505b876101400181905250600154639d247998826164c08a61342e565b6040518363ffffffff1660e01b81526004016164dd929190618c6a565b600060405180830381600087803b1580156164f757600080fd5b505af115801561650b573d6000803e3d6000fd5b5050505050505050505050565b6165206172cd565b6165286172cd565b6000616533846166e1565b905060005b8160200151518110156166705760008260200151828151811061655e5761655d619c42565b5b602002602001015190506000816000015161ffff16036165995761658181616893565b846000019061ffff16908161ffff168152505061665c565b6001816000015161ffff16036165bf576165b2816168b3565b846020018190525061665b565b6002816000015161ffff16036165f0576165e260206165dd836168c1565b612e95565b84604001818152505061665a565b6003816000015161ffff160361661f5761661161660c826168c1565b612fc6565b846060018181525050616659565b6004816000015161ffff160361665857616638816168cf565b846080019067ffffffffffffffff16908167ffffffffffffffff16815250505b5b5b5b5b50808061666890619a7c565b915050616538565b508192505050919050565b600080602067ffffffffffffffff81111561669957616698617a79565b5b6040519080825280601f01601f1916602001820160405280156166cb5781602001600182028036833780820191505090505b5090508260208201526020810151915050919050565b6166e96173a9565b60068251101561672e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161672590619cbd565b60405180910390fd5b60006167386173a9565b61674a61674585846168ef565b61691e565b816000019061ffff16908161ffff168152505060068261676a9190618d5b565b91506000808390505b85518110156167cc5761679a616795876002846167909190618d5b565b616a49565b616a7a565b60066167a691906191d5565b63ffffffff16816167b79190618d5b565b905081806167c490619a7c565b925050616773565b60008267ffffffffffffffff8111156167e8576167e7617a79565b5b60405190808252806020026020018201604052801561682157816020015b61680e6173c7565b8152602001906001900390816168065790505b509050600092505b865185101561687d5761683a6173c7565b6168448887616c5b565b80975081925050508082858061685990619a7c565b96508151811061686c5761686b619c42565b5b602002602001018190525050616829565b8084602001819052508395505050505050919050565b60006168ac6168a760028460400151616da3565b61691e565b9050919050565b606081604001519050919050565b606081604001519050919050565b60006168e86168e360088460400151612faa565b616db1565b9050919050565b600082516002836169009190618d5b565b111561690b57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff81111561694457616943617a79565b5b6040519080825280601f01601f1916602001820160405280156169765781602001600182028036833780820191505090505b5090508160016002811061698d5761698c619c42565b5b1a60f81b816000815181106169a5576169a4619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600281106169e8576169e7619c42565b5b1a60f81b81600181518110616a00576169ff619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000616a3c8260006168ef565b9050809350505050919050565b60008251600483616a5a9190618d5b565b1115616a6557600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff811115616aa057616a9f617a79565b5b6040519080825280601f01601f191660200182016040528015616ad25781602001600182028036833780820191505090505b50905081600360048110616ae957616ae8619c42565b5b1a60f81b81600081518110616b0157616b00619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260048110616b4457616b43619c42565b5b1a60f81b81600181518110616b5c57616b5b619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160048110616b9f57616b9e619c42565b5b1a60f81b81600281518110616bb757616bb6619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060048110616bfa57616bf9619c42565b5b1a60f81b81600381518110616c1257616c11619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000616c4e826000616a49565b9050809350505050919050565b616c636173c7565b600082845111616ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401616c9f90619d4f565b60405180910390fd5b6006831015616cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401616ce390619dbb565b60405180910390fd5b616cf46173c7565b616d06616d0186866168ef565b61691e565b816000019061ffff16908161ffff1681525050600284616d269190618d5b565b9350616d3a616d358686616a49565b616a7a565b816020019063ffffffff16908163ffffffff1681525050600484616d5e9190618d5b565b9350616d758585836020015163ffffffff166170fe565b8160400181905250806020015163ffffffff1684616d939190618d5b565b9350808492509250509250929050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff811115616dd757616dd6617a79565b5b6040519080825280601f01601f191660200182016040528015616e095781602001600182028036833780820191505090505b50905081600760088110616e2057616e1f619c42565b5b1a60f81b81600081518110616e3857616e37619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600660088110616e7b57616e7a619c42565b5b1a60f81b81600181518110616e9357616e92619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600560088110616ed657616ed5619c42565b5b1a60f81b81600281518110616eee57616eed619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600460088110616f3157616f30619c42565b5b1a60f81b81600381518110616f4957616f48619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600360088110616f8c57616f8b619c42565b5b1a60f81b81600481518110616fa457616fa3619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260088110616fe757616fe6619c42565b5b1a60f81b81600581518110616fff57616ffe619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160016008811061704257617041619c42565b5b1a60f81b8160068151811061705a57617059619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006008811061709d5761709c619c42565b5b1a60f81b816007815181106170b5576170b4619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006170f1826000617193565b9050809350505050919050565b60608351828461710e9190618d5b565b111561711957600080fd5b60008267ffffffffffffffff81111561713557617134617a79565b5b6040519080825280601f01601f1916602001820160405280156171675781602001600182028036833780820191505090505b50905060008060208301915085602088010190506171868282876171c8565b8293505050509392505050565b600082516008836171a49190618d5b565b11156171af57600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b6020811061720757815183526020836171e29190618d5b565b92506020826171f19190618d5b565b91506020816172009190618d27565b90506171c9565b600081031561724c57600060018260206172219190618d27565b61010061722e9190619f0e565b6172389190618d27565b905080198351168185511681811786525050505b505050565b604051806101600160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600060ff1681526020016000815260200160608152602001606081525090565b6040518060a00160405280600061ffff168152602001606081526020016000801916815260200160008152602001600067ffffffffffffffff1681525090565b6040518060800160405280606081526020016000801916815260200160608152602001600063ffffffff1681525090565b604051806101200160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff16815260200160608152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261742b5761742a617406565b5b8235905067ffffffffffffffff8111156174485761744761740b565b5b60208301915083600182028301111561746457617463617410565b5b9250929050565b6000819050919050565b60006174808261746b565b9050919050565b61749081617475565b811461749b57600080fd5b50565b6000813590506174ad81617487565b92915050565b60008083601f8401126174c9576174c8617406565b5b8235905067ffffffffffffffff8111156174e6576174e561740b565b5b60208301915083600182028301111561750257617501617410565b5b9250929050565b600080600080600060608688031215617525576175246173fc565b5b600086013567ffffffffffffffff81111561754357617542617401565b5b61754f88828901617415565b955095505060206175628882890161749e565b935050604086013567ffffffffffffffff81111561758357617582617401565b5b61758f888289016174b3565b92509250509295509295909350565b6000602082840312156175b4576175b36173fc565b5b60006175c28482850161749e565b91505092915050565b60008115159050919050565b6175e0816175cb565b82525050565b60006020820190506175fb60008301846175d7565b92915050565b6000819050919050565b61761481617601565b811461761f57600080fd5b50565b6000813590506176318161760b565b92915050565b60008060008060008060808789031215617654576176536173fc565b5b600087013567ffffffffffffffff81111561767257617671617401565b5b61767e89828a01617415565b9650965050602061769189828a01617622565b945050604087013567ffffffffffffffff8111156176b2576176b1617401565b5b6176be89828a01617415565b935093505060606176d189828a01617622565b9150509295509295509295565b600063ffffffff82169050919050565b6176f7816176de565b82525050565b600060208201905061771260008301846176ee565b92915050565b600080600060408486031215617731576177306173fc565b5b600061773f86828701617622565b935050602084013567ffffffffffffffff8111156177605761775f617401565b5b61776c868287016174b3565b92509250509250925092565b60008060008060008060808789031215617795576177946173fc565b5b600087013567ffffffffffffffff8111156177b3576177b2617401565b5b6177bf89828a01617415565b965096505060206177d289828a0161749e565b945050604087013567ffffffffffffffff8111156177f3576177f2617401565b5b6177ff89828a01617415565b9350935050606061781289828a0161749e565b9150509295509295509295565b617828816175cb565b811461783357600080fd5b50565b6000813590506178458161781f565b92915050565b600060ff82169050919050565b6178618161784b565b811461786c57600080fd5b50565b60008135905061787e81617858565b92915050565b61788d8161746b565b811461789857600080fd5b50565b6000813590506178aa81617884565b92915050565b600080600080600080600080600060e08a8c0312156178d2576178d16173fc565b5b60008a013567ffffffffffffffff8111156178f0576178ef617401565b5b6178fc8c828d01617415565b9950995050602061790f8c828d0161749e565b97505060406179208c828d0161749e565b96505060606179318c828d01617836565b95505060808a013567ffffffffffffffff81111561795257617951617401565b5b61795e8c828d016174b3565b945094505060a06179718c828d0161786f565b92505060c06179828c828d0161789b565b9150509295985092959850929598565b61799b81617601565b82525050565b60006020820190506179b66000830184617992565b92915050565b600080600080600080608087890312156179d9576179d86173fc565b5b600087013567ffffffffffffffff8111156179f7576179f6617401565b5b617a0389828a01617415565b96509650506020617a1689828a0161749e565b9450506040617a2789828a01617836565b935050606087013567ffffffffffffffff811115617a4857617a47617401565b5b617a5489828a016174b3565b92509250509295509295509295565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b617ab182617a68565b810181811067ffffffffffffffff82111715617ad057617acf617a79565b5b80604052505050565b6000617ae36173f2565b9050617aef8282617aa8565b919050565b600067ffffffffffffffff821115617b0f57617b0e617a79565b5b617b1882617a68565b9050602081019050919050565b82818337600083830152505050565b6000617b47617b4284617af4565b617ad9565b905082815260208101848484011115617b6357617b62617a63565b5b617b6e848285617b25565b509392505050565b600082601f830112617b8b57617b8a617406565b5b8135617b9b848260208601617b34565b91505092915050565b60008060408385031215617bbb57617bba6173fc565b5b6000617bc98582860161749e565b925050602083013567ffffffffffffffff811115617bea57617be9617401565b5b617bf685828601617b76565b9150509250929050565b60008060008060008060808789031215617c1d57617c1c6173fc565b5b600087013567ffffffffffffffff811115617c3b57617c3a617401565b5b617c4789828a01617415565b96509650506020617c5a89828a0161749e565b9450506040617c6b89828a0161749e565b935050606087013567ffffffffffffffff811115617c8c57617c8b617401565b5b617c9889828a016174b3565b92509250509295509295509295565b617cb081617475565b82525050565b6000602082019050617ccb6000830184617ca7565b92915050565b600060208284031215617ce757617ce66173fc565b5b600082013567ffffffffffffffff811115617d0557617d04617401565b5b617d1184828501617b76565b91505092915050565b60008060208385031215617d3157617d306173fc565b5b600083013567ffffffffffffffff811115617d4f57617d4e617401565b5b617d5b85828601617415565b92509250509250929050565b600061ffff82169050919050565b617d7e81617d67565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015617dbe578082015181840152602081019050617da3565b83811115617dcd576000848401525b50505050565b6000617dde82617d84565b617de88185617d8f565b9350617df8818560208601617da0565b617e0181617a68565b840191505092915050565b617e1581617601565b82525050565b617e248161746b565b82525050565b600067ffffffffffffffff82169050919050565b617e4781617e2a565b82525050565b600060a083016000830151617e656000860182617d75565b5060208301518482036020860152617e7d8282617dd3565b9150506040830151617e926040860182617e0c565b506060830151617ea56060860182617e1b565b506080830151617eb86080860182617e3e565b508091505092915050565b60006020820190508181036000830152617edd8184617e4d565b905092915050565b600080600080600060608688031215617f0157617f006173fc565b5b600086013567ffffffffffffffff811115617f1f57617f1e617401565b5b617f2b88828901617415565b95509550506020617f3e88828901617622565b935050604086013567ffffffffffffffff811115617f5f57617f5e617401565b5b617f6b888289016174b3565b92509250509295509295909350565b600080600080600080600060a0888a031215617f9957617f986173fc565b5b600088013567ffffffffffffffff811115617fb757617fb6617401565b5b617fc38a828b01617415565b97509750506020617fd68a828b0161749e565b9550506040617fe78a828b0161749e565b9450506060617ff88a828b01617836565b935050608088013567ffffffffffffffff81111561801957618018617401565b5b6180258a828b016174b3565b925092505092959891949750929550565b60008060008060008060008060c0898b031215618056576180556173fc565b5b600089013567ffffffffffffffff81111561807457618073617401565b5b6180808b828c01617415565b985098505060206180938b828c0161749e565b96505060406180a48b828c01617836565b955050606089013567ffffffffffffffff8111156180c5576180c4617401565b5b6180d18b828c016174b3565b945094505060806180e48b828c0161786f565b92505060a06180f58b828c0161789b565b9150509295985092959890939650565b61810e816176de565b811461811957600080fd5b50565b60008135905061812b81618105565b92915050565b6000806000806080858703121561814b5761814a6173fc565b5b600085013567ffffffffffffffff81111561816957618168617401565b5b61817587828801617b76565b94505060206181868782880161749e565b93505060406181978782880161749e565b92505060606181a88782880161811c565b91505092959194509250565b600082825260208201905092915050565b7f5344504d73673a206e6f742076616c6964206d6f6e69746f7220636f6e74726160008201527f6374000000000000000000000000000000000000000000000000000000000000602082015250565b60006182216022836181b4565b915061822c826181c5565b604082019050919050565b6000602082019050818103600083015261825081618214565b9050919050565b600081905092915050565b600061826e8385618257565b935061827b838584617b25565b82840190509392505050565b6000618294828486618262565b91508190509392505050565b7f5344504d73673a2077726f6e6720726563656976696e6720646f6d61696e0000600082015250565b60006182d6601e836181b4565b91506182e1826182a0565b602082019050919050565b60006020820190508181036000830152618305816182c9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006183426020836181b4565b915061834d8261830c565b602082019050919050565b6000602082019050818103600083015261837181618335565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b60006183d46027836181b4565b91506183df82618378565b604082019050919050565b60006020820190508181036000830152618403816183c7565b9050919050565b7f5344504d73673a2073656e646572206e6f742076616c69642072656c61796572600082015250565b60006184406020836181b4565b915061844b8261840a565b602082019050919050565b6000602082019050818103600083015261846f81618433565b9050919050565b7f5344505f4d53475f4552524f523a20746865206d6573736167652074696d656f60008201527f75744d6561737572652069732030000000000000000000000000000000000000602082015250565b60006184d2602e836181b4565b91506184dd82618476565b604082019050919050565b60006020820190508181036000830152618501816184c5565b9050919050565b600061851382617d84565b61851d8185618257565b935061852d818560208601617da0565b80840191505092915050565b60006185458284618508565b915081905092915050565b7f5344505f4d53475f4552524f523a20657863657074696f6e206d65737361676560008201527f206861736820646f6573206e6f74206578697374000000000000000000000000602082015250565b60006185ac6034836181b4565b91506185b782618550565b604082019050919050565b600060208201905081810360008301526185db8161859f565b9050919050565b60006185ed82617d84565b6185f781856181b4565b9350618607818560208601617da0565b61861081617a68565b840191505092915050565b61862481617e2a565b82525050565b600081519050919050565b600082825260208201905092915050565b60006186518261862a565b61865b8185618635565b935061866b818560208601617da0565b61867481617a68565b840191505092915050565b600060e082019050618694600083018a617992565b81810360208301526186a681896185e2565b90506186b56040830188617ca7565b6186c260608301876176ee565b6186cf608083018661861b565b81810360a08301526186e18185618646565b905081810360c08301526186f581846185e2565b905098975050505050505050565b600061010082019050618719600083018b617ca7565b618726602083018a617992565b818103604083015261873881896185e2565b90506187476060830188617ca7565b61875460808301876176ee565b61876160a083018661861b565b81810360c08301526187738185618646565b905081810360e083015261878781846185e2565b90509998505050505050505050565b7f5344505f4d53475f4552524f523a20746865206d657373616765206973206e6f60008201527f742074696d656f757420776974682074696d656f75744d656173757265203200602082015250565b60006187f2603f836181b4565b91506187fd82618796565b604082019050919050565b60006020820190508181036000830152618821816187e5565b9050919050565b7f5344505f4d53475f4552524f523a20756e737570706f727465642074696d656f60008201527f7574206d65617375726500000000000000000000000000000000000000000000602082015250565b6000618884602a836181b4565b915061888f82618828565b604082019050919050565b600060208201905081810360008301526188b381618877565b9050919050565b60006188c683856181b4565b93506188d3838584617b25565b6188dc83617a68565b840190509392505050565b60006188f38385618635565b9350618900838584617b25565b61890983617a68565b840190509392505050565b600060a082019050818103600083015261892f81898b6188ba565b905061893e6020830188617ca7565b61894b6040830187617ca7565b61895860608301866175d7565b818103608083015261896b8184866188e7565b905098975050505050505050565b6000815190506189888161760b565b92915050565b6000602082840312156189a4576189a36173fc565b5b60006189b284828501618979565b91505092915050565b7f5344504d73673a20696e76616c696420616d20636f6e74726163740000000000600082015250565b60006189f1601b836181b4565b91506189fc826189bb565b602082019050919050565b60006020820190508181036000830152618a20816189e4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680618a6e57607f821691505b602082108103618a8157618a80618a27565b5b50919050565b7f5344504d73673a206e6f742076616c696420616d20636f6e7472616374000000600082015250565b6000618abd601d836181b4565b9150618ac882618a87565b602082019050919050565b60006020820190508181036000830152618aec81618ab0565b9050919050565b7f756e737570706f72746564207364702076657273696f6e000000000000000000600082015250565b6000618b296017836181b4565b9150618b3482618af3565b602082019050919050565b60006020820190508181036000830152618b5881618b1c565b9050919050565b618b688161784b565b82525050565b618b778161746b565b82525050565b600060e0820190508181036000830152618b98818b8d6188ba565b9050618ba7602083018a617ca7565b618bb46040830189617ca7565b618bc160608301886175d7565b8181036080830152618bd48186886188e7565b9050618be360a0830185618b5f565b618bf060c0830184618b6e565b9a9950505050505050505050565b7f5344504d73673a20696e76616c6964206d6f6e69746f7220636f6e7472616374600082015250565b6000618c346020836181b4565b9150618c3f82618bfe565b602082019050919050565b60006020820190508181036000830152618c6381618c27565b9050919050565b6000604082019050618c7f6000830185617ca7565b8181036020830152618c918184618646565b90509392505050565b6000819050919050565b618cb5618cb082617601565b618c9a565b82525050565b6000618cc78286618ca4565b602082019150618cd78285618ca4565b602082019150618ce78284618ca4565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000618d328261746b565b9150618d3d8361746b565b925082821015618d5057618d4f618cf8565b5b828203905092915050565b6000618d668261746b565b9150618d718361746b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115618da657618da5618cf8565b5b828201905092915050565b7f5344503a20696e76616c69642074696d656f7574206d65617375726500000000600082015250565b6000618de7601c836181b4565b9150618df282618db1565b602082019050919050565b60006020820190508181036000830152618e1681618dda565b9050919050565b7f756e65787065637465642061746f6d696320666c616700000000000000000000600082015250565b6000618e536016836181b4565b9150618e5e82618e1d565b602082019050919050565b60006020820190508181036000830152618e8281618e46565b9050919050565b7f5344505f4d73673a2077726f6e6720726563656976696e6720646f6d61696e00600082015250565b6000618ebf601f836181b4565b9150618eca82618e89565b602082019050919050565b60006020820190508181036000830152618eee81618eb2565b9050919050565b7f5344505f4d53475f4552524f523a20756e65787065637465642061746f6d696360008201527f20666c6167000000000000000000000000000000000000000000000000000000602082015250565b6000618f516025836181b4565b9150618f5c82618ef5565b604082019050919050565b60006020820190508181036000830152618f8081618f44565b9050919050565b7f6279746573546f56617242797465733a206f6666736574206c6573732074686160008201527f6e206c656e677468206f6620626f647900000000000000000000000000000000602082015250565b6000618fe36030836181b4565b9150618fee82618f87565b604082019050919050565b6000602082019050818103600083015261901281618fd6565b9050919050565b7f333262797465732062696720696e7465676572206174206d6f737420666f722060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b60006190756023836181b4565b915061908082619019565b604082019050919050565b600060208201905081810360008301526190a481619068565b9050919050565b60006190b6826176de565b915063ffffffff82036190cc576190cb618cf8565b5b600182019050919050565b7f656e636f64655344504d6573736167653a2077726f6e672076657273696f6e00600082015250565b600061910d601f836181b4565b9150619118826190d7565b602082019050919050565b6000602082019050818103600083015261913c81619100565b9050919050565b7f656e636f64655344504d6573736167653a20626f6479206c656e677468206f7660008201527f65726c696d697400000000000000000000000000000000000000000000000000602082015250565b600061919f6027836181b4565b91506191aa82619143565b604082019050919050565b600060208201905081810360008301526191ce81619192565b9050919050565b60006191e0826176de565b91506191eb836176de565b92508263ffffffff0382111561920457619203618cf8565b5b828201905092915050565b7f656e636f64655344504d6573736167653a207a65726f206d657373616765206960008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061926b6021836181b4565b91506192768261920f565b604082019050919050565b6000602082019050818103600083015261929a8161925e565b9050919050565b600060608201905081810360008301526192bc8186886188ba565b90506192cb6020830185617ca7565b81810360408301526192dd8184618646565b905095945050505050565b600060808201905081810360008301526193038187896188ba565b90506193126020830186617ca7565b61931f6040830185617ca7565b81810360608301526193318184618646565b90509695505050505050565b7f5344504d73673a2073657175656e6365206e6f7420657175616c000000000000600082015250565b6000619373601a836181b4565b915061937e8261933d565b602082019050919050565b600060208201905081810360008301526193a281619366565b9050919050565b60008160e01c9050919050565b600060033d11156193d55760046000803e6193d26000516193a9565b90505b90565b600060443d10619465576193ea6173f2565b60043d036004823e80513d602482011167ffffffffffffffff82111715619412575050619465565b808201805167ffffffffffffffff8111156194305750505050619465565b80602083010160043d03850181111561944d575050505050619465565b61945c82602001850186617aa8565b82955050505050505b90565b600060c082019050818103600083015261948381898b6188ba565b90506194926020830188617992565b61949f6040830187617ca7565b6194ac60608301866176ee565b6194b960808301856175d7565b81810360a08301526194cb81846185e2565b905098975050505050505050565b600060208201905081810360008301526194f381846185e2565b905092915050565b600061014082019050619511600083018e617992565b8181036020830152619524818c8e6188ba565b9050619533604083018b617992565b8181036060830152619545818a6185e2565b90506195546080830189617ca7565b61956160a08301886176ee565b61956e60c083018761861b565b61957b60e0830186618b5f565b6195896101008301856175d7565b81810361012083015261959c81846185e2565b90509c9b505050505050505050505050565b600060c0820190506195c3600083018a617992565b81810360208301526195d681888a6188ba565b90506195e56040830187617ca7565b6195f260608301866176ee565b6195ff608083018561861b565b81810360a08301526196118184618646565b905098975050505050505050565b600060e082019050619634600083018b617ca7565b619641602083018a617992565b818103604083015261965481888a6188ba565b90506196636060830187617ca7565b61967060808301866176ee565b61967d60a083018561861b565b81810360c083015261968f8184618646565b90509998505050505050505050565b7f7375636365737300000000000000000000000000000000000000000000000000600082015250565b60006196d46007836181b4565b91506196df8261969e565b602082019050919050565b600061014082019050619700600083018d617992565b8181036020830152619713818b8d6188ba565b9050619722604083018a617992565b818103606083015261973481896185e2565b90506197436080830188617ca7565b61975060a08301876176ee565b61975d60c083018661861b565b61976a60e0830185618b5f565b6197786101008301846175d7565b81810361012083015261978a816196c7565b90509b9a5050505050505050505050565b600060e0820190506197b0600083018b617992565b81810360208301526197c381898b6188ba565b90506197d26040830188617ca7565b6197df60608301876176ee565b6197ec608083018661861b565b81810360a08301526197fe8185618646565b905081810360c083015261981281846185e2565b90509998505050505050505050565b600061010082019050619837600083018c617ca7565b619844602083018b617992565b818103604083015261985781898b6188ba565b90506198666060830188617ca7565b61987360808301876176ee565b61988060a083018661861b565b81810360c08301526198928185618646565b905081810360e08301526198a681846185e2565b90509a9950505050505050505050565b7f6f6e6c7920737570706f72742074696d656f7574206d65617375726520302c2060008201527f3220616e64203420666f72206e6f770000000000000000000000000000000000602082015250565b6000619912602f836181b4565b915061991d826198b6565b604082019050919050565b6000602082019050818103600083015261994181619905565b9050919050565b7f6d73672069732074696d656f7574000000000000000000000000000000000000600082015250565b600061997e600e836181b4565b915061998982619948565b602082019050919050565b600060208201905081810360008301526199ad81619971565b9050919050565b60006060820190506199c96000830186617992565b6199d66020830185618b5f565b6199e36040830184618b6e565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000619a258261746b565b9150619a308361746b565b925082619a4057619a3f6199eb565b5b828204905092915050565b6000619a568261746b565b9150619a618361746b565b925082619a7157619a706199eb565b5b828206905092915050565b6000619a878261746b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203619ab957619ab8618cf8565b5b600182019050919050565b6000619acf8261746b565b9150619ada8361746b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615619b1357619b12618cf8565b5b828202905092915050565b7f7661724279746573546f42797465733a206f6666736574206c6573732074686160008201527f6e2074686520696e707574206c656e6774680000000000000000000000000000602082015250565b6000619b7a6032836181b4565b9150619b8582619b1e565b604082019050919050565b60006020820190508181036000830152619ba981619b6d565b9050919050565b7f5344505f4d53475f4552524f523a2073657175656e6365206e6f74206571756160008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000619c0c6021836181b4565b9150619c1782619bb0565b604082019050919050565b60006020820190508181036000830152619c3b81619bff565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b6000619ca76017836181b4565b9150619cb282619c71565b602082019050919050565b60006020820190508181036000830152619cd681619c9a565b9050919050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b6000619d396023836181b4565b9150619d4482619cdd565b604082019050919050565b60006020820190508181036000830152619d6881619d2c565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b6000619da5600e836181b4565b9150619db082619d6f565b602082019050919050565b60006020820190508181036000830152619dd481619d98565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115619e3257808604811115619e0e57619e0d618cf8565b5b6001851615619e1d5780820291505b8081029050619e2b85619ddb565b9450619df2565b94509492505050565b600082619e4b5760019050619f07565b81619e595760009050619f07565b8160018114619e6f5760028114619e7957619ea8565b6001915050619f07565b60ff841115619e8b57619e8a618cf8565b5b8360020a915084821115619ea257619ea1618cf8565b5b50619f07565b5060208310610133831016604e8410600b8410161715619edd5782820a905083811115619ed857619ed7618cf8565b5b619f07565b619eea8484846001619de8565b92509050818404811115619f0157619f00618cf8565b5b81810290505b9392505050565b6000619f198261746b565b9150619f248361746b565b9250619f517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484619e3b565b90509291505056fea3646970667358221220faf32820aa4f3d9ae1cfad23a6e990e25c2bd1a7eabdcde4328759648c43594f64736f6c637827302e382e31342d63692e323032322e362e32302b636f6d6d69742e66633963623232362e6d6f646b636f6d70696c655f6d6f6461310066 \ No newline at end of file diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg_sol_SDPMsg.bin b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg_sol_SDPMsg.bin index 592b067f..02a5c064 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg_sol_SDPMsg.bin +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/main/resources/contract/v1/solidity/SDPMsg_sol_SDPMsg.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b5062000032620000266200006460201b60201c565b6200006c60201b60201c565b60016009600033815260200190815260200160002060006101000a81548160ff021916908315150217905550620000ab565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b618d3f80620000bb6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c8063715018a6116100f9578063c09b261b11610097578063e552109211610071578063e5521092146104b6578063e5e55300146104d4578063eaa71e90146104f0578063ed46aafa1461050c576101a9565b8063c09b261b1461044e578063d513f34a1461046a578063db37c08b14610486576101a9565b806389223f80116100d357806389223f80146103c65780638da5cb5b146103e2578063a9d662af14610400578063b5db295a1461041e576101a9565b8063715018a6146103825780638037d45e1461038c578063838a102c146103aa576101a9565b8063343e77921161016657806342f116bd1161014057806342f116bd146102fc57806356cb2d0214610318578063627523a4146103365780636bba080814610366576101a9565b8063343e77921461029257806334d4725a146102c25780633ac6dfb1146102de576101a9565b806304f25f96146101ae5780630a6e15db146101ca5780630d9ae9e5146101fa5780631f56086f1461022a578063203c2c851461024657806325601cdd14610262575b600080fd5b6101c860048036038101906101c3919061679a565b61053c565b005b6101e460048036038101906101df919061682f565b6105a2565b6040516101f19190616877565b60405180910390f35b610214600480360381019061020f91906168c8565b6105c2565b604051610221919061698e565b60405180910390f35b610244600480360381019061023f919061682f565b6106ba565b005b610260600480360381019061025b91906169a9565b610759565b005b61027c60048036038101906102779190616a09565b610a32565b604051610289919061698e565b60405180910390f35b6102ac60048036038101906102a79190616adc565b610b30565b6040516102b99190616b92565b60405180910390f35b6102dc60048036038101906102d7919061679a565b610d32565b005b6102e6610d98565b6040516102f39190616b92565b60405180910390f35b61031660048036038101906103119190616cee565b610da2565b005b610320610e6d565b60405161032d9190616b92565b60405180910390f35b610350600480360381019061034b9190616adc565b610e73565b60405161035d9190616b92565b60405180910390f35b610380600480360381019061037b9190616d4a565b61106f565b005b61038a6110d6565b005b610394611132565b6040516103a19190616e00565b60405180910390f35b6103c460048036038101906103bf9190616e1b565b61113c565b005b6103e060048036038101906103db9190616d4a565b6111bc565b005b6103ea611223565b6040516103f79190616e00565b60405180910390f35b61040861122c565b6040516104159190616e00565b60405180910390f35b61043860048036038101906104339190616e64565b611232565b604051610445919061700d565b60405180910390f35b6104686004803603810190610463919061702f565b611380565b005b610484600480360381019061047f919061682f565b611598565b005b6104a0600480360381019061049b9190617129565b611635565b6040516104ad9190616b92565b60405180910390f35b6104be6118d4565b6040516104cb9190616e00565b60405180910390f35b6104ee60048036038101906104e99190617224565b6118da565b005b61050a6004803603810190610505919061682f565b611978565b005b61052660048036038101906105219190617129565b611a15565b6040516105339190616b92565b60405180910390f35b6000600254148061054e575033600254145b61058d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105849061732a565b60405180910390fd5b61059b858585338686611cae565b5050505050565b60096020528060005260406000206000915054906101000a900460ff1681565b600060035484846040516020016105da92919061737a565b6040516020818303038152906040528051906020012014610630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610627906173df565b60405180910390fd5b600061068188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508785611de3565b905060006005600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6106c2611e3f565b6106ca611223565b1461070a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107019061744b565b60405180910390fd5b6000810361074d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610744906174dd565b60405180910390fd5b61075681611e47565b50565b6009600033815260200190815260200160002060009054906101000a900460ff166107b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b090617549565b60405180910390fd5b6107c16164e2565b61081883838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505082611e8690919063ffffffff16565b8060e0015160ff16600003610862576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610859906175db565b60405180910390fd5b8060e0015160ff166002036109f157806101000151600760008360400151604051602001610890919061762c565b6040516020818303038152906040528051906020012081526020019081526020016000206003015411156109b157600860008260200151815260200190815260200160002060009054906101000a900460ff16610922576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610919906176b5565b60405180910390fd5b61092b846120c4565b6383c6d5a282602001518360400151846060015160001c8560c001518660a001518761012001518861014001516040518863ffffffff1660e01b815260040161097a9796959493929190617772565b600060405180830381600087803b15801561099457600080fd5b505af11580156109a8573d6000803e3d6000fd5b505050506109ec565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390617868565b60405180910390fd5b610a2c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a23906178fa565b60405180910390fd5b50505050565b60006003548484604051602001610a4a92919061737a565b6040516020818303038152906040528051906020012014610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a97906173df565b60405180910390fd5b6000610af788888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508760001b8560001b611de3565b905060006005600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6000610b3f8787878686612136565b60008560001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200187610bc7576000610bca565b60015b60ff168152602001610c218b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661213d565b63ffffffff1667ffffffffffffffff16815260200163ffffffff8016815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050610cb6600354826121d390919063ffffffff16565b600154639d24799833610cc884612470565b6040518363ffffffff1660e01b8152600401610ce592919061791a565b600060405180830381600087803b158015610cff57600080fd5b505af1158015610d13573d6000803e3d6000fd5b50505050610d1f6127a2565b8060200151925050509695505050505050565b60006002541480610d44575033600254145b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a9061732a565b60405180910390fd5b610d918585853386866127a4565b5050505050565b6000600354905090565b610daa611e3f565b610db2611223565b14610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de99061744b565b60405180910390fd5b60008203610e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2c90617996565b60405180910390fd5b8160018190555080604051602001610e4d919061762c565b604051602081830303815290604052805190602001206003819055505050565b60035481565b6000610e828787878686612933565b60008560001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200187610f0a576000610f0d565b60015b60ff16815260200167ffffffffffffffff80168152602001610f748b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661293a565b63ffffffff16815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050610ff3600354826121d390919063ffffffff16565b600154639d2479983361100584612470565b6040518363ffffffff1660e01b815260040161102292919061791a565b600060405180830381600087803b15801561103c57600080fd5b505af1158015611050573d6000803e3d6000fd5b5050505061105c6129d0565b8060200151925050509695505050505050565b60006002541480611081575033600254145b6110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b79061732a565b60405180910390fd5b6110ce8686868686866127a4565b505050505050565b6110de611e3f565b6110e6611223565b14611126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111d9061744b565b60405180910390fd5b6111306000611e47565b565b6000600154905090565b611144611e3f565b61114c611223565b1461118c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111839061744b565b60405180910390fd5b8060405160200161119d919061762c565b6040516020818303038152906040528051906020012060038190555050565b600060025414806111ce575033600254145b61120d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112049061732a565b60405180910390fd5b61121b868686868686611cae565b505050505050565b60008054905090565b60015481565b61123a61655e565b60076000848460405160200161125192919061737a565b6040516020818303038152906040528051906020012081526020019081526020016000206040518060a00160405290816000820160009054906101000a900461ffff1661ffff1661ffff1681526020016001820180546112b0906179e5565b80601f01602080910402602001604051908101604052809291908181526020018280546112dc906179e5565b80156113295780601f106112fe57610100808354040283529160200191611329565b820191906000526020600020905b81548152906001019060200180831161130c57829003601f168201915b5050505050815260200160028201548152602001600382015481526020016004820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905092915050565b33600154146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90617a62565b60405180910390fd5b6113d185858585856129d2565b600061142083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506129d9565b905060018163ffffffff16036114855761148086868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a9c565b611588565b60028163ffffffff16036114e8576114e386868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b61565b611587565b60038163ffffffff160361154b5761154686868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612cad565b611586565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d90617ace565b60405180910390fd5b5b5b611590612e1d565b505050505050565b6115a0611e3f565b6115a8611223565b146115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df9061744b565b60405180910390fd5b6000810361162b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162290617996565b60405180910390fd5b8060018190555050565b60008060ff168360ff16101580156116545750600460ff168360ff1611155b611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90617b3a565b60405180910390fd5b6116a08989898888612136565b60008760001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018381526020018961172857600061172b565b60015b60ff1681526020016117828d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661213d565b63ffffffff1667ffffffffffffffff16815260200163ffffffff801681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200160405180602001604052806000815250815250905061182660035482612e1f90919063ffffffff16565b6001600860008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d247998336118688461311d565b6040518363ffffffff1660e01b815260040161188592919061791a565b600060405180830381600087803b15801561189f57600080fd5b505af11580156118b3573d6000803e3d6000fd5b505050506118bf6129d0565b80602001519250505098975050505050505050565b60025481565b6118e2611e3f565b6118ea611223565b1461192a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119219061744b565b60405180910390fd5b600061193d858560001b8560001b611de3565b9050816005600083815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505050505050565b611980611e3f565b611988611223565b146119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf9061744b565b60405180910390fd5b60008103611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0290617ba6565b60405180910390fd5b8060028190555050565b60008060ff168360ff1610158015611a345750600460ff168360ff1611155b611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a90617b3a565b60405180910390fd5b611a808989898888612136565b60008760001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200189611b08576000611b0b565b60015b60ff16815260200167ffffffffffffffff80168152602001611b728d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050338661293a565b63ffffffff1681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050611c0060035482612e1f90919063ffffffff16565b6001600860008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d24799833611c428461311d565b6040518363ffffffff1660e01b8152600401611c5f92919061791a565b600060405180830381600087803b158015611c7957600080fd5b505af1158015611c8d573d6000803e3d6000fd5b50505050611c996129d0565b80602001519250505098975050505050505050565b611cbb8686868585612136565b6000604051806080016040528088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018660001b815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200163ffffffff80168152509050600154639d24799885611d83846134dd565b6040518363ffffffff1660e01b8152600401611da092919061791a565b600060405180830381600087803b158015611dba57600080fd5b505af1158015611dce573d6000803e3d6000fd5b50505050611dda6127a2565b50505050505050565b600083604051602001611df6919061762c565b604051602081830303815290604052805190602001208383604051602001611e2093929190617be7565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b600081519050611e95826129d9565b836000019063ffffffff16908163ffffffff1681525050611eb6602061361f565b81611ec19190617c53565b9050611ecd8183613631565b836020018181525050611ede61363f565b60ff1681611eec9190617c53565b90506000611efa8284613648565b905080846040018190525080516004611f139190617c87565b82611f1e9190617c53565b9150611f2a8284613631565b846060018181525050611f3b61363f565b60ff1682611f499190617c53565b9150611f558284613738565b846080019060ff16908160ff1681525050600182611f739190617c53565b9150611f7f8284613746565b8460a0019067ffffffffffffffff16908167ffffffffffffffff1681525050600882611fab9190617c53565b9150611fb78284613754565b8460c0019063ffffffff16908163ffffffff1681525050600482611fdb9190617c53565b9150611fe78284613738565b8460e0019060ff16908160ff16815250506001826120059190617c53565b915060006120138385613648565b905061201e81613762565b85610100018181525050805160046120369190617c87565b836120419190617c53565b925061204d8385613648565b8561012001819052508461012001515160046120699190617c87565b836120749190617c53565b9250600260ff16856080015160ff1611156120bd576120938385613648565b8561014001819052508461014001515160046120af9190617c87565b836120ba9190617c53565b92505b5050505050565b600080602067ffffffffffffffff8111156120e2576120e1616bc3565b5b6040519080825280601f01601f1916602001820160405280156121145781602001600182028036833780820191505090505b5090506121236020848361381e565b61212e602082613828565b915050919050565b5050505050565b60008061214b858585613836565b905060006006600083815260200190815260200160002060009054906101000a900463ffffffff16905060066000838152602001908152602001600020600081819054906101000a900463ffffffff16809291906121a890617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b6002826000015163ffffffff1614612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221790617d55565b60405180910390fd5b63ffffffff8260e0015151111561226c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226390617de7565b60405180910390fd5b60008260e001515183604001515160796122869190617c87565b6122909190617c87565b905060008167ffffffffffffffff8111156122ae576122ad616bc3565b5b6040519080825280601f01601f1916602001820160405280156122e05781602001600182028036833780820191505090505b509050600082905061230c8163ff00000087600001516123009190617e07565b63ffffffff168461389f565b61231660206138a9565b816123219190617c53565b9050600085604001519050612337828285613ad8565b805160046123459190617c87565b826123509190617c53565b91506123618287606001518561381e565b61236961363f565b60ff16826123779190617c53565b915061238882876080015185613bac565b6001826123959190617c53565b91506123a6828760a0015185613bc3565b6123b060406138a9565b826123bb9190617c53565b91506123cc828760c0015185613bda565b6123d660206138a9565b826123e19190617c53565b91506123f2828760e0015185613ad8565b8560e001515160046124049190617c87565b8261240f9190617c53565b915061241c823385613bf1565b61242461363f565b60ff16826124329190617c53565b915061243f82868561381e565b61244761363f565b60ff16826124559190617c53565b91508280519060200120866020018181525050505050505050565b60606002826000015163ffffffff16146124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b690617d55565b60405180910390fd5b63ffffffff8260e0015151111561250b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250290617de7565b60405180910390fd5b6000801b826020015103612554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254b90617eb3565b60405180910390fd5b600080600260ff16846080015160ff1611905080156125b3578361010001515160048560e0015151866040015151605961258e9190617c87565b6125989190617c87565b6125a29190617c87565b6125ac9190617c87565b91506125d8565b8360e001515184604001515160596125cb9190617c87565b6125d59190617c87565b91505b60008267ffffffffffffffff8111156125f4576125f3616bc3565b5b6040519080825280601f01601f1916602001820160405280156126265781602001600182028036833780820191505090505b50905060008390506126528163ff00000088600001516126469190617e07565b63ffffffff168461389f565b61265c60206138a9565b816126679190617c53565b90506126788187602001518461381e565b61268061363f565b60ff168161268e9190617c53565b90506000866040015190506126a4828285613ad8565b805160046126b29190617c87565b826126bd9190617c53565b91506126ce8288606001518561381e565b6126d661363f565b60ff16826126e49190617c53565b91506126f582886080015185613bac565b6001826127029190617c53565b9150612713828860a0015185613bc3565b61271d60406138a9565b826127289190617c53565b9150612739828860c0015185613bda565b61274360206138a9565b8261274e9190617c53565b915061275f828860e0015185613ad8565b8660e001515160046127719190617c87565b8261277c9190617c53565b91508315612795576127948288610100015185613ad8565b5b8295505050505050919050565b565b6127b18686868585612933565b60008460001b90506000604051806080016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020016128af8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050888661293a565b63ffffffff16815250905060006128c5826134dd565b9050600154639d24799887836040518363ffffffff1660e01b81526004016128ee92919061791a565b600060405180830381600087803b15801561290857600080fd5b505af115801561291c573d6000803e3d6000fd5b505050506129286129d0565b505050505050505050565b5050505050565b600080612948858585613836565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905060046000838152602001908152602001600020600081819054906101000a900463ffffffff16809291906129a590617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b565b5050505050565b60008060008351905060048103602085010151915060ff60f81b827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603612a9057600080600467ffffffffffffffff811115612a3957612a38616bc3565b5b6040519080825280601f01601f191660200182016040528015612a6b5781602001600182028036833780820191505090505b5090506003830360200186015160218201526004810151915081945050505050612a97565b6001925050505b919050565b612aa461659e565b612ab78282613bfb90919063ffffffff16565b6003548160000151604051602001612acf919061762c565b6040516020818303038152906040528051906020012014612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c906173df565b60405180910390fd5b63ffffffff8016816060015163ffffffff1603612b4d57612b4885858584613daf565b612b5a565b612b5985858584613e1f565b5b5050505050565b612b696165cf565b612b7c828261404090919063ffffffff16565b6003548160400151604051602001612b94919061762c565b6040516020818303038152906040528051906020012014612bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be1906173df565b60405180910390fd5b600060ff16816080015160ff161480612c0d5750600160ff16816080015160ff16145b15612c2357612c1e858585846141f5565b612ca6565b600260ff16816080015160ff1603612c4657612c4185858584614325565b612ca5565b600360ff16816080015160ff1603612c6957612c648585858461440d565b612ca4565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9b90617f1f565b60405180910390fd5b5b5b5050505050565b612cb56164e2565b612cc88282611e8690919063ffffffff16565b6003548160400151604051602001612ce0919061762c565b6040516020818303038152906040528051906020012014612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d90617f8b565b60405180910390fd5b600060ff16816080015160ff161480612d595750600160ff16816080015160ff16145b15612d6f57612d6a85858584614503565b612e16565b600260ff16816080015160ff1603612d9257612d8d8585858461479c565b612e15565b600360ff16816080015160ff1603612db557612db0858585846148cd565b612e14565b600460ff16816080015160ff1603612dd857612dd385858584614a0c565b612e13565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a9061801d565b60405180910390fd5b5b5b5b5050505050565b565b6003826000015163ffffffff1614612e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6390617d55565b60405180910390fd5b63ffffffff826101200151511115612eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb090617de7565b60405180910390fd5b6000612ec9836101000151614bd1565b90506000815184610120015151856040015151607e612ee89190617c87565b612ef29190617c87565b612efc9190617c87565b905060008167ffffffffffffffff811115612f1a57612f19616bc3565b5b6040519080825280601f01601f191660200182016040528015612f4c5781602001600182028036833780820191505090505b5090506000829050612f728163ff0000008860000151612f6c9190617e07565b84613bda565b612f7c60206138a9565b81612f879190617c53565b9050600086604001519050612f9d828285613ad8565b80516004612fab9190617c87565b82612fb69190617c53565b9150612fc78288606001518561381e565b612fcf61363f565b60ff1682612fdd9190617c53565b9150612fee82886080015185613bac565b600182612ffb9190617c53565b915061300c828860a0015185613bc3565b61301660406138a9565b826130219190617c53565b9150613032828860c0015185613bda565b61303c60206138a9565b826130479190617c53565b9150613058828860e0015185613bac565b6001826130659190617c53565b9150613072828685613ad8565b845160046130809190617c87565b8261308b9190617c53565b915061309d8288610120015185613ad8565b8661012001515160046130b09190617c87565b826130bb9190617c53565b91506130c8823385613bf1565b6130d061363f565b60ff16826130de9190617c53565b91506130eb82878561381e565b6130f361363f565b60ff16826131019190617c53565b9150828051906020012087602001818152505050505050505050565b60606003826000015163ffffffff161461316c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316390617d55565b60405180910390fd5b63ffffffff8261012001515111156131b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b090617de7565b60405180910390fd5b6000801b826020015103613202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f990617eb3565b60405180910390fd5b600080600260ff16846080015160ff161190506000613225856101000151614bd1565b9050811561328057846101400151516004825187610120015151886040015151605e6132519190617c87565b61325b9190617c87565b6132659190617c87565b61326f9190617c87565b6132799190617c87565b92506132b2565b805185610120015151866040015151605e61329b9190617c87565b6132a59190617c87565b6132af9190617c87565b92505b60008367ffffffffffffffff8111156132ce576132cd616bc3565b5b6040519080825280601f01601f1916602001820160405280156133005781602001600182028036833780820191505090505b50905060008490506133268163ff00000089600001516133209190617e07565b84613bda565b61333060206138a9565b8161333b9190617c53565b905061334c8188602001518461381e565b61335461363f565b60ff16816133629190617c53565b9050600087604001519050613378828285613ad8565b805160046133869190617c87565b826133919190617c53565b91506133a28289606001518561381e565b6133aa61363f565b60ff16826133b89190617c53565b91506133c982896080015185613bac565b6001826133d69190617c53565b91506133e7828960a0015185613bc3565b6133f160406138a9565b826133fc9190617c53565b915061340d828960c0015185613bda565b61341760206138a9565b826134229190617c53565b9150613433828960e0015185613bac565b6001826134409190617c53565b915061344d828585613ad8565b8351600461345b9190617c87565b826134669190617c53565b91506134788289610120015185613ad8565b87610120015151600461348b9190617c87565b826134969190617c53565b915084156134cf576134ae8289610140015185613ad8565b8761014001515160046134c19190617c87565b826134cc9190617c53565b91505b829650505050505050919050565b606060006134ee8360000151614cda565b602060046134ff8660400151614d32565b6135099190617c87565b6135139190617c87565b61351d9190617c87565b905060008167ffffffffffffffff81111561353b5761353a616bc3565b5b6040519080825280601f01601f19166020018201604052801561356d5781602001600182028036833780820191505090505b509050600082905061358481866000015184614d8a565b6135918560000151614cda565b8161359c9190617c53565b90506135ad8186602001518461381e565b6135b561363f565b60ff16816135c39190617c53565b90506135d481866060015184613bda565b6135de602061361f565b816135e99190617c53565b90506135fa81866040015184614d8a565b6136078560400151614d32565b816136129190617c53565b9050819350505050919050565b600061362a826138a9565b9050919050565b600082820151905092915050565b60006020905090565b606060006136568484613754565b63ffffffff16905060048461366b9190617c53565b9350838111156136b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136a7906180af565b60405180910390fd5b80846136bc9190617c53565b935060608115600081146136db5760405191506020820160405261372c565b6040519150601f8316801560200281840101848101888315602002848a0101015b8183101561371957805183526020830192506020810190506136fc565b50858552601f19601f8301166040525050505b50809250505092915050565b600082820151905092915050565b600082820151905092915050565b600082820151905092915050565b6000808251905060208111156137ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a490618141565b60405180910390fd5b60008167ffffffffffffffff8111156137c9576137c8616bc3565b5b6040519080825280601f01601f1916602001820160405280156137fb5781602001600182028036833780820191505090505b509050600084518252828501518383015180820392505050809350505050919050565b8183820152505050565b600082820151905092915050565b60008061384284614df5565b90508085604051602001613856919061762c565b604051602081830303815290604052805190602001208460405160200161387f93929190617be7565b604051602081830303815290604052805190602001209150509392505050565b8183820152505050565b600081600881146139b657601081146139bf57601881146139c857602081146139d157602881146139da57603081146139e357603881146139ec57604081146139f557604881146139fe5760508114613a075760588114613a105760608114613a195760688114613a225760708114613a2b5760788114613a345760808114613a3d5760888114613a465760908114613a4f5760988114613a585760a08114613a615760a88114613a6a5760b08114613a735760b88114613a7c5760c08114613a855760c88114613a8e5760d08114613a975760d88114613aa05760e08114613aa95760e88114613ab25760f08114613abb5760f88114613ac4576101008114613acd5760209150613ad2565b60019150613ad2565b60029150613ad2565b60039150613ad2565b60049150613ad2565b60059150613ad2565b60069150613ad2565b60079150613ad2565b60089150613ad2565b60099150613ad2565b600a9150613ad2565b600b9150613ad2565b600c9150613ad2565b600d9150613ad2565b600e9150613ad2565b600f9150613ad2565b60109150613ad2565b60119150613ad2565b60129150613ad2565b60139150613ad2565b60149150613ad2565b60159150613ad2565b60169150613ad2565b60179150613ad2565b60189150613ad2565b60199150613ad2565b601a9150613ad2565b601b9150613ad2565b601c9150613ad2565b601d9150613ad2565b601e9150613ad2565b601f9150613ad2565b602091505b50919050565b600082519050613ae9848284613bda565b600484613af69190617c53565b93508063ffffffff16841015613b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b38906181d3565b60405180910390fd5b8063ffffffff1684613b539190617c53565b9350801560008103613ba5578483018051601f84168015602002818801018581018215602002838601015b81831015613b9b5782518152602083019250602081019050613b7e565b5083855250505050505b5050505050565b828101600181038051848352808252505050505050565b828101600881038051848352808252505050505050565b828101600481038051848352808252505050505050565b8183820152505050565b60008151905060006020613c0f8385613754565b613c199190617e07565b905060008163ffffffff1667ffffffffffffffff811115613c3d57613c3c616bc3565b5b6040519080825280601f01601f191660200182016040528015613c6f5781602001600182028036833780820191505090505b509050613c7d838583614e5b565b613c8681614d32565b83613c919190617c53565b92506000613c9f8486613631565b9050613ca961363f565b60ff1684613cb79190617c53565b93506000613cc58587613754565b9050613cd160206138a9565b85613cdc9190617c53565b945060006020613cec8789613754565b613cf69190617e07565b905060008163ffffffff1667ffffffffffffffff811115613d1a57613d19616bc3565b5b6040519080825280601f01601f191660200182016040528015613d4c5781602001600182028036833780820191505090505b509050613d5a878983614e5b565b613d6381614d32565b87613d6e9190617c53565b96508489600001819052508389602001818152505082896060019063ffffffff16908163ffffffff1681525050808960400181905250505050505050505050565b613db881614eb3565b632e00b39585858560001c85604001516040518563ffffffff1660e01b8152600401613de79493929190618220565b600060405180830381600087803b158015613e0157600080fd5b505af1158015613e15573d6000803e3d6000fd5b5050505050505050565b6000613e7485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050848460200151614ec9565b90508063ffffffff16826060015163ffffffff1614613ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ebf906182b3565b60405180910390fd5b600060606000613ed785614eb3565b90506000813b03613f2357600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509150613ff3565b80639e41773189898960001c89604001516040518563ffffffff1660e01b8152600401613f539493929190618220565b600060405180830381600087803b158015613f6d57600080fd5b505af1925050508015613f7e575060015b613fed57613f8a6182e0565b806308c379a003613fb25750613f9e618302565b80613fa95750613fb4565b80925050613fe8565b505b3d8060008114613fe0576040519150601f19603f3d011682016040523d82523d6000602084013e613fe5565b606091505b50505b613ff2565b600192505b5b7fc5c107ebb3f0bb97a017b6d166d57ad3349b9114ef620914f2178b3559310abf8888888488888860405161402e9796959493929190618392565b60405180910390a15050505050505050565b60008151905061404f826129d9565b836000019063ffffffff16908163ffffffff1681525050614070602061361f565b8161407b9190617c53565b90506140878183613631565b83602001818152505061409861363f565b60ff16816140a69190617c53565b905060006140b48284613648565b9050808460400181905250805160046140cd9190617c87565b826140d89190617c53565b91506140e48284613631565b8460600181815250506140f561363f565b60ff16826141039190617c53565b915061410f8284613738565b846080019060ff16908160ff168152505060018261412d9190617c53565b91506141398284613746565b8460a0019067ffffffffffffffff16908167ffffffffffffffff16815250506008826141659190617c53565b91506141718284613754565b8460c0019063ffffffff16908163ffffffff16815250506004826141959190617c53565b91506141a18284613648565b8460e001819052508360e001515160046141bb9190617c87565b826141c69190617c53565b9150600260ff16846080015160ff1611156141ef576141e58284613648565b8461010001819052505b50505050565b6000606063ffffffff80168360c0015163ffffffff16036142805761421c86868686614f5f565b8092508193505050600060ff16836080015160ff160361427b57818190614279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142709190618403565b60405180910390fd5b505b614295565b61428c868686866150a2565b80925081935050505b7f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239836020015187878787604001516142cc8961528d565b8960c001518a60a001518b608001518b8b6040516142f49b9a99989796959493929190618434565b60405180910390a1600160ff16836080015160ff160361431d5761431c8387878786866152a3565b5b505050505050565b61432e8161528d565b6315390358826020015186868660001c8660c001518760a001518860e001516040518863ffffffff1660e01b815260040161436f97969594939291906184e7565b600060405180830381600087803b15801561438957600080fd5b505af115801561439d573d6000803e3d6000fd5b505050507f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239816020015185858585604001516143d88761528d565b8760c001518860a00151896080015160016040516143ff9a999897969594939291906185a4565b60405180910390a150505050565b6144168161528d565b6383c6d5a2826020015186868660001c8660c001518760a001518860e001518961010001516040518963ffffffff1660e01b815260040161445e989796959493929190618655565b600060405180830381600087803b15801561447857600080fd5b505af115801561448c573d6000803e3d6000fd5b505050507f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239816020015185858585604001516144c78761528d565b8760c001518860a00151896080015160018b61010001516040516144f59b9a99989796959493929190618434565b60405180910390a150505050565b6000606060008360e0015160ff161480614524575060028360e0015160ff16145b80614536575060048360e0015160ff16145b614575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161456c9061874d565b60405180910390fd5b60028360e0015160ff16036145d05743836101000151116145cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145c2906187b9565b60405180910390fd5b614628565b60048360e0015160ff1603614627574283610100015111614626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161461d906187b9565b60405180910390fd5b5b5b63ffffffff80168360c0015163ffffffff16036146af5761464b868686866153b6565b8092508193505050600060ff16836080015160ff16036146aa578181906146a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161469f9190618403565b60405180910390fd5b505b6146c4565b6146bb868686866154fa565b80925081935050505b7f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c9836020015187878787604001516146fb896156e6565b8960c001518a60a001518b608001518b8b6040516147239b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad283602001518460e0015185610100015160405161476b939291906187e8565b60405180910390a1600160ff16836080015160ff1603614794576147938387878786866156fc565b5b505050505050565b6147a5816156e6565b6315390358826020015186868660001c8660c001518760a001518861012001516040518863ffffffff1660e01b81526004016147e797969594939291906184e7565b600060405180830381600087803b15801561480157600080fd5b505af1158015614815573d6000803e3d6000fd5b505050507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614850876156e6565b8760c001518860a00151896080015160016040516148779a999897969594939291906185a4565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e001518361010001516040516148bf939291906187e8565b60405180910390a150505050565b6148d6816156e6565b6383c6d5a2826020015186868660001c8660c001518760a001518861012001518961014001516040518963ffffffff1660e01b815260040161491f989796959493929190618655565b600060405180830381600087803b15801561493957600080fd5b505af115801561494d573d6000803e3d6000fd5b505050507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614988876156e6565b8760c001518860a00151896080015160018b61014001516040516149b69b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e001518361010001516040516149fe939291906187e8565b60405180910390a150505050565b6000614a1c82610120015161580f565b90508060400151600760008787604051602001614a3a92919061737a565b604051602081830303815290604052805190602001208152602001908152602001600020600201819055508060800151600760008787604051602001614a8192919061737a565b60405160208183030381529060405280519060200120815260200190815260200160002060040160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508060600151600760008787604051602001614aea92919061737a565b604051602081830303815290604052805190602001208152602001908152602001600020600301819055507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c982602001518686868660400151614b4c886156e6565b8860c001518960a001518a6080015160018c6101400151604051614b7a9b9a99989796959493929190618434565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad282602001518360e00151846101000151604051614bc2939291906187e8565b60405180910390a15050505050565b60606000602067ffffffffffffffff811115614bf057614bef616bc3565b5b6040519080825280601f01601f191660200182016040528015614c225781602001600182028036833780820191505090505b5090506000602067ffffffffffffffff811115614c4257614c41616bc3565b5b6040519080825280601f01601f191660200182016040528015614c745781602001600182028036833780820191505090505b509050606084602084015260015b6020811015614cce578060208501035181602085010351808203614cc15760405193506020860151838501528284528260208501016040525050614cce565b5050600181019050614c82565b50809350505050919050565b600060208251614cea919061884e565b9050600060208351614cfc919061887f565b14614d10578080614d0c906188b0565b9150505b8080614d1b906188b0565b915050602081614d2b91906188f8565b9050919050565b600060208251614d42919061884e565b9050600060208351614d54919061887f565b14614d68578080614d64906188b0565b9150505b8080614d73906188b0565b915050602081614d8391906188f8565b9050919050565b600060208351614d9a919061884e565b9050600060208451614dac919061887f565b1115614dc1578080614dbd906188b0565b9150505b60006001820191505b81811015614dee576020810284015185840152602085039450600181019050614dca565b5050505050565b600080602067ffffffffffffffff811115614e1357614e12616bc3565b5b6040519080825280601f01601f191660200182016040528015614e455781602001600182028036833780820191505090505b5090508260208201526020810151915050919050565b6000602090506000808585015192506001602084040190506000602084061115614e86576001810190505b5b80821015614eab578585015160208302850152602086039550600182019150614e87565b505050505050565b6000614ec282602001516120c4565b9050919050565b600080614ed7858585611de3565b905060006005600083815260200190815260200160002060009054906101000a900463ffffffff16905060056000838152602001908152602001600020600081819054906101000a900463ffffffff1680929190614f3490617cdd565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b60006060600060606000614f728661528d565b3b03614fb957600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509050615091565b614fc28561528d565b632e00b39589898960001c8960e001516040518563ffffffff1660e01b8152600401614ff19493929190618220565b600060405180830381600087803b15801561500b57600080fd5b505af192505050801561501c575060015b61508b576150286182e0565b806308c379a003615050575061503c618302565b806150475750615052565b80915050615086565b505b3d806000811461507e576040519150601f19603f3d011682016040523d82523d6000602084013e615083565b606091505b50505b615090565b600191505b5b818193509350505094509492505050565b6000606060006150fb87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151614ec9565b90508063ffffffff168460c0015163ffffffff161461514f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615146906182b3565b60405180910390fd5b60006060600061515e8761528d565b90506000813b036151aa57600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f6465000000000000000000000000815250915061527a565b80639e4177318b8b8b60001c8b60e001516040518563ffffffff1660e01b81526004016151da9493929190618220565b600060405180830381600087803b1580156151f457600080fd5b505af1925050508015615205575060015b615274576152116182e0565b806308c379a0036152395750615225618302565b80615230575061523b565b8092505061526f565b505b3d8060008114615267576040519150601f19603f3d011682016040523d82523d6000602084013e61526c565b606091505b50505b615279565b600192505b5b8282955095505050505094509492505050565b600061529c82606001516120c4565b9050919050565b60006152ae8761528d565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087604001819052508387606001818152505082615313576003615316565b60025b876080019060ff16908160ff1681525050826153325781615343565b604051806020016040528060008152505b876101000181905250600154639d2479988261535e8a612470565b6040518363ffffffff1660e01b815260040161537b92919061791a565b600060405180830381600087803b15801561539557600080fd5b505af11580156153a9573d6000803e3d6000fd5b5050505050505050505050565b600060606000606060006153c9866156e6565b3b0361541057600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525090506154e9565b615419856156e6565b632e00b39589898960001c8961012001516040518563ffffffff1660e01b81526004016154499493929190618220565b600060405180830381600087803b15801561546357600080fd5b505af1925050508015615474575060015b6154e3576154806182e0565b806308c379a0036154a85750615494618302565b8061549f57506154aa565b809150506154de565b505b3d80600081146154d6576040519150601f19603f3d011682016040523d82523d6000602084013e6154db565b606091505b50505b6154e8565b600191505b5b818193509350505094509492505050565b60006060600061555387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151614ec9565b90508063ffffffff168460c0015163ffffffff16146155a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161559e906189c4565b60405180910390fd5b6000606060006155b6876156e6565b90506000813b0361560257600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525091506156d3565b80639e4177318b8b8b60001c8b61012001516040518563ffffffff1660e01b81526004016156339493929190618220565b600060405180830381600087803b15801561564d57600080fd5b505af192505050801561565e575060015b6156cd5761566a6182e0565b806308c379a003615692575061567e618302565b806156895750615694565b809250506156c8565b505b3d80600081146156c0576040519150601f19603f3d011682016040523d82523d6000602084013e6156c5565b606091505b50505b6156d2565b600192505b5b8282955095505050505094509492505050565b60006156f582606001516120c4565b9050919050565b6000615707876156e6565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508760400181905250838760600181815250508261576c57600361576f565b60025b876080019060ff16908160ff16815250508261578b578161579c565b604051806020016040528060008152505b876101400181905250600154639d247998826157b78a61311d565b6040518363ffffffff1660e01b81526004016157d492919061791a565b600060405180830381600087803b1580156157ee57600080fd5b505af1158015615802573d6000803e3d6000fd5b5050505050505050505050565b61581761655e565b61581f61655e565b600061582a84615972565b905060005b81602001515181101561596757600082602001518281518110615855576158546189e4565b5b602002602001015190506000816000015161ffff16036158905761587881615b24565b846000019061ffff16908161ffff1681525050615953565b6001816000015161ffff16036158b6576158a981615b44565b8460200181905250615952565b6002816000015161ffff16036158e7576158d960206158d483615b52565b613631565b846040018181525050615951565b6003816000015161ffff16036159165761590861590382615b52565b613762565b846060018181525050615950565b6004816000015161ffff160361594f5761592f81615b60565b846080019067ffffffffffffffff16908167ffffffffffffffff16815250505b5b5b5b5b50808061595f906188b0565b91505061582f565b508192505050919050565b61597a61663a565b6006825110156159bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159b690618a5f565b60405180910390fd5b60006159c961663a565b6159db6159d68584615b80565b615baf565b816000019061ffff16908161ffff16815250506006826159fb9190617c87565b91506000808390505b8551811015615a5d57615a2b615a2687600284615a219190617c87565b615cda565b615d0b565b6006615a379190617e07565b63ffffffff1681615a489190617c87565b90508180615a55906188b0565b925050615a04565b60008267ffffffffffffffff811115615a7957615a78616bc3565b5b604051908082528060200260200182016040528015615ab257816020015b615a9f616658565b815260200190600190039081615a975790505b509050600092505b8651851015615b0e57615acb616658565b615ad58887615eec565b809750819250505080828580615aea906188b0565b965081518110615afd57615afc6189e4565b5b602002602001018190525050615aba565b8084602001819052508395505050505050919050565b6000615b3d615b3860028460400151616034565b615baf565b9050919050565b606081604001519050919050565b606081604001519050919050565b6000615b79615b7460088460400151613746565b616042565b9050919050565b60008251600283615b919190617c87565b1115615b9c57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff811115615bd557615bd4616bc3565b5b6040519080825280601f01601f191660200182016040528015615c075781602001600182028036833780820191505090505b50905081600160028110615c1e57615c1d6189e4565b5b1a60f81b81600081518110615c3657615c356189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060028110615c7957615c786189e4565b5b1a60f81b81600181518110615c9157615c906189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000615ccd826000615b80565b9050809350505050919050565b60008251600483615ceb9190617c87565b1115615cf657600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff811115615d3157615d30616bc3565b5b6040519080825280601f01601f191660200182016040528015615d635781602001600182028036833780820191505090505b50905081600360048110615d7a57615d796189e4565b5b1a60f81b81600081518110615d9257615d916189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260048110615dd557615dd46189e4565b5b1a60f81b81600181518110615ded57615dec6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160048110615e3057615e2f6189e4565b5b1a60f81b81600281518110615e4857615e476189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060048110615e8b57615e8a6189e4565b5b1a60f81b81600381518110615ea357615ea26189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000615edf826000615cda565b9050809350505050919050565b615ef4616658565b600082845111615f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615f3090618af1565b60405180910390fd5b6006831015615f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615f7490618b5d565b60405180910390fd5b615f85616658565b615f97615f928686615b80565b615baf565b816000019061ffff16908161ffff1681525050600284615fb79190617c87565b9350615fcb615fc68686615cda565b615d0b565b816020019063ffffffff16908163ffffffff1681525050600484615fef9190617c87565b93506160068585836020015163ffffffff1661638f565b8160400181905250806020015163ffffffff16846160249190617c87565b9350808492509250509250929050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff81111561606857616067616bc3565b5b6040519080825280601f01601f19166020018201604052801561609a5781602001600182028036833780820191505090505b509050816007600881106160b1576160b06189e4565b5b1a60f81b816000815181106160c9576160c86189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160066008811061610c5761610b6189e4565b5b1a60f81b81600181518110616124576161236189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600560088110616167576161666189e4565b5b1a60f81b8160028151811061617f5761617e6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816004600881106161c2576161c16189e4565b5b1a60f81b816003815181106161da576161d96189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160036008811061621d5761621c6189e4565b5b1a60f81b81600481518110616235576162346189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260088110616278576162776189e4565b5b1a60f81b816005815181106162905761628f6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816001600881106162d3576162d26189e4565b5b1a60f81b816006815181106162eb576162ea6189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006008811061632e5761632d6189e4565b5b1a60f81b81600781518110616346576163456189e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000616382826000616424565b9050809350505050919050565b60608351828461639f9190617c87565b11156163aa57600080fd5b60008267ffffffffffffffff8111156163c6576163c5616bc3565b5b6040519080825280601f01601f1916602001820160405280156163f85781602001600182028036833780820191505090505b5090506000806020830191508560208801019050616417828287616459565b8293505050509392505050565b600082516008836164359190617c87565b111561644057600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b6020811061649857815183526020836164739190617c87565b92506020826164829190617c87565b91506020816164919190617c53565b905061645a565b60008103156164dd57600060018260206164b29190617c53565b6101006164bf9190618cb0565b6164c99190617c53565b905080198351168185511681811786525050505b505050565b604051806101600160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600060ff1681526020016000815260200160608152602001606081525090565b6040518060a00160405280600061ffff168152602001606081526020016000801916815260200160008152602001600067ffffffffffffffff1681525090565b6040518060800160405280606081526020016000801916815260200160608152602001600063ffffffff1681525090565b604051806101200160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff16815260200160608152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126166bc576166bb616697565b5b8235905067ffffffffffffffff8111156166d9576166d861669c565b5b6020830191508360018202830111156166f5576166f46166a1565b5b9250929050565b6000819050919050565b6000616711826166fc565b9050919050565b61672181616706565b811461672c57600080fd5b50565b60008135905061673e81616718565b92915050565b60008083601f84011261675a57616759616697565b5b8235905067ffffffffffffffff8111156167775761677661669c565b5b602083019150836001820283011115616793576167926166a1565b5b9250929050565b6000806000806000606086880312156167b6576167b561668d565b5b600086013567ffffffffffffffff8111156167d4576167d3616692565b5b6167e0888289016166a6565b955095505060206167f38882890161672f565b935050604086013567ffffffffffffffff81111561681457616813616692565b5b61682088828901616744565b92509250509295509295909350565b6000602082840312156168455761684461668d565b5b60006168538482850161672f565b91505092915050565b60008115159050919050565b6168718161685c565b82525050565b600060208201905061688c6000830184616868565b92915050565b6000819050919050565b6168a581616892565b81146168b057600080fd5b50565b6000813590506168c28161689c565b92915050565b600080600080600080608087890312156168e5576168e461668d565b5b600087013567ffffffffffffffff81111561690357616902616692565b5b61690f89828a016166a6565b9650965050602061692289828a016168b3565b945050604087013567ffffffffffffffff81111561694357616942616692565b5b61694f89828a016166a6565b9350935050606061696289828a016168b3565b9150509295509295509295565b600063ffffffff82169050919050565b6169888161696f565b82525050565b60006020820190506169a3600083018461697f565b92915050565b6000806000604084860312156169c2576169c161668d565b5b60006169d0868287016168b3565b935050602084013567ffffffffffffffff8111156169f1576169f0616692565b5b6169fd86828701616744565b92509250509250925092565b60008060008060008060808789031215616a2657616a2561668d565b5b600087013567ffffffffffffffff811115616a4457616a43616692565b5b616a5089828a016166a6565b96509650506020616a6389828a0161672f565b945050604087013567ffffffffffffffff811115616a8457616a83616692565b5b616a9089828a016166a6565b93509350506060616aa389828a0161672f565b9150509295509295509295565b616ab98161685c565b8114616ac457600080fd5b50565b600081359050616ad681616ab0565b92915050565b60008060008060008060808789031215616af957616af861668d565b5b600087013567ffffffffffffffff811115616b1757616b16616692565b5b616b2389828a016166a6565b96509650506020616b3689828a0161672f565b9450506040616b4789828a01616ac7565b935050606087013567ffffffffffffffff811115616b6857616b67616692565b5b616b7489828a01616744565b92509250509295509295509295565b616b8c81616892565b82525050565b6000602082019050616ba76000830184616b83565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b616bfb82616bb2565b810181811067ffffffffffffffff82111715616c1a57616c19616bc3565b5b80604052505050565b6000616c2d616683565b9050616c398282616bf2565b919050565b600067ffffffffffffffff821115616c5957616c58616bc3565b5b616c6282616bb2565b9050602081019050919050565b82818337600083830152505050565b6000616c91616c8c84616c3e565b616c23565b905082815260208101848484011115616cad57616cac616bad565b5b616cb8848285616c6f565b509392505050565b600082601f830112616cd557616cd4616697565b5b8135616ce5848260208601616c7e565b91505092915050565b60008060408385031215616d0557616d0461668d565b5b6000616d138582860161672f565b925050602083013567ffffffffffffffff811115616d3457616d33616692565b5b616d4085828601616cc0565b9150509250929050565b60008060008060008060808789031215616d6757616d6661668d565b5b600087013567ffffffffffffffff811115616d8557616d84616692565b5b616d9189828a016166a6565b96509650506020616da489828a0161672f565b9450506040616db589828a0161672f565b935050606087013567ffffffffffffffff811115616dd657616dd5616692565b5b616de289828a01616744565b92509250509295509295509295565b616dfa81616706565b82525050565b6000602082019050616e156000830184616df1565b92915050565b600060208284031215616e3157616e3061668d565b5b600082013567ffffffffffffffff811115616e4f57616e4e616692565b5b616e5b84828501616cc0565b91505092915050565b60008060208385031215616e7b57616e7a61668d565b5b600083013567ffffffffffffffff811115616e9957616e98616692565b5b616ea5858286016166a6565b92509250509250929050565b600061ffff82169050919050565b616ec881616eb1565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015616f08578082015181840152602081019050616eed565b83811115616f17576000848401525b50505050565b6000616f2882616ece565b616f328185616ed9565b9350616f42818560208601616eea565b616f4b81616bb2565b840191505092915050565b616f5f81616892565b82525050565b616f6e816166fc565b82525050565b600067ffffffffffffffff82169050919050565b616f9181616f74565b82525050565b600060a083016000830151616faf6000860182616ebf565b5060208301518482036020860152616fc78282616f1d565b9150506040830151616fdc6040860182616f56565b506060830151616fef6060860182616f65565b5060808301516170026080860182616f88565b508091505092915050565b600060208201905081810360008301526170278184616f97565b905092915050565b60008060008060006060868803121561704b5761704a61668d565b5b600086013567ffffffffffffffff81111561706957617068616692565b5b617075888289016166a6565b95509550506020617088888289016168b3565b935050604086013567ffffffffffffffff8111156170a9576170a8616692565b5b6170b588828901616744565b92509250509295509295909350565b600060ff82169050919050565b6170da816170c4565b81146170e557600080fd5b50565b6000813590506170f7816170d1565b92915050565b617106816166fc565b811461711157600080fd5b50565b600081359050617123816170fd565b92915050565b60008060008060008060008060c0898b0312156171495761714861668d565b5b600089013567ffffffffffffffff81111561716757617166616692565b5b6171738b828c016166a6565b985098505060206171868b828c0161672f565b96505060406171978b828c01616ac7565b955050606089013567ffffffffffffffff8111156171b8576171b7616692565b5b6171c48b828c01616744565b945094505060806171d78b828c016170e8565b92505060a06171e88b828c01617114565b9150509295985092959890939650565b6172018161696f565b811461720c57600080fd5b50565b60008135905061721e816171f8565b92915050565b6000806000806080858703121561723e5761723d61668d565b5b600085013567ffffffffffffffff81111561725c5761725b616692565b5b61726887828801616cc0565b94505060206172798782880161672f565b935050604061728a8782880161672f565b925050606061729b8782880161720f565b91505092959194509250565b600082825260208201905092915050565b7f5344504d73673a206e6f742076616c6964206d6f6e69746f7220636f6e74726160008201527f6374000000000000000000000000000000000000000000000000000000000000602082015250565b60006173146022836172a7565b915061731f826172b8565b604082019050919050565b6000602082019050818103600083015261734381617307565b9050919050565b600081905092915050565b6000617361838561734a565b935061736e838584616c6f565b82840190509392505050565b6000617387828486617355565b91508190509392505050565b7f5344504d73673a2077726f6e6720726563656976696e6720646f6d61696e0000600082015250565b60006173c9601e836172a7565b91506173d482617393565b602082019050919050565b600060208201905081810360008301526173f8816173bc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006174356020836172a7565b9150617440826173ff565b602082019050919050565b6000602082019050818103600083015261746481617428565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b60006174c76027836172a7565b91506174d28261746b565b604082019050919050565b600060208201905081810360008301526174f6816174ba565b9050919050565b7f5344504d73673a2073656e646572206e6f742076616c69642072656c61796572600082015250565b60006175336020836172a7565b915061753e826174fd565b602082019050919050565b6000602082019050818103600083015261756281617526565b9050919050565b7f5344505f4d53475f4552524f523a20746865206d6573736167652074696d656f60008201527f75744d6561737572652069732030000000000000000000000000000000000000602082015250565b60006175c5602e836172a7565b91506175d082617569565b604082019050919050565b600060208201905081810360008301526175f4816175b8565b9050919050565b600061760682616ece565b617610818561734a565b9350617620818560208601616eea565b80840191505092915050565b600061763882846175fb565b915081905092915050565b7f5344505f4d53475f4552524f523a20657863657074696f6e206d65737361676560008201527f206861736820646f6573206e6f74206578697374000000000000000000000000602082015250565b600061769f6034836172a7565b91506176aa82617643565b604082019050919050565b600060208201905081810360008301526176ce81617692565b9050919050565b60006176e082616ece565b6176ea81856172a7565b93506176fa818560208601616eea565b61770381616bb2565b840191505092915050565b61771781616f74565b82525050565b600081519050919050565b600082825260208201905092915050565b60006177448261771d565b61774e8185617728565b935061775e818560208601616eea565b61776781616bb2565b840191505092915050565b600060e082019050617787600083018a616b83565b818103602083015261779981896176d5565b90506177a86040830188616df1565b6177b5606083018761697f565b6177c2608083018661770e565b81810360a08301526177d48185617739565b905081810360c08301526177e881846176d5565b905098975050505050505050565b7f5344505f4d53475f4552524f523a20746865206d657373616765206973206e6f60008201527f742074696d656f757420776974682074696d656f75744d656173757265203200602082015250565b6000617852603f836172a7565b915061785d826177f6565b604082019050919050565b6000602082019050818103600083015261788181617845565b9050919050565b7f5344505f4d53475f4552524f523a20756e737570706f727465642074696d656f60008201527f7574206d65617375726500000000000000000000000000000000000000000000602082015250565b60006178e4602a836172a7565b91506178ef82617888565b604082019050919050565b60006020820190508181036000830152617913816178d7565b9050919050565b600060408201905061792f6000830185616df1565b81810360208301526179418184617739565b90509392505050565b7f5344504d73673a20696e76616c696420616d20636f6e74726163740000000000600082015250565b6000617980601b836172a7565b915061798b8261794a565b602082019050919050565b600060208201905081810360008301526179af81617973565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806179fd57607f821691505b602082108103617a1057617a0f6179b6565b5b50919050565b7f5344504d73673a206e6f742076616c696420616d20636f6e7472616374000000600082015250565b6000617a4c601d836172a7565b9150617a5782617a16565b602082019050919050565b60006020820190508181036000830152617a7b81617a3f565b9050919050565b7f756e737570706f72746564207364702076657273696f6e000000000000000000600082015250565b6000617ab86017836172a7565b9150617ac382617a82565b602082019050919050565b60006020820190508181036000830152617ae781617aab565b9050919050565b7f5344503a20696e76616c69642074696d656f7574206d65617375726500000000600082015250565b6000617b24601c836172a7565b9150617b2f82617aee565b602082019050919050565b60006020820190508181036000830152617b5381617b17565b9050919050565b7f5344504d73673a20696e76616c6964206d6f6e69746f7220636f6e7472616374600082015250565b6000617b906020836172a7565b9150617b9b82617b5a565b602082019050919050565b60006020820190508181036000830152617bbf81617b83565b9050919050565b6000819050919050565b617be1617bdc82616892565b617bc6565b82525050565b6000617bf38286617bd0565b602082019150617c038285617bd0565b602082019150617c138284617bd0565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000617c5e826166fc565b9150617c69836166fc565b925082821015617c7c57617c7b617c24565b5b828203905092915050565b6000617c92826166fc565b9150617c9d836166fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115617cd257617cd1617c24565b5b828201905092915050565b6000617ce88261696f565b915063ffffffff8203617cfe57617cfd617c24565b5b600182019050919050565b7f656e636f64655344504d6573736167653a2077726f6e672076657273696f6e00600082015250565b6000617d3f601f836172a7565b9150617d4a82617d09565b602082019050919050565b60006020820190508181036000830152617d6e81617d32565b9050919050565b7f656e636f64655344504d6573736167653a20626f6479206c656e677468206f7660008201527f65726c696d697400000000000000000000000000000000000000000000000000602082015250565b6000617dd16027836172a7565b9150617ddc82617d75565b604082019050919050565b60006020820190508181036000830152617e0081617dc4565b9050919050565b6000617e128261696f565b9150617e1d8361696f565b92508263ffffffff03821115617e3657617e35617c24565b5b828201905092915050565b7f656e636f64655344504d6573736167653a207a65726f206d657373616765206960008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000617e9d6021836172a7565b9150617ea882617e41565b604082019050919050565b60006020820190508181036000830152617ecc81617e90565b9050919050565b7f756e65787065637465642061746f6d696320666c616700000000000000000000600082015250565b6000617f096016836172a7565b9150617f1482617ed3565b602082019050919050565b60006020820190508181036000830152617f3881617efc565b9050919050565b7f5344505f4d73673a2077726f6e6720726563656976696e6720646f6d61696e00600082015250565b6000617f75601f836172a7565b9150617f8082617f3f565b602082019050919050565b60006020820190508181036000830152617fa481617f68565b9050919050565b7f5344505f4d53475f4552524f523a20756e65787065637465642061746f6d696360008201527f20666c6167000000000000000000000000000000000000000000000000000000602082015250565b60006180076025836172a7565b915061801282617fab565b604082019050919050565b6000602082019050818103600083015261803681617ffa565b9050919050565b7f6279746573546f56617242797465733a206f6666736574206c6573732074686160008201527f6e206c656e677468206f6620626f647900000000000000000000000000000000602082015250565b60006180996030836172a7565b91506180a48261803d565b604082019050919050565b600060208201905081810360008301526180c88161808c565b9050919050565b7f333262797465732062696720696e7465676572206174206d6f737420666f722060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b600061812b6023836172a7565b9150618136826180cf565b604082019050919050565b6000602082019050818103600083015261815a8161811e565b9050919050565b7f7661724279746573546f42797465733a206f6666736574206c6573732074686160008201527f6e2074686520696e707574206c656e6774680000000000000000000000000000602082015250565b60006181bd6032836172a7565b91506181c882618161565b604082019050919050565b600060208201905081810360008301526181ec816181b0565b9050919050565b60006181ff83856172a7565b935061820c838584616c6f565b61821583616bb2565b840190509392505050565b6000606082019050818103600083015261823b8186886181f3565b905061824a6020830185616df1565b818103604083015261825c8184617739565b905095945050505050565b7f5344504d73673a2073657175656e6365206e6f7420657175616c000000000000600082015250565b600061829d601a836172a7565b91506182a882618267565b602082019050919050565b600060208201905081810360008301526182cc81618290565b9050919050565b60008160e01c9050919050565b600060033d11156182ff5760046000803e6182fc6000516182d3565b90505b90565b600060443d1061838f57618314616683565b60043d036004823e80513d602482011167ffffffffffffffff8211171561833c57505061838f565b808201805167ffffffffffffffff81111561835a575050505061838f565b80602083010160043d03850181111561837757505050505061838f565b61838682602001850186616bf2565b82955050505050505b90565b600060c08201905081810360008301526183ad81898b6181f3565b90506183bc6020830188616b83565b6183c96040830187616df1565b6183d6606083018661697f565b6183e36080830185616868565b81810360a08301526183f581846176d5565b905098975050505050505050565b6000602082019050818103600083015261841d81846176d5565b905092915050565b61842e816170c4565b82525050565b60006101408201905061844a600083018e616b83565b818103602083015261845d818c8e6181f3565b905061846c604083018b616b83565b818103606083015261847e818a6176d5565b905061848d6080830189616df1565b61849a60a083018861697f565b6184a760c083018761770e565b6184b460e0830186618425565b6184c2610100830185616868565b8181036101208301526184d581846176d5565b90509c9b505050505050505050505050565b600060c0820190506184fc600083018a616b83565b818103602083015261850f81888a6181f3565b905061851e6040830187616df1565b61852b606083018661697f565b618538608083018561770e565b81810360a083015261854a8184617739565b905098975050505050505050565b7f7375636365737300000000000000000000000000000000000000000000000000600082015250565b600061858e6007836172a7565b915061859982618558565b602082019050919050565b6000610140820190506185ba600083018d616b83565b81810360208301526185cd818b8d6181f3565b90506185dc604083018a616b83565b81810360608301526185ee81896176d5565b90506185fd6080830188616df1565b61860a60a083018761697f565b61861760c083018661770e565b61862460e0830185618425565b618632610100830184616868565b81810361012083015261864481618581565b90509b9a5050505050505050505050565b600060e08201905061866a600083018b616b83565b818103602083015261867d81898b6181f3565b905061868c6040830188616df1565b618699606083018761697f565b6186a6608083018661770e565b81810360a08301526186b88185617739565b905081810360c08301526186cc81846176d5565b90509998505050505050505050565b7f6f6e6c7920737570706f72742074696d656f7574206d65617375726520302c2060008201527f3220616e64203420666f72206e6f770000000000000000000000000000000000602082015250565b6000618737602f836172a7565b9150618742826186db565b604082019050919050565b600060208201905081810360008301526187668161872a565b9050919050565b7f6d73672069732074696d656f7574000000000000000000000000000000000000600082015250565b60006187a3600e836172a7565b91506187ae8261876d565b602082019050919050565b600060208201905081810360008301526187d281618796565b9050919050565b6187e2816166fc565b82525050565b60006060820190506187fd6000830186616b83565b61880a6020830185618425565b61881760408301846187d9565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000618859826166fc565b9150618864836166fc565b9250826188745761887361881f565b5b828204905092915050565b600061888a826166fc565b9150618895836166fc565b9250826188a5576188a461881f565b5b828206905092915050565b60006188bb826166fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036188ed576188ec617c24565b5b600182019050919050565b6000618903826166fc565b915061890e836166fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561894757618946617c24565b5b828202905092915050565b7f5344505f4d53475f4552524f523a2073657175656e6365206e6f74206571756160008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006189ae6021836172a7565b91506189b982618952565b604082019050919050565b600060208201905081810360008301526189dd816189a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b6000618a496017836172a7565b9150618a5482618a13565b602082019050919050565b60006020820190508181036000830152618a7881618a3c565b9050919050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b6000618adb6023836172a7565b9150618ae682618a7f565b604082019050919050565b60006020820190508181036000830152618b0a81618ace565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b6000618b47600e836172a7565b9150618b5282618b11565b602082019050919050565b60006020820190508181036000830152618b7681618b3a565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115618bd457808604811115618bb057618baf617c24565b5b6001851615618bbf5780820291505b8081029050618bcd85618b7d565b9450618b94565b94509492505050565b600082618bed5760019050618ca9565b81618bfb5760009050618ca9565b8160018114618c115760028114618c1b57618c4a565b6001915050618ca9565b60ff841115618c2d57618c2c617c24565b5b8360020a915084821115618c4457618c43617c24565b5b50618ca9565b5060208310610133831016604e8410600b8410161715618c7f5782820a905083811115618c7a57618c79617c24565b5b618ca9565b618c8c8484846001618b8a565b92509050818404811115618ca357618ca2617c24565b5b81810290505b9392505050565b6000618cbb826166fc565b9150618cc6836166fc565b9250618cf37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484618bdd565b90509291505056fea3646970667358221220135d62080d872feff9c83fb1ec02d7bc7bc43269ba3b34d1a247ffd959ef1b9164736f6c634300080e6b636f6d70696c655f6d6f6461300041 \ No newline at end of file +60806040523480156200001157600080fd5b5062000032620000266200006460201b60201c565b6200006c60201b60201c565b60016008600033815260200190815260200160002060006101000a81548160ff021916908315150217905550620000ab565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b619fc280620000bb6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063838a102c1161010f578063d582d1a8116100a2578063e5e5530011610071578063e5e55300146105db578063eaa71e90146105f7578063ed46aafa14610613578063fc0baf0814610643576101f0565b8063d582d1a81461052d578063d5dd79131461055d578063db37c08b1461058d578063e5521092146105bd576101f0565b8063b5db295a116100de578063b5db295a14610495578063c09b261b146104c5578063c730cf52146104e1578063d513f34a14610511576101f0565b8063838a102c1461042157806389223f801461043d5780638da5cb5b14610459578063a9d662af14610477576101f0565b806334d4725a11610187578063627523a411610156578063627523a4146103ad5780636bba0808146103dd578063715018a6146103f95780638037d45e14610403576101f0565b806334d4725a146103395780633ac6dfb11461035557806342f116bd1461037357806356cb2d021461038f576101f0565b8063203c2c85116101c3578063203c2c851461028d57806325601cdd146102a957806326ca2c89146102d9578063343e779214610309576101f0565b806304f25f96146101f55780630a6e15db146102115780630d9ae9e5146102415780631f56086f14610271575b600080fd5b61020f600480360381019061020a9190617509565b610661565b005b61022b6004803603810190610226919061759e565b6106c7565b60405161023891906175e6565b60405180910390f35b61025b60048036038101906102569190617637565b6106e7565b60405161026891906176fd565b60405180910390f35b61028b6004803603810190610286919061759e565b6107df565b005b6102a760048036038101906102a29190617718565b61087e565b005b6102c360048036038101906102be9190617778565b610bf3565b6040516102d091906176fd565b60405180910390f35b6102f360048036038101906102ee91906178b0565b610cf1565b60405161030091906179a1565b60405180910390f35b610323600480360381019061031e91906179bc565b610d63565b60405161033091906179a1565b60405180910390f35b610353600480360381019061034e9190617509565b610e05565b005b61035d610e6b565b60405161036a91906179a1565b60405180910390f35b61038d60048036038101906103889190617ba4565b610e75565b005b610397610f40565b6040516103a491906179a1565b60405180910390f35b6103c760048036038101906103c291906179bc565b610f46565b6040516103d491906179a1565b60405180910390f35b6103f760048036038101906103f29190617c00565b610fe8565b005b61040161104f565b005b61040b6110ab565b6040516104189190617cb6565b60405180910390f35b61043b60048036038101906104369190617cd1565b6110b5565b005b61045760048036038101906104529190617c00565b611135565b005b61046161119c565b60405161046e9190617cb6565b60405180910390f35b61047f6111a5565b60405161048c9190617cb6565b60405180910390f35b6104af60048036038101906104aa9190617d1a565b6111ab565b6040516104bc9190617ec3565b60405180910390f35b6104df60048036038101906104da9190617ee5565b6112f9565b005b6104fb60048036038101906104f69190617f7a565b611511565b60405161050891906179a1565b60405180910390f35b61052b6004803603810190610526919061759e565b61157f565b005b610547600480360381019061054291906178b0565b61161c565b60405161055491906179a1565b60405180910390f35b61057760048036038101906105729190617f7a565b61168e565b60405161058491906179a1565b60405180910390f35b6105a760048036038101906105a29190618036565b6116fc565b6040516105b491906179a1565b60405180910390f35b6105c56117a6565b6040516105d29190617cb6565b60405180910390f35b6105f560048036038101906105f09190618131565b6117ac565b005b610611600480360381019061060c919061759e565b61184a565b005b61062d60048036038101906106289190618036565b6118e7565b60405161063a91906179a1565b60405180910390f35b61064b611991565b60405161065891906176fd565b60405180910390f35b60006009541480610673575033600954145b6106b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a990618237565b60405180910390fd5b6106c085858533868661199a565b5050505050565b60086020528060005260406000206000915054906101000a900460ff1681565b600060025484846040516020016106ff929190618287565b6040516020818303038152906040528051906020012014610755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074c906182ec565b60405180910390fd5b60006107a688888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508785611acf565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6107e7611b2b565b6107ef61119c565b1461082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690618358565b60405180910390fd5b60008103610872576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610869906183ea565b60405180910390fd5b61087b81611b33565b50565b6008600033815260200190815260200160002060009054906101000a900460ff166108de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d590618456565b60405180910390fd5b6108e6617251565b61093d83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505082611b7290919063ffffffff16565b8060e0015160ff16600003610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e906184e8565b60405180910390fd5b8060e0015160ff16600203610bb2578061010001516006600083604001516040516020016109b59190618539565b604051602081830303815290604052805190602001208152602001908152602001600020600301541115610b7257600760008260200151815260200190815260200160002060009054906101000a900460ff16610a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3e906185c2565b60405180910390fd5b6000610a5285611db0565b9050600060095403610ae557806383c6d5a283602001518460400151856060015160001c8660c001518760a001518861012001518961014001516040518863ffffffff1660e01b8152600401610aae979695949392919061867f565b600060405180830381600087803b158015610ac857600080fd5b505af1158015610adc573d6000803e3d6000fd5b50505050610b6c565b600954632b9ff60b8284602001518560400151866060015160001c8760c001518860a001518961012001518a61014001516040518963ffffffff1660e01b8152600401610b39989796959493929190618703565b600060405180830381600087803b158015610b5357600080fd5b505af1158015610b67573d6000803e3d6000fd5b505050505b50610bad565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490618808565b60405180910390fd5b610bed565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be49061889a565b60405180910390fd5b50505050565b60006002548484604051602001610c0b929190618287565b6040516020818303038152906040528051906020012014610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c58906182ec565b60405180910390fd5b6000610cb888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508760001b8560001b611acf565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905080925050509695505050505050565b6000806009541480610d04575033600954145b610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a90618237565b60405180910390fd5b610d548a8a8a8a8a8a8a8a8a611e22565b90509998505050505050505050565b60008060095414610de95760095463e8913e8f888888338989896040518863ffffffff1660e01b8152600401610d9f9796959493929190618914565b6020604051808303816000875af1158015610dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de2919061898e565b9050610dfb565b610df8878787338888886120bc565b90505b9695505050505050565b60006009541480610e17575033600954145b610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d90618237565b60405180910390fd5b610e648585853386866122bf565b5050505050565b6000600254905090565b610e7d611b2b565b610e8561119c565b14610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc90618358565b60405180910390fd5b60008203610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90618a07565b60405180910390fd5b8160018190555080604051602001610f209190618539565b604051602081830303815290604052805190602001206002819055505050565b60025481565b60008060095414610fcc576009546326ddd415888888338989896040518863ffffffff1660e01b8152600401610f829796959493929190618914565b6020604051808303816000875af1158015610fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc5919061898e565b9050610fde565b610fdb8787873388888861244e565b90505b9695505050505050565b60006009541480610ffa575033600954145b611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090618237565b60405180910390fd5b6110478686868686866122bf565b505050505050565b611057611b2b565b61105f61119c565b1461109f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109690618358565b60405180910390fd5b6110a96000611b33565b565b6000600154905090565b6110bd611b2b565b6110c561119c565b14611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90618358565b60405180910390fd5b806040516020016111169190618539565b6040516020818303038152906040528051906020012060028190555050565b60006009541480611147575033600954145b611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90618237565b60405180910390fd5b61119486868686868661199a565b505050505050565b60008054905090565b60015481565b6111b36172cd565b6006600084846040516020016111ca929190618287565b6040516020818303038152906040528051906020012081526020019081526020016000206040518060a00160405290816000820160009054906101000a900461ffff1661ffff1661ffff16815260200160018201805461122990618a56565b80601f016020809104026020016040519081016040528092919081815260200182805461125590618a56565b80156112a25780601f10611277576101008083540402835291602001916112a2565b820191906000526020600020905b81548152906001019060200180831161128557829003601f168201915b5050505050815260200160028201548152602001600382015481526020016004820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905092915050565b336001541461133d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133490618ad3565b60405180910390fd5b61134a858585858561264b565b600061139983838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612652565b905060018163ffffffff16036113fe576113f986868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612715565b611501565b60028163ffffffff16036114615761145c86868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506127da565b611500565b60038163ffffffff16036114c4576114bf86868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612926565b6114ff565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690618b3f565b60405180910390fd5b5b5b611509612a96565b505050505050565b6000806009541480611524575033600954145b611563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155a90618237565b60405180910390fd5b6115728888888888888861244e565b9050979650505050505050565b611587611b2b565b61158f61119c565b146115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690618358565b60405180910390fd5b60008103611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990618a07565b60405180910390fd5b8060018190555050565b600080600954148061162f575033600954145b61166e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166590618237565b60405180910390fd5b61167f8a8a8a8a8a8a8a8a8a612a98565b90509998505050505050505050565b60008060095414806116a1575033600954145b6116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790618237565b60405180910390fd5b6116ef888888888888886120bc565b9050979650505050505050565b60008060095414611786576009546323ae474b8a8a8a338b8b8b8b8b6040518a63ffffffff1660e01b815260040161173c99989796959493929190618b7d565b6020604051808303816000875af115801561175b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177f919061898e565b905061179a565b611797898989338a8a8a8a8a612a98565b90505b98975050505050505050565b60095481565b6117b4611b2b565b6117bc61119c565b146117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390618358565b60405180910390fd5b600061180f858560001b8560001b611acf565b9050816004600083815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505050505050565b611852611b2b565b61185a61119c565b1461189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189190618358565b60405180910390fd5b600081036118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d490618c4a565b60405180910390fd5b8060098190555050565b6000806009541461197157600954637e1174318a8a8a338b8b8b8b8b6040518a63ffffffff1660e01b815260040161192799989796959493929190618b7d565b6020604051808303816000875af1158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061898e565b9050611985565b611982898989338a8a8a8a8a611e22565b90505b98975050505050505050565b60006004905090565b6119a78686868585612d38565b6000604051806080016040528088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018660001b815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200163ffffffff80168152509050600154639d24799885611a6f84612d3f565b6040518363ffffffff1660e01b8152600401611a8c929190618c6a565b600060405180830381600087803b158015611aa657600080fd5b505af1158015611aba573d6000803e3d6000fd5b50505050611ac6612e81565b50505050505050565b600083604051602001611ae29190618539565b604051602081830303815290604052805190602001208383604051602001611b0c93929190618cbb565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000805490508160008190555081817f1e07c7c9c4b2ec2845fd9de8002a5051ac36e6b6050aebc84bf81501e9aaef7560405160405180910390a35050565b600081519050611b8182612652565b836000019063ffffffff16908163ffffffff1681525050611ba26020612e83565b81611bad9190618d27565b9050611bb98183612e95565b836020018181525050611bca612ea3565b60ff1681611bd89190618d27565b90506000611be68284612eac565b905080846040018190525080516004611bff9190618d5b565b82611c0a9190618d27565b9150611c168284612e95565b846060018181525050611c27612ea3565b60ff1682611c359190618d27565b9150611c418284612f9c565b846080019060ff16908160ff1681525050600182611c5f9190618d27565b9150611c6b8284612faa565b8460a0019067ffffffffffffffff16908167ffffffffffffffff1681525050600882611c979190618d27565b9150611ca38284612fb8565b8460c0019063ffffffff16908163ffffffff1681525050600482611cc79190618d27565b9150611cd38284612f9c565b8460e0019060ff16908160ff1681525050600182611cf19190618d27565b91506000611cff8385612eac565b9050611d0a81612fc6565b8561010001818152505080516004611d229190618d5b565b83611d2d9190618d27565b9250611d398385612eac565b856101200181905250846101200151516004611d559190618d5b565b83611d609190618d27565b9250600260ff16856080015160ff161115611da957611d7f8385612eac565b856101400181905250846101400151516004611d9b9190618d5b565b83611da69190618d27565b92505b5050505050565b600080602067ffffffffffffffff811115611dce57611dcd617a79565b5b6040519080825280601f01601f191660200182016040528015611e005781602001600182028036833780820191505090505b509050611e0f60208483613082565b611e1a60208261308c565b915050919050565b60008060ff168360ff1610158015611e415750600460ff168360ff1611155b611e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7790618dfd565b60405180910390fd5b611e8d8a8a8a8888612d38565b60008860001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200189611f15576000611f18565b60015b60ff16815260200167ffffffffffffffff80168152602001611f7f8e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508c8661309a565b63ffffffff1681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200160405180602001604052806000815250815250905061200d6002548261313090919063ffffffff16565b6001600760008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d2479988a61204f8461342e565b6040518363ffffffff1660e01b815260040161206c929190618c6a565b600060405180830381600087803b15801561208657600080fd5b505af115801561209a573d6000803e3d6000fd5b505050506120a66137ee565b8060200151925050509998505050505050505050565b60006120cb8888888686612d38565b60008660001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200187612153576000612156565b60015b60ff1681526020016121ad8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a866137f0565b63ffffffff1667ffffffffffffffff16815260200163ffffffff8016815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020016040518060200160405280600081525081525090506122426002548261388690919063ffffffff16565b600154639d2479988861225484613b23565b6040518363ffffffff1660e01b8152600401612271929190618c6a565b600060405180830381600087803b15801561228b57600080fd5b505af115801561229f573d6000803e3d6000fd5b505050506122ab612e81565b806020015192505050979650505050505050565b6122cc8686868585613e55565b60008460001b90506000604051806080016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020016123ca8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050888661309a565b63ffffffff16815250905060006123e082612d3f565b9050600154639d24799887836040518363ffffffff1660e01b8152600401612409929190618c6a565b600060405180830381600087803b15801561242357600080fd5b505af1158015612437573d6000803e3d6000fd5b505050506124436137ee565b505050505050505050565b600061245d8888888686613e55565b60008660001b90506000604051806101200160405280600263ffffffff1681526020016000801b81526020018b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001838152602001876124e55760006124e8565b60015b60ff16815260200167ffffffffffffffff8016815260200161254f8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8661309a565b63ffffffff16815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020016040518060200160405280600081525081525090506125ce6002548261388690919063ffffffff16565b600154639d247998886125e084613b23565b6040518363ffffffff1660e01b81526004016125fd929190618c6a565b600060405180830381600087803b15801561261757600080fd5b505af115801561262b573d6000803e3d6000fd5b505050506126376137ee565b806020015192505050979650505050505050565b5050505050565b60008060008351905060048103602085010151915060ff60f81b827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361270957600080600467ffffffffffffffff8111156126b2576126b1617a79565b5b6040519080825280601f01601f1916602001820160405280156126e45781602001600182028036833780820191505090505b5090506003830360200186015160218201526004810151915081945050505050612710565b6001925050505b919050565b61271d61730d565b6127308282613e5c90919063ffffffff16565b60025481600001516040516020016127489190618539565b604051602081830303815290604052805190602001201461279e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612795906182ec565b60405180910390fd5b63ffffffff8016816060015163ffffffff16036127c6576127c185858584614010565b6127d3565b6127d2858585846140fc565b5b5050505050565b6127e261733e565b6127f5828261440090919063ffffffff16565b600254816040015160405160200161280d9190618539565b6040516020818303038152906040528051906020012014612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285a906182ec565b60405180910390fd5b600060ff16816080015160ff1614806128865750600160ff16816080015160ff16145b1561289c57612897858585846145b5565b61291f565b600260ff16816080015160ff16036128bf576128ba858585846146e5565b61291e565b600360ff16816080015160ff16036128e2576128dd8585858461485d565b61291d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291490618e69565b60405180910390fd5b5b5b5050505050565b61292e617251565b6129418282611b7290919063ffffffff16565b60025481604001516040516020016129599190618539565b60405160208183030381529060405280519060200120146129af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a690618ed5565b60405180910390fd5b600060ff16816080015160ff1614806129d25750600160ff16816080015160ff16145b156129e8576129e3858585846149ea565b612a8f565b600260ff16816080015160ff1603612a0b57612a0685858584614c83565b612a8e565b600360ff16816080015160ff1603612a2e57612a2985858584614e45565b612a8d565b600460ff16816080015160ff1603612a5157612a4c8585858461501c565b612a8c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8390618f67565b60405180910390fd5b5b5b5b5050505050565b565b60008060ff168360ff1610158015612ab75750600460ff168360ff1611155b612af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aed90618dfd565b60405180910390fd5b612b038a8a8a8888612d38565b60008860001b90506000604051806101600160405280600363ffffffff1681526020016000801b81526020018d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200183815260200189612b8b576000612b8e565b60015b60ff168152602001612be58e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508c866137f0565b63ffffffff1667ffffffffffffffff16815260200163ffffffff801681526020018660ff16815260200185815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152602001604051806020016040528060008152508152509050612c896002548261313090919063ffffffff16565b6001600760008360200151815260200190815260200160002060006101000a81548160ff021916908315150217905550600154639d2479988a612ccb8461342e565b6040518363ffffffff1660e01b8152600401612ce8929190618c6a565b600060405180830381600087803b158015612d0257600080fd5b505af1158015612d16573d6000803e3d6000fd5b50505050612d226137ee565b8060200151925050509998505050505050505050565b5050505050565b60606000612d5083600001516151e1565b60206004612d618660400151615239565b612d6b9190618d5b565b612d759190618d5b565b612d7f9190618d5b565b905060008167ffffffffffffffff811115612d9d57612d9c617a79565b5b6040519080825280601f01601f191660200182016040528015612dcf5781602001600182028036833780820191505090505b5090506000829050612de681866000015184615291565b612df385600001516151e1565b81612dfe9190618d27565b9050612e0f81866020015184613082565b612e17612ea3565b60ff1681612e259190618d27565b9050612e36818660600151846152fc565b612e406020612e83565b81612e4b9190618d27565b9050612e5c81866040015184615291565b612e698560400151615239565b81612e749190618d27565b9050819350505050919050565b565b6000612e8e82615313565b9050919050565b600082820151905092915050565b60006020905090565b60606000612eba8484612fb8565b63ffffffff169050600484612ecf9190618d27565b935083811115612f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0b90618ff9565b60405180910390fd5b8084612f209190618d27565b93506060811560008114612f3f57604051915060208201604052612f90565b6040519150601f8316801560200281840101848101888315602002848a0101015b81831015612f7d5780518352602083019250602081019050612f60565b50858552601f19601f8301166040525050505b50809250505092915050565b600082820151905092915050565b600082820151905092915050565b600082820151905092915050565b600080825190506020811115613011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130089061908b565b60405180910390fd5b60008167ffffffffffffffff81111561302d5761302c617a79565b5b6040519080825280601f01601f19166020018201604052801561305f5781602001600182028036833780820191505090505b509050600084518252828501518383015180820392505050809350505050919050565b8183820152505050565b600082820151905092915050565b6000806130a8858585615542565b905060006003600083815260200190815260200160002060009054906101000a900463ffffffff16905060036000838152602001908152602001600020600081819054906101000a900463ffffffff1680929190613105906190ab565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b6003826000015163ffffffff161461317d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317490619123565b60405180910390fd5b63ffffffff8261012001515111156131ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c1906191b5565b60405180910390fd5b60006131da8361010001516155ab565b90506000815184610120015151856040015151607e6131f99190618d5b565b6132039190618d5b565b61320d9190618d5b565b905060008167ffffffffffffffff81111561322b5761322a617a79565b5b6040519080825280601f01601f19166020018201604052801561325d5781602001600182028036833780820191505090505b50905060008290506132838163ff000000886000015161327d91906191d5565b846152fc565b61328d6020615313565b816132989190618d27565b90506000866040015190506132ae8282856156b4565b805160046132bc9190618d5b565b826132c79190618d27565b91506132d882886060015185613082565b6132e0612ea3565b60ff16826132ee9190618d27565b91506132ff82886080015185615788565b60018261330c9190618d27565b915061331d828860a001518561579f565b6133276040615313565b826133329190618d27565b9150613343828860c00151856152fc565b61334d6020615313565b826133589190618d27565b9150613369828860e0015185615788565b6001826133769190618d27565b91506133838286856156b4565b845160046133919190618d5b565b8261339c9190618d27565b91506133ae82886101200151856156b4565b8661012001515160046133c19190618d5b565b826133cc9190618d27565b91506133d98233856157b6565b6133e1612ea3565b60ff16826133ef9190618d27565b91506133fc828785613082565b613404612ea3565b60ff16826134129190618d27565b9150828051906020012087602001818152505050505050505050565b60606003826000015163ffffffff161461347d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347490619123565b60405180910390fd5b63ffffffff8261012001515111156134ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c1906191b5565b60405180910390fd5b6000801b826020015103613513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350a90619281565b60405180910390fd5b600080600260ff16846080015160ff1611905060006135368561010001516155ab565b9050811561359157846101400151516004825187610120015151886040015151605e6135629190618d5b565b61356c9190618d5b565b6135769190618d5b565b6135809190618d5b565b61358a9190618d5b565b92506135c3565b805185610120015151866040015151605e6135ac9190618d5b565b6135b69190618d5b565b6135c09190618d5b565b92505b60008367ffffffffffffffff8111156135df576135de617a79565b5b6040519080825280601f01601f1916602001820160405280156136115781602001600182028036833780820191505090505b50905060008490506136378163ff000000896000015161363191906191d5565b846152fc565b6136416020615313565b8161364c9190618d27565b905061365d81886020015184613082565b613665612ea3565b60ff16816136739190618d27565b90506000876040015190506136898282856156b4565b805160046136979190618d5b565b826136a29190618d27565b91506136b382896060015185613082565b6136bb612ea3565b60ff16826136c99190618d27565b91506136da82896080015185615788565b6001826136e79190618d27565b91506136f8828960a001518561579f565b6137026040615313565b8261370d9190618d27565b915061371e828960c00151856152fc565b6137286020615313565b826137339190618d27565b9150613744828960e0015185615788565b6001826137519190618d27565b915061375e8285856156b4565b8351600461376c9190618d5b565b826137779190618d27565b915061378982896101200151856156b4565b87610120015151600461379c9190618d5b565b826137a79190618d27565b915084156137e0576137bf82896101400151856156b4565b8761014001515160046137d29190618d5b565b826137dd9190618d27565b91505b829650505050505050919050565b565b6000806137fe858585615542565b905060006005600083815260200190815260200160002060009054906101000a900463ffffffff16905060056000838152602001908152602001600020600081819054906101000a900463ffffffff168092919061385b906190ab565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b6002826000015163ffffffff16146138d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ca90619123565b60405180910390fd5b63ffffffff8260e0015151111561391f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613916906191b5565b60405180910390fd5b60008260e001515183604001515160796139399190618d5b565b6139439190618d5b565b905060008167ffffffffffffffff81111561396157613960617a79565b5b6040519080825280601f01601f1916602001820160405280156139935781602001600182028036833780820191505090505b50905060008290506139bf8163ff00000087600001516139b391906191d5565b63ffffffff16846157c0565b6139c96020615313565b816139d49190618d27565b90506000856040015190506139ea8282856156b4565b805160046139f89190618d5b565b82613a039190618d27565b9150613a1482876060015185613082565b613a1c612ea3565b60ff1682613a2a9190618d27565b9150613a3b82876080015185615788565b600182613a489190618d27565b9150613a59828760a001518561579f565b613a636040615313565b82613a6e9190618d27565b9150613a7f828760c00151856152fc565b613a896020615313565b82613a949190618d27565b9150613aa5828760e00151856156b4565b8560e00151516004613ab79190618d5b565b82613ac29190618d27565b9150613acf8233856157b6565b613ad7612ea3565b60ff1682613ae59190618d27565b9150613af2828685613082565b613afa612ea3565b60ff1682613b089190618d27565b91508280519060200120866020018181525050505050505050565b60606002826000015163ffffffff1614613b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6990619123565b60405180910390fd5b63ffffffff8260e00151511115613bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bb5906191b5565b60405180910390fd5b6000801b826020015103613c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bfe90619281565b60405180910390fd5b600080600260ff16846080015160ff161190508015613c66578361010001515160048560e00151518660400151516059613c419190618d5b565b613c4b9190618d5b565b613c559190618d5b565b613c5f9190618d5b565b9150613c8b565b8360e00151518460400151516059613c7e9190618d5b565b613c889190618d5b565b91505b60008267ffffffffffffffff811115613ca757613ca6617a79565b5b6040519080825280601f01601f191660200182016040528015613cd95781602001600182028036833780820191505090505b5090506000839050613d058163ff0000008860000151613cf991906191d5565b63ffffffff16846157c0565b613d0f6020615313565b81613d1a9190618d27565b9050613d2b81876020015184613082565b613d33612ea3565b60ff1681613d419190618d27565b9050600086604001519050613d578282856156b4565b80516004613d659190618d5b565b82613d709190618d27565b9150613d8182886060015185613082565b613d89612ea3565b60ff1682613d979190618d27565b9150613da882886080015185615788565b600182613db59190618d27565b9150613dc6828860a001518561579f565b613dd06040615313565b82613ddb9190618d27565b9150613dec828860c00151856152fc565b613df66020615313565b82613e019190618d27565b9150613e12828860e00151856156b4565b8660e00151516004613e249190618d5b565b82613e2f9190618d27565b91508315613e4857613e4782886101000151856156b4565b5b8295505050505050919050565b5050505050565b60008151905060006020613e708385612fb8565b613e7a91906191d5565b905060008163ffffffff1667ffffffffffffffff811115613e9e57613e9d617a79565b5b6040519080825280601f01601f191660200182016040528015613ed05781602001600182028036833780820191505090505b509050613ede8385836157ca565b613ee781615239565b83613ef29190618d27565b92506000613f008486612e95565b9050613f0a612ea3565b60ff1684613f189190618d27565b93506000613f268587612fb8565b9050613f326020615313565b85613f3d9190618d27565b945060006020613f4d8789612fb8565b613f5791906191d5565b905060008163ffffffff1667ffffffffffffffff811115613f7b57613f7a617a79565b5b6040519080825280601f01601f191660200182016040528015613fad5781602001600182028036833780820191505090505b509050613fbb8789836157ca565b613fc481615239565b87613fcf9190618d27565b96508489600001819052508389602001818152505082896060019063ffffffff16908163ffffffff1681525050808960400181905250505050505050505050565b600061401b82615822565b905060006009540361408e5780632e00b39586868660001c86604001516040518563ffffffff1660e01b815260040161405794939291906192a1565b600060405180830381600087803b15801561407157600080fd5b505af1158015614085573d6000803e3d6000fd5b505050506140f5565b60095463b1fa0c6d86868660001c8587604001516040518663ffffffff1660e01b81526004016140c29594939291906192e8565b600060405180830381600087803b1580156140dc57600080fd5b505af11580156140f0573d6000803e3d6000fd5b505050505b5050505050565b600061415185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050848460200151615838565b90508063ffffffff16826060015163ffffffff16146141a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161419c90619389565b60405180910390fd5b6000606060006141b485615822565b90506000813b0361420057600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525091506143b3565b6000600954036142de5780639e41773189898960001c89604001516040518563ffffffff1660e01b815260040161423a94939291906192a1565b600060405180830381600087803b15801561425457600080fd5b505af1925050508015614265575060015b6142d4576142716193b6565b806308c379a00361429957506142856193d8565b80614290575061429b565b809250506142cf565b505b3d80600081146142c7576040519150601f19603f3d011682016040523d82523d6000602084013e6142cc565b606091505b50505b6142d9565b600192505b6143b2565b6009546340b6b1dd89898960001c858a604001516040518663ffffffff1660e01b81526004016143129594939291906192e8565b600060405180830381600087803b15801561432c57600080fd5b505af192505050801561433d575060015b6143ac576143496193b6565b806308c379a003614371575061435d6193d8565b806143685750614373565b809250506143a7565b505b3d806000811461439f576040519150601f19603f3d011682016040523d82523d6000602084013e6143a4565b606091505b50505b6143b1565b600192505b5b5b7fc5c107ebb3f0bb97a017b6d166d57ad3349b9114ef620914f2178b3559310abf888888848888886040516143ee9796959493929190619468565b60405180910390a15050505050505050565b60008151905061440f82612652565b836000019063ffffffff16908163ffffffff16815250506144306020612e83565b8161443b9190618d27565b90506144478183612e95565b836020018181525050614458612ea3565b60ff16816144669190618d27565b905060006144748284612eac565b90508084604001819052508051600461448d9190618d5b565b826144989190618d27565b91506144a48284612e95565b8460600181815250506144b5612ea3565b60ff16826144c39190618d27565b91506144cf8284612f9c565b846080019060ff16908160ff16815250506001826144ed9190618d27565b91506144f98284612faa565b8460a0019067ffffffffffffffff16908167ffffffffffffffff16815250506008826145259190618d27565b91506145318284612fb8565b8460c0019063ffffffff16908163ffffffff16815250506004826145559190618d27565b91506145618284612eac565b8460e001819052508360e0015151600461457b9190618d5b565b826145869190618d27565b9150600260ff16846080015160ff1611156145af576145a58284612eac565b8461010001819052505b50505050565b6000606063ffffffff80168360c0015163ffffffff1603614640576145dc868686866158ce565b8092508193505050600060ff16836080015160ff160361463b57818190614639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161463091906194d9565b60405180910390fd5b505b614655565b61464c86868686615afa565b80925081935050505b7f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d2398360200151878787876040015161468c89615dc8565b8960c001518a60a001518b608001518b8b6040516146b49b9a999897969594939291906194fb565b60405180910390a1600160ff16836080015160ff16036146dd576146dc838787878686615dde565b5b505050505050565b600060095403614770576146f881615dc8565b6315390358826020015186868660001c8660c001518760a001518860e001516040518863ffffffff1660e01b815260040161473997969594939291906195ae565b600060405180830381600087803b15801561475357600080fd5b505af1158015614767573d6000803e3d6000fd5b505050506147f1565b60095463760f791861478183615dc8565b836020015187878760001c8760c001518860a001518960e001516040518963ffffffff1660e01b81526004016147be98979695949392919061961f565b600060405180830381600087803b1580156147d857600080fd5b505af11580156147ec573d6000803e3d6000fd5b505050505b7f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d2398160200151858585856040015161482887615dc8565b8760c001518860a001518960800151600160405161484f9a999897969594939291906196ea565b60405180910390a150505050565b6000600954036148ef5761487081615dc8565b6383c6d5a2826020015186868660001c8660c001518760a001518860e001518961010001516040518963ffffffff1660e01b81526004016148b898979695949392919061979b565b600060405180830381600087803b1580156148d257600080fd5b505af11580156148e6573d6000803e3d6000fd5b50505050614977565b600954632b9ff60b61490083615dc8565b836020015187878760001c8760c001518860a001518960e001518a61010001516040518a63ffffffff1660e01b815260040161494499989796959493929190619821565b600060405180830381600087803b15801561495e57600080fd5b505af1158015614972573d6000803e3d6000fd5b505050505b7f789584a10843997d826143b7f44b4c97b52104b01943dad7ae67845de6c8d239816020015185858585604001516149ae87615dc8565b8760c001518860a00151896080015160018b61010001516040516149dc9b9a999897969594939291906194fb565b60405180910390a150505050565b6000606060008360e0015160ff161480614a0b575060028360e0015160ff16145b80614a1d575060048360e0015160ff16145b614a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a5390619928565b60405180910390fd5b60028360e0015160ff1603614ab7574383610100015111614ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614aa990619994565b60405180910390fd5b614b0f565b60048360e0015160ff1603614b0e574283610100015111614b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614b0490619994565b60405180910390fd5b5b5b63ffffffff80168360c0015163ffffffff1603614b9657614b3286868686615ef1565b8092508193505050600060ff16836080015160ff1603614b9157818190614b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614b8691906194d9565b60405180910390fd5b505b614bab565b614ba28686868661611f565b80925081935050505b7f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c983602001518787878760400151614be2896163ef565b8960c001518a60a001518b608001518b8b604051614c0a9b9a999897969594939291906194fb565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad283602001518460e00151856101000151604051614c52939291906199b4565b60405180910390a1600160ff16836080015160ff1603614c7b57614c7a838787878686616405565b5b505050505050565b600060095403614d0f57614c96816163ef565b6315390358826020015186868660001c8660c001518760a001518861012001516040518863ffffffff1660e01b8152600401614cd897969594939291906195ae565b600060405180830381600087803b158015614cf257600080fd5b505af1158015614d06573d6000803e3d6000fd5b50505050614d91565b60095463760f7918614d20836163ef565b836020015187878760001c8760c001518860a001518961012001516040518963ffffffff1660e01b8152600401614d5e98979695949392919061961f565b600060405180830381600087803b158015614d7857600080fd5b505af1158015614d8c573d6000803e3d6000fd5b505050505b7f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614dc8876163ef565b8760c001518860a0015189608001516001604051614def9a999897969594939291906196ea565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e00151836101000151604051614e37939291906199b4565b60405180910390a150505050565b600060095403614ed857614e58816163ef565b6383c6d5a2826020015186868660001c8660c001518760a001518861012001518961014001516040518963ffffffff1660e01b8152600401614ea198979695949392919061979b565b600060405180830381600087803b158015614ebb57600080fd5b505af1158015614ecf573d6000803e3d6000fd5b50505050614f61565b600954632b9ff60b614ee9836163ef565b836020015187878760001c8760c001518860a001518961012001518a61014001516040518a63ffffffff1660e01b8152600401614f2e99989796959493929190619821565b600060405180830381600087803b158015614f4857600080fd5b505af1158015614f5c573d6000803e3d6000fd5b505050505b7f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c981602001518585858560400151614f98876163ef565b8760c001518860a00151896080015160018b6101400151604051614fc69b9a999897969594939291906194fb565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad281602001518260e0015183610100015160405161500e939291906199b4565b60405180910390a150505050565b600061502c826101200151616518565b9050806040015160066000878760405160200161504a929190618287565b604051602081830303815290604052805190602001208152602001908152602001600020600201819055508060800151600660008787604051602001615091929190618287565b60405160208183030381529060405280519060200120815260200190815260200160002060040160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080606001516006600087876040516020016150fa929190618287565b604051602081830303815290604052805190602001208152602001908152602001600020600301819055507f4839a4d7bba59b064a0851c83da206412690eff93aecfaf2cd14b2aace5616c98260200151868686866040015161515c886163ef565b8860c001518960a001518a6080015160018c610140015160405161518a9b9a999897969594939291906194fb565b60405180910390a17f1e96d53fcbc2c0ed72154f086de48aea9ca84a0d40467cb73978a982e621cad282602001518360e001518461010001516040516151d2939291906199b4565b60405180910390a15050505050565b6000602082516151f19190619a1a565b90506000602083516152039190619a4b565b1461521757808061521390619a7c565b9150505b808061522290619a7c565b9150506020816152329190619ac4565b9050919050565b6000602082516152499190619a1a565b905060006020835161525b9190619a4b565b1461526f57808061526b90619a7c565b9150505b808061527a90619a7c565b91505060208161528a9190619ac4565b9050919050565b6000602083516152a19190619a1a565b90506000602084516152b39190619a4b565b11156152c85780806152c490619a7c565b9150505b60006001820191505b818110156152f55760208102840151858401526020850394506001810190506152d1565b5050505050565b828101600481038051848352808252505050505050565b6000816008811461542057601081146154295760188114615432576020811461543b5760288114615444576030811461544d5760388114615456576040811461545f57604881146154685760508114615471576058811461547a5760608114615483576068811461548c5760708114615495576078811461549e57608081146154a757608881146154b057609081146154b957609881146154c25760a081146154cb5760a881146154d45760b081146154dd5760b881146154e65760c081146154ef5760c881146154f85760d081146155015760d8811461550a5760e081146155135760e8811461551c5760f081146155255760f8811461552e576101008114615537576020915061553c565b6001915061553c565b6002915061553c565b6003915061553c565b6004915061553c565b6005915061553c565b6006915061553c565b6007915061553c565b6008915061553c565b6009915061553c565b600a915061553c565b600b915061553c565b600c915061553c565b600d915061553c565b600e915061553c565b600f915061553c565b6010915061553c565b6011915061553c565b6012915061553c565b6013915061553c565b6014915061553c565b6015915061553c565b6016915061553c565b6017915061553c565b6018915061553c565b6019915061553c565b601a915061553c565b601b915061553c565b601c915061553c565b601d915061553c565b601e915061553c565b601f915061553c565b602091505b50919050565b60008061554e8461667b565b905080856040516020016155629190618539565b604051602081830303815290604052805190602001208460405160200161558b93929190618cbb565b604051602081830303815290604052805190602001209150509392505050565b60606000602067ffffffffffffffff8111156155ca576155c9617a79565b5b6040519080825280601f01601f1916602001820160405280156155fc5781602001600182028036833780820191505090505b5090506000602067ffffffffffffffff81111561561c5761561b617a79565b5b6040519080825280601f01601f19166020018201604052801561564e5781602001600182028036833780820191505090505b509050606084602084015260015b60208110156156a857806020850103518160208501035180820361569b57604051935060208601518385015282845282602085010160405250506156a8565b505060018101905061565c565b50809350505050919050565b6000825190506156c58482846152fc565b6004846156d29190618d27565b93508063ffffffff1684101561571d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161571490619b90565b60405180910390fd5b8063ffffffff168461572f9190618d27565b9350801560008103615781578483018051601f84168015602002818801018581018215602002838601015b81831015615777578251815260208301925060208101905061575a565b5083855250505050505b5050505050565b828101600181038051848352808252505050505050565b828101600881038051848352808252505050505050565b8183820152505050565b8183820152505050565b60006020905060008085850151925060016020840401905060006020840611156157f5576001810190505b5b8082101561581a5785850151602083028501526020860395506001820191506157f6565b505050505050565b60006158318260200151611db0565b9050919050565b600080615846858585611acf565b905060006004600083815260200190815260200160002060009054906101000a900463ffffffff16905060046000838152602001908152602001600020600081819054906101000a900463ffffffff16809291906158a3906190ab565b91906101000a81548163ffffffff021916908363ffffffff1602179055505080925050509392505050565b600060606000606060006158e186615dc8565b3b0361592857600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509050615ae9565b600061593386615dc8565b9050600060095403615a135780632e00b3958a8a8a60001c8a60e001516040518563ffffffff1660e01b815260040161596f94939291906192a1565b600060405180830381600087803b15801561598957600080fd5b505af192505050801561599a575060015b615a09576159a66193b6565b806308c379a0036159ce57506159ba6193d8565b806159c557506159d0565b80925050615a04565b505b3d80600081146159fc576040519150601f19603f3d011682016040523d82523d6000602084013e615a01565b606091505b50505b615a0e565b600192505b615ae7565b6009546365a6371f8a8a8a60001c858b60e001516040518663ffffffff1660e01b8152600401615a479594939291906192e8565b600060405180830381600087803b158015615a6157600080fd5b505af1925050508015615a72575060015b615ae157615a7e6193b6565b806308c379a003615aa65750615a926193d8565b80615a9d5750615aa8565b80925050615adc565b505b3d8060008114615ad4576040519150601f19603f3d011682016040523d82523d6000602084013e615ad9565b606091505b50505b615ae6565b600192505b5b505b818193509350505094509492505050565b600060606000615b5387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151615838565b90508063ffffffff168460c0015163ffffffff1614615ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b9e90619389565b60405180910390fd5b600060606000615bb687615dc8565b90506000813b03615c0257600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f64650000000000000000000000008152509150615db5565b600060095403615ce05780639e4177318b8b8b60001c8b60e001516040518563ffffffff1660e01b8152600401615c3c94939291906192a1565b600060405180830381600087803b158015615c5657600080fd5b505af1925050508015615c67575060015b615cd657615c736193b6565b806308c379a003615c9b5750615c876193d8565b80615c925750615c9d565b80925050615cd1565b505b3d8060008114615cc9576040519150601f19603f3d011682016040523d82523d6000602084013e615cce565b606091505b50505b615cdb565b600192505b615db4565b60095463b92e9fe88b8b8b60001c858c60e001516040518663ffffffff1660e01b8152600401615d149594939291906192e8565b600060405180830381600087803b158015615d2e57600080fd5b505af1925050508015615d3f575060015b615dae57615d4b6193b6565b806308c379a003615d735750615d5f6193d8565b80615d6a5750615d75565b80925050615da9565b505b3d8060008114615da1576040519150601f19603f3d011682016040523d82523d6000602084013e615da6565b606091505b50505b615db3565b600192505b5b5b8282955095505050505094509492505050565b6000615dd78260600151611db0565b9050919050565b6000615de987615dc8565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087604001819052508387606001818152505082615e4e576003615e51565b60025b876080019060ff16908160ff168152505082615e6d5781615e7e565b604051806020016040528060008152505b876101000181905250600154639d24799882615e998a613b23565b6040518363ffffffff1660e01b8152600401615eb6929190618c6a565b600060405180830381600087803b158015615ed057600080fd5b505af1158015615ee4573d6000803e3d6000fd5b5050505050505050505050565b60006060600060606000615f04866163ef565b3b03615f4b57600091506040518060400160405280601481526020017f726563656976657220686173206e6f20636f6465000000000000000000000000815250905061610e565b6000615f56866163ef565b90506000600954036160375780632e00b3958a8a8a60001c8a61012001516040518563ffffffff1660e01b8152600401615f9394939291906192a1565b600060405180830381600087803b158015615fad57600080fd5b505af1925050508015615fbe575060015b61602d57615fca6193b6565b806308c379a003615ff25750615fde6193d8565b80615fe95750615ff4565b80925050616028565b505b3d8060008114616020576040519150601f19603f3d011682016040523d82523d6000602084013e616025565b606091505b50505b616032565b600192505b61610c565b60095463cd616e1e8a8a8a60001c858b61012001516040518663ffffffff1660e01b815260040161606c9594939291906192e8565b600060405180830381600087803b15801561608657600080fd5b505af1925050508015616097575060015b616106576160a36193b6565b806308c379a0036160cb57506160b76193d8565b806160c257506160cd565b80925050616101565b505b3d80600081146160f9576040519150601f19603f3d011682016040523d82523d6000602084013e6160fe565b606091505b50505b61610b565b600192505b5b505b818193509350505094509492505050565b60006060600061617887878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050868660600151615838565b90508063ffffffff168460c0015163ffffffff16146161cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016161c390619c22565b60405180910390fd5b6000606060006161db876163ef565b90506000813b0361622757600092506040518060400160405280601481526020017f726563656976657220686173206e6f20636f646500000000000000000000000081525091506163dc565b6000600954036163065780639e4177318b8b8b60001c8b61012001516040518563ffffffff1660e01b815260040161626294939291906192a1565b600060405180830381600087803b15801561627c57600080fd5b505af192505050801561628d575060015b6162fc576162996193b6565b806308c379a0036162c157506162ad6193d8565b806162b857506162c3565b809250506162f7565b505b3d80600081146162ef576040519150601f19603f3d011682016040523d82523d6000602084013e6162f4565b606091505b50505b616301565b600192505b6163db565b60095463ca4f1d128b8b8b60001c858c61012001516040518663ffffffff1660e01b815260040161633b9594939291906192e8565b600060405180830381600087803b15801561635557600080fd5b505af1925050508015616366575060015b6163d5576163726193b6565b806308c379a00361639a57506163866193d8565b80616391575061639c565b809250506163d0565b505b3d80600081146163c8576040519150601f19603f3d011682016040523d82523d6000602084013e6163cd565b606091505b50505b6163da565b600192505b5b5b8282955095505050505094509492505050565b60006163fe8260600151611db0565b9050919050565b6000616410876163ef565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087604001819052508387606001818152505082616475576003616478565b60025b876080019060ff16908160ff16815250508261649457816164a5565b604051806020016040528060008152505b876101400181905250600154639d247998826164c08a61342e565b6040518363ffffffff1660e01b81526004016164dd929190618c6a565b600060405180830381600087803b1580156164f757600080fd5b505af115801561650b573d6000803e3d6000fd5b5050505050505050505050565b6165206172cd565b6165286172cd565b6000616533846166e1565b905060005b8160200151518110156166705760008260200151828151811061655e5761655d619c42565b5b602002602001015190506000816000015161ffff16036165995761658181616893565b846000019061ffff16908161ffff168152505061665c565b6001816000015161ffff16036165bf576165b2816168b3565b846020018190525061665b565b6002816000015161ffff16036165f0576165e260206165dd836168c1565b612e95565b84604001818152505061665a565b6003816000015161ffff160361661f5761661161660c826168c1565b612fc6565b846060018181525050616659565b6004816000015161ffff160361665857616638816168cf565b846080019067ffffffffffffffff16908167ffffffffffffffff16815250505b5b5b5b5b50808061666890619a7c565b915050616538565b508192505050919050565b600080602067ffffffffffffffff81111561669957616698617a79565b5b6040519080825280601f01601f1916602001820160405280156166cb5781602001600182028036833780820191505090505b5090508260208201526020810151915050919050565b6166e96173a9565b60068251101561672e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161672590619cbd565b60405180910390fd5b60006167386173a9565b61674a61674585846168ef565b61691e565b816000019061ffff16908161ffff168152505060068261676a9190618d5b565b91506000808390505b85518110156167cc5761679a616795876002846167909190618d5b565b616a49565b616a7a565b60066167a691906191d5565b63ffffffff16816167b79190618d5b565b905081806167c490619a7c565b925050616773565b60008267ffffffffffffffff8111156167e8576167e7617a79565b5b60405190808252806020026020018201604052801561682157816020015b61680e6173c7565b8152602001906001900390816168065790505b509050600092505b865185101561687d5761683a6173c7565b6168448887616c5b565b80975081925050508082858061685990619a7c565b96508151811061686c5761686b619c42565b5b602002602001018190525050616829565b8084602001819052508395505050505050919050565b60006168ac6168a760028460400151616da3565b61691e565b9050919050565b606081604001519050919050565b606081604001519050919050565b60006168e86168e360088460400151612faa565b616db1565b9050919050565b600082516002836169009190618d5b565b111561690b57600080fd5b61ffff8260028501015116905092915050565b6000808260f01b90506000600267ffffffffffffffff81111561694457616943617a79565b5b6040519080825280601f01601f1916602001820160405280156169765781602001600182028036833780820191505090505b5090508160016002811061698d5761698c619c42565b5b1a60f81b816000815181106169a5576169a4619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350816000600281106169e8576169e7619c42565b5b1a60f81b81600181518110616a00576169ff619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000616a3c8260006168ef565b9050809350505050919050565b60008251600483616a5a9190618d5b565b1115616a6557600080fd5b63ffffffff8260048501015116905092915050565b6000808260e01b90506000600467ffffffffffffffff811115616aa057616a9f617a79565b5b6040519080825280601f01601f191660200182016040528015616ad25781602001600182028036833780820191505090505b50905081600360048110616ae957616ae8619c42565b5b1a60f81b81600081518110616b0157616b00619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260048110616b4457616b43619c42565b5b1a60f81b81600181518110616b5c57616b5b619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600160048110616b9f57616b9e619c42565b5b1a60f81b81600281518110616bb757616bb6619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600060048110616bfa57616bf9619c42565b5b1a60f81b81600381518110616c1257616c11619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000616c4e826000616a49565b9050809350505050919050565b616c636173c7565b600082845111616ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401616c9f90619d4f565b60405180910390fd5b6006831015616cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401616ce390619dbb565b60405180910390fd5b616cf46173c7565b616d06616d0186866168ef565b61691e565b816000019061ffff16908161ffff1681525050600284616d269190618d5b565b9350616d3a616d358686616a49565b616a7a565b816020019063ffffffff16908163ffffffff1681525050600484616d5e9190618d5b565b9350616d758585836020015163ffffffff166170fe565b8160400181905250806020015163ffffffff1684616d939190618d5b565b9350808492509250509250929050565b600082820151905092915050565b6000808260c01b90506000600867ffffffffffffffff811115616dd757616dd6617a79565b5b6040519080825280601f01601f191660200182016040528015616e095781602001600182028036833780820191505090505b50905081600760088110616e2057616e1f619c42565b5b1a60f81b81600081518110616e3857616e37619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600660088110616e7b57616e7a619c42565b5b1a60f81b81600181518110616e9357616e92619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600560088110616ed657616ed5619c42565b5b1a60f81b81600281518110616eee57616eed619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600460088110616f3157616f30619c42565b5b1a60f81b81600381518110616f4957616f48619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600360088110616f8c57616f8b619c42565b5b1a60f81b81600481518110616fa457616fa3619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081600260088110616fe757616fe6619c42565b5b1a60f81b81600581518110616fff57616ffe619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160016008811061704257617041619c42565b5b1a60f81b8160068151811061705a57617059619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508160006008811061709d5761709c619c42565b5b1a60f81b816007815181106170b5576170b4619c42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006170f1826000617193565b9050809350505050919050565b60608351828461710e9190618d5b565b111561711957600080fd5b60008267ffffffffffffffff81111561713557617134617a79565b5b6040519080825280601f01601f1916602001820160405280156171675781602001600182028036833780820191505090505b50905060008060208301915085602088010190506171868282876171c8565b8293505050509392505050565b600082516008836171a49190618d5b565b11156171af57600080fd5b67ffffffffffffffff8260088501015116905092915050565b5b6020811061720757815183526020836171e29190618d5b565b92506020826171f19190618d5b565b91506020816172009190618d27565b90506171c9565b600081031561724c57600060018260206172219190618d27565b61010061722e9190619f0e565b6172389190618d27565b905080198351168185511681811786525050505b505050565b604051806101600160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600060ff1681526020016000815260200160608152602001606081525090565b6040518060a00160405280600061ffff168152602001606081526020016000801916815260200160008152602001600067ffffffffffffffff1681525090565b6040518060800160405280606081526020016000801916815260200160608152602001600063ffffffff1681525090565b604051806101200160405280600063ffffffff168152602001600080191681526020016060815260200160008019168152602001600060ff168152602001600067ffffffffffffffff168152602001600063ffffffff16815260200160608152602001606081525090565b6040518060400160405280600061ffff168152602001606081525090565b6040518060600160405280600061ffff168152602001600063ffffffff168152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261742b5761742a617406565b5b8235905067ffffffffffffffff8111156174485761744761740b565b5b60208301915083600182028301111561746457617463617410565b5b9250929050565b6000819050919050565b60006174808261746b565b9050919050565b61749081617475565b811461749b57600080fd5b50565b6000813590506174ad81617487565b92915050565b60008083601f8401126174c9576174c8617406565b5b8235905067ffffffffffffffff8111156174e6576174e561740b565b5b60208301915083600182028301111561750257617501617410565b5b9250929050565b600080600080600060608688031215617525576175246173fc565b5b600086013567ffffffffffffffff81111561754357617542617401565b5b61754f88828901617415565b955095505060206175628882890161749e565b935050604086013567ffffffffffffffff81111561758357617582617401565b5b61758f888289016174b3565b92509250509295509295909350565b6000602082840312156175b4576175b36173fc565b5b60006175c28482850161749e565b91505092915050565b60008115159050919050565b6175e0816175cb565b82525050565b60006020820190506175fb60008301846175d7565b92915050565b6000819050919050565b61761481617601565b811461761f57600080fd5b50565b6000813590506176318161760b565b92915050565b60008060008060008060808789031215617654576176536173fc565b5b600087013567ffffffffffffffff81111561767257617671617401565b5b61767e89828a01617415565b9650965050602061769189828a01617622565b945050604087013567ffffffffffffffff8111156176b2576176b1617401565b5b6176be89828a01617415565b935093505060606176d189828a01617622565b9150509295509295509295565b600063ffffffff82169050919050565b6176f7816176de565b82525050565b600060208201905061771260008301846176ee565b92915050565b600080600060408486031215617731576177306173fc565b5b600061773f86828701617622565b935050602084013567ffffffffffffffff8111156177605761775f617401565b5b61776c868287016174b3565b92509250509250925092565b60008060008060008060808789031215617795576177946173fc565b5b600087013567ffffffffffffffff8111156177b3576177b2617401565b5b6177bf89828a01617415565b965096505060206177d289828a0161749e565b945050604087013567ffffffffffffffff8111156177f3576177f2617401565b5b6177ff89828a01617415565b9350935050606061781289828a0161749e565b9150509295509295509295565b617828816175cb565b811461783357600080fd5b50565b6000813590506178458161781f565b92915050565b600060ff82169050919050565b6178618161784b565b811461786c57600080fd5b50565b60008135905061787e81617858565b92915050565b61788d8161746b565b811461789857600080fd5b50565b6000813590506178aa81617884565b92915050565b600080600080600080600080600060e08a8c0312156178d2576178d16173fc565b5b60008a013567ffffffffffffffff8111156178f0576178ef617401565b5b6178fc8c828d01617415565b9950995050602061790f8c828d0161749e565b97505060406179208c828d0161749e565b96505060606179318c828d01617836565b95505060808a013567ffffffffffffffff81111561795257617951617401565b5b61795e8c828d016174b3565b945094505060a06179718c828d0161786f565b92505060c06179828c828d0161789b565b9150509295985092959850929598565b61799b81617601565b82525050565b60006020820190506179b66000830184617992565b92915050565b600080600080600080608087890312156179d9576179d86173fc565b5b600087013567ffffffffffffffff8111156179f7576179f6617401565b5b617a0389828a01617415565b96509650506020617a1689828a0161749e565b9450506040617a2789828a01617836565b935050606087013567ffffffffffffffff811115617a4857617a47617401565b5b617a5489828a016174b3565b92509250509295509295509295565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b617ab182617a68565b810181811067ffffffffffffffff82111715617ad057617acf617a79565b5b80604052505050565b6000617ae36173f2565b9050617aef8282617aa8565b919050565b600067ffffffffffffffff821115617b0f57617b0e617a79565b5b617b1882617a68565b9050602081019050919050565b82818337600083830152505050565b6000617b47617b4284617af4565b617ad9565b905082815260208101848484011115617b6357617b62617a63565b5b617b6e848285617b25565b509392505050565b600082601f830112617b8b57617b8a617406565b5b8135617b9b848260208601617b34565b91505092915050565b60008060408385031215617bbb57617bba6173fc565b5b6000617bc98582860161749e565b925050602083013567ffffffffffffffff811115617bea57617be9617401565b5b617bf685828601617b76565b9150509250929050565b60008060008060008060808789031215617c1d57617c1c6173fc565b5b600087013567ffffffffffffffff811115617c3b57617c3a617401565b5b617c4789828a01617415565b96509650506020617c5a89828a0161749e565b9450506040617c6b89828a0161749e565b935050606087013567ffffffffffffffff811115617c8c57617c8b617401565b5b617c9889828a016174b3565b92509250509295509295509295565b617cb081617475565b82525050565b6000602082019050617ccb6000830184617ca7565b92915050565b600060208284031215617ce757617ce66173fc565b5b600082013567ffffffffffffffff811115617d0557617d04617401565b5b617d1184828501617b76565b91505092915050565b60008060208385031215617d3157617d306173fc565b5b600083013567ffffffffffffffff811115617d4f57617d4e617401565b5b617d5b85828601617415565b92509250509250929050565b600061ffff82169050919050565b617d7e81617d67565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015617dbe578082015181840152602081019050617da3565b83811115617dcd576000848401525b50505050565b6000617dde82617d84565b617de88185617d8f565b9350617df8818560208601617da0565b617e0181617a68565b840191505092915050565b617e1581617601565b82525050565b617e248161746b565b82525050565b600067ffffffffffffffff82169050919050565b617e4781617e2a565b82525050565b600060a083016000830151617e656000860182617d75565b5060208301518482036020860152617e7d8282617dd3565b9150506040830151617e926040860182617e0c565b506060830151617ea56060860182617e1b565b506080830151617eb86080860182617e3e565b508091505092915050565b60006020820190508181036000830152617edd8184617e4d565b905092915050565b600080600080600060608688031215617f0157617f006173fc565b5b600086013567ffffffffffffffff811115617f1f57617f1e617401565b5b617f2b88828901617415565b95509550506020617f3e88828901617622565b935050604086013567ffffffffffffffff811115617f5f57617f5e617401565b5b617f6b888289016174b3565b92509250509295509295909350565b600080600080600080600060a0888a031215617f9957617f986173fc565b5b600088013567ffffffffffffffff811115617fb757617fb6617401565b5b617fc38a828b01617415565b97509750506020617fd68a828b0161749e565b9550506040617fe78a828b0161749e565b9450506060617ff88a828b01617836565b935050608088013567ffffffffffffffff81111561801957618018617401565b5b6180258a828b016174b3565b925092505092959891949750929550565b60008060008060008060008060c0898b031215618056576180556173fc565b5b600089013567ffffffffffffffff81111561807457618073617401565b5b6180808b828c01617415565b985098505060206180938b828c0161749e565b96505060406180a48b828c01617836565b955050606089013567ffffffffffffffff8111156180c5576180c4617401565b5b6180d18b828c016174b3565b945094505060806180e48b828c0161786f565b92505060a06180f58b828c0161789b565b9150509295985092959890939650565b61810e816176de565b811461811957600080fd5b50565b60008135905061812b81618105565b92915050565b6000806000806080858703121561814b5761814a6173fc565b5b600085013567ffffffffffffffff81111561816957618168617401565b5b61817587828801617b76565b94505060206181868782880161749e565b93505060406181978782880161749e565b92505060606181a88782880161811c565b91505092959194509250565b600082825260208201905092915050565b7f5344504d73673a206e6f742076616c6964206d6f6e69746f7220636f6e74726160008201527f6374000000000000000000000000000000000000000000000000000000000000602082015250565b60006182216022836181b4565b915061822c826181c5565b604082019050919050565b6000602082019050818103600083015261825081618214565b9050919050565b600081905092915050565b600061826e8385618257565b935061827b838584617b25565b82840190509392505050565b6000618294828486618262565b91508190509392505050565b7f5344504d73673a2077726f6e6720726563656976696e6720646f6d61696e0000600082015250565b60006182d6601e836181b4565b91506182e1826182a0565b602082019050919050565b60006020820190508181036000830152618305816182c9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006183426020836181b4565b915061834d8261830c565b602082019050919050565b6000602082019050818103600083015261837181618335565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206960008201527f64656e7469747900000000000000000000000000000000000000000000000000602082015250565b60006183d46027836181b4565b91506183df82618378565b604082019050919050565b60006020820190508181036000830152618403816183c7565b9050919050565b7f5344504d73673a2073656e646572206e6f742076616c69642072656c61796572600082015250565b60006184406020836181b4565b915061844b8261840a565b602082019050919050565b6000602082019050818103600083015261846f81618433565b9050919050565b7f5344505f4d53475f4552524f523a20746865206d6573736167652074696d656f60008201527f75744d6561737572652069732030000000000000000000000000000000000000602082015250565b60006184d2602e836181b4565b91506184dd82618476565b604082019050919050565b60006020820190508181036000830152618501816184c5565b9050919050565b600061851382617d84565b61851d8185618257565b935061852d818560208601617da0565b80840191505092915050565b60006185458284618508565b915081905092915050565b7f5344505f4d53475f4552524f523a20657863657074696f6e206d65737361676560008201527f206861736820646f6573206e6f74206578697374000000000000000000000000602082015250565b60006185ac6034836181b4565b91506185b782618550565b604082019050919050565b600060208201905081810360008301526185db8161859f565b9050919050565b60006185ed82617d84565b6185f781856181b4565b9350618607818560208601617da0565b61861081617a68565b840191505092915050565b61862481617e2a565b82525050565b600081519050919050565b600082825260208201905092915050565b60006186518261862a565b61865b8185618635565b935061866b818560208601617da0565b61867481617a68565b840191505092915050565b600060e082019050618694600083018a617992565b81810360208301526186a681896185e2565b90506186b56040830188617ca7565b6186c260608301876176ee565b6186cf608083018661861b565b81810360a08301526186e18185618646565b905081810360c08301526186f581846185e2565b905098975050505050505050565b600061010082019050618719600083018b617ca7565b618726602083018a617992565b818103604083015261873881896185e2565b90506187476060830188617ca7565b61875460808301876176ee565b61876160a083018661861b565b81810360c08301526187738185618646565b905081810360e083015261878781846185e2565b90509998505050505050505050565b7f5344505f4d53475f4552524f523a20746865206d657373616765206973206e6f60008201527f742074696d656f757420776974682074696d656f75744d656173757265203200602082015250565b60006187f2603f836181b4565b91506187fd82618796565b604082019050919050565b60006020820190508181036000830152618821816187e5565b9050919050565b7f5344505f4d53475f4552524f523a20756e737570706f727465642074696d656f60008201527f7574206d65617375726500000000000000000000000000000000000000000000602082015250565b6000618884602a836181b4565b915061888f82618828565b604082019050919050565b600060208201905081810360008301526188b381618877565b9050919050565b60006188c683856181b4565b93506188d3838584617b25565b6188dc83617a68565b840190509392505050565b60006188f38385618635565b9350618900838584617b25565b61890983617a68565b840190509392505050565b600060a082019050818103600083015261892f81898b6188ba565b905061893e6020830188617ca7565b61894b6040830187617ca7565b61895860608301866175d7565b818103608083015261896b8184866188e7565b905098975050505050505050565b6000815190506189888161760b565b92915050565b6000602082840312156189a4576189a36173fc565b5b60006189b284828501618979565b91505092915050565b7f5344504d73673a20696e76616c696420616d20636f6e74726163740000000000600082015250565b60006189f1601b836181b4565b91506189fc826189bb565b602082019050919050565b60006020820190508181036000830152618a20816189e4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680618a6e57607f821691505b602082108103618a8157618a80618a27565b5b50919050565b7f5344504d73673a206e6f742076616c696420616d20636f6e7472616374000000600082015250565b6000618abd601d836181b4565b9150618ac882618a87565b602082019050919050565b60006020820190508181036000830152618aec81618ab0565b9050919050565b7f756e737570706f72746564207364702076657273696f6e000000000000000000600082015250565b6000618b296017836181b4565b9150618b3482618af3565b602082019050919050565b60006020820190508181036000830152618b5881618b1c565b9050919050565b618b688161784b565b82525050565b618b778161746b565b82525050565b600060e0820190508181036000830152618b98818b8d6188ba565b9050618ba7602083018a617ca7565b618bb46040830189617ca7565b618bc160608301886175d7565b8181036080830152618bd48186886188e7565b9050618be360a0830185618b5f565b618bf060c0830184618b6e565b9a9950505050505050505050565b7f5344504d73673a20696e76616c6964206d6f6e69746f7220636f6e7472616374600082015250565b6000618c346020836181b4565b9150618c3f82618bfe565b602082019050919050565b60006020820190508181036000830152618c6381618c27565b9050919050565b6000604082019050618c7f6000830185617ca7565b8181036020830152618c918184618646565b90509392505050565b6000819050919050565b618cb5618cb082617601565b618c9a565b82525050565b6000618cc78286618ca4565b602082019150618cd78285618ca4565b602082019150618ce78284618ca4565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000618d328261746b565b9150618d3d8361746b565b925082821015618d5057618d4f618cf8565b5b828203905092915050565b6000618d668261746b565b9150618d718361746b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115618da657618da5618cf8565b5b828201905092915050565b7f5344503a20696e76616c69642074696d656f7574206d65617375726500000000600082015250565b6000618de7601c836181b4565b9150618df282618db1565b602082019050919050565b60006020820190508181036000830152618e1681618dda565b9050919050565b7f756e65787065637465642061746f6d696320666c616700000000000000000000600082015250565b6000618e536016836181b4565b9150618e5e82618e1d565b602082019050919050565b60006020820190508181036000830152618e8281618e46565b9050919050565b7f5344505f4d73673a2077726f6e6720726563656976696e6720646f6d61696e00600082015250565b6000618ebf601f836181b4565b9150618eca82618e89565b602082019050919050565b60006020820190508181036000830152618eee81618eb2565b9050919050565b7f5344505f4d53475f4552524f523a20756e65787065637465642061746f6d696360008201527f20666c6167000000000000000000000000000000000000000000000000000000602082015250565b6000618f516025836181b4565b9150618f5c82618ef5565b604082019050919050565b60006020820190508181036000830152618f8081618f44565b9050919050565b7f6279746573546f56617242797465733a206f6666736574206c6573732074686160008201527f6e206c656e677468206f6620626f647900000000000000000000000000000000602082015250565b6000618fe36030836181b4565b9150618fee82618f87565b604082019050919050565b6000602082019050818103600083015261901281618fd6565b9050919050565b7f333262797465732062696720696e7465676572206174206d6f737420666f722060008201527f6e6f770000000000000000000000000000000000000000000000000000000000602082015250565b60006190756023836181b4565b915061908082619019565b604082019050919050565b600060208201905081810360008301526190a481619068565b9050919050565b60006190b6826176de565b915063ffffffff82036190cc576190cb618cf8565b5b600182019050919050565b7f656e636f64655344504d6573736167653a2077726f6e672076657273696f6e00600082015250565b600061910d601f836181b4565b9150619118826190d7565b602082019050919050565b6000602082019050818103600083015261913c81619100565b9050919050565b7f656e636f64655344504d6573736167653a20626f6479206c656e677468206f7660008201527f65726c696d697400000000000000000000000000000000000000000000000000602082015250565b600061919f6027836181b4565b91506191aa82619143565b604082019050919050565b600060208201905081810360008301526191ce81619192565b9050919050565b60006191e0826176de565b91506191eb836176de565b92508263ffffffff0382111561920457619203618cf8565b5b828201905092915050565b7f656e636f64655344504d6573736167653a207a65726f206d657373616765206960008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061926b6021836181b4565b91506192768261920f565b604082019050919050565b6000602082019050818103600083015261929a8161925e565b9050919050565b600060608201905081810360008301526192bc8186886188ba565b90506192cb6020830185617ca7565b81810360408301526192dd8184618646565b905095945050505050565b600060808201905081810360008301526193038187896188ba565b90506193126020830186617ca7565b61931f6040830185617ca7565b81810360608301526193318184618646565b90509695505050505050565b7f5344504d73673a2073657175656e6365206e6f7420657175616c000000000000600082015250565b6000619373601a836181b4565b915061937e8261933d565b602082019050919050565b600060208201905081810360008301526193a281619366565b9050919050565b60008160e01c9050919050565b600060033d11156193d55760046000803e6193d26000516193a9565b90505b90565b600060443d10619465576193ea6173f2565b60043d036004823e80513d602482011167ffffffffffffffff82111715619412575050619465565b808201805167ffffffffffffffff8111156194305750505050619465565b80602083010160043d03850181111561944d575050505050619465565b61945c82602001850186617aa8565b82955050505050505b90565b600060c082019050818103600083015261948381898b6188ba565b90506194926020830188617992565b61949f6040830187617ca7565b6194ac60608301866176ee565b6194b960808301856175d7565b81810360a08301526194cb81846185e2565b905098975050505050505050565b600060208201905081810360008301526194f381846185e2565b905092915050565b600061014082019050619511600083018e617992565b8181036020830152619524818c8e6188ba565b9050619533604083018b617992565b8181036060830152619545818a6185e2565b90506195546080830189617ca7565b61956160a08301886176ee565b61956e60c083018761861b565b61957b60e0830186618b5f565b6195896101008301856175d7565b81810361012083015261959c81846185e2565b90509c9b505050505050505050505050565b600060c0820190506195c3600083018a617992565b81810360208301526195d681888a6188ba565b90506195e56040830187617ca7565b6195f260608301866176ee565b6195ff608083018561861b565b81810360a08301526196118184618646565b905098975050505050505050565b600060e082019050619634600083018b617ca7565b619641602083018a617992565b818103604083015261965481888a6188ba565b90506196636060830187617ca7565b61967060808301866176ee565b61967d60a083018561861b565b81810360c083015261968f8184618646565b90509998505050505050505050565b7f7375636365737300000000000000000000000000000000000000000000000000600082015250565b60006196d46007836181b4565b91506196df8261969e565b602082019050919050565b600061014082019050619700600083018d617992565b8181036020830152619713818b8d6188ba565b9050619722604083018a617992565b818103606083015261973481896185e2565b90506197436080830188617ca7565b61975060a08301876176ee565b61975d60c083018661861b565b61976a60e0830185618b5f565b6197786101008301846175d7565b81810361012083015261978a816196c7565b90509b9a5050505050505050505050565b600060e0820190506197b0600083018b617992565b81810360208301526197c381898b6188ba565b90506197d26040830188617ca7565b6197df60608301876176ee565b6197ec608083018661861b565b81810360a08301526197fe8185618646565b905081810360c083015261981281846185e2565b90509998505050505050505050565b600061010082019050619837600083018c617ca7565b619844602083018b617992565b818103604083015261985781898b6188ba565b90506198666060830188617ca7565b61987360808301876176ee565b61988060a083018661861b565b81810360c08301526198928185618646565b905081810360e08301526198a681846185e2565b90509a9950505050505050505050565b7f6f6e6c7920737570706f72742074696d656f7574206d65617375726520302c2060008201527f3220616e64203420666f72206e6f770000000000000000000000000000000000602082015250565b6000619912602f836181b4565b915061991d826198b6565b604082019050919050565b6000602082019050818103600083015261994181619905565b9050919050565b7f6d73672069732074696d656f7574000000000000000000000000000000000000600082015250565b600061997e600e836181b4565b915061998982619948565b602082019050919050565b600060208201905081810360008301526199ad81619971565b9050919050565b60006060820190506199c96000830186617992565b6199d66020830185618b5f565b6199e36040830184618b6e565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000619a258261746b565b9150619a308361746b565b925082619a4057619a3f6199eb565b5b828204905092915050565b6000619a568261746b565b9150619a618361746b565b925082619a7157619a706199eb565b5b828206905092915050565b6000619a878261746b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203619ab957619ab8618cf8565b5b600182019050919050565b6000619acf8261746b565b9150619ada8361746b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615619b1357619b12618cf8565b5b828202905092915050565b7f7661724279746573546f42797465733a206f6666736574206c6573732074686160008201527f6e2074686520696e707574206c656e6774680000000000000000000000000000602082015250565b6000619b7a6032836181b4565b9150619b8582619b1e565b604082019050919050565b60006020820190508181036000830152619ba981619b6d565b9050919050565b7f5344505f4d53475f4552524f523a2073657175656e6365206e6f74206571756160008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000619c0c6021836181b4565b9150619c1782619bb0565b604082019050919050565b60006020820190508181036000830152619c3b81619bff565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f696c6c6567616c207261772064617461206c656e677468000000000000000000600082015250565b6000619ca76017836181b4565b9150619cb282619c71565b602082019050919050565b60006020820190508181036000830152619cd681619c9a565b9050919050565b7f6c656e677468206f66207261772064617461206c657373207468616e206f666660008201527f7365740000000000000000000000000000000000000000000000000000000000602082015250565b6000619d396023836181b4565b9150619d4482619cdd565b604082019050919050565b60006020820190508181036000830152619d6881619d2c565b9050919050565b7f696c6c6567616c206f6666736574000000000000000000000000000000000000600082015250565b6000619da5600e836181b4565b9150619db082619d6f565b602082019050919050565b60006020820190508181036000830152619dd481619d98565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115619e3257808604811115619e0e57619e0d618cf8565b5b6001851615619e1d5780820291505b8081029050619e2b85619ddb565b9450619df2565b94509492505050565b600082619e4b5760019050619f07565b81619e595760009050619f07565b8160018114619e6f5760028114619e7957619ea8565b6001915050619f07565b60ff841115619e8b57619e8a618cf8565b5b8360020a915084821115619ea257619ea1618cf8565b5b50619f07565b5060208310610133831016604e8410600b8410161715619edd5782820a905083811115619ed857619ed7618cf8565b5b619f07565b619eea8484846001619de8565b92509050818404811115619f0157619f00618cf8565b5b81810290505b9392505050565b6000619f198261746b565b9150619f248361746b565b9250619f517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484619e3b565b90509291505056fea3646970667358221220faf32820aa4f3d9ae1cfad23a6e990e25c2bd1a7eabdcde4328759648c43594f64736f6c637827302e382e31342d63692e323032322e362e32302b636f6d6d69742e66633963623232362e6d6f646b636f6d70696c655f6d6f6461300066 \ No newline at end of file diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCContextTest.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCContextTest.java index c030d436..584106c7 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCContextTest.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020BBCContextTest.java @@ -1,6 +1,8 @@ package com.alipay.antchain.bridge.plugins.mychain020; import cn.hutool.core.util.ReflectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.alipay.antchain.bridge.commons.bbc.DefaultBBCContext; import com.alipay.antchain.bridge.commons.bbc.syscontract.ContractStatusEnum; import com.alipay.antchain.bridge.commons.bbc.syscontract.MonitorContract; @@ -9,6 +11,8 @@ import org.junit.Test; import org.slf4j.LoggerFactory; +import java.nio.charset.StandardCharsets; + import static org.mockito.Mockito.mock; public class Mychain020BBCContextTest { @@ -34,4 +38,29 @@ public void initMonitorContractShouldRestorePersistedMonitorAddress() { ContractStatusEnum.CONTRACT_DEPLOYED, context.getMonitorContractClientEVM().getStatus()); } + + @Test + public void encodeToBytesShouldExcludeRuntimeClients() { + MonitorContract persistedMonitorContract = new MonitorContract(); + persistedMonitorContract.setContractAddress("monitor_contract"); + persistedMonitorContract.setStatus(ContractStatusEnum.CONTRACT_DEPLOYED); + + DefaultBBCContext persistedContext = new DefaultBBCContext(); + persistedContext.setMonitorContract(persistedMonitorContract); + + Mychain020BBCContext context = new Mychain020BBCContext( + persistedContext, + LoggerFactory.getLogger(getClass())); + ReflectUtil.invoke(context, "initMonitorContract", mock(Mychain020Client.class)); + + JSONObject encodedContext = JSON.parseObject( + new String(context.encodeToBytes(), StandardCharsets.UTF_8)); + + Assert.assertEquals( + "monitor_contract", + encodedContext.getJSONObject("monitor_contract").getString("contractAddress")); + Assert.assertFalse(encodedContext.containsKey("monitorContractClientEVM")); + Assert.assertFalse(encodedContext.containsKey("monitorVerifierContractEVM")); + Assert.assertFalse(encodedContext.containsKey("logger")); + } } diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java index 55aef3eb..477ad25e 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/Mychain020MonitorBBCServiceTest.java @@ -11,12 +11,17 @@ import com.alipay.antchain.bridge.plugins.mychain020.contract.PtcContractEvm; import com.alipay.antchain.bridge.plugins.mychain020.contract.SDPContractClientEVM; import com.alipay.antchain.bridge.plugins.mychain020.contract.AMContractClientEVM; +import com.alipay.antchain.bridge.plugins.mychain020.model.ContractAddressInfo; import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Config; +import com.alipay.mychain.sdk.domain.account.Identity; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.slf4j.LoggerFactory; +import java.nio.charset.StandardCharsets; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.doNothing; @@ -35,6 +40,7 @@ public class Mychain020MonitorBBCServiceTest { private Mychain020BBCService service; private Mychain020BBCContext context; private Mychain020Client mychain020Client; + private Mychain020Config mychain020Config; private MonitorContractClientEVM monitorContractClientEVM; private MonitorVerifierContractEVM monitorVerifierContractEVM; private SDPContractClientEVM sdpContractClientEVM; @@ -47,6 +53,7 @@ public void setUp() { context = new Mychain020BBCContext(new DefaultBBCContext(), LoggerFactory.getLogger(getClass())); mychain020Client = mock(Mychain020Client.class); + mychain020Config = new Mychain020Config(); monitorContractClientEVM = mock(MonitorContractClientEVM.class); monitorVerifierContractEVM = mock(MonitorVerifierContractEVM.class); sdpContractClientEVM = mock(SDPContractClientEVM.class); @@ -55,6 +62,9 @@ public void setUp() { when(mychain020Client.getPrimary()).thenReturn("mychain-monitor-test"); when(mychain020Client.isTeeChain()).thenReturn(false); + when(mychain020Client.getConfig()).thenReturn(mychain020Config); + when(ptcContractEvm.ensureMonitorVerifierSupport()).thenReturn(true); + when(sdpContractClientEVM.ensureMonitorSupport()).thenReturn(true); context.setMonitorContractClientEVM(monitorContractClientEVM); context.setMonitorVerifierContractEVM(monitorVerifierContractEVM); @@ -72,7 +82,7 @@ public void setUp() { } @Test - public void setupMonitorContractShouldDeployAndWireContracts() { + public void setupMonitorContractShouldDeployAndWireContracts() throws Exception { when(monitorVerifierContractEVM.deployContract()).thenReturn(true); when(monitorContractClientEVM.deployContract()).thenReturn(true); when(monitorVerifierContractEVM.getContractAddress()).thenReturn(MONITOR_VERIFIER_CONTRACT); @@ -85,18 +95,26 @@ public void setupMonitorContractShouldDeployAndWireContracts() { verify(monitorVerifierContractEVM).deployContract(); verify(monitorContractClientEVM).deployContract(); verify(monitorContractClientEVM).setMonitorVerifier(MONITOR_VERIFIER_CONTRACT); + verify(sdpContractClientEVM).ensureMonitorSupport(); verify(monitorContractClientEVM).setProtocol(SDP_CONTRACT); verify(sdpContractClientEVM).setMonitorContract(MONITOR_CONTRACT); Assert.assertNotNull(context.getMonitorContract()); Assert.assertEquals(MONITOR_CONTRACT, context.getMonitorContract().getContractAddress()); Assert.assertEquals(ContractStatusEnum.CONTRACT_DEPLOYED, context.getMonitorContract().getStatus()); + Assert.assertEquals(MONITOR_CONTRACT, mychain020Config.getMonitorContractName()); + Assert.assertEquals(MONITOR_VERIFIER_CONTRACT, mychain020Config.getMonitorVerifierContractName()); + + Mychain020Config persistedConfig = Mychain020Config.fromJsonString( + new String(context.getConfForBlockchainClient(), StandardCharsets.UTF_8)); + Assert.assertEquals(MONITOR_CONTRACT, persistedConfig.getMonitorContractName()); + Assert.assertEquals(MONITOR_VERIFIER_CONTRACT, persistedConfig.getMonitorVerifierContractName()); } @Test public void setupMonitorContractShouldUpgradeLegacyMonitorContracts() { when(monitorContractClientEVM.getContractAddress()) .thenReturn("legacy_monitor_contract", MONITOR_CONTRACT); - when(monitorContractClientEVM.isImplementationVersionSupported()).thenReturn(false); + when(monitorContractClientEVM.ensureImplementationSupported()).thenReturn(true); when(monitorVerifierContractEVM.deployContract()).thenReturn(true); when(monitorContractClientEVM.deployContract()).thenReturn(true); when(monitorVerifierContractEVM.getContractAddress()).thenReturn(MONITOR_VERIFIER_CONTRACT); @@ -106,8 +124,8 @@ public void setupMonitorContractShouldUpgradeLegacyMonitorContracts() { service.setupMonitorContract(); - verify(monitorContractClientEVM).isImplementationVersionSupported(); - verify(monitorContractClientEVM).resetDeployment(); + verify(monitorContractClientEVM).ensureImplementationSupported(); + verify(ptcContractEvm).ensureMonitorVerifierSupport(); verify(monitorVerifierContractEVM).deployContract(); verify(monitorContractClientEVM).deployContract(); verify(monitorContractClientEVM).setMonitorVerifier(MONITOR_VERIFIER_CONTRACT); @@ -120,19 +138,46 @@ public void setupMonitorContractShouldUpgradeLegacyMonitorContracts() { @Test public void setupMonitorContractShouldReuseSupportedMonitorContracts() { when(monitorContractClientEVM.getContractAddress()).thenReturn(MONITOR_CONTRACT); - when(monitorContractClientEVM.isImplementationVersionSupported()).thenReturn(true); + when(monitorContractClientEVM.ensureImplementationSupported()).thenReturn(true); when(monitorVerifierContractEVM.deployContract()).thenReturn(true); when(monitorContractClientEVM.deployContract()).thenReturn(true); when(monitorVerifierContractEVM.getContractAddress()).thenReturn(MONITOR_VERIFIER_CONTRACT); service.setupMonitorContract(); - verify(monitorContractClientEVM).isImplementationVersionSupported(); - verify(monitorContractClientEVM, never()).resetDeployment(); + verify(monitorContractClientEVM).ensureImplementationSupported(); verify(monitorVerifierContractEVM, times(1)).deployContract(); verify(monitorContractClientEVM, times(1)).deployContract(); } + @Test(expected = RuntimeException.class) + public void setupMonitorContractShouldStopBeforeDeployWhenPtcUpgradeFails() { + when(ptcContractEvm.getContractAddress()).thenReturn(PTC_HUB_CONTRACT); + when(ptcContractEvm.ensureMonitorVerifierSupport()).thenReturn(false); + + try { + service.setupMonitorContract(); + } finally { + verify(ptcContractEvm).ensureMonitorVerifierSupport(); + verify(monitorVerifierContractEVM, never()).deployContract(); + verify(monitorContractClientEVM, never()).deployContract(); + } + } + + @Test(expected = RuntimeException.class) + public void setupMonitorContractShouldStopBeforeDeployWhenSdpUpgradeFails() { + when(sdpContractClientEVM.getContractAddress()).thenReturn(SDP_CONTRACT); + when(sdpContractClientEVM.ensureMonitorSupport()).thenReturn(false); + + try { + service.setupMonitorContract(); + } finally { + verify(sdpContractClientEVM).ensureMonitorSupport(); + verify(monitorVerifierContractEVM, never()).deployContract(); + verify(monitorContractClientEVM, never()).deployContract(); + } + } + @Test public void setProtocolShouldAutomaticallyUpgradeLegacyMonitor() { when(monitorContractClientEVM.getContractAddress()).thenReturn("legacy_monitor_contract"); @@ -193,6 +238,16 @@ public void setProtocolInMonitorShouldUseExplicitAddress() { verify(monitorContractClientEVM).setProtocol("custom_sdp_contract"); } + @Test + public void setProtocolInMonitorShouldExtractEvmAddressFromPersistedContext() { + when(monitorContractClientEVM.getContractAddress()).thenReturn(MONITOR_CONTRACT); + + service.setProtocolInMonitor( + "{\"evm\":\"sdp_evm_contract\",\"wasm\":\"sdp_wasm_contract\"}"); + + verify(monitorContractClientEVM).setProtocol("sdp_evm_contract"); + } + @Test public void setProtocolInMonitorShouldUseContextSdpAddressByDefault() { when(monitorContractClientEVM.getContractAddress()).thenReturn(MONITOR_CONTRACT); @@ -219,6 +274,15 @@ public void setMonitorContractShouldUseExplicitAddress() { verify(sdpContractClientEVM).setMonitorContract("custom_monitor_contract"); } + @Test + public void setMonitorContractShouldDecodeFormattedEvmAddress() { + when(sdpContractClientEVM.getContractAddress()).thenReturn(SDP_CONTRACT); + + service.setMonitorContract(new ContractAddressInfo(MONITOR_CONTRACT, null).toJson()); + + verify(sdpContractClientEVM).setMonitorContract(MONITOR_CONTRACT); + } + @Test public void setMonitorContractShouldUseContextMonitorAddressByDefault() { when(sdpContractClientEVM.getContractAddress()).thenReturn(SDP_CONTRACT); @@ -261,6 +325,16 @@ public void setPtcHubInMonitorVerifierShouldUseExplicitAddress() { verify(monitorVerifierContractEVM).setPtcHubAddress("custom_ptc_hub_contract"); } + @Test + public void setPtcHubInMonitorVerifierShouldExtractEvmAddressFromPersistedContext() { + when(monitorVerifierContractEVM.getContractAddress()).thenReturn(MONITOR_VERIFIER_CONTRACT); + + service.setPtcHubInMonitorVerifier( + "{\"evm\":\"ptc_evm_contract\",\"wasm\":\"\"}"); + + verify(monitorVerifierContractEVM).setPtcHubAddress("ptc_evm_contract"); + } + @Test public void setPtcHubInMonitorVerifierShouldUseContextPtcHubAddressByDefault() { when(monitorVerifierContractEVM.getContractAddress()).thenReturn(MONITOR_VERIFIER_CONTRACT); @@ -271,6 +345,18 @@ public void setPtcHubInMonitorVerifierShouldUseContextPtcHubAddressByDefault() { verify(monitorVerifierContractEVM).setPtcHubAddress(PTC_HUB_CONTRACT); } + @Test + public void setPtcHubInMonitorVerifierShouldRecoverVerifierIdentityAfterRestart() { + Identity verifierIdentity = mock(Identity.class); + when(monitorVerifierContractEVM.getContractAddress()).thenReturn(""); + when(monitorContractClientEVM.getContractAddress()).thenReturn(MONITOR_CONTRACT); + when(monitorContractClientEVM.getMonitorVerifierIdentity()).thenReturn(verifierIdentity); + + service.setPtcHubInMonitorVerifier(PTC_HUB_CONTRACT); + + verify(monitorVerifierContractEVM).setPtcHubAddress(PTC_HUB_CONTRACT, verifierIdentity); + } + @Test(expected = RuntimeException.class) public void setPtcHubInMonitorVerifierShouldRejectMissingVerifierContract() { when(monitorVerifierContractEVM.getContractAddress()).thenReturn(""); diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/MychainMonitorAppFlowTest.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/MychainMonitorAppFlowTest.java new file mode 100644 index 00000000..7416c1aa --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/MychainMonitorAppFlowTest.java @@ -0,0 +1,125 @@ +package com.alipay.antchain.bridge.plugins.mychain020; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.UUID; + +import com.alipay.antchain.bridge.commons.core.base.SendResponseResult; +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Config; +import com.alipay.mychain.sdk.api.utils.Utils; +import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.domain.account.Identity; +import com.alipay.mychain.sdk.vm.EVMParameter; +import org.bouncycastle.util.encoders.Hex; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Assume; +import org.junit.BeforeClass; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MychainMonitorAppFlowTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(MychainMonitorAppFlowTest.class); + private static final String CONTRACT_BINARY = "/contracts/monitor_demo/MonitorSenderContract.bin"; + + private static Mychain020Client client; + private static String monitorContract; + private static String receiverDomain; + private static Identity receiverIdentity; + + @BeforeClass + public static void startup() throws Exception { + Assume.assumeTrue( + "set Mychain monitor flow system properties to run this integration test", + hasRequiredProperties()); + + String configPath = requiredProperty("mychain.config.path"); + Mychain020Config config = Mychain020Config.fromJsonString( + new String(Files.readAllBytes(Paths.get(configPath)), StandardCharsets.UTF_8)); + + monitorContract = requiredProperty("mychain.monitor.contract"); + receiverDomain = requiredProperty("mychain.receiver.domain"); + String receiverIdentityHex = normalizeIdentity(requiredProperty("mychain.receiver.identity")); + receiverIdentity = new Identity(Hex.decode(receiverIdentityHex)); + + client = new Mychain020Client(config.toJsonString().getBytes(StandardCharsets.UTF_8), LOGGER); + Assert.assertTrue("startup mychain sdk failed", client.startup()); + } + + @AfterClass + public static void shutdown() { + if (client != null) { + client.shutdown(); + } + } + + @Test + public void deployConfigureAndSendNormally() { + String senderContract = "MonitorSender_" + UUID.randomUUID(); + Assert.assertTrue( + "deploy monitor sender failed", + client.deployContract(CONTRACT_BINARY, senderContract, VMTypeEnum.EVM, new EVMParameter())); + + EVMParameter configureParameters = new EVMParameter("setMonitorContract(identity)"); + configureParameters.addIdentity(Utils.getIdentityByName( + monitorContract, + client.getConfig().getMychainHashType())); + assertSuccess(client.callContract(senderContract, configureParameters, true)); + + String message = System.getProperty( + "mychain.monitor.message", + "mychain monitored demo"); + EVMParameter sendParameters = new EVMParameter("sendUnordered(identity,string,bytes)"); + sendParameters.addIdentity(receiverIdentity); + sendParameters.addString(receiverDomain); + sendParameters.addBytes(message.getBytes(StandardCharsets.UTF_8)); + SendResponseResult sendResult = client.callContract(senderContract, sendParameters, true); + assertSuccess(sendResult); + + LOGGER.info("MONITOR_APP_SENDER_CONTRACT={}", senderContract); + LOGGER.info("MONITOR_APP_SENDER_IDENTITY={}", Utils.getIdentityByName( + senderContract, + client.getConfig().getMychainHashType()).hexStrValue()); + LOGGER.info("MONITOR_APP_TX_HASH={}", sendResult.getTxId()); + LOGGER.info("MONITOR_APP_RECEIVER_DOMAIN={}", receiverDomain); + LOGGER.info("MONITOR_APP_RECEIVER_IDENTITY={}", receiverIdentity.hexStrValue()); + LOGGER.info("MONITOR_APP_MESSAGE={}", message); + } + + private static void assertSuccess(SendResponseResult result) { + Assert.assertNotNull(result); + Assert.assertTrue("transaction failed: " + result.getErrorMessage(), result.isSuccess()); + } + + private static boolean hasRequiredProperties() { + return hasProperty("mychain.config.path") + && hasProperty("mychain.monitor.contract") + && hasProperty("mychain.receiver.domain") + && hasProperty("mychain.receiver.identity"); + } + + private static boolean hasProperty(String name) { + String value = System.getProperty(name); + return value != null && !value.trim().isEmpty(); + } + + private static String normalizeIdentity(String identity) { + String normalized = identity.startsWith("0x") ? identity.substring(2) : identity; + if (normalized.length() != 64) { + throw new IllegalArgumentException("identity must contain exactly 32 bytes"); + } + return normalized; + } + + private static String requiredProperty(String name) { + String value = System.getProperty(name); + if (value == null || value.trim().isEmpty()) { + throw new IllegalArgumentException("missing system property: " + name); + } + return value.trim(); + } +} diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/MychainMonitorAppFlowTool.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/MychainMonitorAppFlowTool.java new file mode 100644 index 00000000..92ebee59 --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/MychainMonitorAppFlowTool.java @@ -0,0 +1,204 @@ +package com.alipay.antchain.bridge.plugins.mychain020; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.math.BigInteger; +import java.util.UUID; + +import com.alipay.antchain.bridge.commons.core.base.SendResponseResult; +import com.alipay.antchain.bridge.plugins.mychain020.model.ContractAddressInfo; +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Config; +import com.alipay.mychain.sdk.api.utils.Utils; +import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.domain.account.Identity; +import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; +import com.alipay.mychain.sdk.vm.EVMOutput; +import com.alipay.mychain.sdk.vm.EVMParameter; +import org.bouncycastle.util.encoders.Hex; +import org.slf4j.helpers.NOPLogger; + +public final class MychainMonitorAppFlowTool { + + private static final String CONTRACT_BINARY = "/contracts/monitor_demo/MonitorSenderContract.bin"; + + private MychainMonitorAppFlowTool() { + } + + public static void main(String[] args) throws Exception { + if (args.length < 4 || args.length > 5) { + printUsage(); + System.exit(2); + } + + String configPath = args[0]; + String monitorContract = args[1]; + String receiverDomain = args[2]; + Identity receiverIdentity = new Identity(Hex.decode(normalizeIdentity(args[3]))); + boolean diagnoseOnly = args.length == 5 && "--diagnose-only".equals(args[4]); + String message = args.length == 5 && !diagnoseOnly + ? args[4] + : "mychain monitored demo"; + + Mychain020Config config = Mychain020Config.fromJsonString( + new String(Files.readAllBytes(Paths.get(configPath)), StandardCharsets.UTF_8)); + Mychain020Client client = new Mychain020Client( + config.toJsonString().getBytes(StandardCharsets.UTF_8), + NOPLogger.NOP_LOGGER); + + try { + require(client.startup(), "startup mychain sdk failed"); + printSystemContractDiagnostics(client, config, monitorContract, receiverIdentity); + if (diagnoseOnly) { + return; + } + + String senderContract = "MonitorSender_" + UUID.randomUUID(); + System.out.println("MONITOR_APP_SENDER_CONTRACT=" + senderContract); + require( + client.deployContract(CONTRACT_BINARY, senderContract, VMTypeEnum.EVM, new EVMParameter()), + "deploy monitor sender failed"); + + EVMParameter configureParameters = new EVMParameter("setMonitorContract(identity)"); + configureParameters.addIdentity(Utils.getIdentityByName( + monitorContract, + client.getConfig().getMychainHashType())); + SendResponseResult configureResult = client.callContract(senderContract, configureParameters, true); + printResponse("MONITOR_APP_CONFIGURE", configureResult); + requireSuccess(configureResult, "configure monitor failed"); + + EVMParameter sendParameters = new EVMParameter("sendUnordered(identity,string,bytes)"); + sendParameters.addIdentity(receiverIdentity); + sendParameters.addString(receiverDomain); + sendParameters.addBytes(message.getBytes(StandardCharsets.UTF_8)); + SendResponseResult sendResult = client.callContract(senderContract, sendParameters, true); + printResponse("MONITOR_APP_SEND", sendResult); + requireSuccess(sendResult, "send monitored message failed"); + + System.out.println("MONITOR_APP_SENDER_IDENTITY=" + Utils.getIdentityByName( + senderContract, + client.getConfig().getMychainHashType()).hexStrValue()); + System.out.println("MONITOR_APP_TX_HASH=" + sendResult.getTxId()); + System.out.println("MONITOR_APP_RECEIVER_DOMAIN=" + receiverDomain); + System.out.println("MONITOR_APP_RECEIVER_IDENTITY=" + receiverIdentity.hexStrValue()); + System.out.println("MONITOR_APP_MESSAGE=" + message); + } finally { + client.shutdown(); + } + } + + private static void printSystemContractDiagnostics( + Mychain020Client client, + Mychain020Config config, + String monitorContract, + Identity receiverIdentity) { + String sdpContract = ContractAddressInfo.decode(config.getSdpContractName()).getEvmContractAddress(); + String expectedSdpIdentity = Utils.getIdentityByName( + sdpContract, + config.getMychainHashType()).hexStrValue(); + String expectedMonitorIdentity = Utils.getIdentityByName( + monitorContract, + config.getMychainHashType()).hexStrValue(); + String ptcContract = ContractAddressInfo.resolveEvmContractAddress(config.getPtcContractName()); + String monitorVerifierContract = config.getMonitorVerifierContractName(); + + BigInteger monitorControl = localCallUint(client, monitorContract, "getMonitorControl()"); + String monitorProtocol = localCallIdentity(client, monitorContract, "getProtocol()"); + String sdpMonitor = localCallIdentity(client, sdpContract, "monitorAddress()"); + + EVMParameter preMonitoringParameters = new EVMParameter("preMonitoring(identity)"); + preMonitoringParameters.addIdentity(receiverIdentity); + boolean preMonitoring = localCallBoolean(client, monitorContract, preMonitoringParameters); + + System.out.println("MYCHAIN_MONITOR_CONTROL=" + monitorControl); + System.out.println("MYCHAIN_MONITOR_PROTOCOL=" + monitorProtocol); + System.out.println("MYCHAIN_EXPECTED_SDP_IDENTITY=" + expectedSdpIdentity); + System.out.println("MYCHAIN_SDP_MONITOR=" + sdpMonitor); + System.out.println("MYCHAIN_EXPECTED_MONITOR_IDENTITY=" + expectedMonitorIdentity); + System.out.println("MYCHAIN_RECEIVER_ALLOWED=" + preMonitoring); + if (ptcContract != null && !ptcContract.isEmpty() + && monitorVerifierContract != null && !monitorVerifierContract.isEmpty()) { + System.out.println("MYCHAIN_MONITOR_VERIFIER_PTC_HUB=" + localCallIdentity( + client, + monitorVerifierContract, + "getPtcHubAddress()")); + System.out.println("MYCHAIN_EXPECTED_PTC_IDENTITY=" + Utils.getIdentityByName( + ptcContract, + config.getMychainHashType()).hexStrValue()); + } + } + + private static BigInteger localCallUint(Mychain020Client client, String contract, String method) { + TransactionReceipt receipt = localCall(client, contract, new EVMParameter(method)); + return new EVMOutput(Hex.toHexString(receipt.getOutput())).getUint(); + } + + private static String localCallIdentity(Mychain020Client client, String contract, String method) { + TransactionReceipt receipt = localCall(client, contract, new EVMParameter(method)); + return new EVMOutput(Hex.toHexString(receipt.getOutput())).getIdentity().hexStrValue(); + } + + private static boolean localCallBoolean( + Mychain020Client client, + String contract, + EVMParameter parameters) { + TransactionReceipt receipt = localCall(client, contract, parameters); + return new EVMOutput(Hex.toHexString(receipt.getOutput())).getBoolean(); + } + + private static TransactionReceipt localCall( + Mychain020Client client, + String contract, + EVMParameter parameters) { + TransactionReceipt receipt = client.localCallContract(contract, parameters); + require(receipt != null, "local call returned no receipt: " + contract); + require( + ErrorCode.SUCCESS.getErrorCode() == receipt.getResult(), + "local call failed: " + contract + ", result=" + receipt.getResult()); + require(receipt.getOutput() != null, "local call returned no output: " + contract); + return receipt; + } + + private static void printResponse(String prefix, SendResponseResult result) { + if (result == null) { + System.out.println(prefix + "_RESULT=null"); + return; + } + System.out.println(prefix + "_TX_HASH=" + result.getTxId()); + System.out.println(prefix + "_CONFIRMED=" + result.isConfirmed()); + System.out.println(prefix + "_SUCCESS=" + result.isSuccess()); + System.out.println(prefix + "_ERROR_CODE=" + result.getErrorCode()); + System.out.println(prefix + "_ERROR_MESSAGE=" + result.getErrorMessage()); + } + + private static void requireSuccess(SendResponseResult result, String action) { + require(result != null, action + ": empty response"); + require( + result.isSuccess(), + action + + ": tx=" + result.getTxId() + + ", confirmed=" + result.isConfirmed() + + ", errorCode=" + result.getErrorCode() + + ", errorMessage=" + result.getErrorMessage()); + } + + private static void require(boolean condition, String message) { + if (!condition) { + throw new IllegalStateException(message); + } + } + + private static String normalizeIdentity(String identity) { + String normalized = identity.startsWith("0x") ? identity.substring(2) : identity; + if (normalized.length() != 64) { + throw new IllegalArgumentException("receiver identity must contain exactly 32 bytes"); + } + return normalized; + } + + private static void printUsage() { + System.err.println("usage: MychainMonitorAppFlowTool [message|--diagnose-only]"); + } +} diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVMTest.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVMTest.java index 4f11bc7b..e8cb42e1 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVMTest.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/MonitorContractClientEVMTest.java @@ -11,6 +11,8 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class MonitorContractClientEVMTest { @@ -31,10 +33,10 @@ public void setUp() { } @Test - public void implementationVersionThreeShouldBeSupported() { + public void implementationVersionSixShouldBeSupported() { TransactionReceipt receipt = mock(TransactionReceipt.class); byte[] encodedVersion = new byte[32]; - encodedVersion[31] = 3; + encodedVersion[31] = 6; when(receipt.getResult()).thenReturn(0L); when(receipt.getOutput()).thenReturn(encodedVersion); @@ -52,10 +54,27 @@ public void legacyContractWithoutVersionMethodShouldNotBeSupported() { } @Test - public void resetDeploymentShouldClearAddressAndStatus() { - monitorContractClient.resetDeployment(); + public void legacyContractShouldBeUpgradedInPlace() { + TransactionReceipt legacyReceipt = mock(TransactionReceipt.class); + when(legacyReceipt.getResult()).thenReturn(10201L); - Assert.assertNull(monitorContractClient.getContractAddress()); - Assert.assertNull(monitorContractClient.getStatus()); + TransactionReceipt upgradedReceipt = mock(TransactionReceipt.class); + byte[] encodedVersion = new byte[32]; + encodedVersion[31] = 6; + when(upgradedReceipt.getResult()).thenReturn(0L); + when(upgradedReceipt.getOutput()).thenReturn(encodedVersion); + + when(mychain020Client.localCallContract(eq(MONITOR_CONTRACT), any())) + .thenReturn(legacyReceipt, upgradedReceipt); + when(mychain020Client.upgradeContract(any(String.class), eq(MONITOR_CONTRACT), eq(com.alipay.mychain.sdk.common.VMTypeEnum.EVM))) + .thenReturn(true); + + Assert.assertTrue(monitorContractClient.ensureImplementationSupported()); + + Assert.assertEquals(MONITOR_CONTRACT, monitorContractClient.getContractAddress()); + verify(mychain020Client, times(1)).upgradeContract( + eq("/contract/v1/solidity/Monitor.bin-runtime"), + eq(MONITOR_CONTRACT), + eq(com.alipay.mychain.sdk.common.VMTypeEnum.EVM)); } } diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvmTest.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvmTest.java index c9d0d27a..8453ea6b 100644 --- a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvmTest.java +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/PtcContractEvmTest.java @@ -1,9 +1,15 @@ package com.alipay.antchain.bridge.plugins.mychain020.contract; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import com.alipay.antchain.bridge.commons.bbc.syscontract.ContractStatusEnum; import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; +import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; @@ -21,4 +27,119 @@ public void shouldRestoreReadyStatusForPredeployedContract() { Assert.assertTrue(contract.deployContract("unused-for-predeployed-contract")); Assert.assertEquals(ContractStatusEnum.CONTRACT_READY, contract.getStatus()); } + + @Test + public void shouldUpgradeLegacyPtcHubAndVerifyMonitorSupport() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt legacyReceipt = mock(TransactionReceipt.class); + TransactionReceipt upgradedReceipt = mock(TransactionReceipt.class); + when(legacyReceipt.getResult()).thenReturn(10201L); + when(upgradedReceipt.getResult()).thenReturn((long) ErrorCode.SUCCESS.getErrorCode()); + when(upgradedReceipt.getOutput()).thenReturn(new byte[32]); + when(client.localCallContract(eq("legacy_ptc_hub"), org.mockito.ArgumentMatchers.any())) + .thenReturn(legacyReceipt, upgradedReceipt); + when(client.upgradeContract( + "/contract/v1/solidity/PtcHub.bin-runtime", + "legacy_ptc_hub", + VMTypeEnum.EVM)).thenReturn(true); + + PtcContractEvm contract = new PtcContractEvm(client, mock(Logger.class)); + contract.setContractAddress("legacy_ptc_hub"); + + Assert.assertTrue(contract.ensureMonitorVerifierSupport()); + verify(client).upgradeContract( + "/contract/v1/solidity/PtcHub.bin-runtime", + "legacy_ptc_hub", + VMTypeEnum.EVM); + } + + @Test + public void shouldNotUpgradePtcHubThatAlreadySupportsMonitor() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt receipt = mock(TransactionReceipt.class); + when(receipt.getResult()).thenReturn((long) ErrorCode.SUCCESS.getErrorCode()); + when(receipt.getOutput()).thenReturn(new byte[32]); + when(client.localCallContract(eq("current_ptc_hub"), org.mockito.ArgumentMatchers.any())) + .thenReturn(receipt); + + PtcContractEvm contract = new PtcContractEvm(client, mock(Logger.class)); + contract.setContractAddress("current_ptc_hub"); + + Assert.assertTrue(contract.ensureMonitorVerifierSupport()); + verify(client, org.mockito.Mockito.never()).upgradeContract( + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.any(VMTypeEnum.class)); + } + + @Test(expected = IllegalStateException.class) + public void shouldNotUpgradeWhenCapabilityProbeFailsUnexpectedly() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt receipt = mock(TransactionReceipt.class); + when(receipt.getResult()).thenReturn(99L); + when(client.localCallContract(eq("unreachable_ptc_hub"), org.mockito.ArgumentMatchers.any())) + .thenReturn(receipt); + + PtcContractEvm contract = new PtcContractEvm(client, mock(Logger.class)); + contract.setContractAddress("unreachable_ptc_hub"); + + try { + contract.ensureMonitorVerifierSupport(); + } finally { + verify(client, org.mockito.Mockito.never()).upgradeContract( + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.any(VMTypeEnum.class)); + } + } + + @Test + public void shouldPackageMonitorEnabledPtcRuntime() { + Assert.assertNotNull(PtcContractEvm.class.getResourceAsStream( + "/contract/v1/solidity/PtcHub.bin-runtime")); + } + + @Test + public void shouldUpgradeLegacyPtcHubForRootReconciliation() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt legacyReceipt = mock(TransactionReceipt.class); + TransactionReceipt upgradedReceipt = mock(TransactionReceipt.class); + when(legacyReceipt.getResult()).thenReturn(10201L); + when(upgradedReceipt.getResult()).thenReturn((long) ErrorCode.SUCCESS.getErrorCode()); + when(upgradedReceipt.getOutput()).thenReturn(new byte[] {2}); + when(client.localCallContract(eq("legacy_root_ptc_hub"), org.mockito.ArgumentMatchers.any())) + .thenReturn(legacyReceipt, upgradedReceipt); + when(client.upgradeContract( + "/contract/v1/solidity/PtcHub.bin-runtime", + "legacy_root_ptc_hub", + VMTypeEnum.EVM)).thenReturn(true); + + PtcContractEvm contract = new PtcContractEvm(client, mock(Logger.class)); + contract.setContractAddress("legacy_root_ptc_hub"); + + Assert.assertTrue(contract.ensureRootReconciliationSupport()); + verify(client).upgradeContract( + "/contract/v1/solidity/PtcHub.bin-runtime", + "legacy_root_ptc_hub", + VMTypeEnum.EVM); + } + + @Test + public void shouldKeepCurrentPtcHubForRootReconciliation() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt receipt = mock(TransactionReceipt.class); + when(receipt.getResult()).thenReturn((long) ErrorCode.SUCCESS.getErrorCode()); + when(receipt.getOutput()).thenReturn(new byte[] {2}); + when(client.localCallContract(eq("current_root_ptc_hub"), org.mockito.ArgumentMatchers.any())) + .thenReturn(receipt); + + PtcContractEvm contract = new PtcContractEvm(client, mock(Logger.class)); + contract.setContractAddress("current_root_ptc_hub"); + + Assert.assertTrue(contract.ensureRootReconciliationSupport()); + verify(client, org.mockito.Mockito.never()).upgradeContract( + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.any(VMTypeEnum.class)); + } } diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVMTest.java b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVMTest.java new file mode 100644 index 00000000..48def0c8 --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/java/com/alipay/antchain/bridge/plugins/mychain020/contract/SDPContractClientEVMTest.java @@ -0,0 +1,94 @@ +package com.alipay.antchain.bridge.plugins.mychain020.contract; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; +import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; +import org.junit.Assert; +import org.junit.Test; +import org.slf4j.Logger; + +public class SDPContractClientEVMTest { + + @Test + public void shouldUpgradeLegacySdpAndVerifyMonitorSupport() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt legacyReceipt = mock(TransactionReceipt.class); + TransactionReceipt upgradedReceipt = mock(TransactionReceipt.class); + when(legacyReceipt.getResult()).thenReturn(10201L); + when(upgradedReceipt.getResult()).thenReturn((long) ErrorCode.SUCCESS.getErrorCode()); + when(upgradedReceipt.getOutput()).thenReturn(uint256(4)); + when(client.localCallContract(eq("legacy_sdp"), org.mockito.ArgumentMatchers.any())) + .thenReturn(legacyReceipt, upgradedReceipt); + when(client.upgradeContract( + "/contract/v1/solidity/SDPMsg.bin-runtime", + "legacy_sdp", + VMTypeEnum.EVM)).thenReturn(true); + + SDPContractClientEVM contract = new SDPContractClientEVM(client, mock(Logger.class)); + contract.setContractAddress("legacy_sdp"); + + Assert.assertTrue(contract.ensureMonitorSupport()); + verify(client).upgradeContract( + "/contract/v1/solidity/SDPMsg.bin-runtime", + "legacy_sdp", + VMTypeEnum.EVM); + } + + @Test + public void shouldNotUpgradeSdpThatAlreadySupportsMonitor() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt receipt = mock(TransactionReceipt.class); + when(receipt.getResult()).thenReturn((long) ErrorCode.SUCCESS.getErrorCode()); + when(receipt.getOutput()).thenReturn(uint256(4)); + when(client.localCallContract(eq("current_sdp"), org.mockito.ArgumentMatchers.any())) + .thenReturn(receipt); + + SDPContractClientEVM contract = new SDPContractClientEVM(client, mock(Logger.class)); + contract.setContractAddress("current_sdp"); + + Assert.assertTrue(contract.ensureMonitorSupport()); + verify(client, org.mockito.Mockito.never()).upgradeContract( + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.any(VMTypeEnum.class)); + } + + @Test(expected = IllegalStateException.class) + public void shouldNotUpgradeWhenCapabilityProbeFailsUnexpectedly() { + Mychain020Client client = mock(Mychain020Client.class); + TransactionReceipt receipt = mock(TransactionReceipt.class); + when(receipt.getResult()).thenReturn(99L); + when(client.localCallContract(eq("unreachable_sdp"), org.mockito.ArgumentMatchers.any())) + .thenReturn(receipt); + + SDPContractClientEVM contract = new SDPContractClientEVM(client, mock(Logger.class)); + contract.setContractAddress("unreachable_sdp"); + + try { + contract.ensureMonitorSupport(); + } finally { + verify(client, org.mockito.Mockito.never()).upgradeContract( + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.anyString(), + org.mockito.ArgumentMatchers.any(VMTypeEnum.class)); + } + } + + @Test + public void shouldPackageMonitorEnabledSdpRuntime() { + Assert.assertNotNull(SDPContractClientEVM.class.getResourceAsStream( + "/contract/v1/solidity/SDPMsg.bin-runtime")); + } + + private static byte[] uint256(int value) { + byte[] encoded = new byte[32]; + encoded[31] = (byte) value; + return encoded; + } +} diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/resources/contracts/monitor_demo/MonitorSenderContract.bin b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/resources/contracts/monitor_demo/MonitorSenderContract.bin new file mode 100644 index 00000000..2b12db90 --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/resources/contracts/monitor_demo/MonitorSenderContract.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b506105d2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063c5eb3d0314610046578063e552109214610062578063eaa71e9014610080575b600080fd5b610060600480360381019061005b91906102e5565b61009c565b005b61006a610185565b6040516100779190610389565b60405180910390f35b61009a600480360381019061009591906103a4565b61018b565b005b60008054036100e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d79061042e565b60405180910390fd5b600054634c63280e85858886866040518663ffffffff1660e01b815260040161010d9594939291906104d9565b600060405180830381600087803b15801561012757600080fd5b505af115801561013b573d6000803e3d6000fd5b505050507f144ffb040c75950ab6f737912affbd8eaf02d2258beead1b75079806f82a98b684848785856040516101769594939291906104d9565b60405180910390a15050505050565b60005481565b600081036101ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101c59061056e565b60405180910390fd5b8060008190555050565b600080fd5b600080fd5b6000819050919050565b60006101f7826101e2565b9050919050565b610207816101ec565b811461021257600080fd5b50565b600081359050610224816101fe565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261024f5761024e61022a565b5b8235905067ffffffffffffffff81111561026c5761026b61022f565b5b60208301915083600182028301111561028857610287610234565b5b9250929050565b60008083601f8401126102a5576102a461022a565b5b8235905067ffffffffffffffff8111156102c2576102c161022f565b5b6020830191508360018202830111156102de576102dd610234565b5b9250929050565b600080600080600060608688031215610301576103006101d8565b5b600061030f88828901610215565b955050602086013567ffffffffffffffff8111156103305761032f6101dd565b5b61033c88828901610239565b9450945050604086013567ffffffffffffffff81111561035f5761035e6101dd565b5b61036b8882890161028f565b92509250509295509295909350565b610383816101ec565b82525050565b600060208201905061039e600083018461037a565b92915050565b6000602082840312156103ba576103b96101d8565b5b60006103c884828501610215565b91505092915050565b600082825260208201905092915050565b7f4d6f6e69746f7253656e6465723a206d6f6e69746f72206e6f74207365740000600082015250565b6000610418601e836103d1565b9150610423826103e2565b602082019050919050565b600060208201905081810360008301526104478161040b565b9050919050565b82818337600083830152505050565b6000601f19601f8301169050919050565b600061047a83856103d1565b935061048783858461044e565b6104908361045d565b840190509392505050565b600082825260208201905092915050565b60006104b8838561049b565b93506104c583858461044e565b6104ce8361045d565b840190509392505050565b600060608201905081810360008301526104f481878961046e565b9050610503602083018661037a565b81810360408301526105168184866104ac565b90509695505050505050565b7f4d6f6e69746f7253656e6465723a20696e76616c6964206d6f6e69746f720000600082015250565b6000610558601e836103d1565b915061056382610522565b602082019050919050565b600060208201905081810360008301526105878161054b565b905091905056fea36469706673582212202ac76839005fe02a0313c8da16eb0b48f0adb32d4a0b5d8d1b97a748c7f19e7464736f6c634300080e6b636f6d70696c655f6d6f6461300041 diff --git a/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/resources/contracts/monitor_demo/MonitorV123SenderContract.bin b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/resources/contracts/monitor_demo/MonitorV123SenderContract.bin new file mode 100644 index 00000000..e0446bbc --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/offchain-plugin/src/test/resources/contracts/monitor_demo/MonitorV123SenderContract.bin @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50610b38806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c8063387868ae1461006757806387b2726e14610085578063c55ae476146100b5578063c5eb3d03146100d1578063d769eaa9146100ed578063e55210921461011d575b600080fd5b61006f61013b565b60405161007c9190610374565b60405180910390f35b61009f600480360381019061009a919061051d565b610141565b6040516100ac9190610605565b60405180910390f35b6100cf60048036038101906100ca9190610620565b6101c6565b005b6100eb60048036038101906100e69190610660565b61025e565b005b610107600480360381019061010291906106f5565b6102c4565b6040516101149190610605565b60405180910390f35b610125610343565b6040516101329190610374565b60405180910390f35b60005481565b6000805463db37c08b89898c8a8a8a8a8a6040518963ffffffff1660e01b8152600401610175989796959493929190610865565b6020604051808303816000875af1158015610194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101b89190610904565b905098975050505050505050565b60008203610209576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102009061097d565b60405180910390fd5b6000810361024c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024390610a0f565b60405180910390fd5b81600081905550806001819055505050565b600154634c63280e85858886866040518663ffffffff1660e01b815260040161028b959493929190610a2f565b600060405180830381600087803b1580156102a557600080fd5b505af11580156102b9573d6000803e3d6000fd5b505050505050505050565b6000805463343e779287878a8888886040518763ffffffff1660e01b81526004016102f496959493929190610a78565b6020604051808303816000875af1158015610313573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103379190610904565b90509695505050505050565b60015481565b6000819050919050565b600061035e82610349565b9050919050565b61036e81610353565b82525050565b60006020820190506103896000830184610365565b92915050565b600080fd5b600080fd5b6103a281610353565b81146103ad57600080fd5b50565b6000813590506103bf81610399565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126103ea576103e96103c5565b5b8235905067ffffffffffffffff811115610407576104066103ca565b5b602083019150836001820283011115610423576104226103cf565b5b9250929050565b60008115159050919050565b61043f8161042a565b811461044a57600080fd5b50565b60008135905061045c81610436565b92915050565b60008083601f840112610478576104776103c5565b5b8235905067ffffffffffffffff811115610495576104946103ca565b5b6020830191508360018202830111156104b1576104b06103cf565b5b9250929050565b600060ff82169050919050565b6104ce816104b8565b81146104d957600080fd5b50565b6000813590506104eb816104c5565b92915050565b6104fa81610349565b811461050557600080fd5b50565b600081359050610517816104f1565b92915050565b60008060008060008060008060c0898b03121561053d5761053c61038f565b5b600061054b8b828c016103b0565b985050602089013567ffffffffffffffff81111561056c5761056b610394565b5b6105788b828c016103d4565b9750975050604061058b8b828c0161044d565b955050606089013567ffffffffffffffff8111156105ac576105ab610394565b5b6105b88b828c01610462565b945094505060806105cb8b828c016104dc565b92505060a06105dc8b828c01610508565b9150509295985092959890939650565b6000819050919050565b6105ff816105ec565b82525050565b600060208201905061061a60008301846105f6565b92915050565b600080604083850312156106375761063661038f565b5b6000610645858286016103b0565b9250506020610656858286016103b0565b9150509250929050565b60008060008060006060868803121561067c5761067b61038f565b5b600061068a888289016103b0565b955050602086013567ffffffffffffffff8111156106ab576106aa610394565b5b6106b7888289016103d4565b9450945050604086013567ffffffffffffffff8111156106da576106d9610394565b5b6106e688828901610462565b92509250509295509295909350565b600080600080600080608087890312156107125761071161038f565b5b600061072089828a016103b0565b965050602087013567ffffffffffffffff81111561074157610740610394565b5b61074d89828a016103d4565b9550955050604061076089828a0161044d565b935050606087013567ffffffffffffffff81111561078157610780610394565b5b61078d89828a01610462565b92509250509295509295509295565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006107d9838561079c565b93506107e68385846107ad565b6107ef836107bc565b840190509392505050565b6108038161042a565b82525050565b600082825260208201905092915050565b60006108268385610809565b93506108338385846107ad565b61083c836107bc565b840190509392505050565b610850816104b8565b82525050565b61085f81610349565b82525050565b600060c0820190508181036000830152610880818a8c6107cd565b905061088f6020830189610365565b61089c60408301886107fa565b81810360608301526108af81868861081a565b90506108be6080830185610847565b6108cb60a0830184610856565b9998505050505050505050565b6108e1816105ec565b81146108ec57600080fd5b50565b6000815190506108fe816108d8565b92915050565b60006020828403121561091a5761091961038f565b5b6000610928848285016108ef565b91505092915050565b7f4d6f6e69746f725631323353656e6465723a20696e76616c6964205344500000600082015250565b6000610967601e8361079c565b915061097282610931565b602082019050919050565b600060208201905081810360008301526109968161095a565b9050919050565b7f4d6f6e69746f725631323353656e6465723a20696e76616c6964204d6f6e697460008201527f6f72000000000000000000000000000000000000000000000000000000000000602082015250565b60006109f960228361079c565b9150610a048261099d565b604082019050919050565b60006020820190508181036000830152610a28816109ec565b9050919050565b60006060820190508181036000830152610a4a8187896107cd565b9050610a596020830186610365565b8181036040830152610a6c81848661081a565b90509695505050505050565b60006080820190508181036000830152610a9381888a6107cd565b9050610aa26020830187610365565b610aaf60408301866107fa565b8181036060830152610ac281848661081a565b905097965050505050505056fea36469706673582212204928438f4b593abbe616e30a023342a5ffb69e48c2c647a1c5d65199d2dddac064736f6c637827302e382e31342d63692e323032322e362e32302b636f6d6d69742e66633963623232362e6d6f646b636f6d70696c655f6d6f6461300066 \ No newline at end of file diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/README.md b/acb-sdk/pluginset/mychain0.20/onchain-plugin/README.md index fa4feb4f..36295172 100644 --- a/acb-sdk/pluginset/mychain0.20/onchain-plugin/README.md +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/README.md @@ -11,13 +11,20 @@ ## Mychain020 BBC监管系统合约(solidity) 本目录是在`mychain0.10`基础系统合约之上增加 Monitor 和 MonitorVerifier 的监管版合约库,适配同一 Mychain 0.10 链环境。 -合约编译依赖`0.4.24`版本的[`solc`编译器](https://antdigital.com/docs/11/101793#h2--solc-5:~:text=%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%E3%80%82-,%E4%BA%8C%E8%BF%9B%E5%88%B6%C2%A0solc%C2%A0%E7%BC%96%E8%AF%91%E5%B7%A5%E5%85%B7,-solc%2Djs%C2%A0%E7%BC%96%E8%AF%91) -和[`solc-js`编译器](https://antdigital.com/docs/11/101793#h2--solc-js1:~:text=%E8%BF%9B%E8%A1%8C%E7%AE%80%E8%A6%81%E8%AF%B4%E6%98%8E%E3%80%82-,%E4%B8%8B%E8%BD%BD%C2%A0solc%2Djs,-%E5%8D%95%E5%87%BB%E6%AD%A4%E5%A4%84) +合约编译使用蚂蚁链官方发布的 +[`@antchain/mysolidity`](https://www.npmjs.com/package/@antchain/mysolidity) 1.3.0,并固定选择 +Mychain Solidity 0.8.14 编译器。可先执行 `npm install -g @antchain/mysolidity@1.3.0`; +如果本机没有 `mysolc`,编译脚本会使用锁定版本的 `npx` 命令。 执行`onchain-plugin/solidity/v1`目录下的`compile_evm_all.sh`脚本可以编译 v1 EVM 合约, 并将编译生成的`*.bin`(用于合约部署)和`*_runtime.bin`(用于合约升级) 自动更新到`offchain-plugin/src/main/resources/contract/v1/solidity`目录。监管合约新增后, 该脚本也会生成并拷贝`Monitor_sol_Monitor.bin`和`MonitorVerifier_sol_MonitorVerifier.bin`。 +也可以指定合约名定向编译,例如 `./compile_evm_all.sh Monitor SDPMsg`。 +脚本同时生成部署字节码和运行时字节码,避免生成 +无法升级历史系统合约的插件包。监管版 PTC Hub 和 SDP 都只在旧版存储布局末尾追加监管 +字段,因此插件会在初始化监管合约前原位升级旧合约,并保留其合约身份、信任数据、域名、 +消息序号及已验证区块状态。 ## Mychain BBC系统合约(c++) diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/Monitor.sol b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/Monitor.sol index 7159e56f..dc52cb17 100644 --- a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/Monitor.sol +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/Monitor.sol @@ -3,13 +3,15 @@ pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; import "./interfaces/ISDPMessage.sol"; +import "./interfaces/IContractUsingSDP.sol"; +import "./interfaces/IContractWithAcks.sol"; import "./interfaces/IMonitorVerifier.sol"; import "./lib/utils/Ownable.sol"; import "./lib/utils/SizeOf.sol"; import "./lib/utils/TypesToBytes.sol"; contract Monitor is Ownable { - uint32 public constant IMPLEMENTATION_VERSION = 3; + uint32 public constant IMPLEMENTATION_VERSION = 6; uint32 public constant MONITOR_CLOSE = 1; uint32 public constant MONITOR_OPEN = 2; uint32 public constant MONITOR_ROLLBACK = 3; @@ -35,6 +37,18 @@ contract Monitor is Ownable { uint32 monitorControl ); event MonitorMessageSent(identity indexed sender, string receiverDomain, identity receiverID, uint32 monitorType); + event MonitorMessageReceived( + string senderDomain, + identity indexed sender, + identity indexed receiver, + uint32 monitorType, + bool unordered + ); + + modifier onlySubProtocol() { + require(msg.sender == sdpAddress, "Monitor: sender is not sdp"); + _; + } constructor() { monitorControl = MONITOR_OPEN; @@ -75,7 +89,9 @@ contract Monitor is Ownable { identity receiverID, bytes calldata message ) external { - require(_preMonitoring(receiverID), "Monitor: pre monitoring blocked"); + if (monitorControl == MONITOR_OPEN) { + require(_preMonitoring(msg.sender, receiverID), "Monitor: pre monitoring blocked"); + } bytes memory rawMonitorMessage = _encodeMonitorMessage(monitorControl, message); ISDPMessage(sdpAddress).sendMessageFromMonitor(receiverDomain, receiverID, msg.sender, rawMonitorMessage); emit MonitorMessageSent(msg.sender, receiverDomain, receiverID, monitorControl); @@ -86,12 +102,186 @@ contract Monitor is Ownable { identity receiverID, bytes calldata message ) external { - require(_preMonitoring(receiverID), "Monitor: pre monitoring blocked"); + if (monitorControl == MONITOR_OPEN) { + require(_preMonitoring(msg.sender, receiverID), "Monitor: pre monitoring blocked"); + } bytes memory rawMonitorMessage = _encodeMonitorMessage(monitorControl, message); ISDPMessage(sdpAddress).sendUnorderedMessageFromMonitor(receiverDomain, receiverID, msg.sender, rawMonitorMessage); emit MonitorMessageSent(msg.sender, receiverDomain, receiverID, monitorControl); } + function sendMonitorMessageV2( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message + ) external onlySubProtocol returns (bytes32) { + bytes memory rawMessage = _prepareMonitoredMessage(senderID, receiverID, message); + return ISDPMessage(sdpAddress).sendMessageV2FromMonitor( + receiverDomain, receiverID, senderID, atomic, rawMessage + ); + } + + function sendUnorderedMonitorMessageV2( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message + ) external onlySubProtocol returns (bytes32) { + bytes memory rawMessage = _prepareMonitoredMessage(senderID, receiverID, message); + return ISDPMessage(sdpAddress).sendUnorderedMessageV2FromMonitor( + receiverDomain, receiverID, senderID, atomic, rawMessage + ); + } + + function sendMonitorMessageV3( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message, + uint8 timeoutMeasure, + uint256 timeout + ) external onlySubProtocol returns (bytes32) { + bytes memory rawMessage = _prepareMonitoredMessage(senderID, receiverID, message); + return ISDPMessage(sdpAddress).sendMessageV3FromMonitor( + receiverDomain, receiverID, senderID, atomic, rawMessage, timeoutMeasure, timeout + ); + } + + function sendUnorderedMonitorMessageV3( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message, + uint8 timeoutMeasure, + uint256 timeout + ) external onlySubProtocol returns (bytes32) { + bytes memory rawMessage = _prepareMonitoredMessage(senderID, receiverID, message); + return ISDPMessage(sdpAddress).sendUnorderedMessageV3FromMonitor( + receiverDomain, receiverID, senderID, atomic, rawMessage, timeoutMeasure, timeout + ); + } + + function _prepareMonitoredMessage( + identity senderID, + identity receiverID, + bytes calldata message + ) internal view returns (bytes memory) { + if (monitorControl == MONITOR_OPEN) { + require(_preMonitoring(senderID, receiverID), "Monitor: pre monitoring blocked"); + } + return _encodeMonitorMessage(monitorControl, message); + } + + function recvMessageFromSDP( + string calldata senderDomain, + identity author, + identity receiverID, + bytes calldata rawMessage + ) external onlySubProtocol { + (uint32 monitorType, bytes memory message) = _decodeMonitorMessage(rawMessage); + IContractUsingSDP(receiverID).recvMessage(senderDomain, author, message); + emit MonitorMessageReceived(senderDomain, author, receiverID, monitorType, false); + } + + function recvUnorderedMessageFromSDP( + string calldata senderDomain, + identity author, + identity receiverID, + bytes calldata rawMessage + ) external onlySubProtocol { + (uint32 monitorType, bytes memory message) = _decodeMonitorMessage(rawMessage); + IContractUsingSDP(receiverID).recvUnorderedMessage(senderDomain, author, message); + emit MonitorMessageReceived(senderDomain, author, receiverID, monitorType, true); + } + + function recvUnorderedMessageV2FromSDP( + string calldata senderDomain, + identity author, + identity receiverID, + bytes calldata rawMessage + ) external onlySubProtocol { + _recvVersionedMessage(senderDomain, author, receiverID, rawMessage, true); + } + + function recvMessageV2FromSDP( + string calldata senderDomain, + identity author, + identity receiverID, + bytes calldata rawMessage + ) external onlySubProtocol { + _recvVersionedMessage(senderDomain, author, receiverID, rawMessage, false); + } + + function recvUnorderedMessageV3FromSDP( + string calldata senderDomain, + identity author, + identity receiverID, + bytes calldata rawMessage + ) external onlySubProtocol { + _recvVersionedMessage(senderDomain, author, receiverID, rawMessage, true); + } + + function recvMessageV3FromSDP( + string calldata senderDomain, + identity author, + identity receiverID, + bytes calldata rawMessage + ) external onlySubProtocol { + _recvVersionedMessage(senderDomain, author, receiverID, rawMessage, false); + } + + function _recvVersionedMessage( + string memory senderDomain, + identity author, + identity receiverID, + bytes memory rawMessage, + bool unordered + ) internal { + (uint32 monitorType, bytes memory message) = _decodeMonitorMessage(rawMessage); + if (unordered) { + IContractUsingSDP(receiverID).recvUnorderedMessage(senderDomain, author, message); + } else { + IContractUsingSDP(receiverID).recvMessage(senderDomain, author, message); + } + emit MonitorMessageReceived(senderDomain, author, receiverID, monitorType, unordered); + } + + function ackOnSuccessFromSDP( + identity receiverID, + bytes32 messageId, + string memory receiverDomain, + identity receiver, + uint32 sequence, + uint64 nonce, + bytes memory rawMessage + ) external onlySubProtocol { + (, bytes memory message) = _decodeMonitorMessage(rawMessage); + IContractWithAcks(receiverID).ackOnSuccess( + messageId, receiverDomain, receiver, sequence, nonce, message + ); + } + + function ackOnErrorFromSDP( + identity receiverID, + bytes32 messageId, + string memory receiverDomain, + identity receiver, + uint32 sequence, + uint64 nonce, + bytes memory rawMessage, + string memory errorMsg + ) external onlySubProtocol { + (, bytes memory message) = _decodeMonitorMessage(rawMessage); + IContractWithAcks(receiverID).ackOnError( + messageId, receiverDomain, receiver, sequence, nonce, message, errorMsg + ); + } + function _encodeMonitorMessage(uint32 monitorType, bytes memory message) internal pure returns (bytes memory) { bytes memory monitorMsg = new bytes(0); uint256 monitorMsgSize = SizeOf.sizeOfBytes(monitorMsg); @@ -109,8 +299,75 @@ contract Monitor is Ownable { return rawMessage; } + function _decodeMonitorMessage(bytes memory rawMessage) + internal + pure + returns (uint32 monitorType, bytes memory message) + { + uint256 offset = rawMessage.length; + require(offset >= 68, "Monitor: malformed monitor message"); + + monitorType = _readUint32AtEnd(rawMessage, offset); + require( + monitorType == MONITOR_CLOSE || monitorType == MONITOR_OPEN || monitorType == MONITOR_ROLLBACK, + "Monitor: invalid monitor type" + ); + offset -= SizeOf.sizeOfUint(32); + + bytes memory monitorMsg; + (monitorMsg, offset) = _decodeReversePaddedBytes(rawMessage, offset); + (message, offset) = _decodeReversePaddedBytes(rawMessage, offset); + require(offset == 0, "Monitor: trailing monitor message data"); + } + + /** + * Monitor envelopes use the legacy ACB EVM codec: a 32-byte length word + * follows reverse-ordered 32-byte payload chunks. The assembly helper used + * by the original Mychain runtime copied non-word-aligned payloads over the + * bytes length slot, so a 36-byte body arrived as its last four bytes plus + * zero padding. Decode explicitly by byte to preserve the exact business + * payload across Ethereum/FISCO/Mychain compilers. + */ + function _decodeReversePaddedBytes(bytes memory rawMessage, uint256 endOffset) + internal + pure + returns (bytes memory value, uint256 nextOffset) + { + require(endOffset >= 32, "Monitor: malformed variable bytes"); + uint256 length = uint256(_readUint32AtEnd(rawMessage, endOffset)); + uint256 wordCount = (length + 31) / 32; + uint256 paddedLength = wordCount * 32; + require(endOffset >= 32 + paddedLength, "Monitor: variable bytes out of bounds"); + + nextOffset = endOffset - 32 - paddedLength; + value = new bytes(length); + for (uint256 logicalWord = 0; logicalWord < wordCount; logicalWord++) { + uint256 sourceOffset = nextOffset + (wordCount - 1 - logicalWord) * 32; + uint256 targetOffset = logicalWord * 32; + uint256 copyLength = length - targetOffset; + if (copyLength > 32) { + copyLength = 32; + } + for (uint256 i = 0; i < copyLength; i++) { + value[targetOffset + i] = rawMessage[sourceOffset + i]; + } + } + } + + function _readUint32AtEnd(bytes memory rawMessage, uint256 endOffset) + internal + pure + returns (uint32) + { + require(endOffset >= 4 && endOffset <= rawMessage.length, "Monitor: uint32 out of bounds"); + return (uint32(uint8(rawMessage[endOffset - 4])) << 24) + | (uint32(uint8(rawMessage[endOffset - 3])) << 16) + | (uint32(uint8(rawMessage[endOffset - 2])) << 8) + | uint32(uint8(rawMessage[endOffset - 1])); + } + function preMonitoring(identity receiverID) external view returns (bool) { - return _preMonitoring(receiverID); + return monitorControl != MONITOR_OPEN || _preMonitoring(msg.sender, receiverID); } function recvMonitorOrder( @@ -135,9 +392,8 @@ contract Monitor is Ownable { receiverBlacklist[receiver] = blocked; } - function _preMonitoring(identity receiverID) internal view returns (bool) { - require(monitorControl != MONITOR_CLOSE, "Monitor: monitor closed"); - if (senderBlacklist[bytes32(msg.sender)]) { + function _preMonitoring(identity senderID, identity receiverID) internal view returns (bool) { + if (senderBlacklist[bytes32(senderID)]) { return false; } if (receiverBlacklist[bytes32(receiverID)]) { diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/PtcHub.sol b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/PtcHub.sol index b6509562..c4293b92 100644 --- a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/PtcHub.sol +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/PtcHub.sol @@ -49,6 +49,20 @@ contract PtcHub is IPtcHub, Ownable { _initBcdns(rawRootBcdnsCert); } + function getImplementationVersion() external pure returns (uint32) { + return 2; + } + + /** + * Reconcile a legacy deployment with the BCDNS root used by the current + * Relayer. Runtime upgrades preserve storage and do not run constructors, + * so an explicit owner-only operation is required when the configured root + * changed after the PTC Hub was first deployed. + */ + function reconcileRootBcdnsCert(bytes calldata rawRootBcdnsCert) external onlyOwner { + _initBcdns(rawRootBcdnsCert); + } + function _initBcdns(bytes memory rawRootBcdnsCert) internal { CrossChainCertificate memory rootBcdnsCert = AcbCommons .decodeCrossChainCertificateFrom(rawRootBcdnsCert); diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/SDPMsg.sol b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/SDPMsg.sol index 4f7c756a..cc247eb5 100644 --- a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/SDPMsg.sol +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/SDPMsg.sol @@ -4,13 +4,19 @@ pragma solidity ^0.8.0; import "./interfaces/ISDPMessage.sol"; import "./interfaces/IAuthMessage.sol"; import "./interfaces/IContractUsingSDP.sol"; +import "./interfaces/IContractUsingMonitor.sol"; import "./interfaces/IContractWithAcks.sol"; +import "./interfaces/IMonitor.sol"; import "./lib/sdp/SDPLib.sol"; import "./lib/utils/Ownable.sol"; contract SDPMsg is ISDPMessage, Ownable { + // Version 4 fixes the ordered receive dispatch: SDP V1 must call the V1 + // Monitor entry point and SDP V2 must call the V2 entry point. + uint32 private constant MONITOR_ROUTING_VERSION = 4; + using SDPLib for SDPMessage; using SDPLib for SDPMessageV2; using SDPLib for SDPMessageV3; @@ -18,8 +24,6 @@ contract SDPMsg is ISDPMessage, Ownable { identity public amAddress; - identity public monitorAddress; - bytes32 public localDomainHash; mapping(bytes32 => uint32) sendSeq; @@ -40,6 +44,10 @@ contract SDPMsg is ISDPMessage, Ownable { // only relayer can call `recvOffChainException` mapping(identity => bool) public relayerAuthMap; + // Keep new regulatory state after every legacy SDP storage field so an + // update-contract migration does not shift existing sequences or state. + identity public monitorAddress; + modifier onlyAM() { require( amAddress == msg.sender, @@ -81,6 +89,10 @@ contract SDPMsg is ISDPMessage, Ownable { monitorAddress = newMonitorContract; } + function getMonitorRoutingVersion() external pure returns (uint32) { + return MONITOR_ROUTING_VERSION; + } + function getAmAddress() external view returns (identity) { return amAddress; } @@ -171,6 +183,31 @@ contract SDPMsg is ISDPMessage, Ownable { // 发送有序消息 SDPv2 function sendMessageV2(string calldata receiverDomain, identity receiverID, bool atomic, bytes calldata message) override external returns (bytes32) { + if (monitorAddress != identity(0)) { + return IMonitor(monitorAddress).sendMonitorMessageV2( + receiverDomain, receiverID, msg.sender, atomic, message + ); + } + return _sendMessageV2(receiverDomain, receiverID, msg.sender, atomic, message); + } + + function sendMessageV2FromMonitor( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message + ) override external onlyMonitorOrLegacySender returns (bytes32) { + return _sendMessageV2(receiverDomain, receiverID, senderID, atomic, message); + } + + function _sendMessageV2( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message + ) internal returns (bytes32) { _beforeSend(receiverDomain, receiverID, message); bytes32 receiver = bytes32(receiverID); SDPMessageV2 memory sdpMessage = SDPMessageV2( @@ -181,14 +218,14 @@ contract SDPMsg is ISDPMessage, Ownable { receiver: receiver, atomicFlag: atomic ? SDPLib.SDP_V2_ATOMIC_FLAG_ATOMIC_REQUEST : SDPLib.SDP_V2_ATOMIC_FLAG_NONE_ATOMIC, nonce: SDPLib.MAX_NONCE, - sequence: _getAndUpdateSendSeq(receiverDomain, msg.sender, receiver), + sequence: _getAndUpdateSendSeq(receiverDomain, senderID, receiver), message: message, errorMsg: "" } ); sdpMessage.calcMessageId(localDomainHash); - IAuthMessage(amAddress).recvFromProtocol(msg.sender, sdpMessage.encode()); + IAuthMessage(amAddress).recvFromProtocol(senderID, sdpMessage.encode()); _afterSend(); @@ -197,6 +234,31 @@ contract SDPMsg is ISDPMessage, Ownable { // 发送无序消息 SDPv2 function sendUnorderedMessageV2(string calldata receiverDomain, identity receiverID, bool atomic, bytes calldata message) override external returns (bytes32) { + if (monitorAddress != identity(0)) { + return IMonitor(monitorAddress).sendUnorderedMonitorMessageV2( + receiverDomain, receiverID, msg.sender, atomic, message + ); + } + return _sendUnorderedMessageV2(receiverDomain, receiverID, msg.sender, atomic, message); + } + + function sendUnorderedMessageV2FromMonitor( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message + ) override external onlyMonitorOrLegacySender returns (bytes32) { + return _sendUnorderedMessageV2(receiverDomain, receiverID, senderID, atomic, message); + } + + function _sendUnorderedMessageV2( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message + ) internal returns (bytes32) { _beforeSendUnordered(receiverDomain, receiverID, message); bytes32 receiver = bytes32(receiverID); SDPMessageV2 memory sdpMessage = SDPMessageV2( @@ -206,7 +268,7 @@ contract SDPMsg is ISDPMessage, Ownable { receiveDomain: receiverDomain, receiver: receiver, atomicFlag: atomic ? SDPLib.SDP_V2_ATOMIC_FLAG_ATOMIC_REQUEST : SDPLib.SDP_V2_ATOMIC_FLAG_NONE_ATOMIC, - nonce: _getAndUpdateSendNonce(receiverDomain, msg.sender, receiver), + nonce: _getAndUpdateSendNonce(receiverDomain, senderID, receiver), sequence: SDPLib.UNORDERED_SEQUENCE, message: message, errorMsg: "" @@ -214,7 +276,7 @@ contract SDPMsg is ISDPMessage, Ownable { ); sdpMessage.calcMessageId(localDomainHash); - IAuthMessage(amAddress).recvFromProtocol(msg.sender, sdpMessage.encode()); + IAuthMessage(amAddress).recvFromProtocol(senderID, sdpMessage.encode()); _afterSendUnordered(); @@ -225,6 +287,46 @@ contract SDPMsg is ISDPMessage, Ownable { function sendMessageV3(string calldata receiverDomain, identity receiverID, bool atomic, bytes calldata message, uint8 _timeoutMeasure, uint256 _timeout) public returns (bytes32) { + if (monitorAddress != identity(0)) { + return IMonitor(monitorAddress).sendMonitorMessageV3( + receiverDomain, + receiverID, + msg.sender, + atomic, + message, + _timeoutMeasure, + _timeout + ); + } + return _sendMessageV3( + receiverDomain, receiverID, msg.sender, atomic, message, _timeoutMeasure, _timeout + ); + } + + function sendMessageV3FromMonitor( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message, + uint8 _timeoutMeasure, + uint256 _timeout + ) override external onlyMonitorOrLegacySender returns (bytes32) { + return _sendMessageV3( + receiverDomain, receiverID, senderID, atomic, message, _timeoutMeasure, _timeout + ); + } + + function _sendMessageV3( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message, + uint8 _timeoutMeasure, + uint256 _timeout + ) internal returns (bytes32) { + require( _timeoutMeasure >= SDPLib.SDP_V3_TIMEOUT_MEASUREMENT_NO_TIMEOUT && _timeoutMeasure <= SDPLib.SDP_V3_TIMEOUT_MEASUREMENT_RECEIVER_TIMESTAMP, "SDP: invalid timeout measure" @@ -241,7 +343,7 @@ contract SDPMsg is ISDPMessage, Ownable { receiver: receiver, atomicFlag: atomic ? SDPLib.SDP_V3_ATOMIC_FLAG_ATOMIC_REQUEST : SDPLib.SDP_V3_ATOMIC_FLAG_NONE_ATOMIC, nonce: SDPLib.MAX_NONCE, - sequence: _getAndUpdateSendSeq(receiverDomain, msg.sender, receiver), + sequence: _getAndUpdateSendSeq(receiverDomain, senderID, receiver), message: message, errorMsg: "", timeoutMeasure: _timeoutMeasure, @@ -253,7 +355,7 @@ contract SDPMsg is ISDPMessage, Ownable { // v3消息才有的记录,用于超时回滚前的验证 sendSDPV3Msgs[sdpMessage.messageId] = true; - IAuthMessage(amAddress).recvFromProtocol(msg.sender, sdpMessage.encode()); + IAuthMessage(amAddress).recvFromProtocol(senderID, sdpMessage.encode()); _afterSend(); @@ -264,6 +366,46 @@ contract SDPMsg is ISDPMessage, Ownable { function sendUnorderedMessageV3(string calldata receiverDomain, identity receiverID, bool atomic, bytes calldata message, uint8 _timeoutMeasure, uint256 _timeout) public returns (bytes32) { + if (monitorAddress != identity(0)) { + return IMonitor(monitorAddress).sendUnorderedMonitorMessageV3( + receiverDomain, + receiverID, + msg.sender, + atomic, + message, + _timeoutMeasure, + _timeout + ); + } + return _sendUnorderedMessageV3( + receiverDomain, receiverID, msg.sender, atomic, message, _timeoutMeasure, _timeout + ); + } + + function sendUnorderedMessageV3FromMonitor( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message, + uint8 _timeoutMeasure, + uint256 _timeout + ) override external onlyMonitorOrLegacySender returns (bytes32) { + return _sendUnorderedMessageV3( + receiverDomain, receiverID, senderID, atomic, message, _timeoutMeasure, _timeout + ); + } + + function _sendUnorderedMessageV3( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message, + uint8 _timeoutMeasure, + uint256 _timeout + ) internal returns (bytes32) { + require( _timeoutMeasure >= SDPLib.SDP_V3_TIMEOUT_MEASUREMENT_NO_TIMEOUT && _timeoutMeasure <= SDPLib.SDP_V3_TIMEOUT_MEASUREMENT_RECEIVER_TIMESTAMP, "SDP: invalid timeout measure" @@ -279,7 +421,7 @@ contract SDPMsg is ISDPMessage, Ownable { receiveDomain: receiverDomain, receiver: receiver, atomicFlag: atomic ? SDPLib.SDP_V3_ATOMIC_FLAG_ATOMIC_REQUEST : SDPLib.SDP_V3_ATOMIC_FLAG_NONE_ATOMIC, - nonce: _getAndUpdateSendNonce(receiverDomain, msg.sender, receiver), + nonce: _getAndUpdateSendNonce(receiverDomain, senderID, receiver), sequence: SDPLib.UNORDERED_SEQUENCE, message: message, errorMsg: "", @@ -291,7 +433,7 @@ contract SDPMsg is ISDPMessage, Ownable { sendSDPV3Msgs[sdpMessage.messageId] = true; - IAuthMessage(amAddress).recvFromProtocol(msg.sender, sdpMessage.encode()); + IAuthMessage(amAddress).recvFromProtocol(senderID, sdpMessage.encode()); _afterSend(); @@ -365,25 +507,41 @@ contract SDPMsg is ISDPMessage, Ownable { res = false; errMsg = "receiver has no code"; } else { - try - IContractUsingSDP(receiver).recvMessage(senderDomain, identity(senderID), sdpMessage.message) - { - res = true; - } catch Error( - string memory reason - ) { - errMsg = reason; - } catch ( - bytes memory /*lowLevelData*/ - ) {} + if (monitorAddress == identity(0)) { + try IContractUsingSDP(receiver).recvMessage(senderDomain, identity(senderID), sdpMessage.message) { + res = true; + } catch Error(string memory reason) { + errMsg = reason; + } catch (bytes memory /*lowLevelData*/) {} + } else { + try IContractUsingMonitor(monitorAddress).recvMessageFromSDP( + senderDomain, + identity(senderID), + receiver, + sdpMessage.message + ) { + res = true; + } catch Error(string memory reason) { + errMsg = reason; + } catch (bytes memory /*lowLevelData*/) {} + } } emit receiveMessage(senderDomain, senderID, receiver, seqExpected, res, errMsg); } function _routeUnorderedMessage(string calldata senderDomain, bytes32 senderID, SDPMessage memory sdpMessage) internal { - IContractUsingSDP(sdpMessage.getReceiverAddress()) - .recvUnorderedMessage(senderDomain, identity(senderID), sdpMessage.message); + identity receiver = sdpMessage.getReceiverAddress(); + if (monitorAddress == identity(0)) { + IContractUsingSDP(receiver).recvUnorderedMessage(senderDomain, identity(senderID), sdpMessage.message); + } else { + IContractUsingMonitor(monitorAddress).recvUnorderedMessageFromSDP( + senderDomain, + identity(senderID), + receiver, + sdpMessage.message + ); + } } function _processSDPv2(string calldata senderDomain, bytes32 senderID, bytes memory pkg) internal { @@ -450,17 +608,24 @@ contract SDPMsg is ISDPMessage, Ownable { res = false; errMsg = "receiver has no code"; } else { - try - IContractUsingSDP(receiver).recvMessage(senderDomain, identity(senderID), sdpMessage.message) - { - res = true; - } catch Error( - string memory reason - ) { - errMsg = reason; - } catch ( - bytes memory /*lowLevelData*/ - ) {} + if (monitorAddress == identity(0)) { + try IContractUsingSDP(receiver).recvMessage(senderDomain, identity(senderID), sdpMessage.message) { + res = true; + } catch Error(string memory reason) { + errMsg = reason; + } catch (bytes memory /*lowLevelData*/) {} + } else { + try IContractUsingMonitor(monitorAddress).recvMessageV2FromSDP( + senderDomain, + identity(senderID), + receiver, + sdpMessage.message + ) { + res = true; + } catch Error(string memory reason) { + errMsg = reason; + } catch (bytes memory /*lowLevelData*/) {} + } } return (res, errMsg); @@ -473,17 +638,25 @@ contract SDPMsg is ISDPMessage, Ownable { res = false; errMsg = "receiver has no code"; } else { - try - IContractUsingSDP(sdpMessage.getReceiverAddress()).recvUnorderedMessage(senderDomain, identity(senderID), sdpMessage.message) - { - res = true; - } catch Error( - string memory reason - ) { - errMsg = reason; - } catch ( - bytes memory /*lowLevelData*/ - ) {} + identity receiver = sdpMessage.getReceiverAddress(); + if (monitorAddress == identity(0)) { + try IContractUsingSDP(receiver).recvUnorderedMessage(senderDomain, identity(senderID), sdpMessage.message) { + res = true; + } catch Error(string memory reason) { + errMsg = reason; + } catch (bytes memory /*lowLevelData*/) {} + } else { + try IContractUsingMonitor(monitorAddress).recvUnorderedMessageV2FromSDP( + senderDomain, + identity(senderID), + receiver, + sdpMessage.message + ) { + res = true; + } catch Error(string memory reason) { + errMsg = reason; + } catch (bytes memory /*lowLevelData*/) {} + } } return (res, errMsg); @@ -501,14 +674,26 @@ contract SDPMsg is ISDPMessage, Ownable { } function _processSDPv2AckSuccess(string calldata senderDomain, bytes32 senderID, SDPMessageV2 memory sdpMessage) internal { - IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnSuccess( - sdpMessage.messageId, - senderDomain, - identity(senderID), - sdpMessage.sequence, - sdpMessage.nonce, - sdpMessage.message - ); + if (monitorAddress == identity(0)) { + IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnSuccess( + sdpMessage.messageId, + senderDomain, + identity(senderID), + sdpMessage.sequence, + sdpMessage.nonce, + sdpMessage.message + ); + } else { + IContractUsingMonitor(monitorAddress).ackOnSuccessFromSDP( + sdpMessage.getReceiverAddress(), + sdpMessage.messageId, + senderDomain, + identity(senderID), + sdpMessage.sequence, + sdpMessage.nonce, + sdpMessage.message + ); + } emit ReceiveMessageV2( sdpMessage.messageId, senderDomain, @@ -524,15 +709,28 @@ contract SDPMsg is ISDPMessage, Ownable { } function _processSDPv2AckError(string calldata senderDomain, bytes32 senderID, SDPMessageV2 memory sdpMessage) internal { - IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnError( - sdpMessage.messageId, - senderDomain, - identity(senderID), - sdpMessage.sequence, - sdpMessage.nonce, - sdpMessage.message, - sdpMessage.errorMsg - ); + if (monitorAddress == identity(0)) { + IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnError( + sdpMessage.messageId, + senderDomain, + identity(senderID), + sdpMessage.sequence, + sdpMessage.nonce, + sdpMessage.message, + sdpMessage.errorMsg + ); + } else { + IContractUsingMonitor(monitorAddress).ackOnErrorFromSDP( + sdpMessage.getReceiverAddress(), + sdpMessage.messageId, + senderDomain, + identity(senderID), + sdpMessage.sequence, + sdpMessage.nonce, + sdpMessage.message, + sdpMessage.errorMsg + ); + } emit ReceiveMessageV2( sdpMessage.messageId, senderDomain, @@ -626,17 +824,25 @@ contract SDPMsg is ISDPMessage, Ownable { res = false; errMsg = "receiver has no code"; } else { - try - IContractUsingSDP(sdpMessage.getReceiverAddress()).recvUnorderedMessage(senderDomain, identity(senderID), sdpMessage.message) - { - res = true; - } catch Error( - string memory reason - ) { - errMsg = reason; - } catch ( - bytes memory /*lowLevelData*/ - ) {} + identity receiver = sdpMessage.getReceiverAddress(); + if (monitorAddress == identity(0)) { + try IContractUsingSDP(receiver).recvUnorderedMessage(senderDomain, identity(senderID), sdpMessage.message) { + res = true; + } catch Error(string memory reason) { + errMsg = reason; + } catch (bytes memory /*lowLevelData*/) {} + } else { + try IContractUsingMonitor(monitorAddress).recvUnorderedMessageV3FromSDP( + senderDomain, + identity(senderID), + receiver, + sdpMessage.message + ) { + res = true; + } catch Error(string memory reason) { + errMsg = reason; + } catch (bytes memory /*lowLevelData*/) {} + } } return (res, errMsg); @@ -653,17 +859,24 @@ contract SDPMsg is ISDPMessage, Ownable { res = false; errMsg = "receiver has no code"; } else { - try - IContractUsingSDP(receiver).recvMessage(senderDomain, identity(senderID), sdpMessage.message) - { - res = true; - } catch Error( - string memory reason - ) { - errMsg = reason; - } catch ( - bytes memory /*lowLevelData*/ - ) {} + if (monitorAddress == identity(0)) { + try IContractUsingSDP(receiver).recvMessage(senderDomain, identity(senderID), sdpMessage.message) { + res = true; + } catch Error(string memory reason) { + errMsg = reason; + } catch (bytes memory /*lowLevelData*/) {} + } else { + try IContractUsingMonitor(monitorAddress).recvMessageV3FromSDP( + senderDomain, + identity(senderID), + receiver, + sdpMessage.message + ) { + res = true; + } catch Error(string memory reason) { + errMsg = reason; + } catch (bytes memory /*lowLevelData*/) {} + } } return (res, errMsg); @@ -681,14 +894,26 @@ contract SDPMsg is ISDPMessage, Ownable { } function _processSDPv3AckSuccess(string calldata senderDomain, bytes32 senderID, SDPMessageV3 memory sdpMessage) internal { - IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnSuccess( - sdpMessage.messageId, - senderDomain, - identity(senderID), - sdpMessage.sequence, - sdpMessage.nonce, - sdpMessage.message - ); + if (monitorAddress == identity(0)) { + IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnSuccess( + sdpMessage.messageId, + senderDomain, + identity(senderID), + sdpMessage.sequence, + sdpMessage.nonce, + sdpMessage.message + ); + } else { + IContractUsingMonitor(monitorAddress).ackOnSuccessFromSDP( + sdpMessage.getReceiverAddress(), + sdpMessage.messageId, + senderDomain, + identity(senderID), + sdpMessage.sequence, + sdpMessage.nonce, + sdpMessage.message + ); + } emit ReceiveMessageV3( sdpMessage.messageId, @@ -711,15 +936,28 @@ contract SDPMsg is ISDPMessage, Ownable { } function _processSDPv3AckError(string calldata senderDomain, bytes32 senderID, SDPMessageV3 memory sdpMessage) internal { - IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnError( - sdpMessage.messageId, - senderDomain, - identity(senderID), - sdpMessage.sequence, - sdpMessage.nonce, - sdpMessage.message, - sdpMessage.errorMsg - ); + if (monitorAddress == identity(0)) { + IContractWithAcks(sdpMessage.getReceiverAddress()).ackOnError( + sdpMessage.messageId, + senderDomain, + identity(senderID), + sdpMessage.sequence, + sdpMessage.nonce, + sdpMessage.message, + sdpMessage.errorMsg + ); + } else { + IContractUsingMonitor(monitorAddress).ackOnErrorFromSDP( + sdpMessage.getReceiverAddress(), + sdpMessage.messageId, + senderDomain, + identity(senderID), + sdpMessage.sequence, + sdpMessage.nonce, + sdpMessage.message, + sdpMessage.errorMsg + ); + } emit ReceiveMessageV3( sdpMessage.messageId, @@ -796,15 +1034,29 @@ contract SDPMsg is ISDPMessage, Ownable { } // 调用onError接口 - IContractWithAcks(SDPLib.encodeCrossChainIDIntoAddress(exceptionMsgAuthor)).ackOnError( - sdpMessage.messageId, - sdpMessage.receiveDomain, - identity(sdpMessage.receiver), - sdpMessage.sequence, - sdpMessage.nonce, - sdpMessage.message, - sdpMessage.errorMsg - ); + identity exceptionReceiver = SDPLib.encodeCrossChainIDIntoAddress(exceptionMsgAuthor); + if (monitorAddress == identity(0)) { + IContractWithAcks(exceptionReceiver).ackOnError( + sdpMessage.messageId, + sdpMessage.receiveDomain, + identity(sdpMessage.receiver), + sdpMessage.sequence, + sdpMessage.nonce, + sdpMessage.message, + sdpMessage.errorMsg + ); + } else { + IContractUsingMonitor(monitorAddress).ackOnErrorFromSDP( + exceptionReceiver, + sdpMessage.messageId, + sdpMessage.receiveDomain, + identity(sdpMessage.receiver), + sdpMessage.sequence, + sdpMessage.nonce, + sdpMessage.message, + sdpMessage.errorMsg + ); + } } else { revert("SDP_MSG_ERROR: the message is not timeout with timeoutMeasure 2"); } diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/compile_evm_all.sh b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/compile_evm_all.sh index e3e36408..3a9d408a 100755 --- a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/compile_evm_all.sh +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/compile_evm_all.sh @@ -4,64 +4,55 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PLUGIN_DIR="$(cd "${SCRIPT_DIR}/../../.." && pwd)" CONTRACT_PATH="${PLUGIN_DIR}/offchain-plugin/src/main/resources/contract/v1/solidity" +TMP_DIR="$(mktemp -d /tmp/antchainbridge-mysolc.XXXXXX)" + +if [[ -n "${MY_SOLC:-}" ]]; then + MY_SOLC_CMD=("${MY_SOLC}") +elif command -v mysolc >/dev/null 2>&1; then + MY_SOLC_CMD=(mysolc) +else + MY_SOLC_CMD=(npx --yes --package @antchain/mysolidity@1.3.0 mysolc) +fi -SOLCJS="${SOLCJS:-solcjs}" -SOLC="${SOLC:-solc}" - -cd "${SCRIPT_DIR}" -mkdir -p "${CONTRACT_PATH}" cleanup() { - rm -f ./*.bin ./*.bin-runtime + rm -rf "${TMP_DIR}" } trap cleanup EXIT -SOL_FILES=( - AuthMsg.sol - SDPMsg.sol - PtcHub.sol - CommitteePtcVerifier.sol - Monitor.sol - MonitorVerifier.sol - interfaces/*.sol - lib/am/*.sol - lib/commons/*.sol - lib/ptc/*.sol - lib/sdp/*.sol - lib/utils/*.sol - @openzeppelin/contracts/access/*.sol - @openzeppelin/contracts/interfaces/*.sol - @openzeppelin/contracts/utils/*.sol - @openzeppelin/contracts/utils/cryptography/*.sol - @openzeppelin/contracts/utils/math/*.sol -) - -cleanup - -"${SOLCJS}" --bin "${SOL_FILES[@]}" - -copy_bin() { - local file="$1" - if [[ ! -f "${file}" ]]; then - echo "missing compiler output: ${file}" >&2 - exit 1 - fi - cp "${file}" "${CONTRACT_PATH}/${file}" -} +cd "${SCRIPT_DIR}" +mkdir -p "${CONTRACT_PATH}" -copy_bin AuthMsg_sol_AuthMsg.bin -copy_bin SDPMsg_sol_SDPMsg.bin -copy_bin PtcHub_sol_PtcHub.bin -copy_bin CommitteePtcVerifier_sol_CommitteePtcVerifier.bin -copy_bin Monitor_sol_Monitor.bin -copy_bin MonitorVerifier_sol_MonitorVerifier.bin +if (( $# > 0 )); then + CONTRACTS=("$@") +else + CONTRACTS=( + AuthMsg + SDPMsg + PtcHub + CommitteePtcVerifier + Monitor + MonitorVerifier + ) +fi -if command -v "${SOLC}" >/dev/null 2>&1; then - "${SOLC}" --bin-runtime --overwrite "${SOL_FILES[@]}" -o . - for runtime_file in AuthMsg.bin-runtime SDPMsg.bin-runtime PtcHub.bin-runtime CommitteePtcVerifier.bin-runtime Monitor.bin-runtime MonitorVerifier.bin-runtime; do - if [[ -f "${runtime_file}" ]]; then - cp "${runtime_file}" "${CONTRACT_PATH}/${runtime_file}" +for contract in "${CONTRACTS[@]}"; do + target_dir="${TMP_DIR}/${contract}" + "${MY_SOLC_CMD[@]}" compile "${contract}.sol" \ + --targetPath "${target_dir}" \ + --targetName "${contract}" \ + --solcVersion 0.8.14 + + for artifact in "${contract}.bin" "${contract}.deployed.bin"; do + if [[ ! -s "${target_dir}/${artifact}" ]]; then + echo "missing Mychain compiler output: ${target_dir}/${artifact}" >&2 + exit 1 fi done -fi -echo "MyChain EVM contract binaries generated under ${CONTRACT_PATH}" + cp "${target_dir}/${contract}.bin" \ + "${CONTRACT_PATH}/${contract}_sol_${contract}.bin" + cp "${target_dir}/${contract}.deployed.bin" \ + "${CONTRACT_PATH}/${contract}.bin-runtime" +done + +echo "Mychain EVM deployment and runtime binaries generated under ${CONTRACT_PATH}" diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/demo/MonitorSenderContract.sol b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/demo/MonitorSenderContract.sol new file mode 100644 index 00000000..da8550f1 --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/demo/MonitorSenderContract.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +interface IMonitorMessage { + function sendUnorderedMonitorMessage( + string calldata receiverDomain, + identity receiverID, + bytes calldata message + ) external; +} + +contract MonitorSenderContract { + identity public monitorAddress; + + event UnorderedMessageSent(string receiverDomain, identity receiver, bytes message); + + function setMonitorContract(identity newMonitorAddress) external { + require(newMonitorAddress != identity(0), "MonitorSender: invalid monitor"); + monitorAddress = newMonitorAddress; + } + + function sendUnordered(identity receiver, string calldata receiverDomain, bytes calldata message) external { + require(monitorAddress != identity(0), "MonitorSender: monitor not set"); + IMonitorMessage(monitorAddress).sendUnorderedMonitorMessage(receiverDomain, receiver, message); + emit UnorderedMessageSent(receiverDomain, receiver, message); + } +} diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/demo/MonitorV123SenderContract.sol b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/demo/MonitorV123SenderContract.sol new file mode 100644 index 00000000..f5d20739 --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/demo/MonitorV123SenderContract.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +/** Test application that exercises the production Monitor/SDP V1/V2/V3 entry points. */ +contract MonitorV123SenderContract { + identity public sdpAddress; + identity public monitorAddress; + + function setContracts(identity newSdpAddress, identity newMonitorAddress) external { + require(newSdpAddress != identity(0), "MonitorV123Sender: invalid SDP"); + require(newMonitorAddress != identity(0), "MonitorV123Sender: invalid Monitor"); + sdpAddress = newSdpAddress; + monitorAddress = newMonitorAddress; + } + + function sendUnordered(identity receiver, string calldata domain, bytes calldata message) external { + IMonitorV1Sender(monitorAddress).sendUnorderedMonitorMessage(domain, receiver, message); + } + + function sendUnorderedV2( + identity receiver, + string calldata domain, + bool atomic, + bytes calldata message + ) external returns (bytes32) { + return ISDPV23Sender(sdpAddress).sendUnorderedMessageV2(domain, receiver, atomic, message); + } + + function sendUnorderedV3( + identity receiver, + string calldata domain, + bool atomic, + bytes calldata message, + uint8 timeoutMeasure, + uint256 timeout + ) external returns (bytes32) { + return ISDPV23Sender(sdpAddress).sendUnorderedMessageV3( + domain, receiver, atomic, message, timeoutMeasure, timeout + ); + } +} + +interface IMonitorV1Sender { + function sendUnorderedMonitorMessage( + string calldata receiverDomain, + identity receiverID, + bytes calldata message + ) external; +} + +interface ISDPV23Sender { + function sendUnorderedMessageV2( + string calldata receiverDomain, + identity receiverID, + bool atomic, + bytes calldata message + ) external returns (bytes32); + + function sendUnorderedMessageV3( + string calldata receiverDomain, + identity receiverID, + bool atomic, + bytes calldata message, + uint8 timeoutMeasure, + uint256 timeout + ) external returns (bytes32); +} diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/IContractUsingMonitor.sol b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/IContractUsingMonitor.sol new file mode 100644 index 00000000..ec2bfe64 --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/IContractUsingMonitor.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +interface IContractUsingMonitor { + function recvUnorderedMessageFromSDP( + string memory senderDomain, + identity author, + identity receiverID, + bytes memory message + ) external; + + function recvMessageFromSDP( + string memory senderDomain, + identity author, + identity receiverID, + bytes memory message + ) external; + + function recvUnorderedMessageV2FromSDP(string memory senderDomain, identity author, identity receiverID, bytes memory message) external; + + function recvMessageV2FromSDP(string memory senderDomain, identity author, identity receiverID, bytes memory message) external; + + function recvUnorderedMessageV3FromSDP(string memory senderDomain, identity author, identity receiverID, bytes memory message) external; + + function recvMessageV3FromSDP(string memory senderDomain, identity author, identity receiverID, bytes memory message) external; + + function ackOnSuccessFromSDP( + identity receiverID, + bytes32 messageId, + string memory receiverDomain, + identity receiver, + uint32 sequence, + uint64 nonce, + bytes memory message + ) external; + + function ackOnErrorFromSDP( + identity receiverID, + bytes32 messageId, + string memory receiverDomain, + identity receiver, + uint32 sequence, + uint64 nonce, + bytes memory message, + string memory errorMsg + ) external; +} diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/IMonitor.sol b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/IMonitor.sol new file mode 100644 index 00000000..20ae0a91 --- /dev/null +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/IMonitor.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +interface IMonitor { + function sendMonitorMessageV2( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message + ) external returns (bytes32); + + function sendUnorderedMonitorMessageV2( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message + ) external returns (bytes32); + + function sendMonitorMessageV3( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message, + uint8 timeoutMeasure, + uint256 timeout + ) external returns (bytes32); + + function sendUnorderedMonitorMessageV3( + string calldata receiverDomain, + identity receiverID, + identity senderID, + bool atomic, + bytes calldata message, + uint8 timeoutMeasure, + uint256 timeout + ) external returns (bytes32); +} diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/IPtcHub.sol b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/IPtcHub.sol index b70cc2f6..aee5150f 100644 --- a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/IPtcHub.sol +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/IPtcHub.sol @@ -23,6 +23,10 @@ interface IPtcHub { function updatePTCTrustRoot(bytes calldata rawPtcTrustRoot) external; + function reconcileRootBcdnsCert(bytes calldata rawRootBcdnsCert) external; + + function getImplementationVersion() external pure returns (uint32); + function getPTCTrustRoot(bytes calldata ptcOwnerOid) external view returns (bytes memory); function hasPTCTrustRoot(bytes calldata ptcOwnerOid) external view returns (bool); @@ -46,4 +50,4 @@ interface IPtcHub { function addPtcVerifier(identity verifierContract) external; function removePtcVerifier(PTCTypeEnum ptcType) external; -} \ No newline at end of file +} diff --git a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/ISDPMessage.sol b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/ISDPMessage.sol index c8eba694..bfba087d 100644 --- a/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/ISDPMessage.sol +++ b/acb-sdk/pluginset/mychain0.20/onchain-plugin/solidity/v1/interfaces/ISDPMessage.sol @@ -117,6 +117,8 @@ interface ISDPMessage is ISubProtocol { */ function sendMessageV2(string calldata receiverDomain, identity receiverID, bool atomic, bytes calldata message) external returns (bytes32); + function sendMessageV2FromMonitor(string calldata receiverDomain, identity receiverID, identity senderID, bool atomic, bytes calldata message) external returns (bytes32); + /** * @dev Smart contracts need to call this method to send orderly cross-chain messages in SDPv1. * @@ -152,6 +154,8 @@ interface ISDPMessage is ISubProtocol { */ function sendUnorderedMessageV2(string calldata receiverDomain, identity receiverID, bool atomic, bytes calldata message) external returns (bytes32); + function sendUnorderedMessageV2FromMonitor(string calldata receiverDomain, identity receiverID, identity senderID, bool atomic, bytes calldata message) external returns (bytes32); + /** * @dev Smart contracts call this method to send cross-chain messages out of order in SDPv1. * @@ -204,6 +208,8 @@ interface ISDPMessage is ISubProtocol { */ function sendUnorderedMessageV3(string calldata receiverDomain, identity receiverID, bool atomic, bytes calldata message, uint8 timeoutMeasure, uint256 timeout) external returns (bytes32); + function sendUnorderedMessageV3FromMonitor(string calldata receiverDomain, identity receiverID, identity senderID, bool atomic, bytes calldata message, uint8 timeoutMeasure, uint256 timeout) external returns (bytes32); + /** * @dev Smart contracts need to call this method to send orderly cross-chain messages in SDPv3. * @@ -223,6 +229,8 @@ interface ISDPMessage is ISubProtocol { */ function sendMessageV3(string calldata receiverDomain, identity receiverID, bool atomic, bytes calldata message, uint8 timeoutMeasure, uint256 timeout) external returns (bytes32); + function sendMessageV3FromMonitor(string calldata receiverDomain, identity receiverID, identity senderID, bool atomic, bytes calldata message, uint8 timeoutMeasure, uint256 timeout) external returns (bytes32); + /** * @dev Calling this function can submit a notification message of an off-chain exception directly on-chain. * diff --git a/acb-sdk/ptc-services/committee-ptc-core/src/main/java/com/alipay/antchain/bridge/ptc/committee/CommitteePTCService.java b/acb-sdk/ptc-services/committee-ptc-core/src/main/java/com/alipay/antchain/bridge/ptc/committee/CommitteePTCService.java index dd632a34..514b02ba 100644 --- a/acb-sdk/ptc-services/committee-ptc-core/src/main/java/com/alipay/antchain/bridge/ptc/committee/CommitteePTCService.java +++ b/acb-sdk/ptc-services/committee-ptc-core/src/main/java/com/alipay/antchain/bridge/ptc/committee/CommitteePTCService.java @@ -695,15 +695,24 @@ private ThirdPartyProof assembleTpProof( } private ValidatedConsensusState collectValidatedConsensusStateResults(List> resFutureList) { - List resList = resFutureList.stream().map( - future -> { + List resList = resFutureList.stream() + .map(future -> { try { return future.get(); } catch (Exception e) { - throw new RuntimeException("failed to collect node proof from future object: ", e); + // A committee may contain optional nodes that are temporarily unavailable + // or lag behind the required nodes. Their failed futures must not abort the + // whole round before the endorsement policy is evaluated below. Required + // node failures are still rejected by checkEndorsementsOrThrow because the + // resulting proof will be missing their signatures. + log.warn("failed to collect a validated consensus state from committee node; " + + "continue with successful endorsements and enforce the TpBTA policy: {}", + e.getMessage()); + return null; } - } - ).collect(Collectors.toList()); + }) + .filter(ObjectUtil::isNotNull) + .collect(Collectors.toList()); if (ObjectUtil.isEmpty(resList)) { throw new RuntimeException( StrUtil.format("none endorsements received with {} nodes active", @@ -734,10 +743,12 @@ private List collectNodeProof(List collectNodeVerifyResults( try { return future.get(); } catch (Exception e) { - throw new RuntimeException("failed to collect node verification result from future object: ", e); + // Optional committee nodes may not have indexed the requested consensus + // state yet. Keep the successful results here and let + // checkEndorsementsOrThrow enforce required endorsers and the optional + // threshold. This is the same policy used when collecting consensus states. + log.warn("failed to collect a committee node verification result; continue " + + "with successful endorsements and enforce the TpBTA policy: {}", + e.getMessage()); + return null; } } - ).collect(Collectors.toList()); + ).filter(ObjectUtil::isNotNull).collect(Collectors.toList()); if (ObjectUtil.isEmpty(results)) { throw new RuntimeException( StrUtil.format("none endorsements received with {} nodes active", diff --git a/acb-sdk/ptc-services/committee-ptc-core/src/test/java/com/alipay/antchain/bridge/ptc/committee/CommitteePTCServiceTest.java b/acb-sdk/ptc-services/committee-ptc-core/src/test/java/com/alipay/antchain/bridge/ptc/committee/CommitteePTCServiceTest.java index 8a9ef3a6..329c5422 100644 --- a/acb-sdk/ptc-services/committee-ptc-core/src/test/java/com/alipay/antchain/bridge/ptc/committee/CommitteePTCServiceTest.java +++ b/acb-sdk/ptc-services/committee-ptc-core/src/test/java/com/alipay/antchain/bridge/ptc/committee/CommitteePTCServiceTest.java @@ -17,12 +17,16 @@ package com.alipay.antchain.bridge.ptc.committee; import java.io.ByteArrayInputStream; +import java.lang.reflect.Method; import java.math.BigInteger; import java.net.InetSocketAddress; import java.security.PrivateKey; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.ListUtil; @@ -51,6 +55,7 @@ import com.alipay.antchain.bridge.ptc.committee.types.basic.NodePublicKeyEntry; import com.alipay.antchain.bridge.ptc.committee.types.network.CommitteeNetworkInfo; import com.alipay.antchain.bridge.ptc.committee.types.network.nodeclient.Node; +import com.alipay.antchain.bridge.ptc.committee.types.network.nodeclient.NodeVerifyCrossChainMessageResult; import com.alipay.antchain.bridge.ptc.committee.types.tpbta.CommitteeEndorseRoot; import com.alipay.antchain.bridge.ptc.committee.types.tpbta.NodeEndorseInfo; import com.alipay.antchain.bridge.ptc.committee.types.tpbta.OptionalEndorsePolicy; @@ -554,6 +559,58 @@ public void testCommitConsensusState() { assertEquals(1, endorseProof.getSigs().size()); } + @Test + @SneakyThrows + public void testCollectValidatedConsensusStateSkipsFailedOptionalFuture() { + CommitteePTCService ptcService = new CommitteePTCService(); + CompletableFuture failedOptional = new CompletableFuture<>(); + failedOptional.completeExceptionally(new RuntimeException("optional node is behind")); + + Method collector = CommitteePTCService.class.getDeclaredMethod( + "collectValidatedConsensusStateResults", + java.util.List.class + ); + collector.setAccessible(true); + ValidatedConsensusState result = (ValidatedConsensusState) collector.invoke( + ptcService, + Arrays.>asList( + CompletableFuture.completedFuture(currVcs), + failedOptional + ) + ); + + assertArrayEquals(currVcs.getEncodedToSign(), result.getEncodedToSign()); + assertEquals(1, CommitteeEndorseProof.decode(result.getPtcProof()).getSigs().size()); + } + + @Test + @SneakyThrows + @SuppressWarnings("unchecked") + public void testCollectNodeVerifyResultsSkipsFailedOptionalFuture() { + CommitteePTCService ptcService = new CommitteePTCService(); + NodeVerifyCrossChainMessageResult requiredResult = + new NodeVerifyCrossChainMessageResult(null, "approved", ""); + CompletableFuture failedOptional = new CompletableFuture<>(); + failedOptional.completeExceptionally(new RuntimeException("optional node has not indexed this state")); + + Method collector = CommitteePTCService.class.getDeclaredMethod( + "collectNodeVerifyResults", + java.util.List.class + ); + collector.setAccessible(true); + java.util.List results = + (java.util.List) collector.invoke( + ptcService, + Arrays.>asList( + CompletableFuture.completedFuture(requiredResult), + failedOptional + ) + ); + + assertEquals(1, results.size()); + assertSame(requiredResult, results.get(0)); + } + @Test public void testVerifyCrossChainMessage() { CommitteePTCService ptcService = new CommitteePTCService(); diff --git a/docs/SDP_V123_REGULATORY_COMPATIBILITY_ZH.md b/docs/SDP_V123_REGULATORY_COMPATIBILITY_ZH.md new file mode 100644 index 00000000..2a2dc94b --- /dev/null +++ b/docs/SDP_V123_REGULATORY_COMPATIBILITY_ZH.md @@ -0,0 +1,159 @@ +# SDP V1/V2/V3 监管兼容与部署说明 + +## 1. 目标与范围 + +本次升级解决“发送端经过 Monitor 封装,目标链 SDP 却直接把监管信封交给业务合约”的不对称问题,并将 Ethereum、FISCO BCOS 与 Mychain 的监管路由从 SDP V1 扩展到 V2/V3。 + +兼容原则如下: + +- 普通模式与监管模式使用同一套 SDP V1/V2/V3 接口; +- Monitor 在发送侧封装,在接收侧解封后才调用业务合约; +- request/response 以及 ACK 路径使用相同的监管规则; +- 目标业务合约收到的 `bytes` 必须与源业务消息逐字节一致; +- 原生协议只实现 SDP V1 的链不伪装成 V2/V3 支持。 + +## 2. 当前能力矩阵 + +| 链插件 | 普通 SDP | 监管 SDP | 接收侧 Monitor 解封 | 备注 | +| --- | --- | --- | --- | --- | +| Ethereum3 | V1/V2/V3 | V1/V2/V3 | 支持 | Monitor V5,SDP 保留 V1 兼容接口 | +| FISCO BCOS 3.x(`fiscobcos`) | V1/V2/V3 | V1/V2/V3 | 支持 | Monitor V5,与 Ethereum3 复用同一套合约源码 | +| FISCO BCOS 2.x(`fiscobcos3`) | V1/V2/V3 | V1/V2/V3 | 支持 | Monitor V3,使用 0.4.25 编译器生成双密码套件 wrapper | +| Mychain 0.20 | V1/V2/V3 | V1/V2/V3 | 支持 | Monitor V6,包含安全变长字节解码 | +| Dioxide | V1 | V1 | 按 V1 路径 | 链原生 SDP 协议当前未定义 V2/V3 | + +## 3. 调用路由 + +监管开启时,完整路由为: + +```text +源业务合约 + -> 源链 Monitor 封装 + -> 源链 SDP V1/V2/V3 + -> AuthMessage / Relayer / PTC + -> 目标链 SDP V1/V2/V3 + -> 目标链 Monitor 校验并解封 + -> 目标业务合约 +``` + +监管关闭时仍经过相同的 Monitor 路由,但信封中的控制类型为 `MONITOR_CLOSE`;这样不会因两端策略切换而让业务合约收到封装层。 + +## 4. 本次修复的根因 + +### 4.1 V2/V3 接收端绕过 Monitor + +旧实现只在 V1 路径上完成 Monitor 转发,部分 V2/V3 request 和 ACK 入口会直接调用业务合约。修复后,三个 SDP 版本的发送、接收与 ACK 均通过 Monitor 的对应入口。 + +### 4.2 多 EVM 编译器的非 32 字节对齐 payload 错位 + +旧版 Ethereum、FISCO 和 Mychain Monitor 使用的汇编变长字节解码会随标准 solc、FISCO solc、MySolidity 的内存对齐差异产生不同结果。典型现象是 36 字节业务消息只剩尾部片段和大量 `0x00`,但交易回执仍然成功。 + +Ethereum/FISCO Monitor V5、旧 FISCO Monitor V3 与 Mychain Monitor V6 均依照旧 ACB EVM codec 的“逆序 32 字节块 + 末尾长度”格式显式计算边界,再逐字节恢复逻辑内容,避免依赖编译器敏感的内存拷贝。各链插件的期望实现版本也同步提高,`setup-bbccontracts` 会检测旧运行码;支持原位升级的链保持原地址,不支持安全原位升级的插件会部署新 Monitor 并把新地址写回链上下文和业务测试合约。 + +### 4.3 Mychain PTC Hub 保留了旧 BCDNS 根 + +EVM 运行码升级只替换 code,不会再执行构造函数。因此旧 PTC Hub 升级后仍可能保留历史 BCDNS 根,随后验证新 TPBTA 时报 `issuer not found`。 + +PTC Hub V2 增加 owner-only 的根证书对账入口;Mychain 插件在可重复的 `setup-bbccontracts` 流程中探测旧运行码、必要时升级,并用当前配置的 BCDNS 根执行对账。 + +### 4.4 重复 setup 降级 SDP 就绪状态 + +旧 `setupSDPMessageContract()` 在合约已经完成绑定时仍把聚合状态写回 `CONTRACT_DEPLOYED`,使后续任务判断为“SDP not ready”。修复后,重复 setup 保留 `CONTRACT_READY`。 + +### 4.5 替换 Monitor 时丢失既有监管节点背书 + +MonitorVerifier 的 `monitorNodeEndorseInfoMap` 在 TPBTA 写入 PTC Hub 时同步生成。旧 FISCO +升级流程在替换 Monitor 时同时部署了一个空 MonitorVerifier,再让已有 PTC Hub 指向它;新 +Verifier 虽然地址双向绑定正确,但没有历史 TPBTA 的监管节点背书,所有监管消息都会在目标链 +以 `MonitorVerifierMsg: no monitor node endorse info` 回滚。 + +修复后的升级流程仅替换存在问题的 Monitor,并复用当前 PTC Hub 已绑定的旧 MonitorVerifier, +从而保留既有背书状态。已产生空 Verifier 的环境必须在审计后将新 Monitor 和 PTC Hub 同时绑定 +回旧 Verifier;只修改其中一侧会留下不一致状态。 + +### 4.6 V0 目标链被误走 PTC Hub 同步 + +发送链存在 BTA 时,Relayer 需要把该链的 TPBTA 同步到支持链上 PTC Hub 的接收链。旧判断只 +看发送链是否有 BTA,没有再检查接收链是否真的配置了 PTC Hub。Dioxide 当前使用 V0 BBC 与 +原生 SDP V1,`ptc_contract` 为空;因此 Ethereum 到 Dioxide 的消息在监管已批准后仍会被 +`hasTpBta` 的“不支持 V1 BBC 接口”异常阻断,根本没有进入 `relayAuthMessage`。 + +修复后仍以发送链 BTA 决定是否需要可信同步,但在同步前先读取目标链 BBC Context。只有目标链 +存在非空 PTC 合约时才执行 `hasTpBta/addTpBta`;没有 PTC Hub 的 V0 目标按其原生 AM 路径继续 +提交。这个判断不降低 Ethereum、FISCO、Mychain 之间的可信校验,它们的目标链 Context 都包含 +已配置 PTC Hub。 + +### 4.7 Dioxide 归档终态只出现在 `State` + +Dioxide 的入口交易和 relay group 通常同时返回 `ConfirmState`,但最终调用 SDP/业务合约的 relay +交易可能只返回 `State=DUS_FINALIZED` 或 `State=DUS_ARCHIVED`,没有 `ConfirmState`。旧插件只按 +`ConfirmState` 判断最终性,因此链上已经归档且业务执行成功的交易仍被解释为 `unknown/pending`, +Relayer 无法把 `sdp_msg_pool` 收敛为成功,也无法补报监管执行结果。 + +Dioxide 与 Dioxide2 插件现在同时读取两套节点状态:`TXN_FINALIZED/TXN_ARCHIVED` 与 +`DUS_FINALIZED/DUS_ARCHIVED` 均表示可靠终态;`DUS_INVALID/DUS_FORKED/DUS_ARCHIVED_UNCLE` +表示终态失败。`transaction not found` 仍保留为未确认错误,不会因为另一笔成功交易或增加重试 +次数而被伪造成成功。Relayer 的批量确认也按单条消息隔离原生回执异常,避免一条坏记录阻塞同批 +其它已确认交易。 + +## 5. 部署与升级顺序 + +1. 备份当前插件 JAR、Relayer 链配置与合约地址。 +2. 核对 `bcdns_root_cert_pem` 与当前 BCDNS/PTC 证书的 issuer owner。 +3. 替换插件 JAR,先重启 Plugin Server,再确认 Relayer 恢复对插件的连接。 +4. 对目标链执行一次 `setup-bbccontracts`;根据插件能力原位升级旧运行码,或部署新 Monitor 并重建绑定。不要假设所有链的地址都会保持不变。 +5. 读取 Monitor/SDP/PTC 实现版本与绑定关系,再发起新的链上验收交易。 +6. 分别使用监管关闭和监管开启模式发送 V1/V2/V3,同时验证源交易、Relayer 归档、监管结果、目标交易和业务 payload。 + +对 Dioxide 还应确认 `get-blockchain-contracts` 的 `ptc_contract` 为 `empty`。这是当前 V0/V1 +原生路径的能力声明,不应通过伪地址强行开启 PTC Hub 接口。 + +同时应抽样读取最终 relay 交易:若没有 `ConfirmState`,必须确认其 `State` 已到 +`DUS_FINALIZED` 或 `DUS_ARCHIVED`;不能仅观察入口 tx0 的归档状态。 + +不要只以“目标交易 success”作为验收标准;必须读取目标业务合约的事件或状态,确认 payload 没有 Monitor 外层且逐字节一致。 + +## 6. 验收查询 + +大屏数据 API 可用于核对 UCP 生命周期与监管上报: + +```bash +curl -k 'https://47.94.7.98:18443/api/data/messages?page=1&size=20&sourceDomain=eth04&targetDomain=my02' +curl -k 'https://47.94.7.98:18443/api/data/message/{ucpId}' +``` + +单条详情中至少应看到: + +- 源链与目标链交易哈希; +- `monitor.reportStatus=REPORTED`; +- `monitor.status=APPROVED`(对允许通过的测试样例); +- `monitor.currentStage=TARGET_EXECUTED`; +- `monitor.completeness` 中四个阶段均为 `true`。 + +## 7. 回滚 + +- 应用回滚:恢复备份 JAR 并重启 Plugin Server/Relayer; +- 配置回滚:用 Relayer CLI 恢复备份的链配置; +- 链上合约不删除;如需恢复旧运行码,必须使用已审核的旧 runtime 并保留原地址/存储布局。 +- 回滚后重新执行最小 V1 普通与监管双路径验收。 + +## 8. 已知边界 + +- Dioxide 当前只支持原生 SDP V1,本次不通过改写版本字段伪造 V2/V3。 +- Mychain Maven 单测在没有私有 GitHub Packages 凭据时会因 Mychain SDK `401` 无法解析;发布时仍需使用生产插件依赖完成 Java 编译,并使用官方 MySolidity `0.8.14` 生成部署/runtime 字节码。 +- 历史失败队列与本次新发验收交易分开统计,不应用存量失败掩盖或否定新路径的结果。 + +## 9. 2026-08-26 生产复验 + +- Ethereum、FISCO BCOS 与 Mychain 的 Monitor/SDP/PTC 绑定均为 `DEPLOY_FINISHED`;三条链的 + 普通和监管 V1/V2/V3 已分别完成双向实链验证,目标业务合约读取到的 payload 与源消息一致。 +- Dioxide 明确保持原生 SDP V1。Dioxide/Dioxide2 插件启用 `State` 终态识别后,新发 + Ethereum `eth04` → Dioxide `diox04` 监管消息生成 UCP + `148af653290e9d1b2e6d57632f9a1bf18607232350728e30976f395496cfe73d`,目标交易 + `42csksb2dk7em6qz5mayhpagqpcdr9h7rzy7kkj67gntmedcd5mg`。 +- 该消息为 SDP V1,PTC 四节点签名权重 100%,监管为 `APPROVED/TARGET_EXECUTED`,四项完整性 + 全部为 `true`;目标入口交易和 relay group 均为 `DUS_ARCHIVED/TXN_ARCHIVED`,两级 Invocation + 均为 `IVKRET_SUCCESS`。 +- 从 relay group 的业务 body 解出的正文为 + `eth-to-diox-statefix-regulated-1787692602-sdp-v1`,与源交易发送值逐字节一致,证明目标侧收到的 + 是 Monitor 解封后的业务内容。 diff --git a/tools/regulatory/CrossChainPayloadInspect.java b/tools/regulatory/CrossChainPayloadInspect.java new file mode 100644 index 00000000..60d720a0 --- /dev/null +++ b/tools/regulatory/CrossChainPayloadInspect.java @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: Apache-2.0 */ +package tools.regulatory; + +import com.alipay.antchain.bridge.commons.core.am.AuthMessageFactory; +import com.alipay.antchain.bridge.commons.core.am.IAuthMessage; +import com.alipay.antchain.bridge.commons.core.sdp.ISDPMessage; +import com.alipay.antchain.bridge.commons.core.sdp.SDPMessageFactory; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.bouncycastle.util.encoders.Hex; + +/** Decodes a captured AuthMessage and prints only its protocol payload. */ +public final class CrossChainPayloadInspect { + + private CrossChainPayloadInspect() {} + + public static void main(String[] args) throws Exception { + if (args.length != 1) { + throw new IllegalArgumentException("expected AUTH_MESSAGE_FILE"); + } + IAuthMessage authMessage = AuthMessageFactory.createAuthMessage( + Files.readAllBytes(Path.of(args[0]))); + ISDPMessage sdpMessage = SDPMessageFactory.createSDPMessage(authMessage.getPayload()); + byte[] payload = sdpMessage.getPayload(); + System.out.println("auth.version=" + authMessage.getVersion()); + System.out.println("sdp.version=" + sdpMessage.getVersion()); + System.out.println("sdp.targetDomain=" + sdpMessage.getTargetDomain().getDomain()); + System.out.println("sdp.payload.length=" + payload.length); + System.out.println("sdp.payload.hex=" + Hex.toHexString(payload)); + System.out.println("sdp.payload.utf8=" + new String(payload, StandardCharsets.UTF_8)); + } +} diff --git a/tools/regulatory/EthereumMonitorV123LiveCheck.java b/tools/regulatory/EthereumMonitorV123LiveCheck.java new file mode 100644 index 00000000..736dd4f5 --- /dev/null +++ b/tools/regulatory/EthereumMonitorV123LiveCheck.java @@ -0,0 +1,167 @@ +/* SPDX-License-Identifier: Apache-2.0 */ +package tools.regulatory; + +import com.alipay.antchain.bridge.commons.bbc.DefaultBBCContext; +import com.alipay.antchain.bridge.plugins.ethereum3.EthereumBBCService; +import com.alipay.antchain.bridge.plugins.ethereum3.abi.AppContract; +import com.alipay.antchain.bridge.plugins.ethereum3.abi.Monitor; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Instant; +import org.web3j.tx.gas.DefaultGasProvider; +import org.web3j.protocol.core.methods.response.TransactionReceipt; + +/** Root-only live check for Ethereum Monitor V5 and SDP V1/V2/V3. */ +public final class EthereumMonitorV123LiveCheck { + + private EthereumMonitorV123LiveCheck() {} + + public static void main(String[] args) throws Exception { + if (args.length < 8 || args.length > 9) { + throw new IllegalArgumentException( + "expected CONFIG APP SDP MONITOR TARGET_DOMAIN TARGET_APP CONTROL LABEL " + + "[all|v1|v2|v3]"); + } + Path configPath = Path.of(args[0]); + boolean deployApp = "deploy".equalsIgnoreCase(args[1]); + String appAddress = deployApp ? null : requireAddress(args[1], "app"); + String sdpAddress = requireAddress(args[2], "SDP"); + String monitorAddress = requireAddress(args[3], "Monitor"); + String targetDomain = args[4]; + byte[] targetApp = parseCrossChainId(args[5], "target app"); + int control = Integer.parseInt(args[6]); + if (control < 1 || control > 3) { + throw new IllegalArgumentException("CONTROL must be 1, 2, or 3"); + } + String selectedVersion = args.length == 9 ? args[8].toLowerCase() : "all"; + if (!selectedVersion.matches("all|v1|v2|v3")) { + throw new IllegalArgumentException("protocol selection must be all, v1, v2, or v3"); + } + + DefaultBBCContext context = new DefaultBBCContext(); + context.setConfForBlockchainClient(Files.readAllBytes(configPath)); + EthereumBBCService service = new EthereumBBCService(); + boolean started = false; + try { + service.startup(context); + started = true; + Monitor monitor = Monitor.load( + monitorAddress, + service.getAcbEthClient().getWeb3j(), + service.getAcbEthClient().getRawTransactionManager(), + new DefaultGasProvider()); + AppContract app; + if (deployApp) { + app = AppContract.deploy( + service.getAcbEthClient().getWeb3j(), + service.getAcbEthClient().getRawTransactionManager(), + new DefaultGasProvider()).send(); + requireSuccessful(app.setProtocol(sdpAddress).send(), "bind new app SDP"); + requireSuccessful(app.setMonitorContract(monitorAddress).send(), "bind new app Monitor"); + } else { + app = AppContract.load( + appAddress, + service.getAcbEthClient().getWeb3j(), + service.getAcbEthClient().getRawTransactionManager(), + new DefaultGasProvider()); + } + + System.out.println("monitor.implementationVersion=" + monitor.getImplementationVersion().send()); + System.out.println("monitor.control.before=" + monitor.getMonitorControl().send()); + requireSuccessful(monitor.setMonitorControl(BigInteger.valueOf(control)).send(), "set control"); + System.out.println("monitor.control.after=" + monitor.getMonitorControl().send()); + String appSdpAddress = app.sdpAddress().send(); + String appMonitorAddress = app.monitorAddress().send(); + System.out.println("app.address=" + app.getContractAddress()); + System.out.println("app.sdp=" + appSdpAddress); + System.out.println("app.monitor=" + appMonitorAddress); + if (!sdpAddress.equalsIgnoreCase(appSdpAddress)) { + requireSuccessful(app.setProtocol(sdpAddress).send(), "bind app SDP"); + appSdpAddress = app.sdpAddress().send(); + System.out.println("app.sdp.after=" + appSdpAddress); + if (!sdpAddress.equalsIgnoreCase(appSdpAddress)) { + throw new IllegalStateException("app SDP bind did not persist"); + } + } + if (!monitorAddress.equalsIgnoreCase(appMonitorAddress)) { + throw new IllegalStateException("app Monitor address does not match"); + } + + String run = args[7] + "-" + Instant.now().getEpochSecond(); + if ("all".equals(selectedVersion) || "v1".equals(selectedVersion)) { + emit("v1", app.sendUnorderedMessage( + targetDomain, + targetApp, + (run + "-sdp-v1").getBytes(StandardCharsets.UTF_8)).send()); + } + if ("all".equals(selectedVersion) || "v2".equals(selectedVersion)) { + emit("v2", app.sendUnorderedV2( + targetApp, + targetDomain, + false, + (run + "-sdp-v2").getBytes(StandardCharsets.UTF_8)).send()); + } + if ("all".equals(selectedVersion) || "v3".equals(selectedVersion)) { + emit("v3", app.sendUnorderedV3( + targetApp, + targetDomain, + false, + (run + "-sdp-v3").getBytes(StandardCharsets.UTF_8), + BigInteger.ZERO, + BigInteger.ZERO).send()); + } + } finally { + if (started) { + service.shutdown(); + } + } + } + + private static void emit(String version, TransactionReceipt receipt) { + requireSuccessful(receipt, "send " + version); + System.out.println(version + ".txHash=" + receipt.getTransactionHash()); + System.out.println(version + ".blockNumber=" + receipt.getBlockNumber()); + System.out.println(version + ".status=" + receipt.getStatus()); + } + + private static void requireSuccessful(TransactionReceipt receipt, String operation) { + if (receipt == null || !receipt.isStatusOK()) { + throw new IllegalStateException( + operation + " failed: " + (receipt == null ? "no receipt" : receipt.getStatus())); + } + } + + private static String requireAddress(String value, String label) { + String normalized = value.startsWith("0x") ? value.substring(2) : value; + if (!normalized.matches("[0-9a-fA-F]{40}")) { + throw new IllegalArgumentException(label + " must be a 20-byte hex address"); + } + return "0x" + normalized.toLowerCase(); + } + + private static byte[] addressToCrossChainId(String address) { + byte[] result = new byte[32]; + String raw = address.substring(2); + for (int i = 0; i < 20; i++) { + result[12 + i] = (byte) Integer.parseInt(raw.substring(i * 2, i * 2 + 2), 16); + } + return result; + } + + private static byte[] parseCrossChainId(String value, String label) { + String normalized = value.startsWith("0x") ? value.substring(2) : value; + if (normalized.matches("[0-9a-fA-F]{40}")) { + return addressToCrossChainId("0x" + normalized.toLowerCase()); + } + if (!normalized.matches("[0-9a-fA-F]{64}")) { + throw new IllegalArgumentException(label + " must be a 20-byte address or 32-byte identity"); + } + byte[] result = new byte[32]; + for (int i = 0; i < result.length; i++) { + result[i] = (byte) Integer.parseInt(normalized.substring(i * 2, i * 2 + 2), 16); + } + return result; + } +} diff --git a/tools/regulatory/EthereumReceiverLiveCheck.java b/tools/regulatory/EthereumReceiverLiveCheck.java new file mode 100644 index 00000000..0b1e5e48 --- /dev/null +++ b/tools/regulatory/EthereumReceiverLiveCheck.java @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: Apache-2.0 */ +package tools.regulatory; + +import com.alipay.antchain.bridge.commons.bbc.DefaultBBCContext; +import com.alipay.antchain.bridge.plugins.ethereum3.EthereumBBCService; +import com.alipay.antchain.bridge.plugins.ethereum3.abi.AppContract; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.bouncycastle.util.encoders.Hex; +import org.web3j.tx.gas.DefaultGasProvider; + +/** Reads the exact byte payload held by a deployed Ethereum demo receiver. */ +public final class EthereumReceiverLiveCheck { + + private EthereumReceiverLiveCheck() {} + + public static void main(String[] args) throws Exception { + if (args.length != 2) { + throw new IllegalArgumentException("expected CONFIG_JSON APP_ADDRESS"); + } + + DefaultBBCContext context = new DefaultBBCContext(); + context.setConfForBlockchainClient(Files.readAllBytes(Path.of(args[0]))); + + EthereumBBCService service = new EthereumBBCService(); + boolean started = false; + try { + service.startup(context); + started = true; + AppContract app = AppContract.load( + args[1], + service.getAcbEthClient().getWeb3j(), + service.getAcbEthClient().getRawTransactionManager(), + new DefaultGasProvider()); + byte[] output = app.getLastUnorderedMsg().send(); + System.out.println("receiver.contract=" + app.getContractAddress()); + System.out.println("receiver.lastUnordered.utf8=" + + new String(output, StandardCharsets.UTF_8)); + System.out.println("receiver.lastUnordered.hex=" + Hex.toHexString(output)); + } finally { + if (started) { + service.shutdown(); + } + } + } +} diff --git a/tools/regulatory/FiscoMessageScanInspect.java b/tools/regulatory/FiscoMessageScanInspect.java new file mode 100644 index 00000000..bcaa1bd0 --- /dev/null +++ b/tools/regulatory/FiscoMessageScanInspect.java @@ -0,0 +1,51 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Root-only live scanner check. Blockchain credentials are supplied through a + * server-side configuration path and are never printed. + */ +package tools.regulatory; + +import com.alipay.antchain.bridge.commons.bbc.DefaultBBCContext; +import com.alipay.antchain.bridge.commons.bbc.syscontract.AuthMessageContract; +import com.alipay.antchain.bridge.commons.bbc.syscontract.ContractStatusEnum; +import com.alipay.antchain.bridge.commons.core.base.CrossChainMessage; +import com.alipay.antchain.bridge.plugins.fiscobcos.FISCOBCOSBBCService; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +public final class FiscoMessageScanInspect { + + private FiscoMessageScanInspect() {} + + public static void main(String[] args) throws Exception { + if (args.length < 3) { + throw new IllegalArgumentException("expected CONFIG_JSON AM_ADDRESS HEIGHT [HEIGHT ...]"); + } + + DefaultBBCContext context = new DefaultBBCContext(); + context.setConfForBlockchainClient(Files.readAllBytes(Path.of(args[0]))); + context.setAuthMessageContract( + new AuthMessageContract(args[1], ContractStatusEnum.CONTRACT_READY)); + + FISCOBCOSBBCService service = new FISCOBCOSBBCService(); + try { + service.startup(context); + for (int i = 2; i < args.length; i++) { + long height = Long.parseLong(args[i]); + List messages = service.readCrossChainMessagesByHeight(height); + System.out.println(height + ".messageCount=" + messages.size()); + for (int j = 0; j < messages.size(); j++) { + CrossChainMessage message = messages.get(j); + System.out.println(height + ".message[" + j + "].payloadBytes=" + + message.getMessage().length); + System.out.println(height + ".message[" + j + "].txHashBytes=" + + message.getProvableData().getTxHash().length); + } + } + } finally { + service.shutdown(); + } + } +} diff --git a/tools/regulatory/FiscoMonitorV123LiveCheck.java b/tools/regulatory/FiscoMonitorV123LiveCheck.java new file mode 100644 index 00000000..b67be811 --- /dev/null +++ b/tools/regulatory/FiscoMonitorV123LiveCheck.java @@ -0,0 +1,170 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Root-only live validation helper for a deployed FISCO-BCOS BBC instance. + * The blockchain configuration (including TLS/account material) is supplied by + * path at runtime and must never be committed to source control. + */ +package tools.regulatory; + +import com.alipay.antchain.bridge.commons.bbc.DefaultBBCContext; +import com.alipay.antchain.bridge.plugins.fiscobcos.FISCOBCOSBBCService; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.AppContract; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.Monitor; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Instant; +import org.fisco.bcos.sdk.v3.model.TransactionReceipt; + +/** + * Deploys a disposable business contract and emits SDP V1/V2/V3 messages. + * + *

Usage: + *

+ * java ... tools.regulatory.FiscoMonitorV123LiveCheck \
+ *   CONFIG_JSON SDP_ADDRESS MONITOR_ADDRESS TARGET_DOMAIN TARGET_APP_ADDRESS \
+ *   CONTROL LABEL [EXISTING_APP_ADDRESS] [--control-only]
+ * 
+ * CONTROL is the protocol value: 1 for normal forwarding (CLOSE), 2 for + * monitored forwarding (OPEN), or "keep" to preserve the existing state. + */ +public final class FiscoMonitorV123LiveCheck { + + private FiscoMonitorV123LiveCheck() {} + + public static void main(String[] args) throws Exception { + if (args.length < 7 || args.length > 9) { + throw new IllegalArgumentException( + "expected CONFIG_JSON SDP MONITOR TARGET_DOMAIN TARGET_APP CONTROL LABEL " + + "[EXISTING_APP] [--control-only]"); + } + + Path configPath = Path.of(args[0]); + String sdpAddress = requireAddress(args[1], "SDP"); + String monitorAddress = requireAddress(args[2], "Monitor"); + String targetDomain = args[3]; + byte[] targetApp = addressToCrossChainId(requireAddress(args[4], "target app")); + Integer control = "keep".equalsIgnoreCase(args[5]) ? null : Integer.valueOf(args[5]); + if (control != null && control != 1 && control != 2) { + throw new IllegalArgumentException("CONTROL must be 1 (normal), 2 (monitored), or keep"); + } + String label = args[6]; + String existingAppAddress = args.length == 8 ? requireAddress(args[7], "existing app") : null; + if (args.length == 9) { + existingAppAddress = requireAddress(args[7], "existing app"); + if (!"--control-only".equals(args[8])) { + throw new IllegalArgumentException("the ninth argument must be --control-only"); + } + } + boolean controlOnly = args.length == 9; + + DefaultBBCContext context = new DefaultBBCContext(); + context.setConfForBlockchainClient(Files.readAllBytes(configPath)); + + FISCOBCOSBBCService service = new FISCOBCOSBBCService(); + boolean started = false; + try { + service.startup(context); + started = true; + + Monitor monitor = Monitor.load(monitorAddress, service.getClient(), service.getKeyPair()); + System.out.println("callerAddress=" + service.getKeyPair().getAddress()); + System.out.println("monitorOwner=" + monitor.owner()); + System.out.println("monitorControl.before=" + monitor.getMonitorControl()); + if (control != null) { + TransactionReceipt controlReceipt = monitor.setMonitorControl(BigInteger.valueOf(control)); + emit("monitorControl", controlReceipt); + requireSuccessful(controlReceipt, "set monitor control"); + Thread.sleep(500L); + } + + AppContract app; + if (existingAppAddress == null) { + app = AppContract.deploy(service.getClient(), service.getKeyPair()); + requireSuccessful(app.setProtocol(sdpAddress), "set app SDP"); + requireSuccessful(app.setMonitorContract(monitorAddress), "set app Monitor"); + } else { + app = AppContract.load(existingAppAddress, service.getClient(), service.getKeyPair()); + if (!sdpAddress.equalsIgnoreCase(app.sdpAddress())) { + throw new IllegalStateException("existing app SDP address does not match"); + } + if (!monitorAddress.equalsIgnoreCase(app.monitorAddress())) { + requireSuccessful( + app.setMonitorContract(monitorAddress), + "rebind existing app Monitor"); + if (!monitorAddress.equalsIgnoreCase(app.monitorAddress())) { + throw new IllegalStateException("existing app Monitor rebind did not persist"); + } + } + } + + System.out.println("appAddress=" + app.getContractAddress()); + System.out.println("monitorControl.after=" + monitor.getMonitorControl()); + System.out.println("sdpAddress=" + app.sdpAddress()); + System.out.println("monitorAddress=" + app.monitorAddress()); + if (controlOnly) { + return; + } + + String run = label + "-" + Instant.now().getEpochSecond(); + emit("v1", app.sendUnorderedMessage( + targetDomain, + targetApp, + (run + "-sdp-v1").getBytes(StandardCharsets.UTF_8))); + emit("v2", app.sendUnorderedV2( + targetApp, + targetDomain, + false, + (run + "-sdp-v2").getBytes(StandardCharsets.UTF_8))); + emit("v3", app.sendUnorderedV3( + targetApp, + targetDomain, + false, + (run + "-sdp-v3").getBytes(StandardCharsets.UTF_8), + BigInteger.ZERO, + BigInteger.ZERO)); + } finally { + if (started) { + service.shutdown(); + } + } + } + + private static void emit(String version, TransactionReceipt receipt) { + if (receipt == null) { + throw new IllegalStateException("send " + version + " failed: no receipt"); + } + System.out.println(version + ".txHash=" + receipt.getTransactionHash()); + System.out.println(version + ".blockNumber=" + receipt.getBlockNumber()); + System.out.println(version + ".status=" + receipt.getStatus()); + System.out.println(version + ".message=" + receipt.getMessage()); + System.out.println(version + ".output=" + receipt.getOutput()); + requireSuccessful(receipt, "send " + version); + } + + private static void requireSuccessful(TransactionReceipt receipt, String operation) { + if (receipt == null || !receipt.isStatusOK()) { + throw new IllegalStateException( + operation + " failed: " + (receipt == null ? "no receipt" : receipt.getStatus())); + } + } + + private static String requireAddress(String value, String label) { + String normalized = value.startsWith("0x") ? value.substring(2) : value; + if (!normalized.matches("[0-9a-fA-F]{40}")) { + throw new IllegalArgumentException(label + " must be a 20-byte hex address"); + } + return "0x" + normalized.toLowerCase(); + } + + private static byte[] addressToCrossChainId(String address) { + String raw = address.substring(2); + byte[] result = new byte[32]; + for (int i = 0; i < 20; i++) { + result[12 + i] = (byte) Integer.parseInt(raw.substring(i * 2, i * 2 + 2), 16); + } + return result; + } +} diff --git a/tools/regulatory/FiscoMonitorVerifierRebind.java b/tools/regulatory/FiscoMonitorVerifierRebind.java new file mode 100644 index 00000000..f44fc31f --- /dev/null +++ b/tools/regulatory/FiscoMonitorVerifierRebind.java @@ -0,0 +1,61 @@ +/* SPDX-License-Identifier: Apache-2.0 */ +package tools.regulatory; + +import com.alipay.antchain.bridge.commons.bbc.DefaultBBCContext; +import com.alipay.antchain.bridge.plugins.fiscobcos.FISCOBCOSBBCService; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.Monitor; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.MonitorVerifier; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.PtcHub; +import java.nio.file.Files; +import java.nio.file.Path; +import org.fisco.bcos.sdk.v3.model.TransactionReceipt; + +/** Rebinds a replacement Monitor to a previously populated MonitorVerifier. */ +public final class FiscoMonitorVerifierRebind { + + private FiscoMonitorVerifierRebind() {} + + public static void main(String[] args) throws Exception { + if (args.length != 4) { + throw new IllegalArgumentException("expected CONFIG_JSON MONITOR PTC_HUB MONITOR_VERIFIER"); + } + DefaultBBCContext context = new DefaultBBCContext(); + context.setConfForBlockchainClient(Files.readAllBytes(Path.of(args[0]))); + FISCOBCOSBBCService service = new FISCOBCOSBBCService(); + boolean started = false; + try { + service.startup(context); + started = true; + Monitor monitor = Monitor.load(args[1], service.getClient(), service.getKeyPair()); + PtcHub ptcHub = PtcHub.load(args[2], service.getClient(), service.getKeyPair()); + MonitorVerifier verifier = MonitorVerifier.load( + args[3], service.getClient(), service.getKeyPair()); + if (!args[2].equalsIgnoreCase(verifier.getPtcHubAddress())) { + throw new IllegalStateException("candidate MonitorVerifier is not bound to the requested PTC Hub"); + } + System.out.println("monitor.verifier.before=" + monitor.getMonitorVerifier()); + System.out.println("ptc.monitorVerifier.before=" + ptcHub.getMonitorVerifier()); + requireSuccessful(monitor.setMonitorVerifier(args[3]), "rebind Monitor"); + requireSuccessful(ptcHub.setMonitorVerifier(args[3]), "rebind PTC Hub"); + System.out.println("monitor.verifier.after=" + monitor.getMonitorVerifier()); + System.out.println("ptc.monitorVerifier.after=" + ptcHub.getMonitorVerifier()); + System.out.println("verifier.ptcHub=" + verifier.getPtcHubAddress()); + if (!args[3].equalsIgnoreCase(monitor.getMonitorVerifier()) + || !args[3].equalsIgnoreCase(ptcHub.getMonitorVerifier())) { + throw new IllegalStateException("MonitorVerifier rebind did not persist"); + } + } finally { + if (started) { + service.shutdown(); + } + } + } + + private static void requireSuccessful(TransactionReceipt receipt, String action) { + if (receipt == null || !receipt.isStatusOK()) { + throw new IllegalStateException( + action + " failed: " + (receipt == null ? "no receipt" : receipt.getStatus())); + } + System.out.println(action + ".txHash=" + receipt.getTransactionHash()); + } +} diff --git a/tools/regulatory/FiscoReceiptInspect.java b/tools/regulatory/FiscoReceiptInspect.java new file mode 100644 index 00000000..9da880f4 --- /dev/null +++ b/tools/regulatory/FiscoReceiptInspect.java @@ -0,0 +1,57 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Root-only receipt inspection helper. Configuration and account material are + * supplied by path at runtime and are never printed or committed. + */ +package tools.regulatory; + +import com.alipay.antchain.bridge.commons.bbc.DefaultBBCContext; +import com.alipay.antchain.bridge.plugins.fiscobcos.FISCOBCOSBBCService; +import java.nio.file.Files; +import java.nio.file.Path; +import org.fisco.bcos.sdk.v3.model.TransactionReceipt; + +public final class FiscoReceiptInspect { + + private FiscoReceiptInspect() {} + + public static void main(String[] args) throws Exception { + if (args.length < 2) { + throw new IllegalArgumentException("expected CONFIG_JSON TX_HASH [TX_HASH ...]"); + } + + DefaultBBCContext context = new DefaultBBCContext(); + context.setConfForBlockchainClient(Files.readAllBytes(Path.of(args[0]))); + + FISCOBCOSBBCService service = new FISCOBCOSBBCService(); + boolean started = false; + try { + service.startup(context); + started = true; + for (int i = 1; i < args.length; i++) { + TransactionReceipt receipt = service.getClient() + .getTransactionReceipt(args[i], true) + .getTransactionReceipt(); + if (receipt == null) { + System.out.println(args[i] + ".receipt=missing"); + continue; + } + System.out.println(args[i] + ".status=" + receipt.getStatus()); + System.out.println(args[i] + ".blockNumber=" + receipt.getBlockNumber()); + System.out.println(args[i] + ".message=" + receipt.getMessage()); + System.out.println(args[i] + ".output=" + receipt.getOutput()); + System.out.println(args[i] + ".logCount=" + receipt.getLogEntries().size()); + for (int j = 0; j < receipt.getLogEntries().size(); j++) { + TransactionReceipt.Logs log = receipt.getLogEntries().get(j); + System.out.println(args[i] + ".log[" + j + "].address=" + log.getAddress()); + System.out.println(args[i] + ".log[" + j + "].topics=" + log.getTopics()); + } + } + } finally { + if (started) { + service.shutdown(); + } + } + } +} diff --git a/tools/regulatory/FiscoReceiverLiveCheck.java b/tools/regulatory/FiscoReceiverLiveCheck.java new file mode 100644 index 00000000..454b6c8a --- /dev/null +++ b/tools/regulatory/FiscoReceiverLiveCheck.java @@ -0,0 +1,48 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Root-only receiver inspection helper. Configuration and account material are + * supplied by path at runtime and are never printed or committed. + */ +package tools.regulatory; + +import com.alipay.antchain.bridge.commons.bbc.DefaultBBCContext; +import com.alipay.antchain.bridge.plugins.fiscobcos.FISCOBCOSBBCService; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.AppContract; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.bouncycastle.util.encoders.Hex; + +/** Reads the exact byte payload held by a deployed FISCO demo receiver. */ +public final class FiscoReceiverLiveCheck { + + private FiscoReceiverLiveCheck() {} + + public static void main(String[] args) throws Exception { + if (args.length != 2) { + throw new IllegalArgumentException("expected CONFIG_JSON APP_ADDRESS"); + } + + DefaultBBCContext context = new DefaultBBCContext(); + context.setConfForBlockchainClient(Files.readAllBytes(Path.of(args[0]))); + + FISCOBCOSBBCService service = new FISCOBCOSBBCService(); + boolean started = false; + try { + service.startup(context); + started = true; + + AppContract app = AppContract.load(args[1], service.getClient(), service.getKeyPair()); + byte[] output = app.getLastUnorderedMsg(); + System.out.println("receiver.contract=" + app.getContractAddress()); + System.out.println("receiver.lastUnordered.utf8=" + + new String(output, StandardCharsets.UTF_8)); + System.out.println("receiver.lastUnordered.hex=" + Hex.toHexString(output)); + } finally { + if (started) { + service.shutdown(); + } + } + } +} diff --git a/tools/regulatory/FiscoSystemBindingInspect.java b/tools/regulatory/FiscoSystemBindingInspect.java new file mode 100644 index 00000000..1a8212e5 --- /dev/null +++ b/tools/regulatory/FiscoSystemBindingInspect.java @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: Apache-2.0 */ +package tools.regulatory; + +import com.alipay.antchain.bridge.commons.bbc.DefaultBBCContext; +import com.alipay.antchain.bridge.plugins.fiscobcos.FISCOBCOSBBCService; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.Monitor; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.MonitorVerifier; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.PtcHub; +import java.nio.file.Files; +import java.nio.file.Path; + +/** Read-only live inspection of the FISCO PTC/MonitorVerifier bindings. */ +public final class FiscoSystemBindingInspect { + + private FiscoSystemBindingInspect() {} + + public static void main(String[] args) throws Exception { + if (args.length != 3) { + throw new IllegalArgumentException("expected CONFIG_JSON PTC_HUB MONITOR"); + } + DefaultBBCContext context = new DefaultBBCContext(); + context.setConfForBlockchainClient(Files.readAllBytes(Path.of(args[0]))); + FISCOBCOSBBCService service = new FISCOBCOSBBCService(); + boolean started = false; + try { + service.startup(context); + started = true; + Monitor monitor = Monitor.load(args[2], service.getClient(), service.getKeyPair()); + String verifierAddress = monitor.getMonitorVerifier(); + PtcHub ptcHub = PtcHub.load(args[1], service.getClient(), service.getKeyPair()); + MonitorVerifier verifier = MonitorVerifier.load( + verifierAddress, service.getClient(), service.getKeyPair()); + System.out.println("monitor.version=" + monitor.getImplementationVersion()); + System.out.println("monitor.control=" + monitor.getMonitorControl()); + System.out.println("monitor.sdp=" + monitor.sdpAddress()); + System.out.println("monitor.verifier=" + verifierAddress); + System.out.println("ptc.monitorVerifier=" + ptcHub.getMonitorVerifier()); + System.out.println("verifier.ptcHub=" + verifier.getPtcHubAddress()); + } finally { + if (started) { + service.shutdown(); + } + } + } +} diff --git a/tools/regulatory/FiscoSystemContractsDeploy.java b/tools/regulatory/FiscoSystemContractsDeploy.java new file mode 100644 index 00000000..bfba0eff --- /dev/null +++ b/tools/regulatory/FiscoSystemContractsDeploy.java @@ -0,0 +1,70 @@ +/* SPDX-License-Identifier: Apache-2.0 */ +package tools.regulatory; + +import com.alipay.antchain.bridge.commons.bbc.DefaultBBCContext; +import com.alipay.antchain.bridge.plugins.fiscobcos.FISCOBCOSBBCService; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.Monitor; +import com.alipay.antchain.bridge.plugins.fiscobcos.abi.SDPMsg; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * Deploys and wires a complete FISCO BBC contract set using an explicit, + * persistent account configured in the supplied root-only JSON file. + */ +public final class FiscoSystemContractsDeploy { + + private FiscoSystemContractsDeploy() {} + + public static void main(String[] args) throws Exception { + if (args.length != 2) { + throw new IllegalArgumentException("expected CONFIG_JSON LOCAL_DOMAIN"); + } + + DefaultBBCContext context = new DefaultBBCContext(); + context.setConfForBlockchainClient(Files.readAllBytes(Path.of(args[0]))); + + FISCOBCOSBBCService service = new FISCOBCOSBBCService(); + try { + service.startup(context); + System.out.println("owner=" + service.getKeyPair().getAddress()); + + service.setupAuthMessageContract(); + service.setupSDPMessageContract(); + service.setupMonitorContract(); + service.setupPTCContract(); + + String am = context.getAuthMessageContract().getContractAddress(); + String sdp = context.getSdpContract().getContractAddress(); + String monitor = context.getMonitorContract().getContractAddress(); + String ptc = context.getPtcContract().getContractAddress(); + + service.setProtocol(sdp, "0"); + service.setPtcContract(ptc); + service.setAmContract(am); + service.setLocalDomain(args[1]); + service.setMonitorContract(monitor); + service.setMonitorControl(2); + service.setProtocolInMonitor(sdp); + service.setPtcHubInMonitorVerifier(ptc); + + SDPMsg sdpContract = SDPMsg.load(sdp, service.getClient(), service.getKeyPair()); + Monitor monitorContract = Monitor.load( + monitor, + service.getClient(), + service.getKeyPair()); + + System.out.println("am=" + am); + System.out.println("sdp=" + sdp); + System.out.println("monitor=" + monitor); + System.out.println("ptc=" + ptc); + System.out.println("sdp.routingVersion=" + sdpContract.getMonitorRoutingVersion()); + System.out.println("monitor.implementationVersion=" + monitorContract.getImplementationVersion()); + System.out.println("monitor.owner=" + monitorContract.owner()); + System.out.println("monitor.control=" + monitorContract.getMonitorControl()); + System.out.println("monitor.protocol=" + monitorContract.getProtocol()); + } finally { + service.shutdown(); + } + } +} diff --git a/tools/regulatory/MychainMonitorV123LiveCheck.java b/tools/regulatory/MychainMonitorV123LiveCheck.java new file mode 100644 index 00000000..4db815da --- /dev/null +++ b/tools/regulatory/MychainMonitorV123LiveCheck.java @@ -0,0 +1,150 @@ +/* SPDX-License-Identifier: Apache-2.0 */ +package tools.regulatory; + +import com.alipay.antchain.bridge.commons.core.base.SendResponseResult; +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Config; +import com.alipay.mychain.sdk.api.utils.Utils; +import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.crypto.hash.Hash; +import com.alipay.mychain.sdk.domain.account.Identity; +import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; +import com.alipay.mychain.sdk.vm.EVMOutput; +import com.alipay.mychain.sdk.vm.EVMParameter; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Instant; +import java.util.UUID; +import org.bouncycastle.util.encoders.Hex; +import org.slf4j.helpers.NOPLogger; + +/** Root-only live check for Mychain Monitor V6 and SDP V1/V2/V3 routing. */ +public final class MychainMonitorV123LiveCheck { + + private static final String SENDER_BINARY = + "/contracts/monitor_demo/MonitorV123SenderContract.bin"; + + private MychainMonitorV123LiveCheck() {} + + public static void main(String[] args) throws Exception { + if (args.length < 7 || args.length > 8) { + throw new IllegalArgumentException( + "expected CONFIG SDP MONITOR TARGET_DOMAIN TARGET_ID CONTROL LABEL [SENDER]"); + } + Path configPath = Path.of(args[0]); + String sdpContract = args[1]; + String monitorContract = args[2]; + String targetDomain = args[3]; + Identity target = new Identity(new Hash(Hex.decode(normalizeIdentity(args[4])))); + int control = Integer.parseInt(args[5]); + if (control != 1 && control != 2) { + throw new IllegalArgumentException("CONTROL must be 1 (normal) or 2 (monitored)"); + } + + Mychain020Config config = Mychain020Config.fromJsonString( + Files.readString(configPath, StandardCharsets.UTF_8)); + Mychain020Client client = new Mychain020Client( + config.toJsonString().getBytes(StandardCharsets.UTF_8), + NOPLogger.NOP_LOGGER); + try { + require(client.startup(), "startup mychain sdk failed"); + System.out.println("monitor.implementationVersion=" + + localUint(client, monitorContract, "getImplementationVersion()")); + System.out.println("sdp.monitorRoutingVersion=" + + localUint(client, sdpContract, "getMonitorRoutingVersion()")); + + EVMParameter setControl = new EVMParameter("setMonitorControl(uint32)"); + setControl.addUint(BigInteger.valueOf(control)); + requireSuccess(client.callContract(monitorContract, setControl, true), "set monitor control"); + System.out.println("monitor.control=" + + localUint(client, monitorContract, "getMonitorControl()")); + + String sender = args.length == 8 + ? args[7] + : "MonitorV123Sender_" + UUID.randomUUID(); + if (args.length != 8) { + require( + client.deployContract( + SENDER_BINARY, sender, VMTypeEnum.EVM, new EVMParameter()), + "deploy sender failed"); + EVMParameter bind = new EVMParameter("setContracts(identity,identity)"); + bind.addIdentity(Utils.getIdentityByName( + sdpContract, client.getConfig().getMychainHashType())); + bind.addIdentity(Utils.getIdentityByName( + monitorContract, client.getConfig().getMychainHashType())); + requireSuccess(client.callContract(sender, bind, true), "bind sender SDP"); + } + + Identity senderIdentity = Utils.getIdentityByName( + sender, client.getConfig().getMychainHashType()); + System.out.println("sender.contract=" + sender); + System.out.println("sender.identity=" + senderIdentity.hexStrValue()); + + String run = args[6] + "-" + Instant.now().getEpochSecond(); + EVMParameter v1 = new EVMParameter("sendUnordered(identity,string,bytes)"); + v1.addIdentity(target); + v1.addString(targetDomain); + v1.addBytes((run + "-sdp-v1").getBytes(StandardCharsets.UTF_8)); + emit("v1", client.callContract(sender, v1, true)); + + EVMParameter v2 = new EVMParameter("sendUnorderedV2(identity,string,bool,bytes)"); + v2.addIdentity(target); + v2.addString(targetDomain); + v2.addBool(false); + v2.addBytes((run + "-sdp-v2").getBytes(StandardCharsets.UTF_8)); + emit("v2", client.callContract(sender, v2, true)); + + EVMParameter v3 = new EVMParameter( + "sendUnorderedV3(identity,string,bool,bytes,uint8,uint256)"); + v3.addIdentity(target); + v3.addString(targetDomain); + v3.addBool(false); + v3.addBytes((run + "-sdp-v3").getBytes(StandardCharsets.UTF_8)); + v3.addUint(BigInteger.ZERO); + v3.addUint(BigInteger.ZERO); + emit("v3", client.callContract(sender, v3, true)); + } finally { + client.shutdown(); + } + } + + private static BigInteger localUint( + Mychain020Client client, String contract, String signature) { + TransactionReceipt receipt = client.localCallContract(contract, new EVMParameter(signature)); + require(receipt != null, "empty local call receipt for " + signature); + require(receipt.getResult() == ErrorCode.SUCCESS.getErrorCode(), + "local call failed for " + signature + ": " + receipt.getResult()); + return new EVMOutput(Hex.toHexString(receipt.getOutput())).getUint(); + } + + private static void emit(String version, SendResponseResult result) { + requireSuccess(result, "send " + version); + System.out.println(version + ".txHash=" + result.getTxId()); + System.out.println(version + ".confirmed=" + result.isConfirmed()); + System.out.println(version + ".success=" + result.isSuccess()); + } + + private static void requireSuccess(SendResponseResult result, String operation) { + require(result != null, operation + " returned no response"); + require(result.isSuccess(), operation + " failed: tx=" + result.getTxId() + + ", code=" + result.getErrorCode() + + ", message=" + result.getErrorMessage()); + } + + private static void require(boolean condition, String message) { + if (!condition) { + throw new IllegalStateException(message); + } + } + + private static String normalizeIdentity(String value) { + String normalized = value.startsWith("0x") ? value.substring(2) : value; + if (!normalized.matches("[0-9a-fA-F]{64}")) { + throw new IllegalArgumentException("TARGET_ID must be a 32-byte hex identity"); + } + return normalized; + } +} diff --git a/tools/regulatory/MychainPtcRootReconcileLiveCheck.java b/tools/regulatory/MychainPtcRootReconcileLiveCheck.java new file mode 100644 index 00000000..679ab446 --- /dev/null +++ b/tools/regulatory/MychainPtcRootReconcileLiveCheck.java @@ -0,0 +1,100 @@ +/* SPDX-License-Identifier: Apache-2.0 */ +package tools.regulatory; + +import com.alipay.antchain.bridge.plugins.mychain020.contract.PtcContractEvm; +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Config; +import com.alipay.antchain.bridge.commons.bcdns.AbstractCrossChainCertificate; +import com.alipay.antchain.bridge.commons.bcdns.utils.CrossChainCertificateUtil; +import com.alipay.mychain.sdk.crypto.hash.HashFactory; +import com.alipay.mychain.sdk.crypto.hash.HashTypeEnum; +import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; +import com.alipay.mychain.sdk.vm.EVMOutput; +import com.alipay.mychain.sdk.vm.EVMParameter; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import org.bouncycastle.util.encoders.Hex; +import org.slf4j.helpers.NOPLogger; + +/** Root-only live reconciliation check for an existing Mychain PTC Hub. */ +public final class MychainPtcRootReconcileLiveCheck { + + private MychainPtcRootReconcileLiveCheck() {} + + public static void main(String[] args) throws Exception { + if (args.length != 2) { + throw new IllegalArgumentException("expected CONFIG PTC_HUB"); + } + Mychain020Config config = Mychain020Config.fromJsonString( + Files.readString(Path.of(args[0]), StandardCharsets.UTF_8)); + Mychain020Client client = new Mychain020Client( + config.toJsonString().getBytes(StandardCharsets.UTF_8), + NOPLogger.NOP_LOGGER); + try { + require(client.startup(), "startup mychain sdk failed"); + PtcContractEvm ptc = new PtcContractEvm(client, NOPLogger.NOP_LOGGER); + ptc.setContractAddress(args[1]); + AbstractCrossChainCertificate rootCert = + CrossChainCertificateUtil.readCrossChainCertificateFromPem( + config.getBcdnsRootCertPem().getBytes(StandardCharsets.UTF_8)); + byte[] ownerKey = HashFactory.getHash(HashTypeEnum.Keccak).hash( + rootCert.getCredentialSubjectInstance().getApplicant().encode()); + System.out.println("ptc.configRootOwner=" + + rootCert.getCredentialSubjectInstance().getApplicant().toHex()); + System.out.println("ptc.implementationVersion.before=" + + queryVersion(client, args[1])); + printRootState(client, args[1], rootCert.encode(), ownerKey, "before"); + require(ptc.reconcileRootBcdnsCert(config.getBcdnsRootCertPem()), + "PTC Hub root reconciliation failed"); + System.out.println("ptc.implementationVersion.after=" + + queryVersion(client, args[1])); + printRootState(client, args[1], rootCert.encode(), ownerKey, "after"); + System.out.println("ptc.rootReconciled=true"); + } finally { + client.shutdown(); + } + } + + private static void printRootState( + Mychain020Client client, + String contract, + byte[] expectedRoot, + byte[] ownerKey, + String phase) { + EVMParameter rootParameters = new EVMParameter("bcdnsCertMap(string)"); + rootParameters.addString("root"); + TransactionReceipt rootReceipt = client.localCallContract(contract, rootParameters); + require(rootReceipt != null && rootReceipt.getResult() == ErrorCode.SUCCESS.getErrorCode(), + "root certificate query failed"); + byte[] onChainRoot = new EVMOutput(Hex.toHexString(rootReceipt.getOutput())).getBytes(); + + EVMParameter ownerParameters = + new EVMParameter("ownerOidToBcdnsDomainSpaceMap(bytes32)"); + ownerParameters.addBytes32(ownerKey); + TransactionReceipt ownerReceipt = client.localCallContract(contract, ownerParameters); + require(ownerReceipt != null && ownerReceipt.getResult() == ErrorCode.SUCCESS.getErrorCode(), + "root owner query failed"); + String alias = new EVMOutput(Hex.toHexString(ownerReceipt.getOutput())).getString(); + System.out.println("ptc.rootMatchesConfig." + phase + "=" + + java.util.Arrays.equals(expectedRoot, onChainRoot)); + System.out.println("ptc.rootOwnerAlias." + phase + "=" + alias); + } + + private static BigInteger queryVersion(Mychain020Client client, String contract) { + TransactionReceipt receipt = client.localCallContract( + contract, new EVMParameter("getImplementationVersion()")); + require(receipt != null, "empty implementation version receipt"); + require(receipt.getResult() == ErrorCode.SUCCESS.getErrorCode(), + "implementation version query failed: " + receipt.getResult()); + return new EVMOutput(Hex.toHexString(receipt.getOutput())).getUint(); + } + + private static void require(boolean condition, String message) { + if (!condition) { + throw new IllegalStateException(message); + } + } +} diff --git a/tools/regulatory/MychainReceiverLiveCheck.java b/tools/regulatory/MychainReceiverLiveCheck.java new file mode 100644 index 00000000..23323b08 --- /dev/null +++ b/tools/regulatory/MychainReceiverLiveCheck.java @@ -0,0 +1,66 @@ +/* SPDX-License-Identifier: Apache-2.0 */ +package tools.regulatory; + +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Client; +import com.alipay.antchain.bridge.plugins.mychain020.sdk.Mychain020Config; +import com.alipay.mychain.sdk.api.utils.Utils; +import com.alipay.mychain.sdk.common.VMTypeEnum; +import com.alipay.mychain.sdk.domain.transaction.TransactionReceipt; +import com.alipay.mychain.sdk.errorcode.ErrorCode; +import com.alipay.mychain.sdk.vm.EVMOutput; +import com.alipay.mychain.sdk.vm.EVMParameter; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.UUID; +import org.bouncycastle.util.encoders.Hex; +import org.slf4j.helpers.NOPLogger; + +/** Deploys or inspects the Mychain demo receiver used by cross-chain V1/V2/V3 checks. */ +public final class MychainReceiverLiveCheck { + + private static final String RECEIVER_BINARY = "/contracts/demo_v2/receiver.bin"; + + private MychainReceiverLiveCheck() {} + + public static void main(String[] args) throws Exception { + if (args.length < 1 || args.length > 2) { + throw new IllegalArgumentException("expected CONFIG [RECEIVER]"); + } + Mychain020Config config = Mychain020Config.fromJsonString( + Files.readString(Path.of(args[0]), StandardCharsets.UTF_8)); + Mychain020Client client = new Mychain020Client( + config.toJsonString().getBytes(StandardCharsets.UTF_8), + NOPLogger.NOP_LOGGER); + try { + require(client.startup(), "startup mychain sdk failed"); + String receiver = args.length == 2 + ? args[1] + : "MonitorV123Receiver_" + UUID.randomUUID(); + if (args.length != 2) { + require(client.deployContract( + RECEIVER_BINARY, receiver, VMTypeEnum.EVM, new EVMParameter()), + "deploy receiver failed"); + } + System.out.println("receiver.contract=" + receiver); + System.out.println("receiver.identity=" + Utils.getIdentityByName( + receiver, client.getConfig().getMychainHashType()).hexStrValue()); + TransactionReceipt receipt = client.localCallContract( + receiver, new EVMParameter("getLastUnorderedMsg()")); + require(receipt != null && receipt.getResult() == ErrorCode.SUCCESS.getErrorCode(), + "query receiver failed"); + byte[] output = new EVMOutput(Hex.toHexString(receipt.getOutput())).getBytes(); + System.out.println("receiver.lastUnordered.utf8=" + + new String(output, StandardCharsets.UTF_8)); + System.out.println("receiver.lastUnordered.hex=" + Hex.toHexString(output)); + } finally { + client.shutdown(); + } + } + + private static void require(boolean condition, String message) { + if (!condition) { + throw new IllegalStateException(message); + } + } +} diff --git a/tools/regulatory/README.md b/tools/regulatory/README.md new file mode 100644 index 00000000..6a9d32e9 --- /dev/null +++ b/tools/regulatory/README.md @@ -0,0 +1,46 @@ +# Regulatory live-check tools + +These small Java entry points are operational acceptance tools for the +SDP V1/V2/V3 monitor compatibility work. They are intentionally kept outside +the production modules: they connect to configured test chains, deploy or call +test contracts, and therefore must only be run by an operator in an isolated +test environment. + +No endpoint, account, certificate, or private key is embedded in these files. +Chain configuration is supplied at runtime through a root-only JSON file. + +## Tools + +| Class | Purpose | +| --- | --- | +| `EthereumMonitorV123LiveCheck` | Send normal or monitored SDP V1/V2/V3 messages from an Ethereum demo app; an optional selector limits a run to one version | +| `EthereumReceiverLiveCheck` | Read the exact byte payload stored by an Ethereum demo receiver | +| `FiscoMonitorV123LiveCheck` | Send normal or monitored SDP V1/V2/V3 messages from a FISCO demo app | +| `FiscoReceiverLiveCheck` | Read the exact byte payload held by the FISCO demo receiver contract | +| `MychainMonitorV123LiveCheck` | Probe Monitor/SDP versions and send Mychain SDP V1/V2/V3 messages | +| `MychainReceiverLiveCheck` | Read the exact byte payload held by the Mychain receiver contract | +| `FiscoMessageScanInspect` | Inspect FISCO cross-chain message scan results | +| `FiscoReceiptInspect` | Inspect FISCO transaction receipts and emitted events | +| `FiscoSystemBindingInspect` | Verify FISCO AM/SDP/Monitor/PTC bindings | +| `FiscoMonitorVerifierRebind` | Rebind a replacement Monitor to a populated legacy MonitorVerifier after an audited upgrade | +| `FiscoSystemContractsDeploy` | Deploy the FISCO system-contract test set | +| `MychainPtcRootReconcileLiveCheck` | Probe and reconcile a legacy Mychain PTC Hub BCDNS root | +| `CrossChainPayloadInspect` | Decode captured AuthMessage/SDP payloads for byte-level comparison | + +## Acceptance rules + +1. Add the test sender-to-receiver pair to the Relayer ACL before sending. +2. Run normal and monitored modes sequentially because monitor control is + contract-wide mutable state. +3. Record all three source transaction hashes. +4. Wait for the source chain's configured confirmation depth; a successful + source receipt alone is not a cross-chain success. +5. Verify the Relayer archive and target receipt for each V1/V2/V3 message. +6. For monitored messages, verify that the reporting result reaches target + execution. +7. Read the target business receiver and compare its bytes with the original + payload. A successful receipt with truncated, zero-padded, or still-wrapped + bytes is a failed acceptance test. + +Do not commit the runtime configuration JSON, compiled classes, logs, account +files, or contract private keys.