0 txs
246 calls
constructor
constructor(address asset_, address feeRecipient_, address admin_, address multiSig_, address vault_)
functions
_decimals
viewfunction _decimals() view returns (uint8)
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
asset
viewfunction asset() view returns (address)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
convertToAssets
viewfunction convertToAssets(uint256 shares) view returns (uint256)
convertToShares
viewfunction convertToShares(uint256 assets) view returns (uint256)
DECIMAL_OFFSET
viewfunction DECIMAL_OFFSET() view returns (uint8)
decimals
viewfunction decimals() view returns (uint8)
depositLimit
viewfunction depositLimit() view returns (uint256)
feeRecipient
viewfunction feeRecipient() view returns (address)
getAvailableAssetsForWithdrawal
viewfunction getAvailableAssetsForWithdrawal() view returns (uint256)
getMultiSig
viewfunction getMultiSig() view returns (address)
getRewardTokenAddresses
purefunction getRewardTokenAddresses() pure returns (address[])
getRewardTokens
viewfunction getRewardTokens() view returns (tuple[])
isProtectStrategy
purefunction isProtectStrategy() pure returns (bool)
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)
multiSig
viewfunction multiSig() view returns (address)
name
viewfunction name() view returns (string)
owner
viewfunction owner() view returns (address)
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)
rewardTokenApproved
viewfunction rewardTokenApproved(address) view returns (bool)
rewardTokens
viewfunction rewardTokens(uint256) view returns (address token, uint256 fee, uint256 accumulatedFeeAccounted)
rewardWindows
viewfunction rewardWindows(address rewardToken) view returns (uint256 start, uint256 end, uint256 lastHarvested, uint256 rewardsPerSecond)
symbol
viewfunction symbol() view returns (string)
totalAssets
viewfunction totalAssets() view returns (uint256)
totalSupply
viewfunction totalSupply() view returns (uint256)
viewVaultDepositedAmount
viewfunction viewVaultDepositedAmount() view returns (uint256)
withdrawEnabled
viewfunction withdrawEnabled() view returns (bool)
addRewardToken
nonpayablefunction addRewardToken(tuple rewardToken_)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
assetsMigrationToTargetByUserRedemption
nonpayablefunction assetsMigrationToTargetByUserRedemption(uint256 underlyingAmount, bool outgoing)
deposit
nonpayablefunction deposit(uint256 assets, address receiver) returns (uint256)
harvestRewards
nonpayablefunction harvestRewards(bytes data) returns (tuple[])
mint
nonpayablefunction mint(uint256 shares, address receiver) returns (uint256)
modifyRewardFeeForRewardToken
nonpayablefunction modifyRewardFeeForRewardToken(uint256 newFee_, tuple rewardToken_)
redeem
nonpayablefunction redeem(uint256 shares, address receiver, address owner) returns (uint256)
removeRewardToken
nonpayablefunction removeRewardToken(tuple rewardToken_)
renounceOwnership
nonpayablefunction renounceOwnership()
rescueFunds
nonpayablefunction rescueFunds(address asset_)
setDepositLimit
nonpayablefunction setDepositLimit(uint256 depositLimit_)
setFeeRecipient
nonpayablefunction setFeeRecipient(address feeRecipient_)
setMultiSig
nonpayablefunction setMultiSig(address multiSig_)
toggleWithdraw
nonpayablefunction toggleWithdraw()
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)
withdraw
nonpayablefunction withdraw(uint256 assets, address receiver, address owner) returns (uint256)
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
AssetsForwarded
event AssetsForwarded(address indexed asset, uint256 amount, address multiSig)
AssetsRetrieved
event AssetsRetrieved(address indexed asset, uint256 amount, address multiSig)
Deposit
event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares)
Harvested
event Harvested(address indexed harvester, uint256 tvl)
Initialized
event Initialized(uint64 version)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
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)
errors
AccumulatedFeeAccountedMustBeZero
error AccumulatedFeeAccountedMustBeZero()
AdditionFail
error AdditionFail()
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
AllotmentTotalTooHigh
error AllotmentTotalTooHigh()
BlueprintUnauthorizedAccount
error BlueprintUnauthorizedAccount(address account)
ClaimRouterUnauthorizedAccount
error ClaimRouterUnauthorizedAccount(address account)
ERC20ApproveFail
error ERC20ApproveFail()
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)
FailedInnerCall
error FailedInnerCall()
ImplementationAlreadyExists
error ImplementationAlreadyExists(bytes32 id)
ImplementationDoesNotExist
error ImplementationDoesNotExist(bytes32 id)
InsufficientFunds
error InsufficientFunds(address strategy, uint256 amount, uint256 available)
InsufficientQueueRequest
error InsufficientQueueRequest(uint256 assets, uint256 minRequest)
InsufficientUnderlyingBalance
error InsufficientUnderlyingBalance()
InsufficientVaultFunds
error InsufficientVaultFunds(address vault, uint256 amount, uint256 available)
InvalidAmount
error InvalidAmount()
InvalidAssetAddress
error InvalidAssetAddress()
InvalidBeneficiary
error InvalidBeneficiary()
InvalidClaimRouterAddress
error InvalidClaimRouterAddress()
InvalidDefaultAdminAddress
error InvalidDefaultAdminAddress()
InvalidDepositLimit
error InvalidDepositLimit()
InvalidFeeRecipient
error InvalidFeeRecipient()
InvalidImplementation
error InvalidImplementation(bytes32 id)
InvalidIndex
error InvalidIndex(uint256 index)
InvalidInitialization
error InvalidInitialization()
InvalidLength
error InvalidLength(uint256 argLength, uint256 expectedLength)
InvalidMultiSigAddress
error InvalidMultiSigAddress()
InvalidParkingLot
error InvalidParkingLot()
InvalidRecipient
error InvalidRecipient()
InvalidRescuer
error InvalidRescuer()
InvalidRewardTokenAddress
error InvalidRewardTokenAddress()
InvalidSigner
error InvalidSigner(address signer)
InvalidSubstraction
error InvalidSubstraction()
InvalidToken
error InvalidToken()
InvalidTokenRegistry
error InvalidTokenRegistry()
InvalidTreasuryAddress
error InvalidTreasuryAddress()
InvalidUserAddress
error InvalidUserAddress()
InvalidVaultFees
error InvalidVaultFees()
InvalidVaultRegistry
error InvalidVaultRegistry()
InvalidWithdrawlQueue
error InvalidWithdrawlQueue()
MathOverflowedMulDiv
error MathOverflowedMulDiv()
MaxError
error MaxError()
MultipleProtectStrat
error MultipleProtectStrat()
MultiSigUnauthorizedAccount
error MultiSigUnauthorizedAccount(address account)
NoProtectionStrategiesFound
error NoProtectionStrategiesFound()
NotAvailableForWithdrawal
error NotAvailableForWithdrawal(address token, uint256 amount)
NotImplemented
error NotImplemented()
NotInitializing
error NotInitializing()
NotPassedYear
error NotPassedYear()
NotValidRewardToken
error NotValidRewardToken(address tokenAddress)
OnlyVault
error OnlyVault(address caller)
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
PermitDeadlineExpired
error PermitDeadlineExpired(uint256 deadline)
ProtectUnauthorizedAccount
error ProtectUnauthorizedAccount(address account)
QueueNotSet
error QueueNotSet()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RemoveFail
error RemoveFail()
RewardTokenAlreadyApproved
error RewardTokenAlreadyApproved()
RewardTokenNotApproved
error RewardTokenNotApproved()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StrategyHasLockedAssets
error StrategyHasLockedAssets(address strategy)
SwapperBaseRewardrate
error SwapperBaseRewardrate()
SwapperBonusRewardrateCtToken
error SwapperBonusRewardrateCtToken()
SwapperBonusRewardrateSwapToken
error SwapperBonusRewardrateSwapToken()
SwapperBonusRewardrateUser
error SwapperBonusRewardrateUser()
SwapperMaxProgressionFactor
error SwapperMaxProgressionFactor()
TokenAlreadyRegistered
error TokenAlreadyRegistered(address tokenAddress)
TokenNotRegistered
error TokenNotRegistered(address tokenAddress)
TotalVaultsAllowedExceeded
error TotalVaultsAllowedExceeded(uint256 total)
TransferFailed
error TransferFailed(address token, address recipient, uint256 amount)
TreasuryAlreadySet
error TreasuryAlreadySet(address attacker)
TreasuryChangeRequestCooldownNotElapsed
error TreasuryChangeRequestCooldownNotElapsed(address sender)
UnfinalizedWithdrawl
error UnfinalizedWithdrawl(address queue)
UnregisteredTokensCannotBeRewards
error UnregisteredTokensCannotBeRewards(address tokenAddress)
VaultAlreadyExists
error VaultAlreadyExists()
VaultAssetMismatch
error VaultAssetMismatch()
VaultByTokenLimitExceeded
error VaultByTokenLimitExceeded(address token, uint256 total)
VaultDeployInitFailed
error VaultDeployInitFailed()
VaultDoesNotExist
error VaultDoesNotExist(address vault)
VaultIsIdle
error VaultIsIdle()
VaultZeroAddress
error VaultZeroAddress()
WithdrawalsPaused
error WithdrawalsPaused()
WithdrawDisabled
error WithdrawDisabled()
ZeroAmount
error ZeroAmount()
creation bytecode
0x608060405234801562000010575f80fd5b506040516200647438038062006474833981810160405281019062000036919062000f1f565b60015f819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620000a3576040517fa757747300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f8573ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156200012d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019062000157919062001117565b90505f8067ffffffffffffffff81111562000177576200017662000fbb565b5b604051908082528060200260200182016040528015620001b457816020015b620001a062000e37565b815260200190600190039081620001965790505b509050620002318783604051602001620001cf9190620011fc565b60405160208183030381529060405284604051602001620001f191906200125c565b604051602081830303815290604052897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a878a6200023e60201b60201c565b5050505050505062001898565b5f6200024f620008f160201b60201c565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f808267ffffffffffffffff16148015620002985750825b90505f60018367ffffffffffffffff16148015620002cc57505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015620002db575080155b1562000313576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550831562000361576001855f0160086101000a81548160ff0219169083151502179055505b620003716200091860201b60201c565b620003828d6200095d60201b60201c565b620003948c8c6200098160201b60201c565b620003a588620009a760201b60201c565b5f875114620006b7575f5b8751811015620006b5575f73ffffffffffffffffffffffffffffffffffffffff16888281518110620003e757620003e662001285565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff160362000440576040517f6a27e5f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f88828151811062000457576200045662001285565b5b602002602001015160400151146200049b576040517f7a9ebad900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b878181518110620004b157620004b062001285565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040162000518929190620012dd565b6020604051808303815f875af115801562000535573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200055b919062001342565b62000592576040517fdd61081500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002888281518110620005aa57620005a962001285565b5b6020026020010151908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201555050600160065f8a84815181106200064d576200064c62001285565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050620003b0565b505b5f73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16036200071d576040517f768dc59800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8960035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f890362000797576040517f7fb1277b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8860048190555060098d73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620008109190620013ad565b6200081c91906200140a565b60055f6101000a81548160ff021916908360ff1602179055508560015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000885620009cb60201b60201c565b8315620008e2575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d26001604051620008d99190620014a2565b60405180910390a15b50505050505050505050505050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b60025f540362000954576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f81905550565b6200096d620009d460201b60201c565b6200097e8162000a1d60201b60201c565b50565b62000991620009d460201b60201c565b620009a3828262000ac960201b60201c565b5050565b620009b7620009d460201b60201c565b620009c88162000b1960201b60201c565b50565b60015f81905550565b620009e462000bb060201b60201c565b62000a1b576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b62000a2d620009d460201b60201c565b5f62000a3e62000bd660201b60201c565b90505f8062000a538462000bfd60201b60201c565b915091508162000a6557601262000a67565b805b835f0160146101000a81548160ff021916908360ff16021790555083835f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b62000ad9620009d460201b60201c565b5f62000aea62000d1060201b60201c565b90508281600301908162000aff9190620016d8565b508181600401908162000b139190620016d8565b50505050565b62000b29620009d460201b60201c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000b9c575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000b939190620017bc565b60405180910390fd5b62000bad8162000d3760201b60201c565b50565b5f62000bc1620008f160201b60201c565b5f0160089054906101000a900460ff16905090565b5f7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00905090565b5f805f808473ffffffffffffffffffffffffffffffffffffffff1660405160240160405160208183030381529060405263313ce56760e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405162000c72919062001821565b5f60405180830381855afa9150503d805f811462000cac576040519150601f19603f3d011682016040523d82523d5f602084013e62000cb1565b606091505b509150915081801562000cc657506020815110155b1562000d02575f8180602001905181019062000ce3919062001868565b905060ff8016811162000d00576001819450945050505062000d0b565b505b5f809350935050505b915091565b5f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b5f62000d4862000e1060201b60201c565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81525090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000ea78262000e7c565b9050919050565b5f62000eba8262000e9b565b9050919050565b62000ecc8162000eae565b811462000ed7575f80fd5b50565b5f8151905062000eea8162000ec1565b92915050565b62000efb8162000e9b565b811462000f06575f80fd5b50565b5f8151905062000f198162000ef0565b92915050565b5f805f805f60a0868803121562000f3b5762000f3a62000e74565b5b5f62000f4a8882890162000eda565b955050602062000f5d8882890162000f09565b945050604062000f708882890162000f09565b935050606062000f838882890162000f09565b925050608062000f968882890162000f09565b9150509295509295909350565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b62000ff38262000fab565b810181811067ffffffffffffffff8211171562001015576200101462000fbb565b5b80604052505050565b5f6200102962000e6b565b905062001037828262000fe8565b919050565b5f67ffffffffffffffff82111562001059576200105862000fbb565b5b620010648262000fab565b9050602081019050919050565b5f5b838110156200109057808201518184015260208101905062001073565b5f8484015250505050565b5f620010b1620010ab846200103c565b6200101e565b905082815260208101848484011115620010d057620010cf62000fa7565b5b620010dd84828562001071565b509392505050565b5f82601f830112620010fc57620010fb62000fa3565b5b81516200110e8482602086016200109b565b91505092915050565b5f602082840312156200112f576200112e62000e74565b5b5f82015167ffffffffffffffff8111156200114f576200114e62000e78565b5b6200115d84828501620010e5565b91505092915050565b7f436f6e6372657465200000000000000000000000000000000000000000000000815250565b5f81519050919050565b5f81905092915050565b5f620011ac826200118c565b620011b8818562001196565b9350620011ca81856020860162001071565b80840191505092915050565b7f204d756c74695369672053747261746567790000000000000000000000000000815250565b5f620012088262001166565b6009820191506200121a8284620011a0565b91506200122782620011d6565b60128201915081905092915050565b7f63744d5300000000000000000000000000000000000000000000000000000000815250565b5f620012688262001236565b6004820191506200127a8284620011a0565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b620012bd8162000e9b565b82525050565b5f819050919050565b620012d781620012c3565b82525050565b5f604082019050620012f25f830185620012b2565b620013016020830184620012cc565b9392505050565b5f8115159050919050565b6200131e8162001308565b811462001329575f80fd5b50565b5f815190506200133c8162001313565b92915050565b5f602082840312156200135a576200135962000e74565b5b5f62001369848285016200132c565b91505092915050565b5f60ff82169050919050565b620013898162001372565b811462001394575f80fd5b50565b5f81519050620013a7816200137e565b92915050565b5f60208284031215620013c557620013c462000e74565b5b5f620013d48482850162001397565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620014168262001372565b9150620014238362001372565b9250828201905060ff8111156200143f576200143e620013dd565b5b92915050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f819050919050565b5f6200148a620014846200147e8462001445565b62001461565b6200144e565b9050919050565b6200149c816200146a565b82525050565b5f602082019050620014b75f83018462001491565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200150257607f821691505b602082108103620015185762001517620014bd565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200157c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200153f565b6200158886836200153f565b95508019841693508086168417925050509392505050565b5f620015c0620015ba620015b484620012c3565b62001461565b620012c3565b9050919050565b5f819050919050565b620015db83620015a0565b620015f3620015ea82620015c7565b8484546200154b565b825550505050565b5f90565b62001609620015fb565b62001616818484620015d0565b505050565b5b818110156200163d57620016315f82620015ff565b6001810190506200161c565b5050565b601f8211156200168c5762001656816200151e565b620016618462001530565b8101602085101562001671578190505b62001689620016808562001530565b8301826200161b565b50505b505050565b5f82821c905092915050565b5f620016ae5f198460080262001691565b1980831691505092915050565b5f620016c883836200169d565b9150826002028217905092915050565b620016e3826200118c565b67ffffffffffffffff811115620016ff57620016fe62000fbb565b5b6200170b8254620014ea565b6200171882828562001641565b5f60209050601f8311600181146200174e575f841562001739578287015190505b620017458582620016bb565b865550620017b4565b601f1984166200175e866200151e565b5f5b82811015620017875784890151825560018201915060208501945060208101905062001760565b86831015620017a75784890151620017a3601f8916826200169d565b8355505b6001600288020188555050505b505050505050565b5f602082019050620017d15f830184620012b2565b92915050565b5f81519050919050565b5f81905092915050565b5f620017f782620017d7565b620018038185620017e1565b93506200181581856020860162001071565b80840191505092915050565b5f6200182e8284620017eb565b915081905092915050565b6200184481620012c3565b81146200184f575f80fd5b50565b5f81519050620018628162001839565b92915050565b5f6020828403121562001880576200187f62000e74565b5b5f6200188f8482850162001852565b91505092915050565b614bce80620018a65f395ff3fe608060405234801561000f575f80fd5b5060043610610325575f3560e01c80637bb7bed1116101b6578063c697a5eb11610102578063e53b2017116100a0578063ef8b30f71161007a578063ef8b30f714610a54578063f282671d14610a84578063f2fde38b14610a8e578063f6ca71b014610aaa57610325565b8063e53b2017146109fe578063e74b981b14610a1a578063ecf7085814610a3657610325565b8063d905777e116100dc578063d905777e1461094d578063dbad982a1461097d578063dd62ed3e146109b0578063de7d4d6a146109e057610325565b8063c697a5eb146108d1578063c6e6f592146108ed578063ce96cb771461091d57610325565b8063b3d7f6b91161016f578063bdc8144b11610149578063bdc8144b1461084b578063be44f21514610867578063c4f59f9b14610883578063c63d75b6146108a157610325565b8063b3d7f6b9146107bb578063b460af94146107eb578063ba0876521461081b57610325565b80637bb7bed1146106cf5780638da5cb5b146107015780638dde593e1461071f57806394bf804d1461073d57806395d89b411461076d578063a9059cbb1461078b57610325565b806336e0004a116102755780634cdad5061161022e5780636e553f65116102085780636e553f6514610649578063703512be1461067957806370a0823114610695578063715018a6146106c557610325565b80634cdad506146105df5780634f87f5521461060f57806366e992e51461062b57610325565b806336e0004a1461051957806337f1834e1461053757806338d52e0f14610555578063402d267d1461057357806343a543b9146105a357806346904840146105c157610325565b80632287e96a116102e25780632a81196c116102bc5780632a81196c1461047d5780632fa7dcf5146104ad578063313ce567146104dd57806332424aa3146104fb57610325565b80632287e96a1461041357806323b872dd14610431578063284d30ef1461046157610325565b806301e1d1141461032957806306fdde031461034757806307a2d13a14610365578063095ea7b3146103955780630a28a477146103c557806318160ddd146103f5575b5f80fd5b610331610ac8565b60405161033e9190613a0e565b60405180910390f35b61034f610ad6565b60405161035c9190613ab1565b60405180910390f35b61037f600480360381019061037a9190613b0c565b610b74565b60405161038c9190613a0e565b60405180910390f35b6103af60048036038101906103aa9190613b91565b610b86565b6040516103bc9190613be9565b60405180910390f35b6103df60048036038101906103da9190613b0c565b610ba8565b6040516103ec9190613a0e565b60405180910390f35b6103fd610bbb565b60405161040a9190613a0e565b60405180910390f35b61041b610bd2565b6040516104289190613be9565b60405180910390f35b61044b60048036038101906104469190613c02565b610be4565b6040516104589190613be9565b60405180910390f35b61047b60048036038101906104769190613c52565b610c12565b005b61049760048036038101906104929190613da9565b610cc2565b6040516104a49190613ee3565b60405180910390f35b6104c760048036038101906104c29190613c52565b6113b7565b6040516104d49190613be9565b60405180910390f35b6104e56113d4565b6040516104f29190613f1e565b60405180910390f35b610503611409565b6040516105109190613f1e565b60405180910390f35b61052161141b565b60405161052e9190613f46565b60405180910390f35b61053f611440565b60405161054c9190613a0e565b60405180910390f35b61055d61151b565b60405161056a9190613f46565b60405180910390f35b61058d60048036038101906105889190613c52565b611550565b60405161059a9190613a0e565b60405180910390f35b6105ab611579565b6040516105b89190613be9565b60405180910390f35b6105c961157d565b6040516105d69190613f46565b60405180910390f35b6105f960048036038101906105f49190613b0c565b6115a2565b6040516106069190613a0e565b60405180910390f35b61062960048036038101906106249190613f81565b6115b4565b005b6106336117b1565b6040516106409190613f46565b60405180910390f35b610663600480360381019061065e9190613fac565b6117d9565b6040516106709190613a0e565b60405180910390f35b610693600480360381019061068e9190613f81565b611859565b005b6106af60048036038101906106aa9190613c52565b611a9a565b6040516106bc9190613a0e565b60405180910390f35b6106cd611aed565b005b6106e960048036038101906106e49190613b0c565b611b00565b6040516106f893929190614045565b60405180910390f35b610709611b54565b6040516107169190613f46565b60405180910390f35b610727611b89565b6040516107349190613a0e565b60405180910390f35b61075760048036038101906107529190613fac565b611b92565b6040516107649190613a0e565b60405180910390f35b610775611c12565b6040516107829190613ab1565b60405180910390f35b6107a560048036038101906107a09190613b91565b611cb0565b6040516107b29190613be9565b60405180910390f35b6107d560048036038101906107d09190613b0c565b611cd2565b6040516107e29190613a0e565b60405180910390f35b6108056004803603810190610800919061407a565b611ce5565b6040516108129190613a0e565b60405180910390f35b6108356004803603810190610830919061407a565b611d67565b6040516108429190613a0e565b60405180910390f35b61086560048036038101906108609190613b0c565b611de9565b005b610881600480360381019061087c91906140ca565b611e34565b005b61088b611f17565b60405161089891906141ff565b60405180910390f35b6108bb60048036038101906108b69190613c52565b611fdb565b6040516108c89190613a0e565b60405180910390f35b6108eb60048036038101906108e69190614249565b612004565b005b61090760048036038101906109029190613b0c565b612088565b6040516109149190613a0e565b60405180910390f35b61093760048036038101906109329190613c52565b61209a565b6040516109449190613a0e565b60405180910390f35b61096760048036038101906109629190613c52565b6120b4565b6040516109749190613a0e565b60405180910390f35b61099760048036038101906109929190613c52565b6120c5565b6040516109a79493929190614287565b60405180910390f35b6109ca60048036038101906109c591906142ca565b6120f1565b6040516109d79190613a0e565b60405180910390f35b6109e8612181565b6040516109f59190613f1e565b60405180910390f35b610a186004803603810190610a139190613c52565b612186565b005b610a346004803603810190610a2f9190613c52565b612241565b005b610a3e6122f1565b604051610a4b9190613a0e565b60405180910390f35b610a6e6004803603810190610a699190613b0c565b6122f7565b604051610a7b9190613a0e565b60405180910390f35b610a8c612309565b005b610aa86004803603810190610aa39190613c52565b61233b565b005b610ab26123bf565b604051610abf91906143b0565b60405180910390f35b5f610ad161240f565b905090565b60605f610ae1612418565b9050806003018054610af2906143fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1e906143fd565b8015610b695780601f10610b4057610100808354040283529160200191610b69565b820191905f5260205f20905b815481529060010190602001808311610b4c57829003601f168201915b505050505091505090565b5f610b7f825f61243f565b9050919050565b5f80610b90612497565b9050610b9d81858561249e565b600191505092915050565b5f610bb48260016124b0565b9050919050565b5f80610bc5612418565b9050806002015491505090565b600a5f9054906101000a900460ff1681565b5f80610bee612497565b9050610bfb858285612508565b610c0685858561259a565b60019150509392505050565b610c1a61268a565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c7f576040517fa757747300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d5557336040517f805a6f1b000000000000000000000000000000000000000000000000000000008152600401610d4c9190613f46565b60405180910390fd5b610d5e82612711565b5f60028054905090505f8167ffffffffffffffff811115610d8257610d81613c85565b5b604051908082528060200260200182016040528015610dbb57816020015b610da86139c8565b815260200190600190039081610da05790505b5090505f5b828110156113ac575f60028281548110610ddd57610ddc61442d565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f805f8084600201549050428560010154101580610e6e5750846001015481105b15610ee9575f856001015442118015610e8a5750856001015482105b610e945742610e9a565b85600101545b90508560030154866002015482610eb19190614487565b610ebb91906144ba565b9450428660020181905550808660010154610ed69190614487565b8660030154610ee591906144ba565b9250505b5f841115611068575f8673ffffffffffffffffffffffffffffffffffffffff166370a0823160015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610f4c9190613f46565b602060405180830381865afa158015610f67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8b919061450f565b9050610fba8760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16875f612714565b505f8773ffffffffffffffffffffffffffffffffffffffff166370a0823160015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016110169190613f46565b602060405180830381865afa158015611031573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611055919061450f565b905081816110639190614487565b945050505b61107061151b565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036110a6575f92505b60405180604001604052808773ffffffffffffffffffffffffffffffffffffffff168152602001848152508888815181106110e4576110e361442d565b5b60200260200101819052505f8673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111299190613f46565b602060405180830381865afa158015611144573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611168919061450f565b90508281111561118557828161117e9190614487565b9050611197565b876001019750505050505050506113a7565b5f8190505f821115611398575f6111e160028b815481106111bb576111ba61442d565b5b905f5260205f209060030201600101546127106001866127f1909392919063ffffffff16565b90506112108960035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16835f612714565b156112cc578060028b8154811061122a5761122961442d565b5b905f5260205f2090600302016002015f828254611247919061453a565b92505081905550808361125a9190614487565b915060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f121c5042302bae5fc561fbc64368f297ca60a880878e1e3a7f7e9380377260bf836040516112c39190613a0e565b60405180910390a25b5f821115611396575f8973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161130e9190613f46565b602060405180830381865afa158015611329573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134d919061450f565b90505f611358612846565b9050428a5f0181905550804261136e919061453a565b8a60010181905550428a60020181905550808261138b919061459a565b8a6003018190555050505b505b88600101985050505050505050505b610dc0565b508092505050919050565b6006602052805f5260405f205f915054906101000a900460ff1681565b5f806113de61284f565b90506113e8612876565b815f0160149054906101000a900460ff1661140391906145ca565b91505090565b60055f9054906101000a900460ff1681565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600a5f9054906101000a900460ff1661145e576009549050611518565b5f61146761151b565b73ffffffffffffffffffffffffffffffffffffffff166370a0823160085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016114c09190613f46565b602060405180830381865afa1580156114db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ff919061450f565b905060095481116115105780611514565b6009545b9150505b90565b5f8061152561284f565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b5f90565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6115ad825f61243f565b9050919050565b6115bc61268a565b6115c461287a565b5f73ffffffffffffffffffffffffffffffffffffffff16815f0160208101906115ed9190614639565b73ffffffffffffffffffffffffffffffffffffffff160361163a576040517f6a27e5f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f825f01602081019061164f9190614639565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156116cc576040517fde04748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f816040013514611709576040517f7a9ebad900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281908060018154018082558091505060019003905f5260205f2090600302015f90919091909150818161173e919061480f565b5050600160065f835f0160208101906117579190614639565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506117ae6128be565b50565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f806117e483611550565b90508084111561182f578284826040517f79012fb20000000000000000000000000000000000000000000000000000000081526004016118269392919061481d565b60405180910390fd5b5f611839856122f7565b905061184e611846612497565b8587846128c7565b809250505092915050565b61186161268a565b60065f825f0160208101906118769190614639565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166118f2576040517f9cdf007200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260016002805490506119069190614487565b815481106119175761191661442d565b5b905f5260205f209060030201600261193f835f01602081019061193a9190614639565b612a9f565b815481106119505761194f61442d565b5b905f5260205f2090600302015f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182015481600101556002820154816002015590505060028054806119e8576119e7614852565b5b600190038181905f5260205f2090600302015f8082015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182015f9055600282015f9055505090555f60065f835f016020810190611a489190614639565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f80611aa4612418565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b611af561268a565b611afe5f612b41565b565b60028181548110611b0f575f80fd5b905f5260205f2090600302015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b5f80611b5e612c12565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b5f600954905090565b5f80611b9d83611fdb565b905080841115611be8578284826040517f284ff667000000000000000000000000000000000000000000000000000000008152600401611bdf9392919061481d565b60405180910390fd5b5f611bf285611cd2565b9050611c07611bff612497565b8583886128c7565b809250505092915050565b60605f611c1d612418565b9050806004018054611c2e906143fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5a906143fd565b8015611ca55780601f10611c7c57610100808354040283529160200191611ca5565b820191905f5260205f20905b815481529060010190602001808311611c8857829003601f168201915b505050505091505090565b5f80611cba612497565b9050611cc781858561259a565b600191505092915050565b5f611cde82600161243f565b9050919050565b5f80611cf08361209a565b905080851115611d3b578285826040517ffe9cceec000000000000000000000000000000000000000000000000000000008152600401611d329392919061481d565b60405180910390fd5b5f611d4586610ba8565b9050611d5b611d52612497565b86868985612c39565b80925050509392505050565b5f80611d72836120b4565b905080851115611dbd578285826040517fb94abeec000000000000000000000000000000000000000000000000000000008152600401611db49392919061481d565b60405180910390fd5b5f611dc7866115a2565b9050611ddd611dd4612497565b8686848a612c39565b80925050509392505050565b611df161268a565b5f8103611e2a576040517f7fb1277b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060048190555050565b611e3c61268a565b60065f825f016020810190611e519190614639565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611ecd576040517f9cdf007200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611ee8825f016020810190611ee39190614639565b612a9f565b90508260028281548110611eff57611efe61442d565b5b905f5260205f20906003020160010181905550505050565b60606002805480602002602001604051908101604052809291908181526020015f905b82821015611fd2578382905f5260205f2090600302016040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152505081526020019060010190611f3a565b50505050905090565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b61200c61268a565b801561206b5760095482111561204e576040517fa9da48fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160095f82825461205f9190614487565b92505081905550612084565b8160095f82825461207c919061453a565b925050819055505b5050565b5f612093825f6124b0565b9050919050565b5f6120ad6120a783611a9a565b5f61243f565b9050919050565b5f6120be82611a9a565b9050919050565b6007602052805f5260405f205f91509050805f0154908060010154908060020154908060030154905084565b5f806120fb612418565b9050806001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205491505092915050565b600981565b61218e61268a565b61223e612199611b54565b6121a161151b565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121d99190613f46565b602060405180830381865afa1580156121f4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612218919061450f565b8373ffffffffffffffffffffffffffffffffffffffff16612de19092919063ffffffff16565b50565b61224961268a565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122ae576040517f768dc59800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60045481565b5f612302825f6124b0565b9050919050565b61231161268a565b600a5f9054906101000a900460ff1615600a5f6101000a81548160ff021916908315150217905550565b61234361268a565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123b3575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016123aa9190613f46565b60405180910390fd5b6123bc81612b41565b50565b60605f67ffffffffffffffff8111156123db576123da613c85565b5b6040519080825280602002602001820160405280156124095781602001602082028036833780820191505090505b50905090565b5f600954905090565b5f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b5f61248f600161244d610ac8565b612457919061453a565b61245f612876565b600a61246b91906149ae565b612473610bbb565b61247d919061453a565b84866127f1909392919063ffffffff16565b905092915050565b5f33905090565b6124ab8383836001612e60565b505050565b5f6125006124bc612876565b600a6124c891906149ae565b6124d0610bbb565b6124da919061453a565b60016124e4610ac8565b6124ee919061453a565b84866127f1909392919063ffffffff16565b905092915050565b5f61251384846120f1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125945781811015612585578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161257c9392919061481d565b60405180910390fd5b61259384848484035f612e60565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361260a575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016126019190613f46565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361267a575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016126719190613f46565b60405180910390fd5b61268583838361303d565b505050565b612692612497565b73ffffffffffffffffffffffffffffffffffffffff166126b0611b54565b73ffffffffffffffffffffffffffffffffffffffff161461270f576126d3612497565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016127069190613f46565b60405180910390fd5b565b50565b5f6127968563a9059cbb60e01b86866040516024016127349291906149f8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061326c565b9050801580156127a35750815b156127e9578484846040517fbf182be80000000000000000000000000000000000000000000000000000000081526004016127e093929190614a1f565b60405180910390fd5b949350505050565b5f806127fe8686866132c5565b9050612809836133c4565b801561282557505f84806128205761281f61456d565b5b868809115b1561283a57600181612837919061453a565b90505b80915050949350505050565b5f610708905090565b5f7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00905090565b5f90565b60025f54036128b5576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f81905550565b60015f81905550565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461295857336040517f805a6f1b00000000000000000000000000000000000000000000000000000000815260040161294f9190613f46565b60405180910390fd5b6004548261296461240f565b61296e919061453a565b11156129a6576040517f1264675f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8114806129b357505f82145b156129ea576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a1e8430846129f861151b565b73ffffffffffffffffffffffffffffffffffffffff166133f1909392919063ffffffff16565b612a288282613473565b612a328382613558565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051612a91929190614a54565b60405180910390a350505050565b5f8060028054905090505f5b81811015612b3a578373ffffffffffffffffffffffffffffffffffffffff1660028281548110612ade57612add61442d565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b2f57809250612b3a565b806001019050612aab565b5050919050565b5f612b4a612c12565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cca57336040517f805a6f1b000000000000000000000000000000000000000000000000000000008152600401612cc19190613f46565b60405180910390fd5b5f811480612cd757505f82145b15612d0e576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d166135d7565b612d2082826135d9565b612d2a8382613705565b612d5c8483612d3761151b565b73ffffffffffffffffffffffffffffffffffffffff16612de19092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051612dd2929190614a54565b60405180910390a45050505050565b612e5b838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612e149291906149f8565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613784565b505050565b5f612e69612418565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612edb575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612ed29190613f46565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612f4b575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612f429190613f46565b60405180910390fd5b82816001015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508115613036578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161302d9190613a0e565b60405180910390a35b5050505050565b5f613046612418565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361309a5781816002015f82825461308e919061453a565b9250508190555061316c565b5f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015613125578481846040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161311c9392919061481d565b60405180910390fd5b828103825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036131b55781816002015f8282540392505081905550613201565b81815f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161325e9190613a0e565b60405180910390a350505050565b5f805f8060205f8651602088015f8a5af192503d91505f5190508280156132ba57505f821461329e57600181146132b9565b5f8673ffffffffffffffffffffffffffffffffffffffff163b115b5b935050505092915050565b5f8083850290505f8019858709828110838203039150505f81036132fd578382816132f3576132f261456d565b5b04925050506133bd565b808411613336576040517f227bc15300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8486880990508281118203915080830392505f855f038616905080860495508084049350600181825f0304019050808302841793505f600287600302189050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050505b9392505050565b5f600160028360038111156133dc576133db614a7b565b5b6133e69190614aa8565b60ff16149050919050565b61346d848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161342693929190614a1f565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613784565b50505050565b8160095f828254613484919061453a565b925050819055505f61349461151b565b90506134e260085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848373ffffffffffffffffffffffffffffffffffffffff16612de19092919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f09211eaf4b905a8d574742de0c367f3d890026d0689179047403b99e97861fde8460085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405161354b929190614ad8565b60405180910390a2505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036135c8575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016135bf9190613f46565b60405180910390fd5b6135d35f838361303d565b5050565b565b600a5f9054906101000a900460ff1661361e576040517f37ae717b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160095f82825461362f9190614487565b925050819055505f61363f61151b565b905061368f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630858473ffffffffffffffffffffffffffffffffffffffff166133f1909392919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167ff906eaf1e8e5d7c41a0a15a1bd34d922ae8c93da6ba5dfbe6c367ff002d21be48460085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516136f8929190614ad8565b60405180910390a2505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613775575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161376c9190613f46565b60405180910390fd5b613780825f8361303d565b5050565b5f6137ae828473ffffffffffffffffffffffffffffffffffffffff1661381990919063ffffffff16565b90505f8151141580156137d25750808060200190518101906137d09190614b13565b155b1561381457826040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161380b9190613f46565b60405180910390fd5b505050565b606061382683835f61382e565b905092915050565b60608147101561387557306040517fcd78605900000000000000000000000000000000000000000000000000000000815260040161386c9190613f46565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16848660405161389d9190614b82565b5f6040518083038185875af1925050503d805f81146138d7576040519150601f19603f3d011682016040523d82523d5f602084013e6138dc565b606091505b50915091506138ec8683836138f7565b925050509392505050565b60608261390c5761390782613984565b61397c565b5f825114801561393257505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561397457836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161396b9190613f46565b60405180910390fd5b81905061397d565b5b9392505050565b5f815111156139965780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81525090565b5f819050919050565b613a08816139f6565b82525050565b5f602082019050613a215f8301846139ff565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613a5e578082015181840152602081019050613a43565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613a8382613a27565b613a8d8185613a31565b9350613a9d818560208601613a41565b613aa681613a69565b840191505092915050565b5f6020820190508181035f830152613ac98184613a79565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b613aeb816139f6565b8114613af5575f80fd5b50565b5f81359050613b0681613ae2565b92915050565b5f60208284031215613b2157613b20613ada565b5b5f613b2e84828501613af8565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613b6082613b37565b9050919050565b613b7081613b56565b8114613b7a575f80fd5b50565b5f81359050613b8b81613b67565b92915050565b5f8060408385031215613ba757613ba6613ada565b5b5f613bb485828601613b7d565b9250506020613bc585828601613af8565b9150509250929050565b5f8115159050919050565b613be381613bcf565b82525050565b5f602082019050613bfc5f830184613bda565b92915050565b5f805f60608486031215613c1957613c18613ada565b5b5f613c2686828701613b7d565b9350506020613c3786828701613b7d565b9250506040613c4886828701613af8565b9150509250925092565b5f60208284031215613c6757613c66613ada565b5b5f613c7484828501613b7d565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613cbb82613a69565b810181811067ffffffffffffffff82111715613cda57613cd9613c85565b5b80604052505050565b5f613cec613ad1565b9050613cf88282613cb2565b919050565b5f67ffffffffffffffff821115613d1757613d16613c85565b5b613d2082613a69565b9050602081019050919050565b828183375f83830152505050565b5f613d4d613d4884613cfd565b613ce3565b905082815260208101848484011115613d6957613d68613c81565b5b613d74848285613d2d565b509392505050565b5f82601f830112613d9057613d8f613c7d565b5b8135613da0848260208601613d3b565b91505092915050565b5f60208284031215613dbe57613dbd613ada565b5b5f82013567ffffffffffffffff811115613ddb57613dda613ade565b5b613de784828501613d7c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613e2281613b56565b82525050565b613e31816139f6565b82525050565b604082015f820151613e4b5f850182613e19565b506020820151613e5e6020850182613e28565b50505050565b5f613e6f8383613e37565b60408301905092915050565b5f602082019050919050565b5f613e9182613df0565b613e9b8185613dfa565b9350613ea683613e0a565b805f5b83811015613ed6578151613ebd8882613e64565b9750613ec883613e7b565b925050600181019050613ea9565b5085935050505092915050565b5f6020820190508181035f830152613efb8184613e87565b905092915050565b5f60ff82169050919050565b613f1881613f03565b82525050565b5f602082019050613f315f830184613f0f565b92915050565b613f4081613b56565b82525050565b5f602082019050613f595f830184613f37565b92915050565b5f80fd5b5f60608284031215613f7857613f77613f5f565b5b81905092915050565b5f60608284031215613f9657613f95613ada565b5b5f613fa384828501613f63565b91505092915050565b5f8060408385031215613fc257613fc1613ada565b5b5f613fcf85828601613af8565b9250506020613fe085828601613b7d565b9150509250929050565b5f819050919050565b5f61400d61400861400384613b37565b613fea565b613b37565b9050919050565b5f61401e82613ff3565b9050919050565b5f61402f82614014565b9050919050565b61403f81614025565b82525050565b5f6060820190506140585f830186614036565b61406560208301856139ff565b61407260408301846139ff565b949350505050565b5f805f6060848603121561409157614090613ada565b5b5f61409e86828701613af8565b93505060206140af86828701613b7d565b92505060406140c086828701613b7d565b9150509250925092565b5f80608083850312156140e0576140df613ada565b5b5f6140ed85828601613af8565b92505060206140fe85828601613f63565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61413a81614025565b82525050565b606082015f8201516141545f850182614131565b5060208201516141676020850182613e28565b50604082015161417a6040850182613e28565b50505050565b5f61418b8383614140565b60608301905092915050565b5f602082019050919050565b5f6141ad82614108565b6141b78185614112565b93506141c283614122565b805f5b838110156141f25781516141d98882614180565b97506141e483614197565b9250506001810190506141c5565b5085935050505092915050565b5f6020820190508181035f83015261421781846141a3565b905092915050565b61422881613bcf565b8114614232575f80fd5b50565b5f813590506142438161421f565b92915050565b5f806040838503121561425f5761425e613ada565b5b5f61426c85828601613af8565b925050602061427d85828601614235565b9150509250929050565b5f60808201905061429a5f8301876139ff565b6142a760208301866139ff565b6142b460408301856139ff565b6142c160608301846139ff565b95945050505050565b5f80604083850312156142e0576142df613ada565b5b5f6142ed85828601613b7d565b92505060206142fe85828601613b7d565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61433c8383613e19565b60208301905092915050565b5f602082019050919050565b5f61435e82614308565b6143688185614312565b935061437383614322565b805f5b838110156143a357815161438a8882614331565b975061439583614348565b925050600181019050614376565b5085935050505092915050565b5f6020820190508181035f8301526143c88184614354565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061441457607f821691505b602082108103614427576144266143d0565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614491826139f6565b915061449c836139f6565b92508282039050818111156144b4576144b361445a565b5b92915050565b5f6144c4826139f6565b91506144cf836139f6565b92508282026144dd816139f6565b915082820484148315176144f4576144f361445a565b5b5092915050565b5f8151905061450981613ae2565b92915050565b5f6020828403121561452457614523613ada565b5b5f614531848285016144fb565b91505092915050565b5f614544826139f6565b915061454f836139f6565b92508282019050808211156145675761456661445a565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6145a4826139f6565b91506145af836139f6565b9250826145bf576145be61456d565b5b828204905092915050565b5f6145d482613f03565b91506145df83613f03565b9250828201905060ff8111156145f8576145f761445a565b5b92915050565b5f61460882613b56565b9050919050565b614618816145fe565b8114614622575f80fd5b50565b5f813590506146338161460f565b92915050565b5f6020828403121561464e5761464d613ada565b5b5f61465b84828501614625565b91505092915050565b5f81356146708161460f565b80915050919050565b5f815f1b9050919050565b5f73ffffffffffffffffffffffffffffffffffffffff6146a384614679565b9350801983169250808416831791505092915050565b5f6146c382613ff3565b9050919050565b5f6146d4826146b9565b9050919050565b5f819050919050565b6146ed826146ca565b6147006146f9826146db565b8354614684565b8255505050565b5f813561471381613ae2565b80915050919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61474784614679565b9350801983169250808416831791505092915050565b5f61477761477261476d846139f6565b613fea565b6139f6565b9050919050565b5f819050919050565b6147908261475d565b6147a361479c8261477e565b835461471c565b8255505050565b5f81015f8301806147ba81614664565b90506147c681846146e4565b5050506001810160208301806147db81614707565b90506147e78184614787565b5050506002810160408301806147fc81614707565b90506148088184614787565b5050505050565b61481982826147aa565b5050565b5f6060820190506148305f830186613f37565b61483d60208301856139ff565b61484a60408301846139ff565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156148d4578086048111156148b0576148af61445a565b5b60018516156148bf5780820291505b80810290506148cd8561487f565b9450614894565b94509492505050565b5f826148ec57600190506149a7565b816148f9575f90506149a7565b816001811461490f576002811461491957614948565b60019150506149a7565b60ff84111561492b5761492a61445a565b5b8360020a9150848211156149425761494161445a565b5b506149a7565b5060208310610133831016604e8410600b841016171561497d5782820a9050838111156149785761497761445a565b5b6149a7565b61498a848484600161488b565b925090508184048111156149a1576149a061445a565b5b81810290505b9392505050565b5f6149b8826139f6565b91506149c383613f03565b92506149f07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846148dd565b905092915050565b5f604082019050614a0b5f830185613f37565b614a1860208301846139ff565b9392505050565b5f606082019050614a325f830186613f37565b614a3f6020830185613f37565b614a4c60408301846139ff565b949350505050565b5f604082019050614a675f8301856139ff565b614a7460208301846139ff565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f614ab282613f03565b9150614abd83613f03565b925082614acd57614acc61456d565b5b828206905092915050565b5f604082019050614aeb5f8301856139ff565b614af86020830184613f37565b9392505050565b5f81519050614b0d8161421f565b92915050565b5f60208284031215614b2857614b27613ada565b5b5f614b3584828501614aff565b91505092915050565b5f81519050919050565b5f81905092915050565b5f614b5c82614b3e565b614b668185614b48565b9350614b76818560208601613a41565b80840191505092915050565b5f614b8d8284614b52565b91508190509291505056fea2646970667358221220c15fd4ee2a4e438deeef19b229638744e89ca2dd565e3d0889715fbd330c5a6a64736f6c63430008180033000000000000000000000000d9d920aa40f578ab794426f5c90f6c731d159def000000000000000000000000800123cac8afd425270d4ce52f6d404e476dce6e000000000000000000000000800123cac8afd425270d4ce52f6d404e476dce6e000000000000000000000000771845f20591cb146e42f372180e5f3c53e516160000000000000000000000005a35b8817cb92dcd7196b243351f018c4982c010