From b17c09d252f75071f6ec54b3389257c1f27df9b2 Mon Sep 17 00:00:00 2001 From: Josh Weintraub <26035072+jhweintraub@users.noreply.github.com> Date: Thu, 24 Oct 2024 11:03:20 -0400 Subject: [PATCH] CCIP-3736 FeeQuoter gas optimizations and redundancy/sanity checks (#14805) * gas optimizations and redundancy/sanity checks * Update gethwrappers * formatting, shapshotting, and changesetting * CCIP-3736 update foundry and snapshot again * [Bot] Update changeset file with jira issues * Update gethwrappers * snapshot fix and missing chageset file * snapshot CI tests are the bane of my existence * fill in coverage gap * forge fmt * Update gethwrappers * CI checks are murphy's law, anything can happen at any time for no reason * Update gethwrappers * gas fix * i will never understand why the gas changes on every single run. * Update FeeQuoter.sol * [Bot] Update changeset file with jira issues * gas snapshot update after merge * Update gethwrappers * rm changeset --------- Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Co-authored-by: Rens Rooimans --- contracts/.changeset/happy-crabs-rescue.md | 10 ++++ contracts/gas-snapshots/ccip.gas-snapshot | 33 ++++++------- contracts/src/v0.8/ccip/FeeQuoter.sol | 37 ++++++++++----- .../src/v0.8/ccip/interfaces/IFeeQuoter.sol | 4 +- .../v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol | 47 +++++++++++++++++-- .../src/v0.8/ccip/test/onRamp/OnRamp.t.sol | 4 +- .../ccip/generated/fee_quoter/fee_quoter.go | 4 +- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 8 files changed, 102 insertions(+), 39 deletions(-) create mode 100644 contracts/.changeset/happy-crabs-rescue.md diff --git a/contracts/.changeset/happy-crabs-rescue.md b/contracts/.changeset/happy-crabs-rescue.md new file mode 100644 index 00000000000..2aa3bbacecc --- /dev/null +++ b/contracts/.changeset/happy-crabs-rescue.md @@ -0,0 +1,10 @@ +--- +'@chainlink/contracts': patch +--- + +Gas optimizations and comment cleanup #internal + + +PR issue: CCIP-3736 + +Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index ff501a64d8d..b68ea51a1e3 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -19,7 +19,7 @@ BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244092) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24189) -CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2108381) +CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2108425) CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 332601) CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 458549) CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 289173) @@ -67,7 +67,7 @@ CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 139 CCIPHome_setCandidate:test_setCandidate_success() (gas: 1365381) DefensiveExampleTest:test_HappyPath_Success() (gas: 200048) DefensiveExampleTest:test_Recovery() (gas: 424306) -E2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1516795) +E2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1516297) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96909) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49796) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17435) @@ -101,14 +101,14 @@ FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54728) FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 45219) FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12376) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 87721) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 87827) FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13233) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17344) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17397) FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12330) -FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 106689) -FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 111039) -FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 111092) -FeeQuoter_constructor:test_Setup_Success() (gas: 5064266) +FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 106738) +FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 111088) +FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 111141) +FeeQuoter_constructor:test_Setup_Success() (gas: 5086711) FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 68361) FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 29234) FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 96069) @@ -129,7 +129,7 @@ FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 97630) FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20506) FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27823) FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27846) -FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40415) +FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40609) FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29542) FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18377) FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 82916) @@ -141,7 +141,7 @@ FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100353) FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 142587) FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21234) FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113938) -FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22752) +FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 23409) FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63711) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1974510) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1974468) @@ -168,15 +168,16 @@ FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() ( FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 18198) FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 18557) FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 18680) +FeeQuoter_processMessageArgs:test_applyTokensTransferFeeConfigUpdates_InvalidFeeRange_Revert() (gas: 21372) FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 44681) FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 19914) FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 20311) FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 17882) -FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 122599) +FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 122505) FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 42010) FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 28534) FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 29927) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 76123) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 75957) FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 28132) FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 26003) FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 19501) @@ -519,11 +520,11 @@ OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 212648) OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146934) OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 161127) -OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3615161) +OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3615067) OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24016) OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75850) OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38583) -OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 280235) +OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 280047) OnRamp_getFee:test_EmptyMessage_Success() (gas: 98689) OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 65468) OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 87080) @@ -612,7 +613,7 @@ Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10663332) Router_applyRampUpdates:test_OnRampDisable() (gas: 56007) Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 12334) Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 131252) -Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 220952) +Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 220974) Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 71675) Router_ccipSend:test_InvalidMsgValue() (gas: 32267) Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 69363) @@ -624,7 +625,7 @@ Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 24900) Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 44902) Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 193844) Router_ccipSend:test_ccipSend_nativeFeeNoTokenSuccess_gas() (gas: 140513) -Router_ccipSend:test_ccipSend_nativeFeeOneTokenSuccess_gas() (gas: 230126) +Router_ccipSend:test_ccipSend_nativeFeeOneTokenSuccess_gas() (gas: 230148) Router_constructor:test_Constructor_Success() (gas: 13076) Router_getArmProxy:test_getArmProxy() (gas: 10573) Router_getFee:test_GetFeeSupportedChain_Success() (gas: 51716) diff --git a/contracts/src/v0.8/ccip/FeeQuoter.sol b/contracts/src/v0.8/ccip/FeeQuoter.sol index 323ea1b9c53..c9a97e04264 100644 --- a/contracts/src/v0.8/ccip/FeeQuoter.sol +++ b/contracts/src/v0.8/ccip/FeeQuoter.sol @@ -42,7 +42,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, error MessageFeeTooHigh(uint256 msgFeeJuels, uint256 maxFeeJuelsPerMsg); error InvalidStaticConfig(); error MessageTooLarge(uint256 maxSize, uint256 actualSize); - error UnsupportedNumberOfTokens(); + error UnsupportedNumberOfTokens(uint256 numberOfTokens, uint256 maxNumberOfTokensPerMsg); + error InvalidFeeRange(uint256 minFeeUSDCents, uint256 maxFeeUSDCents); event FeeTokenAdded(address indexed feeToken); event FeeTokenRemoved(address indexed feeToken); @@ -522,6 +523,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, revert StaleKeystoneUpdate(feeds[i].token, feeds[i].timestamp, s_usdPerToken[feeds[i].token].timestamp); } + // Update the token price with the new value and timestamp s_usdPerToken[feeds[i].token] = Internal.TimestampedPackedUint224({value: rebasedValue, timestamp: feeds[i].timestamp}); emit UsdPerTokenUpdated(feeds[i].token, rebasedValue, feeds[i].timestamp); @@ -586,8 +588,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, // We then multiply this gas total with the gas multiplier and gas price, converting it into USD with 36 decimals. // uint112(packedGasPrice) = executionGasPrice - // NOTE: when supporting non-EVM chains, revisit how generic this fee logic can be - // NOTE: revisit parsing non-EVM args + // NOTE: Fee logic is currently only supported for EVM-Chains, and the gas price is assumed to be in wei. + // fee logic for other chains should be implemented in the future. uint256 executionCost = uint112(packedGasPrice) * ( destChainConfig.destGasOverhead + (message.data.length * destChainConfig.destGasPerPayloadByte) + tokenTransferGas @@ -804,6 +806,10 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, tokenTransferFeeConfigArg.tokenTransferFeeConfigs[j].tokenTransferFeeConfig; address token = tokenTransferFeeConfigArg.tokenTransferFeeConfigs[j].token; + if (tokenTransferFeeConfig.minFeeUSDCents >= tokenTransferFeeConfig.maxFeeUSDCents) { + revert InvalidFeeRange(tokenTransferFeeConfig.minFeeUSDCents, tokenTransferFeeConfig.maxFeeUSDCents); + } + if (tokenTransferFeeConfig.destBytesOverhead < Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES) { revert InvalidDestBytesOverhead(token, tokenTransferFeeConfig.destBytesOverhead); } @@ -849,6 +855,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, _parseUnvalidatedEVMExtraArgsFromBytes(extraArgs, destChainConfig.defaultTxGasLimit); if (evmExtraArgs.gasLimit > uint256(destChainConfig.maxPerMsgGasLimit)) revert MessageGasLimitTooHigh(); + + // If the chain enforces out of order execution, the extra args must allow it, otherwise revert if (destChainConfig.enforceOutOfOrder && !evmExtraArgs.allowOutOfOrderExecution) { revert ExtraArgOutOfOrderExecutionMustBeTrue(); } @@ -899,7 +907,9 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, if (dataLength > uint256(destChainConfig.maxDataBytes)) { revert MessageTooLarge(uint256(destChainConfig.maxDataBytes), dataLength); } - if (numberOfTokens > uint256(destChainConfig.maxNumberOfTokensPerMsg)) revert UnsupportedNumberOfTokens(); + if (numberOfTokens > uint256(destChainConfig.maxNumberOfTokensPerMsg)) { + revert UnsupportedNumberOfTokens(numberOfTokens, destChainConfig.maxNumberOfTokensPerMsg); + } _validateDestFamilyAddress(destChainConfig.chainFamilySelector, receiver); } @@ -932,8 +942,10 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, if (msgFeeJuels > i_maxFeeJuelsPerMsg) revert MessageFeeTooHigh(msgFeeJuels, i_maxFeeJuelsPerMsg); uint64 defaultTxGasLimit = s_destChainConfigs[destChainSelector].defaultTxGasLimit; - // NOTE: when supporting non-EVM chains, revisit this and parse non-EVM args. - // We can parse unvalidated args since this message is called after getFee (which will already validate the params) + + // NOTE: Only EVM chains are supported for now, additional validation logic will be added when supporting other + // chain families to parse non-EVM args + // Since the message is called after getFee, which will already validate the params, no validation is necessary Client.EVMExtraArgsV2 memory parsedExtraArgs = _parseUnvalidatedEVMExtraArgsFromBytes(extraArgs, defaultTxGasLimit); isOutOfOrderExecution = parsedExtraArgs.allowOutOfOrderExecution; destExecDataPerToken = _processPoolReturnData(destChainSelector, onRampTokenTransfers, sourceTokenAmounts); @@ -969,10 +981,12 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, _validateDestFamilyAddress(chainFamilySelector, onRampTokenTransfers[i].destTokenAddress); FeeQuoter.TokenTransferFeeConfig memory tokenTransferFeeConfig = s_tokenTransferFeeConfig[destChainSelector][sourceToken]; - uint32 defaultGasOverhead = s_destChainConfigs[destChainSelector].defaultTokenDestGasOverhead; - // NOTE: Revisit this when adding new non-EVM chain family selector support - uint32 destGasAmount = - tokenTransferFeeConfig.isEnabled ? tokenTransferFeeConfig.destGasOverhead : defaultGasOverhead; + + // NOTE: Only EVM chains' gas model is supported for now, additional fee logic for non-EVM chains will + // be required in the future with parsing based on chain family selector. + uint32 destGasAmount = tokenTransferFeeConfig.isEnabled + ? tokenTransferFeeConfig.destGasOverhead + : s_destChainConfigs[destChainSelector].defaultTokenDestGasOverhead; // The user will be billed either the default or the override, so we send the exact amount that we billed for // to the destination chain to be used for the token releaseOrMint and transfer. @@ -1011,7 +1025,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, uint64 destChainSelector = destChainConfigArgs[i].destChainSelector; DestChainConfig memory destChainConfig = destChainConfigArg.destChainConfig; - // NOTE: when supporting non-EVM chains, update chainFamilySelector validations + // destChainSelector must be non-zero, defaultTxGasLimit must be set, and must be less than maxPerMsgGasLimit + // Only EVM chains are supported for now, additional validation logic will be added when supporting other chain families if ( destChainSelector == 0 || destChainConfig.defaultTxGasLimit == 0 || destChainConfig.chainFamilySelector != Internal.CHAIN_FAMILY_SELECTOR_EVM diff --git a/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol b/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol index 84d430410b2..831941d4878 100644 --- a/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol +++ b/contracts/src/v0.8/ccip/interfaces/IFeeQuoter.sol @@ -17,8 +17,8 @@ interface IFeeQuoter is IPriceRegistry { /// @notice Converts the extraArgs to the latest version and returns the converted message fee in juels /// @notice Validates pool return data - /// @param destChainSelector destination chain selector to process - /// @param feeToken Fee token address used to pay for message fees + /// @param destChainSelector destination chain selector to process, must be a configured valid chain + /// @param feeToken token address used to pay for message fees, must be a configured valid fee token /// @param feeTokenAmount Fee token amount /// @param extraArgs Message extra args that were passed in by the client /// @param onRampTokenTransfers Token amounts with populated pool return data diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol index 519c96ca5c5..d5df2f99c9d 100644 --- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol +++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.t.sol @@ -1125,6 +1125,20 @@ contract FeeQuoter_applyTokenTransferFeeConfigUpdates is FeeQuoterSetup { function test_Fuzz_ApplyTokenTransferFeeConfig_Success( FeeQuoter.TokenTransferFeeConfig[2] memory tokenTransferFeeConfigs ) public { + // To prevent Invalid Fee Range error from the fuzzer, bound the results to a valid range that + // where minFee < maxFee + tokenTransferFeeConfigs[0].minFeeUSDCents = + uint32(bound(tokenTransferFeeConfigs[0].minFeeUSDCents, 0, type(uint8).max)); + tokenTransferFeeConfigs[1].minFeeUSDCents = + uint32(bound(tokenTransferFeeConfigs[1].minFeeUSDCents, 0, type(uint8).max)); + + tokenTransferFeeConfigs[0].maxFeeUSDCents = uint32( + bound(tokenTransferFeeConfigs[0].maxFeeUSDCents, tokenTransferFeeConfigs[0].minFeeUSDCents + 1, type(uint32).max) + ); + tokenTransferFeeConfigs[1].maxFeeUSDCents = uint32( + bound(tokenTransferFeeConfigs[1].maxFeeUSDCents, tokenTransferFeeConfigs[1].minFeeUSDCents + 1, type(uint32).max) + ); + FeeQuoter.TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs = _generateTokenTransferFeeConfigArgs(2, 2); tokenTransferFeeConfigArgs[0].destChainSelector = DEST_CHAIN_SELECTOR; tokenTransferFeeConfigArgs[1].destChainSelector = DEST_CHAIN_SELECTOR + 1; @@ -1414,8 +1428,8 @@ contract FeeQuoter_getTokenTransferCost is FeeQuoterFeeSetup { tokenTransferFeeConfigArgs[0].destChainSelector = DEST_CHAIN_SELECTOR; tokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].token = s_sourceFeeToken; tokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].tokenTransferFeeConfig = FeeQuoter.TokenTransferFeeConfig({ - minFeeUSDCents: 1, - maxFeeUSDCents: 0, + minFeeUSDCents: 0, + maxFeeUSDCents: 1, deciBps: 0, destGasOverhead: 0, destBytesOverhead: uint32(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES), @@ -1766,7 +1780,7 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup { Client.EVM2AnyMessage memory message = _generateEmptyMessage(); uint256 tooMany = MAX_TOKENS_LENGTH + 1; message.tokenAmounts = new Client.EVMTokenAmount[](tooMany); - vm.expectRevert(FeeQuoter.UnsupportedNumberOfTokens.selector); + vm.expectRevert(abi.encodeWithSelector(FeeQuoter.UnsupportedNumberOfTokens.selector, tooMany, MAX_TOKENS_LENGTH)); s_feeQuoter.getValidatedFee(DEST_CHAIN_SELECTOR, message); } @@ -2010,6 +2024,29 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup { ); } + function test_applyTokensTransferFeeConfigUpdates_InvalidFeeRange_Revert() public { + address sourceETH = s_sourceTokens[1]; + + // Set token config to allow larger data + FeeQuoter.TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs = _generateTokenTransferFeeConfigArgs(1, 1); + tokenTransferFeeConfigArgs[0].destChainSelector = DEST_CHAIN_SELECTOR; + tokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].token = sourceETH; + tokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].tokenTransferFeeConfig = FeeQuoter.TokenTransferFeeConfig({ + minFeeUSDCents: 1, + maxFeeUSDCents: 0, + deciBps: 0, + destGasOverhead: 0, + destBytesOverhead: uint32(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES) + 32, + isEnabled: true + }); + + vm.expectRevert(abi.encodeWithSelector(FeeQuoter.InvalidFeeRange.selector, 1, 0)); + + s_feeQuoter.applyTokenTransferFeeConfigUpdates( + tokenTransferFeeConfigArgs, new FeeQuoter.TokenTransferFeeConfigRemoveArgs[](0) + ); + } + function test_processMessageArgs_SourceTokenDataTooLarge_Revert() public { address sourceETH = s_sourceTokens[1]; @@ -2043,8 +2080,8 @@ contract FeeQuoter_processMessageArgs is FeeQuoterFeeSetup { tokenTransferFeeConfigArgs[0].destChainSelector = DEST_CHAIN_SELECTOR; tokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].token = sourceETH; tokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].tokenTransferFeeConfig = FeeQuoter.TokenTransferFeeConfig({ - minFeeUSDCents: 1, - maxFeeUSDCents: 0, + minFeeUSDCents: 0, + maxFeeUSDCents: 1, deciBps: 0, destGasOverhead: 0, destBytesOverhead: uint32(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES) + 32, diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol index d7a50a7724e..7f9d6c7fb7e 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp.t.sol @@ -578,8 +578,8 @@ contract OnRamp_forwardFromRouter is OnRampSetup { tokenTransferFeeConfigArgs[0].destChainSelector = DEST_CHAIN_SELECTOR; tokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].token = sourceETH; tokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[0].tokenTransferFeeConfig = FeeQuoter.TokenTransferFeeConfig({ - minFeeUSDCents: 1, - maxFeeUSDCents: 0, + minFeeUSDCents: 0, + maxFeeUSDCents: 1, deciBps: 0, destGasOverhead: 0, destBytesOverhead: uint32(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES) + 32, diff --git a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go index 404b215cb43..c845cae7ed1 100644 --- a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go +++ b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go @@ -156,8 +156,8 @@ type KeystoneFeedsPermissionHandlerPermission struct { } var FeeQuoterMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"FeeTokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"}],\"name\":\"ReportForwarderUnauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feedTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storedTimeStamp\",\"type\":\"uint256\"}],\"name\":\"StaleKeystoneUpdate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"priceFeedConfig\",\"type\":\"tuple\"}],\"name\":\"PriceFeedPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"name\":\"permission\",\"type\":\"tuple\"}],\"name\":\"ReportPermissionSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChain\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerUnitGasUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FEE_BASE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KEYSTONE_PRICE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getTokenPrices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"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\":\"getValidatedFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getValidatedTokenPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"onReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"onRampTokenTransfers\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"processMessageArgs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"convertedExtraArgs\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"name\":\"permissions\",\"type\":\"tuple[]\"}],\"name\":\"setReportPermissions\",\"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\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"updatePrices\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e06040523480156200001157600080fd5b50604051620079f7380380620079f78339810160408190526200003491620018b2565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000206565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b1565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018b908662000400565b620001968462000548565b620001a18162000640565b620001ac8262000aa8565b60408051600080825260208201909252620001f991859190620001f2565b6040805180820190915260008082526020820152815260200190600190039081620001ca5790505b5062000b74565b5050505050505062001b70565b336001600160a01b03821603620002605760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000341576000828281518110620002da57620002da620019d1565b60209081029190910101519050620002f460028262000ead565b1562000337576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002b9565b50815160005b8151811015620003fa576000828281518110620003685762000368620019d1565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a6576040516342bcdf7f60e11b815260040160405180910390fd5b620003b360028262000ecd565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000347565b50505050565b60005b8251811015620004a1576200043f838281518110620004265762000426620019d1565b6020026020010151600b62000ee460201b90919060201c565b1562000498578281815181106200045a576200045a620019d1565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b60010162000403565b5060005b81518110156200054357620004e1828281518110620004c857620004c8620019d1565b6020026020010151600b62000ecd60201b90919060201c565b156200053a57818181518110620004fc57620004fc620019d1565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101620004a5565b505050565b60005b81518110156200063c5760008282815181106200056c576200056c620019d1565b6020908102919091018101518051818301516001600160a01b0380831660008181526007875260409081902084518154868a0180518589018051949098166001600160a81b03199093168317600160a01b60ff928316021760ff60a81b1916600160a81b9415159490940293909317909355835190815291511697810197909752915115159186019190915292945090929091907fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf9060600160405180910390a25050508060010190506200054b565b5050565b60005b81518110156200063c576000828281518110620006645762000664620019d1565b602002602001015190506000838381518110620006855762000685620019d1565b6020026020010151600001519050600082602001519050816001600160401b031660001480620006be575061016081015163ffffffff16155b80620006e057506102008101516001600160e01b031916630a04b54b60e21b14155b80620007005750806060015163ffffffff1681610160015163ffffffff16115b156200072b5760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260096020526040812060010154600160a81b900460e01b6001600160e01b0319169003620007ab57816001600160401b03167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda46265826040516200079d9190620019e7565b60405180910390a2620007ef565b816001600160401b03167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051620007e69190620019e7565b60405180910390a25b8060096000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c021790555090505050505080600101905062000643565b60005b81518110156200063c57600082828151811062000acc5762000acc620019d1565b6020026020010151600001519050600083838151811062000af15762000af1620019d1565b6020908102919091018101518101516001600160a01b03841660008181526008845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000aab565b60005b825181101562000de757600083828151811062000b985762000b98620019d1565b6020026020010151905060008160000151905060005b82602001515181101562000dd85760008360200151828151811062000bd75762000bd7620019d1565b602002602001015160200151905060008460200151838151811062000c005762000c00620019d1565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c5f5760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000dc5908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000bae565b50505080600101905062000b77565b5060005b81518110156200054357600082828151811062000e0c5762000e0c620019d1565b6020026020010151600001519050600083838151811062000e315762000e31620019d1565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000deb565b600062000ec4836001600160a01b03841662000efb565b90505b92915050565b600062000ec4836001600160a01b03841662000fff565b600062000ec4836001600160a01b03841662001051565b6000818152600183016020526040812054801562000ff457600062000f2260018362001b38565b855490915060009062000f389060019062001b38565b905081811462000fa457600086600001828154811062000f5c5762000f5c620019d1565b906000526020600020015490508087600001848154811062000f825762000f82620019d1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000fb85762000fb862001b5a565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000ec7565b600091505062000ec7565b6000818152600183016020526040812054620010485750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000ec7565b50600062000ec7565b6000818152600183016020526040812054801562000ff45760006200107860018362001b38565b85549091506000906200108e9060019062001b38565b905080821462000fa457600086600001828154811062000f5c5762000f5c620019d1565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620010ed57620010ed620010b2565b60405290565b604080519081016001600160401b0381118282101715620010ed57620010ed620010b2565b60405160c081016001600160401b0381118282101715620010ed57620010ed620010b2565b60405161022081016001600160401b0381118282101715620010ed57620010ed620010b2565b604051601f8201601f191681016001600160401b03811182821017156200118e576200118e620010b2565b604052919050565b80516001600160a01b0381168114620011ae57600080fd5b919050565b805163ffffffff81168114620011ae57600080fd5b600060608284031215620011db57600080fd5b620011e5620010c8565b82519091506001600160601b03811681146200120057600080fd5b8152620012106020830162001196565b60208201526200122360408301620011b3565b604082015292915050565b60006001600160401b038211156200124a576200124a620010b2565b5060051b60200190565b600082601f8301126200126657600080fd5b815160206200127f62001279836200122e565b62001163565b8083825260208201915060208460051b870101935086841115620012a257600080fd5b602086015b84811015620012c957620012bb8162001196565b8352918301918301620012a7565b509695505050505050565b80518015158114620011ae57600080fd5b600082601f830112620012f757600080fd5b815160206200130a62001279836200122e565b82815260079290921b840181019181810190868411156200132a57600080fd5b8286015b84811015620012c95780880360808112156200134a5760008081fd5b62001354620010f3565b6200135f8362001196565b8152606080601f1984011215620013765760008081fd5b62001380620010c8565b92506200138f87850162001196565b835260408085015160ff81168114620013a85760008081fd5b84890152620013b9858301620012d4565b9084015250808601919091528352918301916080016200132e565b80516001600160401b0381168114620011ae57600080fd5b805161ffff81168114620011ae57600080fd5b600082601f8301126200141157600080fd5b815160206200142462001279836200122e565b82815260059290921b840181019181810190868411156200144457600080fd5b8286015b84811015620012c95780516001600160401b03808211156200146957600080fd5b908801906040601f19838c0381018213156200148457600080fd5b6200148e620010f3565b6200149b898601620013d4565b81528285015184811115620014af57600080fd5b8086019550508c603f860112620014c557600080fd5b888501519350620014da62001279856200122e565b84815260e09094028501830193898101908e861115620014f957600080fd5b958401955b85871015620015d257868f0360e08112156200151957600080fd5b62001523620010f3565b6200152e8962001196565b815260c086830112156200154157600080fd5b6200154b62001118565b91506200155a8d8a01620011b3565b825262001569878a01620011b3565b8d8301526200157b60608a01620013ec565b878301526200158d60808a01620011b3565b6060830152620015a060a08a01620011b3565b6080830152620015b360c08a01620012d4565b60a0830152808d0191909152825260e09690960195908a0190620014fe565b828b01525087525050509284019250830162001448565b600082601f830112620015fb57600080fd5b815160206200160e62001279836200122e565b82815260069290921b840181019181810190868411156200162e57600080fd5b8286015b84811015620012c957604081890312156200164d5760008081fd5b62001657620010f3565b620016628262001196565b815262001671858301620013d4565b8186015283529183019160400162001632565b80516001600160e01b031981168114620011ae57600080fd5b600082601f830112620016af57600080fd5b81516020620016c262001279836200122e565b8281526102409283028501820192828201919087851115620016e357600080fd5b8387015b85811015620018a55780890382811215620017025760008081fd5b6200170c620010f3565b6200171783620013d4565b815261022080601f19840112156200172f5760008081fd5b620017396200113d565b925062001748888501620012d4565b8352604062001759818601620013ec565b8985015260606200176c818701620011b3565b828601526080915062001781828701620011b3565b9085015260a062001794868201620011b3565b8286015260c09150620017a9828701620013ec565b9085015260e0620017bc868201620011b3565b828601526101009150620017d2828701620013ec565b90850152610120620017e6868201620013ec565b828601526101409150620017fc828701620013ec565b9085015261016062001810868201620011b3565b82860152610180915062001826828701620011b3565b908501526101a06200183a868201620013d4565b828601526101c0915062001850828701620011b3565b908501526101e062001864868201620011b3565b8286015261020091506200187a828701620012d4565b908501526200188b85830162001684565b9084015250808701919091528452928401928101620016e7565b5090979650505050505050565b6000806000806000806000610120888a031215620018cf57600080fd5b620018db8989620011c8565b60608901519097506001600160401b0380821115620018f957600080fd5b620019078b838c0162001254565b975060808a01519150808211156200191e57600080fd5b6200192c8b838c0162001254565b965060a08a01519150808211156200194357600080fd5b620019518b838c01620012e5565b955060c08a01519150808211156200196857600080fd5b620019768b838c01620013ff565b945060e08a01519150808211156200198d57600080fd5b6200199b8b838c01620015e9565b93506101008a0151915080821115620019b357600080fd5b50620019c28a828b016200169d565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b8151151581526102208101602083015162001a08602084018261ffff169052565b50604083015162001a21604084018263ffffffff169052565b50606083015162001a3a606084018263ffffffff169052565b50608083015162001a53608084018263ffffffff169052565b5060a083015162001a6a60a084018261ffff169052565b5060c083015162001a8360c084018263ffffffff169052565b5060e083015162001a9a60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b0316908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200928301516001600160e01b031916929091019190915290565b8181038181111562000ec757634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051615e3462001bc3600039600081816102fa01526118d30152600081816102be01528181610ed50152610f3501526000818161028a01528181610f5e0152610fce0152615e346000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c806379ba509711610104578063bf78e03f116100a2578063d8694ccd11610071578063d8694ccd14610ad6578063f2fde38b14610ae9578063fbe3f77814610afc578063ffdb4b3714610b0f57600080fd5b8063bf78e03f146109d5578063cdc73d5114610ab3578063d02641a014610abb578063d63d3af214610ace57600080fd5b806382b49eb0116100de57806382b49eb0146108175780638da5cb5b1461098757806391a2749a146109af578063a69c64c0146109c257600080fd5b806379ba5097146107e95780637afac322146107f1578063805f21321461080457600080fd5b806341ed29e71161017c578063514e8cff1161014b578063514e8cff146104845780636cb5f3dd146105275780636def4ce71461053a578063770e2dc4146107d657600080fd5b806341ed29e7146103ee578063430d138c1461040157806345ac924d146104245780634ab35b0b1461044457600080fd5b8063181f5a77116101b8578063181f5a77146103735780632451a627146103bc578063325c868e146103d15780633937306f146103d957600080fd5b806241e5be146101de578063061877e31461020457806306285c691461025d575b600080fd5b6101f16101ec3660046144fc565b610b57565b6040519081526020015b60405180910390f35b610244610212366004614538565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101fb565b610327604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101fb565b6103af6040518060400160405280601381526020017f46656551756f74657220312e362e302d6465760000000000000000000000000081525081565b6040516101fb91906145b7565b6103c4610bc5565b6040516101fb91906145ca565b6101f1602481565b6103ec6103e7366004614624565b610bd6565b005b6103ec6103fc3660046147d0565b610e8b565b61041461040f3660046149bb565b610ecd565b6040516101fb9493929190614aaf565b610437610432366004614b4e565b6110dd565b6040516101fb9190614b90565b610457610452366004614538565b6111a8565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b61051a610492366004614c0b565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101fb9190614c26565b6103ec610535366004614cb7565b6111b3565b6107c9610548366004614c0b565b6040805161022081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081018290526102008101919091525067ffffffffffffffff908116600090815260096020908152604091829020825161022081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a0850152710100000000000000000000000000000000008304871660c08501527501000000000000000000000000000000000000000000808404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b01000000000000000000000000000000000000000000000000000000909204861661014084015260019093015480861661016084015264010000000081049096166101808301526c01000000000000000000000000860485166101a083015270010000000000000000000000000000000086049094166101c082015274010000000000000000000000000000000000000000850490911615156101e08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b1661020082015290565b6040516101fb9190614ed7565b6103ec6107e43660046150d5565b6111c7565b6103ec6111d9565b6103ec6107ff3660046153ef565b6112d6565b6103ec610812366004615453565b6112e8565b6109276108253660046154bf565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff919091166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101fb9190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b6103ec6109bd3660046154e9565b61180e565b6103ec6109d036600461557a565b61181f565b610a766109e3366004614538565b60408051606080820183526000808352602080840182905292840181905273ffffffffffffffffffffffffffffffffffffffff9485168152600783528390208351918201845254938416815260ff74010000000000000000000000000000000000000000850481169282019290925275010000000000000000000000000000000000000000009093041615159082015290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015160ff1690820152918101511515908201526060016101fb565b6103c4611830565b61051a610ac9366004614538565b61183c565b6101f1601281565b6101f1610ae436600461563f565b6119f1565b6103ec610af7366004614538565b611f29565b6103ec610b0a3660046156a3565b611f3a565b610b22610b1d3660046157c3565b611f4b565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101fb565b6000610b6282612003565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b8985612003565b610bb1907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168561581c565b610bbb9190615833565b90505b9392505050565b6060610bd1600261209d565b905090565b610bde6120aa565b6000610bea828061586e565b9050905060005b81811015610d34576000610c05848061586e565b83818110610c1557610c156158d6565b905060400201803603810190610c2b9190615931565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600690975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610d239290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610bf1565b506000610d44602084018461586e565b9050905060005b81811015610e85576000610d62602086018661586e565b83818110610d7257610d726158d6565b905060400201803603810190610d88919061596e565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610e749290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610d4b565b50505050565b610e936120ef565b60005b8151811015610ec957610ec1828281518110610eb457610eb46158d6565b6020026020010151612170565b600101610e96565b5050565b6000806060807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1603610f2e578a9350610f5c565b610f598c8c7f0000000000000000000000000000000000000000000000000000000000000000610b57565b93505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16841115611000576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018590526bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b67ffffffffffffffff8d1660009081526009602052604081206001015463ffffffff169061102f8c8c84612342565b9050806020015194506110458f8b8b8b8b6124eb565b925085856110c5836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b95509550955050509950995099509995505050505050565b60608160008167ffffffffffffffff8111156110fb576110fb61465f565b60405190808252806020026020018201604052801561114057816020015b60408051808201909152600080825260208201528152602001906001900390816111195790505b50905060005b8281101561119d57611178868683818110611163576111636158d6565b9050602002016020810190610ac99190614538565b82828151811061118a5761118a6158d6565b6020908102919091010152600101611146565b509150505b92915050565b60006111a282612003565b6111bb6120ef565b6111c48161285c565b50565b6111cf6120ef565b610ec98282612d2e565b60015473ffffffffffffffffffffffffffffffffffffffff16331461125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610ff7565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6112de6120ef565b610ec98282613140565b600080600061132c87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061328792505050565b92509250925061133e338385846132a2565b600061134c85870187615991565b905060005b815181101561180357600060076000848481518110611372576113726158d6565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff908116835282820193909352604091820160002082516060810184529054938416815260ff740100000000000000000000000000000000000000008504811692820192909252750100000000000000000000000000000000000000000090930416151590820181905290915061146d57828281518110611416576114166158d6565b6020908102919091010151516040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610ff7565b60006114ba6012836020015186868151811061148b5761148b6158d6565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166133fa565b9050600660008585815181106114d2576114d26158d6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001601c9054906101000a900463ffffffff1663ffffffff16848481518110611544576115446158d6565b60200260200101516040015163ffffffff16101561164e5783838151811061156e5761156e6158d6565b60200260200101516000015184848151811061158c5761158c6158d6565b602002602001015160400151600660008787815181106115ae576115ae6158d6565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260409081016000205490517f191ec70600000000000000000000000000000000000000000000000000000000815293909116600484015263ffffffff91821660248401527c01000000000000000000000000000000000000000000000000000000009004166044820152606401610ff7565b6040518060400160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260200185858151811061168f5761168f6158d6565b60200260200101516040015163ffffffff16815250600660008686815181106116ba576116ba6158d6565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790558351849084908110611752576117526158d6565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff167f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a828686815181106117a8576117a86158d6565b6020026020010151604001516040516117f19291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a25050600101611351565b505050505050505050565b6118166120ef565b6111c4816134bd565b6118276120ef565b6111c481613649565b6060610bd1600b61209d565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116835263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169183018290527f000000000000000000000000000000000000000000000000000000000000000016906118fe9042615a58565b101561190a5792915050565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526007602090815260409182902082516060810184529054938416815260ff74010000000000000000000000000000000000000000850481169282019290925275010000000000000000000000000000000000000000009093041615801591830191909152806119ab5750805173ffffffffffffffffffffffffffffffffffffffff16155b156119b7575092915050565b60006119c282613733565b9050826020015163ffffffff16816020015163ffffffff1610156119e657826119e8565b805b95945050505050565b67ffffffffffffffff8083166000908152600960209081526040808320815161022081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a0860152710100000000000000000000000000000000008404871660c08601527501000000000000000000000000000000000000000000808504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b01000000000000000000000000000000000000000000000000000000909304861661014085015260019094015480861661016085015264010000000081049098166101808401526c01000000000000000000000000880485166101a084015270010000000000000000000000000000000088049094166101c083015274010000000000000000000000000000000000000000870490931615156101e08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b16610200840152909190611c2b576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610ff7565b611c46611c3e6080850160608601614538565b600b906138c5565b611ca557611c5a6080840160608501614538565b6040517f2502348c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610ff7565b6000611cb4604085018561586e565b9150611d10905082611cc96020870187615a6b565b905083611cd68880615a6b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138f492505050565b6000611d2a611d256080870160608801614538565b612003565b90506000611d3d87856101c0015161399e565b9050600080808515611d7d57611d71878b611d5e60808d0160608e01614538565b88611d6c60408f018f61586e565b613a9e565b91945092509050611d9d565b6101a0870151611d9a9063ffffffff16662386f26fc1000061581c565b92505b61010087015160009061ffff1615611de157611dde886dffffffffffffffffffffffffffff607088901c16611dd560208e018e615a6b565b90508a86613d76565b90505b61018088015160009067ffffffffffffffff16611e0a611e0460808e018e615a6b565b8c613e26565b600001518563ffffffff168b60a0015161ffff168e8060200190611e2e9190615a6b565b611e3992915061581c565b8c6080015163ffffffff16611e4e9190615ad0565b611e589190615ad0565b611e629190615ad0565b611e7c906dffffffffffffffffffffffffffff891661581c565b611e86919061581c565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168282600860008f6060016020810190611ec09190614538565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054611efb9067ffffffffffffffff168961581c565b611f059190615ad0565b611f0f9190615ad0565b611f199190615833565b9c9b505050505050505050505050565b611f316120ef565b6111c481613ee7565b611f426120ef565b6111c481613fdc565b67ffffffffffffffff8116600090815260096020526040812054819060ff16611fac576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610ff7565b611fb584612003565b67ffffffffffffffff8416600090815260096020526040902060010154611ff7908590700100000000000000000000000000000000900463ffffffff1661399e565b915091505b9250929050565b60008061200f8361183c565b9050806020015163ffffffff1660001480612047575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15612096576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610ff7565b5192915050565b60606000610bbe8361412e565b6120b56002336138c5565b6120ed576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610ff7565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ff7565b600061222982600001518360600151846020015185604001516040805173ffffffffffffffffffffffffffffffffffffffff80871660208301528516918101919091527fffffffffffffffffffff00000000000000000000000000000000000000000000831660608201527fffff0000000000000000000000000000000000000000000000000000000000008216608082015260009060a001604051602081830303815290604052805190602001209050949350505050565b60808301516000828152600460205260409081902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091555190915081907f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a390612336908590600060a08201905073ffffffffffffffffffffffffffffffffffffffff8084511683527fffffffffffffffffffff0000000000000000000000000000000000000000000060208501511660208401527fffff00000000000000000000000000000000000000000000000000000000000060408501511660408401528060608501511660608401525060808301511515608083015292915050565b60405180910390a25050565b6040805180820190915260008082526020820152600083900361238357506040805180820190915267ffffffffffffffff8216815260006020820152610bbe565b600061238f8486615ae3565b905060006123a08560048189615b29565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f0000000000000000000000000000000000000000000000000000000000161243d57808060200190518101906124349190615b53565b92505050610bbe565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016124b9576040518060400160405280828060200190518101906124a59190615b7f565b815260006020909101529250610bbe915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff808616600090815260096020526040902060010154606091750100000000000000000000000000000000000000000090910460e01b90859081111561253b5761253b61465f565b60405190808252806020026020018201604052801561256e57816020015b60608152602001906001900390816125595790505b50915060005b85811015612851576000858583818110612590576125906158d6565b6125a69260206040909202019081019150614538565b905060008888848181106125bc576125bc6158d6565b90506020028101906125ce9190615b98565b6125dc906040810190615a6b565b915050602081111561268c5767ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff1681111561268c576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610ff7565b6126fc848a8a868181106126a2576126a26158d6565b90506020028101906126b49190615b98565b6126c2906020810190615a6b565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061418a92505050565b67ffffffffffffffff8a166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320815160c081018352905463ffffffff8082168352640100000000820481168386015268010000000000000000820461ffff16838501526a01000000000000000000008204811660608401526e010000000000000000000000000000820481166080840152720100000000000000000000000000000000000090910460ff16151560a08301908152958552600990935290832054935190937b01000000000000000000000000000000000000000000000000000000900490911691906127fb5781612801565b82606001515b6040805163ffffffff8316602082015291925001604051602081830303815290604052888781518110612836576128366158d6565b60200260200101819052505050505050806001019050612574565b505095945050505050565b60005b8151811015610ec957600082828151811061287c5761287c6158d6565b60200260200101519050600083838151811061289a5761289a6158d6565b60200260200101516000015190506000826020015190508167ffffffffffffffff16600014806128d3575061016081015163ffffffff16155b8061292557506102008101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806129445750806060015163ffffffff1681610160015163ffffffff16115b15612987576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ff7565b67ffffffffffffffff82166000908152600960205260408120600101547501000000000000000000000000000000000000000000900460e01b7fffffffff00000000000000000000000000000000000000000000000000000000169003612a2f578167ffffffffffffffff167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda4626582604051612a229190614ed7565b60405180910390a2612a72565b8167ffffffffffffffff167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051612a699190614ed7565b60405180910390a25b80600960008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c021790555090505050505080600101905061285f565b60005b8251811015613057576000838281518110612d4e57612d4e6158d6565b6020026020010151905060008160000151905060005b82602001515181101561304957600083602001518281518110612d8957612d896158d6565b6020026020010151602001519050600084602001518381518110612daf57612daf6158d6565b6020026020010151600001519050602063ffffffff16826080015163ffffffff161015612e325760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610ff7565b67ffffffffffffffff84166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b590613037908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101612d64565b505050806001019050612d31565b5060005b815181101561313b576000828281518110613078576130786158d6565b6020026020010151600001519050600083838151811061309a5761309a6158d6565b60209081029190910181015181015167ffffffffffffffff84166000818152600a8452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010161305b565b505050565b60005b82518110156131e357613179838281518110613161576131616158d6565b6020026020010151600b6141dc90919063ffffffff16565b156131db57828181518110613190576131906158d6565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101613143565b5060005b815181101561313b5761321d828281518110613205576132056158d6565b6020026020010151600b6141fe90919063ffffffff16565b1561327f57818181518110613234576132346158d6565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b6001016131e7565b6040810151604a820151605e90920151909260609290921c91565b6040805173ffffffffffffffffffffffffffffffffffffffff868116602080840191909152908616828401527fffffffffffffffffffff00000000000000000000000000000000000000000000851660608301527fffff00000000000000000000000000000000000000000000000000000000000084166080808401919091528351808403909101815260a09092018352815191810191909120600081815260049092529190205460ff166133f3576040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201527fffffffffffffffffffff00000000000000000000000000000000000000000000841660448201527fffff00000000000000000000000000000000000000000000000000000000000083166064820152608401610ff7565b5050505050565b6000806134078486615bd6565b9050600060248260ff16111561344157613425602460ff8416615a58565b61343090600a615d0f565b61343a9085615833565b9050613467565b61344f60ff83166024615a58565b61345a90600a615d0f565b613464908561581c565b90505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111156119e8576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015160005b81518110156135585760008282815181106134e2576134e26158d6565b6020026020010151905061350081600261422090919063ffffffff16565b1561354f5760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b506001016134c5565b50815160005b8151811015610e8557600082828151811061357b5761357b6158d6565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135eb576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135f66002826141fe565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010161355e565b60005b8151811015610ec9576000828281518110613669576136696158d6565b6020026020010151600001519050600083838151811061368b5761368b6158d6565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526008845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010161364c565b60408051808201909152600080825260208201526000826000015190506000808273ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561379e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c29190615d35565b509350509250506000821215613804576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138838473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613854573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138789190615d85565b8760200151856133fa565b604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff909216602083015250949350505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610bbe565b836040015163ffffffff1683111561394d5760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610ff7565b836020015161ffff1682111561398f576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e858461020001518261418a565b67ffffffffffffffff821660009081526005602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116825263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169282019290925290831615613a96576000816020015163ffffffff1642613a339190615a58565b90508363ffffffff16811115613a94576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff8516602482015260448101829052606401610ff7565b505b519392505050565b6000808083815b81811015613d68576000878783818110613ac157613ac16158d6565b905060400201803603810190613ad79190615da2565b67ffffffffffffffff8c166000908152600a60209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090613bf7576101208d0151613bc49061ffff16662386f26fc1000061581c565b613bce9088615ad0565b96508c610140015186613be19190615ddb565b9550613bee602086615ddb565b94505050613d60565b604081015160009061ffff1615613cb05760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614613c53578351613c4c90612003565b9050613c56565b508a5b620186a0836040015161ffff16613c988660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661424290919063ffffffff16565b613ca2919061581c565b613cac9190615833565b9150505b6060820151613cbf9088615ddb565b9650816080015186613cd19190615ddb565b8251909650600090613cf09063ffffffff16662386f26fc1000061581c565b905080821015613d0f57613d04818a615ad0565b985050505050613d60565b6000836020015163ffffffff16662386f26fc10000613d2e919061581c565b905080831115613d4e57613d42818b615ad0565b99505050505050613d60565b613d58838b615ad0565b995050505050505b600101613aa5565b505096509650969350505050565b60008063ffffffff8316613d8c6101208661581c565b613d98876101e0615ad0565b613da29190615ad0565b613dac9190615ad0565b905060008760c0015163ffffffff168860e0015161ffff1683613dcf919061581c565b613dd99190615ad0565b61010089015190915061ffff16613e006dffffffffffffffffffffffffffff89168361581c565b613e0a919061581c565b613e1a90655af3107a400061581c565b98975050505050505050565b60408051808201909152600080825260208201526000613e52858585610160015163ffffffff16612342565b9050826060015163ffffffff1681600001511115613e9c576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101e001518015613eb057508060200151155b15610bbb576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603613f66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ff7565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b8151811015610ec9576000828281518110613ffc57613ffc6158d6565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526007875260409081902084518154868a0180518589018051949098167fffffffffffffffffffffff00000000000000000000000000000000000000000090931683177401000000000000000000000000000000000000000060ff92831602177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000009415159490940293909317909355835190815291511697810197909752915115159186019190915292945090929091907fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf9060600160405180910390a2505050806001019050613fdf565b60608160000180548060200260200160405190810160405280929190818152602001828054801561417e57602002820191906000526020600020905b81548152602001906001019080831161416a575b50505050509050919050565b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610ec95761313b8161427f565b6000610bbe8373ffffffffffffffffffffffffffffffffffffffff8416614332565b6000610bbe8373ffffffffffffffffffffffffffffffffffffffff841661442c565b6000610bbe8373ffffffffffffffffffffffffffffffffffffffff841661447b565b6000670de0b6b3a7640000614275837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff861661581c565b610bbe9190615833565b600081516020146142be57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610ff791906145b7565b6000828060200190518101906142d49190615b7f565b905073ffffffffffffffffffffffffffffffffffffffff8111806142f9575061040081105b156111a257826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610ff791906145b7565b6000818152600183016020526040812054801561441b576000614356600183615a58565b855490915060009061436a90600190615a58565b90508082146143cf57600086600001828154811061438a5761438a6158d6565b90600052602060002001549050808760000184815481106143ad576143ad6158d6565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806143e0576143e0615df8565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506111a2565b60009150506111a2565b5092915050565b6000818152600183016020526040812054614473575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556111a2565b5060006111a2565b6000818152600183016020526040812054801561441b57600061449f600183615a58565b85549091506000906144b390600190615a58565b90508181146143cf57600086600001828154811061438a5761438a6158d6565b803573ffffffffffffffffffffffffffffffffffffffff811681146144f757600080fd5b919050565b60008060006060848603121561451157600080fd5b61451a846144d3565b92506020840135915061452f604085016144d3565b90509250925092565b60006020828403121561454a57600080fd5b610bbe826144d3565b6000815180845260005b818110156145795760208185018101518683018201520161455d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610bbe6020830184614553565b6020808252825182820181905260009190848201906040850190845b8181101561461857835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016145e6565b50909695505050505050565b60006020828403121561463657600080fd5b813567ffffffffffffffff81111561464d57600080fd5b820160408185031215610bbe57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156146b1576146b161465f565b60405290565b6040805190810167ffffffffffffffff811182821017156146b1576146b161465f565b604051610220810167ffffffffffffffff811182821017156146b1576146b161465f565b60405160c0810167ffffffffffffffff811182821017156146b1576146b161465f565b6040516060810167ffffffffffffffff811182821017156146b1576146b161465f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561478b5761478b61465f565b604052919050565b600067ffffffffffffffff8211156147ad576147ad61465f565b5060051b60200190565b80151581146111c457600080fd5b80356144f7816147b7565b600060208083850312156147e357600080fd5b823567ffffffffffffffff8111156147fa57600080fd5b8301601f8101851361480b57600080fd5b803561481e61481982614793565b614744565b81815260a0918202830184019184820191908884111561483d57600080fd5b938501935b838510156149105780858a03121561485a5760008081fd5b61486261468e565b61486b866144d3565b8152868601357fffffffffffffffffffff00000000000000000000000000000000000000000000811681146148a05760008081fd5b818801526040868101357fffff000000000000000000000000000000000000000000000000000000000000811681146148d95760008081fd5b9082015260606148ea8782016144d3565b908201526080868101356148fd816147b7565b9082015283529384019391850191614842565b50979650505050505050565b803567ffffffffffffffff811681146144f757600080fd5b60008083601f84011261494657600080fd5b50813567ffffffffffffffff81111561495e57600080fd5b602083019150836020828501011115611ffc57600080fd5b60008083601f84011261498857600080fd5b50813567ffffffffffffffff8111156149a057600080fd5b6020830191508360208260051b8501011115611ffc57600080fd5b600080600080600080600080600060c08a8c0312156149d957600080fd5b6149e28a61491c565b98506149f060208b016144d3565b975060408a0135965060608a013567ffffffffffffffff80821115614a1457600080fd5b614a208d838e01614934565b909850965060808c0135915080821115614a3957600080fd5b614a458d838e01614976565b909650945060a08c0135915080821115614a5e57600080fd5b818c0191508c601f830112614a7257600080fd5b813581811115614a8157600080fd5b8d60208260061b8501011115614a9657600080fd5b6020830194508093505050509295985092959850929598565b848152600060208515158184015260806040840152614ad16080840186614553565b8381036060850152845180825282820190600581901b8301840184880160005b83811015614b3d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552614b2b838351614553565b94870194925090860190600101614af1565b50909b9a5050505050505050505050565b60008060208385031215614b6157600080fd5b823567ffffffffffffffff811115614b7857600080fd5b614b8485828601614976565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015614bfe57614bee84835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101614bad565b5091979650505050505050565b600060208284031215614c1d57600080fd5b610bbe8261491c565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff1690820152604081016111a2565b803561ffff811681146144f757600080fd5b803563ffffffff811681146144f757600080fd5b80357fffffffff00000000000000000000000000000000000000000000000000000000811681146144f757600080fd5b60006020808385031215614cca57600080fd5b823567ffffffffffffffff811115614ce157600080fd5b8301601f81018513614cf257600080fd5b8035614d0061481982614793565b8181526102409182028301840191848201919088841115614d2057600080fd5b938501935b838510156149105784890381811215614d3e5760008081fd5b614d466146b7565b614d4f8761491c565b8152610220807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084011215614d845760008081fd5b614d8c6146da565b9250614d998989016147c5565b83526040614da8818a01614c61565b8a8501526060614db9818b01614c73565b8286015260809150614dcc828b01614c73565b9085015260a0614ddd8a8201614c73565b8286015260c09150614df0828b01614c61565b9085015260e0614e018a8201614c73565b828601526101009150614e15828b01614c61565b90850152610120614e278a8201614c61565b828601526101409150614e3b828b01614c61565b90850152610160614e4d8a8201614c73565b828601526101809150614e61828b01614c73565b908501526101a0614e738a820161491c565b828601526101c09150614e87828b01614c73565b908501526101e0614e998a8201614c73565b828601526102009150614ead828b016147c5565b90850152614ebc898301614c87565b90840152508088019190915283529384019391850191614d25565b81511515815261022081016020830151614ef7602084018261ffff169052565b506040830151614f0f604084018263ffffffff169052565b506060830151614f27606084018263ffffffff169052565b506080830151614f3f608084018263ffffffff169052565b5060a0830151614f5560a084018261ffff169052565b5060c0830151614f6d60c084018263ffffffff169052565b5060e0830151614f8360e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff90811691840191909152610160808501518216908401526101808085015167ffffffffffffffff16908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b600082601f83011261504e57600080fd5b8135602061505e61481983614793565b82815260069290921b8401810191818101908684111561507d57600080fd5b8286015b848110156150ca576040818903121561509a5760008081fd5b6150a26146b7565b6150ab8261491c565b81526150b88583016144d3565b81860152835291830191604001615081565b509695505050505050565b600080604083850312156150e857600080fd5b67ffffffffffffffff833511156150fe57600080fd5b83601f84358501011261511057600080fd5b6151206148198435850135614793565b8335840180358083526020808401939260059290921b9091010186101561514657600080fd5b602085358601015b85358601803560051b016020018110156153535767ffffffffffffffff8135111561517857600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a030112156151b157600080fd5b6151b96146b7565b6151c56020830161491c565b815267ffffffffffffffff604083013511156151e057600080fd5b88603f6040840135840101126151f557600080fd5b61520b6148196020604085013585010135614793565b6020604084810135850182810135808552928401939260e00201018b101561523257600080fd5b6040808501358501015b6040858101358601602081013560e00201018110156153345760e0818d03121561526557600080fd5b61526d6146b7565b615276826144d3565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f030112156152aa57600080fd5b6152b26146fe565b6152be60208401614c73565b81526152cc60408401614c73565b60208201526152dd60608401614c61565b60408201526152ee60808401614c73565b60608201526152ff60a08401614c73565b608082015261531160c08401356147b7565b60c083013560a0820152602082810191909152908452929092019160e00161523c565b508060208401525050808552505060208301925060208101905061514e565b5092505067ffffffffffffffff6020840135111561537057600080fd5b615380846020850135850161503d565b90509250929050565b600082601f83011261539a57600080fd5b813560206153aa61481983614793565b8083825260208201915060208460051b8701019350868411156153cc57600080fd5b602086015b848110156150ca576153e2816144d3565b83529183019183016153d1565b6000806040838503121561540257600080fd5b823567ffffffffffffffff8082111561541a57600080fd5b61542686838701615389565b9350602085013591508082111561543c57600080fd5b5061544985828601615389565b9150509250929050565b6000806000806040858703121561546957600080fd5b843567ffffffffffffffff8082111561548157600080fd5b61548d88838901614934565b909650945060208701359150808211156154a657600080fd5b506154b387828801614934565b95989497509550505050565b600080604083850312156154d257600080fd5b6154db8361491c565b9150615380602084016144d3565b6000602082840312156154fb57600080fd5b813567ffffffffffffffff8082111561551357600080fd5b908301906040828603121561552757600080fd5b61552f6146b7565b82358281111561553e57600080fd5b61554a87828601615389565b82525060208301358281111561555f57600080fd5b61556b87828601615389565b60208301525095945050505050565b6000602080838503121561558d57600080fd5b823567ffffffffffffffff8111156155a457600080fd5b8301601f810185136155b557600080fd5b80356155c361481982614793565b81815260069190911b820183019083810190878311156155e257600080fd5b928401925b8284101561563457604084890312156156005760008081fd5b6156086146b7565b615611856144d3565b815261561e86860161491c565b81870152825260409390930192908401906155e7565b979650505050505050565b6000806040838503121561565257600080fd5b61565b8361491c565b9150602083013567ffffffffffffffff81111561567757600080fd5b830160a0818603121561568957600080fd5b809150509250929050565b60ff811681146111c457600080fd5b600060208083850312156156b657600080fd5b823567ffffffffffffffff8111156156cd57600080fd5b8301601f810185136156de57600080fd5b80356156ec61481982614793565b81815260079190911b8201830190838101908783111561570b57600080fd5b928401925b8284101561563457838803608081121561572a5760008081fd5b6157326146b7565b61573b866144d3565b81526060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08401121561576f5760008081fd5b615777614721565b92506157848888016144d3565b835260408088013561579581615694565b848a015290870135906157a7826147b7565b8301528087019190915282526080939093019290840190615710565b600080604083850312156157d657600080fd5b6157df836144d3565b91506153806020840161491c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176111a2576111a26157ed565b600082615869577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126158a357600080fd5b83018035915067ffffffffffffffff8211156158be57600080fd5b6020019150600681901b3603821315611ffc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146144f757600080fd5b60006040828403121561594357600080fd5b61594b6146b7565b615954836144d3565b815261596260208401615905565b60208201529392505050565b60006040828403121561598057600080fd5b6159886146b7565b6159548361491c565b600060208083850312156159a457600080fd5b823567ffffffffffffffff8111156159bb57600080fd5b8301601f810185136159cc57600080fd5b80356159da61481982614793565b818152606091820283018401918482019190888411156159f957600080fd5b938501935b838510156149105780858a031215615a165760008081fd5b615a1e614721565b615a27866144d3565b8152615a34878701615905565b878201526040615a45818801614c73565b90820152835293840193918501916159fe565b818103818111156111a2576111a26157ed565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615aa057600080fd5b83018035915067ffffffffffffffff821115615abb57600080fd5b602001915036819003821315611ffc57600080fd5b808201808211156111a2576111a26157ed565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156150355760049490940360031b84901b1690921692915050565b60008085851115615b3957600080fd5b83861115615b4657600080fd5b5050820193919092039150565b600060408284031215615b6557600080fd5b615b6d6146b7565b825181526020830151615962816147b7565b600060208284031215615b9157600080fd5b5051919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112615bcc57600080fd5b9190910192915050565b60ff81811683821601908111156111a2576111a26157ed565b600181815b80851115615c4857817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615c2e57615c2e6157ed565b80851615615c3b57918102915b93841c9390800290615bf4565b509250929050565b600082615c5f575060016111a2565b81615c6c575060006111a2565b8160018114615c825760028114615c8c57615ca8565b60019150506111a2565b60ff841115615c9d57615c9d6157ed565b50506001821b6111a2565b5060208310610133831016604e8410600b8410161715615ccb575081810a6111a2565b615cd58383615bef565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615d0757615d076157ed565b029392505050565b6000610bbe8383615c50565b805169ffffffffffffffffffff811681146144f757600080fd5b600080600080600060a08688031215615d4d57600080fd5b615d5686615d1b565b9450602086015193506040860151925060608601519150615d7960808701615d1b565b90509295509295909350565b600060208284031215615d9757600080fd5b8151610bbe81615694565b600060408284031215615db457600080fd5b615dbc6146b7565b615dc5836144d3565b8152602083013560208201528091505092915050565b63ffffffff818116838216019080821115614425576144256157ed565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"FeeTokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minFeeUSDCents\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint256\"}],\"name\":\"InvalidFeeRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"}],\"name\":\"ReportForwarderUnauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feedTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storedTimeStamp\",\"type\":\"uint256\"}],\"name\":\"StaleKeystoneUpdate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numberOfTokens\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint256\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"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\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"priceFeedConfig\",\"type\":\"tuple\"}],\"name\":\"PriceFeedPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"reportId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"name\":\"permission\",\"type\":\"tuple\"}],\"name\":\"ReportPermissionSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChain\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerUnitGasUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FEE_BASE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KEYSTONE_PRICE_DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structFeeQuoter.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structFeeQuoter.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getTokenPrices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"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\":\"getValidatedFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getValidatedTokenPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"onReport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourcePoolAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"name\":\"onRampTokenTransfers\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"processMessageArgs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"convertedExtraArgs\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes10\",\"name\":\"workflowName\",\"type\":\"bytes10\"},{\"internalType\":\"bytes2\",\"name\":\"reportName\",\"type\":\"bytes2\"},{\"internalType\":\"address\",\"name\":\"workflowOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isAllowed\",\"type\":\"bool\"}],\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"name\":\"permissions\",\"type\":\"tuple[]\"}],\"name\":\"setReportPermissions\",\"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\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"updatePrices\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60e06040523480156200001157600080fd5b5060405162007acd38038062007acd8339810160408190526200003491620018ff565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000206565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b1565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018b908662000400565b620001968462000548565b620001a18162000640565b620001ac8262000aa8565b60408051600080825260208201909252620001f991859190620001f2565b6040805180820190915260008082526020820152815260200190600190039081620001ca5790505b5062000b74565b5050505050505062001bbd565b336001600160a01b03821603620002605760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000341576000828281518110620002da57620002da62001a1e565b60209081029190910101519050620002f460028262000efa565b1562000337576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002b9565b50815160005b8151811015620003fa57600082828151811062000368576200036862001a1e565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a6576040516342bcdf7f60e11b815260040160405180910390fd5b620003b360028262000f1a565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000347565b50505050565b60005b8251811015620004a1576200043f83828151811062000426576200042662001a1e565b6020026020010151600b62000f3160201b90919060201c565b1562000498578281815181106200045a576200045a62001a1e565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b60010162000403565b5060005b81518110156200054357620004e1828281518110620004c857620004c862001a1e565b6020026020010151600b62000f1a60201b90919060201c565b156200053a57818181518110620004fc57620004fc62001a1e565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101620004a5565b505050565b60005b81518110156200063c5760008282815181106200056c576200056c62001a1e565b6020908102919091018101518051818301516001600160a01b0380831660008181526007875260409081902084518154868a0180518589018051949098166001600160a81b03199093168317600160a01b60ff928316021760ff60a81b1916600160a81b9415159490940293909317909355835190815291511697810197909752915115159186019190915292945090929091907fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf9060600160405180910390a25050508060010190506200054b565b5050565b60005b81518110156200063c57600082828151811062000664576200066462001a1e565b60200260200101519050600083838151811062000685576200068562001a1e565b6020026020010151600001519050600082602001519050816001600160401b031660001480620006be575061016081015163ffffffff16155b80620006e057506102008101516001600160e01b031916630a04b54b60e21b14155b80620007005750806060015163ffffffff1681610160015163ffffffff16115b156200072b5760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260096020526040812060010154600160a81b900460e01b6001600160e01b0319169003620007ab57816001600160401b03167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda46265826040516200079d919062001a34565b60405180910390a2620007ef565b816001600160401b03167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051620007e6919062001a34565b60405180910390a25b8060096000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c021790555090505050505080600101905062000643565b60005b81518110156200063c57600082828151811062000acc5762000acc62001a1e565b6020026020010151600001519050600083838151811062000af15762000af162001a1e565b6020908102919091018101518101516001600160a01b03841660008181526008845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000aab565b60005b825181101562000e3457600083828151811062000b985762000b9862001a1e565b6020026020010151905060008160000151905060005b82602001515181101562000e255760008360200151828151811062000bd75762000bd762001a1e565b602002602001015160200151905060008460200151838151811062000c005762000c0062001a1e565b6020026020010151600001519050816020015163ffffffff16826000015163ffffffff161062000c5b57815160208301516040516305a7b3d160e11b815263ffffffff92831660048201529116602482015260440162000083565b602063ffffffff16826080015163ffffffff16101562000cac5760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000e12908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000bae565b50505080600101905062000b77565b5060005b81518110156200054357600082828151811062000e595762000e5962001a1e565b6020026020010151600001519050600083838151811062000e7e5762000e7e62001a1e565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000e38565b600062000f11836001600160a01b03841662000f48565b90505b92915050565b600062000f11836001600160a01b0384166200104c565b600062000f11836001600160a01b0384166200109e565b600081815260018301602052604081205480156200104157600062000f6f60018362001b85565b855490915060009062000f859060019062001b85565b905081811462000ff157600086600001828154811062000fa95762000fa962001a1e565b906000526020600020015490508087600001848154811062000fcf5762000fcf62001a1e565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062001005576200100562001ba7565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000f14565b600091505062000f14565b6000818152600183016020526040812054620010955750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000f14565b50600062000f14565b6000818152600183016020526040812054801562001041576000620010c560018362001b85565b8554909150600090620010db9060019062001b85565b905080821462000ff157600086600001828154811062000fa95762000fa962001a1e565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156200113a576200113a620010ff565b60405290565b604080519081016001600160401b03811182821017156200113a576200113a620010ff565b60405160c081016001600160401b03811182821017156200113a576200113a620010ff565b60405161022081016001600160401b03811182821017156200113a576200113a620010ff565b604051601f8201601f191681016001600160401b0381118282101715620011db57620011db620010ff565b604052919050565b80516001600160a01b0381168114620011fb57600080fd5b919050565b805163ffffffff81168114620011fb57600080fd5b6000606082840312156200122857600080fd5b6200123262001115565b82519091506001600160601b03811681146200124d57600080fd5b81526200125d60208301620011e3565b6020820152620012706040830162001200565b604082015292915050565b60006001600160401b03821115620012975762001297620010ff565b5060051b60200190565b600082601f830112620012b357600080fd5b81516020620012cc620012c6836200127b565b620011b0565b8083825260208201915060208460051b870101935086841115620012ef57600080fd5b602086015b8481101562001316576200130881620011e3565b8352918301918301620012f4565b509695505050505050565b80518015158114620011fb57600080fd5b600082601f8301126200134457600080fd5b8151602062001357620012c6836200127b565b82815260079290921b840181019181810190868411156200137757600080fd5b8286015b8481101562001316578088036080811215620013975760008081fd5b620013a162001140565b620013ac83620011e3565b8152606080601f1984011215620013c35760008081fd5b620013cd62001115565b9250620013dc878501620011e3565b835260408085015160ff81168114620013f55760008081fd5b848901526200140685830162001321565b9084015250808601919091528352918301916080016200137b565b80516001600160401b0381168114620011fb57600080fd5b805161ffff81168114620011fb57600080fd5b600082601f8301126200145e57600080fd5b8151602062001471620012c6836200127b565b82815260059290921b840181019181810190868411156200149157600080fd5b8286015b84811015620013165780516001600160401b0380821115620014b657600080fd5b908801906040601f19838c038101821315620014d157600080fd5b620014db62001140565b620014e889860162001421565b81528285015184811115620014fc57600080fd5b8086019550508c603f8601126200151257600080fd5b88850151935062001527620012c6856200127b565b84815260e09094028501830193898101908e8611156200154657600080fd5b958401955b858710156200161f57868f0360e08112156200156657600080fd5b6200157062001140565b6200157b89620011e3565b815260c086830112156200158e57600080fd5b6200159862001165565b9150620015a78d8a0162001200565b8252620015b6878a0162001200565b8d830152620015c860608a0162001439565b87830152620015da60808a0162001200565b6060830152620015ed60a08a0162001200565b60808301526200160060c08a0162001321565b60a0830152808d0191909152825260e09690960195908a01906200154b565b828b01525087525050509284019250830162001495565b600082601f8301126200164857600080fd5b815160206200165b620012c6836200127b565b82815260069290921b840181019181810190868411156200167b57600080fd5b8286015b848110156200131657604081890312156200169a5760008081fd5b620016a462001140565b620016af82620011e3565b8152620016be85830162001421565b818601528352918301916040016200167f565b80516001600160e01b031981168114620011fb57600080fd5b600082601f830112620016fc57600080fd5b815160206200170f620012c6836200127b565b82815261024092830285018201928282019190878511156200173057600080fd5b8387015b85811015620018f257808903828112156200174f5760008081fd5b6200175962001140565b620017648362001421565b815261022080601f19840112156200177c5760008081fd5b620017866200118a565b92506200179588850162001321565b83526040620017a681860162001439565b898501526060620017b981870162001200565b8286015260809150620017ce82870162001200565b9085015260a0620017e186820162001200565b8286015260c09150620017f682870162001439565b9085015260e06200180986820162001200565b8286015261010091506200181f82870162001439565b908501526101206200183386820162001439565b8286015261014091506200184982870162001439565b908501526101606200185d86820162001200565b8286015261018091506200187382870162001200565b908501526101a06200188786820162001421565b828601526101c091506200189d82870162001200565b908501526101e0620018b186820162001200565b828601526102009150620018c782870162001321565b90850152620018d8858301620016d1565b908401525080870191909152845292840192810162001734565b5090979650505050505050565b6000806000806000806000610120888a0312156200191c57600080fd5b62001928898962001215565b60608901519097506001600160401b03808211156200194657600080fd5b620019548b838c01620012a1565b975060808a01519150808211156200196b57600080fd5b620019798b838c01620012a1565b965060a08a01519150808211156200199057600080fd5b6200199e8b838c0162001332565b955060c08a0151915080821115620019b557600080fd5b620019c38b838c016200144c565b945060e08a0151915080821115620019da57600080fd5b620019e88b838c0162001636565b93506101008a015191508082111562001a0057600080fd5b5062001a0f8a828b01620016ea565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b8151151581526102208101602083015162001a55602084018261ffff169052565b50604083015162001a6e604084018263ffffffff169052565b50606083015162001a87606084018263ffffffff169052565b50608083015162001aa0608084018263ffffffff169052565b5060a083015162001ab760a084018261ffff169052565b5060c083015162001ad060c084018263ffffffff169052565b5060e083015162001ae760e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b0316908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200928301516001600160e01b031916929091019190915290565b8181038181111562000f1457634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051615ebd62001c10600039600081816102fa01526118d30152600081816102be01528181610ed50152610f3501526000818161028a01528181610f5e0152610fce0152615ebd6000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c806379ba509711610104578063bf78e03f116100a2578063d8694ccd11610071578063d8694ccd14610ad6578063f2fde38b14610ae9578063fbe3f77814610afc578063ffdb4b3714610b0f57600080fd5b8063bf78e03f146109d5578063cdc73d5114610ab3578063d02641a014610abb578063d63d3af214610ace57600080fd5b806382b49eb0116100de57806382b49eb0146108175780638da5cb5b1461098757806391a2749a146109af578063a69c64c0146109c257600080fd5b806379ba5097146107e95780637afac322146107f1578063805f21321461080457600080fd5b806341ed29e71161017c578063514e8cff1161014b578063514e8cff146104845780636cb5f3dd146105275780636def4ce71461053a578063770e2dc4146107d657600080fd5b806341ed29e7146103ee578063430d138c1461040157806345ac924d146104245780634ab35b0b1461044457600080fd5b8063181f5a77116101b8578063181f5a77146103735780632451a627146103bc578063325c868e146103d15780633937306f146103d957600080fd5b806241e5be146101de578063061877e31461020457806306285c691461025d575b600080fd5b6101f16101ec366004614585565b610b57565b6040519081526020015b60405180910390f35b6102446102123660046145c1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101fb565b610327604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101fb565b6103af6040518060400160405280601381526020017f46656551756f74657220312e362e302d6465760000000000000000000000000081525081565b6040516101fb9190614640565b6103c4610bc5565b6040516101fb9190614653565b6101f1602481565b6103ec6103e73660046146ad565b610bd6565b005b6103ec6103fc366004614859565b610e8b565b61041461040f366004614a44565b610ecd565b6040516101fb9493929190614b38565b610437610432366004614bd7565b6110dd565b6040516101fb9190614c19565b6104576104523660046145c1565b6111a8565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b61051a610492366004614c94565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101fb9190614caf565b6103ec610535366004614d40565b6111b3565b6107c9610548366004614c94565b6040805161022081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081018290526102008101919091525067ffffffffffffffff908116600090815260096020908152604091829020825161022081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a0850152710100000000000000000000000000000000008304871660c08501527501000000000000000000000000000000000000000000808404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b01000000000000000000000000000000000000000000000000000000909204861661014084015260019093015480861661016084015264010000000081049096166101808301526c01000000000000000000000000860485166101a083015270010000000000000000000000000000000086049094166101c082015274010000000000000000000000000000000000000000850490911615156101e08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b1661020082015290565b6040516101fb9190614f60565b6103ec6107e436600461515e565b6111c7565b6103ec6111d9565b6103ec6107ff366004615478565b6112d6565b6103ec6108123660046154dc565b6112e8565b610927610825366004615548565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff919091166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101fb9190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b6103ec6109bd366004615572565b61180e565b6103ec6109d0366004615603565b61181f565b610a766109e33660046145c1565b60408051606080820183526000808352602080840182905292840181905273ffffffffffffffffffffffffffffffffffffffff9485168152600783528390208351918201845254938416815260ff74010000000000000000000000000000000000000000850481169282019290925275010000000000000000000000000000000000000000009093041615159082015290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015160ff1690820152918101511515908201526060016101fb565b6103c4611830565b61051a610ac93660046145c1565b61183c565b6101f1601281565b6101f1610ae43660046156c8565b6119f1565b6103ec610af73660046145c1565b611f29565b6103ec610b0a36600461572c565b611f3a565b610b22610b1d36600461584c565b611f4b565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101fb565b6000610b6282612003565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b8985612003565b610bb1907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16856158a5565b610bbb91906158bc565b90505b9392505050565b6060610bd1600261209d565b905090565b610bde6120aa565b6000610bea82806158f7565b9050905060005b81811015610d34576000610c0584806158f7565b83818110610c1557610c1561595f565b905060400201803603810190610c2b91906159ba565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600690975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610d239290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610bf1565b506000610d4460208401846158f7565b9050905060005b81811015610e85576000610d6260208601866158f7565b83818110610d7257610d7261595f565b905060400201803603810190610d8891906159f7565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610e749290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610d4b565b50505050565b610e936120ef565b60005b8151811015610ec957610ec1828281518110610eb457610eb461595f565b6020026020010151612170565b600101610e96565b5050565b6000806060807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1603610f2e578a9350610f5c565b610f598c8c7f0000000000000000000000000000000000000000000000000000000000000000610b57565b93505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16841115611000576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018590526bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b67ffffffffffffffff8d1660009081526009602052604081206001015463ffffffff169061102f8c8c84612342565b9050806020015194506110458f8b8b8b8b6124eb565b925085856110c5836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b95509550955050509950995099509995505050505050565b60608160008167ffffffffffffffff8111156110fb576110fb6146e8565b60405190808252806020026020018201604052801561114057816020015b60408051808201909152600080825260208201528152602001906001900390816111195790505b50905060005b8281101561119d576111788686838181106111635761116361595f565b9050602002016020810190610ac991906145c1565b82828151811061118a5761118a61595f565b6020908102919091010152600101611146565b509150505b92915050565b60006111a282612003565b6111bb6120ef565b6111c48161286e565b50565b6111cf6120ef565b610ec98282612d40565b60015473ffffffffffffffffffffffffffffffffffffffff16331461125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610ff7565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6112de6120ef565b610ec982826131b6565b600080600061132c87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506132fd92505050565b92509250925061133e33838584613318565b600061134c85870187615a1a565b905060005b8151811015611803576000600760008484815181106113725761137261595f565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff908116835282820193909352604091820160002082516060810184529054938416815260ff740100000000000000000000000000000000000000008504811692820192909252750100000000000000000000000000000000000000000090930416151590820181905290915061146d578282815181106114165761141661595f565b6020908102919091010151516040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610ff7565b60006114ba6012836020015186868151811061148b5761148b61595f565b6020026020010151602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613470565b9050600660008585815181106114d2576114d261595f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001601c9054906101000a900463ffffffff1663ffffffff168484815181106115445761154461595f565b60200260200101516040015163ffffffff16101561164e5783838151811061156e5761156e61595f565b60200260200101516000015184848151811061158c5761158c61595f565b602002602001015160400151600660008787815181106115ae576115ae61595f565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff90811683529082019290925260409081016000205490517f191ec70600000000000000000000000000000000000000000000000000000000815293909116600484015263ffffffff91821660248401527c01000000000000000000000000000000000000000000000000000000009004166044820152606401610ff7565b6040518060400160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260200185858151811061168f5761168f61595f565b60200260200101516040015163ffffffff16815250600660008686815181106116ba576116ba61595f565b6020908102919091018101515173ffffffffffffffffffffffffffffffffffffffff168252818101929092526040016000208251929091015163ffffffff167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905583518490849081106117525761175261595f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff167f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a828686815181106117a8576117a861595f565b6020026020010151604001516040516117f19291907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216825263ffffffff16602082015260400190565b60405180910390a25050600101611351565b505050505050505050565b6118166120ef565b6111c481613533565b6118276120ef565b6111c4816136bf565b6060610bd1600b61209d565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff82166000908152600660209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116835263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169183018290527f000000000000000000000000000000000000000000000000000000000000000016906118fe9042615ae1565b101561190a5792915050565b73ffffffffffffffffffffffffffffffffffffffff80841660009081526007602090815260409182902082516060810184529054938416815260ff74010000000000000000000000000000000000000000850481169282019290925275010000000000000000000000000000000000000000009093041615801591830191909152806119ab5750805173ffffffffffffffffffffffffffffffffffffffff16155b156119b7575092915050565b60006119c2826137a9565b9050826020015163ffffffff16816020015163ffffffff1610156119e657826119e8565b805b95945050505050565b67ffffffffffffffff8083166000908152600960209081526040808320815161022081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a0860152710100000000000000000000000000000000008404871660c08601527501000000000000000000000000000000000000000000808504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b01000000000000000000000000000000000000000000000000000000909304861661014085015260019094015480861661016085015264010000000081049098166101808401526c01000000000000000000000000880485166101a084015270010000000000000000000000000000000088049094166101c083015274010000000000000000000000000000000000000000870490931615156101e08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b16610200840152909190611c2b576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610ff7565b611c46611c3e60808501606086016145c1565b600b9061393b565b611ca557611c5a60808401606085016145c1565b6040517f2502348c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610ff7565b6000611cb460408501856158f7565b9150611d10905082611cc96020870187615af4565b905083611cd68880615af4565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061396a92505050565b6000611d2a611d2560808701606088016145c1565b612003565b90506000611d3d87856101c00151613a27565b9050600080808515611d7d57611d71878b611d5e60808d0160608e016145c1565b88611d6c60408f018f6158f7565b613b27565b91945092509050611d9d565b6101a0870151611d9a9063ffffffff16662386f26fc100006158a5565b92505b61010087015160009061ffff1615611de157611dde886dffffffffffffffffffffffffffff607088901c16611dd560208e018e615af4565b90508a86613dff565b90505b61018088015160009067ffffffffffffffff16611e0a611e0460808e018e615af4565b8c613eaf565b600001518563ffffffff168b60a0015161ffff168e8060200190611e2e9190615af4565b611e399291506158a5565b8c6080015163ffffffff16611e4e9190615b59565b611e589190615b59565b611e629190615b59565b611e7c906dffffffffffffffffffffffffffff89166158a5565b611e8691906158a5565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168282600860008f6060016020810190611ec091906145c1565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054611efb9067ffffffffffffffff16896158a5565b611f059190615b59565b611f0f9190615b59565b611f1991906158bc565b9c9b505050505050505050505050565b611f316120ef565b6111c481613f70565b611f426120ef565b6111c481614065565b67ffffffffffffffff8116600090815260096020526040812054819060ff16611fac576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610ff7565b611fb584612003565b67ffffffffffffffff8416600090815260096020526040902060010154611ff7908590700100000000000000000000000000000000900463ffffffff16613a27565b915091505b9250929050565b60008061200f8361183c565b9050806020015163ffffffff1660001480612047575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15612096576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610ff7565b5192915050565b60606000610bbe836141b7565b6120b560023361393b565b6120ed576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610ff7565b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ff7565b600061222982600001518360600151846020015185604001516040805173ffffffffffffffffffffffffffffffffffffffff80871660208301528516918101919091527fffffffffffffffffffff00000000000000000000000000000000000000000000831660608201527fffff0000000000000000000000000000000000000000000000000000000000008216608082015260009060a001604051602081830303815290604052805190602001209050949350505050565b60808301516000828152600460205260409081902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091555190915081907f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a390612336908590600060a08201905073ffffffffffffffffffffffffffffffffffffffff8084511683527fffffffffffffffffffff0000000000000000000000000000000000000000000060208501511660208401527fffff00000000000000000000000000000000000000000000000000000000000060408501511660408401528060608501511660608401525060808301511515608083015292915050565b60405180910390a25050565b6040805180820190915260008082526020820152600083900361238357506040805180820190915267ffffffffffffffff8216815260006020820152610bbe565b600061238f8486615b6c565b905060006123a08560048189615bb2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f0000000000000000000000000000000000000000000000000000000000161243d57808060200190518101906124349190615bdc565b92505050610bbe565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016124b9576040518060400160405280828060200190518101906124a59190615c08565b815260006020909101529250610bbe915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff808616600090815260096020526040902060010154606091750100000000000000000000000000000000000000000090910460e01b90859081111561253b5761253b6146e8565b60405190808252806020026020018201604052801561256e57816020015b60608152602001906001900390816125595790505b50915060005b858110156128635760008585838181106125905761259061595f565b6125a692602060409092020190810191506145c1565b905060008888848181106125bc576125bc61595f565b90506020028101906125ce9190615c21565b6125dc906040810190615af4565b915050602081111561268c5767ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff1681111561268c576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610ff7565b6126fc848a8a868181106126a2576126a261595f565b90506020028101906126b49190615c21565b6126c2906020810190615af4565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061421392505050565b67ffffffffffffffff8a166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684528252808320815160c081018352905463ffffffff8082168352640100000000820481169483019490945268010000000000000000810461ffff16928201929092526a01000000000000000000008204831660608201526e010000000000000000000000000000820490921660808301527201000000000000000000000000000000000000900460ff16151560a0820181905290919061280e5767ffffffffffffffff8c166000908152600960205260409020547b01000000000000000000000000000000000000000000000000000000900463ffffffff16612814565b81606001515b6040805163ffffffff83166020820152919250016040516020818303038152906040528786815181106128495761284961595f565b602002602001018190525050505050806001019050612574565b505095945050505050565b60005b8151811015610ec957600082828151811061288e5761288e61595f565b6020026020010151905060008383815181106128ac576128ac61595f565b60200260200101516000015190506000826020015190508167ffffffffffffffff16600014806128e5575061016081015163ffffffff16155b8061293757506102008101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806129565750806060015163ffffffff1681610160015163ffffffff16115b15612999576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610ff7565b67ffffffffffffffff82166000908152600960205260408120600101547501000000000000000000000000000000000000000000900460e01b7fffffffff00000000000000000000000000000000000000000000000000000000169003612a41578167ffffffffffffffff167f525e3d4e0c31cef19cf9426af8d2c0ddd2d576359ca26bed92aac5fadda4626582604051612a349190614f60565b60405180910390a2612a84565b8167ffffffffffffffff167f283b699f411baff8f1c29fe49f32a828c8151596244b8e7e4c164edd6569a83582604051612a7b9190614f60565b60405180910390a25b80600960008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548163ffffffff021916908363ffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c0217905550905050505050806001019050612871565b60005b82518110156130cd576000838281518110612d6057612d6061595f565b6020026020010151905060008160000151905060005b8260200151518110156130bf57600083602001518281518110612d9b57612d9b61595f565b6020026020010151602001519050600084602001518381518110612dc157612dc161595f565b6020026020010151600001519050816020015163ffffffff16826000015163ffffffff1610612e3357815160208301516040517f0b4f67a200000000000000000000000000000000000000000000000000000000815263ffffffff928316600482015291166024820152604401610ff7565b602063ffffffff16826080015163ffffffff161015612ea85760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610ff7565b67ffffffffffffffff84166000818152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b5906130ad908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101612d76565b505050806001019050612d43565b5060005b81518110156131b15760008282815181106130ee576130ee61595f565b602002602001015160000151905060008383815181106131105761311061595f565b60209081029190910181015181015167ffffffffffffffff84166000818152600a8452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a350506001016130d1565b505050565b60005b8251811015613259576131ef8382815181106131d7576131d761595f565b6020026020010151600b61426590919063ffffffff16565b15613251578281815181106132065761320661595f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b6001016131b9565b5060005b81518110156131b15761329382828151811061327b5761327b61595f565b6020026020010151600b61428790919063ffffffff16565b156132f5578181815181106132aa576132aa61595f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010161325d565b6040810151604a820151605e90920151909260609290921c91565b6040805173ffffffffffffffffffffffffffffffffffffffff868116602080840191909152908616828401527fffffffffffffffffffff00000000000000000000000000000000000000000000851660608301527fffff00000000000000000000000000000000000000000000000000000000000084166080808401919091528351808403909101815260a09092018352815191810191909120600081815260049092529190205460ff16613469576040517f097e17ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201527fffffffffffffffffffff00000000000000000000000000000000000000000000841660448201527fffff00000000000000000000000000000000000000000000000000000000000083166064820152608401610ff7565b5050505050565b60008061347d8486615c5f565b9050600060248260ff1611156134b75761349b602460ff8416615ae1565b6134a690600a615d98565b6134b090856158bc565b90506134dd565b6134c560ff83166024615ae1565b6134d090600a615d98565b6134da90856158a5565b90505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111156119e8576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015160005b81518110156135ce5760008282815181106135585761355861595f565b602002602001015190506135768160026142a990919063ffffffff16565b156135c55760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b5060010161353b565b50815160005b8151811015610e855760008282815181106135f1576135f161595f565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613661576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61366c600282614287565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a1506001016135d4565b60005b8151811015610ec95760008282815181106136df576136df61595f565b602002602001015160000151905060008383815181106137015761370161595f565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526008845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a250506001016136c2565b60408051808201909152600080825260208201526000826000015190506000808273ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015613814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138389190615dbe565b50935050925050600082121561387a576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138f98473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ee9190615e0e565b876020015185613470565b604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff909216602083015250949350505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610bbe565b836040015163ffffffff168311156139c35760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610ff7565b836020015161ffff16821115613a185760208401516040517fd88dddd60000000000000000000000000000000000000000000000000000000081526004810184905261ffff9091166024820152604401610ff7565b610e8584610200015182614213565b67ffffffffffffffff821660009081526005602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116825263ffffffff7c010000000000000000000000000000000000000000000000000000000090910481169282019290925290831615613b1f576000816020015163ffffffff1642613abc9190615ae1565b90508363ffffffff16811115613b1d576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff8516602482015260448101829052606401610ff7565b505b519392505050565b6000808083815b81811015613df1576000878783818110613b4a57613b4a61595f565b905060400201803603810190613b609190615e2b565b67ffffffffffffffff8c166000908152600a60209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090613c80576101208d0151613c4d9061ffff16662386f26fc100006158a5565b613c579088615b59565b96508c610140015186613c6a9190615e64565b9550613c77602086615e64565b94505050613de9565b604081015160009061ffff1615613d395760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614613cdc578351613cd590612003565b9050613cdf565b508a5b620186a0836040015161ffff16613d218660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166142cb90919063ffffffff16565b613d2b91906158a5565b613d3591906158bc565b9150505b6060820151613d489088615e64565b9650816080015186613d5a9190615e64565b8251909650600090613d799063ffffffff16662386f26fc100006158a5565b905080821015613d9857613d8d818a615b59565b985050505050613de9565b6000836020015163ffffffff16662386f26fc10000613db791906158a5565b905080831115613dd757613dcb818b615b59565b99505050505050613de9565b613de1838b615b59565b995050505050505b600101613b2e565b505096509650969350505050565b60008063ffffffff8316613e15610120866158a5565b613e21876101e0615b59565b613e2b9190615b59565b613e359190615b59565b905060008760c0015163ffffffff168860e0015161ffff1683613e5891906158a5565b613e629190615b59565b61010089015190915061ffff16613e896dffffffffffffffffffffffffffff8916836158a5565b613e9391906158a5565b613ea390655af3107a40006158a5565b98975050505050505050565b60408051808201909152600080825260208201526000613edb858585610160015163ffffffff16612342565b9050826060015163ffffffff1681600001511115613f25576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101e001518015613f3957508060200151155b15610bbb576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603613fef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ff7565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b8151811015610ec95760008282815181106140855761408561595f565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526007875260409081902084518154868a0180518589018051949098167fffffffffffffffffffffff00000000000000000000000000000000000000000090931683177401000000000000000000000000000000000000000060ff92831602177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000009415159490940293909317909355835190815291511697810197909752915115159186019190915292945090929091907fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf9060600160405180910390a2505050806001019050614068565b60608160000180548060200260200160405190810160405280929190818152602001828054801561420757602002820191906000526020600020905b8154815260200190600101908083116141f3575b50505050509050919050565b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610ec9576131b181614308565b6000610bbe8373ffffffffffffffffffffffffffffffffffffffff84166143bb565b6000610bbe8373ffffffffffffffffffffffffffffffffffffffff84166144b5565b6000610bbe8373ffffffffffffffffffffffffffffffffffffffff8416614504565b6000670de0b6b3a76400006142fe837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166158a5565b610bbe91906158bc565b6000815160201461434757816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610ff79190614640565b60008280602001905181019061435d9190615c08565b905073ffffffffffffffffffffffffffffffffffffffff811180614382575061040081105b156111a257826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610ff79190614640565b600081815260018301602052604081205480156144a45760006143df600183615ae1565b85549091506000906143f390600190615ae1565b90508082146144585760008660000182815481106144135761441361595f565b90600052602060002001549050808760000184815481106144365761443661595f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061446957614469615e81565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506111a2565b60009150506111a2565b5092915050565b60008181526001830160205260408120546144fc575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556111a2565b5060006111a2565b600081815260018301602052604081205480156144a4576000614528600183615ae1565b855490915060009061453c90600190615ae1565b90508181146144585760008660000182815481106144135761441361595f565b803573ffffffffffffffffffffffffffffffffffffffff8116811461458057600080fd5b919050565b60008060006060848603121561459a57600080fd5b6145a38461455c565b9250602084013591506145b86040850161455c565b90509250925092565b6000602082840312156145d357600080fd5b610bbe8261455c565b6000815180845260005b81811015614602576020818501810151868301820152016145e6565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610bbe60208301846145dc565b6020808252825182820181905260009190848201906040850190845b818110156146a157835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161466f565b50909695505050505050565b6000602082840312156146bf57600080fd5b813567ffffffffffffffff8111156146d657600080fd5b820160408185031215610bbe57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561473a5761473a6146e8565b60405290565b6040805190810167ffffffffffffffff8111828210171561473a5761473a6146e8565b604051610220810167ffffffffffffffff8111828210171561473a5761473a6146e8565b60405160c0810167ffffffffffffffff8111828210171561473a5761473a6146e8565b6040516060810167ffffffffffffffff8111828210171561473a5761473a6146e8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614814576148146146e8565b604052919050565b600067ffffffffffffffff821115614836576148366146e8565b5060051b60200190565b80151581146111c457600080fd5b803561458081614840565b6000602080838503121561486c57600080fd5b823567ffffffffffffffff81111561488357600080fd5b8301601f8101851361489457600080fd5b80356148a76148a28261481c565b6147cd565b81815260a091820283018401918482019190888411156148c657600080fd5b938501935b838510156149995780858a0312156148e35760008081fd5b6148eb614717565b6148f48661455c565b8152868601357fffffffffffffffffffff00000000000000000000000000000000000000000000811681146149295760008081fd5b818801526040868101357fffff000000000000000000000000000000000000000000000000000000000000811681146149625760008081fd5b90820152606061497387820161455c565b9082015260808681013561498681614840565b90820152835293840193918501916148cb565b50979650505050505050565b803567ffffffffffffffff8116811461458057600080fd5b60008083601f8401126149cf57600080fd5b50813567ffffffffffffffff8111156149e757600080fd5b602083019150836020828501011115611ffc57600080fd5b60008083601f840112614a1157600080fd5b50813567ffffffffffffffff811115614a2957600080fd5b6020830191508360208260051b8501011115611ffc57600080fd5b600080600080600080600080600060c08a8c031215614a6257600080fd5b614a6b8a6149a5565b9850614a7960208b0161455c565b975060408a0135965060608a013567ffffffffffffffff80821115614a9d57600080fd5b614aa98d838e016149bd565b909850965060808c0135915080821115614ac257600080fd5b614ace8d838e016149ff565b909650945060a08c0135915080821115614ae757600080fd5b818c0191508c601f830112614afb57600080fd5b813581811115614b0a57600080fd5b8d60208260061b8501011115614b1f57600080fd5b6020830194508093505050509295985092959850929598565b848152600060208515158184015260806040840152614b5a60808401866145dc565b8381036060850152845180825282820190600581901b8301840184880160005b83811015614bc6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552614bb48383516145dc565b94870194925090860190600101614b7a565b50909b9a5050505050505050505050565b60008060208385031215614bea57600080fd5b823567ffffffffffffffff811115614c0157600080fd5b614c0d858286016149ff565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015614c8757614c7784835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101614c36565b5091979650505050505050565b600060208284031215614ca657600080fd5b610bbe826149a5565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff1690820152604081016111a2565b803561ffff8116811461458057600080fd5b803563ffffffff8116811461458057600080fd5b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461458057600080fd5b60006020808385031215614d5357600080fd5b823567ffffffffffffffff811115614d6a57600080fd5b8301601f81018513614d7b57600080fd5b8035614d896148a28261481c565b8181526102409182028301840191848201919088841115614da957600080fd5b938501935b838510156149995784890381811215614dc75760008081fd5b614dcf614740565b614dd8876149a5565b8152610220807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084011215614e0d5760008081fd5b614e15614763565b9250614e2289890161484e565b83526040614e31818a01614cea565b8a8501526060614e42818b01614cfc565b8286015260809150614e55828b01614cfc565b9085015260a0614e668a8201614cfc565b8286015260c09150614e79828b01614cea565b9085015260e0614e8a8a8201614cfc565b828601526101009150614e9e828b01614cea565b90850152610120614eb08a8201614cea565b828601526101409150614ec4828b01614cea565b90850152610160614ed68a8201614cfc565b828601526101809150614eea828b01614cfc565b908501526101a0614efc8a82016149a5565b828601526101c09150614f10828b01614cfc565b908501526101e0614f228a8201614cfc565b828601526102009150614f36828b0161484e565b90850152614f45898301614d10565b90840152508088019190915283529384019391850191614dae565b81511515815261022081016020830151614f80602084018261ffff169052565b506040830151614f98604084018263ffffffff169052565b506060830151614fb0606084018263ffffffff169052565b506080830151614fc8608084018263ffffffff169052565b5060a0830151614fde60a084018261ffff169052565b5060c0830151614ff660c084018263ffffffff169052565b5060e083015161500c60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff90811691840191909152610160808501518216908401526101808085015167ffffffffffffffff16908401526101a0808501518216908401526101c080850151909116908301526101e080840151151590830152610200808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b600082601f8301126150d757600080fd5b813560206150e76148a28361481c565b82815260069290921b8401810191818101908684111561510657600080fd5b8286015b8481101561515357604081890312156151235760008081fd5b61512b614740565b615134826149a5565b815261514185830161455c565b8186015283529183019160400161510a565b509695505050505050565b6000806040838503121561517157600080fd5b67ffffffffffffffff8335111561518757600080fd5b83601f84358501011261519957600080fd5b6151a96148a2843585013561481c565b8335840180358083526020808401939260059290921b909101018610156151cf57600080fd5b602085358601015b85358601803560051b016020018110156153dc5767ffffffffffffffff8135111561520157600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a0301121561523a57600080fd5b615242614740565b61524e602083016149a5565b815267ffffffffffffffff6040830135111561526957600080fd5b88603f60408401358401011261527e57600080fd5b6152946148a2602060408501358501013561481c565b6020604084810135850182810135808552928401939260e00201018b10156152bb57600080fd5b6040808501358501015b6040858101358601602081013560e00201018110156153bd5760e0818d0312156152ee57600080fd5b6152f6614740565b6152ff8261455c565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f0301121561533357600080fd5b61533b614787565b61534760208401614cfc565b815261535560408401614cfc565b602082015261536660608401614cea565b604082015261537760808401614cfc565b606082015261538860a08401614cfc565b608082015261539a60c0840135614840565b60c083013560a0820152602082810191909152908452929092019160e0016152c5565b50806020840152505080855250506020830192506020810190506151d7565b5092505067ffffffffffffffff602084013511156153f957600080fd5b61540984602085013585016150c6565b90509250929050565b600082601f83011261542357600080fd5b813560206154336148a28361481c565b8083825260208201915060208460051b87010193508684111561545557600080fd5b602086015b848110156151535761546b8161455c565b835291830191830161545a565b6000806040838503121561548b57600080fd5b823567ffffffffffffffff808211156154a357600080fd5b6154af86838701615412565b935060208501359150808211156154c557600080fd5b506154d285828601615412565b9150509250929050565b600080600080604085870312156154f257600080fd5b843567ffffffffffffffff8082111561550a57600080fd5b615516888389016149bd565b9096509450602087013591508082111561552f57600080fd5b5061553c878288016149bd565b95989497509550505050565b6000806040838503121561555b57600080fd5b615564836149a5565b91506154096020840161455c565b60006020828403121561558457600080fd5b813567ffffffffffffffff8082111561559c57600080fd5b90830190604082860312156155b057600080fd5b6155b8614740565b8235828111156155c757600080fd5b6155d387828601615412565b8252506020830135828111156155e857600080fd5b6155f487828601615412565b60208301525095945050505050565b6000602080838503121561561657600080fd5b823567ffffffffffffffff81111561562d57600080fd5b8301601f8101851361563e57600080fd5b803561564c6148a28261481c565b81815260069190911b8201830190838101908783111561566b57600080fd5b928401925b828410156156bd57604084890312156156895760008081fd5b615691614740565b61569a8561455c565b81526156a78686016149a5565b8187015282526040939093019290840190615670565b979650505050505050565b600080604083850312156156db57600080fd5b6156e4836149a5565b9150602083013567ffffffffffffffff81111561570057600080fd5b830160a0818603121561571257600080fd5b809150509250929050565b60ff811681146111c457600080fd5b6000602080838503121561573f57600080fd5b823567ffffffffffffffff81111561575657600080fd5b8301601f8101851361576757600080fd5b80356157756148a28261481c565b81815260079190911b8201830190838101908783111561579457600080fd5b928401925b828410156156bd5783880360808112156157b35760008081fd5b6157bb614740565b6157c48661455c565b81526060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156157f85760008081fd5b6158006147aa565b925061580d88880161455c565b835260408088013561581e8161571d565b848a0152908701359061583082614840565b8301528087019190915282526080939093019290840190615799565b6000806040838503121561585f57600080fd5b6158688361455c565b9150615409602084016149a5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176111a2576111a2615876565b6000826158f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261592c57600080fd5b83018035915067ffffffffffffffff82111561594757600080fd5b6020019150600681901b3603821315611ffc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461458057600080fd5b6000604082840312156159cc57600080fd5b6159d4614740565b6159dd8361455c565b81526159eb6020840161598e565b60208201529392505050565b600060408284031215615a0957600080fd5b615a11614740565b6159dd836149a5565b60006020808385031215615a2d57600080fd5b823567ffffffffffffffff811115615a4457600080fd5b8301601f81018513615a5557600080fd5b8035615a636148a28261481c565b81815260609182028301840191848201919088841115615a8257600080fd5b938501935b838510156149995780858a031215615a9f5760008081fd5b615aa76147aa565b615ab08661455c565b8152615abd87870161598e565b878201526040615ace818801614cfc565b9082015283529384019391850191615a87565b818103818111156111a2576111a2615876565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615b2957600080fd5b83018035915067ffffffffffffffff821115615b4457600080fd5b602001915036819003821315611ffc57600080fd5b808201808211156111a2576111a2615876565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156150be5760049490940360031b84901b1690921692915050565b60008085851115615bc257600080fd5b83861115615bcf57600080fd5b5050820193919092039150565b600060408284031215615bee57600080fd5b615bf6614740565b8251815260208301516159eb81614840565b600060208284031215615c1a57600080fd5b5051919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112615c5557600080fd5b9190910192915050565b60ff81811683821601908111156111a2576111a2615876565b600181815b80851115615cd157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615cb757615cb7615876565b80851615615cc457918102915b93841c9390800290615c7d565b509250929050565b600082615ce8575060016111a2565b81615cf5575060006111a2565b8160018114615d0b5760028114615d1557615d31565b60019150506111a2565b60ff841115615d2657615d26615876565b50506001821b6111a2565b5060208310610133831016604e8410600b8410161715615d54575081810a6111a2565b615d5e8383615c78565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615d9057615d90615876565b029392505050565b6000610bbe8383615cd9565b805169ffffffffffffffffffff8116811461458057600080fd5b600080600080600060a08688031215615dd657600080fd5b615ddf86615da4565b9450602086015193506040860151925060608601519150615e0260808701615da4565b90509295509295909350565b600060208284031215615e2057600080fd5b8151610bbe8161571d565b600060408284031215615e3d57600080fd5b615e45614740565b615e4e8361455c565b8152602083013560208201528091505092915050565b63ffffffff8181168382160190808211156144ae576144ae615876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var FeeQuoterABI = FeeQuoterMetaData.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 c92fba99a78..74d1224a1c6 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 @@ -6,7 +6,7 @@ ccip_encoding_utils: ../../../contracts/solc/v0.8.24/ICCIPEncodingUtils/ICCIPEnc ccip_home: ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.abi ../../../contracts/solc/v0.8.24/CCIPHome/CCIPHome.bin 8c603a0de19c4649d69bdd18774ee3b5edfd24c696aabdb7cdb982bd8e304829 ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 5db06eb7fad07ec0d1ae5ac8d39f61398687fe3cda8290716ce0cd8fb9dca1ab ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de -fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin 0d069b7b8c240c326fdb54ff53b222dea455939ff31e8e87dff1133806a638e4 +fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin 9e0491fe2117abe5538b7297ec6a52307bf3c187fce1409721a89631385da9fc lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin e6a8ec9e8faccb1da7d90e0f702ed72975964f97dc3222b54cfcca0a0ba3fea2 maybe_revert_message_receiver: ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.bin d73956c26232ebcc4a5444429fa99cbefed960e323be9b5a24925885c2e477d5 message_hasher: ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.abi ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.bin ec2d3a92348d8e7b8f0d359b62a45157b9d2c750c01fbcf991826c4392f6e218