0 txs
15.9k calls
constructor
constructor()
functions
attestations
viewfunction attestations(bytes32) view returns (uint256)
attestationsCount
viewfunction attestationsCount(bytes32 attestationKey) view returns (uint8)
attestationThreshold
viewfunction attestationThreshold() view returns (uint256)
BASIS_POINTS_DENOMINATOR
viewfunction BASIS_POINTS_DENOMINATOR() view returns (uint256)
bridge
viewfunction bridge() view returns (address)
bridgeValidatorIDs
viewfunction bridgeValidatorIDs(address) view returns (uint8)
bridgeValidatorRemovalMode
viewfunction bridgeValidatorRemovalMode() view returns (bool)
bridgeValidators
viewfunction bridgeValidators(uint256) view returns (address)
bridgeValidatorsCount
viewfunction bridgeValidatorsCount() view returns (uint256)
btcDeposits
viewfunction btcDeposits(uint256) view returns (uint8)
confirmedUnlocks
viewfunction confirmedUnlocks(uint256) view returns (bool)
ERC20Tokens
viewfunction ERC20Tokens(address) view returns (uint256)
ERC20TokensCount
viewfunction ERC20TokensCount() view returns (uint256)
feeCollector
viewfunction feeCollector() view returns (address)
flatWithdrawalFees
viewfunction flatWithdrawalFees(address) view returns (uint256)
MAX_ERC20_TOKENS
viewfunction MAX_ERC20_TOKENS() view returns (uint256)
minTBTCAmount
viewfunction minTBTCAmount() view returns (uint256)
owner
viewfunction owner() view returns (address)
pendingBTCWithdrawals
viewfunction pendingBTCWithdrawals(bytes32) view returns (bool)
pendingOwner
viewfunction pendingOwner() view returns (address)
percentWithdrawalFeeExempts
viewfunction percentWithdrawalFeeExempts(bytes32) view returns (bool)
refundAuthorizations
viewfunction refundAuthorizations(address) view returns (bool)
reimbursementPool
viewfunction reimbursementPool() view returns (address)
SATOSHI_MULTIPLIER
viewfunction SATOSHI_MULTIPLIER() view returns (uint256)
sequence
viewfunction sequence() view returns (uint256)
SIGNATURE_BYTE_SIZE
viewfunction SIGNATURE_BYTE_SIZE() view returns (uint256)
tbtcRedeemer
viewfunction tbtcRedeemer() view returns (address)
tbtcToken
viewfunction tbtcToken() view returns (address)
tbtcVault
viewfunction tbtcVault() view returns (address)
validateAssetsUnlocked
viewfunction validateAssetsUnlocked(tuple entry) view returns (bool)
withdrawalFee
viewfunction withdrawalFee() view returns (uint256)
acceptOwnership
nonpayablefunction acceptOwnership()
addBridgeValidator
nonpayablefunction addBridgeValidator(address validator)
addPercentWithdrawalFeeExempt
nonpayablefunction addPercentWithdrawalFeeExempt(bytes recipient)
addRefundAuthorization
nonpayablefunction addRefundAuthorization(address receiver)
attestBridgeOut
nonpayablefunction attestBridgeOut(tuple entry)
attestBridgeOutWithSignatures
nonpayablefunction attestBridgeOutWithSignatures(tuple entry, bytes signatures)
bridgeERC20
nonpayablefunction bridgeERC20(address ERC20Token, uint256 amount, address recipient)
bridgeTBTC
nonpayablefunction bridgeTBTC(uint256 amount, address recipient)
bridgeTBTCWithPermit
nonpayablefunction bridgeTBTCWithPermit(uint256 amount, address recipient, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
disableERC20Token
nonpayablefunction disableERC20Token(address ERC20Token)
enableBridgeValidatorRemovalMode
nonpayablefunction enableBridgeValidatorRemovalMode()
enableERC20Token
nonpayablefunction enableERC20Token(address ERC20Token, uint256 minERC20Amount)
finalizeBTCBridging
nonpayablefunction finalizeBTCBridging(uint256 btcDepositKey, address recipient)
initialize
nonpayablefunction initialize(address _tbtcBridge, address _tbtcVault, address _tbtcToken, uint256 _initialSequence)
initializeBTCBridging
nonpayablefunction initializeBTCBridging(tuple fundingTx, tuple reveal, address recipient)
removeBridgeValidator
nonpayablefunction removeBridgeValidator(address validator)
removePercentWithdrawalFeeExempt
nonpayablefunction removePercentWithdrawalFeeExempt(bytes recipient)
removeRefundAuthorization
nonpayablefunction removeRefundAuthorization(address receiver)
renounceOwnership
nonpayablefunction renounceOwnership()
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
updateFeeCollector
nonpayablefunction updateFeeCollector(address _feeCollector)
updateFlatWithdrawalFee
nonpayablefunction updateFlatWithdrawalFee(address token, uint256 flatFee)
updateMinERC20Amount
nonpayablefunction updateMinERC20Amount(address ERC20Token, uint256 newMinERC20Amount)
updateMinTBTCAmount
nonpayablefunction updateMinTBTCAmount(uint256 newMinTBTCAmount)
updateReimbursementPool
nonpayablefunction updateReimbursementPool(address _reimbursementPool)
updateTBTCRedeemer
nonpayablefunction updateTBTCRedeemer(address _tbtcRedeemer)
updateWithdrawalFee
nonpayablefunction updateWithdrawalFee(uint256 _withdrawalFee)
withdrawBTC
nonpayablefunction withdrawBTC(tuple entry, bytes20 walletPubKeyHash, tuple mainUtxo)
events
AssetsLocked
event AssetsLocked(uint256 indexed sequenceNumber, address indexed recipient, address indexed token, uint256 amount)
AssetsUnlockAttested
event AssetsUnlockAttested(address indexed validator, uint256 indexed unlockSequenceNumber, bytes recipient, address token, uint256 amount, uint8 chain)
AssetsUnlockConfirmed
event AssetsUnlockConfirmed(uint256 indexed unlockSequenceNumber, bytes indexed recipient, address indexed token, uint256 amount, uint8 chain)
AssetsUnlockConfirmedMetadata
event AssetsUnlockConfirmedMetadata(uint256 indexed unlockSequenceNumber, bytes recipient)
BridgeValidatorAdded
event BridgeValidatorAdded(address indexed validator, uint8 indexed validatorID)
BridgeValidatorRemovalModeDisabled
event BridgeValidatorRemovalModeDisabled()
BridgeValidatorRemovalModeEnabled
event BridgeValidatorRemovalModeEnabled()
BridgeValidatorRemoved
event BridgeValidatorRemoved(address indexed validator, uint8 indexed validatorID)
BTCDepositFinalized
event BTCDepositFinalized(uint256 indexed btcDepositKey, uint256 initialAmount, uint256 tbtcAmount)
BTCDepositInitialized
event BTCDepositInitialized(uint256 indexed btcDepositKey, address indexed recipient)
ERC20TokenDisabled
event ERC20TokenDisabled(address indexed ERC20Token)
ERC20TokenEnabled
event ERC20TokenEnabled(address indexed ERC20Token, uint256 minERC20Amount)
FeeCollectorUpdated
event FeeCollectorUpdated(address indexed oldCollector, address indexed newCollector)
FlatWithdrawalFeeUpdated
event FlatWithdrawalFeeUpdated(address indexed token, uint256 oldFee, uint256 newFee)
Initialized
event Initialized(uint64 version)
MinERC20AmountUpdated
event MinERC20AmountUpdated(address indexed ERC20Token, uint256 newMinERC20Amount)
MinTBTCAmountUpdated
event MinTBTCAmountUpdated(uint256 minTBTCAmount)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
OwnershipTransferStarted
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)
PercentWithdrawalFeeExemptAdded
event PercentWithdrawalFeeExemptAdded(bytes recipient)
PercentWithdrawalFeeExemptRemoved
event PercentWithdrawalFeeExemptRemoved(bytes recipient)
RefundAuthorizationAdded
event RefundAuthorizationAdded(address indexed receiver)
RefundAuthorizationRemoved
event RefundAuthorizationRemoved(address indexed receiver)
ReimbursementPoolUpdated
event ReimbursementPoolUpdated(address indexed oldReimbursementPool, address indexed newReimbursementPool)
TBTCRedeemerUpdated
event TBTCRedeemerUpdated(address tbtcRedeemer)
WithdrawalFeeCollected
event WithdrawalFeeCollected(address indexed token, address indexed feeCollector, uint256 feeAmount)
WithdrawalFeeUpdated
event WithdrawalFeeUpdated(uint256 oldFee, uint256 newFee)
errors
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
AddressZeroEthereumRecipient
error AddressZeroEthereumRecipient()
AlreadyConfirmedUnlock
error AlreadyConfirmedUnlock(uint256 unlockSequenceNumber)
AmountBelowMinERC20Amount
error AmountBelowMinERC20Amount()
AmountBelowMinTBTCAmount
error AmountBelowMinTBTCAmount()
BridgeValidatorRemovalModeActive
error BridgeValidatorRemovalModeActive()
BridgeValidatorRemovalModeNotActive
error BridgeValidatorRemovalModeNotActive()
BTCRecipientIsZeroAddress
error BTCRecipientIsZeroAddress()
ECDSAInvalidSignature
error ECDSAInvalidSignature()
ECDSAInvalidSignatureLength
error ECDSAInvalidSignatureLength(uint256 length)
ECDSAInvalidSignatureS
error ECDSAInvalidSignatureS(bytes32 s)
ERC20RecipientIsZeroAddress
error ERC20RecipientIsZeroAddress()
ERC20TokenAlreadyEnabled
error ERC20TokenAlreadyEnabled()
ERC20TokenIsZeroAddress
error ERC20TokenIsZeroAddress()
ERC20TokenNotEnabled
error ERC20TokenNotEnabled()
FailedInnerCall
error FailedInnerCall()
InsufficientAmountAfterFees
error InsufficientAmountAfterFees(uint256 amount, uint256 feeAmount)
InvalidAmount
error InvalidAmount(uint256 amount)
InvalidBitcoinRecipient
error InvalidBitcoinRecipient()
InvalidChain
error InvalidChain(uint8 chain)
InvalidEthereumRecipient
error InvalidEthereumRecipient()
InvalidInitialization
error InvalidInitialization()
InvalidRecipient
error InvalidRecipient()
InvalidSignaturesCount
error InvalidSignaturesCount(uint256 signaturesCount)
InvalidToken
error InvalidToken(address token)
InvalidUnlockSequenceNumber
error InvalidUnlockSequenceNumber(uint256 unlockSequenceNumber)
InvalidWithdrawalFee
error InvalidWithdrawalFee(uint256 fee)
MalformedSignaturesVector
error MalformedSignaturesVector()
MaxERC20TokensReached
error MaxERC20TokensReached()
MaxValidatorsReached
error MaxValidatorsReached()
MinERC20AmountIsZero
error MinERC20AmountIsZero()
MinTBTCAmountIsZero
error MinTBTCAmountIsZero()
NotBridgeValidator
error NotBridgeValidator(address signer)
NotEnoughBalanceToFinalize
error NotEnoughBalanceToFinalize(uint256 balance, uint256 tbtcAmount)
NotInitializing
error NotInitializing()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
TBTCApproveAndCallFailed
error TBTCApproveAndCallFailed()
TBTCRedeemerIsZeroAddress
error TBTCRedeemerIsZeroAddress()
TBTCTokenIsZeroAddress
error TBTCTokenIsZeroAddress()
UnexpectedBTCDepositState
error UnexpectedBTCDepositState(uint8 actualState, uint8 expectedState)
UnexpectedExtraData
error UnexpectedExtraData(bytes32 actualExtraData, bytes32 expectedExtraData)
UnknownBTCWithdrawal
error UnknownBTCWithdrawal(bytes32 assetsUnlockedHash)
UnsortedSigners
error UnsortedSigners()
ValidatorAddressZero
error ValidatorAddressZero()
ValidatorAlreadyAttested
error ValidatorAlreadyAttested(address validator, bytes32 attestationKey)
ValidatorAlreadyExists
error ValidatorAlreadyExists(address validator)
ValidatorNotExists
error ValidatorNotExists(address validator)
creation bytecode
0x60806040523480156200001157600080fd5b506200001c62000022565b620000d6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000735760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d35780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b61566a80620000e66000396000f3fe608060405234801561001057600080fd5b50600436106103995760003560e01c80638993b5f8116101e9578063c7ba03471161010f578063d80687ef116100ad578063e5d3d7141161007c578063e5d3d714146107f4578063e78cea9214610807578063f2fde38b1461081a578063f34074801461082d57600080fd5b8063d80687ef146107b0578063dab1b4bd146107d0578063df4d4663146107d9578063e30c3978146107ec57600080fd5b8063cfa498a3116100e9578063cfa498a314610783578063d252bb2c1461078c578063d2c35ce814610795578063d781bd37146107a857600080fd5b8063c7ba034714610741578063c88d47ba1461074d578063cf756fdf1461077057600080fd5b80639a53b07011610187578063aebc314511610156578063aebc3145146106f5578063c09975cd14610708578063c415b95c1461071b578063c49372d81461072e57600080fd5b80639a53b070146106a95780639a6ac455146106bc5780639df60d10146106cf578063ace09eab146106e257600080fd5b80638da5cb5b116101c35780638da5cb5b1461063e578063908d272b14610646578063940992a314610659578063941b1f941461067957600080fd5b80638993b5f8146105ff5780638a82e3e3146106125780638bc7e8c41461063557600080fd5b8063593e17e9116102ce5780636f64aca21161026c578063773573e21161023b578063773573e2146105be57806379ba5097146105d15780637b35b4e6146105d9578063817d00ae146105ec57600080fd5b80636f64aca21461057d578063715018a61461059057806371fb661c1461059857806374ca1279146105ab57600080fd5b806361912174116102a8578063619121741461052157806361e205051461053457806362fe53e11461055757806367a683201461056a57600080fd5b8063593e17e9146104fe5780635d7e10b0146105115780635febd8eb1461051957600080fd5b80632aa352261161033b57806350bb36c21161031557806350bb36c2146104ba578063529d15cc146104c257806354f190e3146104cb578063569b8e2c146104eb57600080fd5b80632aa3522614610487578063427f95681461049a5780634835038a146104ad57600080fd5b80631d7133d6116103775780631d7133d614610436578063225fbcc51461044957806324f90de91461045e57806325ed59d41461047157600080fd5b8063081ce9691461039e5780630f36403a146103d857806318b1e16814610403575b600080fd5b6103c16103ac366004614567565b60976020526000908152604090205460ff1681565b60405160ff90911681526020015b60405180910390f35b6001546103eb906001600160a01b031681565b6040516001600160a01b0390911681526020016103cf565b610426610411366004614584565b60a16020526000908152604090205460ff1681565b60405190151581526020016103cf565b6034546103eb906001600160a01b031681565b61045c610457366004614567565b610840565b005b61045c61046c36600461459d565b610894565b610479604181565b6040519081526020016103cf565b6103c1610495366004614584565b610ace565b61045c6104a83660046145de565b610aec565b609f546104269060ff1681565b610479610c5a565b61047960955481565b6104796104d9366004614567565b60a06020526000908152604090205481565b61045c6104f9366004614584565b610c88565b61045c61050c366004614638565b610d15565b61045c610dbc565b610479601481565b61045c61052f366004614664565b610e39565b610426610542366004614584565b609a6020526000908152604090205460ff1681565b61045c610565366004614584565b610f5d565b61045c610578366004614638565b610fda565b61045c61058b3660046146a6565b611156565b61045c611296565b61045c6105a6366004614567565b6112aa565b61045c6105b9366004614567565b611368565b61045c6105cc366004614808565b61141a565b61045c611669565b61045c6105e7366004614567565b6116ca565b6104266105fa3660046149b2565b61173c565b61045c61060d3660046149ef565b611a75565b610426610620366004614584565b60996020526000908152604090205460ff1681565b610479609b5481565b6103eb611eba565b61045c610654366004614638565b611eef565b610479610667366004614584565b60986020526000908152604090205481565b61069c610687366004614584565b60326020526000908152604090205460ff1681565b6040516103cf9190614a8e565b61045c6106b7366004614567565b611fcf565b61045c6106ca366004614567565b612240565b61045c6106dd366004614ae5565b612291565b61045c6106f0366004614567565b612617565b6103eb610703366004614584565b6127a9565b609d546103eb906001600160a01b031681565b609c546103eb906001600160a01b031681565b61045c61073c366004614b4e565b6127d3565b6104796402540be40081565b61042661075b366004614567565b609e6020526000908152604090205460ff1681565b61045c61077e366004614b90565b61288a565b61047961271081565b61047960635481565b61045c6107a3366004614567565b612a1c565b609654610479565b6104796107be366004614567565b60646020526000908152604090205481565b61047960335481565b61045c6107e736600461459d565b612a8e565b6103eb612acd565b6031546103eb906001600160a01b031681565b6000546103eb906001600160a01b031681565b61045c610828366004614567565b612af6565b61045c61083b366004614b4e565b612b93565b610848612c01565b6001600160a01b0381166000818152609e6020526040808220805460ff19166001179055517fc93ba6b98e36dd6aad0f4fafd13bf5befa3e2d1c3b15da811af870cb5a8e2d2d9190a250565b600160008381526032602052604090205460ff1660028111156108b9576108b9614a24565b1461091057600082815260326020526040908190205490517fed33029f0000000000000000000000000000000000000000000000000000000081526109079160ff1690600190600401614be1565b60405180910390fd5b6000828152603260205260408120805460ff191660021790558061093384612c4c565b604080516001600160a01b03881660208083019190915282518083038201815291830190925280519101209294509250508082146109a7576040517fd961e24c0000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610907565b6031546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2d9190614bfc565b905083811015610a73576040517f17c7cec70000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604401610907565b604080518581526020810186905287917fa81d3c9594b1f3363bfc07d9277c4624e0da8dae3b42d466f1edc0718c62ab53910160405180910390a2603154610ac69086906001600160a01b031686612ecc565b505050505050565b600081815260986020526040812054610ae690612f2c565b92915050565b610af4612f5b565b6031546040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015287916001600160a01b03169063dd62ed3e90604401602060405180830381865afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f9190614bfc565b1015610c27576031546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526064810186905260ff8516608482015260a4810184905260c481018390526001600160a01b039091169063d505accf9060e401600060405180830381600087803b158015610c0e57600080fd5b505af1158015610c22573d6000803e3d6000fd5b505050505b610c318686612fdc565b610ac660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b609654600090600390610c6e906002614c44565b610c789190614c8a565b610c83906001614c9e565b905090565b610c90612c01565b612710811115610ccf576040517ffef6049900000000000000000000000000000000000000000000000000000000815260048101829052602401610907565b609b80549082905560408051828152602081018490527f72aa1ef4707dfa7defd1468e6ffc70bf9517ce19e3afad93fcf4be42f2d494f591015b60405180910390a15050565b610d1d612c01565b6001600160a01b038216610d5d576040517f09efa31000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815260a06020908152604091829020805490859055825181815291820185905292917f7cf495d0721b90f9bc8526386d68044b3089d9bb4f7da168c43b6ef149d01f44910160405180910390a2505050565b610dc4612c01565b609f5460ff1615610e01576040517f4650e20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5fdb6462f7e6c03fd91563abe4f995cd30b93a004808b757898a267f3477005890600090a1609f805460ff19166001179055565b610e41612f5b565b6001600160a01b03831660009081526064602052604081205490819003610e94576040517f881b8d7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216610ed4576040517f478b9dda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831015610f0e576040517f542f23f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f19828585612ecc565b610f2e6001600160a01b0385163330866130aa565b50610f5860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b610f65612c01565b80600003610f9f576040517f4b81b6b900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60338190556040518181527fe64dbc80c2152cea46e3b80ba80f3e8c125114dc79194e9c947b480cfc80e59c9060200160405180910390a150565b610fe2612c01565b6001600160a01b038216611022576040517f09efa31000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060000361105c576040517f47fba16a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600090815260646020526040902054156110ac576040517f98f1758300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6014606354106110e8576040517f17dfdea400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606380549060006110f883614cb1565b90915550506001600160a01b03821660008181526064602052604090819020839055517ff17d094161c4f2776fc9caa30094c8ebe1b86cd6f2108db5d9f1d46d8f85494c9061114a9084815260200190565b60405180910390a25050565b6001600160a01b038116611196576040517fb9c50bfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b03831660208201526000916111d09186918691016040516020818303038152906040528051906020012061312c565b5090506000808281526032602052604090205460ff1660028111156111f7576111f7614a24565b14611244576000818152603260205260408082205490517fed33029f0000000000000000000000000000000000000000000000000000000081526109079260ff9092169190600401614be1565b600081815260326020526040808220805460ff19166001179055516001600160a01b0384169183917f2fbc945bad45e66509bad2bda7b97993796881f9ac2543b827d2aaf69f1869239190a350505050565b61129e612c01565b6112a8600061330a565b565b6112b2612c01565b6001600160a01b0381166112f2576040517fa824775d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b03821681527fddd1da2f7284499afb480d8077281643c55f73d47bf490047baf68a57c1fa4509060200160405180910390a1603480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b611370612c01565b6001600160a01b03811660009081526064602052604081205490036113c1576040517f881b8d7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606380549060006113d183614ce9565b90915550506001600160a01b038116600081815260646020526040808220829055517f9c4edffd5782d54d432f513a2a7d944aac6f743c7ef4a83d8c6189ba21dd42999190a250565b611422612f5b565b60408051606081018252338152600160208201526000918101829052905a90506000856040516020016114559190614e1c565b60408051601f1981840301815291815281516020928301206000818152609a90935291205490915060ff166114b9576040517fe198d21d00000000000000000000000000000000000000000000000000000000815260048101829052602401610907565b6000818152609a6020526040808220805460ff19169055611530906114e49060608a01908a01614567565b60608901356114f660208b018b614e2f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061335a92505050565b905061154a868661154460208b018b614e2f565b856134b1565b5050609d546001600160a01b031680611564575050610f2e565b8260200151801561158f575082516001600160a01b03166000908152609e602052604090205460ff16155b1561159b575050610f2e565b806001600160a01b0316637ad226dc84604001515a6115ba9086614e94565b6115c49190614c9e565b855160405160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260048101929092526001600160a01b03166024820152604401600060405180830381600087803b15801561162557600080fd5b505af1158015611639573d6000803e3d6000fd5b50505050505050610f5860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b3380611673612acd565b6001600160a01b0316146116be576040517f118cdaa70000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610907565b6116c78161330a565b50565b6116d2612c01565b609d80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f5bbcb3a116ba7a2cf2d8993632f77a782fb70b51720910c297a0e1261a4183a990600090a35050565b8051600090810361177f5781516040517fcd5bd4730000000000000000000000000000000000000000000000000000000081526004810191909152602401610907565b81606001516000036117c55781606001516040517f3728b83d00000000000000000000000000000000000000000000000000000000815260040161090791815260200190565b60315460808301516001600160a01b039091169060ff166119145782602001515160141461181f576040517fb5ff4cea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083015160009061183090614ea7565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001603611889576040517ffffaaa0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b031683604001516001600160a01b0316141580156118c757506040808401516001600160a01b0316600090815260646020522054155b1561190f5760408084015190517f961c9a4f0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610907565b611a1b565b600160ff16836080015160ff16036119de576020830151805160009161193b9183906135c1565b90508051600003611978576040517f8e4d13e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600160a01b031684604001516001600160a01b0316146119d85760408085015190517f961c9a4f0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610907565b50611a1b565b60808301516040517f4d1cb5b000000000000000000000000000000000000000000000000000000000815260ff9091166004820152602401610907565b825160009081526099602052604090205460ff1615611a6c5782516040517fae8007750000000000000000000000000000000000000000000000000000000081526004810191909152602401610907565b50600192915050565b611a7d612f5b565b6040518060600160405280336001600160a01b031681526020016000151581526020016103e881525060005a3360009081526097602052604081205491925060ff90911690819003611afd576040517f16254bd3000000000000000000000000000000000000000000000000000000008152336004820152602401610907565b600084604051602001611b109190614e1c565b60408051601f1981840301815291815281516020928301206000818152609890935291205490915080158015611b485750609f5460ff165b15611b7f576040517f4650e20200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160ff84161b81811615611bc9576040517fe970c16300000000000000000000000000000000000000000000000000000000815233600482015260248101849052604401610907565b6000838152609860209081526040909120838317908190559088359033907f67427a9ff7b7a8bc19eeb98172dd4c920e53f548a3854807bafd7de9c0814bb790611c15908c018c614e2f565b611c2560608e0160408f01614567565b8d606001358e6080016020810190611c3d9190614ef7565b604051611c4e959493929190614f12565b60405180910390a3611c5e610c5a565b611c6782612f2c565b60ff161015611c7a575050505050611d9c565b611c866105fa89614f4f565b50611c976060890160408a01614567565b6001600160a01b0316611cad60208a018a614e2f565b604051611cbb929190614f5b565b60405190819003902089357ff3c1d15f8136332d14fce7c55a0179e59c44cb75d928d363b05cb22a1c36e9fd60608c0135611cfc60a08e0160808f01614ef7565b6040805192835260ff90911660208301520160405180910390a487357f3a24d3c2a6b177a835cbf8f854944d6bd20ad08538f9d962cc63c5f59da69e73611d4660208b018b614e2f565b604051611d54929190614f6b565b60405180910390a287356000908152609960209081526040808320805460ff191660011790558683526098909152812055611d96611d9189614f4f565b6138c6565b50505050505b609d546001600160a01b031680611db4575050611e90565b82602001518015611ddf575082516001600160a01b03166000908152609e602052604090205460ff16155b15611deb575050611e90565b806001600160a01b0316637ad226dc84604001515a611e0a9086614e94565b611e149190614c9e565b855160405160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260048101929092526001600160a01b03166024820152604401600060405180830381600087803b158015611e7557600080fd5b505af1158015611e89573d6000803e3d6000fd5b5050505050505b506116c760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b611ef7612c01565b6001600160a01b0382166000908152606460205260408120549003611f48576040517f881b8d7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003611f82576040517f47fba16a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821660008181526064602052604090819020839055517f886950a2d9ce5c7d214261968375335366c8547e3e5eb5e1744c3cb581c4a6729061114a9084815260200190565b611fd7612c01565b609f5460ff16612013576040517f23951ebe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811660009081526097602052604081205460ff1690819003612074576040517f958b194b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610907565b6000612081600183614f7f565b60ff1690506000600160968054905061209a9190614e94565b9050808214612144576000609682815481106120b8576120b8614f98565b600091825260209091200154609680546001600160a01b0390921692508291859081106120e7576120e7614f98565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03948516179055929091168152609790915260409020805460ff191660ff85161790555b6001600160a01b0384166000908152609760205260409020805460ff19169055609680548061217557612175614fc7565b60008281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055909101909155609f805460ff1916905560405160ff8516916001600160a01b038716917f554a8f601798186cfa197105ef51dde890562b8887e7f8f441c7e330f2346d6c9190a36040517f101528fcb7f3f4dfe132b7df0ba88bf1c2f0e0e6a13e518a40bac7b87f0846f690600090a150505050565b612248612c01565b6001600160a01b0381166000818152609e6020526040808220805460ff19169055517f2eed1c57963cce0faf8699139c3b5ba3114e419dd7b7655a8ebde907995a23f39190a250565b612299612f5b565b60408051606081018252338152600160208201526132c89181019190915260005a90506122c86105fa86614f4f565b506122d4604184614ff6565b1561230b576040517fc32cb4d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612318604185614c8a565b9050612322610c5a565b811461235d576040517f2b68e7bd00000000000000000000000000000000000000000000000000000000815260048101829052602401610907565b60006123be468860405160200161237592919061500a565b604051602081830303815290604052805190602001207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905060606000805b848110156124f75788886123db836041614c44565b906123e7846001614c9e565b6123f2906041614c44565b926123ff93929190615023565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939650612442925087915086905061397c565b6001600160a01b03811660009081526097602052604081205491925060ff90911690036124a6576040517f16254bd30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610907565b6001600160a01b0380841690821611806124ec576040517fd02ef0e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5091506001016123c6565b5061250860608a0160408b01614567565b6001600160a01b031661251e60208b018b614e2f565b60405161252c929190614f5b565b60405180910390208a600001357ff3c1d15f8136332d14fce7c55a0179e59c44cb75d928d363b05cb22a1c36e9fd8c606001358d60800160208101906125729190614ef7565b6040805192835260ff90911660208301520160405180910390a488357f3a24d3c2a6b177a835cbf8f854944d6bd20ad08538f9d962cc63c5f59da69e736125bc60208c018c614e2f565b6040516125ca929190614f6b565b60405180910390a288356000908152609960205260409020805460ff191660011790556125f9611d918a614f4f565b5050609d546001600160a01b03169150819050611564575050610f2e565b61261f612c01565b6001600160a01b03811661265f576040517f67170c8b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811660009081526097602052604090205460ff16156126bd576040517f591a237c0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610907565b60965460ff116126f9576040517fed7948d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680546001810182557f6aa7ec8ac2a999a90ce6c78668dffe4e487e2576a97ca366ec81ecb335af90d00180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091559054600082815260976020526040808220805460ff191660ff851690811790915590519293909290917fdde8f6ead332aad593653167d67449309db9bfb202d7d394e68fd3e1b7c1600791a35050565b609681815481106127b957600080fd5b6000918252602090912001546001600160a01b0316905081565b6127db612c01565b6000819003612816576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160a16000848460405161282c929190614f5b565b6040518091039020815260200190815260200160002060006101000a81548160ff0219169083151502179055507f2a069e08db4526ad7f2fb1d6388a3b7292f940aa5216facd4680d8dfcb6a17fa8282604051610d09929190614f6b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156128d55750825b905060008267ffffffffffffffff1660011480156128f25750303b155b905081158015612900575080155b15612937576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156129985784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6129a38989896139a6565b6129ab613a48565b60958690558315612a115784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b612a24612c01565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f5d16ad41baeb009cd23eb8f6c7cde5c2e0cd5acf4a33926ab488875c37c37f3890600090a35050565b612a96612f5b565b612aa08282612fdc565b612ac960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00611edf565b612afe612c01565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081178255612b5a611eba565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b612b9b612c01565b60a160008383604051612baf929190614f5b565b6040805191829003909120825260208201929092528101600020805460ff19169055517f879f966987f4c630b5331c2485e6f1653598fbfe4c59652efe9dcceaaa65199690610d099084908490614f6b565b33612c0a611eba565b6001600160a01b0316146112a8576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610907565b600080546040517fb02c43d0000000000000000000000000000000000000000000000000000000008152600481018490528291829182916001600160a01b03169063b02c43d09060240160e060405180830381865afa158015612cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd79190615063565b9050806040015163ffffffff16600003612d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4465706f736974206e6f7420696e697469616c697a65640000000000000000006044820152606401610907565b6001546040517f6c626aa4000000000000000000000000000000000000000000000000000000008152600481018790526000916001600160a01b031690636c626aa49060240160408051808303816000875af1158015612db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd59190615117565b9150508160a0015163ffffffff166000141580612dfb575067ffffffffffffffff811615155b612e87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4465706f736974206e6f742066696e616c697a6564206279207468652062726960448201527f64676500000000000000000000000000000000000000000000000000000000006064820152608401610907565b6402540be400826020015167ffffffffffffffff16612ea69190614c44565b9450612eba82602001518360800151613a60565b93508160c00151925050509193909250565b816001600160a01b0316836001600160a01b0316609560008154612eef90614cb1565b91829055506040518481527f75aa5616721471b8ab0c49ce59500cbad2b7ef1ad10e5eb9449c693c0a5c8fd19060200160405180910390a4505050565b60005b8115612f5657612f40600183614e94565b9091169080612f4e81615146565b915050612f2f565b919050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612fd6576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6001600160a01b03811661301c576040517fb9c50bfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603354821015613058576040517f0b84d72c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6031546001600160a01b031661306f828285612ecc565b610f586001600160a01b0382163330866130aa565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040516001600160a01b0384811660248301528381166044830152606482018390526131269186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613be3565b50505050565b60015460009081906001600160a01b031661314d60c0860160a08701614567565b6001600160a01b0316146131bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5661756c742061646472657373206d69736d61746368000000000000000000006044820152606401610907565b6131db6131c986613c5f565b6131d66020870187615165565b613cc4565b6000546040517f86f014390000000000000000000000000000000000000000000000000000000081529193506001600160a01b0316906386f0143990613229908890889088906004016151b2565b600060405180830381600087803b15801561324357600080fd5b505af1158015613257573d6000803e3d6000fd5b50506000546040517fb02c43d0000000000000000000000000000000000000000000000000000000008152600481018690526402540be40093506001600160a01b03909116915063b02c43d09060240160e060405180830381865afa1580156132c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e89190615063565b6020015167ffffffffffffffff166133009190614c44565b9050935093915050565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155612ac982613d26565b609c546000906001600160a01b03168061337757839150506134aa565b8251602080850191909120600090815260a1909152604081205460ff166133a057609b546133a3565b60005b6001600160a01b038716600090815260a06020526040812054919250906127106133cd8489614c44565b6133d79190614c8a565b6133e19190614c9e565b9050806000036133f6578593505050506134aa565b858110613439576040517f2fb193ac0000000000000000000000000000000000000000000000000000000081526004810187905260248101829052604401610907565b826001600160a01b0316876001600160a01b03167fe55980a387d8b6f11ede459bd7e71fe1e0dd649c3b4caa62db722cdcf386805a8360405161347e91815260200190565b60405180910390a361349a6001600160a01b0388168483613daf565b6134a48187614e94565b93505050505b9392505050565b603454845160208087015160408089015190516000956134e7956001600160a01b03909116948c94919391928b918b910161536d565b60408051601f19818403018152908290526031546001547fcae9ca510000000000000000000000000000000000000000000000000000000084529193506001600160a01b039081169263cae9ca519261354892169086908690600401615437565b6020604051808303816000875af1158015613567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358b9190615468565b610ac6576040517f6c85d7be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606060008484815181106135d7576135d7614f98565b016020015160f81c9050826135ed82600161548a565b60ff161461360b5750506040805160208101909152600081526134aa565b84613617856001614c9e565b8151811061362757613627614f98565b016020015160f81c6000036136e65760028160ff1610156136585750506040805160208101909152600081526134aa565b600085613666866002614c9e565b8151811061367657613676614f98565b016020015160f81c905061368b600283614f7f565b60ff16811415806136a95750806020141580156136a9575080601414155b156136c75760405180602001604052806000815250925050506134aa565b6136dd6136d5866003614c9e565b879083613de0565b925050506134aa565b60006136f28686613ec7565b90507fffffff000000000000000000000000000000000000000000000000000000000081167f1976a90000000000000000000000000000000000000000000000000000000000036138065785613749866003614c9e565b8151811061375957613759614f98565b60209101015160f81c60141415806137d1575061378c600261377b8688614c9e565b6137859190614e94565b8790613ec7565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f88ac00000000000000000000000000000000000000000000000000000000000014155b156137ef5760405180602001604052806000815250925050506134aa565b6136dd6137fd866004614c9e565b87906014613de0565b7fffffff000000000000000000000000000000000000000000000000000000000081167f17a9140000000000000000000000000000000000000000000000000000000000036138ad5785600161385c8688614c9e565b6138669190614e94565b8151811061387657613876614f98565b60209101015160f81c60871461389f5760405180602001604052806000815250925050506134aa565b6136dd6137fd866003614c9e565b5050506040805160208101909152600081529392505050565b608081015160ff1661391c57600081602001516138e290614ea7565b60601c9050600061390083604001518460600151856020015161335a565b6040840151909150610f58906001600160a01b03168383613daf565b600160ff16816080015160ff16036116c7576001609a60008360405160200161394591906154a3565b60408051808303601f19018152918152815160209283012083529082019290925201600020805460ff191691151591909117905550565b60008060008061398c8686613ed6565b92509250925061399c8282613f23565b5090949350505050565b6139b08383614027565b6139b9336141fb565b6139c161420c565b6001600160a01b038116613a01576040517fe747bdc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555050662386f26fc10000603355565b613a51336141fb565b613a5961420c565b6000606355565b6000806402540be400613a7384866154ff565b67ffffffffffffffff16613a879190614c44565b90506000600160009054906101000a90046001600160a01b03166001600160a01b03166309b53f516040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b029190615527565b63ffffffff1690506000808211613b1a576000613b24565b613b248284614c8a565b905060008060009054906101000a90046001600160a01b03166001600160a01b031663c42b64d06040518163ffffffff1660e01b8152600401608060405180830381865afa158015613b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9e9190615544565b509250505060006402540be4008267ffffffffffffffff16613bc09190614c44565b905080613bcd8487614e94565b613bd79190614e94565b98975050505050505050565b6000613bf86001600160a01b0384168361421c565b90508051600014158015613c1d575080806020019051810190613c1b9190615468565b155b15610f58576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610907565b6000610ae6613c7160208401846155a3565b613c7e6020850185614e2f565b613c8b6040870187614e2f565b613c9b6080890160608a016155a3565b604051602001613cb0969594939291906155be565b60405160208183030381529060405261422a565b60008282604051602001613d0792919091825260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60408051601f1981840301815291905280516020909101209392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6040516001600160a01b03838116602483015260448201839052610f5891859182169063a9059cbb906064016130df565b606081600003613dff57506040805160208101909152600081526134aa565b6000613e0b8385614c9e565b90508381118015613e1d575080855110155b613e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f536c696365206f7574206f6620626f756e6473000000000000000000000000006044820152606401610907565b604051915082604083010160405282825283850182038460208701018481015b80821015613ebc57815183830152602082019150613ea3565b505050509392505050565b60006134aa8383016020015190565b60008060008351604103613f105760208401516040850151606086015160001a613f0288828585614251565b955095509550505050613f1c565b50508151600091506002905b9250925092565b6000826003811115613f3757613f37614a24565b03613f40575050565b6001826003811115613f5457613f54614a24565b03613f8b576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115613f9f57613f9f614a24565b03613fd9576040517ffce698f700000000000000000000000000000000000000000000000000000000815260048101829052602401610907565b6003826003811115613fed57613fed614a24565b03612ac9576040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260048101829052602401610907565b6000546001600160a01b031615801561404957506001546001600160a01b0316155b6140d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4162737472616374544254434465706f7369746f7220616c726561647920696e60448201527f697469616c697a656400000000000000000000000000000000000000000000006064820152608401610907565b6001600160a01b038216614145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f42726964676520616464726573732063616e6e6f74206265207a65726f0000006044820152606401610907565b6001600160a01b0381166141b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f544254435661756c7420616464726573732063616e6e6f74206265207a65726f6044820152606401610907565b600080546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560018054929093169116179055565b614203614320565b6116c781614387565b614214614320565b6112a86143d2565b60606134aa838360006143da565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561428c5750600091506003905082614316565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156142e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661430c57506000925060019150829050614316565b9250600091508190505b9450945094915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166112a8576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61438f614320565b6001600160a01b0381166116be576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610907565b613084614320565b606081471015614418576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610907565b600080856001600160a01b031684866040516144349190615618565b60006040518083038185875af1925050503d8060008114614471576040519150601f19603f3d011682016040523d82523d6000602084013e614476565b606091505b5091509150614486868383614490565b9695505050505050565b6060826144a5576144a082614505565b6134aa565b81511580156144bc57506001600160a01b0384163b155b156144fe576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610907565b50806134aa565b8051156145155780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811681146116c757600080fd5b8035612f5681614547565b60006020828403121561457957600080fd5b81356134aa81614547565b60006020828403121561459657600080fd5b5035919050565b600080604083850312156145b057600080fd5b8235915060208301356145c281614547565b809150509250929050565b803560ff81168114612f5657600080fd5b60008060008060008060c087890312156145f757600080fd5b86359550602087013561460981614547565b94506040870135935061461e606088016145cd565b92506080870135915060a087013590509295509295509295565b6000806040838503121561464b57600080fd5b823561465681614547565b946020939093013593505050565b60008060006060848603121561467957600080fd5b833561468481614547565b925060208401359150604084013561469b81614547565b809150509250925092565b60008060008385036101008112156146bd57600080fd5b843567ffffffffffffffff8111156146d457600080fd5b8501608081880312156146e657600080fd5b935060c0601f19820112156146fa57600080fd5b5060208401915060e084013561469b81614547565b600060a0828403121561472157600080fd5b50919050565b80357fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081168114612f5657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156147a9576147a9614757565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156147d8576147d8614757565b604052919050565b63ffffffff811681146116c757600080fd5b67ffffffffffffffff811681146116c757600080fd5b600080600083850360a081121561481e57600080fd5b843567ffffffffffffffff8082111561483657600080fd5b6148428883890161470f565b955061485060208801614727565b945060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561488257600080fd5b604051925060608301915082821081831117156148a1576148a1614757565b506040908152850135815260608501356148ba816147e0565b602082015260808501356148cd816147f2565b604082015292959194509192509050565b600060a082840312156148f057600080fd5b6148f8614786565b90508135815260208083013567ffffffffffffffff8082111561491a57600080fd5b818501915085601f83011261492e57600080fd5b81358181111561494057614940614757565b61495284601f19601f840116016147af565b9150808252868482850101111561496857600080fd5b80848401858401376000908201840152918301919091525061498c6040830161455c565b6040820152606082013560608201526149a7608083016145cd565b608082015292915050565b6000602082840312156149c457600080fd5b813567ffffffffffffffff8111156149db57600080fd5b6149e7848285016148de565b949350505050565b600060208284031215614a0157600080fd5b813567ffffffffffffffff811115614a1857600080fd5b6149e78482850161470f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110614a8a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610ae68284614a53565b60008083601f840112614aae57600080fd5b50813567ffffffffffffffff811115614ac657600080fd5b602083019150836020828501011115614ade57600080fd5b9250929050565b600080600060408486031215614afa57600080fd5b833567ffffffffffffffff80821115614b1257600080fd5b614b1e8783880161470f565b94506020860135915080821115614b3457600080fd5b50614b4186828701614a9c565b9497909650939450505050565b60008060208385031215614b6157600080fd5b823567ffffffffffffffff811115614b7857600080fd5b614b8485828601614a9c565b90969095509350505050565b60008060008060808587031215614ba657600080fd5b8435614bb181614547565b93506020850135614bc181614547565b92506040850135614bd181614547565b9396929550929360600135925050565b60408101614bef8285614a53565b6134aa6020830184614a53565b600060208284031215614c0e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610ae657610ae6614c15565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614c9957614c99614c5b565b500490565b80820180821115610ae657610ae6614c15565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614ce257614ce2614c15565b5060010190565b600081614cf857614cf8614c15565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614d5357600080fd5b830160208101925035905067ffffffffffffffff811115614d7357600080fd5b803603821315614ade57600080fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b803582526000614dc06020830183614d1e565b60a06020860152614dd560a086018284614d82565b9150506040830135614de681614547565b6001600160a01b031660408501526060838101359085015260ff614e0c608085016145cd565b1660808501528091505092915050565b6020815260006134aa6020830184614dad565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614e6457600080fd5b83018035915067ffffffffffffffff821115614e7f57600080fd5b602001915036819003821315614ade57600080fd5b81810381811115610ae657610ae6614c15565b6000815160208301517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000080821693506014831015614eef5780818460140360031b1b83161693505b505050919050565b600060208284031215614f0957600080fd5b6134aa826145cd565b608081526000614f26608083018789614d82565b6001600160a01b0395909516602083015250604081019290925260ff1660609091015292915050565b6000610ae636836148de565b8183823760009101908152919050565b6020815260006149e7602083018486614d82565b60ff8281168282160390811115610ae657610ae6614c15565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008261500557615005614c5b565b500690565b8281526040602082015260006149e76040830184614dad565b6000808585111561503357600080fd5b8386111561504057600080fd5b5050820193919092039150565b8051612f56816147f2565b8051612f56816147e0565b600060e0828403121561507557600080fd5b60405160e0810181811067ffffffffffffffff8211171561509857615098614757565b60405282516150a681614547565b815260208301516150b6816147f2565b602082015260408301516150c9816147e0565b604082015260608301516150dc81614547565b60608201526150ed6080840161504d565b60808201526150fe60a08401615058565b60a082015260c083015160c08201528091505092915050565b6000806040838503121561512a57600080fd5b8251615135816147f2565b60208401519092506145c2816147f2565b600060ff821660ff810361515c5761515c614c15565b60010192915050565b60006020828403121561517757600080fd5b81356134aa816147e0565b80357fffffffff0000000000000000000000000000000000000000000000000000000081168114612f5657600080fd5b60006101008083527fffffffff00000000000000000000000000000000000000000000000000000000806151e588615182565b16828501526151f76020880188614d1e565b9250608061012086015261521061018086018483614d82565b9250506152206040880188614d1e565b60ff1986850301610140870152615238848284614d82565b935050508061524960608901615182565b16610160850152509050833561525e816147e0565b63ffffffff811660208401525060208401357fffffffffffffffff000000000000000000000000000000000000000000000000811680821461529f57600080fd5b80604085015250507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000006152d460408601614727565b1660608301526152e660608501614727565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000811660808401525061531b60808501615182565b7fffffffff00000000000000000000000000000000000000000000000000000000811660a08401525061535060a0850161455c565b6001600160a01b031660c083015260e09091019190915292915050565b6001600160a01b03881681527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008716602082015285604082015263ffffffff8516606082015267ffffffffffffffff8416608082015260c060a082015260006153da60c083018486614d82565b9998505050505050505050565b60005b838110156154025781810151838201526020016153ea565b50506000910152565b600081518084526154238160208601602086016153e7565b601f01601f19169290920160200192915050565b6001600160a01b038416815282602082015260606040820152600061545f606083018461540b565b95945050505050565b60006020828403121561547a57600080fd5b815180151581146134aa57600080fd5b60ff8181168382160190811115610ae657610ae6614c15565b60208152815160208201526000602083015160a060408401526154c960c084018261540b565b90506001600160a01b0360408501511660608401526060840151608084015260ff60808501511660a08401528091505092915050565b67ffffffffffffffff82811682821603908082111561552057615520614c15565b5092915050565b60006020828403121561553957600080fd5b81516134aa816147e0565b6000806000806080858703121561555a57600080fd5b8451615565816147f2565b6020860151909450615576816147f2565b6040860151909350615587816147f2565b6060860151909250615598816147e0565b939692955090935050565b6000602082840312156155b557600080fd5b6134aa82615182565b60007fffffffff000000000000000000000000000000000000000000000000000000008089168352868860048501378683016004810160008152868882375093169390920160048101939093525050600801949350505050565b6000825161562a8184602087016153e7565b919091019291505056fea26469706673582212200250a975903d028feccceeafc933f36096a5a0107b364b170dadee25debd9b1d64736f6c63430008180033