More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15061526 | 943 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
VestingPool
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.8.0 <0.9.0; import "./vendor/@openzeppelin/contracts/token/ERC20/IERC20.sol"; /// @title Vesting contract for multiple accounts /// @author Richard Meissner - @rmeissner contract VestingPool { event AddedVesting(bytes32 indexed id, address indexed account); event ClaimedVesting(bytes32 indexed id, address indexed account, address indexed beneficiary); event PausedVesting(bytes32 indexed id); event UnpausedVesting(bytes32 indexed id); event CancelledVesting(bytes32 indexed id); // Sane limits based on: https://eips.ethereum.org/EIPS/eip-1985 // amountClaimed should always be equal to or less than amount // pausingDate should always be equal to or greater than startDate struct Vesting { // First storage slot address account; // 20 bytes uint8 curveType; // 1 byte -> Max 256 different curve types bool managed; // 1 byte uint16 durationWeeks; // 2 bytes -> Max 65536 weeks ~ 1260 years uint64 startDate; // 8 bytes -> Works until year 292278994, but not before 1970 // Second storage slot uint128 amount; // 16 bytes -> Max 3.4e20 tokens (including decimals) uint128 amountClaimed; // 16 bytes -> Max 3.4e20 tokens (including decimals) // Third storage slot uint64 pausingDate; // 8 bytes -> Works until year 292278994, but not before 1970 bool cancelled; // 1 byte } // keccak256( // "EIP712Domain(uint256 chainId,address verifyingContract)" // ); bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218; // keccak256( // "Vesting(address account,uint8 curveType,bool managed,uint16 durationWeeks,uint64 startDate,uint128 amount)" // ); bytes32 private constant VESTING_TYPEHASH = 0x43838b5ce9ca440d1ac21b07179a1fdd88aa2175e5ea103f6e37aa6d18ce78ad; address public immutable token; address public immutable poolManager; uint256 public totalTokensInVesting; mapping(bytes32 => Vesting) public vestings; modifier onlyPoolManager() { require(msg.sender == poolManager, "Can only be called by pool manager"); _; } constructor(address _token, address _poolManager) { token = _token; poolManager = _poolManager; } /// @notice Create a vesting on this pool for `account`. /// @dev This can only be called by the pool manager /// @dev It is required that the pool has enough tokens available /// @param account The account for which the vesting is created /// @param curveType Type of the curve that should be used for the vesting /// @param managed Boolean that indicates if the vesting can be managed by the pool manager /// @param durationWeeks The duration of the vesting in weeks /// @param startDate The date when the vesting should be started (can be in the past) /// @param amount Amount of tokens that should be vested in atoms function addVesting( address account, uint8 curveType, bool managed, uint16 durationWeeks, uint64 startDate, uint128 amount ) public virtual onlyPoolManager { _addVesting(account, curveType, managed, durationWeeks, startDate, amount); } /// @notice Calculate the amount of tokens available for new vestings. /// @dev This value changes when more tokens are deposited to this contract /// @return Amount of tokens that can be used for new vestings. function tokensAvailableForVesting() public view virtual returns (uint256) { return IERC20(token).balanceOf(address(this)) - totalTokensInVesting; } /// @notice Create a vesting on this pool for `account`. /// @dev It is required that the pool has enough tokens available /// @dev Account cannot be zero address /// @param account The account for which the vesting is created /// @param curveType Type of the curve that should be used for the vesting /// @param managed Boolean that indicates if the vesting can be managed by the pool manager /// @param durationWeeks The duration of the vesting in weeks /// @param startDate The date when the vesting should be started (can be in the past) /// @param amount Amount of tokens that should be vested in atoms /// @param vestingId The id of the created vesting function _addVesting( address account, uint8 curveType, bool managed, uint16 durationWeeks, uint64 startDate, uint128 amount ) internal returns (bytes32 vestingId) { require(account != address(0), "Invalid account"); require(curveType < 2, "Invalid vesting curve"); vestingId = vestingHash(account, curveType, managed, durationWeeks, startDate, amount); require(vestings[vestingId].account == address(0), "Vesting id already used"); // Check that enough tokens are available for the new vesting uint256 availableTokens = tokensAvailableForVesting(); require(availableTokens >= amount, "Not enough tokens available"); // Mark tokens for this vesting in use totalTokensInVesting += amount; vestings[vestingId] = Vesting({ account: account, curveType: curveType, managed: managed, durationWeeks: durationWeeks, startDate: startDate, amount: amount, amountClaimed: 0, pausingDate: 0, cancelled: false }); emit AddedVesting(vestingId, account); } /// @notice Claim `tokensToClaim` tokens from vesting `vestingId` and transfer them to the `beneficiary`. /// @dev This can only be called by the owner of the vesting /// @dev Beneficiary cannot be the 0-address /// @dev This will trigger a transfer of tokens /// @param vestingId Id of the vesting from which the tokens should be claimed /// @param beneficiary Account that should receive the claimed tokens /// @param tokensToClaim Amount of tokens to claim in atoms or max uint128 to claim all available function claimVestedTokens( bytes32 vestingId, address beneficiary, uint128 tokensToClaim ) public { uint128 tokensClaimed = updateClaimedTokens(vestingId, beneficiary, tokensToClaim); require(IERC20(token).transfer(beneficiary, tokensClaimed), "Token transfer failed"); } /// @notice Update `amountClaimed` on vesting `vestingId` by `tokensToClaim` tokens. /// @dev This can only be called by the owner of the vesting /// @dev Beneficiary cannot be the 0-address /// @dev This will only update the internal state and NOT trigger the transfer of tokens. /// @param vestingId Id of the vesting from which the tokens should be claimed /// @param beneficiary Account that should receive the claimed tokens /// @param tokensToClaim Amount of tokens to claim in atoms or max uint128 to claim all available /// @param tokensClaimed Amount of tokens that have been newly claimed by calling this method function updateClaimedTokens( bytes32 vestingId, address beneficiary, uint128 tokensToClaim ) internal returns (uint128 tokensClaimed) { require(beneficiary != address(0), "Cannot claim to 0-address"); Vesting storage vesting = vestings[vestingId]; require(vesting.account == msg.sender, "Can only be claimed by vesting owner"); // Calculate how many tokens can be claimed uint128 availableClaim = _calculateVestedAmount(vesting) - vesting.amountClaimed; // If max uint128 is used, claim all available tokens. tokensClaimed = tokensToClaim == type(uint128).max ? availableClaim : tokensToClaim; require(tokensClaimed <= availableClaim, "Trying to claim too many tokens"); // Adjust how many tokens are locked in vesting totalTokensInVesting -= tokensClaimed; vesting.amountClaimed += tokensClaimed; emit ClaimedVesting(vestingId, vesting.account, beneficiary); } /// @notice Cancel vesting `vestingId`. /// @dev This can only be called by the pool manager /// @dev Only manageable vestings can be cancelled /// @param vestingId Id of the vesting that should be cancelled function cancelVesting(bytes32 vestingId) public onlyPoolManager { Vesting storage vesting = vestings[vestingId]; require(vesting.account != address(0), "Vesting not found"); require(vesting.managed, "Only managed vestings can be cancelled"); require(!vesting.cancelled, "Vesting already cancelled"); bool isFutureVesting = block.timestamp <= vesting.startDate; // If vesting is not already paused it will be paused // Pausing date should not be reset else tokens of the initial pause can be claimed if (vesting.pausingDate == 0) { // pausingDate should always be larger or equal to startDate vesting.pausingDate = isFutureVesting ? vesting.startDate : uint64(block.timestamp); } // Vesting is cancelled, therefore tokens that are not vested yet, will be added back to the pool uint128 unusedToken = isFutureVesting ? vesting.amount : vesting.amount - _calculateVestedAmount(vesting); totalTokensInVesting -= unusedToken; // Vesting is set to cancelled and therefore disallows unpausing vesting.cancelled = true; emit CancelledVesting(vestingId); } /// @notice Pause vesting `vestingId`. /// @dev This can only be called by the pool manager /// @dev Only manageable vestings can be paused /// @param vestingId Id of the vesting that should be paused function pauseVesting(bytes32 vestingId) public onlyPoolManager { Vesting storage vesting = vestings[vestingId]; require(vesting.account != address(0), "Vesting not found"); require(vesting.managed, "Only managed vestings can be paused"); require(vesting.pausingDate == 0, "Vesting already paused"); // pausingDate should always be larger or equal to startDate vesting.pausingDate = block.timestamp <= vesting.startDate ? vesting.startDate : uint64(block.timestamp); emit PausedVesting(vestingId); } /// @notice Unpause vesting `vestingId`. /// @dev This can only be called by the pool manager /// @dev Only vestings that have not been cancelled can be unpaused /// @param vestingId Id of the vesting that should be unpaused function unpauseVesting(bytes32 vestingId) public onlyPoolManager { Vesting storage vesting = vestings[vestingId]; require(vesting.account != address(0), "Vesting not found"); require(vesting.pausingDate != 0, "Vesting is not paused"); require(!vesting.cancelled, "Vesting has been cancelled and cannot be unpaused"); // Calculate the time the vesting was paused // If vesting has not started yet, then pausing date might be in the future uint64 timePaused = block.timestamp <= vesting.pausingDate ? 0 : uint64(block.timestamp) - vesting.pausingDate; // Offset the start date to create the effect of pausing vesting.startDate = vesting.startDate + timePaused; vesting.pausingDate = 0; emit UnpausedVesting(vestingId); } /// @notice Calculate vested and claimed token amounts for vesting `vestingId`. /// @dev This will revert if the vesting has not been started yet /// @param vestingId Id of the vesting for which to calculate the amounts /// @return vestedAmount The amount in atoms of tokens vested /// @return claimedAmount The amount in atoms of tokens claimed function calculateVestedAmount(bytes32 vestingId) external view returns (uint128 vestedAmount, uint128 claimedAmount) { Vesting storage vesting = vestings[vestingId]; require(vesting.account != address(0), "Vesting not found"); vestedAmount = _calculateVestedAmount(vesting); claimedAmount = vesting.amountClaimed; } /// @notice Calculate vested token amount for vesting `vesting`. /// @dev This will revert if the vesting has not been started yet /// @param vesting The vesting for which to calculate the amounts /// @return vestedAmount The amount in atoms of tokens vested function _calculateVestedAmount(Vesting storage vesting) internal view returns (uint128 vestedAmount) { require(vesting.startDate <= block.timestamp, "Vesting not active yet"); // Convert vesting duration to seconds uint64 durationSeconds = uint64(vesting.durationWeeks) * 7 * 24 * 60 * 60; // If contract is paused use the pausing date to calculate amount uint64 vestedSeconds = vesting.pausingDate > 0 ? vesting.pausingDate - vesting.startDate : uint64(block.timestamp) - vesting.startDate; if (vestedSeconds >= durationSeconds) { // If vesting time is longer than duration everything has been vested vestedAmount = vesting.amount; } else if (vesting.curveType == 0) { // Linear vesting vestedAmount = calculateLinear(vesting.amount, vestedSeconds, durationSeconds); } else if (vesting.curveType == 1) { // Exponential vesting vestedAmount = calculateExponential(vesting.amount, vestedSeconds, durationSeconds); } else { // This is unreachable because it is not possible to add a vesting with an invalid curve type revert("Invalid curve type"); } } /// @notice Calculate vested token amount on a linear curve. /// @dev Calculate vested amount on linear curve: targetAmount * elapsedTime / totalTime /// @param targetAmount Amount of tokens that is being vested /// @param elapsedTime Time that has elapsed for the vesting /// @param totalTime Duration of the vesting /// @return Tokens that have been vested on a linear curve function calculateLinear( uint128 targetAmount, uint64 elapsedTime, uint64 totalTime ) internal pure returns (uint128) { // Calculate vested amount on linear curve: targetAmount * elapsedTime / totalTime uint256 amount = (uint256(targetAmount) * uint256(elapsedTime)) / uint256(totalTime); require(amount <= type(uint128).max, "Overflow in curve calculation"); return uint128(amount); } /// @notice Calculate vested token amount on an exponential curve. /// @dev Calculate vested amount on exponential curve: targetAmount * elapsedTime^2 / totalTime^2 /// @param targetAmount Amount of tokens that is being vested /// @param elapsedTime Time that has elapsed for the vesting /// @param totalTime Duration of the vesting /// @return Tokens that have been vested on an exponential curve function calculateExponential( uint128 targetAmount, uint64 elapsedTime, uint64 totalTime ) internal pure returns (uint128) { // Calculate vested amount on exponential curve: targetAmount * elapsedTime^2 / totalTime^2 uint256 amount = (uint256(targetAmount) * uint256(elapsedTime) * uint256(elapsedTime)) / (uint256(totalTime) * uint256(totalTime)); require(amount <= type(uint128).max, "Overflow in curve calculation"); return uint128(amount); } /// @notice Calculate the id for a vesting based on its parameters. /// @dev The id is a EIP-712 based hash of the vesting. /// @param account The account for which the vesting was created /// @param curveType Type of the curve that is used for the vesting /// @param managed Indicator if the vesting is managed by the pool manager /// @param durationWeeks The duration of the vesting in weeks /// @param startDate The date when the vesting started (can be in the future) /// @param amount Amount of tokens that are vested in atoms /// @return vestingId Id of a vesting based on its parameters function vestingHash( address account, uint8 curveType, bool managed, uint16 durationWeeks, uint64 startDate, uint128 amount ) public view returns (bytes32 vestingId) { bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, block.chainid, this)); bytes32 vestingDataHash = keccak256(abi.encode(VESTING_TYPEHASH, account, curveType, managed, durationWeeks, startDate, amount)); vestingId = keccak256(abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator, vestingDataHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_poolManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AddedVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"CancelledVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"}],"name":"ClaimedVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"PausedVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"UnpausedVesting","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"curveType","type":"uint8"},{"internalType":"bool","name":"managed","type":"bool"},{"internalType":"uint16","name":"durationWeeks","type":"uint16"},{"internalType":"uint64","name":"startDate","type":"uint64"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"addVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"}],"name":"calculateVestedAmount","outputs":[{"internalType":"uint128","name":"vestedAmount","type":"uint128"},{"internalType":"uint128","name":"claimedAmount","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"}],"name":"cancelVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint128","name":"tokensToClaim","type":"uint128"}],"name":"claimVestedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"}],"name":"pauseVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"poolManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensAvailableForVesting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensInVesting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"}],"name":"unpauseVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"curveType","type":"uint8"},{"internalType":"bool","name":"managed","type":"bool"},{"internalType":"uint16","name":"durationWeeks","type":"uint16"},{"internalType":"uint64","name":"startDate","type":"uint64"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"vestingHash","outputs":[{"internalType":"bytes32","name":"vestingId","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"vestings","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"curveType","type":"uint8"},{"internalType":"bool","name":"managed","type":"bool"},{"internalType":"uint16","name":"durationWeeks","type":"uint16"},{"internalType":"uint64","name":"startDate","type":"uint64"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint128","name":"amountClaimed","type":"uint128"},{"internalType":"uint64","name":"pausingDate","type":"uint64"},{"internalType":"bool","name":"cancelled","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b506040516200308d3803806200308d833981810160405281019062000037919062000111565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050505062000158565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000d982620000ac565b9050919050565b620000eb81620000cc565b8114620000f757600080fd5b50565b6000815190506200010b81620000e0565b92915050565b600080604083850312156200012b576200012a620000a7565b5b60006200013b85828601620000fa565b92505060206200014e85828601620000fa565b9150509250929050565b60805160a051612ee5620001a8600039600081816103500152818161069101528181610a7801528181610b1d015261106101526000818161026d015281816105e801526110850152612ee56000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80636cbab079116100715780636cbab079146101795780638f5b3c3b146101955780639fb0c41d146101b1578063d7faa145146101e9578063dc4c90d31461021a578063fc0c546a14610238576100b4565b806307380481146100b9578063166bbd3b146100d75780632bafa73c146100f35780632e0427aa1461010f5780633034d5341461012d5780635d76df6b14610149575b600080fd5b6100c1610256565b6040516100ce9190611c3c565b60405180910390f35b6100f160048036038101906100ec9190611d38565b61025c565b005b61010d60048036038101906101089190611d8b565b61034e565b005b6101176105e2565b6040516101249190611c3c565b60405180910390f35b61014760048036038101906101429190611d8b565b61068f565b005b610163600480360381019061015e9190611ea3565b610986565b6040516101709190611f3f565b60405180910390f35b610193600480360381019061018e9190611ea3565b610a76565b005b6101af60048036038101906101aa9190611d8b565b610b1b565b005b6101cb60048036038101906101c69190611d8b565b610e7a565b6040516101e099989796959493929190611fb4565b60405180910390f35b61020360048036038101906101fe9190611d8b565b610f7d565b604051610211929190612041565b60405180910390f35b61022261105f565b60405161022f919061206a565b60405180910390f35b610240611083565b60405161024d919061206a565b60405180910390f35b60005481565b60006102698484846110a7565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016102c69291906120c0565b6020604051808303816000875af11580156102e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030991906120fe565b610348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033f90612188565b60405180910390fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d39061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047e90612286565b60405180910390fd5b8060000160159054906101000a900460ff166104d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cf90612318565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161461053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053490612384565b60405180910390fd5b8060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561056d5742610587565b8060000160189054906101000a900467ffffffffffffffff165b8160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550817f871860f90ed272e98149ef133136694f00424a57465aa85bfc2535dfd4d450b860405160405180910390a25050565b600080547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161063f919061206a565b602060405180830381865afa15801561065c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068091906123d0565b61068a919061242c565b905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461071d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107149061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf90612286565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141561082e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610825906124ac565b60405180910390fd5b8060020160089054906101000a900460ff1615610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108779061253e565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff164211156108d5578160020160009054906101000a900467ffffffffffffffff16426108d0919061255e565b6108d8565b60005b9050808260000160189054906101000a900467ffffffffffffffff166108fe9190612592565b8260000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008260020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550827f1bf30dbd59905813e462b38cc5a44f3aadd0ee101ec6d7537139f5c7f8a9868560405160405180910390a2505050565b6000807f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b46306040516020016109c193929190612625565b60405160208183030381529060405280519060200120905060007f43838b5ce9ca440d1ac21b07179a1fdd88aa2175e5ea103f6e37aa6d18ce78ad60001b898989898989604051602001610a1b979695949392919061265c565b604051602081830303815290604052805190602001209050601960f81b600160f81b8383604051602001610a529493929190612739565b60405160208183030381529060405280519060200120925050509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb9061221a565b60405180910390fd5b610b128686868686866113ac565b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba09061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4b90612286565b60405180910390fd5b8060000160159054906101000a900460ff16610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c906127f9565b60405180910390fd5b8060020160089054906101000a900460ff1615610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90612865565b60405180910390fd5b60008160000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115905060008260020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415610d9c5780610d575742610d71565b8160000160189054906101000a900467ffffffffffffffff165b8260020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b600081610ddc57610dac8361184c565b8360010160009054906101000a90046fffffffffffffffffffffffffffffffff16610dd79190612885565b610dfe565b8260010160009054906101000a90046fffffffffffffffffffffffffffffffff165b9050806fffffffffffffffffffffffffffffffff16600080828254610e23919061242c565b9250508190555060018360020160086101000a81548160ff021916908315150217905550837fc27a46a60d5d211f8ef42242a25d5db8357aefb1bd0e7d8fbab00d4c40d4d1c760405160405180910390a250505050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060000160159054906101000a900460ff16908060000160169054906101000a900461ffff16908060000160189054906101000a900467ffffffffffffffff16908060010160009054906101000a90046fffffffffffffffffffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff16908060020160009054906101000a900467ffffffffffffffff16908060020160089054906101000a900460ff16905089565b6000806000600160008581526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290612286565b60405180910390fd5b6110348161184c565b92508060010160109054906101000a90046fffffffffffffffffffffffffffffffff16915050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90612905565b60405180910390fd5b60006001600086815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890612997565b60405180910390fd5b60008160010160109054906101000a90046fffffffffffffffffffffffffffffffff166111ed8361184c565b6111f79190612885565b90506fffffffffffffffffffffffffffffffff8016846fffffffffffffffffffffffffffffffff161461122a578361122c565b805b9250806fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff161115611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c90612a03565b60405180910390fd5b826fffffffffffffffffffffffffffffffff166000808282546112b8919061242c565b92505081905550828260010160108282829054906101000a90046fffffffffffffffffffffffffffffffff166112ee9190612a23565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16877f31b718389b1eb92df83ab00c1a5112e5bb8a02c7c1c9c02e1e3c15ad33e0532660405160405180910390a450509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561141d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141490612ab5565b60405180910390fd5b60028660ff1610611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90612b21565b60405180910390fd5b611471878787878787610986565b9050600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90612b8d565b60405180910390fd5b60006115226105e2565b9050826fffffffffffffffffffffffffffffffff16811015611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090612bf9565b60405180910390fd5b826fffffffffffffffffffffffffffffffff1660008082825461159c9190612c19565b925050819055506040518061012001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018860ff16815260200187151581526020018661ffff1681526020018567ffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152506001600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff02191690831515021790555060608201518160000160166101000a81548161ffff021916908361ffff16021790555060808201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060e08201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101008201518160020160086101000a81548160ff0219169083151502179055509050508773ffffffffffffffffffffffffffffffffffffffff16827fff2781f5af6cf115d187dd0e4ef590f5d1288b83ef3eb6739c69db99e70c8b4d60405160405180910390a3509695505050505050565b6000428260000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1611156118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa90612cbb565b60405180910390fd5b6000603c80601860078660000160169054906101000a900461ffff1661ffff166118dd9190612cdb565b6118e79190612cdb565b6118f19190612cdb565b6118fb9190612cdb565b90506000808460020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611611951578360000160189054906101000a900467ffffffffffffffff164261194c919061255e565b61198e565b8360000160189054906101000a900467ffffffffffffffff168460020160009054906101000a900467ffffffffffffffff1661198d919061255e565b5b90508167ffffffffffffffff168167ffffffffffffffff16106119d3578360010160009054906101000a90046fffffffffffffffffffffffffffffffff169250611aae565b60008460000160149054906101000a900460ff1660ff161415611a2257611a1b8460010160009054906101000a90046fffffffffffffffffffffffffffffffff168284611ab5565b9250611aad565b60018460000160149054906101000a900460ff1660ff161415611a7157611a6a8460010160009054906101000a90046fffffffffffffffffffffffffffffffff168284611b57565b9250611aac565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa390612d69565b60405180910390fd5b5b5b5050919050565b6000808267ffffffffffffffff168467ffffffffffffffff16866fffffffffffffffffffffffffffffffff16611aeb9190612d89565b611af59190612e12565b90506fffffffffffffffffffffffffffffffff8016811115611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390612e8f565b60405180910390fd5b809150509392505050565b6000808267ffffffffffffffff168367ffffffffffffffff16611b7a9190612d89565b8467ffffffffffffffff168567ffffffffffffffff16876fffffffffffffffffffffffffffffffff16611bad9190612d89565b611bb79190612d89565b611bc19190612e12565b90506fffffffffffffffffffffffffffffffff8016811115611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90612e8f565b60405180910390fd5b809150509392505050565b6000819050919050565b611c3681611c23565b82525050565b6000602082019050611c516000830184611c2d565b92915050565b600080fd5b6000819050919050565b611c6f81611c5c565b8114611c7a57600080fd5b50565b600081359050611c8c81611c66565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611cbd82611c92565b9050919050565b611ccd81611cb2565b8114611cd857600080fd5b50565b600081359050611cea81611cc4565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611d1581611cf0565b8114611d2057600080fd5b50565b600081359050611d3281611d0c565b92915050565b600080600060608486031215611d5157611d50611c57565b5b6000611d5f86828701611c7d565b9350506020611d7086828701611cdb565b9250506040611d8186828701611d23565b9150509250925092565b600060208284031215611da157611da0611c57565b5b6000611daf84828501611c7d565b91505092915050565b600060ff82169050919050565b611dce81611db8565b8114611dd957600080fd5b50565b600081359050611deb81611dc5565b92915050565b60008115159050919050565b611e0681611df1565b8114611e1157600080fd5b50565b600081359050611e2381611dfd565b92915050565b600061ffff82169050919050565b611e4081611e29565b8114611e4b57600080fd5b50565b600081359050611e5d81611e37565b92915050565b600067ffffffffffffffff82169050919050565b611e8081611e63565b8114611e8b57600080fd5b50565b600081359050611e9d81611e77565b92915050565b60008060008060008060c08789031215611ec057611ebf611c57565b5b6000611ece89828a01611cdb565b9650506020611edf89828a01611ddc565b9550506040611ef089828a01611e14565b9450506060611f0189828a01611e4e565b9350506080611f1289828a01611e8e565b92505060a0611f2389828a01611d23565b9150509295509295509295565b611f3981611c5c565b82525050565b6000602082019050611f546000830184611f30565b92915050565b611f6381611cb2565b82525050565b611f7281611db8565b82525050565b611f8181611df1565b82525050565b611f9081611e29565b82525050565b611f9f81611e63565b82525050565b611fae81611cf0565b82525050565b600061012082019050611fca600083018c611f5a565b611fd7602083018b611f69565b611fe4604083018a611f78565b611ff16060830189611f87565b611ffe6080830188611f96565b61200b60a0830187611fa5565b61201860c0830186611fa5565b61202560e0830185611f96565b612033610100830184611f78565b9a9950505050505050505050565b60006040820190506120566000830185611fa5565b6120636020830184611fa5565b9392505050565b600060208201905061207f6000830184611f5a565b92915050565b6000819050919050565b60006120aa6120a56120a084611cf0565b612085565b611c23565b9050919050565b6120ba8161208f565b82525050565b60006040820190506120d56000830185611f5a565b6120e260208301846120b1565b9392505050565b6000815190506120f881611dfd565b92915050565b60006020828403121561211457612113611c57565b5b6000612122848285016120e9565b91505092915050565b600082825260208201905092915050565b7f546f6b656e207472616e73666572206661696c65640000000000000000000000600082015250565b600061217260158361212b565b915061217d8261213c565b602082019050919050565b600060208201905081810360008301526121a181612165565b9050919050565b7f43616e206f6e6c792062652063616c6c656420627920706f6f6c206d616e616760008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061220460228361212b565b915061220f826121a8565b604082019050919050565b60006020820190508181036000830152612233816121f7565b9050919050565b7f56657374696e67206e6f7420666f756e64000000000000000000000000000000600082015250565b600061227060118361212b565b915061227b8261223a565b602082019050919050565b6000602082019050818103600083015261229f81612263565b9050919050565b7f4f6e6c79206d616e616765642076657374696e67732063616e2062652070617560008201527f7365640000000000000000000000000000000000000000000000000000000000602082015250565b600061230260238361212b565b915061230d826122a6565b604082019050919050565b60006020820190508181036000830152612331816122f5565b9050919050565b7f56657374696e6720616c72656164792070617573656400000000000000000000600082015250565b600061236e60168361212b565b915061237982612338565b602082019050919050565b6000602082019050818103600083015261239d81612361565b9050919050565b6123ad81611c23565b81146123b857600080fd5b50565b6000815190506123ca816123a4565b92915050565b6000602082840312156123e6576123e5611c57565b5b60006123f4848285016123bb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061243782611c23565b915061244283611c23565b925082821015612455576124546123fd565b5b828203905092915050565b7f56657374696e67206973206e6f74207061757365640000000000000000000000600082015250565b600061249660158361212b565b91506124a182612460565b602082019050919050565b600060208201905081810360008301526124c581612489565b9050919050565b7f56657374696e6720686173206265656e2063616e63656c6c656420616e64206360008201527f616e6e6f7420626520756e706175736564000000000000000000000000000000602082015250565b600061252860318361212b565b9150612533826124cc565b604082019050919050565b600060208201905081810360008301526125578161251b565b9050919050565b600061256982611e63565b915061257483611e63565b925082821015612587576125866123fd565b5b828203905092915050565b600061259d82611e63565b91506125a883611e63565b92508267ffffffffffffffff038211156125c5576125c46123fd565b5b828201905092915050565b60006125eb6125e66125e184611c92565b612085565b611c92565b9050919050565b60006125fd826125d0565b9050919050565b600061260f826125f2565b9050919050565b61261f81612604565b82525050565b600060608201905061263a6000830186611f30565b6126476020830185611c2d565b6126546040830184612616565b949350505050565b600060e082019050612671600083018a611f30565b61267e6020830189611f5a565b61268b6040830188611f69565b6126986060830187611f78565b6126a56080830186611f87565b6126b260a0830185611f96565b6126bf60c0830184611fa5565b98975050505050505050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b61271261270d826126cb565b6126f7565b82525050565b6000819050919050565b61273361272e82611c5c565b612718565b82525050565b60006127458287612701565b6001820191506127558286612701565b6001820191506127658285612722565b6020820191506127758284612722565b60208201915081905095945050505050565b7f4f6e6c79206d616e616765642076657374696e67732063616e2062652063616e60008201527f63656c6c65640000000000000000000000000000000000000000000000000000602082015250565b60006127e360268361212b565b91506127ee82612787565b604082019050919050565b60006020820190508181036000830152612812816127d6565b9050919050565b7f56657374696e6720616c72656164792063616e63656c6c656400000000000000600082015250565b600061284f60198361212b565b915061285a82612819565b602082019050919050565b6000602082019050818103600083015261287e81612842565b9050919050565b600061289082611cf0565b915061289b83611cf0565b9250828210156128ae576128ad6123fd565b5b828203905092915050565b7f43616e6e6f7420636c61696d20746f20302d6164647265737300000000000000600082015250565b60006128ef60198361212b565b91506128fa826128b9565b602082019050919050565b6000602082019050818103600083015261291e816128e2565b9050919050565b7f43616e206f6e6c7920626520636c61696d65642062792076657374696e67206f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b600061298160248361212b565b915061298c82612925565b604082019050919050565b600060208201905081810360008301526129b081612974565b9050919050565b7f547279696e6720746f20636c61696d20746f6f206d616e7920746f6b656e7300600082015250565b60006129ed601f8361212b565b91506129f8826129b7565b602082019050919050565b60006020820190508181036000830152612a1c816129e0565b9050919050565b6000612a2e82611cf0565b9150612a3983611cf0565b9250826fffffffffffffffffffffffffffffffff03821115612a5e57612a5d6123fd565b5b828201905092915050565b7f496e76616c6964206163636f756e740000000000000000000000000000000000600082015250565b6000612a9f600f8361212b565b9150612aaa82612a69565b602082019050919050565b60006020820190508181036000830152612ace81612a92565b9050919050565b7f496e76616c69642076657374696e672063757276650000000000000000000000600082015250565b6000612b0b60158361212b565b9150612b1682612ad5565b602082019050919050565b60006020820190508181036000830152612b3a81612afe565b9050919050565b7f56657374696e6720696420616c72656164792075736564000000000000000000600082015250565b6000612b7760178361212b565b9150612b8282612b41565b602082019050919050565b60006020820190508181036000830152612ba681612b6a565b9050919050565b7f4e6f7420656e6f75676820746f6b656e7320617661696c61626c650000000000600082015250565b6000612be3601b8361212b565b9150612bee82612bad565b602082019050919050565b60006020820190508181036000830152612c1281612bd6565b9050919050565b6000612c2482611c23565b9150612c2f83611c23565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c6457612c636123fd565b5b828201905092915050565b7f56657374696e67206e6f74206163746976652079657400000000000000000000600082015250565b6000612ca560168361212b565b9150612cb082612c6f565b602082019050919050565b60006020820190508181036000830152612cd481612c98565b9050919050565b6000612ce682611e63565b9150612cf183611e63565b92508167ffffffffffffffff0483118215151615612d1257612d116123fd565b5b828202905092915050565b7f496e76616c696420637572766520747970650000000000000000000000000000600082015250565b6000612d5360128361212b565b9150612d5e82612d1d565b602082019050919050565b60006020820190508181036000830152612d8281612d46565b9050919050565b6000612d9482611c23565b9150612d9f83611c23565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612dd857612dd76123fd565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e1d82611c23565b9150612e2883611c23565b925082612e3857612e37612de3565b5b828204905092915050565b7f4f766572666c6f7720696e2063757276652063616c63756c6174696f6e000000600082015250565b6000612e79601d8361212b565b9150612e8482612e43565b602082019050919050565b60006020820190508181036000830152612ea881612e6c565b905091905056fea2646970667358221220afcb98a54ef70fbec64c6247556dd6770edab2f5863e5fa28430ef0a779afbfd64736f6c634300080b00330000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d1
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80636cbab079116100715780636cbab079146101795780638f5b3c3b146101955780639fb0c41d146101b1578063d7faa145146101e9578063dc4c90d31461021a578063fc0c546a14610238576100b4565b806307380481146100b9578063166bbd3b146100d75780632bafa73c146100f35780632e0427aa1461010f5780633034d5341461012d5780635d76df6b14610149575b600080fd5b6100c1610256565b6040516100ce9190611c3c565b60405180910390f35b6100f160048036038101906100ec9190611d38565b61025c565b005b61010d60048036038101906101089190611d8b565b61034e565b005b6101176105e2565b6040516101249190611c3c565b60405180910390f35b61014760048036038101906101429190611d8b565b61068f565b005b610163600480360381019061015e9190611ea3565b610986565b6040516101709190611f3f565b60405180910390f35b610193600480360381019061018e9190611ea3565b610a76565b005b6101af60048036038101906101aa9190611d8b565b610b1b565b005b6101cb60048036038101906101c69190611d8b565b610e7a565b6040516101e099989796959493929190611fb4565b60405180910390f35b61020360048036038101906101fe9190611d8b565b610f7d565b604051610211929190612041565b60405180910390f35b61022261105f565b60405161022f919061206a565b60405180910390f35b610240611083565b60405161024d919061206a565b60405180910390f35b60005481565b60006102698484846110a7565b90507f0000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016102c69291906120c0565b6020604051808303816000875af11580156102e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030991906120fe565b610348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033f90612188565b60405180910390fd5b50505050565b7f0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d39061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047e90612286565b60405180910390fd5b8060000160159054906101000a900460ff166104d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cf90612318565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161461053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053490612384565b60405180910390fd5b8060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561056d5742610587565b8060000160189054906101000a900467ffffffffffffffff165b8160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550817f871860f90ed272e98149ef133136694f00424a57465aa85bfc2535dfd4d450b860405160405180910390a25050565b600080547f0000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161063f919061206a565b602060405180830381865afa15801561065c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068091906123d0565b61068a919061242c565b905090565b7f0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461071d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107149061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156107c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bf90612286565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141561082e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610825906124ac565b60405180910390fd5b8060020160089054906101000a900460ff1615610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108779061253e565b60405180910390fd5b60008160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff164211156108d5578160020160009054906101000a900467ffffffffffffffff16426108d0919061255e565b6108d8565b60005b9050808260000160189054906101000a900467ffffffffffffffff166108fe9190612592565b8260000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008260020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550827f1bf30dbd59905813e462b38cc5a44f3aadd0ee101ec6d7537139f5c7f8a9868560405160405180910390a2505050565b6000807f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b46306040516020016109c193929190612625565b60405160208183030381529060405280519060200120905060007f43838b5ce9ca440d1ac21b07179a1fdd88aa2175e5ea103f6e37aa6d18ce78ad60001b898989898989604051602001610a1b979695949392919061265c565b604051602081830303815290604052805190602001209050601960f81b600160f81b8383604051602001610a529493929190612739565b60405160208183030381529060405280519060200120925050509695505050505050565b7f0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afb9061221a565b60405180910390fd5b610b128686868686866113ac565b50505050505050565b7f0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba09061221a565b60405180910390fd5b6000600160008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4b90612286565b60405180910390fd5b8060000160159054906101000a900460ff16610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c906127f9565b60405180910390fd5b8060020160089054906101000a900460ff1615610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90612865565b60405180910390fd5b60008160000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115905060008260020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415610d9c5780610d575742610d71565b8160000160189054906101000a900467ffffffffffffffff165b8260020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b600081610ddc57610dac8361184c565b8360010160009054906101000a90046fffffffffffffffffffffffffffffffff16610dd79190612885565b610dfe565b8260010160009054906101000a90046fffffffffffffffffffffffffffffffff165b9050806fffffffffffffffffffffffffffffffff16600080828254610e23919061242c565b9250508190555060018360020160086101000a81548160ff021916908315150217905550837fc27a46a60d5d211f8ef42242a25d5db8357aefb1bd0e7d8fbab00d4c40d4d1c760405160405180910390a250505050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060000160159054906101000a900460ff16908060000160169054906101000a900461ffff16908060000160189054906101000a900467ffffffffffffffff16908060010160009054906101000a90046fffffffffffffffffffffffffffffffff16908060010160109054906101000a90046fffffffffffffffffffffffffffffffff16908060020160009054906101000a900467ffffffffffffffff16908060020160089054906101000a900460ff16905089565b6000806000600160008581526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290612286565b60405180910390fd5b6110348161184c565b92508060010160109054906101000a90046fffffffffffffffffffffffffffffffff16915050915091565b7f0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d181565b7f0000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee81565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90612905565b60405180910390fd5b60006001600086815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890612997565b60405180910390fd5b60008160010160109054906101000a90046fffffffffffffffffffffffffffffffff166111ed8361184c565b6111f79190612885565b90506fffffffffffffffffffffffffffffffff8016846fffffffffffffffffffffffffffffffff161461122a578361122c565b805b9250806fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff161115611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c90612a03565b60405180910390fd5b826fffffffffffffffffffffffffffffffff166000808282546112b8919061242c565b92505081905550828260010160108282829054906101000a90046fffffffffffffffffffffffffffffffff166112ee9190612a23565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16877f31b718389b1eb92df83ab00c1a5112e5bb8a02c7c1c9c02e1e3c15ad33e0532660405160405180910390a450509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561141d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141490612ab5565b60405180910390fd5b60028660ff1610611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90612b21565b60405180910390fd5b611471878787878787610986565b9050600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90612b8d565b60405180910390fd5b60006115226105e2565b9050826fffffffffffffffffffffffffffffffff16811015611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090612bf9565b60405180910390fd5b826fffffffffffffffffffffffffffffffff1660008082825461159c9190612c19565b925050819055506040518061012001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018860ff16815260200187151581526020018661ffff1681526020018567ffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152506001600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff02191690831515021790555060608201518160000160166101000a81548161ffff021916908361ffff16021790555060808201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060e08201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101008201518160020160086101000a81548160ff0219169083151502179055509050508773ffffffffffffffffffffffffffffffffffffffff16827fff2781f5af6cf115d187dd0e4ef590f5d1288b83ef3eb6739c69db99e70c8b4d60405160405180910390a3509695505050505050565b6000428260000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1611156118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa90612cbb565b60405180910390fd5b6000603c80601860078660000160169054906101000a900461ffff1661ffff166118dd9190612cdb565b6118e79190612cdb565b6118f19190612cdb565b6118fb9190612cdb565b90506000808460020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611611951578360000160189054906101000a900467ffffffffffffffff164261194c919061255e565b61198e565b8360000160189054906101000a900467ffffffffffffffff168460020160009054906101000a900467ffffffffffffffff1661198d919061255e565b5b90508167ffffffffffffffff168167ffffffffffffffff16106119d3578360010160009054906101000a90046fffffffffffffffffffffffffffffffff169250611aae565b60008460000160149054906101000a900460ff1660ff161415611a2257611a1b8460010160009054906101000a90046fffffffffffffffffffffffffffffffff168284611ab5565b9250611aad565b60018460000160149054906101000a900460ff1660ff161415611a7157611a6a8460010160009054906101000a90046fffffffffffffffffffffffffffffffff168284611b57565b9250611aac565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa390612d69565b60405180910390fd5b5b5b5050919050565b6000808267ffffffffffffffff168467ffffffffffffffff16866fffffffffffffffffffffffffffffffff16611aeb9190612d89565b611af59190612e12565b90506fffffffffffffffffffffffffffffffff8016811115611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390612e8f565b60405180910390fd5b809150509392505050565b6000808267ffffffffffffffff168367ffffffffffffffff16611b7a9190612d89565b8467ffffffffffffffff168567ffffffffffffffff16876fffffffffffffffffffffffffffffffff16611bad9190612d89565b611bb79190612d89565b611bc19190612e12565b90506fffffffffffffffffffffffffffffffff8016811115611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90612e8f565b60405180910390fd5b809150509392505050565b6000819050919050565b611c3681611c23565b82525050565b6000602082019050611c516000830184611c2d565b92915050565b600080fd5b6000819050919050565b611c6f81611c5c565b8114611c7a57600080fd5b50565b600081359050611c8c81611c66565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611cbd82611c92565b9050919050565b611ccd81611cb2565b8114611cd857600080fd5b50565b600081359050611cea81611cc4565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611d1581611cf0565b8114611d2057600080fd5b50565b600081359050611d3281611d0c565b92915050565b600080600060608486031215611d5157611d50611c57565b5b6000611d5f86828701611c7d565b9350506020611d7086828701611cdb565b9250506040611d8186828701611d23565b9150509250925092565b600060208284031215611da157611da0611c57565b5b6000611daf84828501611c7d565b91505092915050565b600060ff82169050919050565b611dce81611db8565b8114611dd957600080fd5b50565b600081359050611deb81611dc5565b92915050565b60008115159050919050565b611e0681611df1565b8114611e1157600080fd5b50565b600081359050611e2381611dfd565b92915050565b600061ffff82169050919050565b611e4081611e29565b8114611e4b57600080fd5b50565b600081359050611e5d81611e37565b92915050565b600067ffffffffffffffff82169050919050565b611e8081611e63565b8114611e8b57600080fd5b50565b600081359050611e9d81611e77565b92915050565b60008060008060008060c08789031215611ec057611ebf611c57565b5b6000611ece89828a01611cdb565b9650506020611edf89828a01611ddc565b9550506040611ef089828a01611e14565b9450506060611f0189828a01611e4e565b9350506080611f1289828a01611e8e565b92505060a0611f2389828a01611d23565b9150509295509295509295565b611f3981611c5c565b82525050565b6000602082019050611f546000830184611f30565b92915050565b611f6381611cb2565b82525050565b611f7281611db8565b82525050565b611f8181611df1565b82525050565b611f9081611e29565b82525050565b611f9f81611e63565b82525050565b611fae81611cf0565b82525050565b600061012082019050611fca600083018c611f5a565b611fd7602083018b611f69565b611fe4604083018a611f78565b611ff16060830189611f87565b611ffe6080830188611f96565b61200b60a0830187611fa5565b61201860c0830186611fa5565b61202560e0830185611f96565b612033610100830184611f78565b9a9950505050505050505050565b60006040820190506120566000830185611fa5565b6120636020830184611fa5565b9392505050565b600060208201905061207f6000830184611f5a565b92915050565b6000819050919050565b60006120aa6120a56120a084611cf0565b612085565b611c23565b9050919050565b6120ba8161208f565b82525050565b60006040820190506120d56000830185611f5a565b6120e260208301846120b1565b9392505050565b6000815190506120f881611dfd565b92915050565b60006020828403121561211457612113611c57565b5b6000612122848285016120e9565b91505092915050565b600082825260208201905092915050565b7f546f6b656e207472616e73666572206661696c65640000000000000000000000600082015250565b600061217260158361212b565b915061217d8261213c565b602082019050919050565b600060208201905081810360008301526121a181612165565b9050919050565b7f43616e206f6e6c792062652063616c6c656420627920706f6f6c206d616e616760008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061220460228361212b565b915061220f826121a8565b604082019050919050565b60006020820190508181036000830152612233816121f7565b9050919050565b7f56657374696e67206e6f7420666f756e64000000000000000000000000000000600082015250565b600061227060118361212b565b915061227b8261223a565b602082019050919050565b6000602082019050818103600083015261229f81612263565b9050919050565b7f4f6e6c79206d616e616765642076657374696e67732063616e2062652070617560008201527f7365640000000000000000000000000000000000000000000000000000000000602082015250565b600061230260238361212b565b915061230d826122a6565b604082019050919050565b60006020820190508181036000830152612331816122f5565b9050919050565b7f56657374696e6720616c72656164792070617573656400000000000000000000600082015250565b600061236e60168361212b565b915061237982612338565b602082019050919050565b6000602082019050818103600083015261239d81612361565b9050919050565b6123ad81611c23565b81146123b857600080fd5b50565b6000815190506123ca816123a4565b92915050565b6000602082840312156123e6576123e5611c57565b5b60006123f4848285016123bb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061243782611c23565b915061244283611c23565b925082821015612455576124546123fd565b5b828203905092915050565b7f56657374696e67206973206e6f74207061757365640000000000000000000000600082015250565b600061249660158361212b565b91506124a182612460565b602082019050919050565b600060208201905081810360008301526124c581612489565b9050919050565b7f56657374696e6720686173206265656e2063616e63656c6c656420616e64206360008201527f616e6e6f7420626520756e706175736564000000000000000000000000000000602082015250565b600061252860318361212b565b9150612533826124cc565b604082019050919050565b600060208201905081810360008301526125578161251b565b9050919050565b600061256982611e63565b915061257483611e63565b925082821015612587576125866123fd565b5b828203905092915050565b600061259d82611e63565b91506125a883611e63565b92508267ffffffffffffffff038211156125c5576125c46123fd565b5b828201905092915050565b60006125eb6125e66125e184611c92565b612085565b611c92565b9050919050565b60006125fd826125d0565b9050919050565b600061260f826125f2565b9050919050565b61261f81612604565b82525050565b600060608201905061263a6000830186611f30565b6126476020830185611c2d565b6126546040830184612616565b949350505050565b600060e082019050612671600083018a611f30565b61267e6020830189611f5a565b61268b6040830188611f69565b6126986060830187611f78565b6126a56080830186611f87565b6126b260a0830185611f96565b6126bf60c0830184611fa5565b98975050505050505050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b61271261270d826126cb565b6126f7565b82525050565b6000819050919050565b61273361272e82611c5c565b612718565b82525050565b60006127458287612701565b6001820191506127558286612701565b6001820191506127658285612722565b6020820191506127758284612722565b60208201915081905095945050505050565b7f4f6e6c79206d616e616765642076657374696e67732063616e2062652063616e60008201527f63656c6c65640000000000000000000000000000000000000000000000000000602082015250565b60006127e360268361212b565b91506127ee82612787565b604082019050919050565b60006020820190508181036000830152612812816127d6565b9050919050565b7f56657374696e6720616c72656164792063616e63656c6c656400000000000000600082015250565b600061284f60198361212b565b915061285a82612819565b602082019050919050565b6000602082019050818103600083015261287e81612842565b9050919050565b600061289082611cf0565b915061289b83611cf0565b9250828210156128ae576128ad6123fd565b5b828203905092915050565b7f43616e6e6f7420636c61696d20746f20302d6164647265737300000000000000600082015250565b60006128ef60198361212b565b91506128fa826128b9565b602082019050919050565b6000602082019050818103600083015261291e816128e2565b9050919050565b7f43616e206f6e6c7920626520636c61696d65642062792076657374696e67206f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b600061298160248361212b565b915061298c82612925565b604082019050919050565b600060208201905081810360008301526129b081612974565b9050919050565b7f547279696e6720746f20636c61696d20746f6f206d616e7920746f6b656e7300600082015250565b60006129ed601f8361212b565b91506129f8826129b7565b602082019050919050565b60006020820190508181036000830152612a1c816129e0565b9050919050565b6000612a2e82611cf0565b9150612a3983611cf0565b9250826fffffffffffffffffffffffffffffffff03821115612a5e57612a5d6123fd565b5b828201905092915050565b7f496e76616c6964206163636f756e740000000000000000000000000000000000600082015250565b6000612a9f600f8361212b565b9150612aaa82612a69565b602082019050919050565b60006020820190508181036000830152612ace81612a92565b9050919050565b7f496e76616c69642076657374696e672063757276650000000000000000000000600082015250565b6000612b0b60158361212b565b9150612b1682612ad5565b602082019050919050565b60006020820190508181036000830152612b3a81612afe565b9050919050565b7f56657374696e6720696420616c72656164792075736564000000000000000000600082015250565b6000612b7760178361212b565b9150612b8282612b41565b602082019050919050565b60006020820190508181036000830152612ba681612b6a565b9050919050565b7f4e6f7420656e6f75676820746f6b656e7320617661696c61626c650000000000600082015250565b6000612be3601b8361212b565b9150612bee82612bad565b602082019050919050565b60006020820190508181036000830152612c1281612bd6565b9050919050565b6000612c2482611c23565b9150612c2f83611c23565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c6457612c636123fd565b5b828201905092915050565b7f56657374696e67206e6f74206163746976652079657400000000000000000000600082015250565b6000612ca560168361212b565b9150612cb082612c6f565b602082019050919050565b60006020820190508181036000830152612cd481612c98565b9050919050565b6000612ce682611e63565b9150612cf183611e63565b92508167ffffffffffffffff0483118215151615612d1257612d116123fd565b5b828202905092915050565b7f496e76616c696420637572766520747970650000000000000000000000000000600082015250565b6000612d5360128361212b565b9150612d5e82612d1d565b602082019050919050565b60006020820190508181036000830152612d8281612d46565b9050919050565b6000612d9482611c23565b9150612d9f83611c23565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612dd857612dd76123fd565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e1d82611c23565b9150612e2883611c23565b925082612e3857612e37612de3565b5b828204905092915050565b7f4f766572666c6f7720696e2063757276652063616c63756c6174696f6e000000600082015250565b6000612e79601d8361212b565b9150612e8482612e43565b602082019050919050565b60006020820190508181036000830152612ea881612e6c565b905091905056fea2646970667358221220afcb98a54ef70fbec64c6247556dd6770edab2f5863e5fa28430ef0a779afbfd64736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d1
-----Decoded View---------------
Arg [0] : _token (address): 0x5aFE3855358E112B5647B952709E6165e1c1eEEe
Arg [1] : _poolManager (address): 0x8CF60B289f8d31F737049B590b5E4285Ff0Bd1D1
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005afe3855358e112b5647b952709e6165e1c1eeee
Arg [1] : 0000000000000000000000008cf60b289f8d31f737049b590b5e4285ff0bd1d1
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.