More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,692 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 19228371 | 426 days ago | IN | 0 ETH | 0.00231137 | ||||
Unstake | 19163164 | 435 days ago | IN | 0 ETH | 0.00418537 | ||||
Unstake | 18900277 | 472 days ago | IN | 0 ETH | 0.00571105 | ||||
Unstake | 18627155 | 510 days ago | IN | 0 ETH | 0.00392358 | ||||
Unstake | 18495446 | 529 days ago | IN | 0 ETH | 0.00445896 | ||||
Unstake | 18378005 | 545 days ago | IN | 0 ETH | 0.00260907 | ||||
Stake | 18362821 | 547 days ago | IN | 0 ETH | 0.00134935 | ||||
Unstake | 18357158 | 548 days ago | IN | 0 ETH | 0.00208618 | ||||
Unstake | 18309105 | 555 days ago | IN | 0 ETH | 0.00075325 | ||||
Unstake | 18307877 | 555 days ago | IN | 0 ETH | 0.00103822 | ||||
Unstake | 18294827 | 557 days ago | IN | 0 ETH | 0.00076875 | ||||
Unstake | 18266395 | 561 days ago | IN | 0 ETH | 0.00110672 | ||||
Unstake | 18153894 | 577 days ago | IN | 0 ETH | 0.00034626 | ||||
Unstake As Owner | 18153806 | 577 days ago | IN | 0 ETH | 0.00018335 | ||||
Unstake As Owner | 18150942 | 577 days ago | IN | 0 ETH | 0.00099439 | ||||
Unstake As Owner | 18150942 | 577 days ago | IN | 0 ETH | 0.00099439 | ||||
Unstake As Owner | 18150942 | 577 days ago | IN | 0 ETH | 0.00127952 | ||||
Unstake As Owner | 18150941 | 577 days ago | IN | 0 ETH | 0.00098427 | ||||
Unstake As Owner | 18150941 | 577 days ago | IN | 0 ETH | 0.00222038 | ||||
Unstake As Owner | 18150941 | 577 days ago | IN | 0 ETH | 0.00314782 | ||||
Unstake As Owner | 18150941 | 577 days ago | IN | 0 ETH | 0.00129335 | ||||
Unstake As Owner | 18150941 | 577 days ago | IN | 0 ETH | 0.00281169 | ||||
Unstake As Owner | 18150940 | 577 days ago | IN | 0 ETH | 0.00620496 | ||||
Unstake As Owner | 18150616 | 577 days ago | IN | 0 ETH | 0.00212668 | ||||
Unstake As Owner | 18150616 | 577 days ago | IN | 0 ETH | 0.00095419 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SurrealestateStaking
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.12 <0.9.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; // The NFT that can be staked here. interface IPPASurrealestates { function transferFrom( address from, address to, uint256 tokenId ) external; function ownerOf(uint256 tokenId) external view returns (address); } // A listening contract can implement this function to get notified any time a user stakes or unstakes. interface IStakingListener { function notifyChange(address account) external; } contract SurrealestateStaking is ERC721Holder, Ownable { IPPASurrealestates surrealestates; address surrealestateContractAddress; constructor() public { surrealestateContractAddress = _getSurrealestatesContractAddress(); surrealestates = IPPASurrealestates(surrealestateContractAddress); } function _getSurrealestatesContractAddress() internal view returns (address) { address addr; assembly { switch chainid() case 1 { // mainnet addr := 0x6f3185b51a42e03a4f0eaaf37604ddd499ef9b12 } case 4 { // rinkeby addr := 0x6551111b5d3C7e4B5436409C2e70A8Fbe1757407 } } return addr; } // The period which people can lock their funds up for to get an extra multiplier on rewards earned. uint256 stakingLockPeriod = 7776000; // 90 days in seconds. struct StakingMultiplier { uint256 numeratorMinus1; // Store as "minus 1" because we want this to default to 1, but uninitialized vars default to 0. uint256 denominatorMinus1; } struct AccountInfo { uint256 numStaked; uint256 pointsStaked; uint256 lastRefreshTimestamp; uint256 tokensEarnedBeforeLastRefresh; // A multiplier defaults to 1 but can be set by a manager in the future for a particular address. This increases // the overall rate of earning. StakingMultiplier stakingMultiplier; } mapping(address => AccountInfo) public accounts; struct TokenInfo { bool isLocked; uint256 lockedUntil; address owner; } mapping(uint256 => TokenInfo) public tokens; // Addresses that are allowed to do things like deduct tokens from a user's account or award earning multipliers. mapping(address => bool) public approvedManagers; IStakingListener[] listeners; // Earning period for a surrealestate. Default to 10 hours. uint256 public earnPeriodSeconds = 36000; modifier onlyApprovedManager() { require( owner() == msg.sender || approvedManagers[msg.sender], "Caller is not an approved manager" ); _; } function _notifyAllListeners(address account) internal { for (uint256 i = 0; i < listeners.length; i++) { listeners[i].notifyChange(account); } } /** User must setApprovalForAll on the contract before staking. */ function stake(uint256[] calldata tokenIds, bool lock) public { refreshTokensEarned(msg.sender); for (uint256 i = 0; i < tokenIds.length; i++) { require( surrealestates.ownerOf(tokenIds[i]) == msg.sender, "Not your token" ); surrealestates.transferFrom(msg.sender, address(this), tokenIds[i]); tokens[tokenIds[i]].owner = msg.sender; accounts[msg.sender].pointsStaked += pointsByTokenId(tokenIds[i]); } accounts[msg.sender].numStaked += tokenIds.length; if (lock) { uint256 lockUntil = block.timestamp + stakingLockPeriod; for (uint256 i = 0; i < tokenIds.length; i++) { tokens[tokenIds[i]].lockedUntil = lockUntil; tokens[tokenIds[i]].isLocked = true; accounts[msg.sender].pointsStaked += pointsByTokenId( tokenIds[i] ); } } _notifyAllListeners(msg.sender); } /** * User can lock their staking in for the stakingLockPeriod, which increases their multiplier. */ function lockStaking(uint256[] calldata tokenIds) public { refreshTokensEarned(msg.sender); uint256 lockUntil = block.timestamp + stakingLockPeriod; for (uint256 i = 0; i < tokenIds.length; i++) { require( tokens[tokenIds[i]].owner == msg.sender, "Token is not currently staked" ); require( tokens[tokenIds[i]].lockedUntil < block.timestamp, "Token is already locked" ); if (!tokens[tokenIds[i]].isLocked) { tokens[tokenIds[i]].isLocked = true; accounts[msg.sender].pointsStaked += pointsByTokenId( tokenIds[i] ); } tokens[tokenIds[i]].lockedUntil = lockUntil; } _notifyAllListeners(msg.sender); } function refreshTokensEarned(address addr) internal { if (block.timestamp == accounts[addr].lastRefreshTimestamp) { // No need to refresh anything if we're up to date. return; } if (accounts[addr].lastRefreshTimestamp == 0) { // If this is the first refresh ever done, then just set the timestamp and return. accounts[addr].lastRefreshTimestamp = block.timestamp; return; } uint256 totalTokensEarned = calculateTokensEarned(addr); accounts[addr].tokensEarnedBeforeLastRefresh = totalTokensEarned; accounts[addr].lastRefreshTimestamp = block.timestamp; } function calculateTokensEarned(address addr) public view returns (uint256) { uint256 secondsStakedSinceLastRefresh = block.timestamp - accounts[addr].lastRefreshTimestamp; uint256 tokensEarnedSinceLastRefresh = (secondsStakedSinceLastRefresh * (accounts[addr].pointsStaked) * (accounts[addr].stakingMultiplier.numeratorMinus1 + 1)) / (accounts[addr].stakingMultiplier.denominatorMinus1 + 1) / earnPeriodSeconds; return accounts[addr].tokensEarnedBeforeLastRefresh + tokensEarnedSinceLastRefresh; } /** * To unstake, the user calls this function with the tokenIds they want to unstake. */ function unstake(uint256[] calldata tokenIds) public { refreshTokensEarned(msg.sender); for (uint256 i = 0; i < tokenIds.length; i++) { require( tokens[tokenIds[i]].owner == msg.sender, "Caller is not currently staking the provided tokenId" ); _unstakeSingle(tokenIds[i]); } accounts[msg.sender].numStaked -= tokenIds.length; _notifyAllListeners(msg.sender); } // Caller is responsible for deducted accounts[addr].numStaked function _unstakeSingle(uint256 tokenId) internal { require( tokens[tokenId].lockedUntil < block.timestamp, "Token is still locked" ); accounts[tokens[tokenId].owner].pointsStaked -= pointsByTokenId( tokenId ); // If we are past the token locktime, then we need to update the the lockedTokens map as well. if (tokens[tokenId].isLocked) { tokens[tokenId].isLocked = false; // Deduct again because it was locked, so it was earning double. accounts[tokens[tokenId].owner].pointsStaked -= pointsByTokenId( tokenId ); } surrealestates.transferFrom(address(this), msg.sender, tokenId); tokens[tokenId].owner = address(0); } function addApprovedManager(address managerAddr) public onlyOwner { approvedManagers[managerAddr] = true; } function removeApprovedManager(address managerAddr) public onlyOwner { approvedManagers[managerAddr] = false; } function setStakingLockPeriod(uint256 newPeriod) public onlyApprovedManager { stakingLockPeriod = newPeriod; } function setEarnPeriod(uint256 newSeconds) public onlyApprovedManager { earnPeriodSeconds = newSeconds; } function setEarningMultiplier( address addr, uint256 numerator, uint256 denominator ) public onlyApprovedManager { refreshTokensEarned(addr); accounts[addr].stakingMultiplier = StakingMultiplier( numerator - 1, denominator - 1 ); } function addStakingListener(address contractAddress) public onlyOwner { listeners.push(IStakingListener(contractAddress)); } function resetStakingListeners() public onlyOwner { delete listeners; } // Do not use in actual transaction due to massive gas cost. function stakedTokensOfOwner( address addr, uint256 start, uint256 stop ) public view returns (uint256[] memory) { if (accounts[addr].numStaked == 0) { return new uint256[](0); } uint256 index = 0; uint256[] memory ownedTokens = new uint256[](accounts[addr].numStaked); for (uint256 tokenId = start; tokenId <= stop; tokenId++) { if (tokens[tokenId].owner == addr) { ownedTokens[index] = tokenId; index++; if (index == accounts[addr].numStaked) { break; } } } return ownedTokens; } // Only for use in emergency. Can be called by owner to unstake. Does not update the rest of the contract state. function unstakeAsOwner(address addr, uint256[] calldata tokenIds) public onlyOwner { for (uint256 i = 0; i < tokenIds.length; i++) { surrealestates.transferFrom(address(this), addr, tokenIds[i]); } } function pointsByTokenId(uint256 tokenId) public view returns (uint256) { return 1000 + uint256(uint8(rawPointsByTokenId[tokenId])); } function setRawPoints(bytes memory newRawPoints) public onlyOwner { rawPointsByTokenId = newRawPoints; } bytes rawPointsByTokenId; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.0; import "../IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accounts","outputs":[{"internalType":"uint256","name":"numStaked","type":"uint256"},{"internalType":"uint256","name":"pointsStaked","type":"uint256"},{"internalType":"uint256","name":"lastRefreshTimestamp","type":"uint256"},{"internalType":"uint256","name":"tokensEarnedBeforeLastRefresh","type":"uint256"},{"components":[{"internalType":"uint256","name":"numeratorMinus1","type":"uint256"},{"internalType":"uint256","name":"denominatorMinus1","type":"uint256"}],"internalType":"struct SurrealestateStaking.StakingMultiplier","name":"stakingMultiplier","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"managerAddr","type":"address"}],"name":"addApprovedManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"addStakingListener","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedManagers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"calculateTokensEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earnPeriodSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"lockStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"pointsByTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"managerAddr","type":"address"}],"name":"removeApprovedManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetStakingListeners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSeconds","type":"uint256"}],"name":"setEarnPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"setEarningMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"newRawPoints","type":"bytes"}],"name":"setRawPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPeriod","type":"uint256"}],"name":"setStakingLockPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool","name":"lock","type":"bool"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"stakedTokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bool","name":"isLocked","type":"bool"},{"internalType":"uint256","name":"lockedUntil","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeAsOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526276a700600355618ca06008553480156200001e57600080fd5b506200003f62000033620000f860201b60201c565b6200010060201b60201c565b6200004f620001c460201b60201c565b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200021d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000804660018114620001e05760048114620001fd5762000215565b736f3185b51a42e03a4f0eaaf37604ddd499ef9b12915062000215565b736551111b5d3c7e4b5436409c2e70a8fbe175740791505b508091505090565b613100806200022d6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063715018a6116100c3578063da92ba581161007c578063da92ba58146103b0578063e449f341146103ce578063e462cb44146103ea578063f2fde38b146103f4578063f89dfc2c14610410578063fb1e2c381461042c5761014d565b8063715018a6146103045780638044c01d1461030e5780638da5cb5b1461032a5780639bcb907214610348578063b3961af614610378578063d60e1217146103945761014d565b806333a7b3cd1161011557806333a7b3cd146102065780633f497488146102225780634f64b2be146102525780635e5c06e2146102845780635ea0ba9d146102b857806363c0f133146102d45761014d565b806307d8391d14610152578063150b7a02146101825780631f45f501146101b25780632ee73d41146101ce5780632f287464146101ea575b600080fd5b61016c60048036038101906101679190612351565b610448565b6040516101799190612462565b60405180910390f35b61019c600480360381019061019791906125ca565b61068c565b6040516101a99190612688565b60405180910390f35b6101cc60048036038101906101c791906126a3565b6106a0565b005b6101e860048036038101906101e39190612768565b610773565b005b61020460048036038101906101ff9190612351565b610bee565b005b610220600480360381019061021b91906127c8565b610d4b565b005b61023c600480360381019061023791906127c8565b610e2d565b6040516102499190612804565b60405180910390f35b61026c600480360381019061026791906126a3565b610fee565b60405161027b9392919061283d565b60405180910390f35b61029e600480360381019061029991906127c8565b611045565b6040516102af9594939291906128a3565b60405180910390f35b6102d260048036038101906102cd91906128f6565b611099565b005b6102ee60048036038101906102e991906127c8565b61134a565b6040516102fb9190612943565b60405180910390f35b61030c61136a565b005b6103286004803603810190610323919061295e565b6113f2565b005b610332611488565b60405161033f91906129a7565b60405180910390f35b610362600480360381019061035d91906126a3565b6114b1565b60405161036f9190612804565b60405180910390f35b610392600480360381019061038d91906127c8565b61152f565b005b6103ae60048036038101906103a991906127c8565b611606565b005b6103b86116dd565b6040516103c59190612804565b60405180910390f35b6103e860048036038101906103e391906128f6565b6116e3565b005b6103f2611856565b005b61040e600480360381019061040991906127c8565b6118e2565b005b61042a600480360381019061042591906129c2565b6119da565b005b610446600480360381019061044191906126a3565b611b27565b005b60606000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156104e657600067ffffffffffffffff8111156104b0576104af61249f565b5b6040519080825280602002602001820160405280156104de5781602001602082028036833780820191505090505b509050610685565b600080600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015467ffffffffffffffff8111156105455761054461249f565b5b6040519080825280602002602001820160405280156105735781602001602082028036833780820191505090505b50905060008590505b84811161067e578673ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561066b578082848151811061060157610600612a22565b5b602002602001018181525050828061061890612a80565b935050600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015483141561066a5761067e565b5b808061067690612a80565b91505061057c565b5080925050505b9392505050565b600063150b7a0260e01b9050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff166106bf611488565b73ffffffffffffffffffffffffffffffffffffffff16148061072a5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076090612b4c565b60405180910390fd5b8060038190555050565b61077c33611bfa565b60005b83839050811015610a51573373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8686858181106107f2576107f1612a22565b5b905060200201356040518263ffffffff1660e01b81526004016108159190612804565b602060405180830381865afa158015610832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108569190612b81565b73ffffffffffffffffffffffffffffffffffffffff16146108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390612bfa565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308787868181106108ff576108fe612a22565b5b905060200201356040518463ffffffff1660e01b815260040161092493929190612c1a565b600060405180830381600087803b15801561093e57600080fd5b505af1158015610952573d6000803e3d6000fd5b50505050336005600086868581811061096e5761096d612a22565b5b90506020020135815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506109e68484838181106109da576109d9612a22565b5b905060200201356114b1565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254610a379190612c51565b925050819055508080610a4990612a80565b91505061077f565b5082829050600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610aa79190612c51565b925050819055508015610be057600060035442610ac49190612c51565b905060005b84849050811015610bdd578160056000878785818110610aec57610aeb612a22565b5b90506020020135815260200190815260200160002060010181905550600160056000878785818110610b2157610b20612a22565b5b90506020020135815260200190815260200160002060000160006101000a81548160ff021916908315150217905550610b72858583818110610b6657610b65612a22565b5b905060200201356114b1565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254610bc39190612c51565b925050819055508080610bd590612a80565b915050610ac9565b50505b610be933611d80565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610c0d611488565b73ffffffffffffffffffffffffffffffffffffffff161480610c785750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90612b4c565b60405180910390fd5b610cc083611bfa565b6040518060400160405280600184610cd89190612ca7565b8152602001600183610cea9190612ca7565b815250600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004016000820151816000015560208201518160010155905050505050565b610d53611e50565b73ffffffffffffffffffffffffffffffffffffffff16610d71611488565b73ffffffffffffffffffffffffffffffffffffffff1614610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe90612d27565b60405180910390fd5b6007819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015442610e7e9190612ca7565b905060006008546001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160010154610ed79190612c51565b6001600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160000154610f299190612c51565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015485610f779190612d47565b610f819190612d47565b610f8b9190612dd0565b610f959190612dd0565b905080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154610fe59190612c51565b92505050919050565b60056020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60046020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040160405180604001604052908160008201548152602001600182015481525050905085565b6110a233611bfa565b6000600354426110b29190612c51565b905060005b8383905081101561133b573373ffffffffffffffffffffffffffffffffffffffff16600560008686858181106110f0576110ef612a22565b5b90506020020135815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690612e4d565b60405180910390fd5b426005600086868581811061119757611196612a22565b5b90506020020135815260200190815260200160002060010154106111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790612eb9565b60405180910390fd5b6005600085858481811061120757611206612a22565b5b90506020020135815260200190815260200160002060000160009054906101000a900460ff166112f45760016005600086868581811061124a57611249612a22565b5b90506020020135815260200190815260200160002060000160006101000a81548160ff02191690831515021790555061129b84848381811061128f5761128e612a22565b5b905060200201356114b1565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546112ec9190612c51565b925050819055505b816005600086868581811061130c5761130b612a22565b5b90506020020135815260200190815260200160002060010181905550808061133390612a80565b9150506110b7565b5061134533611d80565b505050565b60066020528060005260406000206000915054906101000a900460ff1681565b611372611e50565b73ffffffffffffffffffffffffffffffffffffffff16611390611488565b73ffffffffffffffffffffffffffffffffffffffff16146113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612d27565b60405180910390fd5b6113f06000611e58565b565b6113fa611e50565b73ffffffffffffffffffffffffffffffffffffffff16611418611488565b73ffffffffffffffffffffffffffffffffffffffff161461146e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146590612d27565b60405180910390fd5b80600990805190602001906114849291906121e5565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060098281546114c190612f08565b81106114d0576114cf612a22565b5b8154600116156114ef5790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000260f81c60ff166103e86115289190612c51565b9050919050565b611537611e50565b73ffffffffffffffffffffffffffffffffffffffff16611555611488565b73ffffffffffffffffffffffffffffffffffffffff16146115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290612d27565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61160e611e50565b73ffffffffffffffffffffffffffffffffffffffff1661162c611488565b73ffffffffffffffffffffffffffffffffffffffff1614611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990612d27565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60085481565b6116ec33611bfa565b60005b828290508110156117ec573373ffffffffffffffffffffffffffffffffffffffff166005600085858581811061172857611727612a22565b5b90506020020135815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae90612fac565b60405180910390fd5b6117d98383838181106117cd576117cc612a22565b5b90506020020135611f1c565b80806117e490612a80565b9150506116ef565b5081819050600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546118429190612ca7565b9250508190555061185233611d80565b5050565b61185e611e50565b73ffffffffffffffffffffffffffffffffffffffff1661187c611488565b73ffffffffffffffffffffffffffffffffffffffff16146118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c990612d27565b60405180910390fd5b600760006118e0919061226b565b565b6118ea611e50565b73ffffffffffffffffffffffffffffffffffffffff16611908611488565b73ffffffffffffffffffffffffffffffffffffffff161461195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590612d27565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c59061303e565b60405180910390fd5b6119d781611e58565b50565b6119e2611e50565b73ffffffffffffffffffffffffffffffffffffffff16611a00611488565b73ffffffffffffffffffffffffffffffffffffffff1614611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90612d27565b60405180910390fd5b60005b82829050811015611b2157600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3086868686818110611ab757611ab6612a22565b5b905060200201356040518463ffffffff1660e01b8152600401611adc93929190612c1a565b600060405180830381600087803b158015611af657600080fd5b505af1158015611b0a573d6000803e3d6000fd5b505050508080611b1990612a80565b915050611a59565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16611b46611488565b73ffffffffffffffffffffffffffffffffffffffff161480611bb15750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790612b4c565b60405180910390fd5b8060088190555050565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154421415611c4957611d7d565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541415611ce05742600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611d7d565b6000611ceb82610e2d565b905080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018190555042600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550505b50565b60005b600780549050811015611e4c5760078181548110611da457611da3612a22565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c79d6136836040518263ffffffff1660e01b8152600401611e0791906129a7565b600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b505050508080611e4490612a80565b915050611d83565b5050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b42600560008381526020019081526020016000206001015410611f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6b906130aa565b60405180910390fd5b611f7d816114b1565b600460006005600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546120049190612ca7565b925050819055506005600082815260200190815260200160002060000160009054906101000a900460ff16156120fb5760006005600083815260200190815260200160002060000160006101000a81548160ff02191690831515021790555061206c816114b1565b600460006005600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546120f39190612ca7565b925050819055505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b815260040161215a93929190612c1a565b600060405180830381600087803b15801561217457600080fd5b505af1158015612188573d6000803e3d6000fd5b5050505060006005600083815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8280546121f190612f08565b90600052602060002090601f016020900481019282612213576000855561225a565b82601f1061222c57805160ff191683800117855561225a565b8280016001018555821561225a579182015b8281111561225957825182559160200191906001019061223e565b5b509050612267919061228c565b5090565b5080546000825590600052602060002090810190612289919061228c565b50565b5b808211156122a557600081600090555060010161228d565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122e8826122bd565b9050919050565b6122f8816122dd565b811461230357600080fd5b50565b600081359050612315816122ef565b92915050565b6000819050919050565b61232e8161231b565b811461233957600080fd5b50565b60008135905061234b81612325565b92915050565b60008060006060848603121561236a576123696122b3565b5b600061237886828701612306565b93505060206123898682870161233c565b925050604061239a8682870161233c565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123d98161231b565b82525050565b60006123eb83836123d0565b60208301905092915050565b6000602082019050919050565b600061240f826123a4565b61241981856123af565b9350612424836123c0565b8060005b8381101561245557815161243c88826123df565b9750612447836123f7565b925050600181019050612428565b5085935050505092915050565b6000602082019050818103600083015261247c8184612404565b905092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124d78261248e565b810181811067ffffffffffffffff821117156124f6576124f561249f565b5b80604052505050565b60006125096122a9565b905061251582826124ce565b919050565b600067ffffffffffffffff8211156125355761253461249f565b5b61253e8261248e565b9050602081019050919050565b82818337600083830152505050565b600061256d6125688461251a565b6124ff565b90508281526020810184848401111561258957612588612489565b5b61259484828561254b565b509392505050565b600082601f8301126125b1576125b0612484565b5b81356125c184826020860161255a565b91505092915050565b600080600080608085870312156125e4576125e36122b3565b5b60006125f287828801612306565b945050602061260387828801612306565b93505060406126148782880161233c565b925050606085013567ffffffffffffffff811115612635576126346122b8565b5b6126418782880161259c565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6126828161264d565b82525050565b600060208201905061269d6000830184612679565b92915050565b6000602082840312156126b9576126b86122b3565b5b60006126c78482850161233c565b91505092915050565b600080fd5b600080fd5b60008083601f8401126126f0576126ef612484565b5b8235905067ffffffffffffffff81111561270d5761270c6126d0565b5b602083019150836020820283011115612729576127286126d5565b5b9250929050565b60008115159050919050565b61274581612730565b811461275057600080fd5b50565b6000813590506127628161273c565b92915050565b600080600060408486031215612781576127806122b3565b5b600084013567ffffffffffffffff81111561279f5761279e6122b8565b5b6127ab868287016126da565b935093505060206127be86828701612753565b9150509250925092565b6000602082840312156127de576127dd6122b3565b5b60006127ec84828501612306565b91505092915050565b6127fe8161231b565b82525050565b600060208201905061281960008301846127f5565b92915050565b61282881612730565b82525050565b612837816122dd565b82525050565b6000606082019050612852600083018661281f565b61285f60208301856127f5565b61286c604083018461282e565b949350505050565b60408201600082015161288a60008501826123d0565b50602082015161289d60208501826123d0565b50505050565b600060c0820190506128b860008301886127f5565b6128c560208301876127f5565b6128d260408301866127f5565b6128df60608301856127f5565b6128ec6080830184612874565b9695505050505050565b6000806020838503121561290d5761290c6122b3565b5b600083013567ffffffffffffffff81111561292b5761292a6122b8565b5b612937858286016126da565b92509250509250929050565b6000602082019050612958600083018461281f565b92915050565b600060208284031215612974576129736122b3565b5b600082013567ffffffffffffffff811115612992576129916122b8565b5b61299e8482850161259c565b91505092915050565b60006020820190506129bc600083018461282e565b92915050565b6000806000604084860312156129db576129da6122b3565b5b60006129e986828701612306565b935050602084013567ffffffffffffffff811115612a0a57612a096122b8565b5b612a16868287016126da565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a8b8261231b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612abe57612abd612a51565b5b600182019050919050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f7420616e20617070726f766564206d616e61676560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b36602183612ac9565b9150612b4182612ada565b604082019050919050565b60006020820190508181036000830152612b6581612b29565b9050919050565b600081519050612b7b816122ef565b92915050565b600060208284031215612b9757612b966122b3565b5b6000612ba584828501612b6c565b91505092915050565b7f4e6f7420796f757220746f6b656e000000000000000000000000000000000000600082015250565b6000612be4600e83612ac9565b9150612bef82612bae565b602082019050919050565b60006020820190508181036000830152612c1381612bd7565b9050919050565b6000606082019050612c2f600083018661282e565b612c3c602083018561282e565b612c4960408301846127f5565b949350505050565b6000612c5c8261231b565b9150612c678361231b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c9c57612c9b612a51565b5b828201905092915050565b6000612cb28261231b565b9150612cbd8361231b565b925082821015612cd057612ccf612a51565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612d11602083612ac9565b9150612d1c82612cdb565b602082019050919050565b60006020820190508181036000830152612d4081612d04565b9050919050565b6000612d528261231b565b9150612d5d8361231b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d9657612d95612a51565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ddb8261231b565b9150612de68361231b565b925082612df657612df5612da1565b5b828204905092915050565b7f546f6b656e206973206e6f742063757272656e746c79207374616b6564000000600082015250565b6000612e37601d83612ac9565b9150612e4282612e01565b602082019050919050565b60006020820190508181036000830152612e6681612e2a565b9050919050565b7f546f6b656e20697320616c7265616479206c6f636b6564000000000000000000600082015250565b6000612ea3601783612ac9565b9150612eae82612e6d565b602082019050919050565b60006020820190508181036000830152612ed281612e96565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f2057607f821691505b60208210811415612f3457612f33612ed9565b5b50919050565b7f43616c6c6572206973206e6f742063757272656e746c79207374616b696e672060008201527f7468652070726f766964656420746f6b656e4964000000000000000000000000602082015250565b6000612f96603483612ac9565b9150612fa182612f3a565b604082019050919050565b60006020820190508181036000830152612fc581612f89565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613028602683612ac9565b915061303382612fcc565b604082019050919050565b600060208201905081810360008301526130578161301b565b9050919050565b7f546f6b656e206973207374696c6c206c6f636b65640000000000000000000000600082015250565b6000613094601583612ac9565b915061309f8261305e565b602082019050919050565b600060208201905081810360008301526130c381613087565b905091905056fea2646970667358221220c4a93ed358ea9c2079289e26979efa585d0c00786b5f56310ad4fce1b048a3cd64736f6c634300080c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c8063715018a6116100c3578063da92ba581161007c578063da92ba58146103b0578063e449f341146103ce578063e462cb44146103ea578063f2fde38b146103f4578063f89dfc2c14610410578063fb1e2c381461042c5761014d565b8063715018a6146103045780638044c01d1461030e5780638da5cb5b1461032a5780639bcb907214610348578063b3961af614610378578063d60e1217146103945761014d565b806333a7b3cd1161011557806333a7b3cd146102065780633f497488146102225780634f64b2be146102525780635e5c06e2146102845780635ea0ba9d146102b857806363c0f133146102d45761014d565b806307d8391d14610152578063150b7a02146101825780631f45f501146101b25780632ee73d41146101ce5780632f287464146101ea575b600080fd5b61016c60048036038101906101679190612351565b610448565b6040516101799190612462565b60405180910390f35b61019c600480360381019061019791906125ca565b61068c565b6040516101a99190612688565b60405180910390f35b6101cc60048036038101906101c791906126a3565b6106a0565b005b6101e860048036038101906101e39190612768565b610773565b005b61020460048036038101906101ff9190612351565b610bee565b005b610220600480360381019061021b91906127c8565b610d4b565b005b61023c600480360381019061023791906127c8565b610e2d565b6040516102499190612804565b60405180910390f35b61026c600480360381019061026791906126a3565b610fee565b60405161027b9392919061283d565b60405180910390f35b61029e600480360381019061029991906127c8565b611045565b6040516102af9594939291906128a3565b60405180910390f35b6102d260048036038101906102cd91906128f6565b611099565b005b6102ee60048036038101906102e991906127c8565b61134a565b6040516102fb9190612943565b60405180910390f35b61030c61136a565b005b6103286004803603810190610323919061295e565b6113f2565b005b610332611488565b60405161033f91906129a7565b60405180910390f35b610362600480360381019061035d91906126a3565b6114b1565b60405161036f9190612804565b60405180910390f35b610392600480360381019061038d91906127c8565b61152f565b005b6103ae60048036038101906103a991906127c8565b611606565b005b6103b86116dd565b6040516103c59190612804565b60405180910390f35b6103e860048036038101906103e391906128f6565b6116e3565b005b6103f2611856565b005b61040e600480360381019061040991906127c8565b6118e2565b005b61042a600480360381019061042591906129c2565b6119da565b005b610446600480360381019061044191906126a3565b611b27565b005b60606000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156104e657600067ffffffffffffffff8111156104b0576104af61249f565b5b6040519080825280602002602001820160405280156104de5781602001602082028036833780820191505090505b509050610685565b600080600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015467ffffffffffffffff8111156105455761054461249f565b5b6040519080825280602002602001820160405280156105735781602001602082028036833780820191505090505b50905060008590505b84811161067e578673ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561066b578082848151811061060157610600612a22565b5b602002602001018181525050828061061890612a80565b935050600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015483141561066a5761067e565b5b808061067690612a80565b91505061057c565b5080925050505b9392505050565b600063150b7a0260e01b9050949350505050565b3373ffffffffffffffffffffffffffffffffffffffff166106bf611488565b73ffffffffffffffffffffffffffffffffffffffff16148061072a5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076090612b4c565b60405180910390fd5b8060038190555050565b61077c33611bfa565b60005b83839050811015610a51573373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8686858181106107f2576107f1612a22565b5b905060200201356040518263ffffffff1660e01b81526004016108159190612804565b602060405180830381865afa158015610832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108569190612b81565b73ffffffffffffffffffffffffffffffffffffffff16146108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390612bfa565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308787868181106108ff576108fe612a22565b5b905060200201356040518463ffffffff1660e01b815260040161092493929190612c1a565b600060405180830381600087803b15801561093e57600080fd5b505af1158015610952573d6000803e3d6000fd5b50505050336005600086868581811061096e5761096d612a22565b5b90506020020135815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506109e68484838181106109da576109d9612a22565b5b905060200201356114b1565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254610a379190612c51565b925050819055508080610a4990612a80565b91505061077f565b5082829050600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610aa79190612c51565b925050819055508015610be057600060035442610ac49190612c51565b905060005b84849050811015610bdd578160056000878785818110610aec57610aeb612a22565b5b90506020020135815260200190815260200160002060010181905550600160056000878785818110610b2157610b20612a22565b5b90506020020135815260200190815260200160002060000160006101000a81548160ff021916908315150217905550610b72858583818110610b6657610b65612a22565b5b905060200201356114b1565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254610bc39190612c51565b925050819055508080610bd590612a80565b915050610ac9565b50505b610be933611d80565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610c0d611488565b73ffffffffffffffffffffffffffffffffffffffff161480610c785750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90612b4c565b60405180910390fd5b610cc083611bfa565b6040518060400160405280600184610cd89190612ca7565b8152602001600183610cea9190612ca7565b815250600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004016000820151816000015560208201518160010155905050505050565b610d53611e50565b73ffffffffffffffffffffffffffffffffffffffff16610d71611488565b73ffffffffffffffffffffffffffffffffffffffff1614610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe90612d27565b60405180910390fd5b6007819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015442610e7e9190612ca7565b905060006008546001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160010154610ed79190612c51565b6001600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160000154610f299190612c51565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015485610f779190612d47565b610f819190612d47565b610f8b9190612dd0565b610f959190612dd0565b905080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154610fe59190612c51565b92505050919050565b60056020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60046020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040160405180604001604052908160008201548152602001600182015481525050905085565b6110a233611bfa565b6000600354426110b29190612c51565b905060005b8383905081101561133b573373ffffffffffffffffffffffffffffffffffffffff16600560008686858181106110f0576110ef612a22565b5b90506020020135815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690612e4d565b60405180910390fd5b426005600086868581811061119757611196612a22565b5b90506020020135815260200190815260200160002060010154106111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790612eb9565b60405180910390fd5b6005600085858481811061120757611206612a22565b5b90506020020135815260200190815260200160002060000160009054906101000a900460ff166112f45760016005600086868581811061124a57611249612a22565b5b90506020020135815260200190815260200160002060000160006101000a81548160ff02191690831515021790555061129b84848381811061128f5761128e612a22565b5b905060200201356114b1565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546112ec9190612c51565b925050819055505b816005600086868581811061130c5761130b612a22565b5b90506020020135815260200190815260200160002060010181905550808061133390612a80565b9150506110b7565b5061134533611d80565b505050565b60066020528060005260406000206000915054906101000a900460ff1681565b611372611e50565b73ffffffffffffffffffffffffffffffffffffffff16611390611488565b73ffffffffffffffffffffffffffffffffffffffff16146113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90612d27565b60405180910390fd5b6113f06000611e58565b565b6113fa611e50565b73ffffffffffffffffffffffffffffffffffffffff16611418611488565b73ffffffffffffffffffffffffffffffffffffffff161461146e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146590612d27565b60405180910390fd5b80600990805190602001906114849291906121e5565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060098281546114c190612f08565b81106114d0576114cf612a22565b5b8154600116156114ef5790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000260f81c60ff166103e86115289190612c51565b9050919050565b611537611e50565b73ffffffffffffffffffffffffffffffffffffffff16611555611488565b73ffffffffffffffffffffffffffffffffffffffff16146115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290612d27565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61160e611e50565b73ffffffffffffffffffffffffffffffffffffffff1661162c611488565b73ffffffffffffffffffffffffffffffffffffffff1614611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990612d27565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60085481565b6116ec33611bfa565b60005b828290508110156117ec573373ffffffffffffffffffffffffffffffffffffffff166005600085858581811061172857611727612a22565b5b90506020020135815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae90612fac565b60405180910390fd5b6117d98383838181106117cd576117cc612a22565b5b90506020020135611f1c565b80806117e490612a80565b9150506116ef565b5081819050600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546118429190612ca7565b9250508190555061185233611d80565b5050565b61185e611e50565b73ffffffffffffffffffffffffffffffffffffffff1661187c611488565b73ffffffffffffffffffffffffffffffffffffffff16146118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c990612d27565b60405180910390fd5b600760006118e0919061226b565b565b6118ea611e50565b73ffffffffffffffffffffffffffffffffffffffff16611908611488565b73ffffffffffffffffffffffffffffffffffffffff161461195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590612d27565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c59061303e565b60405180910390fd5b6119d781611e58565b50565b6119e2611e50565b73ffffffffffffffffffffffffffffffffffffffff16611a00611488565b73ffffffffffffffffffffffffffffffffffffffff1614611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90612d27565b60405180910390fd5b60005b82829050811015611b2157600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3086868686818110611ab757611ab6612a22565b5b905060200201356040518463ffffffff1660e01b8152600401611adc93929190612c1a565b600060405180830381600087803b158015611af657600080fd5b505af1158015611b0a573d6000803e3d6000fd5b505050508080611b1990612a80565b915050611a59565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16611b46611488565b73ffffffffffffffffffffffffffffffffffffffff161480611bb15750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790612b4c565b60405180910390fd5b8060088190555050565b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154421415611c4957611d7d565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541415611ce05742600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611d7d565b6000611ceb82610e2d565b905080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018190555042600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550505b50565b60005b600780549050811015611e4c5760078181548110611da457611da3612a22565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c79d6136836040518263ffffffff1660e01b8152600401611e0791906129a7565b600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b505050508080611e4490612a80565b915050611d83565b5050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b42600560008381526020019081526020016000206001015410611f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6b906130aa565b60405180910390fd5b611f7d816114b1565b600460006005600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546120049190612ca7565b925050819055506005600082815260200190815260200160002060000160009054906101000a900460ff16156120fb5760006005600083815260200190815260200160002060000160006101000a81548160ff02191690831515021790555061206c816114b1565b600460006005600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546120f39190612ca7565b925050819055505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b815260040161215a93929190612c1a565b600060405180830381600087803b15801561217457600080fd5b505af1158015612188573d6000803e3d6000fd5b5050505060006005600083815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8280546121f190612f08565b90600052602060002090601f016020900481019282612213576000855561225a565b82601f1061222c57805160ff191683800117855561225a565b8280016001018555821561225a579182015b8281111561225957825182559160200191906001019061223e565b5b509050612267919061228c565b5090565b5080546000825590600052602060002090810190612289919061228c565b50565b5b808211156122a557600081600090555060010161228d565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122e8826122bd565b9050919050565b6122f8816122dd565b811461230357600080fd5b50565b600081359050612315816122ef565b92915050565b6000819050919050565b61232e8161231b565b811461233957600080fd5b50565b60008135905061234b81612325565b92915050565b60008060006060848603121561236a576123696122b3565b5b600061237886828701612306565b93505060206123898682870161233c565b925050604061239a8682870161233c565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6123d98161231b565b82525050565b60006123eb83836123d0565b60208301905092915050565b6000602082019050919050565b600061240f826123a4565b61241981856123af565b9350612424836123c0565b8060005b8381101561245557815161243c88826123df565b9750612447836123f7565b925050600181019050612428565b5085935050505092915050565b6000602082019050818103600083015261247c8184612404565b905092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124d78261248e565b810181811067ffffffffffffffff821117156124f6576124f561249f565b5b80604052505050565b60006125096122a9565b905061251582826124ce565b919050565b600067ffffffffffffffff8211156125355761253461249f565b5b61253e8261248e565b9050602081019050919050565b82818337600083830152505050565b600061256d6125688461251a565b6124ff565b90508281526020810184848401111561258957612588612489565b5b61259484828561254b565b509392505050565b600082601f8301126125b1576125b0612484565b5b81356125c184826020860161255a565b91505092915050565b600080600080608085870312156125e4576125e36122b3565b5b60006125f287828801612306565b945050602061260387828801612306565b93505060406126148782880161233c565b925050606085013567ffffffffffffffff811115612635576126346122b8565b5b6126418782880161259c565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6126828161264d565b82525050565b600060208201905061269d6000830184612679565b92915050565b6000602082840312156126b9576126b86122b3565b5b60006126c78482850161233c565b91505092915050565b600080fd5b600080fd5b60008083601f8401126126f0576126ef612484565b5b8235905067ffffffffffffffff81111561270d5761270c6126d0565b5b602083019150836020820283011115612729576127286126d5565b5b9250929050565b60008115159050919050565b61274581612730565b811461275057600080fd5b50565b6000813590506127628161273c565b92915050565b600080600060408486031215612781576127806122b3565b5b600084013567ffffffffffffffff81111561279f5761279e6122b8565b5b6127ab868287016126da565b935093505060206127be86828701612753565b9150509250925092565b6000602082840312156127de576127dd6122b3565b5b60006127ec84828501612306565b91505092915050565b6127fe8161231b565b82525050565b600060208201905061281960008301846127f5565b92915050565b61282881612730565b82525050565b612837816122dd565b82525050565b6000606082019050612852600083018661281f565b61285f60208301856127f5565b61286c604083018461282e565b949350505050565b60408201600082015161288a60008501826123d0565b50602082015161289d60208501826123d0565b50505050565b600060c0820190506128b860008301886127f5565b6128c560208301876127f5565b6128d260408301866127f5565b6128df60608301856127f5565b6128ec6080830184612874565b9695505050505050565b6000806020838503121561290d5761290c6122b3565b5b600083013567ffffffffffffffff81111561292b5761292a6122b8565b5b612937858286016126da565b92509250509250929050565b6000602082019050612958600083018461281f565b92915050565b600060208284031215612974576129736122b3565b5b600082013567ffffffffffffffff811115612992576129916122b8565b5b61299e8482850161259c565b91505092915050565b60006020820190506129bc600083018461282e565b92915050565b6000806000604084860312156129db576129da6122b3565b5b60006129e986828701612306565b935050602084013567ffffffffffffffff811115612a0a57612a096122b8565b5b612a16868287016126da565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a8b8261231b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612abe57612abd612a51565b5b600182019050919050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f7420616e20617070726f766564206d616e61676560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b36602183612ac9565b9150612b4182612ada565b604082019050919050565b60006020820190508181036000830152612b6581612b29565b9050919050565b600081519050612b7b816122ef565b92915050565b600060208284031215612b9757612b966122b3565b5b6000612ba584828501612b6c565b91505092915050565b7f4e6f7420796f757220746f6b656e000000000000000000000000000000000000600082015250565b6000612be4600e83612ac9565b9150612bef82612bae565b602082019050919050565b60006020820190508181036000830152612c1381612bd7565b9050919050565b6000606082019050612c2f600083018661282e565b612c3c602083018561282e565b612c4960408301846127f5565b949350505050565b6000612c5c8261231b565b9150612c678361231b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c9c57612c9b612a51565b5b828201905092915050565b6000612cb28261231b565b9150612cbd8361231b565b925082821015612cd057612ccf612a51565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612d11602083612ac9565b9150612d1c82612cdb565b602082019050919050565b60006020820190508181036000830152612d4081612d04565b9050919050565b6000612d528261231b565b9150612d5d8361231b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d9657612d95612a51565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ddb8261231b565b9150612de68361231b565b925082612df657612df5612da1565b5b828204905092915050565b7f546f6b656e206973206e6f742063757272656e746c79207374616b6564000000600082015250565b6000612e37601d83612ac9565b9150612e4282612e01565b602082019050919050565b60006020820190508181036000830152612e6681612e2a565b9050919050565b7f546f6b656e20697320616c7265616479206c6f636b6564000000000000000000600082015250565b6000612ea3601783612ac9565b9150612eae82612e6d565b602082019050919050565b60006020820190508181036000830152612ed281612e96565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f2057607f821691505b60208210811415612f3457612f33612ed9565b5b50919050565b7f43616c6c6572206973206e6f742063757272656e746c79207374616b696e672060008201527f7468652070726f766964656420746f6b656e4964000000000000000000000000602082015250565b6000612f96603483612ac9565b9150612fa182612f3a565b604082019050919050565b60006020820190508181036000830152612fc581612f89565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613028602683612ac9565b915061303382612fcc565b604082019050919050565b600060208201905081810360008301526130578161301b565b9050919050565b7f546f6b656e206973207374696c6c206c6f636b65640000000000000000000000600082015250565b6000613094601583612ac9565b915061309f8261305e565b602082019050919050565b600060208201905081810360008301526130c381613087565b905091905056fea2646970667358221220c4a93ed358ea9c2079289e26979efa585d0c00786b5f56310ad4fce1b048a3cd64736f6c634300080c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.