diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index ca01e9404a..54c1d1b5e5 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -65,10 +65,6 @@ BurnWithFromMintTokenPool_lockOrBurn:testPermissionsErrorReverts() (gas: 12761) BurnWithFromMintTokenPool_lockOrBurn:testPoolBurnRevertNotHealthyReverts() (gas: 54151) BurnWithFromMintTokenPool_lockOrBurn:testPoolBurnSuccess() (gas: 201193) CCIPClientExample_sanity:testExamples() (gas: 2218000) -CallWithExactGas_callWithExactGas:test_CallWithExactGasSuccess() (gas: 22403) -CallWithExactGas_callWithExactGas:test_NoContractReverts() (gas: 10465) -CallWithExactGas_callWithExactGas:test_NoGasForCallExactCheckReverts() (gas: 14036) -CallWithExactGas_callWithExactGas:test_NotEnoughGasForCallReverts() (gas: 15120) CommitStore_constructor:testConstructorSuccess() (gas: 3344466) CommitStore_isUnpausedAndARMHealthy:testARMSuccess() (gas: 71321) CommitStore_report:testInvalidIntervalMinLargerThanMaxReverts() (gas: 26324) @@ -99,15 +95,15 @@ CommitStore_verify:testPausedReverts() (gas: 18438) CommitStore_verify:testTooManyLeavesReverts() (gas: 36830) DefensiveExampleTest:testHappyPathSuccess() (gas: 174862) DefensiveExampleTest:testRecovery() (gas: 399786) -E2E:testE2E_3MessagesSuccess_gas() (gas: 887468) -EVM2EVMOffRamp__releaseOrMintTokens:testRateLimitErrorsReverts() (gas: 443866) -EVM2EVMOffRamp__releaseOrMintTokens:testTokenHandlingErrorReverts() (gas: 103420) +E2E:testE2E_3MessagesSuccess_gas() (gas: 887723) +EVM2EVMOffRamp__releaseOrMintTokens:testRateLimitErrorsReverts() (gas: 443946) +EVM2EVMOffRamp__releaseOrMintTokens:testTokenHandlingErrorReverts() (gas: 103436) EVM2EVMOffRamp__releaseOrMintTokens:testUnsupportedTokenReverts() (gas: 18202) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokensSuccess() (gas: 140615) -EVM2EVMOffRamp__report:testReportSuccess() (gas: 127168) -EVM2EVMOffRamp__trialExecute:testRateLimitErrorSuccess() (gas: 174918) -EVM2EVMOffRamp__trialExecute:testTokenHandlingErrorIsCaughtSuccess() (gas: 183240) -EVM2EVMOffRamp__trialExecute:test_trialExecuteSuccess() (gas: 236708) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokensSuccess() (gas: 140631) +EVM2EVMOffRamp__report:testReportSuccess() (gas: 127236) +EVM2EVMOffRamp__trialExecute:testRateLimitErrorSuccess() (gas: 174934) +EVM2EVMOffRamp__trialExecute:testTokenHandlingErrorIsCaughtSuccess() (gas: 183256) +EVM2EVMOffRamp__trialExecute:test_trialExecuteSuccess() (gas: 236792) EVM2EVMOffRamp_applyPoolUpdates:testApplyPoolUpdatesSuccess() (gas: 2435136) EVM2EVMOffRamp_applyPoolUpdates:testInvalidTokenPoolConfigReverts() (gas: 17445) EVM2EVMOffRamp_applyPoolUpdates:testOnlyCallableByOwnerReverts() (gas: 16012) @@ -116,56 +112,56 @@ EVM2EVMOffRamp_applyPoolUpdates:testPoolDoesNotExistReverts() (gas: 2399537) EVM2EVMOffRamp_applyPoolUpdates:testTokenPoolMismatchReverts() (gas: 4928727) EVM2EVMOffRamp_ccipReceive:testReverts() (gas: 17072) EVM2EVMOffRamp_constructor:testCommitStoreAlreadyInUseReverts() (gas: 168848) -EVM2EVMOffRamp_constructor:testConstructorSuccess() (gas: 5728147) +EVM2EVMOffRamp_constructor:testConstructorSuccess() (gas: 5730956) EVM2EVMOffRamp_constructor:testTokenConfigMismatchReverts() (gas: 145215) EVM2EVMOffRamp_constructor:testZeroOnRampAddressReverts() (gas: 2538111) -EVM2EVMOffRamp_execute:testAlreadyExecutedReverts() (gas: 137220) +EVM2EVMOffRamp_execute:testAlreadyExecutedReverts() (gas: 137288) EVM2EVMOffRamp_execute:testEmptyReportReverts() (gas: 19016) EVM2EVMOffRamp_execute:testInvalidMessageIdReverts() (gas: 34063) EVM2EVMOffRamp_execute:testInvalidSourceChainReverts() (gas: 49347) EVM2EVMOffRamp_execute:testManualExecutionNotYetEnabledReverts() (gas: 44104) EVM2EVMOffRamp_execute:testMessageTooLargeReverts() (gas: 150111) EVM2EVMOffRamp_execute:testPausedReverts() (gas: 74942) -EVM2EVMOffRamp_execute:testReceiverErrorSuccess() (gas: 163586) +EVM2EVMOffRamp_execute:testReceiverErrorSuccess() (gas: 163658) EVM2EVMOffRamp_execute:testRootNotCommittedReverts() (gas: 38980) -EVM2EVMOffRamp_execute:testRouterYULCallReverts() (gas: 413655) -EVM2EVMOffRamp_execute:testSingleMessageNoTokensSuccess() (gas: 173329) +EVM2EVMOffRamp_execute:testRouterYULCallReverts() (gas: 413652) +EVM2EVMOffRamp_execute:testSingleMessageNoTokensSuccess() (gas: 173465) EVM2EVMOffRamp_execute:testSingleMessageToNonCCIPReceiverSuccess() (gas: 246243) -EVM2EVMOffRamp_execute:testSingleMessagesNoTokensSuccess_gas() (gas: 114564) -EVM2EVMOffRamp_execute:testSkippedIncorrectNonceStillExecutesSuccess() (gas: 323987) +EVM2EVMOffRamp_execute:testSingleMessagesNoTokensSuccess_gas() (gas: 114632) +EVM2EVMOffRamp_execute:testSkippedIncorrectNonceStillExecutesSuccess() (gas: 324071) EVM2EVMOffRamp_execute:testSkippedIncorrectNonceSuccess() (gas: 51868) -EVM2EVMOffRamp_execute:testStrictUntouchedToSuccessSuccess() (gas: 130786) +EVM2EVMOffRamp_execute:testStrictUntouchedToSuccessSuccess() (gas: 130854) EVM2EVMOffRamp_execute:testTokenDataMismatchReverts() (gas: 49702) -EVM2EVMOffRamp_execute:testTwoMessagesWithTokensAndGESuccess() (gas: 443148) -EVM2EVMOffRamp_execute:testTwoMessagesWithTokensSuccess_gas() (gas: 402322) +EVM2EVMOffRamp_execute:testTwoMessagesWithTokensAndGESuccess() (gas: 443316) +EVM2EVMOffRamp_execute:testTwoMessagesWithTokensSuccess_gas() (gas: 402490) EVM2EVMOffRamp_execute:testUnexpectedTokenDataReverts() (gas: 33032) -EVM2EVMOffRamp_execute:testUnhealthyReverts() (gas: 419749) +EVM2EVMOffRamp_execute:testUnhealthyReverts() (gas: 419917) EVM2EVMOffRamp_execute:testUnsupportedNumberOfTokensReverts() (gas: 61416) EVM2EVMOffRamp_execute:testUnsupportedTokenReverts() (gas: 130374) EVM2EVMOffRamp_executeSingleMessage:testMessageSenderReverts() (gas: 20545) -EVM2EVMOffRamp_executeSingleMessage:testNoTokensSuccess() (gas: 47965) +EVM2EVMOffRamp_executeSingleMessage:testNoTokensSuccess() (gas: 48033) EVM2EVMOffRamp_executeSingleMessage:testNonContractSuccess() (gas: 20105) -EVM2EVMOffRamp_executeSingleMessage:testNonContractWithTokensSuccess() (gas: 205101) -EVM2EVMOffRamp_executeSingleMessage:testTokenHandlingErrorReverts() (gas: 140016) -EVM2EVMOffRamp_executeSingleMessage:testTokensSuccess() (gas: 233993) -EVM2EVMOffRamp_executeSingleMessage:testZeroGasDONExecutionReverts() (gas: 48513) -EVM2EVMOffRamp_execute_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 231891) -EVM2EVMOffRamp_execute_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 279708) -EVM2EVMOffRamp_execute_upgrade:testV2OffRampNonceSkipsIfMsgInFlightSuccess() (gas: 260943) -EVM2EVMOffRamp_execute_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 224998) -EVM2EVMOffRamp_execute_upgrade:testV2Success() (gas: 131301) +EVM2EVMOffRamp_executeSingleMessage:testNonContractWithTokensSuccess() (gas: 205117) +EVM2EVMOffRamp_executeSingleMessage:testTokenHandlingErrorReverts() (gas: 140032) +EVM2EVMOffRamp_executeSingleMessage:testTokensSuccess() (gas: 234077) +EVM2EVMOffRamp_executeSingleMessage:testZeroGasDONExecutionReverts() (gas: 48581) +EVM2EVMOffRamp_execute_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 232027) +EVM2EVMOffRamp_execute_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 279912) +EVM2EVMOffRamp_execute_upgrade:testV2OffRampNonceSkipsIfMsgInFlightSuccess() (gas: 261079) +EVM2EVMOffRamp_execute_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 225202) +EVM2EVMOffRamp_execute_upgrade:testV2Success() (gas: 131369) EVM2EVMOffRamp_getDestinationToken:testGetDestinationTokenSuccess() (gas: 32786) EVM2EVMOffRamp_getDestinationToken:testUnsupportedTokenReverts() (gas: 13763) EVM2EVMOffRamp_getDestinationTokens:testGetDestinationTokensSuccess() (gas: 26091) EVM2EVMOffRamp_getExecutionState:testFillExecutionStateSuccess() (gas: 3047481) EVM2EVMOffRamp_getExecutionState:test_GetExecutionStateSuccess() (gas: 76354) -EVM2EVMOffRamp_manuallyExecute:testLowGasLimitManualExecSuccess() (gas: 496743) +EVM2EVMOffRamp_manuallyExecute:testLowGasLimitManualExecSuccess() (gas: 496879) EVM2EVMOffRamp_manuallyExecute:testManualExecForkedChainReverts() (gas: 25977) EVM2EVMOffRamp_manuallyExecute:testManualExecGasLimitMismatchReverts() (gas: 43615) EVM2EVMOffRamp_manuallyExecute:testManualExecInvalidGasLimitReverts() (gas: 26018) -EVM2EVMOffRamp_manuallyExecute:testManualExecSuccess() (gas: 189423) -EVM2EVMOffRamp_manuallyExecute:testManualExecWithGasOverrideSuccess() (gas: 190050) -EVM2EVMOffRamp_manuallyExecute:testReentrancyManualExecuteFAILS() (gas: 1856134) +EVM2EVMOffRamp_manuallyExecute:testManualExecSuccess() (gas: 189562) +EVM2EVMOffRamp_manuallyExecute:testManualExecWithGasOverrideSuccess() (gas: 190189) +EVM2EVMOffRamp_manuallyExecute:testReentrancyManualExecuteFAILS() (gas: 1856211) EVM2EVMOffRamp_metadataHash:testMetadataHashSuccess() (gas: 6086) EVM2EVMOffRamp_setDynamicConfig:testNonOwnerReverts() (gas: 44539) EVM2EVMOffRamp_setDynamicConfig:testRouterZeroAddressReverts() (gas: 38587) @@ -346,7 +342,7 @@ RateLimiter_currentTokenBucketState:testCurrentTokenBucketStateSuccess() (gas: 3 RateLimiter_currentTokenBucketState:testRefillSuccess() (gas: 41673) RateLimiter_setTokenBucketConfig:testSetRateLimiterConfigSuccess() (gas: 35459) Router_applyRampUpdates:testOffRampMismatchReverts() (gas: 89355) -Router_applyRampUpdates:testOffRampUpdatesWithRouting() (gas: 8494015) +Router_applyRampUpdates:testOffRampUpdatesWithRouting() (gas: 8510939) Router_applyRampUpdates:testOnRampDisable() (gas: 52544) Router_applyRampUpdates:testOnlyOwnerReverts() (gas: 12305) Router_ccipSend:testCCIPSendLinkFeeNoTokenSuccess_gas() (gas: 110664) @@ -374,11 +370,11 @@ Router_recoverTokens:testRecoverTokensNoFundsReverts() (gas: 17770) Router_recoverTokens:testRecoverTokensNonOwnerReverts() (gas: 15354) Router_recoverTokens:testRecoverTokensSuccess() (gas: 48644) Router_recoverTokens:testRecoverTokensValueReceiverReverts() (gas: 444763) -Router_routeMessage:testAutoExecSuccess() (gas: 39367) -Router_routeMessage:testExecutionEventSuccess() (gas: 210301) -Router_routeMessage:testManualExecSuccess() (gas: 31419) -Router_routeMessage:testOnlyOffRampReverts() (gas: 27315) -Router_routeMessage:testWhenNotHealthyReverts() (gas: 43002) +Router_routeMessage:testAutoExecSuccess() (gas: 39512) +Router_routeMessage:testExecutionEventSuccess() (gas: 210701) +Router_routeMessage:testManualExecSuccess() (gas: 31555) +Router_routeMessage:testOnlyOffRampReverts() (gas: 27340) +Router_routeMessage:testWhenNotHealthyReverts() (gas: 43027) Router_setWrappedNative:testOnlyOwnerReverts() (gas: 10978) SelfFundedPingPong_ccipReceive:test_FundingIfNotANopReverts() (gas: 53509) SelfFundedPingPong_ccipReceive:test_FundingSuccess() (gas: 403626) diff --git a/contracts/gas-snapshots/shared.gas-snapshot b/contracts/gas-snapshots/shared.gas-snapshot index 3fb4d67e0f..f62dd6bb6a 100644 --- a/contracts/gas-snapshots/shared.gas-snapshot +++ b/contracts/gas-snapshots/shared.gas-snapshot @@ -25,6 +25,10 @@ BurnMintERC677_mint:testSenderNotMinterReverts() (gas: 11195) BurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 8685) BurnMintERC677_transfer:testInvalidAddressReverts() (gas: 10639) BurnMintERC677_transfer:testTransferSuccess() (gas: 39462) +CallWithExactGas__callWithExactGasSafeReturnData:test_CallWithExactGasSafeReturnDataExactGas() (gas: 18955) +CallWithExactGas__callWithExactGasSafeReturnData:test_NoContractReverts() (gas: 12313) +CallWithExactGas__callWithExactGasSafeReturnData:test_NoGasForCallExactCheckReverts() (gas: 13177) +CallWithExactGas__callWithExactGasSafeReturnData:test_NotEnoughGasForCallReverts() (gas: 13608) EnumerableMapAddresses_at:testAtSuccess() (gas: 98813) EnumerableMapAddresses_contains:testContainsSuccess() (gas: 97480) EnumerableMapAddresses_get:testGetSuccess() (gas: 98781) diff --git a/contracts/src/v0.8/ccip/Router.sol b/contracts/src/v0.8/ccip/Router.sol index 509f1e7be9..ac7bc02bd0 100644 --- a/contracts/src/v0.8/ccip/Router.sol +++ b/contracts/src/v0.8/ccip/Router.sol @@ -11,8 +11,8 @@ import {IAny2EVMMessageReceiver} from "./interfaces/IAny2EVMMessageReceiver.sol" import {Client} from "./libraries/Client.sol"; import {Internal} from "./libraries/Internal.sol"; -import {CallWithExactGas} from "./libraries/CallWithExactGas.sol"; -import {OwnerIsCreator} from "./../shared/access/OwnerIsCreator.sol"; +import {CallWithExactGas} from "../shared/call/CallWithExactGas.sol"; +import {OwnerIsCreator} from "../shared/access/OwnerIsCreator.sol"; import {EnumerableSet} from "../vendor/openzeppelin-solidity/v4.8.0/contracts/utils/structs/EnumerableSet.sol"; import {SafeERC20} from "../vendor/openzeppelin-solidity/v4.8.0/contracts/token/ERC20/utils/SafeERC20.sol"; @@ -156,7 +156,7 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { uint16 gasForCallExactCheck, uint256 gasLimit, address receiver - ) external override whenHealthy returns (bool success, bytes memory retData) { + ) external override whenHealthy returns (bool success, bytes memory retData, uint256 gasUsed) { // We only permit offRamps to call this function. if (!isOffRamp(message.sourceChainSelector, msg.sender)) revert OnlyOffRamp(); @@ -164,16 +164,16 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { // can be called from the router. bytes memory data = abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, message); - (success, retData) = CallWithExactGas._callWithExactGas( + (success, retData, gasUsed) = CallWithExactGas._callWithExactGasSafeReturnData( data, receiver, gasLimit, - Internal.MAX_RET_BYTES, - gasForCallExactCheck + gasForCallExactCheck, + Internal.MAX_RET_BYTES ); emit MessageExecuted(message.messageId, message.sourceChainSelector, msg.sender, keccak256(data)); - return (success, retData); + return (success, retData, gasUsed); } // @notice Merges a chain selector and offRamp address into a single uint256 by shifting the diff --git a/contracts/src/v0.8/ccip/interfaces/IRouter.sol b/contracts/src/v0.8/ccip/interfaces/IRouter.sol index b3a3984cd6..a2a88e9c6c 100644 --- a/contracts/src/v0.8/ccip/interfaces/IRouter.sol +++ b/contracts/src/v0.8/ccip/interfaces/IRouter.sol @@ -15,10 +15,11 @@ interface IRouter { /// the contract is called. If not, only tokens are transferred. /// @return success A boolean value indicating whether the ccip message was received without errors. /// @return retBytes A bytes array containing return data form CCIP receiver. + /// @return gasUsed the gas used by the external customer call. Does not include any overhead. function routeMessage( Client.Any2EVMMessage calldata message, uint16 gasForCallExactCheck, uint256 gasLimit, address receiver - ) external returns (bool success, bytes memory retBytes); + ) external returns (bool success, bytes memory retBytes, uint256 gasUsed); } diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol index 753d7a560d..1fe54167d6 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol @@ -13,7 +13,7 @@ import {IAny2EVMOffRamp} from "../interfaces/IAny2EVMOffRamp.sol"; import {Client} from "../libraries/Client.sol"; import {Internal} from "../libraries/Internal.sol"; import {RateLimiter} from "../libraries/RateLimiter.sol"; -import {CallWithExactGas} from "../libraries/CallWithExactGas.sol"; +import {CallWithExactGas} from "../../shared/call/CallWithExactGas.sol"; import {OCR2BaseNoChecks} from "../ocr/OCR2BaseNoChecks.sol"; import {AggregateRateLimiter} from "../AggregateRateLimiter.sol"; import {EnumerableMapAddresses} from "../../shared/enumerable/EnumerableMapAddresses.sol"; @@ -430,7 +430,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio !message.receiver.isContract() || !message.receiver.supportsInterface(type(IAny2EVMMessageReceiver).interfaceId) ) return; - (bool success, bytes memory returnData) = IRouter(s_dynamicConfig.router).routeMessage( + (bool success, bytes memory returnData, ) = IRouter(s_dynamicConfig.router).routeMessage( Internal._toAny2EVMMessage(message, destTokenAmounts), Internal.GAS_FOR_CALL_EXACT_CHECK, message.gasLimit, @@ -602,7 +602,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio // Call the pool with exact gas to increase resistance against malicious tokens or token pools. // _callWithExactGas also protects against return data bombs by capping the return data size // at MAX_RET_BYTES. - (bool success, bytes memory returnData) = CallWithExactGas._callWithExactGas( + (bool success, bytes memory returnData, ) = CallWithExactGas._callWithExactGasSafeReturnData( abi.encodeWithSelector( pool.releaseOrMint.selector, originalSender, @@ -613,8 +613,8 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio ), address(pool), s_dynamicConfig.maxPoolReleaseOrMintGas, - Internal.MAX_RET_BYTES, - Internal.GAS_FOR_CALL_EXACT_CHECK + Internal.GAS_FOR_CALL_EXACT_CHECK, + Internal.MAX_RET_BYTES ); // wrap and rethrow the error so we can catch it lower in the stack diff --git a/contracts/src/v0.8/ccip/test/helpers/CallWithExactGasHelper.sol b/contracts/src/v0.8/ccip/test/helpers/CallWithExactGasHelper.sol deleted file mode 100644 index e2687ce2d8..0000000000 --- a/contracts/src/v0.8/ccip/test/helpers/CallWithExactGasHelper.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.19; - -import {CallWithExactGas} from "../../libraries/CallWithExactGas.sol"; - -contract CallWithExactGasHelper { - function callWithExactGas( - bytes memory payload, - address target, - uint256 gasLimit, - uint16 maxReturnBytes, - uint16 gasForCallExactCheck - ) public returns (bool success, bytes memory retData) { - (success, retData) = CallWithExactGas._callWithExactGas( - payload, - target, - gasLimit, - maxReturnBytes, - gasForCallExactCheck - ); - } -} diff --git a/contracts/src/v0.8/ccip/test/libraries/CallWithExactGas.t.sol b/contracts/src/v0.8/ccip/test/libraries/CallWithExactGas.t.sol deleted file mode 100644 index be73977296..0000000000 --- a/contracts/src/v0.8/ccip/test/libraries/CallWithExactGas.t.sol +++ /dev/null @@ -1,137 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.19; - -import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver.sol"; - -import {Internal} from "../../libraries/Internal.sol"; -import {Client} from "../../libraries/Client.sol"; -import {CallWithExactGas} from "../../libraries/CallWithExactGas.sol"; -import {CallWithExactGasHelper} from "../helpers/CallWithExactGasHelper.sol"; -import {BaseTest} from "../BaseTest.t.sol"; -import {MaybeRevertMessageReceiver} from "../helpers/receivers/MaybeRevertMessageReceiver.sol"; - -contract CallWithExactGas_callWithExactGas is BaseTest { - event MessageReceived(); - - IAny2EVMMessageReceiver internal s_receiver; - MaybeRevertMessageReceiver internal s_reverting_receiver; - CallWithExactGasHelper internal s_caller; - - function setUp() public virtual override { - BaseTest.setUp(); - - s_receiver = new MaybeRevertMessageReceiver(false); - s_reverting_receiver = new MaybeRevertMessageReceiver(true); - - s_caller = new CallWithExactGasHelper(); - } - - function test_CallWithExactGasSuccess() public { - Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ - messageId: "1", - sourceChainSelector: 1, - sender: "", - data: "", - destTokenAmounts: new Client.EVMTokenAmount[](0) - }); - bytes memory data = abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, message); - - vm.expectEmit(); - emit MessageReceived(); - - vm.expectCall(address(s_receiver), data); - - (bool success, ) = s_caller.callWithExactGas( - data, - address(s_receiver), - 100_000, - Internal.MAX_RET_BYTES, - Internal.GAS_FOR_CALL_EXACT_CHECK - ); - - assertTrue(success); - } - - function testFuzz_CallWithExactGasReceiverErrorSuccess(uint16 testRetBytes) public { - // Bound with upper limit, otherwise the test runs out of gas. - testRetBytes = uint16(bound(testRetBytes, 0, Internal.MAX_RET_BYTES * 10)); - - Client.Any2EVMMessage memory message = Client.Any2EVMMessage({ - messageId: "1", - sourceChainSelector: 1, - sender: "", - data: "", - destTokenAmounts: new Client.EVMTokenAmount[](0) - }); - bytes memory data = abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, message); - - bytes memory errorData = new bytes(testRetBytes); - for (uint256 i = 0; i < errorData.length; ++i) { - errorData[i] = 0x01; - } - s_reverting_receiver.setErr(errorData); - - vm.expectCall(address(s_reverting_receiver), data); - - (bool success, bytes memory retData) = s_caller.callWithExactGas( - data, - address(s_reverting_receiver), - 100_000, - Internal.MAX_RET_BYTES, - Internal.GAS_FOR_CALL_EXACT_CHECK - ); - - assertFalse(success); - - bytes memory totalReturnData = abi.encodeWithSelector(MaybeRevertMessageReceiver.CustomError.selector, errorData); - bytes memory expectedReturnData = totalReturnData; - - // If expected return data is longer than MAX_RET_BYTES, truncate it to MAX_RET_BYTES - if (expectedReturnData.length > Internal.MAX_RET_BYTES) { - expectedReturnData = new bytes(Internal.MAX_RET_BYTES); - for (uint256 i = 0; i < Internal.MAX_RET_BYTES; ++i) { - expectedReturnData[i] = totalReturnData[i]; - } - } - assertEq(expectedReturnData, retData); - } - - function test_NoContractReverts() public { - bytes memory data = abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, ""); - - vm.expectRevert(CallWithExactGas.NoContract.selector); - - s_caller.callWithExactGas(data, address(1), 100_000, Internal.MAX_RET_BYTES, Internal.GAS_FOR_CALL_EXACT_CHECK); - } - - function test_NoGasForCallExactCheckReverts() public { - bytes memory data = abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, ""); - - bytes memory payload = abi.encodeWithSelector( - s_caller.callWithExactGas.selector, - data, - address(s_receiver), - 100_000, - Internal.MAX_RET_BYTES, - Internal.GAS_FOR_CALL_EXACT_CHECK - ); - - (bool success, bytes memory retData) = address(s_caller).call{gas: GAS_FOR_CALL_EXACT_CHECK - 1}(payload); - assertFalse(success); - assertEq(abi.encodeWithSelector(CallWithExactGas.NoGasForCallExactCheck.selector), retData); - } - - function test_NotEnoughGasForCallReverts() public { - bytes memory data = abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, ""); - - vm.expectRevert(CallWithExactGas.NotEnoughGasForCall.selector); - - s_caller.callWithExactGas( - data, - address(s_receiver), - type(uint256).max, - Internal.MAX_RET_BYTES, - Internal.GAS_FOR_CALL_EXACT_CHECK - ); - } -} diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol index d44c6f4048..ee0c1e1c6f 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.19; import "../helpers/receivers/MaybeRevertMessageReceiver.sol"; import "./EVM2EVMOffRampSetup.t.sol"; import "../../Router.sol"; -import {CallWithExactGas} from "../../libraries/CallWithExactGas.sol"; +import {CallWithExactGas} from "../../../shared/call/CallWithExactGas.sol"; import "../helpers/receivers/ConformingReceiver.sol"; import "../helpers/receivers/MaybeRevertMessageReceiverNo165.sol"; import "../helpers/receivers/ReentrancyAbuser.sol"; diff --git a/contracts/src/v0.8/ccip/test/router/Router.t.sol b/contracts/src/v0.8/ccip/test/router/Router.t.sol index 741af0504c..65efb24ea4 100644 --- a/contracts/src/v0.8/ccip/test/router/Router.t.sol +++ b/contracts/src/v0.8/ccip/test/router/Router.t.sol @@ -696,7 +696,7 @@ contract Router_routeMessage is EVM2EVMOffRampSetup { Client.Any2EVMMessage memory message = generateReceiverMessage(SOURCE_CHAIN_ID); // Manuel execution cannot run out of gas - (bool success, bytes memory retData) = s_destRouter.routeMessage( + (bool success, bytes memory retData, uint256 gasUsed) = s_destRouter.routeMessage( generateReceiverMessage(SOURCE_CHAIN_ID), GAS_FOR_CALL_EXACT_CHECK, generateManualGasLimit(message.data.length), @@ -704,6 +704,7 @@ contract Router_routeMessage is EVM2EVMOffRampSetup { ); assertTrue(success); assertEq("", retData); + assertGt(gasUsed, 3_000); } function testExecutionEventSuccess() public { @@ -722,7 +723,7 @@ contract Router_routeMessage is EVM2EVMOffRampSetup { keccak256(abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, message)) ); - (bool success, bytes memory retData) = s_destRouter.routeMessage( + (bool success, bytes memory retData, uint256 gasUsed) = s_destRouter.routeMessage( generateReceiverMessage(SOURCE_CHAIN_ID), GAS_FOR_CALL_EXACT_CHECK, generateManualGasLimit(message.data.length), @@ -731,6 +732,7 @@ contract Router_routeMessage is EVM2EVMOffRampSetup { assertFalse(success); assertEq(abi.encodeWithSelector(MaybeRevertMessageReceiver.CustomError.selector, realError1), retData); + assertGt(gasUsed, 3_000); // Reason is truncated // Over the MAX_RET_BYTES limit (including offset and length word since we have a dynamic values), should be ignored @@ -747,7 +749,7 @@ contract Router_routeMessage is EVM2EVMOffRampSetup { keccak256(abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, message)) ); - (success, retData) = s_destRouter.routeMessage( + (success, retData, gasUsed) = s_destRouter.routeMessage( generateReceiverMessage(SOURCE_CHAIN_ID), GAS_FOR_CALL_EXACT_CHECK, generateManualGasLimit(message.data.length), @@ -765,6 +767,7 @@ contract Router_routeMessage is EVM2EVMOffRampSetup { ), retData ); + assertGt(gasUsed, 3_000); // Should emit success vm.expectEmit(); @@ -775,7 +778,7 @@ contract Router_routeMessage is EVM2EVMOffRampSetup { keccak256(abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, message)) ); - (success, retData) = s_destRouter.routeMessage( + (success, retData, gasUsed) = s_destRouter.routeMessage( generateReceiverMessage(SOURCE_CHAIN_ID), GAS_FOR_CALL_EXACT_CHECK, generateManualGasLimit(message.data.length), @@ -784,6 +787,7 @@ contract Router_routeMessage is EVM2EVMOffRampSetup { assertTrue(success); assertEq("", retData); + assertGt(gasUsed, 3_000); } function testFuzz_ExecutionEventSuccess(bytes calldata error) public { @@ -819,7 +823,7 @@ contract Router_routeMessage is EVM2EVMOffRampSetup { expectedRetData = abi.encodeWithSelector(MaybeRevertMessageReceiver.CustomError.selector, error); } - (bool success, bytes memory retData) = s_destRouter.routeMessage( + (bool success, bytes memory retData, ) = s_destRouter.routeMessage( generateReceiverMessage(SOURCE_CHAIN_ID), GAS_FOR_CALL_EXACT_CHECK, generateManualGasLimit(message.data.length), @@ -831,7 +835,7 @@ contract Router_routeMessage is EVM2EVMOffRampSetup { } function testAutoExecSuccess() public { - (bool success, ) = s_destRouter.routeMessage( + (bool success, , ) = s_destRouter.routeMessage( generateReceiverMessage(SOURCE_CHAIN_ID), GAS_FOR_CALL_EXACT_CHECK, 100_000, @@ -840,7 +844,7 @@ contract Router_routeMessage is EVM2EVMOffRampSetup { assertTrue(success); - (success, ) = s_destRouter.routeMessage( + (success, , ) = s_destRouter.routeMessage( generateReceiverMessage(SOURCE_CHAIN_ID), GAS_FOR_CALL_EXACT_CHECK, 1, diff --git a/contracts/src/v0.8/ccip/libraries/CallWithExactGas.sol b/contracts/src/v0.8/shared/call/CallWithExactGas.sol similarity index 54% rename from contracts/src/v0.8/ccip/libraries/CallWithExactGas.sol rename to contracts/src/v0.8/shared/call/CallWithExactGas.sol index 1eb25025c8..76a791856b 100644 --- a/contracts/src/v0.8/ccip/libraries/CallWithExactGas.sol +++ b/contracts/src/v0.8/shared/call/CallWithExactGas.sol @@ -1,39 +1,41 @@ -// SPDX-License-Identifier: BUSL-1.1 +// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -/// @dev Handles the edge case where we want to pass a specific amount of gas, -/// @dev but EIP-150 sends all but 1/64 of the remaining gas instead so the user gets -/// @dev less gas than they paid for. The other 2 parts of EIP-150 do not apply since -/// @dev a) we hard code value=0 and b) we ensure code already exists. -/// @dev If we revert instead, then that will never happen. -/// @dev Separately we capture the return data up to a maximum size to avoid return bombs, -/// @dev borrowed from https://github.com/nomad-xyz/ExcessivelySafeCall/blob/main/src/ExcessivelySafeCall.sol. library CallWithExactGas { error NoContract(); error NoGasForCallExactCheck(); error NotEnoughGasForCall(); - function _callWithExactGas( + bytes4 internal constant NoContractSig = 0x0c3b563c; + bytes4 internal constant NoGasForCallExactCheckSig = 0xafa32a2c; + bytes4 internal constant NotEnoughGasForCallSig = 0x37c3be29; + + /// @notice calls target address with exactly gasAmount gas and payload as calldata. + /// Account for gasForCallExactCheck gas that will be used by this function. Will revert + /// if the target is not a contact. Will revert when there is not enough gas to call the + /// target with gasAmount gas. + /// @dev Caps the return data length, which makes it immune to gas bomb attacks. + /// @dev Return data cap logic borrowed from + /// https://github.com/nomad-xyz/ExcessivelySafeCall/blob/main/src/ExcessivelySafeCall.sol. + /// @return success whether the call succeeded + /// @return retData the return data from the call, capped at maxReturnBytes bytes + /// @return gasUsed the gas used by the external call. Does not include the overhead of this function. + function _callWithExactGasSafeReturnData( bytes memory payload, address target, uint256 gasLimit, - uint16 maxReturnBytes, - uint16 gasForCallExactCheck - ) internal returns (bool success, bytes memory retData) { + uint16 gasForCallExactCheck, + uint16 maxReturnBytes + ) internal returns (bool success, bytes memory retData, uint256 gasUsed) { // allocate retData memory ahead of time retData = new bytes(maxReturnBytes); - bytes4 noContract = NoContract.selector; - bytes4 noGasForCallExactCheck = NoGasForCallExactCheck.selector; - bytes4 notEnoughGasForCall = NotEnoughGasForCall.selector; - - // solhint-disable-next-line no-inline-assembly assembly { // solidity calls check that a contract actually exists at the destination, so we do the same // Note we do this check prior to measuring gas so gasForCallExactCheck (our "cushion") // doesn't need to account for it. if iszero(extcodesize(target)) { - mstore(0, noContract) + mstore(0, NoContractSig) revert(0, 0x4) } @@ -45,19 +47,22 @@ library CallWithExactGas { // gas. gasForCallExactCheck ensures we have at least enough gas to be able // to revert if gasAmount > 63//64*gas available. if lt(g, gasForCallExactCheck) { - mstore(0, noGasForCallExactCheck) + mstore(0, NoGasForCallExactCheckSig) revert(0, 0x4) } g := sub(g, gasForCallExactCheck) - // if g - g//64 <= gasAmount, revert - // (we subtract g//64 because of EIP-150) + // if g - g//64 <= gasAmount, revert. We subtract g//64 because of EIP-150 if iszero(gt(sub(g, div(g, 64)), gasLimit)) { - mstore(0, notEnoughGasForCall) + mstore(0, NotEnoughGasForCallSig) revert(0, 0x4) } + + // We save the gas before the call so we can calculate how much gas the call used + let gasBeforeCall := gas() // call and return whether we succeeded. ignore return data // call(gas,addr,value,argsOffset,argsLength,retOffset,retLength) success := call(gasLimit, target, 0, add(payload, 0x20), mload(payload), 0, 0) + gasUsed := sub(gasBeforeCall, gas()) // limit our copy to maxReturnBytes bytes let toCopy := returndatasize() @@ -69,6 +74,6 @@ library CallWithExactGas { // copy the bytes from retData[0:_toCopy] returndatacopy(add(retData, 0x20), 0, toCopy) } - return (success, retData); + return (success, retData, gasUsed); } } diff --git a/contracts/src/v0.8/shared/test/call/CallWithExactGas.t.sol b/contracts/src/v0.8/shared/test/call/CallWithExactGas.t.sol new file mode 100644 index 0000000000..2d225b471f --- /dev/null +++ b/contracts/src/v0.8/shared/test/call/CallWithExactGas.t.sol @@ -0,0 +1,188 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.19; + +import {CallWithExactGas} from "../../call/CallWithExactGas.sol"; +import {CallWithExactGasHelper} from "./CallWithExactGasHelper.sol"; +import {BaseTest} from "../BaseTest.t.sol"; +import {GenericReceiver} from "../testhelpers/GenericReceiver.sol"; + +contract CallWithExactGasSetup is BaseTest { + GenericReceiver internal s_receiver; + CallWithExactGasHelper internal s_caller; + uint256 internal constant DEFAULT_GAS_LIMIT = 20_000; + uint16 internal constant DEFAULT_GAS_FOR_CALL_EXACT_CHECK = 5000; + uint256 internal constant EXTCODESIZE_GAS_COST = 2600; + + function setUp() public virtual override { + BaseTest.setUp(); + + s_receiver = new GenericReceiver(false); + s_caller = new CallWithExactGasHelper(); + } +} + +contract CallWithExactGas__callWithExactGasSafeReturnData is CallWithExactGasSetup { + function testFuzz_CallWithExactGasSafeReturnDataSuccess(bytes memory payload, bytes4 funcSelector) public { + vm.pauseGasMetering(); + bytes memory data = abi.encodeWithSelector(funcSelector, payload); + vm.assume( + funcSelector != GenericReceiver.setRevert.selector && + funcSelector != GenericReceiver.setErr.selector && + funcSelector != 0x5100fc21 // s_toRevert(), which is public and therefore has a function selector + ); + + uint16 maxRetBytes = 0; + + vm.expectCall(address(s_receiver), data); + vm.resumeGasMetering(); + + (bool success, bytes memory retData, uint256 gasUsed) = s_caller.callWithExactGasSafeReturnData( + data, + address(s_receiver), + DEFAULT_GAS_LIMIT, + maxRetBytes, + DEFAULT_GAS_FOR_CALL_EXACT_CHECK + ); + + assertTrue(success); + assertEq(retData.length, 0); + assertGt(gasUsed, 500); + } + + function test_CallWithExactGasSafeReturnDataExactGas() public { + // The gas cost for `extcodesize` + uint256 extcodesizeGas = EXTCODESIZE_GAS_COST; + // The calculated overhead for retData initialization + uint256 overheadForRetDataInit = 114; + // The calculated overhead for otherwise unaccounted for gas usage + uint256 overheadForCallWithExactGas = 416; + + bytes memory payload = abi.encodeWithSelector( + s_caller.callWithExactGasSafeReturnData.selector, + "", + address(s_receiver), + DEFAULT_GAS_LIMIT, + DEFAULT_GAS_FOR_CALL_EXACT_CHECK, + 0 + ); + + // Since only 63/64th of the gas gets passed, we compensate + uint256 allowedGas = (DEFAULT_GAS_LIMIT + (DEFAULT_GAS_LIMIT / 64)); + + allowedGas += + extcodesizeGas + + DEFAULT_GAS_FOR_CALL_EXACT_CHECK + + overheadForRetDataInit + + overheadForCallWithExactGas; + + // Due to EIP-150 we expect to lose 1/64, so we compensate for this + allowedGas = (allowedGas * 64) / 63; + + vm.expectCall(address(s_receiver), ""); + (bool success, bytes memory retData) = address(s_caller).call{gas: allowedGas}(payload); + + assertTrue(success); + (bool innerSuccess, bytes memory innerRetData, uint256 gasUsed) = abi.decode(retData, (bool, bytes, uint256)); + + assertTrue(innerSuccess); + assertEq(innerRetData.length, 0); + assertGt(gasUsed, 500); + } + + function testFuzz_CallWithExactGasReceiverErrorSuccess(uint16 testRetBytes) public { + uint16 maxReturnBytes = 500; + // Bound with upper limit, otherwise the test runs out of gas. + testRetBytes = uint16(bound(testRetBytes, 0, maxReturnBytes * 10)); + + bytes memory data = abi.encode("0x52656E73"); + + bytes memory errorData = new bytes(testRetBytes); + for (uint256 i = 0; i < errorData.length; ++i) { + errorData[i] = 0x01; + } + s_receiver.setErr(errorData); + s_receiver.setRevert(true); + + vm.expectCall(address(s_receiver), data); + + (bool success, bytes memory retData, uint256 gasUsed) = s_caller.callWithExactGasSafeReturnData( + data, + address(s_receiver), + DEFAULT_GAS_LIMIT * 10, + DEFAULT_GAS_FOR_CALL_EXACT_CHECK, + maxReturnBytes + ); + + assertFalse(success); + + bytes memory expectedReturnData = errorData; + + // If expected return data is longer than MAX_RET_BYTES, truncate it to MAX_RET_BYTES + if (expectedReturnData.length > maxReturnBytes) { + expectedReturnData = new bytes(maxReturnBytes); + for (uint256 i = 0; i < maxReturnBytes; ++i) { + expectedReturnData[i] = errorData[i]; + } + } + assertEq(expectedReturnData, retData); + assertGt(gasUsed, 500); + } + + function test_NoContractReverts() public { + address addressWithoutContract = address(1337); + + vm.expectRevert(CallWithExactGas.NoContract.selector); + + s_caller.callWithExactGasSafeReturnData( + "", // empty payload as it will revert well before needing it + addressWithoutContract, + DEFAULT_GAS_LIMIT, + DEFAULT_GAS_FOR_CALL_EXACT_CHECK, + 0 + ); + } + + function test_NoGasForCallExactCheckReverts() public { + bytes memory payload = abi.encodeWithSelector( + s_caller.callWithExactGasSafeReturnData.selector, + "", // empty payload as it will revert well before needing it + address(s_receiver), + DEFAULT_GAS_LIMIT, + DEFAULT_GAS_FOR_CALL_EXACT_CHECK, + 0 + ); + + (bool success, bytes memory retData) = address(s_caller).call{gas: DEFAULT_GAS_FOR_CALL_EXACT_CHECK - 1}(payload); + assertFalse(success); + assertEq(retData.length, CallWithExactGas.NoGasForCallExactCheck.selector.length); + assertEq(abi.encodeWithSelector(CallWithExactGas.NoGasForCallExactCheck.selector), retData); + } + + function test_NotEnoughGasForCallReverts() public { + bytes memory payload = abi.encodeWithSelector( + s_caller.callWithExactGasSafeReturnData.selector, + "", // empty payload as it will revert well before needing it + address(s_receiver), + DEFAULT_GAS_LIMIT, + DEFAULT_GAS_FOR_CALL_EXACT_CHECK, + 0 + ); + + // Supply enough gas for the final call, the DEFAULT_GAS_FOR_CALL_EXACT_CHECK, + // the extcodesize and account for EIP-150. This doesn't account for any other gas + // usage, and will therefore fail because the checks and memory stored/loads + // also cost gas. + uint256 allowedGas = (DEFAULT_GAS_LIMIT + (DEFAULT_GAS_LIMIT / 64)) + DEFAULT_GAS_FOR_CALL_EXACT_CHECK; + // extcodesize gas cost + allowedGas += EXTCODESIZE_GAS_COST; + // EIP-150 + allowedGas = (allowedGas * 64) / 63; + + // Expect this call to fail due to not having enough gas for the final call + (bool success, bytes memory retData) = address(s_caller).call{gas: allowedGas}(payload); + + assertFalse(success); + assertEq(retData.length, CallWithExactGas.NotEnoughGasForCall.selector.length); + assertEq(abi.encodeWithSelector(CallWithExactGas.NotEnoughGasForCall.selector), retData); + } +} diff --git a/contracts/src/v0.8/shared/test/call/CallWithExactGasHelper.sol b/contracts/src/v0.8/shared/test/call/CallWithExactGasHelper.sol new file mode 100644 index 0000000000..1336bf66b0 --- /dev/null +++ b/contracts/src/v0.8/shared/test/call/CallWithExactGasHelper.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.19; + +import {CallWithExactGas} from "../../call/CallWithExactGas.sol"; + +contract CallWithExactGasHelper { + function callWithExactGasSafeReturnData( + bytes memory payload, + address target, + uint256 gasLimit, + uint16 gasForCallExactCheck, + uint16 maxReturnBytes + ) public returns (bool success, bytes memory retData, uint256 gasUsed) { + return + CallWithExactGas._callWithExactGasSafeReturnData(payload, target, gasLimit, gasForCallExactCheck, maxReturnBytes); + } +} diff --git a/contracts/src/v0.8/shared/test/testhelpers/GenericReceiver.sol b/contracts/src/v0.8/shared/test/testhelpers/GenericReceiver.sol new file mode 100644 index 0000000000..2c058012df --- /dev/null +++ b/contracts/src/v0.8/shared/test/testhelpers/GenericReceiver.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract GenericReceiver { + bool public s_toRevert; + bytes private s_err; + + constructor(bool toRevert) { + s_toRevert = toRevert; + } + + function setRevert(bool toRevert) external { + s_toRevert = toRevert; + } + + function setErr(bytes memory err) external { + s_err = err; + } + + // solhint-disable-next-line payable-fallback + fallback() external { + if (s_toRevert) { + bytes memory reason = s_err; + assembly { + revert(add(32, reason), mload(reason)) + } + } + } +} diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go index a37601e231..4d357a298f 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go @@ -105,7 +105,7 @@ type RateLimiterTokenBucket struct { var EVM2EVMOffRampMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"contractIPool[]\",\"name\":\"pools\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getDestinationToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDestinationTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"getPoolByDestToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162006ab538038062006ab5833981016040819052620000359162000891565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000478565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001705760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b0316158062000193575083516001600160a01b0316155b15620001b2576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021b9190620009a8565b6001600160401b03166001146200024557604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002bc7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000523565b6101205260005b83518110156200046d576200031d848281518110620002e657620002e6620009c6565b6020026020010151848381518110620003035762000303620009c6565b6020026020010151600c6200058a60201b9092919060201c565b50620003d2838281518110620003375762000337620009c6565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200037d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a39190620009dc565b848381518110620003b857620003b8620009c6565b6020026020010151600f6200058a60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c848281518110620004095762000409620009c6565b6020026020010151848381518110620004265762000426620009c6565b6020026020010151604051620004529291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004658162000a03565b9050620002c3565b505050505062000a2b565b336001600160a01b03821603620004d25760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200056d94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005a2846001600160a01b03851684620005aa565b949350505050565b6000620005a284846001600160a01b03851660008281526002840160205260408120829055620005a284846000620005e38383620005ec565b90505b92915050565b60008181526001830160205260408120546200063557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005e6565b506000620005e6565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200067957620006796200063e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006aa57620006aa6200063e565b604052919050565b6001600160a01b0381168114620006c857600080fd5b50565b80516001600160401b0381168114620006e357600080fd5b919050565b60006001600160401b038211156200070457620007046200063e565b5060051b60200190565b600082601f8301126200072057600080fd5b81516020620007396200073383620006e8565b6200067f565b82815260059290921b840181019181810190868411156200075957600080fd5b8286015b84811015620007815780516200077381620006b2565b83529183019183016200075d565b509695505050505050565b600082601f8301126200079e57600080fd5b81516020620007b16200073383620006e8565b82815260059290921b84018101918181019086841115620007d157600080fd5b8286015b8481101562000781578051620007eb81620006b2565b8352918301918301620007d5565b80516001600160801b0381168114620006e357600080fd5b6000606082840312156200082457600080fd5b604051606081016001600160401b03811182821017156200084957620008496200063e565b8060405250809150825180151581146200086257600080fd5b81526200087260208401620007f9565b60208201526200088560408401620007f9565b60408201525092915050565b600080600080848603610160811215620008aa57600080fd5b60c0811215620008b957600080fd5b50620008c462000654565b8551620008d181620006b2565b8152620008e160208701620006cb565b6020820152620008f460408701620006cb565b604082015260608601516200090981620006b2565b606082015260808601516200091e81620006b2565b608082015260a08601516200093381620006b2565b60a082015260c08601519094506001600160401b03808211156200095657600080fd5b62000964888389016200070e565b945060e08701519150808211156200097b57600080fd5b506200098a878288016200078c565b9250506200099d86610100870162000811565b905092959194509250565b600060208284031215620009bb57600080fd5b620005e382620006cb565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009ef57600080fd5b8151620009fc81620006b2565b9392505050565b60006001820162000a2457634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161016051615fad62000b08600039600081816103090152818161211901526123c30152600081816102cd0152818161164e015281816116d0015281816120f20152818161293901526129c00152600061257c01526000818161029101526120c80152600081816102310152612076015260008181610261015281816120a00152818161315a01526136f60152600081816101f5015281816120480152612671015260008181611397015281816113e30152818161179101526117dd0152615fad6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806379ba5097116100ee578063b1dc65a411610097578063d3c7c2c711610071578063d3c7c2c7146106d3578063d7e2bb50146106db578063f2fde38b146106ee578063f52121a51461070157600080fd5b8063b1dc65a41461069a578063b4069b31146106ad578063c92b2832146106c057600080fd5b8063856c8247116100c8578063856c8247146106305780638da5cb5b1461065c578063afcb95d71461067a57600080fd5b806379ba5097146105ea57806381ff7048146105f257806385572ffb1461062257600080fd5b8063599f64311161015b578063681fba1611610135578063681fba16146104b8578063704b6c02146104cd578063740f4150146104e05780637437ff9f146104f357600080fd5b8063599f6431146104515780635d86f14114610490578063666cab8d146104a357600080fd5b80631ef381741161018c5780631ef38174146103c55780633a87ac53146103da578063546719cd146103ed57600080fd5b806306285c69146101b3578063142a98fc1461035c578063181f5a771461037c575b600080fd5b6103466040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b604051610353919061468e565b60405180910390f35b61036f61036a366004614725565b610714565b60405161035391906147ac565b6103b86040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b6040516103539190614828565b6103d86103d3366004614a96565b61078f565b005b6103d86103e8366004614ba8565b610c4e565b6103f561105e565b604051610353919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610353565b61046b61049e366004614c14565b611113565b6104ab61117c565b6040516103539190614c82565b6104c06111eb565b6040516103539190614c95565b6103d86104db366004614c14565b6112a4565b6103d86104ee36600461512e565b611394565b6105dd6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000008104831660808301527a010000000000000000000000000000000000000000000000000000900490911660a082015290565b60405161035391906151e9565b6103d8611516565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610353565b6103d86101ae366004615258565b61064361063e366004614c14565b611613565b60405167ffffffffffffffff9091168152602001610353565b60005473ffffffffffffffffffffffffffffffffffffffff1661046b565b604080516001815260006020820181905291810191909152606001610353565b6103d86106a83660046152d8565b61173b565b61046b6106bb366004614c14565b6119cc565b6103d86106ce3660046153dd565b611a45565b6104c0611aca565b61046b6106e9366004614c14565b611b7f565b6103d86106fc366004614c14565b611b8e565b6103d861070f36600461544b565b611b9f565b6000610722600160046154de565b600261072f608085615520565b67ffffffffffffffff166107439190615547565b6013600061075260808761555e565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c16600381111561078957610789614742565b92915050565b84518460ff16601f821115610805576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b8060000361086f576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f736974697665000000000000000000000000000060448201526064016107fc565b610877611df9565b61088085611e7c565b60095460005b8181101561090c5760086000600983815481106108a5576108a5615585565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055610905816155b4565b9050610886565b50875160005b81811015610b085760008a828151811061092e5761092e615585565b602002602001015190506000600281111561094b5761094b614742565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff16600281111561098a5761098a614742565b146109f1576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d697474657220616464726573730000000060448201526064016107fc565b73ffffffffffffffffffffffffffffffffffffffff8116610a3e576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610aee57610aee614742565b02179055509050505080610b01906155b4565b9050610912565b508851610b1c9060099060208c01906145f8565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610ba2914691309190600090610b749063ffffffff166155ec565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d61217d565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610c399998979695949392919061560f565b60405180910390a15050505050505050505050565b610c56611df9565b60005b83811015610e55576000858583818110610c7557610c75615585565b610c8b9260206040909202019081019150614c14565b90506000868684818110610ca157610ca1615585565b9050604002016020016020810190610cb99190614c14565b9050610cc6600c83612228565b610cfc576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610d1e600c8461224a565b73ffffffffffffffffffffffffffffffffffffffff1614610d6b576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d76600c8361226c565b50610df18173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de991906156a5565b600f9061226c565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610e4e906155b4565b9050610c59565b5060005b81811015611057576000838383818110610e7557610e75615585565b610e8b9260206040909202019081019150614c14565b90506000848484818110610ea157610ea1615585565b9050604002016020016020810190610eb99190614c14565b905073ffffffffffffffffffffffffffffffffffffffff82161580610ef2575073ffffffffffffffffffffffffffffffffffffffff8116155b15610f29576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f34600c83612228565b15610f6b576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f77600c838361228e565b50610ff38173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fea91906156a5565b600f908361228e565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1505080611050906155b4565b9050610e59565b5050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff16151593830193909352600454808416606084015204909116608082015261110e906122b9565b905090565b60008080611122600c8561236b565b9150915081611175576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107fc565b9392505050565b606060098054806020026020016040519081016040528092919081815260200182805480156111e157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111b6575b5050505050905090565b60606111f7600f61239a565b67ffffffffffffffff81111561120f5761120f61483b565b604051908082528060200260200182016040528015611238578160200160208202803683370190505b50905060005b81518110156112a0576000611254600f836123a5565b5090508083838151811061126a5761126a615585565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611299816155b4565b905061123e565b5090565b60005473ffffffffffffffffffffffffffffffffffffffff1633148015906112e4575060025473ffffffffffffffffffffffffffffffffffffffff163314155b1561131b576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f00000000000000000000000000000000000000000000000000000000000000001461141f576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff461660248201526044016107fc565b8151518151811461145c576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561150657600083828151811061147b5761147b615585565b60200260200101519050806000141580156114b4575084518051839081106114a5576114a5615585565b60200260200101516080015181105b156114f5576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016107fc565b506114ff816155b4565b905061145f565b5061151183836123c1565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016107fc565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561168657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b15610789576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611717573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117591906156c2565b6117458787612d88565b60055488359080821461178e576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016107fc565b467f00000000000000000000000000000000000000000000000000000000000000001461180f576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016107fc565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561189757611897614742565b60028111156118a8576118a8614742565b90525090506002816020015160028111156118c5576118c5614742565b14801561190c57506009816000015160ff16815481106118e7576118e7615585565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611942576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611950856020615547565b61195b886020615547565b6119678b6101446156df565b61197191906156df565b61197b91906156df565b90503681146119bf576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016107fc565b5050505050505050505050565b60006119d782611113565b73ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a21573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078991906156a5565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611a85575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611abc576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ac7600382612daf565b50565b6060611ad6600c61239a565b67ffffffffffffffff811115611aee57611aee61483b565b604051908082528060200260200182016040528015611b17578160200160208202803683370190505b50905060005b81518110156112a0576000611b33600c836123a5565b50905080838381518110611b4957611b49615585565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611b78816155b4565b9050611b1d565b60008080611122600f8561236b565b611b96611df9565b611ac781612f94565b333014611bd8576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611c15565b6040805180820190915260008082526020820152815260200190600190039081611bee5790505b506101408401515190915015611c8257611c7f8361014001518460200151604051602001611c5f919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604051602081830303815290604052856040015186610160015186613089565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611cec57506040830151611cea9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb00000000000000000000000000000000000000000000000000000000613413565b155b15611cf657505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611d2b878661342f565b611388886080015189604001516040518563ffffffff1660e01b8152600401611d579493929190615743565b6000604051808303816000875af1158015611d76573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611dbc9190810190615815565b915091508161105757806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107fc9190614828565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107fc565b565b600081806020019051810190611e9291906158b6565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16611ee6576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b015160a0808d01518c167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff92909c1676010000000000000000000000000000000000000000000002919091167fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90941674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909616978a169790971794909417919091169490941797909717909155825160c0810184527f00000000000000000000000000000000000000000000000000000000000000008516815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116968201969096527f0000000000000000000000000000000000000000000000000000000000000000909516858401527f00000000000000000000000000000000000000000000000000000000000000008416958501959095527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000009091169282019290925290517fe668e1a4644c1a030b909bbfd837f5cfa914994ed5e0bb2e9c34a5c37753128a91612171918490615962565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a6040516020016121a199989796959493929190615a3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b60006111758373ffffffffffffffffffffffffffffffffffffffff84166134df565b60006111758373ffffffffffffffffffffffffffffffffffffffff84166134eb565b60006111758373ffffffffffffffffffffffffffffffffffffffff84166134f7565b60006122b18473ffffffffffffffffffffffffffffffffffffffff851684613503565b949350505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261234782606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261232b91906154de565b85608001516fffffffffffffffffffffffffffffffff16613526565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b60008061238e8473ffffffffffffffffffffffffffffffffffffffff8516613545565b915091505b9250929050565b600061078982613554565b60008080806123b4868661355f565b9097909650945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561242c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124509190615ad3565b15612487576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81515160008190036124c4576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114612502576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561251d5761251d61483b565b604051908082528060200260200182016040528015612546578160200160208202803683370190505b50905060005b828110156126265760008560000151828151811061256c5761256c615585565b602002602001015190506125a0817f000000000000000000000000000000000000000000000000000000000000000061356e565b8383815181106125b2576125b2615585565b6020026020010181815250508061018001518383815181106125d6576125d6615585565b602002602001015114612615576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061261f816155b4565b905061254c565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016926332048875926126a792879291600401615b20565b602060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190615b56565b905080600003612724576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b84811015612d7f5760008760000151828151811061274b5761274b615585565b6020026020010151905060006127648260600151610714565b9050600081600381111561277a5761277a614742565b14806127975750600381600381111561279557612795614742565b145b6127df5760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107fc565b831561289c57600a5460009063ffffffff166127fb87426154de565b119050808061281b5750600382600381111561281957612819614742565b145b612851576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061286357612863615585565b60200260200101516000146128965788848151811061288457612884615585565b60200260200101518360800181815250505b506128f9565b60008160038111156128b0576128b0614742565b146128f95760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107fc565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff168015801561297157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b15612b145760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015612a09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2d91906156c2565b60c084015190915067ffffffffffffffff16612a4a826001615b6f565b67ffffffffffffffff1614612ab757826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050612d6f565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b6000826003811115612b2857612b28614742565b03612bb45760c083015167ffffffffffffffff16612b47826001615b6f565b67ffffffffffffffff1614612bb457826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050612d6f565b60008a602001518581518110612bcc57612bcc615585565b60200260200101519050612bf884606001518560000151866101400151518761012001515185516136f4565b612c078460600151600161389e565b600080612c148684613948565b91509150612c2686606001518361389e565b6003826003811115612c3a57612c3a614742565b14158015612c5a57506002826003811115612c5757612c57614742565b14155b15612c99578560600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016107fc929190615b90565b6000856003811115612cad57612cad614742565b03612d1a5760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff1691612cf283615bae565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051612d60929190615bcb565b60405180910390a35050505050505b612d78816155b4565b905061272b565b50505050505050565b612dab612d9782840184615beb565b6040805160008152602081019091526123c1565b5050565b8154600090612dd890700100000000000000000000000000000000900463ffffffff16426154de565b90508015612e7a5760018301548354612e20916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613526565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612ea0916fffffffffffffffffffffffffffffffff9081169116613aeb565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612f879084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff821603613013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107fc565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60606000865167ffffffffffffffff8111156130a7576130a761483b565b6040519080825280602002602001820160405280156130ec57816020015b60408051808201909152600080825260208201528152602001906001900390816130c55790505b50905060005b87518110156133e257600061312389838151811061311257613112615585565b602002602001015160000151611113565b9050600089838151811061313957613139615585565b60200260200101516020015190506000806132ae638627fad660e01b8c8c867f00000000000000000000000000000000000000000000000000000000000000008e8b8151811061318b5761318b615585565b60200260200101518e8c815181106131a5576131a5615585565b60200260200101516040516020016131be929190615c20565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526131fd9594939291602401615c45565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600b54869063ffffffff7a010000000000000000000000000000000000000000000000000000909104166084611388613b01565b91509150816132eb57806040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107fc9190614828565b8373ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613336573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335a91906156a5565b86868151811061336c5761336c615585565b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050828686815181106133bd576133bd615585565b6020026020010151602001818152505050505050806133db906155b4565b90506130f2565b50600b5461340790829073ffffffffffffffffffffffffffffffffffffffff16613c24565b90505b95945050505050565b600061341e83613e0c565b801561117557506111758383613e70565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff16815260200184602001516040516020016134b4919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006111758383613f3f565b60006111758383613f4b565b60006111758383613fd5565b60006122b1848473ffffffffffffffffffffffffffffffffffffffff8516613ff2565b600061340a856135368486615547565b61354090876156df565b613aeb565b60008080806123b4868661400f565b600061078982614049565b60008080806123b48686614054565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b610100015160405160200161361198979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b604051602081830303815290604052805190602001208561012001518051906020012086610140015160405160200161364a9190615ca8565b604051602081830303815290604052805190602001208761016001516040516020016136769190615d10565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff161461376d576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016107fc565b600b5474010000000000000000000000000000000000000000900461ffff168311156137d1576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016107fc565b808314613816576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016107fc565b600b54760100000000000000000000000000000000000000000000900463ffffffff1682111561105757600b546040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090910463ffffffff166004820152602481018390526044016107fc565b600060026138ad608085615520565b67ffffffffffffffff166138c19190615547565b905060006013816138d360808761555e565b67ffffffffffffffff1681526020810191909152604001600020549050816138fd600160046154de565b901b19168183600381111561391457613914614742565b901b17806013600061392760808861555e565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a59061398c9087908790600401615d23565b600060405180830381600087803b1580156139a657600080fd5b505af19250505080156139b7575060015b613ad0573d8080156139e5576040519150601f19603f3d011682016040523d82523d6000602084013e6139ea565b606091505b506139f481615ead565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c000000000000000000000000000000000000000000000000000000001480613a8c5750613a4781615ead565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b15613a9c57600392509050612393565b806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107fc9190614828565b50506040805160208101909152600081526002909250929050565b6000818310613afa5781611175565b5090919050565b600060608361ffff1667ffffffffffffffff811115613b2257613b2261483b565b6040519080825280601f01601f191660200182016040528015613b4c576020820181803683370190505b5090507f0c3b563c000000000000000000000000000000000000000000000000000000007fafa32a2c000000000000000000000000000000000000000000000000000000007f37c3be2900000000000000000000000000000000000000000000000000000000883b613bc2578260005260046000fd5b5a86811015613bd5578260005260046000fd5b8690036040810481038910613bee578160005260046000fd5b506000808b5160208d0160008d8df194503d87811115613c0b5750865b808552806000602087013e505050509550959350505050565b81516000805b82811015613df85760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613c6257613c62615585565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cfa9190615efd565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613d8c57858281518110613d3557613d35615585565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016107fc565b613dda868381518110613da157613da1615585565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661407f90919063ffffffff16565b613de490846156df565b92505080613df1906155b4565b9050613c2a565b50613e0660038260006140bc565b50505050565b6000613e38827f01ffc9a700000000000000000000000000000000000000000000000000000000613e70565b80156107895750613e69827fffffffff00000000000000000000000000000000000000000000000000000000613e70565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613f28575060208210155b8015613f345750600081115b979650505050505050565b6000611175838361443f565b600081815260028301602052604081205480151580613f6f5750613f6f8484613f3f565b611175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016107fc565b600081815260028301602052604081208190556111758383614457565b600082815260028401602052604081208290556122b18484614463565b600081815260028301602052604081205481908061403e576140318585613f3f565b9250600091506123939050565b600192509050612393565b60006107898261446f565b600080806140628585614479565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a76400006140b2837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615547565b6111759190615f5d565b825474010000000000000000000000000000000000000000900460ff1615806140e3575081155b156140ed57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061413390700100000000000000000000000000000000900463ffffffff16426154de565b905080156141f35781831115614175576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546141af9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613526565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156142aa5773ffffffffffffffffffffffffffffffffffffffff8416614252576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016107fc565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016107fc565b848310156143bd5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906142ee90826154de565b6142f8878a6154de565b61430291906156df565b61430c9190615f5d565b905073ffffffffffffffffffffffffffffffffffffffff8616614365576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016107fc565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016107fc565b6143c785846154de565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60008181526001830160205260408120541515611175565b60006111758383614485565b6000611175838361457f565b6000610789825490565b600061117583836145ce565b6000818152600183016020526040812054801561456e5760006144a96001836154de565b85549091506000906144bd906001906154de565b90508181146145225760008660000182815481106144dd576144dd615585565b906000526020600020015490508087600001848154811061450057614500615585565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061453357614533615f71565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610789565b6000915050610789565b5092915050565b60008181526001830160205260408120546145c657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610789565b506000610789565b60008260000182815481106145e5576145e5615585565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215614672579160200282015b8281111561467257825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614618565b506112a09291505b808211156112a0576000815560010161467a565b60c08101610789828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611ac757600080fd5b8035614720816146ff565b919050565b60006020828403121561473757600080fd5b8135611175816146ff565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106147a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b602081016107898284614771565b60005b838110156147d55781810151838201526020016147bd565b50506000910152565b600081518084526147f68160208601602086016147ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061117560208301846147de565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561488d5761488d61483b565b60405290565b6040516101a0810167ffffffffffffffff8111828210171561488d5761488d61483b565b6040516080810167ffffffffffffffff8111828210171561488d5761488d61483b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156149215761492161483b565b604052919050565b600067ffffffffffffffff8211156149435761494361483b565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611ac757600080fd5b80356147208161494d565b600082601f83011261498b57600080fd5b813560206149a061499b83614929565b6148da565b82815260059290921b840181019181810190868411156149bf57600080fd5b8286015b848110156149e35780356149d68161494d565b83529183019183016149c3565b509695505050505050565b803560ff8116811461472057600080fd5b600067ffffffffffffffff821115614a1957614a1961483b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614a5657600080fd5b8135614a6461499b826149ff565b818152846020838601011115614a7957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614aaf57600080fd5b863567ffffffffffffffff80821115614ac757600080fd5b614ad38a838b0161497a565b97506020890135915080821115614ae957600080fd5b614af58a838b0161497a565b9650614b0360408a016149ee565b95506060890135915080821115614b1957600080fd5b614b258a838b01614a45565b9450614b3360808a01614715565b935060a0890135915080821115614b4957600080fd5b50614b5689828a01614a45565b9150509295509295509295565b60008083601f840112614b7557600080fd5b50813567ffffffffffffffff811115614b8d57600080fd5b6020830191508360208260061b850101111561239357600080fd5b60008060008060408587031215614bbe57600080fd5b843567ffffffffffffffff80821115614bd657600080fd5b614be288838901614b63565b90965094506020870135915080821115614bfb57600080fd5b50614c0887828801614b63565b95989497509550505050565b600060208284031215614c2657600080fd5b81356111758161494d565b600081518084526020808501945080840160005b83811015614c7757815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614c45565b509495945050505050565b6020815260006111756020830184614c31565b6020808252825182820181905260009190848201906040850190845b81811015614ce357835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614cb1565b50909695505050505050565b8015158114611ac757600080fd5b803561472081614cef565b600082601f830112614d1957600080fd5b81356020614d2961499b83614929565b82815260069290921b84018101918181019086841115614d4857600080fd5b8286015b848110156149e35760408189031215614d655760008081fd5b614d6d61486a565b8135614d788161494d565b81528185013585820152835291830191604001614d4c565b600082601f830112614da157600080fd5b81356020614db161499b83614929565b82815260059290921b84018101918181019086841115614dd057600080fd5b8286015b848110156149e357803567ffffffffffffffff811115614df45760008081fd5b614e028986838b0101614a45565b845250918301918301614dd4565b60006101a08284031215614e2357600080fd5b614e2b614893565b9050614e3682614715565b8152614e446020830161496f565b6020820152614e556040830161496f565b6040820152614e6660608301614715565b606082015260808201356080820152614e8160a08301614cfd565b60a0820152614e9260c08301614715565b60c0820152614ea360e0830161496f565b60e082015261010082810135908201526101208083013567ffffffffffffffff80821115614ed057600080fd5b614edc86838701614a45565b83850152610140925082850135915080821115614ef857600080fd5b614f0486838701614d08565b83850152610160925082850135915080821115614f2057600080fd5b50614f2d85828601614d90565b82840152505061018080830135818301525092915050565b600082601f830112614f5657600080fd5b81356020614f6661499b83614929565b82815260059290921b84018101918181019086841115614f8557600080fd5b8286015b848110156149e357803567ffffffffffffffff811115614fa95760008081fd5b614fb78986838b0101614d90565b845250918301918301614f89565b600082601f830112614fd657600080fd5b81356020614fe661499b83614929565b82815260059290921b8401810191818101908684111561500557600080fd5b8286015b848110156149e35780358352918301918301615009565b60006080828403121561503257600080fd5b61503a6148b7565b9050813567ffffffffffffffff8082111561505457600080fd5b818401915084601f83011261506857600080fd5b8135602061507861499b83614929565b82815260059290921b8401810191818101908884111561509757600080fd5b8286015b848110156150cf578035868111156150b35760008081fd5b6150c18b86838b0101614e10565b84525091830191830161509b565b50865250858101359350828411156150e657600080fd5b6150f287858801614f45565b9085015250604084013591508082111561510b57600080fd5b5061511884828501614fc5565b6040830152506060820135606082015292915050565b6000806040838503121561514157600080fd5b823567ffffffffffffffff8082111561515957600080fd5b61516586838701615020565b935060209150818501358181111561517c57600080fd5b85019050601f8101861361518f57600080fd5b803561519d61499b82614929565b81815260059190911b820183019083810190888311156151bc57600080fd5b928401925b828410156151da578335825292840192908401906151c1565b80955050505050509250929050565b60c08101610789828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff60608301511660608401528060808301511660808401528060a08301511660a0840152505050565b60006020828403121561526a57600080fd5b813567ffffffffffffffff81111561528157600080fd5b820160a0818503121561117557600080fd5b60008083601f8401126152a557600080fd5b50813567ffffffffffffffff8111156152bd57600080fd5b6020830191508360208260051b850101111561239357600080fd5b60008060008060008060008060e0898b0312156152f457600080fd5b606089018a81111561530557600080fd5b8998503567ffffffffffffffff8082111561531f57600080fd5b818b0191508b601f83011261533357600080fd5b81358181111561534257600080fd5b8c602082850101111561535457600080fd5b6020830199508098505060808b013591508082111561537257600080fd5b61537e8c838d01615293565b909750955060a08b013591508082111561539757600080fd5b506153a48b828c01615293565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461472057600080fd5b6000606082840312156153ef57600080fd5b6040516060810181811067ffffffffffffffff821117156154125761541261483b565b604052823561542081614cef565b815261542e602084016153bd565b602082015261543f604084016153bd565b60408201529392505050565b6000806040838503121561545e57600080fd5b823567ffffffffffffffff8082111561547657600080fd5b61548286838701614e10565b9350602085013591508082111561549857600080fd5b506154a585828601614d90565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610789576107896154af565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061553b5761553b6154f1565b92169190910692915050565b8082028115828204841417610789576107896154af565b600067ffffffffffffffff80841680615579576155796154f1565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036155e5576155e56154af565b5060010190565b600063ffffffff808316818103615605576156056154af565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b1660408501525080606084015261563f8184018a614c31565b905082810360808401526156538189614c31565b905060ff871660a084015282810360c084015261567081876147de565b905067ffffffffffffffff851660e084015282810361010084015261569581856147de565b9c9b505050505050505050505050565b6000602082840312156156b757600080fd5b81516111758161494d565b6000602082840312156156d457600080fd5b8151611175816146ff565b80820180821115610789576107896154af565b600081518084526020808501945080840160005b83811015614c77578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101615706565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c084015261577e6101208401826147de565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e08601526157ba83836147de565b9250608089015191508085840301610100860152506157d982826156f2565b925050506157ed602083018661ffff169052565b83604083015261340a606083018473ffffffffffffffffffffffffffffffffffffffff169052565b6000806040838503121561582857600080fd5b825161583381614cef565b602084015190925067ffffffffffffffff81111561585057600080fd5b8301601f8101851361586157600080fd5b805161586f61499b826149ff565b81815286602083850101111561588457600080fd5b6158958260208301602086016147ba565b8093505050509250929050565b805163ffffffff8116811461472057600080fd5b600060c082840312156158c857600080fd5b60405160c0810181811067ffffffffffffffff821117156158eb576158eb61483b565b6040526158f7836158a2565b815260208301516159078161494d565b6020820152604083015161591a8161494d565b6040820152606083015161ffff8116811461593457600080fd5b6060820152615945608084016158a2565b608082015261595660a084016158a2565b60a08201529392505050565b61018081016159d4828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff166101208401526080840151811661014084015260a084015116610160830152611175565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152615a858285018b614c31565b91508382036080850152615a99828a614c31565b915060ff881660a085015283820360c0850152615ab682886147de565b90861660e0850152838103610100850152905061569581856147de565b600060208284031215615ae557600080fd5b815161117581614cef565b600081518084526020808501945080840160005b83811015614c7757815187529582019590820190600101615b04565b606081526000615b336060830186615af0565b8281036020840152615b458186615af0565b915050826040830152949350505050565b600060208284031215615b6857600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115614578576145786154af565b67ffffffffffffffff83168152604081016111756020830184614771565b600067ffffffffffffffff808316818103615605576156056154af565b615bd58184614771565b6040602082015260006122b160408301846147de565b600060208284031215615bfd57600080fd5b813567ffffffffffffffff811115615c1457600080fd5b6122b184828501615020565b604081526000615c3360408301856147de565b828103602084015261340a81856147de565b60a081526000615c5860a08301886147de565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff851660608401528281036080840152615c9c81856147de565b98975050505050505050565b60208152600061117560208301846156f2565b600081518084526020808501808196508360051b8101915082860160005b85811015615d03578284038952615cf18483516147de565b98850198935090840190600101615cd9565b5091979650505050505050565b6020815260006111756020830184615cbb565b60408152615d3e60408201845167ffffffffffffffff169052565b60006020840151615d67606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615dd58185018367ffffffffffffffff169052565b60e08601519150610120615e008186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a06101608181870152615e306101e08701856147de565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0610180818887030181890152615e6f86866156f2565b9550828a01519450818887030184890152615e8a8686615cbb565b9550808a01516101c08901525050505050828103602084015261340a8185615cbb565b6000815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015615ef55780818460040360031b1b83161693505b505050919050565b600060408284031215615f0f57600080fd5b615f1761486a565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114615f4357600080fd5b8152615f51602084016158a2565b60208201529392505050565b600082615f6c57615f6c6154f1565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + Bin: "0x6101806040523480156200001257600080fd5b5060405162006ac338038062006ac3833981016040819052620000359162000891565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000478565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001705760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b0316158062000193575083516001600160a01b0316155b15620001b2576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021b9190620009a8565b6001600160401b03166001146200024557604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002bc7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000523565b6101205260005b83518110156200046d576200031d848281518110620002e657620002e6620009c6565b6020026020010151848381518110620003035762000303620009c6565b6020026020010151600c6200058a60201b9092919060201c565b50620003d2838281518110620003375762000337620009c6565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200037d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a39190620009dc565b848381518110620003b857620003b8620009c6565b6020026020010151600f6200058a60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c848281518110620004095762000409620009c6565b6020026020010151848381518110620004265762000426620009c6565b6020026020010151604051620004529291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004658162000a03565b9050620002c3565b505050505062000a2b565b336001600160a01b03821603620004d25760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200056d94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005a2846001600160a01b03851684620005aa565b949350505050565b6000620005a284846001600160a01b03851660008281526002840160205260408120829055620005a284846000620005e38383620005ec565b90505b92915050565b60008181526001830160205260408120546200063557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005e6565b506000620005e6565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200067957620006796200063e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006aa57620006aa6200063e565b604052919050565b6001600160a01b0381168114620006c857600080fd5b50565b80516001600160401b0381168114620006e357600080fd5b919050565b60006001600160401b038211156200070457620007046200063e565b5060051b60200190565b600082601f8301126200072057600080fd5b81516020620007396200073383620006e8565b6200067f565b82815260059290921b840181019181810190868411156200075957600080fd5b8286015b84811015620007815780516200077381620006b2565b83529183019183016200075d565b509695505050505050565b600082601f8301126200079e57600080fd5b81516020620007b16200073383620006e8565b82815260059290921b84018101918181019086841115620007d157600080fd5b8286015b8481101562000781578051620007eb81620006b2565b8352918301918301620007d5565b80516001600160801b0381168114620006e357600080fd5b6000606082840312156200082457600080fd5b604051606081016001600160401b03811182821017156200084957620008496200063e565b8060405250809150825180151581146200086257600080fd5b81526200087260208401620007f9565b60208201526200088560408401620007f9565b60408201525092915050565b600080600080848603610160811215620008aa57600080fd5b60c0811215620008b957600080fd5b50620008c462000654565b8551620008d181620006b2565b8152620008e160208701620006cb565b6020820152620008f460408701620006cb565b604082015260608601516200090981620006b2565b606082015260808601516200091e81620006b2565b608082015260a08601516200093381620006b2565b60a082015260c08601519094506001600160401b03808211156200095657600080fd5b62000964888389016200070e565b945060e08701519150808211156200097b57600080fd5b506200098a878288016200078c565b9250506200099d86610100870162000811565b905092959194509250565b600060208284031215620009bb57600080fd5b620005e382620006cb565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009ef57600080fd5b8151620009fc81620006b2565b9392505050565b60006001820162000a2457634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161016051615fbb62000b08600039600081816103090152818161211a01526123c40152600081816102cd0152818161164e015281816116d0015281816120f30152818161293a01526129c10152600061257d01526000818161029101526120c90152600081816102310152612077015260008181610261015281816120a10152818161315b01526136f80152600081816101f5015281816120490152612672015260008181611397015281816113e30152818161179101526117dd0152615fbb6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806379ba5097116100ee578063b1dc65a411610097578063d3c7c2c711610071578063d3c7c2c7146106d3578063d7e2bb50146106db578063f2fde38b146106ee578063f52121a51461070157600080fd5b8063b1dc65a41461069a578063b4069b31146106ad578063c92b2832146106c057600080fd5b8063856c8247116100c8578063856c8247146106305780638da5cb5b1461065c578063afcb95d71461067a57600080fd5b806379ba5097146105ea57806381ff7048146105f257806385572ffb1461062257600080fd5b8063599f64311161015b578063681fba1611610135578063681fba16146104b8578063704b6c02146104cd578063740f4150146104e05780637437ff9f146104f357600080fd5b8063599f6431146104515780635d86f14114610490578063666cab8d146104a357600080fd5b80631ef381741161018c5780631ef38174146103c55780633a87ac53146103da578063546719cd146103ed57600080fd5b806306285c69146101b3578063142a98fc1461035c578063181f5a771461037c575b600080fd5b6103466040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516103539190614693565b60405180910390f35b61036f61036a36600461472a565b610714565b60405161035391906147b1565b6103b86040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b604051610353919061482d565b6103d86103d3366004614a9b565b61078f565b005b6103d86103e8366004614bad565b610c4e565b6103f561105e565b604051610353919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610353565b61046b61049e366004614c19565b611113565b6104ab61117c565b6040516103539190614c87565b6104c06111eb565b6040516103539190614c9a565b6103d86104db366004614c19565b6112a4565b6103d86104ee366004615133565b611394565b6105dd6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000008104831660808301527a010000000000000000000000000000000000000000000000000000900490911660a082015290565b60405161035391906151ee565b6103d8611516565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610353565b6103d86101ae36600461525d565b61064361063e366004614c19565b611613565b60405167ffffffffffffffff9091168152602001610353565b60005473ffffffffffffffffffffffffffffffffffffffff1661046b565b604080516001815260006020820181905291810191909152606001610353565b6103d86106a83660046152dd565b61173b565b61046b6106bb366004614c19565b6119cc565b6103d86106ce3660046153e2565b611a45565b6104c0611aca565b61046b6106e9366004614c19565b611b7f565b6103d86106fc366004614c19565b611b8e565b6103d861070f366004615450565b611b9f565b6000610722600160046154e3565b600261072f608085615525565b67ffffffffffffffff16610743919061554c565b60136000610752608087615563565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c16600381111561078957610789614747565b92915050565b84518460ff16601f821115610805576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b8060000361086f576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f736974697665000000000000000000000000000060448201526064016107fc565b610877611dfa565b61088085611e7d565b60095460005b8181101561090c5760086000600983815481106108a5576108a561558a565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055610905816155b9565b9050610886565b50875160005b81811015610b085760008a828151811061092e5761092e61558a565b602002602001015190506000600281111561094b5761094b614747565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff16600281111561098a5761098a614747565b146109f1576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d697474657220616464726573730000000060448201526064016107fc565b73ffffffffffffffffffffffffffffffffffffffff8116610a3e576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610aee57610aee614747565b02179055509050505080610b01906155b9565b9050610912565b508851610b1c9060099060208c01906145fd565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610ba2914691309190600090610b749063ffffffff166155f1565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d61217e565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610c3999989796959493929190615614565b60405180910390a15050505050505050505050565b610c56611dfa565b60005b83811015610e55576000858583818110610c7557610c7561558a565b610c8b9260206040909202019081019150614c19565b90506000868684818110610ca157610ca161558a565b9050604002016020016020810190610cb99190614c19565b9050610cc6600c83612229565b610cfc576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610d1e600c8461224b565b73ffffffffffffffffffffffffffffffffffffffff1614610d6b576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d76600c8361226d565b50610df18173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de991906156aa565b600f9061226d565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610e4e906155b9565b9050610c59565b5060005b81811015611057576000838383818110610e7557610e7561558a565b610e8b9260206040909202019081019150614c19565b90506000848484818110610ea157610ea161558a565b9050604002016020016020810190610eb99190614c19565b905073ffffffffffffffffffffffffffffffffffffffff82161580610ef2575073ffffffffffffffffffffffffffffffffffffffff8116155b15610f29576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f34600c83612229565b15610f6b576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f77600c838361228f565b50610ff38173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fea91906156aa565b600f908361228f565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1505080611050906155b9565b9050610e59565b5050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff16151593830193909352600454808416606084015204909116608082015261110e906122ba565b905090565b60008080611122600c8561236c565b9150915081611175576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107fc565b9392505050565b606060098054806020026020016040519081016040528092919081815260200182805480156111e157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111b6575b5050505050905090565b60606111f7600f61239b565b67ffffffffffffffff81111561120f5761120f614840565b604051908082528060200260200182016040528015611238578160200160208202803683370190505b50905060005b81518110156112a0576000611254600f836123a6565b5090508083838151811061126a5761126a61558a565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611299816155b9565b905061123e565b5090565b60005473ffffffffffffffffffffffffffffffffffffffff1633148015906112e4575060025473ffffffffffffffffffffffffffffffffffffffff163314155b1561131b576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f00000000000000000000000000000000000000000000000000000000000000001461141f576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff461660248201526044016107fc565b8151518151811461145c576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561150657600083828151811061147b5761147b61558a565b60200260200101519050806000141580156114b4575084518051839081106114a5576114a561558a565b60200260200101516080015181105b156114f5576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016107fc565b506114ff816155b9565b905061145f565b5061151183836123c2565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016107fc565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561168657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b15610789576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611717573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117591906156c7565b6117458787612d89565b60055488359080821461178e576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016107fc565b467f00000000000000000000000000000000000000000000000000000000000000001461180f576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016107fc565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561189757611897614747565b60028111156118a8576118a8614747565b90525090506002816020015160028111156118c5576118c5614747565b14801561190c57506009816000015160ff16815481106118e7576118e761558a565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611942576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600061195085602061554c565b61195b88602061554c565b6119678b6101446156e4565b61197191906156e4565b61197b91906156e4565b90503681146119bf576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016107fc565b5050505050505050505050565b60006119d782611113565b73ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a21573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078991906156aa565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611a85575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611abc576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ac7600382612db0565b50565b6060611ad6600c61239b565b67ffffffffffffffff811115611aee57611aee614840565b604051908082528060200260200182016040528015611b17578160200160208202803683370190505b50905060005b81518110156112a0576000611b33600c836123a6565b50905080838381518110611b4957611b4961558a565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611b78816155b9565b9050611b1d565b60008080611122600f8561236c565b611b96611dfa565b611ac781612f95565b333014611bd8576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611c15565b6040805180820190915260008082526020820152815260200190600190039081611bee5790505b506101408401515190915015611c8257611c7f8361014001518460200151604051602001611c5f919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60405160208183030381529060405285604001518661016001518661308a565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611cec57506040830151611cea9073ffffffffffffffffffffffffffffffffffffffff167f85572ffb00000000000000000000000000000000000000000000000000000000613415565b155b15611cf657505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611d2b8786613431565b611388886080015189604001516040518563ffffffff1660e01b8152600401611d579493929190615748565b6000604051808303816000875af1158015611d76573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611dbc919081019061581a565b50915091508161105757806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107fc919061482d565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107fc565b565b600081806020019051810190611e9391906158c4565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16611ee7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b015160a0808d01518c167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff92909c1676010000000000000000000000000000000000000000000002919091167fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90941674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909616978a169790971794909417919091169490941797909717909155825160c0810184527f00000000000000000000000000000000000000000000000000000000000000008516815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116968201969096527f0000000000000000000000000000000000000000000000000000000000000000909516858401527f00000000000000000000000000000000000000000000000000000000000000008416958501959095527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000009091169282019290925290517fe668e1a4644c1a030b909bbfd837f5cfa914994ed5e0bb2e9c34a5c37753128a91612172918490615970565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a6040516020016121a299989796959493929190615a4c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b60006111758373ffffffffffffffffffffffffffffffffffffffff84166134e1565b60006111758373ffffffffffffffffffffffffffffffffffffffff84166134ed565b60006111758373ffffffffffffffffffffffffffffffffffffffff84166134f9565b60006122b28473ffffffffffffffffffffffffffffffffffffffff851684613505565b949350505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261234882606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261232c91906154e3565b85608001516fffffffffffffffffffffffffffffffff16613528565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b60008061238f8473ffffffffffffffffffffffffffffffffffffffff8516613547565b915091505b9250929050565b600061078982613556565b60008080806123b58686613561565b9097909650945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561242d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124519190615ae1565b15612488576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81515160008190036124c5576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114612503576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561251e5761251e614840565b604051908082528060200260200182016040528015612547578160200160208202803683370190505b50905060005b828110156126275760008560000151828151811061256d5761256d61558a565b602002602001015190506125a1817f0000000000000000000000000000000000000000000000000000000000000000613570565b8383815181106125b3576125b361558a565b6020026020010181815250508061018001518383815181106125d7576125d761558a565b602002602001015114612616576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612620816155b9565b905061254d565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016926332048875926126a892879291600401615b2e565b602060405180830381865afa1580156126c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e99190615b64565b905080600003612725576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b84811015612d805760008760000151828151811061274c5761274c61558a565b6020026020010151905060006127658260600151610714565b9050600081600381111561277b5761277b614747565b14806127985750600381600381111561279657612796614747565b145b6127e05760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107fc565b831561289d57600a5460009063ffffffff166127fc87426154e3565b119050808061281c5750600382600381111561281a5761281a614747565b145b612852576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8884815181106128645761286461558a565b6020026020010151600014612897578884815181106128855761288561558a565b60200260200101518360800181815250505b506128fa565b60008160038111156128b1576128b1614747565b146128fa5760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107fc565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff168015801561297257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b15612b155760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015612a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2e91906156c7565b60c084015190915067ffffffffffffffff16612a4b826001615b7d565b67ffffffffffffffff1614612ab857826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050612d70565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b6000826003811115612b2957612b29614747565b03612bb55760c083015167ffffffffffffffff16612b48826001615b7d565b67ffffffffffffffff1614612bb557826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050612d70565b60008a602001518581518110612bcd57612bcd61558a565b60200260200101519050612bf984606001518560000151866101400151518761012001515185516136f6565b612c08846060015160016138a0565b600080612c15868461394a565b91509150612c278660600151836138a0565b6003826003811115612c3b57612c3b614747565b14158015612c5b57506002826003811115612c5857612c58614747565b14155b15612c9a578560600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016107fc929190615b9e565b6000856003811115612cae57612cae614747565b03612d1b5760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff1691612cf383615bbc565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051612d61929190615bd9565b60405180910390a35050505050505b612d79816155b9565b905061272c565b50505050505050565b612dac612d9882840184615bf9565b6040805160008152602081019091526123c2565b5050565b8154600090612dd990700100000000000000000000000000000000900463ffffffff16426154e3565b90508015612e7b5760018301548354612e21916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613528565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612ea1916fffffffffffffffffffffffffffffffff9081169116613aed565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612f889084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff821603613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107fc565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60606000865167ffffffffffffffff8111156130a8576130a8614840565b6040519080825280602002602001820160405280156130ed57816020015b60408051808201909152600080825260208201528152602001906001900390816130c65790505b50905060005b87518110156133e45760006131248983815181106131135761311361558a565b602002602001015160000151611113565b9050600089838151811061313a5761313a61558a565b60200260200101516020015190506000806132af638627fad660e01b8c8c867f00000000000000000000000000000000000000000000000000000000000000008e8b8151811061318c5761318c61558a565b60200260200101518e8c815181106131a6576131a661558a565b60200260200101516040516020016131bf929190615c2e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526131fe9594939291602401615c53565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600b54869063ffffffff7a010000000000000000000000000000000000000000000000000000909104166113886084613b03565b5091509150816132ed57806040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107fc919061482d565b8373ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015613338573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335c91906156aa565b86868151811061336e5761336e61558a565b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050828686815181106133bf576133bf61558a565b6020026020010151602001818152505050505050806133dd906155b9565b90506130f3565b50600b5461340990829073ffffffffffffffffffffffffffffffffffffffff16613c29565b90505b95945050505050565b600061342083613e11565b801561117557506111758383613e75565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff16815260200184602001516040516020016134b6919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006111758383613f44565b60006111758383613f50565b60006111758383613fda565b60006122b2848473ffffffffffffffffffffffffffffffffffffffff8516613ff7565b600061340c85613538848661554c565b61354290876156e4565b613aed565b60008080806123b58686614014565b60006107898261404e565b60008080806123b58686614059565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b610100015160405160200161361398979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b604051602081830303815290604052805190602001208561012001518051906020012086610140015160405160200161364c9190615cb6565b604051602081830303815290604052805190602001208761016001516040516020016136789190615d1e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff161461376f576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016107fc565b600b5474010000000000000000000000000000000000000000900461ffff168311156137d3576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016107fc565b808314613818576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016107fc565b600b54760100000000000000000000000000000000000000000000900463ffffffff1682111561105757600b546040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090910463ffffffff166004820152602481018390526044016107fc565b600060026138af608085615525565b67ffffffffffffffff166138c3919061554c565b905060006013816138d5608087615563565b67ffffffffffffffff1681526020810191909152604001600020549050816138ff600160046154e3565b901b19168183600381111561391657613916614747565b901b178060136000613929608088615563565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a59061398e9087908790600401615d31565b600060405180830381600087803b1580156139a857600080fd5b505af19250505080156139b9575060015b613ad2573d8080156139e7576040519150601f19603f3d011682016040523d82523d6000602084013e6139ec565b606091505b506139f681615ebb565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c000000000000000000000000000000000000000000000000000000001480613a8e5750613a4981615ebb565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b15613a9e57600392509050612394565b806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107fc919061482d565b50506040805160208101909152600081526002909250929050565b6000818310613afc5781611175565b5090919050565b6000606060008361ffff1667ffffffffffffffff811115613b2657613b26614840565b6040519080825280601f01601f191660200182016040528015613b50576020820181803683370190505b509150863b613b83577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613bb6577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613bef577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613c125750835b808352806000602085013e50955095509592505050565b81516000805b82811015613dfd5760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613c6757613c6761558a565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cff9190615f0b565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613d9157858281518110613d3a57613d3a61558a565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016107fc565b613ddf868381518110613da657613da661558a565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661408490919063ffffffff16565b613de990846156e4565b92505080613df6906155b9565b9050613c2f565b50613e0b60038260006140c1565b50505050565b6000613e3d827f01ffc9a700000000000000000000000000000000000000000000000000000000613e75565b80156107895750613e6e827fffffffff00000000000000000000000000000000000000000000000000000000613e75565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613f2d575060208210155b8015613f395750600081115b979650505050505050565b60006111758383614444565b600081815260028301602052604081205480151580613f745750613f748484613f44565b611175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016107fc565b60008181526002830160205260408120819055611175838361445c565b600082815260028401602052604081208290556122b28484614468565b6000818152600283016020526040812054819080614043576140368585613f44565b9250600091506123949050565b600192509050612394565b600061078982614474565b60008080614067858561447e565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a76400006140b7837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff861661554c565b6111759190615f6b565b825474010000000000000000000000000000000000000000900460ff1615806140e8575081155b156140f257505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061413890700100000000000000000000000000000000900463ffffffff16426154e3565b905080156141f8578183111561417a576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546141b49083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613528565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156142af5773ffffffffffffffffffffffffffffffffffffffff8416614257576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016107fc565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016107fc565b848310156143c25760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906142f390826154e3565b6142fd878a6154e3565b61430791906156e4565b6143119190615f6b565b905073ffffffffffffffffffffffffffffffffffffffff861661436a576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016107fc565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016107fc565b6143cc85846154e3565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60008181526001830160205260408120541515611175565b6000611175838361448a565b60006111758383614584565b6000610789825490565b600061117583836145d3565b600081815260018301602052604081205480156145735760006144ae6001836154e3565b85549091506000906144c2906001906154e3565b90508181146145275760008660000182815481106144e2576144e261558a565b90600052602060002001549050808760000184815481106145055761450561558a565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061453857614538615f7f565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610789565b6000915050610789565b5092915050565b60008181526001830160205260408120546145cb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610789565b506000610789565b60008260000182815481106145ea576145ea61558a565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215614677579160200282015b8281111561467757825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019061461d565b506112a09291505b808211156112a0576000815560010161467f565b60c08101610789828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611ac757600080fd5b803561472581614704565b919050565b60006020828403121561473c57600080fd5b813561117581614704565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106147ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b602081016107898284614776565b60005b838110156147da5781810151838201526020016147c2565b50506000910152565b600081518084526147fb8160208601602086016147bf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061117560208301846147e3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561489257614892614840565b60405290565b6040516101a0810167ffffffffffffffff8111828210171561489257614892614840565b6040516080810167ffffffffffffffff8111828210171561489257614892614840565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561492657614926614840565b604052919050565b600067ffffffffffffffff82111561494857614948614840565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611ac757600080fd5b803561472581614952565b600082601f83011261499057600080fd5b813560206149a56149a08361492e565b6148df565b82815260059290921b840181019181810190868411156149c457600080fd5b8286015b848110156149e85780356149db81614952565b83529183019183016149c8565b509695505050505050565b803560ff8116811461472557600080fd5b600067ffffffffffffffff821115614a1e57614a1e614840565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614a5b57600080fd5b8135614a696149a082614a04565b818152846020838601011115614a7e57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614ab457600080fd5b863567ffffffffffffffff80821115614acc57600080fd5b614ad88a838b0161497f565b97506020890135915080821115614aee57600080fd5b614afa8a838b0161497f565b9650614b0860408a016149f3565b95506060890135915080821115614b1e57600080fd5b614b2a8a838b01614a4a565b9450614b3860808a0161471a565b935060a0890135915080821115614b4e57600080fd5b50614b5b89828a01614a4a565b9150509295509295509295565b60008083601f840112614b7a57600080fd5b50813567ffffffffffffffff811115614b9257600080fd5b6020830191508360208260061b850101111561239457600080fd5b60008060008060408587031215614bc357600080fd5b843567ffffffffffffffff80821115614bdb57600080fd5b614be788838901614b68565b90965094506020870135915080821115614c0057600080fd5b50614c0d87828801614b68565b95989497509550505050565b600060208284031215614c2b57600080fd5b813561117581614952565b600081518084526020808501945080840160005b83811015614c7c57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614c4a565b509495945050505050565b6020815260006111756020830184614c36565b6020808252825182820181905260009190848201906040850190845b81811015614ce857835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614cb6565b50909695505050505050565b8015158114611ac757600080fd5b803561472581614cf4565b600082601f830112614d1e57600080fd5b81356020614d2e6149a08361492e565b82815260069290921b84018101918181019086841115614d4d57600080fd5b8286015b848110156149e85760408189031215614d6a5760008081fd5b614d7261486f565b8135614d7d81614952565b81528185013585820152835291830191604001614d51565b600082601f830112614da657600080fd5b81356020614db66149a08361492e565b82815260059290921b84018101918181019086841115614dd557600080fd5b8286015b848110156149e857803567ffffffffffffffff811115614df95760008081fd5b614e078986838b0101614a4a565b845250918301918301614dd9565b60006101a08284031215614e2857600080fd5b614e30614898565b9050614e3b8261471a565b8152614e4960208301614974565b6020820152614e5a60408301614974565b6040820152614e6b6060830161471a565b606082015260808201356080820152614e8660a08301614d02565b60a0820152614e9760c0830161471a565b60c0820152614ea860e08301614974565b60e082015261010082810135908201526101208083013567ffffffffffffffff80821115614ed557600080fd5b614ee186838701614a4a565b83850152610140925082850135915080821115614efd57600080fd5b614f0986838701614d0d565b83850152610160925082850135915080821115614f2557600080fd5b50614f3285828601614d95565b82840152505061018080830135818301525092915050565b600082601f830112614f5b57600080fd5b81356020614f6b6149a08361492e565b82815260059290921b84018101918181019086841115614f8a57600080fd5b8286015b848110156149e857803567ffffffffffffffff811115614fae5760008081fd5b614fbc8986838b0101614d95565b845250918301918301614f8e565b600082601f830112614fdb57600080fd5b81356020614feb6149a08361492e565b82815260059290921b8401810191818101908684111561500a57600080fd5b8286015b848110156149e8578035835291830191830161500e565b60006080828403121561503757600080fd5b61503f6148bc565b9050813567ffffffffffffffff8082111561505957600080fd5b818401915084601f83011261506d57600080fd5b8135602061507d6149a08361492e565b82815260059290921b8401810191818101908884111561509c57600080fd5b8286015b848110156150d4578035868111156150b85760008081fd5b6150c68b86838b0101614e15565b8452509183019183016150a0565b50865250858101359350828411156150eb57600080fd5b6150f787858801614f4a565b9085015250604084013591508082111561511057600080fd5b5061511d84828501614fca565b6040830152506060820135606082015292915050565b6000806040838503121561514657600080fd5b823567ffffffffffffffff8082111561515e57600080fd5b61516a86838701615025565b935060209150818501358181111561518157600080fd5b85019050601f8101861361519457600080fd5b80356151a26149a08261492e565b81815260059190911b820183019083810190888311156151c157600080fd5b928401925b828410156151df578335825292840192908401906151c6565b80955050505050509250929050565b60c08101610789828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff60608301511660608401528060808301511660808401528060a08301511660a0840152505050565b60006020828403121561526f57600080fd5b813567ffffffffffffffff81111561528657600080fd5b820160a0818503121561117557600080fd5b60008083601f8401126152aa57600080fd5b50813567ffffffffffffffff8111156152c257600080fd5b6020830191508360208260051b850101111561239457600080fd5b60008060008060008060008060e0898b0312156152f957600080fd5b606089018a81111561530a57600080fd5b8998503567ffffffffffffffff8082111561532457600080fd5b818b0191508b601f83011261533857600080fd5b81358181111561534757600080fd5b8c602082850101111561535957600080fd5b6020830199508098505060808b013591508082111561537757600080fd5b6153838c838d01615298565b909750955060a08b013591508082111561539c57600080fd5b506153a98b828c01615298565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461472557600080fd5b6000606082840312156153f457600080fd5b6040516060810181811067ffffffffffffffff8211171561541757615417614840565b604052823561542581614cf4565b8152615433602084016153c2565b6020820152615444604084016153c2565b60408201529392505050565b6000806040838503121561546357600080fd5b823567ffffffffffffffff8082111561547b57600080fd5b61548786838701614e15565b9350602085013591508082111561549d57600080fd5b506154aa85828601614d95565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610789576107896154b4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680615540576155406154f6565b92169190910692915050565b8082028115828204841417610789576107896154b4565b600067ffffffffffffffff8084168061557e5761557e6154f6565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036155ea576155ea6154b4565b5060010190565b600063ffffffff80831681810361560a5761560a6154b4565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526156448184018a614c36565b905082810360808401526156588189614c36565b905060ff871660a084015282810360c084015261567581876147e3565b905067ffffffffffffffff851660e084015282810361010084015261569a81856147e3565b9c9b505050505050505050505050565b6000602082840312156156bc57600080fd5b815161117581614952565b6000602082840312156156d957600080fd5b815161117581614704565b80820180821115610789576107896154b4565b600081518084526020808501945080840160005b83811015614c7c578151805173ffffffffffffffffffffffffffffffffffffffff168852830151838801526040909601959082019060010161570b565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c08401526157836101208401826147e3565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e08601526157bf83836147e3565b9250608089015191508085840301610100860152506157de82826156f7565b925050506157f2602083018661ffff169052565b83604083015261340c606083018473ffffffffffffffffffffffffffffffffffffffff169052565b60008060006060848603121561582f57600080fd5b835161583a81614cf4565b602085015190935067ffffffffffffffff81111561585757600080fd5b8401601f8101861361586857600080fd5b80516158766149a082614a04565b81815287602083850101111561588b57600080fd5b61589c8260208301602086016147bf565b809450505050604084015190509250925092565b805163ffffffff8116811461472557600080fd5b600060c082840312156158d657600080fd5b60405160c0810181811067ffffffffffffffff821117156158f9576158f9614840565b604052615905836158b0565b8152602083015161591581614952565b6020820152604083015161592881614952565b6040820152606083015161ffff8116811461594257600080fd5b6060820152615953608084016158b0565b608082015261596460a084016158b0565b60a08201529392505050565b61018081016159e2828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff166101208401526080840151811661014084015260a084015116610160830152611175565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152615a938285018b614c36565b91508382036080850152615aa7828a614c36565b915060ff881660a085015283820360c0850152615ac482886147e3565b90861660e0850152838103610100850152905061569a81856147e3565b600060208284031215615af357600080fd5b815161117581614cf4565b600081518084526020808501945080840160005b83811015614c7c57815187529582019590820190600101615b12565b606081526000615b416060830186615afe565b8281036020840152615b538186615afe565b915050826040830152949350505050565b600060208284031215615b7657600080fd5b5051919050565b67ffffffffffffffff81811683821601908082111561457d5761457d6154b4565b67ffffffffffffffff83168152604081016111756020830184614776565b600067ffffffffffffffff80831681810361560a5761560a6154b4565b615be38184614776565b6040602082015260006122b260408301846147e3565b600060208284031215615c0b57600080fd5b813567ffffffffffffffff811115615c2257600080fd5b6122b284828501615025565b604081526000615c4160408301856147e3565b828103602084015261340c81856147e3565b60a081526000615c6660a08301886147e3565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff851660608401528281036080840152615caa81856147e3565b98975050505050505050565b60208152600061117560208301846156f7565b600081518084526020808501808196508360051b8101915082860160005b85811015615d11578284038952615cff8483516147e3565b98850198935090840190600101615ce7565b5091979650505050505050565b6020815260006111756020830184615cc9565b60408152615d4c60408201845167ffffffffffffffff169052565b60006020840151615d75606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615de38185018367ffffffffffffffff169052565b60e08601519150610120615e0e8186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a06101608181870152615e3e6101e08701856147e3565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0610180818887030181890152615e7d86866156f7565b9550828a01519450818887030184890152615e988686615cc9565b9550808a01516101c08901525050505050828103602084015261340c8185615cc9565b6000815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015615f035780818460040360031b1b83161693505b505050919050565b600060408284031215615f1d57600080fd5b615f2561486f565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114615f5157600080fd5b8152615f5f602084016158b0565b60208201529392505050565b600082615f7a57615f7a6154f6565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var EVM2EVMOffRampABI = EVM2EVMOffRampMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go index afcd4a7494..ba617cf144 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp_helper/evm_2_evm_offramp_helper.go @@ -105,7 +105,7 @@ type RateLimiterTokenBucket struct { var EVM2EVMOffRampHelperMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"contractIPool[]\",\"name\":\"pools\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"IS_SCRIPT\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"rep\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"manualExecGasLimits\",\"type\":\"uint256[]\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getDestinationToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDestinationTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"bitmapIndex\",\"type\":\"uint64\"}],\"name\":\"getExecutionStateBitMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"getPoolByDestToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"contractIERC20[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"releaseOrMintTokens\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"executableMessages\",\"type\":\"bytes\"}],\"name\":\"report\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"}],\"name\":\"setExecutionStateHelper\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"trialExecute\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x6101806040526014805460ff191660011790553480156200001f57600080fd5b5060405162006f3f38038062006f3f8339810160408190526200004291620008a6565b838383838033806000816200009e5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000d157620000d1816200048d565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001815760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b03161580620001a4575083516001600160a01b0316155b15620001c3576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000206573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022c9190620009bd565b6001600160401b03166001146200025657604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002cd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000538565b6101205260005b83518110156200047e576200032e848281518110620002f757620002f7620009db565b6020026020010151848381518110620003145762000314620009db565b6020026020010151600c6200059f60201b9092919060201c565b50620003e3838281518110620003485762000348620009db565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200038e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b49190620009f1565b848381518110620003c957620003c9620009db565b6020026020010151600f6200059f60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c8482815181106200041a576200041a620009db565b6020026020010151848381518110620004375762000437620009db565b6020026020010151604051620004639291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004768162000a18565b9050620002d4565b50505050505050505062000a40565b336001600160a01b03821603620004e75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000095565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200058294939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005b7846001600160a01b03851684620005bf565b949350505050565b6000620005b784846001600160a01b03851660008281526002840160205260408120829055620005b784846000620005f8838362000601565b90505b92915050565b60008181526001830160205260408120546200064a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005fb565b506000620005fb565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200068e576200068e62000653565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006bf57620006bf62000653565b604052919050565b6001600160a01b0381168114620006dd57600080fd5b50565b80516001600160401b0381168114620006f857600080fd5b919050565b60006001600160401b0382111562000719576200071962000653565b5060051b60200190565b600082601f8301126200073557600080fd5b815160206200074e6200074883620006fd565b62000694565b82815260059290921b840181019181810190868411156200076e57600080fd5b8286015b84811015620007965780516200078881620006c7565b835291830191830162000772565b509695505050505050565b600082601f830112620007b357600080fd5b81516020620007c66200074883620006fd565b82815260059290921b84018101918181019086841115620007e657600080fd5b8286015b84811015620007965780516200080081620006c7565b8352918301918301620007ea565b80516001600160801b0381168114620006f857600080fd5b6000606082840312156200083957600080fd5b604051606081016001600160401b03811182821017156200085e576200085e62000653565b8060405250809150825180151581146200087757600080fd5b815262000887602084016200080e565b60208201526200089a604084016200080e565b60408201525092915050565b600080600080848603610160811215620008bf57600080fd5b60c0811215620008ce57600080fd5b50620008d962000669565b8551620008e681620006c7565b8152620008f660208701620006e0565b60208201526200090960408701620006e0565b604082015260608601516200091e81620006c7565b606082015260808601516200093381620006c7565b608082015260a08601516200094881620006c7565b60a082015260c08601519094506001600160401b03808211156200096b57600080fd5b620009798883890162000723565b945060e08701519150808211156200099057600080fd5b506200099f87828801620007a1565b925050620009b286610100870162000826565b905092959194509250565b600060208284031215620009d057600080fd5b620005f882620006e0565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000a0457600080fd5b815162000a1181620006c7565b9392505050565b60006001820162000a3957634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e0516101005161012051610140516101605161640d62000b3260003960008181610381015281816123350152612baa01526000818161034501528181611835015281816118b70152818161230e0152818161312001526131a701526000612d63015260008181610309015281816122e401526135d90152600081816102a90152818161229201526135b80152600081816102d9015281816122bc015281816128ef015281816135970152613f2701526000818161026d015281816122640152612e5801526000818161157e015281816115ca0152818161197801526119c4015261640d6000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80637437ff9f1161012a578063b4069b31116100bd578063d3c7c2c71161008c578063f2fde38b11610071578063f2fde38b14610820578063f52121a514610833578063f8ccbf471461084657600080fd5b8063d3c7c2c714610805578063d7e2bb501461080d57600080fd5b8063b4069b31146107c4578063b5767166146107d7578063c5a1d7f0146107ea578063c92b2832146107f257600080fd5b8063856c8247116100f9578063856c8247146107475780638da5cb5b14610773578063afcb95d714610791578063b1dc65a4146107b157600080fd5b80637437ff9f1461060a57806379ba50971461070157806381ff70481461070957806385572ffb1461073957600080fd5b8063546719cd116101bd578063681fba161161018c5780636c6bd845116101715780636c6bd845146105d1578063704b6c02146105e4578063740f4150146105f757600080fd5b8063681fba161461059c578063693928ae146105b157600080fd5b8063546719cd146104d1578063599f6431146105355780635d86f14114610574578063666cab8d1461058757600080fd5b80632dea00f3116101f95780632dea00f3146104525780633a87ac53146104655780634f9f03fe14610478578063506449721461049957600080fd5b806306285c691461022b578063142a98fc146103d4578063181f5a77146103f45780631ef381741461043d575b600080fd5b6103be6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516103cb9190614967565b60405180910390f35b6103e76103e23660046149fe565b610863565b6040516103cb9190614a85565b6104306040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b6040516103cb9190614b01565b61045061044b366004614d6f565b6108de565b005b610450610460366004614e3c565b610d9d565b610450610473366004614ebe565b610dab565b61048b610486366004615194565b6111bb565b6040516103cb9291906151f8565b6104c36104a73660046149fe565b67ffffffffffffffff1660009081526013602052604090205490565b6040519081526020016103cb565b6104d96111d5565b6040516103cb919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103cb565b61054f610582366004615218565b61128a565b61058f6112f3565b6040516103cb9190615286565b6105a4611362565b6040516103cb9190615299565b6105c46105bf36600461537a565b61141b565b6040516103cb919061549e565b6104506105df36600461569a565b611481565b6104506105f2366004615218565b61148b565b61045061060536600461569a565b61157b565b6106f46040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000008104831660808301527a010000000000000000000000000000000000000000000000000000900490911660a082015290565b6040516103cb9190615755565b6104506116fd565b6007546005546040805163ffffffff808516825264010000000090940490931660208401528201526060016103cb565b6104506102263660046157c4565b61075a610755366004615218565b6117fa565b60405167ffffffffffffffff90911681526020016103cb565b60005473ffffffffffffffffffffffffffffffffffffffff1661054f565b6040805160018152600060208201819052918101919091526060016103cb565b6104506107bf3660046157ff565b611922565b61054f6107d2366004615218565b611bb3565b6104506107e53660046158b6565b611c2c565b6104c3611c36565b610450610800366004615918565b611c61565b6105a4611ce6565b61054f61081b366004615218565b611d9b565b61045061082e366004615218565b611daa565b610450610841366004615194565b611dbb565b6014546108539060ff1681565b60405190151581526020016103cb565b6000610871600160046159b5565b600261087e6080856159f7565b67ffffffffffffffff166108929190615a1e565b601360006108a1608087615a35565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156108d8576108d8614a1b565b92915050565b84518460ff16601f821115610954576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b806000036109be576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f7369746976650000000000000000000000000000604482015260640161094b565b6109c6612015565b6109cf85612098565b60095460005b81811015610a5b5760086000600983815481106109f4576109f4615a5c565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055610a5481615a8b565b90506109d5565b50875160005b81811015610c575760008a8281518110610a7d57610a7d615a5c565b6020026020010151905060006002811115610a9a57610a9a614a1b565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff166002811115610ad957610ad9614a1b565b14610b40576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d6974746572206164647265737300000000604482015260640161094b565b73ffffffffffffffffffffffffffffffffffffffff8116610b8d576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610c3d57610c3d614a1b565b02179055509050505080610c5090615a8b565b9050610a61565b508851610c6b9060099060208c01906148d1565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610cf1914691309190600090610cc39063ffffffff16615ac3565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d612399565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610d8899989796959493929190615ae6565b60405180910390a15050505050505050505050565b610da78282612444565b5050565b610db3612015565b60005b83811015610fb2576000858583818110610dd257610dd2615a5c565b610de89260206040909202019081019150615218565b90506000868684818110610dfe57610dfe615a5c565b9050604002016020016020810190610e169190615218565b9050610e23600c836124ee565b610e59576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610e7b600c84612510565b73ffffffffffffffffffffffffffffffffffffffff1614610ec8576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ed3600c83612532565b50610f4e8173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f469190615b7c565b600f90612532565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610fab90615a8b565b9050610db6565b5060005b818110156111b4576000838383818110610fd257610fd2615a5c565b610fe89260206040909202019081019150615218565b90506000848484818110610ffe57610ffe615a5c565b90506040020160200160208101906110169190615218565b905073ffffffffffffffffffffffffffffffffffffffff8216158061104f575073ffffffffffffffffffffffffffffffffffffffff8116155b15611086576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611091600c836124ee565b156110c8576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d4600c8383612554565b506111508173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611123573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111479190615b7c565b600f9083612554565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a15050806111ad90615a8b565b9050610fb6565b5050505050565b600060606111c9848461257f565b915091505b9250929050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff16151593830193909352600454808416606084015204909116608082015261128590612722565b905090565b60008080611299600c856127d4565b91509150816112ec576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161094b565b9392505050565b6060600980548060200260200160405190810160405280929190818152602001828054801561135857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161132d575b5050505050905090565b606061136e600f6127f7565b67ffffffffffffffff81111561138657611386614b14565b6040519080825280602002602001820160405280156113af578160200160208202803683370190505b50905060005b81518110156114175760006113cb600f83612802565b509050808383815181106113e1576113e1615a5c565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525061141081615a8b565b90506113b5565b5090565b60606114748989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925061146591508990508a615b99565b61146f8789615b99565b61281e565b9998505050505050505050565b610da78282612ba8565b60005473ffffffffffffffffffffffffffffffffffffffff1633148015906114cb575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611502576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f000000000000000000000000000000000000000000000000000000000000000014611606576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff4616602482015260440161094b565b81515181518114611643576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156116ed57600083828151811061166257611662615a5c565b602002602001015190508060001415801561169b5750845180518390811061168c5761168c615a5c565b60200260200101516080015181105b156116dc576040517f085e39cf000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161094b565b506116e681615a8b565b9050611646565b506116f88383612ba8565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461177e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161094b565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561186d57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b156108d8576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156118fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ec9190615ba6565b61192c878761356f565b600554883590808214611975576040517f93df584c000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161094b565b467f0000000000000000000000000000000000000000000000000000000000000000146119f6576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161094b565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115611a7e57611a7e614a1b565b6002811115611a8f57611a8f614a1b565b9052509050600281602001516002811115611aac57611aac614a1b565b148015611af357506009816000015160ff1681548110611ace57611ace615a5c565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611b29576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611b37856020615a1e565b611b42886020615a1e565b611b4e8b610144615bc3565b611b589190615bc3565b611b629190615bc3565b9050368114611ba6576040517f8e1192e10000000000000000000000000000000000000000000000000000000081526004810182905236602482015260440161094b565b5050505050505050505050565b6000611bbe8261128a565b73ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c08573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d89190615b7c565b610da7828261356f565b60006112857f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3613592565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611ca1575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611cd8576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ce360038261365f565b50565b6060611cf2600c6127f7565b67ffffffffffffffff811115611d0a57611d0a614b14565b604051908082528060200260200182016040528015611d33578160200160208202803683370190505b50905060005b8151811015611417576000611d4f600c83612802565b50905080838381518110611d6557611d65615a5c565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611d9481615a8b565b9050611d39565b60008080611299600f856127d4565b611db2612015565b611ce381613844565b333014611df4576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611e31565b6040805180820190915260008082526020820152815260200190600190039081611e0a5790505b506101408401515190915015611e9e57611e9b8361014001518460200151604051602001611e7b919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60405160208183030381529060405285604001518661016001518661281e565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611f0857506040830151611f069073ffffffffffffffffffffffffffffffffffffffff167f85572ffb00000000000000000000000000000000000000000000000000000000613939565b155b15611f1257505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611f478786613955565b611388886080015189604001516040518563ffffffff1660e01b8152600401611f739493929190615bd6565b6000604051808303816000875af1158015611f92573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611fd89190810190615ca8565b91509150816111b457806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161094b9190614b01565b60005473ffffffffffffffffffffffffffffffffffffffff163314612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161094b565b565b6000818060200190518101906120ae9190615d49565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16612102576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b015160a0808d01518c167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff92909c1676010000000000000000000000000000000000000000000002919091167fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90941674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909616978a169790971794909417919091169490941797909717909155825160c0810184527f00000000000000000000000000000000000000000000000000000000000000008516815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116968201969096527f0000000000000000000000000000000000000000000000000000000000000000909516858401527f00000000000000000000000000000000000000000000000000000000000000008416958501959095527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000009091169282019290925290517fe668e1a4644c1a030b909bbfd837f5cfa914994ed5e0bb2e9c34a5c37753128a9161238d918490615df5565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a6040516020016123bd99989796959493929190615ed1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b600060026124536080856159f7565b67ffffffffffffffff166124679190615a1e565b90506000601381612479608087615a35565b67ffffffffffffffff1681526020810191909152604001600020549050816124a3600160046159b5565b901b1916818360038111156124ba576124ba614a1b565b901b1780601360006124cd608088615a35565b67ffffffffffffffff16815260208101919091526040016000205550505050565b60006112ec8373ffffffffffffffffffffffffffffffffffffffff8416613a05565b60006112ec8373ffffffffffffffffffffffffffffffffffffffff8416613a11565b60006112ec8373ffffffffffffffffffffffffffffffffffffffff8416613a1d565b60006125778473ffffffffffffffffffffffffffffffffffffffff851684613a29565b949350505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a5906125c39087908790600401615fbb565b600060405180830381600087803b1580156125dd57600080fd5b505af19250505080156125ee575060015b612707573d80801561261c576040519150601f19603f3d011682016040523d82523d6000602084013e612621565b606091505b5061262b81616145565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c0000000000000000000000000000000000000000000000000000000014806126c3575061267e81616145565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b156126d3576003925090506111ce565b806040517fcf19edfd00000000000000000000000000000000000000000000000000000000815260040161094b9190614b01565b50506040805160208101909152600081526002909250929050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526127b082606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261279491906159b5565b85608001516fffffffffffffffffffffffffffffffff16613a4c565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6000806111c98473ffffffffffffffffffffffffffffffffffffffff8516613a6b565b60006108d882613a7a565b60008080806128118686613a85565b9097909650945050505050565b60606000865167ffffffffffffffff81111561283c5761283c614b14565b60405190808252806020026020018201604052801561288157816020015b604080518082019091526000808252602082015281526020019060019003908161285a5790505b50905060005b8751811015612b775760006128b88983815181106128a7576128a7615a5c565b60200260200101516000015161128a565b905060008983815181106128ce576128ce615a5c565b6020026020010151602001519050600080612a43638627fad660e01b8c8c867f00000000000000000000000000000000000000000000000000000000000000008e8b8151811061292057612920615a5c565b60200260200101518e8c8151811061293a5761293a615a5c565b6020026020010151604051602001612953929190616195565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261299295949392916024016161ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600b54869063ffffffff7a010000000000000000000000000000000000000000000000000000909104166084611388613a94565b9150915081612a8057806040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161094b9190614b01565b8373ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aef9190615b7c565b868681518110612b0157612b01615a5c565b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082868681518110612b5257612b52615a5c565b602002602001015160200181815250505050505080612b7090615a8b565b9050612887565b50600b54612b9c90829073ffffffffffffffffffffffffffffffffffffffff16613bb7565b90505b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c37919061621d565b15612c6e576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003612cab576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114612ce9576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115612d0457612d04614b14565b604051908082528060200260200182016040528015612d2d578160200160208202803683370190505b50905060005b82811015612e0d57600085600001518281518110612d5357612d53615a5c565b60200260200101519050612d87817f0000000000000000000000000000000000000000000000000000000000000000613d9f565b838381518110612d9957612d99615a5c565b602002602001018181525050806101800151838381518110612dbd57612dbd615a5c565b602002602001015114612dfc576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612e0681615a8b565b9050612d33565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692633204887592612e8e9287929160040161626a565b602060405180830381865afa158015612eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecf91906162a0565b905080600003612f0b576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b8481101561356657600087600001518281518110612f3257612f32615a5c565b602002602001015190506000612f4b8260600151610863565b90506000816003811115612f6157612f61614a1b565b1480612f7e57506003816003811115612f7c57612f7c614a1b565b145b612fc65760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161094b565b831561308357600a5460009063ffffffff16612fe287426159b5565b11905080806130025750600382600381111561300057613000614a1b565b145b613038576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061304a5761304a615a5c565b602002602001015160001461307d5788848151811061306b5761306b615a5c565b60200260200101518360800181815250505b506130e0565b600081600381111561309757613097614a1b565b146130e05760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161094b565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff168015801561315857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b156132fb5760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156131f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132149190615ba6565b60c084015190915067ffffffffffffffff166132318260016162b9565b67ffffffffffffffff161461329e57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050613556565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600082600381111561330f5761330f614a1b565b0361339b5760c083015167ffffffffffffffff1661332e8260016162b9565b67ffffffffffffffff161461339b57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050613556565b60008a6020015185815181106133b3576133b3615a5c565b602002602001015190506133df8460600151856000015186610140015151876101200151518551613f25565b6133ee84606001516001612444565b6000806133fb868461257f565b9150915061340d866060015183612444565b600382600381111561342157613421614a1b565b141580156134415750600282600381111561343e5761343e614a1b565b14155b15613480578560600151826040517f9e26160300000000000000000000000000000000000000000000000000000000815260040161094b9291906162da565b600085600381111561349457613494614a1b565b036135015760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff16916134d9836162f8565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef6584846040516135479291906151f8565b60405180910390a35050505050505b61355f81615a8b565b9050612f12565b50505050505050565b610da761357e82840184616315565b604080516000815260208101909152612ba8565b6000817f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000604051602001613642949392919093845267ffffffffffffffff92831660208501529116604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b604051602081830303815290604052805190602001209050919050565b815460009061368890700100000000000000000000000000000000900463ffffffff16426159b5565b9050801561372a57600183015483546136d0916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613a4c565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354613750916fffffffffffffffffffffffffffffffff90811691166140cf565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906138379084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036138c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161094b565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613944836140e5565b80156112ec57506112ec8383614149565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff16815260200184602001516040516020016139da919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006112ec8383614218565b60006112ec8383614224565b60006112ec83836142ae565b6000612577848473ffffffffffffffffffffffffffffffffffffffff85166142cb565b6000612b9f85613a5c8486615a1e565b613a669087615bc3565b6140cf565b600080808061281186866142e8565b60006108d882614322565b6000808080612811868661432d565b600060608361ffff1667ffffffffffffffff811115613ab557613ab5614b14565b6040519080825280601f01601f191660200182016040528015613adf576020820181803683370190505b5090507f0c3b563c000000000000000000000000000000000000000000000000000000007fafa32a2c000000000000000000000000000000000000000000000000000000007f37c3be2900000000000000000000000000000000000000000000000000000000883b613b55578260005260046000fd5b5a86811015613b68578260005260046000fd5b8690036040810481038910613b81578160005260046000fd5b506000808b5160208d0160008d8df194503d87811115613b9e5750865b808552806000602087013e505050509550959350505050565b81516000805b82811015613d8b5760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613bf557613bf5615a5c565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8d919061634a565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613d1f57858281518110613cc857613cc8615a5c565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161094b565b613d6d868381518110613d3457613d34615a5c565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661435890919063ffffffff16565b613d779084615bc3565b92505080613d8490615a8b565b9050613bbd565b50613d996003826000614395565b50505050565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001613e4298979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001613e7b919061549e565b60405160208183030381529060405280519060200120876101600151604051602001613ea791906163aa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614613f9e576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8516600482015260240161094b565b600b5474010000000000000000000000000000000000000000900461ffff16831115614002576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015260240161094b565b808314614047576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015260240161094b565b600b54760100000000000000000000000000000000000000000000900463ffffffff168211156111b457600b546040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090910463ffffffff1660048201526024810183905260440161094b565b60008183106140de57816112ec565b5090919050565b6000614111827f01ffc9a700000000000000000000000000000000000000000000000000000000614149565b80156108d85750614142827fffffffff00000000000000000000000000000000000000000000000000000000614149565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015614201575060208210155b801561420d5750600081115b979650505050505050565b60006112ec8383614718565b60008181526002830160205260408120548015158061424857506142488484614218565b6112ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161094b565b600081815260028301602052604081208190556112ec8383614730565b60008281526002840160205260408120829055612577848461473c565b60008181526002830160205260408120548190806143175761430a8585614218565b9250600091506111ce9050565b6001925090506111ce565b60006108d882614748565b6000808061433b8585614752565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a764000061438b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615a1e565b6112ec91906163bd565b825474010000000000000000000000000000000000000000900460ff1615806143bc575081155b156143c657505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061440c90700100000000000000000000000000000000900463ffffffff16426159b5565b905080156144cc578183111561444e576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546144889083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613a4c565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156145835773ffffffffffffffffffffffffffffffffffffffff841661452b576040517ff94ebcd1000000000000000000000000000000000000000000000000000000008152600481018390526024810186905260440161094b565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff8516604482015260640161094b565b848310156146965760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906145c790826159b5565b6145d1878a6159b5565b6145db9190615bc3565b6145e591906163bd565b905073ffffffffffffffffffffffffffffffffffffffff861661463e576040517f15279c08000000000000000000000000000000000000000000000000000000008152600481018290526024810186905260440161094b565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff8716604482015260640161094b565b6146a085846159b5565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081815260018301602052604081205415156112ec565b60006112ec838361475e565b60006112ec8383614858565b60006108d8825490565b60006112ec83836148a7565b600081815260018301602052604081205480156148475760006147826001836159b5565b8554909150600090614796906001906159b5565b90508181146147fb5760008660000182815481106147b6576147b6615a5c565b90600052602060002001549050808760000184815481106147d9576147d9615a5c565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061480c5761480c6163d1565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108d8565b60009150506108d8565b5092915050565b600081815260018301602052604081205461489f575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108d8565b5060006108d8565b60008260000182815481106148be576148be615a5c565b9060005260206000200154905092915050565b82805482825590600052602060002090810192821561494b579160200282015b8281111561494b57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906148f1565b506114179291505b808211156114175760008155600101614953565b60c081016108d8828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611ce357600080fd5b80356149f9816149d8565b919050565b600060208284031215614a1057600080fd5b81356112ec816149d8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110614a81577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b602081016108d88284614a4a565b60005b83811015614aae578181015183820152602001614a96565b50506000910152565b60008151808452614acf816020860160208601614a93565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112ec6020830184614ab7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614b6657614b66614b14565b60405290565b6040516101a0810167ffffffffffffffff81118282101715614b6657614b66614b14565b6040516080810167ffffffffffffffff81118282101715614b6657614b66614b14565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614bfa57614bfa614b14565b604052919050565b600067ffffffffffffffff821115614c1c57614c1c614b14565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611ce357600080fd5b80356149f981614c26565b600082601f830112614c6457600080fd5b81356020614c79614c7483614c02565b614bb3565b82815260059290921b84018101918181019086841115614c9857600080fd5b8286015b84811015614cbc578035614caf81614c26565b8352918301918301614c9c565b509695505050505050565b803560ff811681146149f957600080fd5b600067ffffffffffffffff821115614cf257614cf2614b14565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614d2f57600080fd5b8135614d3d614c7482614cd8565b818152846020838601011115614d5257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614d8857600080fd5b863567ffffffffffffffff80821115614da057600080fd5b614dac8a838b01614c53565b97506020890135915080821115614dc257600080fd5b614dce8a838b01614c53565b9650614ddc60408a01614cc7565b95506060890135915080821115614df257600080fd5b614dfe8a838b01614d1e565b9450614e0c60808a016149ee565b935060a0890135915080821115614e2257600080fd5b50614e2f89828a01614d1e565b9150509295509295509295565b60008060408385031215614e4f57600080fd5b8235614e5a816149d8565b9150602083013560048110614e6e57600080fd5b809150509250929050565b60008083601f840112614e8b57600080fd5b50813567ffffffffffffffff811115614ea357600080fd5b6020830191508360208260061b85010111156111ce57600080fd5b60008060008060408587031215614ed457600080fd5b843567ffffffffffffffff80821115614eec57600080fd5b614ef888838901614e79565b90965094506020870135915080821115614f1157600080fd5b50614f1e87828801614e79565b95989497509550505050565b8015158114611ce357600080fd5b80356149f981614f2a565b600082601f830112614f5457600080fd5b81356020614f64614c7483614c02565b82815260069290921b84018101918181019086841115614f8357600080fd5b8286015b84811015614cbc5760408189031215614fa05760008081fd5b614fa8614b43565b8135614fb381614c26565b81528185013585820152835291830191604001614f87565b6000614fd9614c7484614c02565b8381529050602080820190600585901b840186811115614ff857600080fd5b845b8181101561503457803567ffffffffffffffff81111561501a5760008081fd5b61502689828901614d1e565b855250928201928201614ffa565b505050509392505050565b600082601f83011261505057600080fd5b6112ec83833560208501614fcb565b60006101a0828403121561507257600080fd5b61507a614b6c565b9050615085826149ee565b815261509360208301614c48565b60208201526150a460408301614c48565b60408201526150b5606083016149ee565b6060820152608082013560808201526150d060a08301614f38565b60a08201526150e160c083016149ee565b60c08201526150f260e08301614c48565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561511f57600080fd5b61512b86838701614d1e565b8385015261014092508285013591508082111561514757600080fd5b61515386838701614f43565b8385015261016092508285013591508082111561516f57600080fd5b5061517c8582860161503f565b82840152505061018080830135818301525092915050565b600080604083850312156151a757600080fd5b823567ffffffffffffffff808211156151bf57600080fd5b6151cb8683870161505f565b935060208501359150808211156151e157600080fd5b506151ee8582860161503f565b9150509250929050565b6152028184614a4a565b6040602082015260006125776040830184614ab7565b60006020828403121561522a57600080fd5b81356112ec81614c26565b600081518084526020808501945080840160005b8381101561527b57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101615249565b509495945050505050565b6020815260006112ec6020830184615235565b6020808252825182820181905260009190848201906040850190845b818110156152e757835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016152b5565b50909695505050505050565b60008083601f84011261530557600080fd5b50813567ffffffffffffffff81111561531d57600080fd5b6020830191508360208285010111156111ce57600080fd5b60008083601f84011261534757600080fd5b50813567ffffffffffffffff81111561535f57600080fd5b6020830191508360208260051b85010111156111ce57600080fd5b60008060008060008060008060a0898b03121561539657600080fd5b883567ffffffffffffffff808211156153ae57600080fd5b6153ba8c838d01614f43565b995060208b01359150808211156153d057600080fd5b6153dc8c838d016152f3565b909950975060408b013591506153f182614c26565b90955060608a0135908082111561540757600080fd5b6154138c838d01615335565b909650945060808b013591508082111561542c57600080fd5b506154398b828c01615335565b999c989b5096995094979396929594505050565b600081518084526020808501945080840160005b8381101561527b578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101615461565b6020815260006112ec602083018461544d565b600082601f8301126154c257600080fd5b813560206154d2614c7483614c02565b82815260059290921b840181019181810190868411156154f157600080fd5b8286015b84811015614cbc57803567ffffffffffffffff8111156155155760008081fd5b6155238986838b010161503f565b8452509183019183016154f5565b600082601f83011261554257600080fd5b81356020615552614c7483614c02565b82815260059290921b8401810191818101908684111561557157600080fd5b8286015b84811015614cbc5780358352918301918301615575565b60006080828403121561559e57600080fd5b6155a6614b90565b9050813567ffffffffffffffff808211156155c057600080fd5b818401915084601f8301126155d457600080fd5b813560206155e4614c7483614c02565b82815260059290921b8401810191818101908884111561560357600080fd5b8286015b8481101561563b5780358681111561561f5760008081fd5b61562d8b86838b010161505f565b845250918301918301615607565b508652508581013593508284111561565257600080fd5b61565e878588016154b1565b9085015250604084013591508082111561567757600080fd5b5061568484828501615531565b6040830152506060820135606082015292915050565b600080604083850312156156ad57600080fd5b823567ffffffffffffffff808211156156c557600080fd5b6156d18683870161558c565b93506020915081850135818111156156e857600080fd5b85019050601f810186136156fb57600080fd5b8035615709614c7482614c02565b81815260059190911b8201830190838101908883111561572857600080fd5b928401925b828410156157465783358252928401929084019061572d565b80955050505050509250929050565b60c081016108d8828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff60608301511660608401528060808301511660808401528060a08301511660a0840152505050565b6000602082840312156157d657600080fd5b813567ffffffffffffffff8111156157ed57600080fd5b820160a081850312156112ec57600080fd5b60008060008060008060008060e0898b03121561581b57600080fd5b606089018a81111561582c57600080fd5b8998503567ffffffffffffffff8082111561584657600080fd5b6158528c838d016152f3565b909950975060808b013591508082111561586b57600080fd5b6158778c838d01615335565b909750955060a08b013591508082111561589057600080fd5b5061589d8b828c01615335565b999c989b50969995989497949560c00135949350505050565b600080602083850312156158c957600080fd5b823567ffffffffffffffff8111156158e057600080fd5b6158ec858286016152f3565b90969095509350505050565b80356fffffffffffffffffffffffffffffffff811681146149f957600080fd5b60006060828403121561592a57600080fd5b6040516060810181811067ffffffffffffffff8211171561594d5761594d614b14565b604052823561595b81614f2a565b8152615969602084016158f8565b602082015261597a604084016158f8565b60408201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156108d8576108d8615986565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680615a1257615a126159c8565b92169190910692915050565b80820281158282048414176108d8576108d8615986565b600067ffffffffffffffff80841680615a5057615a506159c8565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615abc57615abc615986565b5060010190565b600063ffffffff808316818103615adc57615adc615986565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152615b168184018a615235565b90508281036080840152615b2a8189615235565b905060ff871660a084015282810360c0840152615b478187614ab7565b905067ffffffffffffffff851660e0840152828103610100840152615b6c8185614ab7565b9c9b505050505050505050505050565b600060208284031215615b8e57600080fd5b81516112ec81614c26565b60006112ec368484614fcb565b600060208284031215615bb857600080fd5b81516112ec816149d8565b808201808211156108d8576108d8615986565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152615c11610120840182614ab7565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152615c4d8383614ab7565b925060808901519150808584030161010086015250615c6c828261544d565b92505050615c80602083018661ffff169052565b836040830152612b9f606083018473ffffffffffffffffffffffffffffffffffffffff169052565b60008060408385031215615cbb57600080fd5b8251615cc681614f2a565b602084015190925067ffffffffffffffff811115615ce357600080fd5b8301601f81018513615cf457600080fd5b8051615d02614c7482614cd8565b818152866020838501011115615d1757600080fd5b615d28826020830160208601614a93565b8093505050509250929050565b805163ffffffff811681146149f957600080fd5b600060c08284031215615d5b57600080fd5b60405160c0810181811067ffffffffffffffff82111715615d7e57615d7e614b14565b604052615d8a83615d35565b81526020830151615d9a81614c26565b60208201526040830151615dad81614c26565b6040820152606083015161ffff81168114615dc757600080fd5b6060820152615dd860808401615d35565b6080820152615de960a08401615d35565b60a08201529392505050565b6101808101615e67828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff166101208401526080840151811661014084015260a0840151166101608301526112ec565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152615f188285018b615235565b91508382036080850152615f2c828a615235565b915060ff881660a085015283820360c0850152615f498288614ab7565b90861660e08501528381036101008501529050615b6c8185614ab7565b600081518084526020808501808196508360051b8101915082860160005b85811015615fae578284038952615f9c848351614ab7565b98850198935090840190600101615f84565b5091979650505050505050565b60408152615fd660408201845167ffffffffffffffff169052565b60006020840151615fff606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c084015161010061606d8185018367ffffffffffffffff169052565b60e086015191506101206160988186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a061016081818701526160c86101e0870185614ab7565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0610180818887030181890152616107868661544d565b9550828a015194508188870301848901526161228686615f66565b9550808a01516101c089015250505050508281036020840152612b9f8185615f66565b6000815160208301517fffffffff000000000000000000000000000000000000000000000000000000008082169350600483101561618d5780818460040360031b1b83161693505b505050919050565b6040815260006161a86040830185614ab7565b8281036020840152612b9f8185614ab7565b60a0815260006161cd60a0830188614ab7565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff8516606084015282810360808401526162118185614ab7565b98975050505050505050565b60006020828403121561622f57600080fd5b81516112ec81614f2a565b600081518084526020808501945080840160005b8381101561527b5781518752958201959082019060010161624e565b60608152600061627d606083018661623a565b828103602084015261628f818661623a565b915050826040830152949350505050565b6000602082840312156162b257600080fd5b5051919050565b67ffffffffffffffff81811683821601908082111561485157614851615986565b67ffffffffffffffff83168152604081016112ec6020830184614a4a565b600067ffffffffffffffff808316818103615adc57615adc615986565b60006020828403121561632757600080fd5b813567ffffffffffffffff81111561633e57600080fd5b6125778482850161558c565b60006040828403121561635c57600080fd5b616364614b43565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461639057600080fd5b815261639e60208401615d35565b60208201529392505050565b6020815260006112ec6020830184615f66565b6000826163cc576163cc6159c8565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + Bin: "0x6101806040526014805460ff191660011790553480156200001f57600080fd5b5060405162006f4d38038062006f4d8339810160408190526200004291620008a6565b838383838033806000816200009e5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000d157620000d1816200048d565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001815760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b03161580620001a4575083516001600160a01b0316155b15620001c3576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000206573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022c9190620009bd565b6001600160401b03166001146200025657604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002cd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000538565b6101205260005b83518110156200047e576200032e848281518110620002f757620002f7620009db565b6020026020010151848381518110620003145762000314620009db565b6020026020010151600c6200059f60201b9092919060201c565b50620003e3838281518110620003485762000348620009db565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200038e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b49190620009f1565b848381518110620003c957620003c9620009db565b6020026020010151600f6200059f60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c8482815181106200041a576200041a620009db565b6020026020010151848381518110620004375762000437620009db565b6020026020010151604051620004639291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004768162000a18565b9050620002d4565b50505050505050505062000a40565b336001600160a01b03821603620004e75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000095565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200058294939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005b7846001600160a01b03851684620005bf565b949350505050565b6000620005b784846001600160a01b03851660008281526002840160205260408120829055620005b784846000620005f8838362000601565b90505b92915050565b60008181526001830160205260408120546200064a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005fb565b506000620005fb565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200068e576200068e62000653565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006bf57620006bf62000653565b604052919050565b6001600160a01b0381168114620006dd57600080fd5b50565b80516001600160401b0381168114620006f857600080fd5b919050565b60006001600160401b0382111562000719576200071962000653565b5060051b60200190565b600082601f8301126200073557600080fd5b815160206200074e6200074883620006fd565b62000694565b82815260059290921b840181019181810190868411156200076e57600080fd5b8286015b84811015620007965780516200078881620006c7565b835291830191830162000772565b509695505050505050565b600082601f830112620007b357600080fd5b81516020620007c66200074883620006fd565b82815260059290921b84018101918181019086841115620007e657600080fd5b8286015b84811015620007965780516200080081620006c7565b8352918301918301620007ea565b80516001600160801b0381168114620006f857600080fd5b6000606082840312156200083957600080fd5b604051606081016001600160401b03811182821017156200085e576200085e62000653565b8060405250809150825180151581146200087757600080fd5b815262000887602084016200080e565b60208201526200089a604084016200080e565b60408201525092915050565b600080600080848603610160811215620008bf57600080fd5b60c0811215620008ce57600080fd5b50620008d962000669565b8551620008e681620006c7565b8152620008f660208701620006e0565b60208201526200090960408701620006e0565b604082015260608601516200091e81620006c7565b606082015260808601516200093381620006c7565b608082015260a08601516200094881620006c7565b60a082015260c08601519094506001600160401b03808211156200096b57600080fd5b620009798883890162000723565b945060e08701519150808211156200099057600080fd5b506200099f87828801620007a1565b925050620009b286610100870162000826565b905092959194509250565b600060208284031215620009d057600080fd5b620005f882620006e0565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000a0457600080fd5b815162000a1181620006c7565b9392505050565b60006001820162000a3957634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e0516101005161012051610140516101605161641b62000b3260003960008181610381015281816123360152612bac01526000818161034501528181611835015281816118b70152818161230f0152818161312201526131a901526000612d65015260008181610309015281816122e501526135db0152600081816102a90152818161229301526135ba0152600081816102d9015281816122bd015281816128f0015281816135990152613f2c01526000818161026d015281816122650152612e5a01526000818161157e015281816115ca0152818161197801526119c4015261641b6000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80637437ff9f1161012a578063b4069b31116100bd578063d3c7c2c71161008c578063f2fde38b11610071578063f2fde38b14610820578063f52121a514610833578063f8ccbf471461084657600080fd5b8063d3c7c2c714610805578063d7e2bb501461080d57600080fd5b8063b4069b31146107c4578063b5767166146107d7578063c5a1d7f0146107ea578063c92b2832146107f257600080fd5b8063856c8247116100f9578063856c8247146107475780638da5cb5b14610773578063afcb95d714610791578063b1dc65a4146107b157600080fd5b80637437ff9f1461060a57806379ba50971461070157806381ff70481461070957806385572ffb1461073957600080fd5b8063546719cd116101bd578063681fba161161018c5780636c6bd845116101715780636c6bd845146105d1578063704b6c02146105e4578063740f4150146105f757600080fd5b8063681fba161461059c578063693928ae146105b157600080fd5b8063546719cd146104d1578063599f6431146105355780635d86f14114610574578063666cab8d1461058757600080fd5b80632dea00f3116101f95780632dea00f3146104525780633a87ac53146104655780634f9f03fe14610478578063506449721461049957600080fd5b806306285c691461022b578063142a98fc146103d4578063181f5a77146103f45780631ef381741461043d575b600080fd5b6103be6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516103cb919061496c565b60405180910390f35b6103e76103e2366004614a03565b610863565b6040516103cb9190614a8a565b6104306040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e322e3000000000000000000000000081525081565b6040516103cb9190614b06565b61045061044b366004614d74565b6108de565b005b610450610460366004614e41565b610d9d565b610450610473366004614ec3565b610dab565b61048b610486366004615199565b6111bb565b6040516103cb9291906151fd565b6104c36104a7366004614a03565b67ffffffffffffffff1660009081526013602052604090205490565b6040519081526020016103cb565b6104d96111d5565b6040516103cb919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103cb565b61054f61058236600461521d565b61128a565b61058f6112f3565b6040516103cb919061528b565b6105a4611362565b6040516103cb919061529e565b6105c46105bf36600461537f565b61141b565b6040516103cb91906154a3565b6104506105df36600461569f565b611481565b6104506105f236600461521d565b61148b565b61045061060536600461569f565b61157b565b6106f46040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c081018252600a5463ffffffff808216835273ffffffffffffffffffffffffffffffffffffffff64010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000008104831660808301527a010000000000000000000000000000000000000000000000000000900490911660a082015290565b6040516103cb919061575a565b6104506116fd565b6007546005546040805163ffffffff808516825264010000000090940490931660208401528201526060016103cb565b6104506102263660046157c9565b61075a61075536600461521d565b6117fa565b60405167ffffffffffffffff90911681526020016103cb565b60005473ffffffffffffffffffffffffffffffffffffffff1661054f565b6040805160018152600060208201819052918101919091526060016103cb565b6104506107bf366004615804565b611922565b61054f6107d236600461521d565b611bb3565b6104506107e53660046158bb565b611c2c565b6104c3611c36565b61045061080036600461591d565b611c61565b6105a4611ce6565b61054f61081b36600461521d565b611d9b565b61045061082e36600461521d565b611daa565b610450610841366004615199565b611dbb565b6014546108539060ff1681565b60405190151581526020016103cb565b6000610871600160046159ba565b600261087e6080856159fc565b67ffffffffffffffff166108929190615a23565b601360006108a1608087615a3a565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156108d8576108d8614a20565b92915050565b84518460ff16601f821115610954576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b806000036109be576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f7369746976650000000000000000000000000000604482015260640161094b565b6109c6612016565b6109cf85612099565b60095460005b81811015610a5b5760086000600983815481106109f4576109f4615a61565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055610a5481615a90565b90506109d5565b50875160005b81811015610c575760008a8281518110610a7d57610a7d615a61565b6020026020010151905060006002811115610a9a57610a9a614a20565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040902054610100900460ff166002811115610ad957610ad9614a20565b14610b40576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d6974746572206164647265737300000000604482015260640161094b565b73ffffffffffffffffffffffffffffffffffffffff8116610b8d576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610c3d57610c3d614a20565b02179055509050505080610c5090615a90565b9050610a61565b508851610c6b9060099060208c01906148d6565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610cf1914691309190600090610cc39063ffffffff16615ac8565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d61239a565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610d8899989796959493929190615aeb565b60405180910390a15050505050505050505050565b610da78282612445565b5050565b610db3612016565b60005b83811015610fb2576000858583818110610dd257610dd2615a61565b610de8926020604090920201908101915061521d565b90506000868684818110610dfe57610dfe615a61565b9050604002016020016020810190610e16919061521d565b9050610e23600c836124ef565b610e59576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610e7b600c84612511565b73ffffffffffffffffffffffffffffffffffffffff1614610ec8576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ed3600c83612533565b50610f4e8173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f469190615b81565b600f90612533565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610fab90615a90565b9050610db6565b5060005b818110156111b4576000838383818110610fd257610fd2615a61565b610fe8926020604090920201908101915061521d565b90506000848484818110610ffe57610ffe615a61565b9050604002016020016020810190611016919061521d565b905073ffffffffffffffffffffffffffffffffffffffff8216158061104f575073ffffffffffffffffffffffffffffffffffffffff8116155b15611086576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611091600c836124ef565b156110c8576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d4600c8383612555565b506111508173ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611123573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111479190615b81565b600f9083612555565b506040805173ffffffffffffffffffffffffffffffffffffffff8085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a15050806111ad90615a90565b9050610fb6565b5050505050565b600060606111c98484612580565b915091505b9250929050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff16151593830193909352600454808416606084015204909116608082015261128590612723565b905090565b60008080611299600c856127d5565b91509150816112ec576040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161094b565b9392505050565b6060600980548060200260200160405190810160405280929190818152602001828054801561135857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161132d575b5050505050905090565b606061136e600f6127f8565b67ffffffffffffffff81111561138657611386614b19565b6040519080825280602002602001820160405280156113af578160200160208202803683370190505b50905060005b81518110156114175760006113cb600f83612803565b509050808383815181106113e1576113e1615a61565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101525061141081615a90565b90506113b5565b5090565b60606114748989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925061146591508990508a615b9e565b61146f8789615b9e565b61281f565b9998505050505050505050565b610da78282612baa565b60005473ffffffffffffffffffffffffffffffffffffffff1633148015906114cb575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611502576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f000000000000000000000000000000000000000000000000000000000000000014611606576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff4616602482015260440161094b565b81515181518114611643576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156116ed57600083828151811061166257611662615a61565b602002602001015190508060001415801561169b5750845180518390811061168c5761168c615a61565b60200260200101516080015181105b156116dc576040517f085e39cf000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161094b565b506116e681615a90565b9050611646565b506116f88383612baa565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461177e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161094b565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526012602052604081205467ffffffffffffffff168015801561186d57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b156108d8576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156118fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ec9190615bab565b61192c8787613571565b600554883590808214611975576040517f93df584c000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161094b565b467f0000000000000000000000000000000000000000000000000000000000000000146119f6576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161094b565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115611a7e57611a7e614a20565b6002811115611a8f57611a8f614a20565b9052509050600281602001516002811115611aac57611aac614a20565b148015611af357506009816000015160ff1681548110611ace57611ace615a61565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611b29576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611b37856020615a23565b611b42886020615a23565b611b4e8b610144615bc8565b611b589190615bc8565b611b629190615bc8565b9050368114611ba6576040517f8e1192e10000000000000000000000000000000000000000000000000000000081526004810182905236602482015260440161094b565b5050505050505050505050565b6000611bbe8261128a565b73ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c08573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d89190615b81565b610da78282613571565b60006112857f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3613594565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590611ca1575060025473ffffffffffffffffffffffffffffffffffffffff163314155b15611cd8576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ce3600382613661565b50565b6060611cf2600c6127f8565b67ffffffffffffffff811115611d0a57611d0a614b19565b604051908082528060200260200182016040528015611d33578160200160208202803683370190505b50905060005b8151811015611417576000611d4f600c83612803565b50905080838381518110611d6557611d65615a61565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015250611d9481615a90565b9050611d39565b60008080611299600f856127d5565b611db2612016565b611ce381613846565b333014611df4576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611e31565b6040805180820190915260008082526020820152815260200190600190039081611e0a5790505b506101408401515190915015611e9e57611e9b8361014001518460200151604051602001611e7b919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60405160208183030381529060405285604001518661016001518661281f565b90505b604083015173ffffffffffffffffffffffffffffffffffffffff163b1580611f0857506040830151611f069073ffffffffffffffffffffffffffffffffffffffff167f85572ffb0000000000000000000000000000000000000000000000000000000061393b565b155b15611f1257505050565b600a546000908190640100000000900473ffffffffffffffffffffffffffffffffffffffff16633cf97983611f478786613957565b611388886080015189604001516040518563ffffffff1660e01b8152600401611f739493929190615bdb565b6000604051808303816000875af1158015611f92573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611fd89190810190615cad565b5091509150816111b457806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161094b9190614b06565b60005473ffffffffffffffffffffffffffffffffffffffff163314612097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161094b565b565b6000818060200190518101906120af9190615d57565b602081015190915073ffffffffffffffffffffffffffffffffffffffff16612103576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b015160a0808d01518c167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff92909c1676010000000000000000000000000000000000000000000002919091167fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90941674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909616978a169790971794909417919091169490941797909717909155825160c0810184527f00000000000000000000000000000000000000000000000000000000000000008516815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116968201969096527f0000000000000000000000000000000000000000000000000000000000000000909516858401527f00000000000000000000000000000000000000000000000000000000000000008416958501959095527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000009091169282019290925290517fe668e1a4644c1a030b909bbfd837f5cfa914994ed5e0bb2e9c34a5c37753128a9161238e918490615e03565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a6040516020016123be99989796959493929190615edf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b600060026124546080856159fc565b67ffffffffffffffff166124689190615a23565b9050600060138161247a608087615a3a565b67ffffffffffffffff1681526020810191909152604001600020549050816124a4600160046159ba565b901b1916818360038111156124bb576124bb614a20565b901b1780601360006124ce608088615a3a565b67ffffffffffffffff16815260208101919091526040016000205550505050565b60006112ec8373ffffffffffffffffffffffffffffffffffffffff8416613a07565b60006112ec8373ffffffffffffffffffffffffffffffffffffffff8416613a13565b60006112ec8373ffffffffffffffffffffffffffffffffffffffff8416613a1f565b60006125788473ffffffffffffffffffffffffffffffffffffffff851684613a2b565b949350505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a5906125c49087908790600401615fc9565b600060405180830381600087803b1580156125de57600080fd5b505af19250505080156125ef575060015b612708573d80801561261d576040519150601f19603f3d011682016040523d82523d6000602084013e612622565b606091505b5061262c81616153565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c0000000000000000000000000000000000000000000000000000000014806126c4575061267f81616153565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b156126d4576003925090506111ce565b806040517fcf19edfd00000000000000000000000000000000000000000000000000000000815260040161094b9190614b06565b50506040805160208101909152600081526002909250929050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526127b182606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261279591906159ba565b85608001516fffffffffffffffffffffffffffffffff16613a4e565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6000806111c98473ffffffffffffffffffffffffffffffffffffffff8516613a6d565b60006108d882613a7c565b60008080806128128686613a87565b9097909650945050505050565b60606000865167ffffffffffffffff81111561283d5761283d614b19565b60405190808252806020026020018201604052801561288257816020015b604080518082019091526000808252602082015281526020019060019003908161285b5790505b50905060005b8751811015612b795760006128b98983815181106128a8576128a8615a61565b60200260200101516000015161128a565b905060008983815181106128cf576128cf615a61565b6020026020010151602001519050600080612a44638627fad660e01b8c8c867f00000000000000000000000000000000000000000000000000000000000000008e8b8151811061292157612921615a61565b60200260200101518e8c8151811061293b5761293b615a61565b60200260200101516040516020016129549291906161a3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261299395949392916024016161c8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600b54869063ffffffff7a010000000000000000000000000000000000000000000000000000909104166113886084613a96565b509150915081612a8257806040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161094b9190614b06565b8373ffffffffffffffffffffffffffffffffffffffff166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af19190615b81565b868681518110612b0357612b03615a61565b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082868681518110612b5457612b54615a61565b602002602001015160200181815250505050505080612b7290615a90565b9050612888565b50600b54612b9e90829073ffffffffffffffffffffffffffffffffffffffff16613bbc565b90505b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c39919061622b565b15612c70576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003612cad576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114612ceb576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115612d0657612d06614b19565b604051908082528060200260200182016040528015612d2f578160200160208202803683370190505b50905060005b82811015612e0f57600085600001518281518110612d5557612d55615a61565b60200260200101519050612d89817f0000000000000000000000000000000000000000000000000000000000000000613da4565b838381518110612d9b57612d9b615a61565b602002602001018181525050806101800151838381518110612dbf57612dbf615a61565b602002602001015114612dfe576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612e0881615a90565b9050612d35565b50604080850151606086015191517f3204887500000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692633204887592612e9092879291600401616278565b602060405180830381865afa158015612ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed191906162ae565b905080600003612f0d576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b8481101561356857600087600001518281518110612f3457612f34615a61565b602002602001015190506000612f4d8260600151610863565b90506000816003811115612f6357612f63614a20565b1480612f8057506003816003811115612f7e57612f7e614a20565b145b612fc85760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161094b565b831561308557600a5460009063ffffffff16612fe487426159ba565b11905080806130045750600382600381111561300257613002614a20565b145b61303a576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061304c5761304c615a61565b602002602001015160001461307f5788848151811061306d5761306d615a61565b60200260200101518360800181815250505b506130e2565b600081600381111561309957613099614a20565b146130e25760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161094b565b60208083015173ffffffffffffffffffffffffffffffffffffffff1660009081526012909152604090205467ffffffffffffffff168015801561315a57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b156132fd5760208301516040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156131f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132169190615bab565b60c084015190915067ffffffffffffffff166132338260016162c7565b67ffffffffffffffff16146132a057826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050613558565b60208381015173ffffffffffffffffffffffffffffffffffffffff16600090815260129091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600082600381111561331157613311614a20565b0361339d5760c083015167ffffffffffffffff166133308260016162c7565b67ffffffffffffffff161461339d57826020015173ffffffffffffffffffffffffffffffffffffffff168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050613558565b60008a6020015185815181106133b5576133b5615a61565b602002602001015190506133e18460600151856000015186610140015151876101200151518551613f2a565b6133f084606001516001612445565b6000806133fd8684612580565b9150915061340f866060015183612445565b600382600381111561342357613423614a20565b141580156134435750600282600381111561344057613440614a20565b14155b15613482578560600151826040517f9e26160300000000000000000000000000000000000000000000000000000000815260040161094b9291906162e8565b600085600381111561349657613496614a20565b036135035760208087015173ffffffffffffffffffffffffffffffffffffffff166000908152601290915260408120805467ffffffffffffffff16916134db83616306565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef6584846040516135499291906151fd565b60405180910390a35050505050505b61356181615a90565b9050612f14565b50505050505050565b610da761358082840184616323565b604080516000815260208101909152612baa565b6000817f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000604051602001613644949392919093845267ffffffffffffffff92831660208501529116604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b604051602081830303815290604052805190602001209050919050565b815460009061368a90700100000000000000000000000000000000900463ffffffff16426159ba565b9050801561372c57600183015483546136d2916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613a4e565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354613752916fffffffffffffffffffffffffffffffff90811691166140d4565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906138399084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036138c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161094b565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000613946836140ea565b80156112ec57506112ec838361414e565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff16815260200184602001516040516020016139dc919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006112ec838361421d565b60006112ec8383614229565b60006112ec83836142b3565b6000612578848473ffffffffffffffffffffffffffffffffffffffff85166142d0565b6000612ba185613a5e8486615a23565b613a689087615bc8565b6140d4565b600080808061281286866142ed565b60006108d882614327565b60008080806128128686614332565b6000606060008361ffff1667ffffffffffffffff811115613ab957613ab9614b19565b6040519080825280601f01601f191660200182016040528015613ae3576020820181803683370190505b509150863b613b16577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613b49577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613b82577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613ba55750835b808352806000602085013e50955095509592505050565b81516000805b82811015613d905760008473ffffffffffffffffffffffffffffffffffffffff1663d02641a0878481518110613bfa57613bfa615a61565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015613c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c929190616358565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613d2457858281518110613ccd57613ccd615a61565b6020908102919091010151516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161094b565b613d72868381518110613d3957613d39615a61565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661435d90919063ffffffff16565b613d7c9084615bc8565b92505080613d8990615a90565b9050613bc2565b50613d9e600382600061439a565b50505050565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001613e4798979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001613e8091906154a3565b60405160208183030381529060405280519060200120876101600151604051602001613eac91906163b8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614613fa3576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8516600482015260240161094b565b600b5474010000000000000000000000000000000000000000900461ffff16831115614007576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015260240161094b565b80831461404c576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015260240161094b565b600b54760100000000000000000000000000000000000000000000900463ffffffff168211156111b457600b546040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090910463ffffffff1660048201526024810183905260440161094b565b60008183106140e357816112ec565b5090919050565b6000614116827f01ffc9a70000000000000000000000000000000000000000000000000000000061414e565b80156108d85750614147827fffffffff0000000000000000000000000000000000000000000000000000000061414e565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015614206575060208210155b80156142125750600081115b979650505050505050565b60006112ec838361471d565b60008181526002830160205260408120548015158061424d575061424d848461421d565b6112ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161094b565b600081815260028301602052604081208190556112ec8383614735565b600082815260028401602052604081208290556125788484614741565b600081815260028301602052604081205481908061431c5761430f858561421d565b9250600091506111ce9050565b6001925090506111ce565b60006108d88261474d565b600080806143408585614757565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a7640000614390837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615a23565b6112ec91906163cb565b825474010000000000000000000000000000000000000000900460ff1615806143c1575081155b156143cb57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061441190700100000000000000000000000000000000900463ffffffff16426159ba565b905080156144d15781831115614453576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600186015461448d9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613a4e565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156145885773ffffffffffffffffffffffffffffffffffffffff8416614530576040517ff94ebcd1000000000000000000000000000000000000000000000000000000008152600481018390526024810186905260440161094b565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff8516604482015260640161094b565b8483101561469b5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906145cc90826159ba565b6145d6878a6159ba565b6145e09190615bc8565b6145ea91906163cb565b905073ffffffffffffffffffffffffffffffffffffffff8616614643576040517f15279c08000000000000000000000000000000000000000000000000000000008152600481018290526024810186905260440161094b565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff8716604482015260640161094b565b6146a585846159ba565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081815260018301602052604081205415156112ec565b60006112ec8383614763565b60006112ec838361485d565b60006108d8825490565b60006112ec83836148ac565b6000818152600183016020526040812054801561484c5760006147876001836159ba565b855490915060009061479b906001906159ba565b90508181146148005760008660000182815481106147bb576147bb615a61565b90600052602060002001549050808760000184815481106147de576147de615a61565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614811576148116163df565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108d8565b60009150506108d8565b5092915050565b60008181526001830160205260408120546148a4575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108d8565b5060006108d8565b60008260000182815481106148c3576148c3615a61565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215614950579160200282015b8281111561495057825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906148f6565b506114179291505b808211156114175760008155600101614958565b60c081016108d8828473ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114611ce357600080fd5b80356149fe816149dd565b919050565b600060208284031215614a1557600080fd5b81356112ec816149dd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110614a86577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b602081016108d88284614a4f565b60005b83811015614ab3578181015183820152602001614a9b565b50506000910152565b60008151808452614ad4816020860160208601614a98565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112ec6020830184614abc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614b6b57614b6b614b19565b60405290565b6040516101a0810167ffffffffffffffff81118282101715614b6b57614b6b614b19565b6040516080810167ffffffffffffffff81118282101715614b6b57614b6b614b19565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614bff57614bff614b19565b604052919050565b600067ffffffffffffffff821115614c2157614c21614b19565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611ce357600080fd5b80356149fe81614c2b565b600082601f830112614c6957600080fd5b81356020614c7e614c7983614c07565b614bb8565b82815260059290921b84018101918181019086841115614c9d57600080fd5b8286015b84811015614cc1578035614cb481614c2b565b8352918301918301614ca1565b509695505050505050565b803560ff811681146149fe57600080fd5b600067ffffffffffffffff821115614cf757614cf7614b19565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112614d3457600080fd5b8135614d42614c7982614cdd565b818152846020838601011115614d5757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614d8d57600080fd5b863567ffffffffffffffff80821115614da557600080fd5b614db18a838b01614c58565b97506020890135915080821115614dc757600080fd5b614dd38a838b01614c58565b9650614de160408a01614ccc565b95506060890135915080821115614df757600080fd5b614e038a838b01614d23565b9450614e1160808a016149f3565b935060a0890135915080821115614e2757600080fd5b50614e3489828a01614d23565b9150509295509295509295565b60008060408385031215614e5457600080fd5b8235614e5f816149dd565b9150602083013560048110614e7357600080fd5b809150509250929050565b60008083601f840112614e9057600080fd5b50813567ffffffffffffffff811115614ea857600080fd5b6020830191508360208260061b85010111156111ce57600080fd5b60008060008060408587031215614ed957600080fd5b843567ffffffffffffffff80821115614ef157600080fd5b614efd88838901614e7e565b90965094506020870135915080821115614f1657600080fd5b50614f2387828801614e7e565b95989497509550505050565b8015158114611ce357600080fd5b80356149fe81614f2f565b600082601f830112614f5957600080fd5b81356020614f69614c7983614c07565b82815260069290921b84018101918181019086841115614f8857600080fd5b8286015b84811015614cc15760408189031215614fa55760008081fd5b614fad614b48565b8135614fb881614c2b565b81528185013585820152835291830191604001614f8c565b6000614fde614c7984614c07565b8381529050602080820190600585901b840186811115614ffd57600080fd5b845b8181101561503957803567ffffffffffffffff81111561501f5760008081fd5b61502b89828901614d23565b855250928201928201614fff565b505050509392505050565b600082601f83011261505557600080fd5b6112ec83833560208501614fd0565b60006101a0828403121561507757600080fd5b61507f614b71565b905061508a826149f3565b815261509860208301614c4d565b60208201526150a960408301614c4d565b60408201526150ba606083016149f3565b6060820152608082013560808201526150d560a08301614f3d565b60a08201526150e660c083016149f3565b60c08201526150f760e08301614c4d565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561512457600080fd5b61513086838701614d23565b8385015261014092508285013591508082111561514c57600080fd5b61515886838701614f48565b8385015261016092508285013591508082111561517457600080fd5b5061518185828601615044565b82840152505061018080830135818301525092915050565b600080604083850312156151ac57600080fd5b823567ffffffffffffffff808211156151c457600080fd5b6151d086838701615064565b935060208501359150808211156151e657600080fd5b506151f385828601615044565b9150509250929050565b6152078184614a4f565b6040602082015260006125786040830184614abc565b60006020828403121561522f57600080fd5b81356112ec81614c2b565b600081518084526020808501945080840160005b8381101561528057815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161524e565b509495945050505050565b6020815260006112ec602083018461523a565b6020808252825182820181905260009190848201906040850190845b818110156152ec57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016152ba565b50909695505050505050565b60008083601f84011261530a57600080fd5b50813567ffffffffffffffff81111561532257600080fd5b6020830191508360208285010111156111ce57600080fd5b60008083601f84011261534c57600080fd5b50813567ffffffffffffffff81111561536457600080fd5b6020830191508360208260051b85010111156111ce57600080fd5b60008060008060008060008060a0898b03121561539b57600080fd5b883567ffffffffffffffff808211156153b357600080fd5b6153bf8c838d01614f48565b995060208b01359150808211156153d557600080fd5b6153e18c838d016152f8565b909950975060408b013591506153f682614c2b565b90955060608a0135908082111561540c57600080fd5b6154188c838d0161533a565b909650945060808b013591508082111561543157600080fd5b5061543e8b828c0161533a565b999c989b5096995094979396929594505050565b600081518084526020808501945080840160005b83811015615280578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101615466565b6020815260006112ec6020830184615452565b600082601f8301126154c757600080fd5b813560206154d7614c7983614c07565b82815260059290921b840181019181810190868411156154f657600080fd5b8286015b84811015614cc157803567ffffffffffffffff81111561551a5760008081fd5b6155288986838b0101615044565b8452509183019183016154fa565b600082601f83011261554757600080fd5b81356020615557614c7983614c07565b82815260059290921b8401810191818101908684111561557657600080fd5b8286015b84811015614cc1578035835291830191830161557a565b6000608082840312156155a357600080fd5b6155ab614b95565b9050813567ffffffffffffffff808211156155c557600080fd5b818401915084601f8301126155d957600080fd5b813560206155e9614c7983614c07565b82815260059290921b8401810191818101908884111561560857600080fd5b8286015b84811015615640578035868111156156245760008081fd5b6156328b86838b0101615064565b84525091830191830161560c565b508652508581013593508284111561565757600080fd5b615663878588016154b6565b9085015250604084013591508082111561567c57600080fd5b5061568984828501615536565b6040830152506060820135606082015292915050565b600080604083850312156156b257600080fd5b823567ffffffffffffffff808211156156ca57600080fd5b6156d686838701615591565b93506020915081850135818111156156ed57600080fd5b85019050601f8101861361570057600080fd5b803561570e614c7982614c07565b81815260059190911b8201830190838101908883111561572d57600080fd5b928401925b8284101561574b57833582529284019290840190615732565b80955050505050509250929050565b60c081016108d8828463ffffffff808251168352602082015173ffffffffffffffffffffffffffffffffffffffff8082166020860152806040850151166040860152505061ffff60608301511660608401528060808301511660808401528060a08301511660a0840152505050565b6000602082840312156157db57600080fd5b813567ffffffffffffffff8111156157f257600080fd5b820160a081850312156112ec57600080fd5b60008060008060008060008060e0898b03121561582057600080fd5b606089018a81111561583157600080fd5b8998503567ffffffffffffffff8082111561584b57600080fd5b6158578c838d016152f8565b909950975060808b013591508082111561587057600080fd5b61587c8c838d0161533a565b909750955060a08b013591508082111561589557600080fd5b506158a28b828c0161533a565b999c989b50969995989497949560c00135949350505050565b600080602083850312156158ce57600080fd5b823567ffffffffffffffff8111156158e557600080fd5b6158f1858286016152f8565b90969095509350505050565b80356fffffffffffffffffffffffffffffffff811681146149fe57600080fd5b60006060828403121561592f57600080fd5b6040516060810181811067ffffffffffffffff8211171561595257615952614b19565b604052823561596081614f2f565b815261596e602084016158fd565b602082015261597f604084016158fd565b60408201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156108d8576108d861598b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680615a1757615a176159cd565b92169190910692915050565b80820281158282048414176108d8576108d861598b565b600067ffffffffffffffff80841680615a5557615a556159cd565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615ac157615ac161598b565b5060010190565b600063ffffffff808316818103615ae157615ae161598b565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152615b1b8184018a61523a565b90508281036080840152615b2f818961523a565b905060ff871660a084015282810360c0840152615b4c8187614abc565b905067ffffffffffffffff851660e0840152828103610100840152615b718185614abc565b9c9b505050505050505050505050565b600060208284031215615b9357600080fd5b81516112ec81614c2b565b60006112ec368484614fd0565b600060208284031215615bbd57600080fd5b81516112ec816149dd565b808201808211156108d8576108d861598b565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152615c16610120840182614abc565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152615c528383614abc565b925060808901519150808584030161010086015250615c718282615452565b92505050615c85602083018661ffff169052565b836040830152612ba1606083018473ffffffffffffffffffffffffffffffffffffffff169052565b600080600060608486031215615cc257600080fd5b8351615ccd81614f2f565b602085015190935067ffffffffffffffff811115615cea57600080fd5b8401601f81018613615cfb57600080fd5b8051615d09614c7982614cdd565b818152876020838501011115615d1e57600080fd5b615d2f826020830160208601614a98565b809450505050604084015190509250925092565b805163ffffffff811681146149fe57600080fd5b600060c08284031215615d6957600080fd5b60405160c0810181811067ffffffffffffffff82111715615d8c57615d8c614b19565b604052615d9883615d43565b81526020830151615da881614c2b565b60208201526040830151615dbb81614c2b565b6040820152606083015161ffff81168114615dd557600080fd5b6060820152615de660808401615d43565b6080820152615df760a08401615d43565b60a08201529392505050565b6101808101615e75828573ffffffffffffffffffffffffffffffffffffffff808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c0840152602084015173ffffffffffffffffffffffffffffffffffffffff90811660e0850152604085015116610100840152606084015161ffff166101208401526080840151811661014084015260a0840151166101608301526112ec565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152615f268285018b61523a565b91508382036080850152615f3a828a61523a565b915060ff881660a085015283820360c0850152615f578288614abc565b90861660e08501528381036101008501529050615b718185614abc565b600081518084526020808501808196508360051b8101915082860160005b85811015615fbc578284038952615faa848351614abc565b98850198935090840190600101615f92565b5091979650505050505050565b60408152615fe460408201845167ffffffffffffffff169052565b6000602084015161600d606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c084015161010061607b8185018367ffffffffffffffff169052565b60e086015191506101206160a68186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a061016081818701526160d66101e0870185614abc565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526161158686615452565b9550828a015194508188870301848901526161308686615f74565b9550808a01516101c089015250505050508281036020840152612ba18185615f74565b6000815160208301517fffffffff000000000000000000000000000000000000000000000000000000008082169350600483101561619b5780818460040360031b1b83161693505b505050919050565b6040815260006161b66040830185614abc565b8281036020840152612ba18185614abc565b60a0815260006161db60a0830188614abc565b73ffffffffffffffffffffffffffffffffffffffff8716602084015285604084015267ffffffffffffffff85166060840152828103608084015261621f8185614abc565b98975050505050505050565b60006020828403121561623d57600080fd5b81516112ec81614f2f565b600081518084526020808501945080840160005b838110156152805781518752958201959082019060010161625c565b60608152600061628b6060830186616248565b828103602084015261629d8186616248565b915050826040830152949350505050565b6000602082840312156162c057600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156148565761485661598b565b67ffffffffffffffff83168152604081016112ec6020830184614a4f565b600067ffffffffffffffff808316818103615ae157615ae161598b565b60006020828403121561633557600080fd5b813567ffffffffffffffff81111561634c57600080fd5b61257884828501615591565b60006040828403121561636a57600080fd5b616372614b48565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461639e57600080fd5b81526163ac60208401615d43565b60208201529392505050565b6020815260006112ec6020830184615f74565b6000826163da576163da6159cd565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var EVM2EVMOffRampHelperABI = EVM2EVMOffRampHelperMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/router/router.go b/core/gethwrappers/ccip/generated/router/router.go index 548e3275dc..f46931661e 100644 --- a/core/gethwrappers/ccip/generated/router/router.go +++ b/core/gethwrappers/ccip/generated/router/router.go @@ -62,8 +62,8 @@ type RouterOnRamp struct { } var RouterMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedNative\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMsgValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"InvalidRecipientAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyOffRamp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"UnsupportedDestinationChain\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"calldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"name\":\"OnRampSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_RET_BYTES\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OnRamp[]\",\"name\":\"onRampUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"offRampRemoves\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"offRampAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyRampUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getArmProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOffRamps\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getOnRamp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWrappedNative\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"isChainSupported\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"isOffRamp\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"recoverTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"routeMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"retData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedNative\",\"type\":\"address\"}],\"name\":\"setWrappedNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162002d7238038062002d728339810160408190526200003491620001af565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000e7565b5050600280546001600160a01b0319166001600160a01b039485161790555016608052620001e7565b336001600160a01b03821603620001415760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0381168114620001aa57600080fd5b919050565b60008060408385031215620001c357600080fd5b620001ce8362000192565b9150620001de6020840162000192565b90509250929050565b608051612b6162000211600039600081816101f8015281816105de0152610aec0152612b616000f3fe6080604052600436106101295760003560e01c80638da5cb5b116100a5578063a8d87a3b11610074578063e861e90711610059578063e861e90714610408578063f2fde38b14610433578063fbca3b741461045357600080fd5b8063a8d87a3b1461039b578063da5fcac8146103e857600080fd5b80638da5cb5b146102ec57806396f4e9f914610317578063a40e69c71461032a578063a48a90581461034c57600080fd5b806352cb60ca116100fc578063787350e3116100e1578063787350e31461027f57806379ba5097146102a757806383826b2b146102bc57600080fd5b806352cb60ca1461023d5780635f3e849f1461025f57600080fd5b8063181f5a771461012e57806320487ded1461018d5780633cf97983146101bb5780635246492f146101e9575b600080fd5b34801561013a57600080fd5b506101776040518060400160405280600c81526020017f526f7574657220312e322e30000000000000000000000000000000000000000081525081565b6040516101849190611f5e565b60405180910390f35b34801561019957600080fd5b506101ad6101a83660046121cf565b610480565b604051908152602001610184565b3480156101c757600080fd5b506101db6101d63660046122cc565b6105d8565b604051610184929190612344565b3480156101f557600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b34801561024957600080fd5b5061025d61025836600461235f565b610830565b005b34801561026b57600080fd5b5061025d61027a36600461237c565b61087f565b34801561028b57600080fd5b50610294608481565b60405161ffff9091168152602001610184565b3480156102b357600080fd5b5061025d6109cd565b3480156102c857600080fd5b506102dc6102d73660046123bd565b610aca565b6040519015158152602001610184565b3480156102f857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610218565b6101ad6103253660046121cf565b610ae8565b34801561033657600080fd5b5061033f611089565b60405161018491906123f4565b34801561035857600080fd5b506102dc610367366004612463565b67ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b3480156103a757600080fd5b506102186103b6366004612463565b67ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b3480156103f457600080fd5b5061025d6104033660046124ca565b611196565b34801561041457600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610218565b34801561043f57600080fd5b5061025d61044e36600461235f565b6114b5565b34801561045f57600080fd5b5061047361046e366004612463565b6114c9565b6040516101849190612564565b606081015160009073ffffffffffffffffffffffffffffffffffffffff166104c15760025473ffffffffffffffffffffffffffffffffffffffff1660608301525b67ffffffffffffffff831660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610539576040517fae236d9c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024015b60405180910390fd5b6040517f20487ded00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906320487ded9061058d908790879060040161269b565b602060405180830381865afa1580156105aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ce91906126be565b9150505b92915050565b600060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066b91906126d7565b156106a2576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106bb6106b56040880160208901612463565b33610aca565b6106f1576040517fd2316ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006385572ffb60e01b8760405160240161070c9190612806565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061079981858760848a6115e9565b90935091507f9b877de93ea9895756e337442c657f95a34fc68e7eb988bdfa693d5be83016b687356107d160408a0160208b01612463565b8351602085012060405161081e939291339193845267ffffffffffffffff92909216602084015273ffffffffffffffffffffffffffffffffffffffff166040830152606082015260800190565b60405180910390a15094509492505050565b61083861170c565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61088761170c565b73ffffffffffffffffffffffffffffffffffffffff82166108ec576040517f26a78f8f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610530565b73ffffffffffffffffffffffffffffffffffffffff83166109a75760008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610961576040519150601f19603f3d011682016040523d82523d6000602084013e610966565b606091505b50509050806109a1576040517fe417b80b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6109c873ffffffffffffffffffffffffffffffffffffffff8416838361178f565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610530565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000610ae1610ad98484611863565b6004906118a7565b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7991906126d7565b15610bb0576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff831660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610c23576040517fae236d9c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610530565b606083015160009073ffffffffffffffffffffffffffffffffffffffff16610db55760025473ffffffffffffffffffffffffffffffffffffffff90811660608601526040517f20487ded000000000000000000000000000000000000000000000000000000008152908316906320487ded90610ca5908890889060040161269b565b602060405180830381865afa158015610cc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce691906126be565b905080341015610d22576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b349050836060015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d7157600080fd5b505af1158015610d85573d6000803e3d6000fd5b505050506060850151610db0915073ffffffffffffffffffffffffffffffffffffffff16838361178f565b610eac565b3415610ded576040517f1841b4e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f20487ded00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906320487ded90610e41908890889060040161269b565b602060405180830381865afa158015610e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8291906126be565b6060850151909150610eac9073ffffffffffffffffffffffffffffffffffffffff163384846118bf565b60005b846040015151811015610fe457600085604001518281518110610ed457610ed4612912565b6020908102919091010151516040517f48a98aa400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015273ffffffffffffffffffffffffffffffffffffffff8083166024830152919250610fd3913391908716906348a98aa490604401602060405180830381865afa158015610f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8a9190612941565b88604001518581518110610fa057610fa0612912565b6020026020010151602001518473ffffffffffffffffffffffffffffffffffffffff166118bf909392919063ffffffff16565b50610fdd8161298d565b9050610eaf565b506040517fdf0aa9e900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063df0aa9e99061103d9088908890869033906004016129c5565b6020604051808303816000875af115801561105c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108091906126be565b95945050505050565b60606000611097600461191d565b90506000815167ffffffffffffffff8111156110b5576110b5611f8e565b6040519080825280602002602001820160405280156110fa57816020015b60408051808201909152600080825260208201528152602001906001900390816110d35790505b50905060005b825181101561118f57600083828151811061111d5761111d612912565b60200260200101519050604051806040016040528060a083901c67ffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681525083838151811061117257611172612912565b602002602001018190525050806111889061298d565b9050611100565b5092915050565b61119e61170c565b60005b858110156112825760008787838181106111bd576111bd612912565b9050604002018036038101906111d39190612a15565b60208181018051835167ffffffffffffffff90811660009081526003855260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055855193519051921682529394509216917f1f7d0ec248b80e5c0dde0ee531c4fc8fdb6ce9a2b3d90f560c74acd6a7202f23910160405180910390a25061127b8161298d565b90506111a1565b5060005b838110156113c35760008585838181106112a2576112a2612912565b6112b89260206040909202019081019150612463565b905060008686848181106112ce576112ce612912565b90506040020160200160208101906112e6919061235f565b90506112fd6112f58383611863565b60049061192a565b61135b576040517f4964779000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015273ffffffffffffffffffffffffffffffffffffffff82166024820152604401610530565b60405173ffffffffffffffffffffffffffffffffffffffff8216815267ffffffffffffffff8316907fa823809efda3ba66c873364eec120fa0923d9fabda73bc97dd5663341e2d9bcb9060200160405180910390a25050806113bc9061298d565b9050611286565b5060005b818110156114ac5760008383838181106113e3576113e3612912565b6113f99260206040909202019081019150612463565b9050600084848481811061140f5761140f612912565b9050604002016020016020810190611427919061235f565b905061143e6114368383611863565b600490611936565b156114995760405173ffffffffffffffffffffffffffffffffffffffff8216815267ffffffffffffffff8316907fa4bdf64ebdf3316320601a081916a75aa144bcef6c4beeb0e9fb1982cacc6b949060200160405180910390a25b5050806114a59061298d565b90506113c7565b50505050505050565b6114bd61170c565b6114c681611942565b50565b60606115038267ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b61151d57604080516000808252602082019092529061118f565b67ffffffffffffffff8216600081815260036020526040908190205490517ffbca3b74000000000000000000000000000000000000000000000000000000008152600481019290925273ffffffffffffffffffffffffffffffffffffffff169063fbca3b7490602401600060405180830381865afa1580156115a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d29190810190612a54565b600060608361ffff1667ffffffffffffffff81111561160a5761160a611f8e565b6040519080825280601f01601f191660200182016040528015611634576020820181803683370190505b5090507f0c3b563c000000000000000000000000000000000000000000000000000000007fafa32a2c000000000000000000000000000000000000000000000000000000007f37c3be2900000000000000000000000000000000000000000000000000000000883b6116aa578260005260046000fd5b5a868110156116bd578260005260046000fd5b86900360408104810389106116d6578160005260046000fd5b506000808b5160208d0160008d8df194503d878111156116f35750865b808552806000602087013e505050509550959350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461178d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610530565b565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109c89084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611a37565b6000610ae173ffffffffffffffffffffffffffffffffffffffff83167bffffffffffffffff000000000000000000000000000000000000000060a086901b16612ae3565b60008181526001830160205260408120541515610ae1565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109a19085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016117e1565b60606000610ae183611b43565b6000610ae18383611b9f565b6000610ae18383611c92565b3373ffffffffffffffffffffffffffffffffffffffff8216036119c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610530565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611a99826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611ce19092919063ffffffff16565b8051909150156109c85780806020019051810190611ab791906126d7565b6109c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610530565b606081600001805480602002602001604051908101604052809291908181526020018280548015611b9357602002820191906000526020600020905b815481526020019060010190808311611b7f575b50505050509050919050565b60008181526001830160205260408120548015611c88576000611bc3600183612af6565b8554909150600090611bd790600190612af6565b9050818114611c3c576000866000018281548110611bf757611bf7612912565b9060005260206000200154905080876000018481548110611c1a57611c1a612912565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c4d57611c4d612b09565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105d2565b60009150506105d2565b6000818152600183016020526040812054611cd9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105d2565b5060006105d2565b6060611cf08484600085611cf8565b949350505050565b606082471015611d8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610530565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611db39190612b38565b60006040518083038185875af1925050503d8060008114611df0576040519150601f19603f3d011682016040523d82523d6000602084013e611df5565b606091505b5091509150611e0687838387611e11565b979650505050505050565b60608315611ea7578251600003611ea05773ffffffffffffffffffffffffffffffffffffffff85163b611ea0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610530565b5081611cf0565b611cf08383815115611ebc5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105309190611f5e565b60005b83811015611f0b578181015183820152602001611ef3565b50506000910152565b60008151808452611f2c816020860160208601611ef0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ae16020830184611f14565b803567ffffffffffffffff81168114611f8957600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611fe057611fe0611f8e565b60405290565b60405160a0810167ffffffffffffffff81118282101715611fe057611fe0611f8e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561205057612050611f8e565b604052919050565b600082601f83011261206957600080fd5b813567ffffffffffffffff81111561208357612083611f8e565b6120b460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612009565b8181528460208386010111156120c957600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff82111561210057612100611f8e565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146114c657600080fd5b8035611f898161210a565b600082601f83011261214857600080fd5b8135602061215d612158836120e6565b612009565b82815260069290921b8401810191818101908684111561217c57600080fd5b8286015b848110156121c457604081890312156121995760008081fd5b6121a1611fbd565b81356121ac8161210a565b81528185013585820152835291830191604001612180565b509695505050505050565b600080604083850312156121e257600080fd5b6121eb83611f71565b9150602083013567ffffffffffffffff8082111561220857600080fd5b9084019060a0828703121561221c57600080fd5b612224611fe6565b82358281111561223357600080fd5b61223f88828601612058565b82525060208301358281111561225457600080fd5b61226088828601612058565b60208301525060408301358281111561227857600080fd5b61228488828601612137565b6040830152506122966060840161212c565b60608201526080830135828111156122ad57600080fd5b6122b988828601612058565b6080830152508093505050509250929050565b600080600080608085870312156122e257600080fd5b843567ffffffffffffffff8111156122f957600080fd5b850160a0818803121561230b57600080fd5b9350602085013561ffff8116811461232257600080fd5b92506040850135915060608501356123398161210a565b939692955090935050565b8215158152604060208201526000611cf06040830184611f14565b60006020828403121561237157600080fd5b8135610ae18161210a565b60008060006060848603121561239157600080fd5b833561239c8161210a565b925060208401356123ac8161210a565b929592945050506040919091013590565b600080604083850312156123d057600080fd5b6123d983611f71565b915060208301356123e98161210a565b809150509250929050565b602080825282518282018190526000919060409081850190868401855b82811015612456578151805167ffffffffffffffff16855286015173ffffffffffffffffffffffffffffffffffffffff16868501529284019290850190600101612411565b5091979650505050505050565b60006020828403121561247557600080fd5b610ae182611f71565b60008083601f84011261249057600080fd5b50813567ffffffffffffffff8111156124a857600080fd5b6020830191508360208260061b85010111156124c357600080fd5b9250929050565b600080600080600080606087890312156124e357600080fd5b863567ffffffffffffffff808211156124fb57600080fd5b6125078a838b0161247e565b9098509650602089013591508082111561252057600080fd5b61252c8a838b0161247e565b9096509450604089013591508082111561254557600080fd5b5061255289828a0161247e565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b818110156125b257835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612580565b50909695505050505050565b6000815160a084526125d360a0850182611f14565b9050602080840151858303828701526125ec8382611f14565b60408681015188830389830152805180845290850195509092506000918401905b8083101561264c578551805173ffffffffffffffffffffffffffffffffffffffff1683528501518583015294840194600192909201919083019061260d565b5060608701519450612676606089018673ffffffffffffffffffffffffffffffffffffffff169052565b60808701519450878103608089015261268f8186611f14565b98975050505050505050565b67ffffffffffffffff83168152604060208201526000611cf060408301846125be565b6000602082840312156126d057600080fd5b5051919050565b6000602082840312156126e957600080fd5b81518015158114610ae157600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261272e57600080fd5b830160208101925035905067ffffffffffffffff81111561274e57600080fd5b8036038213156124c357600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156127fb5781356127c98161210a565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016127b6565b509495945050505050565b6020815281356020820152600061281f60208401611f71565b67ffffffffffffffff808216604085015261283d60408601866126f9565b925060a0606086015261285460c08601848361275d565b92505061286460608601866126f9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261289a85838561275d565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126128d357600080fd5b602092880192830192359150838211156128ec57600080fd5b8160061b36038313156128fe57600080fd5b8685030160a0870152611e068482846127a6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561295357600080fd5b8151610ae18161210a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129be576129be61295e565b5060010190565b67ffffffffffffffff851681526080602082015260006129e860808301866125be565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b600060408284031215612a2757600080fd5b612a2f611fbd565b612a3883611f71565b81526020830135612a488161210a565b60208201529392505050565b60006020808385031215612a6757600080fd5b825167ffffffffffffffff811115612a7e57600080fd5b8301601f81018513612a8f57600080fd5b8051612a9d612158826120e6565b81815260059190911b82018301908381019087831115612abc57600080fd5b928401925b82841015611e06578351612ad48161210a565b82529284019290840190612ac1565b808201808211156105d2576105d261295e565b818103818111156105d2576105d261295e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612b4a818460208701611ef0565b919091019291505056fea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedNative\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMsgValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"InvalidRecipientAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyOffRamp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"UnsupportedDestinationChain\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"calldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"name\":\"OnRampSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_RET_BYTES\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OnRamp[]\",\"name\":\"onRampUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"offRampRemoves\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"offRampAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyRampUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getArmProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOffRamps\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getOnRamp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWrappedNative\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"isChainSupported\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"isOffRamp\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"recoverTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"routeMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"retData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedNative\",\"type\":\"address\"}],\"name\":\"setWrappedNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162002d8b38038062002d8b8339810160408190526200003491620001af565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000e7565b5050600280546001600160a01b0319166001600160a01b039485161790555016608052620001e7565b336001600160a01b03821603620001415760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0381168114620001aa57600080fd5b919050565b60008060408385031215620001c357600080fd5b620001ce8362000192565b9150620001de6020840162000192565b90509250929050565b608051612b7a62000211600039600081816101f9015281816105e10152610af20152612b7a6000f3fe6080604052600436106101295760003560e01c80638da5cb5b116100a5578063a8d87a3b11610074578063e861e90711610059578063e861e90714610409578063f2fde38b14610434578063fbca3b741461045457600080fd5b8063a8d87a3b1461039c578063da5fcac8146103e957600080fd5b80638da5cb5b146102ed57806396f4e9f914610318578063a40e69c71461032b578063a48a90581461034d57600080fd5b806352cb60ca116100fc578063787350e3116100e1578063787350e31461028057806379ba5097146102a857806383826b2b146102bd57600080fd5b806352cb60ca1461023e5780635f3e849f1461026057600080fd5b8063181f5a771461012e57806320487ded1461018d5780633cf97983146101bb5780635246492f146101ea575b600080fd5b34801561013a57600080fd5b506101776040518060400160405280600c81526020017f526f7574657220312e322e30000000000000000000000000000000000000000081525081565b6040516101849190611f67565b60405180910390f35b34801561019957600080fd5b506101ad6101a83660046121d8565b610481565b604051908152602001610184565b3480156101c757600080fd5b506101db6101d63660046122d5565b6105d9565b6040516101849392919061234d565b3480156101f657600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b34801561024a57600080fd5b5061025e610259366004612378565b610836565b005b34801561026c57600080fd5b5061025e61027b366004612395565b610885565b34801561028c57600080fd5b50610295608481565b60405161ffff9091168152602001610184565b3480156102b457600080fd5b5061025e6109d3565b3480156102c957600080fd5b506102dd6102d83660046123d6565b610ad0565b6040519015158152602001610184565b3480156102f957600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610219565b6101ad6103263660046121d8565b610aee565b34801561033757600080fd5b5061034061108f565b604051610184919061240d565b34801561035957600080fd5b506102dd61036836600461247c565b67ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b3480156103a857600080fd5b506102196103b736600461247c565b67ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b3480156103f557600080fd5b5061025e6104043660046124e3565b61119c565b34801561041557600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610219565b34801561044057600080fd5b5061025e61044f366004612378565b6114bb565b34801561046057600080fd5b5061047461046f36600461247c565b6114cf565b604051610184919061257d565b606081015160009073ffffffffffffffffffffffffffffffffffffffff166104c25760025473ffffffffffffffffffffffffffffffffffffffff1660608301525b67ffffffffffffffff831660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff168061053a576040517fae236d9c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024015b60405180910390fd5b6040517f20487ded00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906320487ded9061058e90879087906004016126b4565b602060405180830381865afa1580156105ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105cf91906126d7565b9150505b92915050565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e91906126f0565b156106a5576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106be6106b86040890160208a0161247c565b33610ad0565b6106f4576040517fd2316ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006385572ffb60e01b8860405160240161070f919061281f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061079c8186888a60846115ef565b919550935091507f9b877de93ea9895756e337442c657f95a34fc68e7eb988bdfa693d5be83016b688356107d660408b0160208c0161247c565b83516020850120604051610823939291339193845267ffffffffffffffff92909216602084015273ffffffffffffffffffffffffffffffffffffffff166040830152606082015260800190565b60405180910390a1509450945094915050565b61083e611715565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61088d611715565b73ffffffffffffffffffffffffffffffffffffffff82166108f2576040517f26a78f8f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610531565b73ffffffffffffffffffffffffffffffffffffffff83166109ad5760008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610967576040519150601f19603f3d011682016040523d82523d6000602084013e61096c565b606091505b50509050806109a7576040517fe417b80b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6109ce73ffffffffffffffffffffffffffffffffffffffff84168383611798565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610531565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000610ae7610adf848461186c565b6004906118b0565b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f91906126f0565b15610bb6576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff831660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610c29576040517fae236d9c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610531565b606083015160009073ffffffffffffffffffffffffffffffffffffffff16610dbb5760025473ffffffffffffffffffffffffffffffffffffffff90811660608601526040517f20487ded000000000000000000000000000000000000000000000000000000008152908316906320487ded90610cab90889088906004016126b4565b602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec91906126d7565b905080341015610d28576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b349050836060015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505050506060850151610db6915073ffffffffffffffffffffffffffffffffffffffff168383611798565b610eb2565b3415610df3576040517f1841b4e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f20487ded00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906320487ded90610e4790889088906004016126b4565b602060405180830381865afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8891906126d7565b6060850151909150610eb29073ffffffffffffffffffffffffffffffffffffffff163384846118c8565b60005b846040015151811015610fea57600085604001518281518110610eda57610eda61292b565b6020908102919091010151516040517f48a98aa400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015273ffffffffffffffffffffffffffffffffffffffff8083166024830152919250610fd9913391908716906348a98aa490604401602060405180830381865afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f90919061295a565b88604001518581518110610fa657610fa661292b565b6020026020010151602001518473ffffffffffffffffffffffffffffffffffffffff166118c8909392919063ffffffff16565b50610fe3816129a6565b9050610eb5565b506040517fdf0aa9e900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063df0aa9e9906110439088908890869033906004016129de565b6020604051808303816000875af1158015611062573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108691906126d7565b95945050505050565b6060600061109d6004611926565b90506000815167ffffffffffffffff8111156110bb576110bb611f97565b60405190808252806020026020018201604052801561110057816020015b60408051808201909152600080825260208201528152602001906001900390816110d95790505b50905060005b82518110156111955760008382815181106111235761112361292b565b60200260200101519050604051806040016040528060a083901c67ffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152508383815181106111785761117861292b565b6020026020010181905250508061118e906129a6565b9050611106565b5092915050565b6111a4611715565b60005b858110156112885760008787838181106111c3576111c361292b565b9050604002018036038101906111d99190612a2e565b60208181018051835167ffffffffffffffff90811660009081526003855260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055855193519051921682529394509216917f1f7d0ec248b80e5c0dde0ee531c4fc8fdb6ce9a2b3d90f560c74acd6a7202f23910160405180910390a250611281816129a6565b90506111a7565b5060005b838110156113c95760008585838181106112a8576112a861292b565b6112be926020604090920201908101915061247c565b905060008686848181106112d4576112d461292b565b90506040020160200160208101906112ec9190612378565b90506113036112fb838361186c565b600490611933565b611361576040517f4964779000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015273ffffffffffffffffffffffffffffffffffffffff82166024820152604401610531565b60405173ffffffffffffffffffffffffffffffffffffffff8216815267ffffffffffffffff8316907fa823809efda3ba66c873364eec120fa0923d9fabda73bc97dd5663341e2d9bcb9060200160405180910390a25050806113c2906129a6565b905061128c565b5060005b818110156114b25760008383838181106113e9576113e961292b565b6113ff926020604090920201908101915061247c565b905060008484848181106114155761141561292b565b905060400201602001602081019061142d9190612378565b905061144461143c838361186c565b60049061193f565b1561149f5760405173ffffffffffffffffffffffffffffffffffffffff8216815267ffffffffffffffff8316907fa4bdf64ebdf3316320601a081916a75aa144bcef6c4beeb0e9fb1982cacc6b949060200160405180910390a25b5050806114ab906129a6565b90506113cd565b50505050505050565b6114c3611715565b6114cc8161194b565b50565b60606115098267ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b611523576040805160008082526020820190925290611195565b67ffffffffffffffff8216600081815260036020526040908190205490517ffbca3b74000000000000000000000000000000000000000000000000000000008152600481019290925273ffffffffffffffffffffffffffffffffffffffff169063fbca3b7490602401600060405180830381865afa1580156115a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d39190810190612a6d565b6000606060008361ffff1667ffffffffffffffff81111561161257611612611f97565b6040519080825280601f01601f19166020018201604052801561163c576020820181803683370190505b509150863b61166f577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a858110156116a2577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b85900360408104810387106116db577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156116fe5750835b808352806000602085013e50955095509592505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610531565b565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109ce9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611a40565b6000610ae773ffffffffffffffffffffffffffffffffffffffff83167bffffffffffffffff000000000000000000000000000000000000000060a086901b16612afc565b60008181526001830160205260408120541515610ae7565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109a79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016117ea565b60606000610ae783611b4c565b6000610ae78383611ba8565b6000610ae78383611c9b565b3373ffffffffffffffffffffffffffffffffffffffff8216036119ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610531565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611aa2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611cea9092919063ffffffff16565b8051909150156109ce5780806020019051810190611ac091906126f0565b6109ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610531565b606081600001805480602002602001604051908101604052809291908181526020018280548015611b9c57602002820191906000526020600020905b815481526020019060010190808311611b88575b50505050509050919050565b60008181526001830160205260408120548015611c91576000611bcc600183612b0f565b8554909150600090611be090600190612b0f565b9050818114611c45576000866000018281548110611c0057611c0061292b565b9060005260206000200154905080876000018481548110611c2357611c2361292b565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c5657611c56612b22565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105d3565b60009150506105d3565b6000818152600183016020526040812054611ce2575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105d3565b5060006105d3565b6060611cf98484600085611d01565b949350505050565b606082471015611d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610531565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611dbc9190612b51565b60006040518083038185875af1925050503d8060008114611df9576040519150601f19603f3d011682016040523d82523d6000602084013e611dfe565b606091505b5091509150611e0f87838387611e1a565b979650505050505050565b60608315611eb0578251600003611ea95773ffffffffffffffffffffffffffffffffffffffff85163b611ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610531565b5081611cf9565b611cf98383815115611ec55781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105319190611f67565b60005b83811015611f14578181015183820152602001611efc565b50506000910152565b60008151808452611f35816020860160208601611ef9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ae76020830184611f1d565b803567ffffffffffffffff81168114611f9257600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611fe957611fe9611f97565b60405290565b60405160a0810167ffffffffffffffff81118282101715611fe957611fe9611f97565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561205957612059611f97565b604052919050565b600082601f83011261207257600080fd5b813567ffffffffffffffff81111561208c5761208c611f97565b6120bd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612012565b8181528460208386010111156120d257600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff82111561210957612109611f97565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146114cc57600080fd5b8035611f9281612113565b600082601f83011261215157600080fd5b81356020612166612161836120ef565b612012565b82815260069290921b8401810191818101908684111561218557600080fd5b8286015b848110156121cd57604081890312156121a25760008081fd5b6121aa611fc6565b81356121b581612113565b81528185013585820152835291830191604001612189565b509695505050505050565b600080604083850312156121eb57600080fd5b6121f483611f7a565b9150602083013567ffffffffffffffff8082111561221157600080fd5b9084019060a0828703121561222557600080fd5b61222d611fef565b82358281111561223c57600080fd5b61224888828601612061565b82525060208301358281111561225d57600080fd5b61226988828601612061565b60208301525060408301358281111561228157600080fd5b61228d88828601612140565b60408301525061229f60608401612135565b60608201526080830135828111156122b657600080fd5b6122c288828601612061565b6080830152508093505050509250929050565b600080600080608085870312156122eb57600080fd5b843567ffffffffffffffff81111561230257600080fd5b850160a0818803121561231457600080fd5b9350602085013561ffff8116811461232b57600080fd5b925060408501359150606085013561234281612113565b939692955090935050565b83151581526060602082015260006123686060830185611f1d565b9050826040830152949350505050565b60006020828403121561238a57600080fd5b8135610ae781612113565b6000806000606084860312156123aa57600080fd5b83356123b581612113565b925060208401356123c581612113565b929592945050506040919091013590565b600080604083850312156123e957600080fd5b6123f283611f7a565b9150602083013561240281612113565b809150509250929050565b602080825282518282018190526000919060409081850190868401855b8281101561246f578151805167ffffffffffffffff16855286015173ffffffffffffffffffffffffffffffffffffffff1686850152928401929085019060010161242a565b5091979650505050505050565b60006020828403121561248e57600080fd5b610ae782611f7a565b60008083601f8401126124a957600080fd5b50813567ffffffffffffffff8111156124c157600080fd5b6020830191508360208260061b85010111156124dc57600080fd5b9250929050565b600080600080600080606087890312156124fc57600080fd5b863567ffffffffffffffff8082111561251457600080fd5b6125208a838b01612497565b9098509650602089013591508082111561253957600080fd5b6125458a838b01612497565b9096509450604089013591508082111561255e57600080fd5b5061256b89828a01612497565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b818110156125cb57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612599565b50909695505050505050565b6000815160a084526125ec60a0850182611f1d565b9050602080840151858303828701526126058382611f1d565b60408681015188830389830152805180845290850195509092506000918401905b80831015612665578551805173ffffffffffffffffffffffffffffffffffffffff16835285015185830152948401946001929092019190830190612626565b506060870151945061268f606089018673ffffffffffffffffffffffffffffffffffffffff169052565b6080870151945087810360808901526126a88186611f1d565b98975050505050505050565b67ffffffffffffffff83168152604060208201526000611cf960408301846125d7565b6000602082840312156126e957600080fd5b5051919050565b60006020828403121561270257600080fd5b81518015158114610ae757600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261274757600080fd5b830160208101925035905067ffffffffffffffff81111561276757600080fd5b8036038213156124dc57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156128145781356127e281612113565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016127cf565b509495945050505050565b6020815281356020820152600061283860208401611f7a565b67ffffffffffffffff80821660408501526128566040860186612712565b925060a0606086015261286d60c086018483612776565b92505061287d6060860186612712565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526128b3858385612776565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126128ec57600080fd5b6020928801928301923591508382111561290557600080fd5b8160061b360383131561291757600080fd5b8685030160a0870152611e0f8482846127bf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561296c57600080fd5b8151610ae781612113565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129d7576129d7612977565b5060010190565b67ffffffffffffffff85168152608060208201526000612a0160808301866125d7565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b600060408284031215612a4057600080fd5b612a48611fc6565b612a5183611f7a565b81526020830135612a6181612113565b60208201529392505050565b60006020808385031215612a8057600080fd5b825167ffffffffffffffff811115612a9757600080fd5b8301601f81018513612aa857600080fd5b8051612ab6612161826120ef565b81815260059190911b82018301908381019087831115612ad557600080fd5b928401925b82841015611e0f578351612aed81612113565b82529284019290840190612ada565b808201808211156105d3576105d3612977565b818103818111156105d3576105d3612977565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612b63818460208701611ef9565b919091019291505056fea164736f6c6343000813000a", } var RouterABI = RouterMetaData.ABI diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 7a43222a3e..8c1d2f5ce7 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -7,15 +7,15 @@ burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.19/BurnWithFromMint commit_store: ../../../contracts/solc/v0.8.19/CommitStore.abi ../../../contracts/solc/v0.8.19/CommitStore.bin b971b915b36bdc5e4ce8aee6bb5ae7a5cdedc562874f87ca863c96c2529fcc5b commit_store_helper: ../../../contracts/solc/v0.8.19/CommitStoreHelper.abi ../../../contracts/solc/v0.8.19/CommitStoreHelper.bin dd078eef6a55928e0cad79f40828a36cfa5c2789a664f37b56a7c215fb7c8932 custom_token_pool: ../../../contracts/solc/v0.8.19/CustomTokenPool.abi ../../../contracts/solc/v0.8.19/CustomTokenPool.bin 79ab937aa4493bf31fb0e57affd00555aad75205c90268e89674c28ea9e5e48f -evm_2_evm_offramp: ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.bin e72f1d19a596153e17f1efd32dcf33492c35e1eed9fe7bac33c1668388073297 -evm_2_evm_offramp_helper: ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.bin c51bdb29e090fd5ff0c6c5c963df4e3e49dec727f55a79920a403d2189d8db38 +evm_2_evm_offramp: ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.bin b5a320673ee33f28566958e1c3c835ac285cfdd29471229d90d70c9a2ac0b306 +evm_2_evm_offramp_helper: ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.bin 7a04af7543dda0c370d184897728b0367d70ff2532e35b7b9c009970c5d691db evm_2_evm_onramp: ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.bin 84ac2607dd76d553722b4ca8db9661ba762dcbb178eac13be1865b957d50ae44 lock_release_token_pool: ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.bin 5a60f3e6d803cbd7581f6a9a1e34934ba6bce065454265d1039d92af5592a2e8 maybe_revert_message_receiver: ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.bin aaa90eac8cc555ee4b0fbe57d1fb8d72d6689b29510b238177c97ab9b7979ac5 mock_arm_contract: ../../../contracts/solc/v0.8.19/MockARM.abi ../../../contracts/solc/v0.8.19/MockARM.bin efcf4cb260a2b6a6e189639f62bb50ab650a135715c1fcd42c92dfa9d04aa0e3 ping_pong_demo: ../../../contracts/solc/v0.8.19/PingPongDemo.abi ../../../contracts/solc/v0.8.19/PingPongDemo.bin 61e6f809128174e884559a2015f6a60b29b56ffde1a1a380912f631a48508a6e price_registry: ../../../contracts/solc/v0.8.19/PriceRegistry.abi ../../../contracts/solc/v0.8.19/PriceRegistry.bin 36e8d2c44a16fefb5258557cb1eae25eca1cc12efcd3c3270f91a90a5f81e7ea -router: ../../../contracts/solc/v0.8.19/Router.abi ../../../contracts/solc/v0.8.19/Router.bin d990e74b6032d4f75ef6e733e31ac5d34a3ac3f453b14f8c3a71367bb011c6db +router: ../../../contracts/solc/v0.8.19/Router.abi ../../../contracts/solc/v0.8.19/Router.bin 9bca5ba6ba53231f23196ed57e8e45fc216cd6d2614e6c26433b54ed678167ce self_funded_ping_pong: ../../../contracts/solc/v0.8.19/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.19/SelfFundedPingPong.bin fc2f9ac93f49f4a2a0a0008c2a660444cc5c127688f64beeb63e5f96a10c995e usdc_token_pool: ../../../contracts/solc/v0.8.19/USDCTokenPool.abi ../../../contracts/solc/v0.8.19/USDCTokenPool.bin 855b633851201fba6bdad7667115a1ba097c45b0c8234ae35f7a76efcb37b27a weth9: ../../../contracts/solc/v0.8.19/WETH9.abi ../../../contracts/solc/v0.8.19/WETH9.bin 5a7d64fb19b62ec523c7667ce4c2983295c05f74935b5f994c06a6f70d440f8b