0 txs
40.4k calls
constructor
constructor(address factory)
functions
allocateModule
viewfunction allocateModule() view returns (address)
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
asset
viewfunction asset() view returns (address)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
cachedTotalAssets
viewfunction cachedTotalAssets() view returns (uint256)
convertToAssets
viewfunction convertToAssets(uint256 shares) view returns (uint256)
convertToShares
viewfunction convertToShares(uint256 assets) view returns (uint256)
decimals
viewfunction decimals() view returns (uint8)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
factory
viewfunction factory() view returns (address)
getDeallocationOrder
viewfunction getDeallocationOrder() view returns (address[] order)
getDepositLimits
viewfunction getDepositLimits() view returns (uint256, uint256)
getFeeConfig
viewfunction getFeeConfig() view returns (uint16 currentManagementFee, address currentManagementFeeRecipient, uint32 currentLastManagementFeeAccrual, uint16 currentPerformanceFee, address currentPerformanceFeeRecipient)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getRoleMember
viewfunction getRoleMember(bytes32 role, uint256 index) view returns (address)
getRoleMemberCount
viewfunction getRoleMemberCount(bytes32 role) view returns (uint256)
getRoleMembers
viewfunction getRoleMembers(bytes32 role) view returns (address[])
getStrategies
viewfunction getStrategies() view returns (address[])
getStrategyData
viewfunction getStrategyData(address strategy) view returns (tuple)
getTotalAllocated
viewfunction getTotalAllocated() view returns (uint256 totalAllocated)
getWithdrawLimits
viewfunction getWithdrawLimits() view returns (uint256, uint256)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
managementFee
viewfunction managementFee() view returns (address, uint16, uint32)
maxDeposit
viewfunction maxDeposit(address) view returns (uint256)
maxMint
viewfunction maxMint(address) view returns (uint256)
maxRedeem
viewfunction maxRedeem(address owner) view returns (uint256)
maxWithdraw
viewfunction maxWithdraw(address owner) view returns (uint256 maxAssets)
name
viewfunction name() view returns (string)
owner
viewfunction owner() view returns (address)
performanceFee
viewfunction performanceFee() view returns (address, uint16)
previewAccrueYield
viewfunction previewAccrueYield() view returns (uint256, uint256)
previewDeposit
viewfunction previewDeposit(uint256 assets) view returns (uint256)
previewMint
viewfunction previewMint(uint256 shares) view returns (uint256)
previewRedeem
viewfunction previewRedeem(uint256 shares) view returns (uint256)
previewWithdraw
viewfunction previewWithdraw(uint256 assets) view returns (uint256)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
totalAssets
viewfunction totalAssets() view returns (uint256 totalAssetsWithYield)
totalSupply
viewfunction totalSupply() view returns (uint256)
version
viewfunction version() view returns (uint64)
accrueYield
nonpayablefunction accrueYield()
addStrategy
nonpayablefunction addStrategy(address strategy)
allocate
nonpayablefunction allocate(bytes data)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
deposit
nonpayablefunction deposit(uint256 assets, address receiver) returns (uint256)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(uint64 initialVersion, address owner_, bytes data)
mint
nonpayablefunction mint(uint256 shares, address receiver) returns (uint256)
redeem
nonpayablefunction redeem(uint256 shares, address receiver, address owner) returns (uint256)
removeStrategy
nonpayablefunction removeStrategy(address strategy)
renounceOwnership
nonpayablefunction renounceOwnership()
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setDeallocationOrder
nonpayablefunction setDeallocationOrder(address[] order)
setDepositLimits
nonpayablefunction setDepositLimits(uint256 minDepositAmount, uint256 maxDepositAmount)
setHooks
nonpayablefunction setHooks(tuple hooks)
setWithdrawLimits
nonpayablefunction setWithdrawLimits(uint256 minWithdrawAmount, uint256 maxWithdrawAmount)
toggleStrategyStatus
nonpayablefunction toggleStrategyStatus(address strategy)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
updateManagementFee
nonpayablefunction updateManagementFee(uint16 managementFee_)
updateManagementFeeRecipient
nonpayablefunction updateManagementFeeRecipient(address recipient)
updatePerformanceFee
nonpayablefunction updatePerformanceFee(uint16 performanceFee_)
updatePerformanceFeeRecipient
nonpayablefunction updatePerformanceFeeRecipient(address recipient)
upgrade
nonpayablefunction upgrade(uint64 newVersion, bytes data)
withdraw
nonpayablefunction withdraw(uint256 assets, address receiver, address owner) returns (uint256)
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
DeallocationOrderUpdated
event DeallocationOrderUpdated()
Deposit
event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares)
DepositLimitsUpdated
event DepositLimitsUpdated(uint256 maxDepositAmount, uint256 minDepositAmount)
HooksSet
event HooksSet((address target, uint96 flags) hooks)
Initialized
event Initialized(uint64 version)
ManagementFeeAccrued
event ManagementFeeAccrued(address indexed recipient, uint256 shares, uint256 feeAmount)
ManagementFeeRecipientUpdated
event ManagementFeeRecipientUpdated(address managementFeeRecipient)
ManagementFeeUpdated
event ManagementFeeUpdated(uint16 managementFee)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PerformanceFeeAccrued
event PerformanceFeeAccrued(address indexed recipient, uint256 shares, uint256 feeAmount)
PerformanceFeeRecipientUpdated
event PerformanceFeeRecipientUpdated(address performanceFeeRecipient)
PerformanceFeeUpdated
event PerformanceFeeUpdated(uint16 performanceFee)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
StrategyAdded
event StrategyAdded(address strategy)
StrategyHalted
event StrategyHalted(address strategy)
StrategyRemoved
event StrategyRemoved(address strategy)
StrategyStatusToggled
event StrategyStatusToggled(address indexed strategy)
StrategyYieldAccrued
event StrategyYieldAccrued(address indexed strategy, uint256 currentTotalAllocatedValue, uint256 yield, uint256 loss)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
Withdraw
event Withdraw(address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares)
WithdrawLimitsUpdated
event WithdrawLimitsUpdated(uint256 maxWithdrawAmount, uint256 minWithdrawAmount)
YieldAccrued
event YieldAccrued(uint256 totalPositiveYield, uint256 totalNegativeYield)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
AlreadyInitialized
error AlreadyInitialized()
AssetAmountOutOfBounds
error AssetAmountOutOfBounds(address sender, uint256 assets, uint256 minDepositAmount, uint256 maxDepositAmount)
CannotToggleInactiveStrategy
error CannotToggleInactiveStrategy()
ERC20InsufficientAllowance
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)
ERC20InsufficientBalance
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)
ERC20InvalidApprover
error ERC20InvalidApprover(address approver)
ERC20InvalidReceiver
error ERC20InvalidReceiver(address receiver)
ERC20InvalidSender
error ERC20InvalidSender(address sender)
ERC20InvalidSpender
error ERC20InvalidSpender(address spender)
ERC4626ExceededMaxDeposit
error ERC4626ExceededMaxDeposit(address receiver, uint256 assets, uint256 max)
ERC4626ExceededMaxMint
error ERC4626ExceededMaxMint(address receiver, uint256 shares, uint256 max)
ERC4626ExceededMaxRedeem
error ERC4626ExceededMaxRedeem(address owner, uint256 shares, uint256 max)
ERC4626ExceededMaxWithdraw
error ERC4626ExceededMaxWithdraw(address owner, uint256 assets, uint256 max)
FailedCall
error FailedCall()
FeeRecipientNotSet
error FeeRecipientNotSet()
InsufficientAssets
error InsufficientAssets()
InsufficientBalance
error InsufficientBalance()
InsufficientShares
error InsufficientShares()
InvalidAllocateModule
error InvalidAllocateModule()
InvalidAsset
error InvalidAsset()
InvalidDepositLimits
error InvalidDepositLimits()
InvalidFactoryOwner
error InvalidFactoryOwner()
InvalidFeeRecipient
error InvalidFeeRecipient()
InvalidInitialization
error InvalidInitialization()
InvalidInitialVaultManager
error InvalidInitialVaultManager()
InvalidName
error InvalidName()
InvalidReceiver
error InvalidReceiver()
InvalidStrategyAsset
error InvalidStrategyAsset()
InvalidSymbol
error InvalidSymbol()
InvalidWithdrawLimits
error InvalidWithdrawLimits()
ManagementFeeExceedsMaximum
error ManagementFeeExceedsMaximum()
NotFactory
error NotFactory()
NotInitialized
error NotInitialized()
NotInitializing
error NotInitializing()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
PerformanceFeeExceedsMaximum
error PerformanceFeeExceedsMaximum()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeCastOverflowedUintDowncast
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value)
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StrategyAlreadyAdded
error StrategyAlreadyAdded()
StrategyAlreadyHalted
error StrategyAlreadyHalted()
StrategyDoesNotExist
error StrategyDoesNotExist()
StrategyHasAllocation
error StrategyHasAllocation()
StrategyIsHalted
error StrategyIsHalted()
creation bytecode
0x60a060405234801561000f575f5ffd5b5060405161538b38038061538b83398101604081905261002e916100fb565b80610037610049565b6001600160a01b031660805250610128565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100995760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100f85780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f6020828403121561010b575f5ffd5b81516001600160a01b0381168114610121575f5ffd5b9392505050565b60805161522f61015c5f395f818161084101528181610ab5015281816110de015281816113930152612167015261522f5ff3fe608060405234801561000f575f5ffd5b50600436106103e0575f3560e01c80637f414cf81161020b578063b49a60bb1161011f578063ce96cb77116100b4578063dbb1fc0d11610084578063dbb1fc0d146108d5578063dd62ed3e146108e9578063e045f2e0146108fc578063ef8b30f71461090f578063f2fde38b14610922575f5ffd5b8063ce96cb7714610889578063d547741f1461089c578063d87826c9146108af578063d905777e146108c2575f5ffd5b8063c45a0155116100ef578063c45a01551461083c578063c63d75b61461059d578063c6e6f59214610863578063ca15c87314610876575f5ffd5b8063b49a60bb14610806578063ba0876521461080e578063bf24600014610821578063c10af4c714610829575f5ffd5b806394bf804d116101a0578063a6f7f5d611610170578063a6f7f5d61461078f578063a9059cbb146107c5578063acd078e0146107d8578063b3d7f6b9146107e0578063b460af94146107f3575f5ffd5b806394bf804d1461075a57806395d89b411461076d578063a217fddf14610775578063a3246ad31461077c575f5ffd5b80638c7f67c1116101db5780638c7f67c1146107195780638da5cb5b1461072c5780639010d07c1461073457806391d1485414610747575f5ffd5b80637f414cf8146106ca57806382299a5c146106d2578063859844fc146106da57806387788782146106ef575f5ffd5b80632f2ff15d1161030257806357ec83cc116102975780636e553f65116102675780636e553f6514610676578063709ac1c31461068957806370a082311461069c578063715018a6146106af5780637d3fdf01146106b7575f5ffd5b806357ec83cc146105f75780635aef467a1461060a5780635e30d7fe1461061d5780635fbbc0d214610630575f5ffd5b8063402d267d116102d2578063402d267d1461059d5780634cdad506146105b15780634eddea06146105c457806354fd4d50146105d7575f5ffd5b80632f2ff15d1461053d578063313ce5671461055057806336568abe1461056a57806338d52e0f1461057d575f5ffd5b806312526a481161037857806323b872dd1161034857806323b872dd146104e4578063248a9ca3146104f75780632968676e1461050a5780632b060a681461052a575f5ffd5b806312526a4814610497578063175188e8146104aa57806318160ddd146104bd578063223e5479146104d1575f5ffd5b806307a2d13a116103b357806307a2d13a146104415780630900cf6c14610454578063095ea7b3146104715780630a28a47714610484575f5ffd5b806301e1d114146103e457806301ffc9a7146103ff578063059d9c751461042257806306fdde031461042c575b5f5ffd5b6103ec610935565b6040519081526020015b60405180910390f35b61041261040d36600461479b565b610944565b60405190151581526020016103f6565b61042a61096e565b005b610434610989565b6040516103f691906147c2565b6103ec61044f3660046147f7565b610a49565b61045c610a54565b604080519283526020830191909152016103f6565b61041261047f366004614822565b610a66565b6103ec6104923660046147f7565b610a7d565b61042a6104a536600461484c565b610aa2565b61042a6104b836600461484c565b610bd7565b5f51602061515a5f395f51905f52546103ec565b61042a6104df36600461484c565b610c67565b6104126104f2366004614867565b610d5e565b6103ec6105053660046147f7565b610d83565b61051d61051836600461484c565b610da3565b6040516103f691906148b9565b61042a6105383660046148f9565b610e2a565b61042a61054b366004614919565b610ebd565b610558610edf565b60405160ff90911681526020016103f6565b61042a610578366004614919565b610f21565b610585610f59565b6040516001600160a01b0390911681526020016103f6565b6103ec6105ab36600461484c565b505f1990565b6103ec6105bf3660046147f7565b610f8d565b61042a6105d23660046148f9565b610fa9565b6105df611007565b6040516001600160401b0390911681526020016103f6565b61042a6106053660046149a6565b61102b565b61042a610618366004614a04565b6111cc565b61042a61062b366004614a42565b61130d565b610638611453565b6040805161ffff96871681526001600160a01b03958616602082015263ffffffff90941690840152931660608201529116608082015260a0016103f6565b6103ec610684366004614919565b6114a7565b61042a610697366004614a90565b611633565b6103ec6106aa36600461484c565b611696565b61042a6116bc565b61042a6106c5366004614ac5565b6116cd565b61045c61177e565b6103ec61179b565b6106e2611823565b6040516103f69190614b2e565b6106f761188c565b604080516001600160a01b03909316835261ffff9091166020830152016103f6565b61042a610727366004614b79565b6118b9565b610585611924565b6105856107423660046148f9565b61194c565b610412610755366004614919565b611971565b6103ec610768366004614919565b6119a7565b610434611b16565b6103ec5f81565b6106e261078a3660046147f7565b611b54565b610797611b7d565b604080516001600160a01b03909416845261ffff909216602084015263ffffffff16908201526060016103f6565b6104126107d3366004614822565b611bba565b61045c611bc7565b6103ec6107ee3660046147f7565b611be7565b6103ec610801366004614be8565b611c04565b6106e2611ddf565b6103ec61081c366004614be8565b611df4565b610585611fa7565b61042a610837366004614a90565b611fc2565b6105857f000000000000000000000000000000000000000000000000000000000000000081565b6103ec6108713660046147f7565b612025565b6103ec6108843660046147f7565b612030565b6103ec61089736600461484c565b612054565b61042a6108aa366004614919565b612067565b61042a6108bd36600461484c565b612083565b6103ec6108d036600461484c565b6120e2565b5f5160206151ba5f395f51905f52546103ec565b6103ec6108f7366004614c27565b61210b565b61042a61090a36600461484c565b612154565b6103ec61091d3660046147f7565b612256565b61042a61093036600461484c565b612272565b5f61093e6122ac565b50919050565b5f6001600160e01b03198216635a05180f60e01b1480610968575061096882612344565b92915050565b610976612378565b61097e6123c2565b506109876125bf565b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f51602061511a5f395f51905f52916109c790614c53565b80601f01602080910402602001604051908101604052809291908181526020018280546109f390614c53565b8015610a3e5780601f10610a1557610100808354040283529160200191610a3e565b820191905f5260205f20905b815481529060010190602001808311610a2157829003601f168201915b505050505091505090565b5f610968825f6125e5565b5f5f610a5e6122ac565b915091509091565b5f33610a73818585612640565b5060019392505050565b5f5f5f610a886122ac565b9092509050610a9a848284600161264d565b949350505050565b610aaa612378565b610ab26123c2565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b339190614c85565b6001600160a01b0316336001600160a01b031614610b645760405163d29ecfe160e01b815260040160405180910390fd5b60405163024a4d4960e31b81526001600160a01b0382166004820152730cd9885a67a228c21cdf23f4be918c7cec043a9d906312526a48906024015b5f6040518083038186803b158015610bb6575f5ffd5b505af4158015610bc8573d5f5f3e3d5ffd5b50505050610bd46125bf565b50565b610bdf612378565b5f51602061513a5f395f51905f52610bf681612670565b6040516302ea311d60e31b81526001600160a01b0383166004820152730cd9885a67a228c21cdf23f4be918c7cec043a9d9063175188e8906024015b5f6040518083038186803b158015610c48575f5ffd5b505af4158015610c5a573d5f5f3e3d5ffd5b5050505050610bd46125bf565b610c6f612378565b5f51602061513a5f395f51905f52610c8681612670565b610c8e610f59565b6001600160a01b0316826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf79190614c85565b6001600160a01b031614610d1e5760405163e76673ef60e01b815260040160405180910390fd5b60405163223e547960e01b81526001600160a01b0383166004820152730cd9885a67a228c21cdf23f4be918c7cec043a9d9063223e547990602401610c32565b5f33610d6b85828561267a565b610d768585856126c5565b60019150505b9392505050565b5f9081525f51602061519a5f395f51905f52602052604090206001015490565b604080518082019091525f8082526020820152610dbe612722565b6001600160a01b0383165f90815260089190910160205260409081902081518083019092528054829060ff166002811115610dfb57610dfb6148a5565b6002811115610e0c57610e0c6148a5565b8152905461010090046001600160781b031660209091015292915050565b610e32612378565b5f51602061517a5f395f51905f52610e4981612670565b604051630560c14d60e31b81526004810184905260248101839052730cd9885a67a228c21cdf23f4be918c7cec043a9d90632b060a68906044015b5f6040518083038186803b158015610e9a575f5ffd5b505af4158015610eac573d5f5f3e3d5ffd5b5050505050610eb96125bf565b5050565b610ec682610d83565b610ecf81612670565b610ed98383612746565b50505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f8154610f1b9190600160a01b900460ff16614cb4565b91505090565b6001600160a01b0381163314610f4a5760405163334bd91960e11b815260040160405180910390fd5b610f548282612788565b505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005b546001600160a01b031692915050565b5f5f5f610f986122ac565b9092509050610a9a8482845f6127c1565b610fb1612378565b5f51602061517a5f395f51905f52610fc881612670565b60405163276ef50360e11b81526004810184905260248101839052730cd9885a67a228c21cdf23f4be918c7cec043a9d90634eddea0690604401610e84565b5f6110265f5160206151da5f395f51905f52546001600160401b031690565b905090565b5f5160206151da5f395f51905f52546001600160401b0316156110605760405162dc149f60e41b815260040160405180910390fd5b5f5160206151da5f395f51905f528054859190600160401b900460ff1680611095575080546001600160401b03808416911610155b156110b35760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166111053390565b6001600160a01b03161461112c57604051631966391b60e11b815260040160405180910390fd5b6111346127db565b61113d856127eb565b61117d868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506127fc92505050565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b6111d4612378565b7fdcac51f5d253e2787a458cfb1d6b8faf248cf16367710f9e3b6bd5644d23f8db6111fe81612670565b6112066123c2565b505f638f5d2a4760e01b8484604051602401611223929190614ccd565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905061127281611263611fa7565b6001600160a01b031690612b35565b505f61127c610f59565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156112c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e49190614cfb565b101561130357604051631e9acf1760e31b815260040160405180910390fd5b5050610eb96125bf565b611315612378565b5f5160206151da5f395f51905f528054849190600160401b900460ff168061134a575080546001600160401b03808416911610155b156113685760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166113ba3390565b6001600160a01b0316146113e157604051631966391b60e11b815260040160405180910390fd5b6114026103e05f5160206151da5f395f51905f52546001600160401b031690565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050610f546125bf565b5f5f5f5f5f5f611461612722565b6005810154600690910154600160a01b80830461ffff9081169a6001600160a01b038086169b50600160b01b90950463ffffffff16995091830416965091169350915050565b5f6114b0612378565b6114b86123c2565b506001600160a01b0382166114e057604051631e4ec46b60e01b815260040160405180910390fd5b5f6114e9612722565b60408051808201909152600c91909101546001600160a01b0381168252600160a01b90046001600160601b0316602082015290505f6115335f5160206151ba5f395f51905f525490565b9050611540826001612b9e565b15611552576115528233878785612bd2565b5f19611562565b60405180910390fd5b5f6115838761157c5f51602061515a5f395f51905f525490565b855f612c49565b90505f5f61158f61177e565b90925090508161159f868b614d33565b111580156115ad5750808910155b338a8385909192936115d657604051630cd147c960e31b81526004016115599493929190614d46565b505050506115ec6115e43390565b898b86612c79565b6115f7866002612b9e565b1561162357611623338a858b6116185f5160206151ba5f395f51905f525490565b8b9493929190612d16565b50909450505050506109686125bf565b61163b612378565b5f51602061517a5f395f51905f5261165281612670565b61165a6123c2565b5060405163709ac1c360e01b815261ffff83166004820152730cd9885a67a228c21cdf23f4be918c7cec043a9d9063709ac1c390602401610c32565b6001600160a01b03165f9081525f51602061511a5f395f51905f52602052604090205490565b6116c4612d76565b6109875f612da8565b6116d5612378565b7f233f5edd266b4c1e845863cec156a09138880d786ad44f83338de5088db7bf006116ff81612670565b5f611708612722565b8351602080860180516001600160601b03908116600160a01b026001600160a01b03909416938417600c86015560408051948552915116918301919091529192507fdf54464c1716ef505e744140e0952c7818e8fca244bda3dae5d2f971860aef0d910160405180910390a15050610bd46125bf565b5f5f5f611789612722565b80546002909101549094909350915050565b5f5f6117a5612722565b90505f6117b482600901612e18565b90505f5b815181101561181d57826008015f8383815181106117d8576117d8614d6c565b6020908102919091018101516001600160a01b031682528101919091526040015f20546118139061010090046001600160781b031685614d33565b93506001016117b8565b50505090565b606061182d612722565b600b0180548060200260200160405190810160405280929190818152602001828054801561188257602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611864575b5050505050905090565b5f5f5f611897612722565b600601546001600160a01b03811694600160a01b90910461ffff169350915050565b6118c1612378565b7fdcac51f5d253e2787a458cfb1d6b8faf248cf16367710f9e3b6bd5644d23f8db6118eb81612670565b604051638c7f67c160e01b8152730cd9885a67a228c21cdf23f4be918c7cec043a9d90638c7f67c190610e849086908690600401614d80565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300610f7d565b5f8281525f5160206150fa5f395f51905f52602081905260408220610a9a9084612e24565b5f9182525f51602061519a5f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f6119b0612378565b6119b86123c2565b506001600160a01b0382166119e057604051631e4ec46b60e01b815260040160405180910390fd5b5f6119e9612722565b60408051808201909152600c91909101546001600160a01b0381168252600160a01b90046001600160601b0316602082015290505f611a335f5160206151ba5f395f51905f525490565b9050611a40826003612b9e565b15611a5257611a528233878785612e2f565b5f195f611a7687611a6e5f51602061515a5f395f51905f525490565b856001612e76565b90505f5f611a8261177e565b909250905081611a928685614d33565b11158015611aa05750808310155b3384838590919293611ac957604051630cd147c960e31b81526004016115599493929190614d46565b50505050611adf611ad73390565b89858c612c79565b611aea866004612b9e565b156116235761162333848b8b611b0b5f5160206151ba5f395f51905f525490565b8b9493929190612ea6565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f51602061511a5f395f51905f52916109c790614c53565b5f8181525f5160206150fa5f395f51905f526020819052604090912060609190610d7c90612e18565b5f5f5f5f611b89612722565b600501546001600160a01b03811695600160a01b820461ffff169550600160b01b90910463ffffffff169350915050565b5f33610a738185856126c5565b5f5f5f611bd2612722565b90508060010154816003015492509250509091565b5f5f5f611bf26122ac565b9092509050610a9a84828460016127c1565b5f611c0d612378565b611c156123c2565b506001600160a01b038316611c3d57604051631e4ec46b60e01b815260040160405180910390fd5b5f611c46612722565b60408051808201909152600c91909101546001600160a01b0381168252600160a01b90046001600160601b0316602082015290505f611c905f5160206151ba5f395f51905f525490565b9050611c9d826005612b9e565b15611cb057611cb0823388888886612edd565b5f611cc65f51602061515a5f395f51905f525490565b90505f611ce082845f611cd88a611696565b9291906127c1565b90505f611d0489611cfc5f51602061515a5f395f51905f525490565b866001612e76565b905081891180611d1f575088611d1d338a8a8d86612f2c565b105b15611d4357868983604051633fa733bb60e21b815260040161155993929190614d12565b5f5f611d4d611bc7565b91509150818b11158015611d615750808b10155b338c838590919293611d8a57604051630cd147c960e31b81526004016115599493929190614d46565b50505050611da2600688612b9e90919063ffffffff16565b15611dce57611dce338c858d611dc35f5160206151ba5f395f51905f525490565b8c94939291906132b6565b509095505050505050610d7c6125bf565b6060611026611dec612722565b600901612e18565b5f611dfd612378565b611e056123c2565b506001600160a01b038316611e2d57604051631e4ec46b60e01b815260040160405180910390fd5b5f611e36612722565b60408051808201909152600c91909101546001600160a01b0381168252600160a01b90046001600160601b0316602082015290505f611e805f5160206151ba5f395f51905f525490565b9050611e8d826007612b9e565b15611ea057611ea08233888888866132ed565b5f611eaa85611696565b90505f611ecd88611ec65f51602061515a5f395f51905f525490565b855f612e76565b905081881180611ee8575080611ee6338989858d612f2c565b105b15611f0c57858883604051632e52afbb60e21b815260040161155993929190614d12565b5f5f611f16611bc7565b91509150818311158015611f2a5750808310155b3384838590919293611f5357604051630cd147c960e31b81526004016115599493929190614d46565b50505050611f6b600887612b9e90919063ffffffff16565b15611f9757611f9733848c8c611f8c5f5160206151ba5f395f51905f525490565b8b949392919061333f565b5090945050505050610d7c6125bf565b5f611fb0612722565b600401546001600160a01b0316919050565b611fca612378565b5f51602061517a5f395f51905f52611fe181612670565b611fe96123c2565b5060405163c10af4c760e01b815261ffff83166004820152730cd9885a67a228c21cdf23f4be918c7cec043a9d9063c10af4c790602401610c32565b5f610968825f613376565b5f8181525f5160206150fa5f395f51905f52602081905260408220610d7c906133d1565b5f61205e826133da565b50909392505050565b61207082610d83565b61207981612670565b610ed98383612788565b61208b612378565b5f51602061513a5f395f51905f526120a281612670565b60405163d87826c960e01b81526001600160a01b0383166004820152730cd9885a67a228c21cdf23f4be918c7cec043a9d9063d87826c990602401610c32565b5f5f5f5f6120ef856133da565b919450925090506121028382845f61264d565b95945050505050565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b61215c612378565b6121646123c2565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121e59190614c85565b6001600160a01b0316336001600160a01b0316146122165760405163d29ecfe160e01b815260040160405180910390fd5b6040516307022f9760e51b81526001600160a01b0382166004820152730cd9885a67a228c21cdf23f4be918c7cec043a9d9063e045f2e090602401610ba0565b5f5f5f6122616122ac565b9092509050610a9a8482845f61264d565b61227a612d76565b6001600160a01b0381166122a357604051631e4fbdf760e01b81525f6004820152602401611559565b610bd481612da8565b5f5f5f5f6122b8613421565b915091505f6122d25f51602061515a5f395f51905f525490565b90505f82846122ec5f5160206151ba5f395f51905f525490565b6122f69190614d33565b6123009190614dcc565b90505f61230c82613497565b5090506123198184614d33565b92505f612328838787876135b3565b5090506123358185614d33565b92989297509195505050505050565b5f6001600160e01b03198216637965db0b60e01b148061096857506301ffc9a760e01b6001600160e01b0319831614610968565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016123bc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f6123cc612722565b90505f5f5f6123dd84600901612e18565b80519091505f5b8181101561252f575f5f5f61241186858151811061240457612404614d6c565b602002602001015161365d565b925092509250825f14158061242557508115155b1561252157612433816137b5565b896008015f88878151811061244a5761244a614d6c565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f0160016101000a8154816001600160781b0302191690836001600160781b0316021790555082886124a39190614d33565b97506124af8288614d33565b96508584815181106124c3576124c3614d6c565b60200260200101516001600160a01b03167fe11daacdf6490767a003932f47d7701165c31eb98ae03312422400522e33b11d828585604051612518939291909283526020830191909152604082015260600190565b60405180910390a25b5050508060010190506123e4565b5050505f6125475f5160206151ba5f395f51905f5290565b90505f8284835f015461255a9190614d33565b6125649190614dcc565b8083559050612572816137ec565b61257d8185856138b3565b60408051858152602081018590527ffe2ebf53456a69d7b70affc98b9021c791a9bce3af6fa5d24dfbc2db0f817b54910160405180910390a195945050505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f5f5f6125f0613421565b9150915061210261260c5f51602061515a5f395f51905f525490565b82846126235f5160206151ba5f395f51905f525490565b61262d9190614d33565b6126379190614dcc565b879190876127c1565b610f54838383600161395f565b5f61210261265c856001614d33565b612667856001614d33565b87919085613a42565b610bd48133613a84565b5f612685848461210b565b90505f19811015610ed957818110156126b757828183604051637dc7a0d960e11b815260040161155993929190614d12565b610ed984848484035f61395f565b6001600160a01b0383166126ee57604051634b637e8f60e11b81525f6004820152602401611559565b6001600160a01b0382166127175760405163ec442f0560e01b81525f6004820152602401611559565b610f54838383613abd565b7fe74d828616eceb28be4a8cf3f9eeee868e1f44ce928ee17a9d7ad296fa52be0090565b5f5f5160206150fa5f395f51905f52816127608585613bd5565b90508015610a9a575f85815260208390526040902061277f9085613c76565b50949350505050565b5f5f5160206150fa5f395f51905f52816127a28585613c8a565b90508015610a9a575f85815260208390526040902061277f9085613d03565b5f6121026127d0846001614d33565b612667866001614d33565b6127e3613d17565b610987613d4d565b6127f3613d17565b610bd481613d55565b5f5f5f5f5f858060200190518101906128159190614e68565b9398509196509450925090506001600160a01b03851661284857604051638f16646d60e01b815260040160405180910390fd5b6001600160a01b03841661286f57604051636448d6e960e11b815260040160405180910390fd5b6001600160a01b038316612896576040516320fb0c8560e21b815260040160405180910390fd5b5f8251116128b75760405163430f13b360e01b815260040160405180910390fd5b5f8151116128d85760405163010466f160e21b815260040160405180910390fd5b6128e28282613d5d565b6128eb84613dad565b6128f3613e30565b5f6128fc612722565b6004810180546001600160a01b0319166001600160a01b0389161790559050612923613e38565b60058201805463ffffffff92909216600160b01b0263ffffffff60b01b199092169190911790555f198082555f600283018190556001830191909155600382015561299b5f51602061517a5f395f51905f527f4e9ffdddc97f584b139425ce5ef330e87394004074fd26a145a5b2c82f0c044c613e42565b6129e57f233f5edd266b4c1e845863cec156a09138880d786ad44f83338de5088db7bf007f86576b78dbc21af258079e476349c5c58a5e7af9dda2c256ea06211050c0f42d613e42565b612a1c5f51602061513a5f395f51905f527f338a8346f62b3e0e94cee171a89c09e1af25ce27294e3ef8b187b65ced09d31a613e42565b612a667fdcac51f5d253e2787a458cfb1d6b8faf248cf16367710f9e3b6bd5644d23f8db7f58c51da7ace6c3284533c3aaef686089d22f804481c336269a98c96d47a74c67613e42565b612a907f4e9ffdddc97f584b139425ce5ef330e87394004074fd26a145a5b2c82f0c044c85612746565b50612abb7f86576b78dbc21af258079e476349c5c58a5e7af9dda2c256ea06211050c0f42d85612746565b50612ae67f338a8346f62b3e0e94cee171a89c09e1af25ce27294e3ef8b187b65ced09d31a85612746565b50612b117f58c51da7ace6c3284533c3aaef686089d22f804481c336269a98c96d47a74c6785612746565b50612b295f51602061517a5f395f51905f5285612746565b50505050505050505050565b60605f5f846001600160a01b031684604051612b519190614f04565b5f60405180830381855af49150503d805f8114612b89576040519150601f19603f3d011682016040523d82523d5f602084013e612b8e565b606091505b5091509150612102858383613ea2565b5f612ba98383613efe565b1580612bbd575082516001600160a01b0316155b15612bc957505f610968565b50600192915050565b84516040516384a88ad560e01b81526001600160a01b03868116600483015260248201869052848116604483015260648201849052909116906384a88ad5906084015b5f604051808303815f87803b158015612c2c575f5ffd5b505af1158015612c3e573d5f5f3e3d5ffd5b505050505050505050565b5f80612c578686868661264d565b90505f811161210257604051633999656760e01b815260040160405180910390fd5b612c8c612c84610f59565b853085613f30565b815f5160206151ba5f395f51905f5280545f90612caa908490614d33565b90915550612cba90508382613f97565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051612d08929190918252602082015260400190565b60405180910390a350505050565b8551604051635121af7560e01b81526001600160a01b0390911690635121af7590612d4d9088908890889088908890600401614f1a565b5f604051808303815f87803b158015612d64575f5ffd5b505af1158015612b29573d5f5f3e3d5ffd5b33612d7f611924565b6001600160a01b0316146109875760405163118cdaa760e01b8152336004820152602401611559565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b60605f610d7c83613fcb565b5f610d7c8383614024565b84516040516398377f0360e01b81526001600160a01b03868116600483015260248201869052848116604483015260648201849052909116906398377f0390608401612c15565b5f80612e84868686866127c1565b90505f8111612102576040516396d8043360e01b815260040160405180910390fd5b855160405163b4e1167360e01b81526001600160a01b039091169063b4e1167390612d4d9088908890889088908890600401614f1a565b855160405163dd3a450b60e01b81526001600160a01b0387811660048301526024820187905285811660448301528481166064830152608482018490529091169063dd3a450b9060a401612d4d565b5f5f612f36612722565b90505f612f41610f59565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612f85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa99190614cfb565b90505f80612fb78284614dcc565b90508681101561329c575f84600b0180548060200260200160405190810160405280929190818152602001828054801561301857602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311612ffa575b505083519394505f925050505b81811015613298576001876008015f85848151811061304657613046614d6c565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff16600281111561307d5761307d6148a5565b1415806130b657506130b483828151811061309a5761309a614d6c565b60200260200101518860090161404a90919063ffffffff16565b155b613290575f848b0390505f8483815181106130d3576130d3614d6c565b60200260200101516001600160a01b031663ac7a1b5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613116573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061313a9190614cfb565b90505f8282101561314b578161314d565b825b9050801561327d575f86858151811061316857613168614d6c565b60200260200101516001600160a01b0316634b6d39f5836040518263ffffffff1660e01b815260040161319d91815260200190565b6020604051808303815f875af11580156131b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131dd9190614cfb565b90506131e8816137b5565b8b6008015f8988815181106131ff576131ff614d6c565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f0160018282829054906101000a90046001600160781b03166132499190614f4d565b92506101000a8154816001600160781b0302191690836001600160781b0316021790555080886132799190614d33565b9750505b8c871061328c57505050613298565b5050505b600101613025565b5050505b6132a98a8a8a8a8a61406b565b9998505050505050505050565b85516040516328ea381560e21b81526001600160a01b039091169063a3a8e05490612d4d9088908890889088908890600401614f1a565b8551604051600162c2788160e01b031981526001600160a01b0387811660048301526024820187905285811660448301528481166064830152608482018490529091169063ff3d877f9060a401612d4d565b855160405163a4940aed60e01b81526001600160a01b039091169063a4940aed90612d4d9088908890889088908890600401614f1a565b5f5f5f613381613421565b9150915061210261339d5f51602061515a5f395f51905f525490565b82846133b45f5160206151ba5f395f51905f525490565b6133be9190614d33565b6133c89190614dcc565b8791908761264d565b5f610968825490565b5f5f5f5f6133e785611696565b90505f5f6133f36122ac565b90925090505f613405848385846127c1565b905061341081614136565b9650919450925050505b9193909250565b5f5f5f61342f611dec612722565b80519091505f5b81811015613490575f5f61345585848151811061240457612404614d6c565b5091509150815f14158061346857508015155b15613486576134778288614d33565b96506134838187614d33565b95505b5050600101613436565b5050509091565b5f5f5f6134a2612722565b6005810154909150600160a01b900461ffff165f036134c657505f93849350915050565b5f6134cf613e38565b600583015490915063ffffffff600160b01b90910481169082168190036134fd57505f958695509350505050565b5f6135088284614f6c565b600585015463ffffffff9190911691505f906127109061353390600160a01b900461ffff168a614f88565b61353d9190614fb3565b90506301e1338061354e8383614f88565b6135589190614fb3565b9550855f0361357057505f9788975095505050505050565b8786111561357c578795505b6135a76135945f51602061515a5f395f51905f525490565b61359e888b614dcc565b8891905f61264d565b96505050505050915091565b5f5f5f6135be612722565b6006810154909150600160a01b900461ffff1615806135dd5750858510155b156135ee575f5f9250925050613654565b5f6135f98688614dcc565b60068301549091505f9061361c908390600160a01b900461ffff16612710614382565b9050805f03613633575f5f94509450505050613654565b5f61364b87613642848d614dcc565b8491905f61264d565b95509093505050505b94509492505050565b5f5f5f5f613669612722565b6001600160a01b0386165f9081526008820160205260409020549091506001600160781b036101008204169060019060ff1660028111156136ac576136ac6148a5565b146136c1575f5f5f945094509450505061341a565b5f866001600160a01b031663538a018f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136fe573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137229190614cfb565b90506001600160781b038110156137395780613742565b6001600160781b035b90505f5f836001600160781b03168303613765579096509450925061341a915050565b836001600160781b0316831115613790576137896001600160781b03851684614dcc565b91506137a6565b6137a3836001600160781b038616614dcc565b90505b90989097509095509350505050565b5f6001600160781b038211156137e8576040516306dfcc6560e41b81526078600482015260248101839052604401611559565b5090565b5f5f6137f783613497565b915091505f613804612722565b905061380e613e38565b60058201805463ffffffff92909216600160b01b0263ffffffff60b01b19831681179091556001600160a01b03908116911617831580159061385857506001600160a01b03811615155b156138ac576138678185613f97565b60408051858152602081018590526001600160a01b038316917fe0a6c0d2df19a90b154d31618f7d6897e3b5bc6d509af23fb86c4f5395d31b8d910160405180910390a25b5050505050565b5f5f6138d58585856138d05f51602061515a5f395f51905f525490565b6135b3565b91509150815f036138e7575050505050565b5f6138f0612722565b60068101549091506001600160a01b03168015613956576139118185613f97565b60408051858152602081018590526001600160a01b038316917f71dd3803aa05c93645074cd325b45c8dd9dcc3396f538083f54611df04ebe9a9910160405180910390a25b50505050505050565b5f51602061511a5f395f51905f526001600160a01b0385166139965760405163e602df0560e01b81525f6004820152602401611559565b6001600160a01b0384166139bf57604051634a1406b160e11b81525f6004820152602401611559565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156138ac57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051613a3391815260200190565b60405180910390a35050505050565b5f613a6f613a4f83614438565b8015613a6a57505f8480613a6557613a65614f9f565b868809115b151590565b613a7a868686614382565b6121029190614d33565b613a8e8282611971565b610eb95760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611559565b5f51602061511a5f395f51905f526001600160a01b038416613af75781816002015f828254613aec9190614d33565b90915550613b549050565b6001600160a01b0384165f9081526020829052604090205482811015613b365784818460405163391434e360e21b815260040161155993929190614d12565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316613b72576002810180548390039055613b90565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d0891815260200190565b5f5f51602061519a5f395f51905f52613bee8484611971565b613c6d575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055613c233390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610968565b5f915050610968565b5f610d7c836001600160a01b038416614464565b5f5f51602061519a5f395f51905f52613ca38484611971565b15613c6d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610968565b5f610d7c836001600160a01b0384166144b0565b5f5160206151da5f395f51905f5254600160401b900460ff1661098757604051631afcd79f60e31b815260040160405180910390fd5b6125bf613d17565b61227a613d17565b613d65613d17565b5f51602061511a5f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03613d9e848261500a565b5060048101610ed9838261500a565b613db5613d17565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f80613de18461458a565b9150915081613df1576012613df3565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b610987613d17565b5f61102642614660565b5f51602061519a5f395f51905f525f613e5a84610d83565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b606082613eb757613eb282614690565b610d7c565b8151158015613ece57506001600160a01b0384163b155b15613ef757604051639996b31560e01b81526001600160a01b0385166004820152602401611559565b5080610d7c565b5f60608260ff1610613f1157505f610968565b506020820151600160ff83161b166001600160601b0316151592915050565b6040516001600160a01b038481166024830152838116604483015260648201839052610ed99186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146b9565b6001600160a01b038216613fc05760405163ec442f0560e01b81525f6004820152602401611559565b610eb95f8383613abd565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561401857602002820191905f5260205f20905b815481526020019060010190808311614004575b50505050509050919050565b5f825f01828154811061403957614039614d6c565b905f5260205f200154905092915050565b6001600160a01b0381165f9081526001830160205260408120541515610d7c565b826001600160a01b0316856001600160a01b03161461408f5761408f83868361267a565b815f5160206151ba5f395f51905f5280545f906140ad908490614dcc565b909155506140bd90508382614725565b6140cf6140c8610f59565b8584614759565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051614127929190918252602082015260400190565b60405180910390a45050505050565b5f5f614140612722565b90505f61414b610f59565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa15801561418f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141b39190614cfb565b90508381101561437a575f82600b0180548060200260200160405190810160405280929190818152602001828054801561421457602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116141f6575b505083519394505f925050505b81811015614372576001856008015f85848151811061424257614242614d6c565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff166002811115614279576142796148a5565b1415806142b257506142b083828151811061429657614296614d6c565b60200260200101518660090161404a90919063ffffffff16565b155b61436a575f84880390505f8483815181106142cf576142cf614d6c565b60200260200101516001600160a01b031663ac7a1b5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614312573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143369190614cfb565b90505f828210156143475781614349565b825b90506143558188614d33565b965089871061436657505050614372565b5050505b600101614221565b505050610d7c565b509192915050565b5f838302815f1985870982811083820303915050805f036143b6578382816143ac576143ac614f9f565b0492505050610d7c565b8084116143cd576143cd600385150260111861478a565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f600282600381111561444d5761444d6148a5565b61445791906150c4565b60ff166001149050919050565b5f8181526001830160205260408120546144a957508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610968565b505f610968565b5f8181526001830160205260408120548015613c6d575f6144d2600183614dcc565b85549091505f906144e590600190614dcc565b9050808214614544575f865f01828154811061450357614503614d6c565b905f5260205f200154905080875f01848154811061452357614523614d6c565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080614555576145556150e5565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610968565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916145d091614f04565b5f60405180830381855afa9150503d805f8114614608576040519150601f19603f3d011682016040523d82523d5f602084013e61460d565b606091505b509150915081801561462157506020815110155b15614654575f8180602001905181019061463b9190614cfb565b905060ff8111614652576001969095509350505050565b505b505f9485945092505050565b5f63ffffffff8211156137e8576040516306dfcc6560e41b81526020600482015260248101839052604401611559565b8051156146a05780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f5f60205f8451602086015f885af1806146d8576040513d5f823e3d81fd5b50505f513d915081156146ef5780600114156146fc565b6001600160a01b0384163b155b15610ed957604051635274afe760e01b81526001600160a01b0385166004820152602401611559565b6001600160a01b03821661474e57604051634b637e8f60e11b81525f6004820152602401611559565b610eb9825f83613abd565b6040516001600160a01b03838116602483015260448201839052610f5491859182169063a9059cbb90606401613f65565b634e487b715f52806020526024601cfd5b5f602082840312156147ab575f5ffd5b81356001600160e01b031981168114610d7c575f5ffd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215614807575f5ffd5b5035919050565b6001600160a01b0381168114610bd4575f5ffd5b5f5f60408385031215614833575f5ffd5b823561483e8161480e565b946020939093013593505050565b5f6020828403121561485c575f5ffd5b8135610d7c8161480e565b5f5f5f60608486031215614879575f5ffd5b83356148848161480e565b925060208401356148948161480e565b929592945050506040919091013590565b634e487b7160e01b5f52602160045260245ffd5b81516040820190600381106148dc57634e487b7160e01b5f52602160045260245ffd5b808352506001600160781b03602084015116602083015292915050565b5f5f6040838503121561490a575f5ffd5b50508035926020909101359150565b5f5f6040838503121561492a575f5ffd5b82359150602083013561493c8161480e565b809150509250929050565b80356001600160401b038116811461495d575f5ffd5b919050565b5f5f83601f840112614972575f5ffd5b5081356001600160401b03811115614988575f5ffd5b60208301915083602082850101111561499f575f5ffd5b9250929050565b5f5f5f5f606085870312156149b9575f5ffd5b6149c285614947565b935060208501356149d28161480e565b925060408501356001600160401b038111156149ec575f5ffd5b6149f887828801614962565b95989497509550505050565b5f5f60208385031215614a15575f5ffd5b82356001600160401b03811115614a2a575f5ffd5b614a3685828601614962565b90969095509350505050565b5f5f5f60408486031215614a54575f5ffd5b614a5d84614947565b925060208401356001600160401b03811115614a77575f5ffd5b614a8386828701614962565b9497909650939450505050565b5f60208284031215614aa0575f5ffd5b813561ffff81168114610d7c575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f6040828403128015614ad6575f5ffd5b50604080519081016001600160401b0381118282101715614af957614af9614ab1565b6040528235614b078161480e565b815260208301356001600160601b0381168114614b22575f5ffd5b60208201529392505050565b602080825282518282018190525f918401906040840190835b81811015614b6e5783516001600160a01b0316835260209384019390920191600101614b47565b509095945050505050565b5f5f60208385031215614b8a575f5ffd5b82356001600160401b03811115614b9f575f5ffd5b8301601f81018513614baf575f5ffd5b80356001600160401b03811115614bc4575f5ffd5b8560208260051b8401011115614bd8575f5ffd5b6020919091019590945092505050565b5f5f5f60608486031215614bfa575f5ffd5b833592506020840135614c0c8161480e565b91506040840135614c1c8161480e565b809150509250925092565b5f5f60408385031215614c38575f5ffd5b8235614c438161480e565b9150602083013561493c8161480e565b600181811c90821680614c6757607f821691505b60208210810361093e57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614c95575f5ffd5b8151610d7c8161480e565b634e487b7160e01b5f52601160045260245ffd5b60ff818116838216019081111561096857610968614ca0565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60208284031215614d0b575f5ffd5b5051919050565b6001600160a01b039390931683526020830191909152604082015260600190565b8082018082111561096857610968614ca0565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b602080825281018290525f8360408301825b85811015614dc2578235614da58161480e565b6001600160a01b0316825260209283019290910190600101614d92565b5095945050505050565b8181038181111561096857610968614ca0565b5f82601f830112614dee575f5ffd5b81516001600160401b03811115614e0757614e07614ab1565b604051601f8201601f19908116603f011681016001600160401b0381118282101715614e3557614e35614ab1565b604052818152838201602001851015614e4c575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f5f60a08688031215614e7c575f5ffd5b8551614e878161480e565b6020870151909550614e988161480e565b6040870151909450614ea98161480e565b60608701519093506001600160401b03811115614ec4575f5ffd5b614ed088828901614ddf565b92505060808601516001600160401b03811115614eeb575f5ffd5b614ef788828901614ddf565b9150509295509295909350565b5f82518060208501845e5f920191825250919050565b6001600160a01b039586168152602081019490945260408401929092529092166060820152608081019190915260a00190565b6001600160781b03828116828216039081111561096857610968614ca0565b63ffffffff828116828216039081111561096857610968614ca0565b808202811582820484141761096857610968614ca0565b634e487b7160e01b5f52601260045260245ffd5b5f82614fc157614fc1614f9f565b500490565b601f821115610f5457805f5260205f20601f840160051c81016020851015614feb5750805b601f840160051c820191505b818110156138ac575f8155600101614ff7565b81516001600160401b0381111561502357615023614ab1565b615037816150318454614c53565b84614fc6565b6020601f821160018114615069575f83156150525750848201515b5f19600385901b1c1916600184901b1784556138ac565b5f84815260208120601f198516915b828110156150985787850151825560209485019460019092019101615078565b50848210156150b557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60ff8316806150d6576150d6614f9f565b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfec1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace001893e1a169e79f2fe8aa327b1bceb2fede7a1b76a54824f95ea0e737720954ae52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace027d6d8b9b446e2d961101099c17de9758016a0de4ad2bd37ba4da59dcd2a1e69a02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680031b60059595cae2ebab32b53f301cf68fb9c4eef322a90dbc8487ddf3a197900f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a2646970667358221220877e262a0966554a542a1e28afebfda80d8c99c8217a1abe60780f12b167df9d64736f6c634300081b00330000000000000000000000000265d73a8e61f698d8eb0dfeb91ddce55516844c