Source Code
Overview
FRAX Balance | FXTL Balance
0 FRAX | 0 FXTL
FRAX Value
$0.00
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TimeBasedStaking
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/**
*Submitted for verification at fraxscan.com on 2024-02-28
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
interface IERC20 {
/**
* @dev Allows for the transfer of a specified amount of tokens from a sender to a recipient.
* @param sender The address sending the tokens.
* @param recipient The address receiving the tokens.
* @param amount The amount of tokens to be transferred.
* @return Returns true if the transfer was successful.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the balance of the specified account.
* @param account The address to check the balance of.
* @return The balance of the specified account.
*/
function balanceOf(address account) external view returns (uint256);
}
library Strings {
/**
* @dev Converts a uint256 value to its string representation.
* @param value The uint256 value to convert.
* @return The string representation of the uint256 value.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Edge case when the value is 0
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts an address to its hexadecimal string representation.
* @param addr The address to convert.
* @return The hexadecimal string representation of the address.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), 20);
}
/**
* @dev Converts a uint256 value to its hexadecimal string representation with a specified length.
* @param value The uint256 value to convert.
* @param length The desired length of the hexadecimal string.
* @return The hexadecimal string representation of the uint256 value.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = bytes1(uint8(48 + value % 16 + (value % 16 > 9 ? 7 : 0)));
value /= 16;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
contract TimeBasedStaking {
// Importing the Strings library to enable string manipulation for uint256 and address types.
using Strings for uint256;
using Strings for address;
// Event emitted when the setup is completed.
event SetupCompleted(address indexed owner, uint setupBlock);
// Event emitted when a token is approved for staking.
event TokenApprovedForStaking(address indexed tokenAddress);
// Event emitted when a token is disapproved for staking.
event TokenDisapprovedForStaking(address indexed tokenAddress);
// Event emitted when the minimum staking time is set for a token.
event MinimumStakingTimeSet(address indexed tokenAddress, uint256 time);
// Event emitted when tokens are staked.
event TokensStaked(address indexed tokenAddress, address staker, uint256 stakeID, uint256 amount);
// Event emitted when staked tokens are transferred between addresses.
event StakedTokensTransferred(address indexed tokenAddress, uint256 stakeID, address from, address to, uint256 amount);
// Event emitted when tokens are unstaked.
event TokensUnstaked(address indexed tokenAddress, uint256 stakeID, address staker, uint256 amount);
// Event emitted when the ownership of the contract is transferred
event OwnershipTransferred(address newOwner);
// The address of the owner.
address private owner;
// Stores the block number at which the contract was setup.
uint private setupBlock;
// Flag indicating if the contract setup is completed.
bool private isSetup;
// Variable representing the contract's paused state
bool private _paused;
// Flag to prevent reentrant calls.
bool private locked;
// The name of the contract
string private contractName;
// Mapping to track approved tokens for staking.
mapping(address => bool) private approvedTokenStaking;
// Mapping to store the next available stake ID for each user.
mapping(address => uint256) private nextStakeID;
// Mapping to specify the minimum staking time required for each user.
mapping(address => uint256) private minimumStakingTime;
// Mapping to store stake information for each user.
mapping(address => mapping(uint256 => StakeInfo)) private stakes;
// Mapping to track the staking amount for each user and token.
mapping(address => mapping(address => uint256)) private stakingAmount;
// Mapping to track staking points for each user and token.
mapping(address => mapping(address => uint256)) private stakingPoints;
// Modifier that allows function execution only when the contract is not paused
modifier whenNotPaused() {
require(!_paused, "Contract is paused"); // Checks if the contract is not paused
_; // Continues execution of the modified function
}
// Modifier that allows function execution only when the contract is paused
modifier whenPaused() {
require(_paused, "Contract is not paused"); // Checks if the contract is paused
_; // Continues execution of the modified function
}
/**
* @dev Modifier to prevent a contract from calling itself, directly or indirectly.
*/
modifier nonReentrant() {
require(!locked, "Reentrant call detected");
locked = true;
_;
locked = false;
}
/**
* @dev Modifier to restrict function access to only the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner, "Msg.sender is not the owner!");
_;
}
/**
* @dev Modifier to ensure a function is called only once during the contract's lifetime.
*/
modifier setupOnce() {
require(!isSetup, "Setup already called!");
_;
isSetup = true;
}
// Function to pause the contract
function pause() public onlyOwner whenNotPaused {
_paused = true; // Sets the contract state to paused
}
// Function to resume the contract's operations
function unpause() public onlyOwner whenPaused {
_paused = false; // Sets the contract state to not paused
}
/**
* @dev Returns the owner address of the contract.
* @return The address of the current owner.
*/
function getOwner() public view returns (address) {
return owner;
}
/**
* @dev Returns the boolean status indicating if the contract setup is completed.
* @return True if setup is completed, false otherwise.
*/
function getSetupBlock() public view returns (uint) {
return setupBlock;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function isPaused() public view returns (bool) {
return _paused;
}
/**
* @dev Retrieves the name of this contract.
* @return The name of the contract as a string.
*/
function getContractName() public view returns (string memory) {
return contractName;
}
/**
* @dev Returns the boolean status indicating if the contract setup is completed.
* @return True if setup is completed, false otherwise.
*/
function getIsSetup() public view returns (bool) {
return isSetup;
}
/**
* @dev Retrieves the stake IDs of a specific user for a given token.
* @param tokenAddress The address of the token.
* @param staker The address of the staker.
* @return A string containing the stake IDs and associated token addresses.
*/
function getStakerStakeIDs(address tokenAddress, address staker) external view returns (string memory) {
string memory result = "";
for (uint256 i = 0; i < nextStakeID[tokenAddress]; i++) {
StakeInfo memory stakeInfo = stakes[tokenAddress][i];
if (stakeInfo.owner == staker && stakeInfo.isActive) {
result = string(abi.encodePacked(result, "ID: ", Strings.toString(i), " | Token: ", Strings.toHexString(uint160(tokenAddress), 20), "\n"));
}
}
return result;
}
/**
* @dev Retrieves the details of a specific stake in a string format.
* @param tokenAddress The address of the token.
* @param stakeID The ID of the stake.
* @return A string containing the detailed information of the stake.
*/
function getStakeDetailsAsString(address tokenAddress, uint256 stakeID) public view returns (string memory) {
require(stakeID < nextStakeID[tokenAddress], "Invalid stake ID");
StakeInfo memory stake = stakes[tokenAddress][stakeID];
return string(abi.encodePacked(
"Owner: ", stake.owner.toHexString(), "\n",
"Stake ID: ", stake.stakeID.toString(), "\n",
"Timestamp: ", stake.timestamp.toString(), "\n",
"Is Active: ", stake.isActive ? "Yes" : "No", "\n"
));
}
/**
* @dev Returns the staking amount for a given token address by a specific user.
* @param userAddress The address of the user whose staking amount is to be checked.
* @param tokenAddress The address of the token.
* @return amount The amount of tokens staked by the specified user for the specified token.
* @return message A message indicating whether the specified user has staked tokens for the given token address.
*/
function getStakingAmountForUserAndToken(address userAddress, address tokenAddress) public view returns (uint256 amount, string memory message) {
amount = stakingAmount[tokenAddress][userAddress];
if (amount == 0) {
message = "This user does not have this token in staking.";
} else {
message = "This user has this token in staking.";
}
return (amount, message);
}
/**
* @dev Checks if a specific stake ID is active.
* @param tokenAddress The address of the token.
* @param stakeID The ID of the stake to check.
* @return bool True if the stake ID is active, false otherwise.
*/
function isStakeIDActive(address tokenAddress, uint256 stakeID) public view returns (bool) {
require(stakeID < nextStakeID[tokenAddress], "Invalid stake ID");
StakeInfo memory stake = stakes[tokenAddress][stakeID];
return stake.isActive;
}
/**
* @dev Retrieves the staking points for a specific token and staker address.
* @param tokenAddress The address of the token.
* @param staker The address of the staker.
* @return A string message indicating the number of staking points or informing that the staker has no staking points for the token.
*/
function getStakingPoints(address tokenAddress, address staker) public view returns (string memory) {
uint256 points = stakingPoints[tokenAddress][staker];
if (points == 0) {
return "The staker has no staking points for this token.";
} else {
return Strings.toString(points);
}
}
/**
* @dev Retrieves all addresses and their staking points for a given token.
* @param tokenAddress The address of the token.
* @return A string containing addresses and their corresponding staking points.
*/
function getAllStakingPoints(address tokenAddress) external view returns (string memory) {
string memory result = "";
for (uint256 i = 0; i < nextStakeID[tokenAddress]; i++) {
StakeInfo memory stake = stakes[tokenAddress][i];
if (stake.isActive) {
uint256 points = stakingPoints[tokenAddress][stake.owner];
result = string(abi.encodePacked(result, "Address: ", Strings.toHexString(uint160(stake.owner), 20), " | Points: ", Strings.toString(points), "\n"));
}
}
return result;
}
/**
* @dev Sets up initial configuration of the contract.
* This function can only be called once.
* It initializes the owner and specifies the block number concerning the initiation of the setup function.
*/
function setup() public setupOnce {
owner = msg.sender;
setupBlock = block.number;
emit SetupCompleted(owner, setupBlock);
}
/**
* @dev Change the ownership of the contract.
* Can only be called by the current owner.
* @param newOwner The address of the new owner.
*/
function changeOwnership(address newOwner) public onlyOwner whenNotPaused {
require(newOwner != address(0), "New owner cannot be the zero address");
owner = newOwner;
emit OwnershipTransferred(newOwner);
}
/**
* @dev Sets a new name for the contract.
* @param _name The new name to be set.
*/
function setContractName(string calldata _name) public onlyOwner whenNotPaused {
require(keccak256(bytes(_name)) != keccak256(bytes(contractName)), "New name must be different from the current name"); // Checks if the new name is different from the current one
contractName = _name;
}
/**
* @dev Approves a token for staking.
* @param tokenAddress The address of the token to be approved.
*/
function approveTokenForStaking(address tokenAddress) external onlyOwner whenNotPaused {
require(tokenAddress != address(0), "Token address cannot be the zero address");
approvedTokenStaking[tokenAddress] = true;
emit TokenApprovedForStaking(tokenAddress);
}
/**
* @dev Disapproves a token for staking.
* @param tokenAddress The address of the token to be disapproved.
*/
function disapproveTokenForStaking(address tokenAddress) external onlyOwner whenNotPaused {
require(tokenAddress != address(0), "Token address cannot be the zero address");
approvedTokenStaking[tokenAddress] = false;
emit TokenDisapprovedForStaking(tokenAddress);
}
/**
* @dev Struct representing staking information.
*/
struct StakeInfo {
address owner; // The address of the stake owner.
uint256 stakeID; // Unique identifier for the stake.
uint256 timestamp; // Timestamp when the stake was created.
bool isActive; // Indicates whether the stake is active or not.
}
/**
* @dev Set the minimum staking time for a specific token.
*
* This function allows the contract owner to set the minimum staking time required
* for a particular token. Users will need to stake their tokens for at least this
* duration to be eligible for staking rewards.
*
* @param tokenAddress The address of the token for which the minimum staking time is being set.
* @param time The minimum staking time duration in seconds.
*
* Requirements:
* - Only the contract owner can call this function.
*
* Emits a MinimumStakingTimeSet event upon successful setting of the minimum staking time.
*/
function setMinimumStakingTime(address tokenAddress, uint256 time) external onlyOwner whenNotPaused {
minimumStakingTime[tokenAddress] = time;
emit MinimumStakingTimeSet(tokenAddress, time);
}
/**
* @dev Stake tokens and assign staking points.
*
* This function allows the user to stake tokens and earn staking points.
* The staked tokens must be approved for staking beforehand.
*
* @param tokenAddress The address of the token being staked.
* @param amount The amount of tokens to stake.
*
* Requirements:
* - The token must be approved for staking.
* - The sender must have a sufficient token balance.
*
* Emits a TokensStaked event upon successful staking.
*/
function stakeTokens(address tokenAddress, uint256 amount) external nonReentrant whenNotPaused {
require(approvedTokenStaking[tokenAddress], "Token not approved for staking");
require(IERC20(tokenAddress).balanceOf(msg.sender) >= amount, "Insufficient token balance");
require(IERC20(tokenAddress).transferFrom(msg.sender, address(this), amount), "Token transfer failed");
uint256 stakeID = nextStakeID[tokenAddress]++;
stakes[tokenAddress][stakeID] = StakeInfo(msg.sender, stakeID, block.timestamp, true);
stakingAmount[tokenAddress][msg.sender] += amount;
stakingPoints[tokenAddress][msg.sender] += amount;
emit TokensStaked(tokenAddress, msg.sender, nextStakeID[tokenAddress] - 1, amount);
}
/**
* @dev Transfer staked tokens to another address.
*
* This function allows the owner of a staked amount to transfer the stake to another address.
* The stake must be active and the sender must be the owner of the stake.
*
* @param tokenAddress The address of the token being staked.
* @param stakeID The ID of the stake being transferred.
* @param to The address to which the stake is being transferred.
*
* Requirements:
* - The token must be approved for staking.
* - The stake must be active and owned by the sender.
* - The 'to' address must not be the zero address.
*
* Emits a StakedTokensTransferred event upon successful transfer.
*/
function transferStakedTokens(address tokenAddress, uint256 stakeID, address to) external nonReentrant whenNotPaused {
require(approvedTokenStaking[tokenAddress], "Token not approved for staking");
StakeInfo storage stake = stakes[tokenAddress][stakeID];
require(stake.isActive, "Stake is not active");
require(stake.owner == msg.sender, "Only the owner can transfer the stake");
require(to != address(0), "Cannot transfer to the zero address");
// Transfer ilości zastakowanych tokenów i punktów stakingu
uint256 amount = stakingAmount[tokenAddress][msg.sender];
uint256 points = stakingPoints[tokenAddress][msg.sender];
stakingAmount[tokenAddress][msg.sender] -= amount;
stakingPoints[tokenAddress][msg.sender] -= points;
stakingAmount[tokenAddress][to] += amount;
stakingPoints[tokenAddress][to] += points;
stake.owner = to;
emit StakedTokensTransferred(tokenAddress, stakeID, msg.sender, to, stakingAmount[tokenAddress][msg.sender]);
}
/**
* @dev Unstake tokens.
*
* This function allows the owner of a staked amount to unstake their tokens,
* provided that the stake is active and the minimum staking time has elapsed.
*
* @param tokenAddress The address of the token being unstaked.
* @param stakeID The ID of the stake being unstaked.
*
* Requirements:
* - The token must be approved for staking.
* - The stake must be active and owned by the sender.
* - The minimum staking time must have elapsed.
* - The sender must have tokens staked.
*
* Effects:
* - The staked amount is deducted from the sender's staking balance.
* - The stake is marked as inactive.
* - The staked tokens are transferred back to the sender.
*
* Emits a TokensUnstaked event upon successful unstaking.
*/
function unstake(address tokenAddress, uint256 stakeID) external nonReentrant whenNotPaused {
require(approvedTokenStaking[tokenAddress], "Token not approved for staking");
StakeInfo storage stake = stakes[tokenAddress][stakeID];
require(stake.isActive, "Stake is not active");
require(stake.owner == msg.sender, "Only the owner can unstake");
require(block.timestamp >= stake.timestamp + minimumStakingTime[tokenAddress], "Minimum staking time has not elapsed");
uint256 amount = stakingAmount[tokenAddress][msg.sender];
require(amount > 0, "No tokens staked");
stakingAmount[tokenAddress][msg.sender] -= amount;
stake.isActive = false;
require(IERC20(tokenAddress).transferFrom(address(this), msg.sender, amount), "Token transfer failed");
emit TokensUnstaked(tokenAddress, stakeID, msg.sender, stakingAmount[tokenAddress][msg.sender]);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"MinimumStakingTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"setupBlock","type":"uint256"}],"name":"SetupCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakedTokensTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenApprovedForStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenDisapprovedForStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"},{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensUnstaked","type":"event"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"approveTokenForStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"disapproveTokenForStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getAllStakingPoints","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsSetup","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSetupBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"stakeID","type":"uint256"}],"name":"getStakeDetailsAsString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"staker","type":"address"}],"name":"getStakerStakeIDs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getStakingAmountForUserAndToken","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"message","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"staker","type":"address"}],"name":"getStakingPoints","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"stakeID","type":"uint256"}],"name":"isStakeIDActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setContractName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setMinimumStakingTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"stakeID","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"transferStakedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"stakeID","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561000f575f80fd5b506123a78061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806392e9c2db116100b4578063c2a672e011610079578063c2a672e014610280578063e18e025d14610293578063e233ad75146102a6578063f2295733146102b9578063f5f5ba72146102cc578063ffcad157146102d4575f80fd5b806392e9c2db146102275780639f40d0cd1461024a578063b187bd2614610255578063b59b933c14610265578063ba0bba4014610278575f80fd5b80634959cf99116101055780634959cf99146101ad5780635a737f13146101c057806379a83f5a146101d15780637e36ea2c146101e45780638456cb5914610205578063893d20e81461020d575f80fd5b80630b5ee00614610141578063178501f7146101565780632af4c31e1461017f5780633f4ba83a14610192578063478349f81461019a575b5f80fd5b61015461014f366004611b8a565b6102e7565b005b610169610164366004611c11565b6103e8565b6040516101769190611c86565b60405180910390f35b61015461018d366004611c98565b610535565b61015461063b565b6101546101a8366004611c98565b6106c1565b6101546101bb366004611cb1565b610780565b600154604051908152602001610176565b6101546101df366004611c11565b610add565b6101f76101f2366004611cea565b610e6f565b604051610176929190611d1b565b610154610ee4565b5f546040516001600160a01b039091168152602001610176565b61023a610235366004611c11565b610f46565b6040519015158152602001610176565b60025460ff1661023a565b600254610100900460ff1661023a565b610169610273366004611cea565b611000565b6101546110f6565b61015461028e366004611c11565b61119d565b6101546102a1366004611c11565b611551565b6101546102b4366004611c98565b6115fa565b6101696102c7366004611c98565b6116bc565b6101696117c4565b6101696102e2366004611cea565b611854565b5f546001600160a01b031633146103195760405162461bcd60e51b815260040161031090611d33565b60405180910390fd5b600254610100900460ff16156103415760405162461bcd60e51b815260040161031090611d6a565b60036040516103509190611dce565b60405180910390208282604051610368929190611e40565b6040518091039020036103d65760405162461bcd60e51b815260206004820152603060248201527f4e6577206e616d65206d75737420626520646966666572656e742066726f6d2060448201526f7468652063757272656e74206e616d6560801b6064820152608401610310565b60036103e3828483611eae565b505050565b6001600160a01b0382165f9081526005602052604090205460609082106104445760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081cdd185ad948125160821b6044820152606401610310565b6001600160a01b038084165f9081526007602090815260408083208684528252918290208251608081018452815490941680855260018201549285019290925260028101549284019290925260039091015460ff16151560608301526104a9906118b7565b6104b682602001516118cd565b6104c383604001516118cd565b83606001516104ec57604051806040016040528060028152602001614e6f60f01b815250610509565b6040518060400160405280600381526020016259657360e81b8152505b60405160200161051c9493929190611f68565b6040516020818303038152906040529150505b92915050565b5f546001600160a01b0316331461055e5760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff16156105865760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0381166105e85760405162461bcd60e51b8152602060048201526024808201527f4e6577206f776e65722063616e6e6f7420626520746865207a65726f206164646044820152637265737360e01b6064820152608401610310565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b5f546001600160a01b031633146106645760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff166106b45760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9858dd081a5cc81b9bdd081c185d5cd95960521b6044820152606401610310565b6002805461ff0019169055565b5f546001600160a01b031633146106ea5760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff16156107125760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0381166107385760405162461bcd60e51b815260040161031090612041565b6001600160a01b0381165f81815260046020526040808220805460ff19169055517f10255e2ac11d67622b1b47888617822abe5564acbaa9b34cae8a678a0a780d589190a250565b60025462010000900460ff16156107a95760405162461bcd60e51b815260040161031090612089565b6002805462ff00001916620100001790819055610100900460ff16156107e15760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0383165f9081526004602052604090205460ff166108185760405162461bcd60e51b8152600401610310906120c0565b6001600160a01b0383165f9081526007602090815260408083208584529091529020600381015460ff166108845760405162461bcd60e51b81526020600482015260136024820152725374616b65206973206e6f742061637469766560681b6044820152606401610310565b80546001600160a01b031633146108eb5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c7920746865206f776e65722063616e207472616e7366657220746865206044820152647374616b6560d81b6064820152608401610310565b6001600160a01b03821661094d5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610310565b6001600160a01b0384165f818152600860209081526040808320338085528184528285208054968652600985528386209186529084529184205492529091839190610998838061210b565b90915550506001600160a01b0386165f908152600960209081526040808320338452909152812080548392906109cf90849061210b565b90915550506001600160a01b038087165f90815260086020908152604080832093881683529290529081208054849290610a0a90849061211e565b90915550506001600160a01b038087165f90815260096020908152604080832093881683529290529081208054839290610a4590849061211e565b909155505082546001600160a01b0319166001600160a01b03858116918217855587165f81815260086020908152604080832033808552908352928190205481518b8152928301939093528101939093526060830152907f87d40198d627592e4eb297d4184f6c02d450663a49410694dcda272a9ccf5d3f9060800160405180910390a250506002805462ff00001916905550505050565b60025462010000900460ff1615610b065760405162461bcd60e51b815260040161031090612089565b6002805462ff00001916620100001790819055610100900460ff1615610b3e5760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0382165f9081526004602052604090205460ff16610b755760405162461bcd60e51b8152600401610310906120c0565b6040516370a0823160e01b815233600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa158015610bb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdd9190612131565b1015610c2b5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e63650000000000006044820152606401610310565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038316906323b872dd906064016020604051808303815f875af1158015610c7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9f9190612148565b610ce35760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610310565b6001600160a01b0382165f90815260056020526040812080549082610d0783612167565b9091555060408051608081018252338082526020808301858152428486019081526001606086018181526001600160a01b038c81165f818152600788528a81208c825288528a812099518a546001600160a01b03191693169290921789559451928801929092559151600287015590516003909501805460ff1916951515959095179094558352600881528383209183525290812080549293508492909190610db190849061211e565b90915550506001600160a01b0383165f90815260096020908152604080832033845290915281208054849290610de890849061211e565b90915550506001600160a01b0383165f818152600560205260409020547f9b68f01b80e516179521925c1a690f13d1fe61c92ac2f10fc202fb1252d7f111903390610e359060019061210b565b604080516001600160a01b0390931683526020830191909152810185905260600160405180910390a250506002805462ff00001916905550565b6001600160a01b038082165f90815260086020908152604080832093861683529290529081205490606090829003610ec1576040518060600160405280602e8152602001612344602e91399050610edd565b6040518060600160405280602481526020016122f06024913990505b9250929050565b5f546001600160a01b03163314610f0d5760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff1615610f355760405162461bcd60e51b815260040161031090611d6a565b6002805461ff001916610100179055565b6001600160a01b0382165f908152600560205260408120548210610f9f5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081cdd185ad948125160821b6044820152606401610310565b506001600160a01b039182165f908152600760209081526040808320938352928152908290208251608081018452815490941684526001810154918401919091526002810154918301919091526003015460ff161515606090910181905290565b60408051602081019091525f808252606091905b6001600160a01b0385165f908152600560205260409020548110156110ee576001600160a01b038086165f9081526007602090815260408083208584528252918290208251608081018452815485168082526001830154938201939093526002820154938101939093526003015460ff16151560608301529091861614801561109e575080606001515b156110e557826110ad836118cd565b6110c1886001600160a01b031660146119d2565b6040516020016110d39392919061217f565b60405160208183030381529060405292505b50600101611014565b509392505050565b60025460ff16156111415760405162461bcd60e51b8152602060048201526015602482015274536574757020616c72656164792063616c6c65642160581b6044820152606401610310565b5f80546001600160a01b031916339081179091554360018190556040519081527f9e4bd02b115dd3cb5ad86085de76fc3f2d3f9ea0b557c054c2d9cbdce10390139060200160405180910390a26002805460ff19166001179055565b60025462010000900460ff16156111c65760405162461bcd60e51b815260040161031090612089565b6002805462ff00001916620100001790819055610100900460ff16156111fe5760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0382165f9081526004602052604090205460ff166112355760405162461bcd60e51b8152600401610310906120c0565b6001600160a01b0382165f9081526007602090815260408083208484529091529020600381015460ff166112a15760405162461bcd60e51b81526020600482015260136024820152725374616b65206973206e6f742061637469766560681b6044820152606401610310565b80546001600160a01b031633146112fa5760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c7920746865206f776e65722063616e20756e7374616b650000000000006044820152606401610310565b6001600160a01b0383165f908152600660205260409020546002820154611321919061211e565b42101561137c5760405162461bcd60e51b8152602060048201526024808201527f4d696e696d756d207374616b696e672074696d6520686173206e6f7420656c616044820152631c1cd95960e21b6064820152608401610310565b6001600160a01b0383165f908152600860209081526040808320338452909152902054806113df5760405162461bcd60e51b815260206004820152601060248201526f139bc81d1bdad95b9cc81cdd185ad95960821b6044820152606401610310565b6001600160a01b0384165f9081526008602090815260408083203384529091528120805483929061141190849061210b565b909155505060038201805460ff191690556040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038516906323b872dd906064016020604051808303815f875af1158015611472573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114969190612148565b6114da5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610310565b6001600160a01b0384165f8181526008602090815260408083203380855290835292819020548151888152928301939093528101919091527ff6fba9a88a5110665e21aef3d4559593138f26d04b09c02afacad1e7e7fc6a419060600160405180910390a250506002805462ff0000191690555050565b5f546001600160a01b0316331461157a5760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff16156115a25760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0382165f8181526006602052604090819020839055517f092ee382e0672267975d7f91e9e9b0bd89fdfa489d86bbac79ba2e353988aa66906115ee9084815260200190565b60405180910390a25050565b5f546001600160a01b031633146116235760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff161561164b5760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0381166116715760405162461bcd60e51b815260040161031090612041565b6001600160a01b0381165f81815260046020526040808220805460ff19166001179055517f01a223948ec8d3591d2f4ae7cf53e8139689940db47159700eb008e8e1b3bba79190a250565b60408051602081019091525f808252606091905b6001600160a01b0384165f908152600560205260409020548110156117bd576001600160a01b038085165f9081526007602090815260408083208584528252918290208251608081018452815490941684526001810154918401919091526002810154918301919091526003015460ff1615801560608301526117b4576001600160a01b038086165f908152600960209081526040808320855185168452909152902054825190918591611786911660146119d2565b61178f836118cd565b6040516020016117a1939291906121f7565b6040516020818303038152906040529350505b506001016116d0565b5092915050565b6060600380546117d390611d96565b80601f01602080910402602001604051908101604052809291908181526020018280546117ff90611d96565b801561184a5780601f106118215761010080835404028352916020019161184a565b820191905f5260205f20905b81548152906001019060200180831161182d57829003601f168201915b5050505050905090565b6001600160a01b038083165f9081526009602090815260408083209385168352929052908120546060918190036118a6576040518060600160405280603081526020016123146030913991505061052f565b6118af816118cd565b91505061052f565b606061052f826001600160a01b031660146119d2565b6060815f036118f35750506040805180820190915260018152600360fc1b602082015290565b815f5b811561191c578061190681612167565b91506119159050600a83612289565b91506118f6565b5f8167ffffffffffffffff81111561193657611936611e4f565b6040519080825280601f01601f191660200182016040528015611960576020820181803683370190505b5090505b84156119ca5761197560018361210b565b9150611982600a8661229c565b61198d90603061211e565b60f81b8183815181106119a2576119a26122af565b60200101906001600160f81b03191690815f1a9053506119c3600a86612289565b9450611964565b949350505050565b60605f6119e08360026122c3565b6119eb90600261211e565b67ffffffffffffffff811115611a0357611a03611e4f565b6040519080825280601f01601f191660200182016040528015611a2d576020820181803683370190505b509050600360fc1b815f81518110611a4757611a476122af565b60200101906001600160f81b03191690815f1a905350600f60fb1b81600181518110611a7557611a756122af565b60200101906001600160f81b03191690815f1a9053505f611a978460026122c3565b611aa290600161211e565b90505b6001811115611b34576009611abb60108761229c565b11611ac6575f611ac9565b60075b60ff16611ad760108761229c565b611ae290603061211e565b611aec919061211e565b60f81b828281518110611b0157611b016122af565b60200101906001600160f81b03191690815f1a905350611b22601086612289565b9450611b2d816122da565b9050611aa5565b508315611b835760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610310565b9392505050565b5f8060208385031215611b9b575f80fd5b823567ffffffffffffffff80821115611bb2575f80fd5b818501915085601f830112611bc5575f80fd5b813581811115611bd3575f80fd5b866020828501011115611be4575f80fd5b60209290920196919550909350505050565b80356001600160a01b0381168114611c0c575f80fd5b919050565b5f8060408385031215611c22575f80fd5b611c2b83611bf6565b946020939093013593505050565b5f5b83811015611c53578181015183820152602001611c3b565b50505f910152565b5f8151808452611c72816020860160208601611c39565b601f01601f19169290920160200192915050565b602081525f611b836020830184611c5b565b5f60208284031215611ca8575f80fd5b611b8382611bf6565b5f805f60608486031215611cc3575f80fd5b611ccc84611bf6565b925060208401359150611ce160408501611bf6565b90509250925092565b5f8060408385031215611cfb575f80fd5b611d0483611bf6565b9150611d1260208401611bf6565b90509250929050565b828152604060208201525f6119ca6040830184611c5b565b6020808252601c908201527f4d73672e73656e646572206973206e6f7420746865206f776e65722100000000604082015260600190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b600181811c90821680611daa57607f821691505b602082108103611dc857634e487b7160e01b5f52602260045260245ffd5b50919050565b5f808354611ddb81611d96565b60018281168015611df35760018114611e0857611e34565b60ff1984168752821515830287019450611e34565b875f526020805f205f5b85811015611e2b5781548a820152908401908201611e12565b50505082870194505b50929695505050505050565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b601f8211156103e357805f5260205f20601f840160051c81016020851015611e885750805b601f840160051c820191505b81811015611ea7575f8155600101611e94565b5050505050565b67ffffffffffffffff831115611ec657611ec6611e4f565b611eda83611ed48354611d96565b83611e63565b5f601f841160018114611f0b575f8515611ef45750838201355b5f19600387901b1c1916600186901b178355611ea7565b5f83815260208120601f198716915b82811015611f3a5786850135825560209485019460019092019101611f1a565b5086821015611f56575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b66027bbb732b91d160cd1b81525f8551611f89816007850160208a01611c39565b600560f91b600791840191820181905269029ba30b5b29024a21d160b51b60088301528651611fbf816012850160208b01611c39565b601292019182018190526a02a34b6b2b9ba30b6b81d160ad1b60138301528551611ff081601e850160208a01611c39565b601e9201918201526a024b99020b1ba34bb329d160ad1b601f820152835161201f81602a840160208801611c39565b612035602a82840101600560f91b815260010190565b98975050505050505050565b60208082526028908201527f546f6b656e20616464726573732063616e6e6f7420626520746865207a65726f604082015267206164647265737360c01b606082015260800190565b60208082526017908201527f5265656e7472616e742063616c6c206465746563746564000000000000000000604082015260600190565b6020808252601e908201527f546f6b656e206e6f7420617070726f76656420666f72207374616b696e670000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561052f5761052f6120f7565b8082018082111561052f5761052f6120f7565b5f60208284031215612141575f80fd5b5051919050565b5f60208284031215612158575f80fd5b81518015158114611b83575f80fd5b5f60018201612178576121786120f7565b5060010190565b5f8451612190818460208901611c39565b63024a21d160e51b90830190815284516121b1816004840160208901611c39565b690103e102a37b5b2b71d160b51b6004929091019182015283516121dc81600e840160208801611c39565b600560f91b600e9290910191820152600f0195945050505050565b5f8451612208818460208901611c39565b68020b2323932b9b99d160bd1b908301908152845161222e816009840160208901611c39565b6a0103e102837b4b73a399d160ad1b60099290910191820152835161225a816014840160208801611c39565b600560f91b6014929091019182015260150195945050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261229757612297612275565b500490565b5f826122aa576122aa612275565b500690565b634e487b7160e01b5f52603260045260245ffd5b808202811582820484141761052f5761052f6120f7565b5f816122e8576122e86120f7565b505f19019056fe54686973207573657220686173207468697320746f6b656e20696e207374616b696e672e546865207374616b657220686173206e6f207374616b696e6720706f696e747320666f72207468697320746f6b656e2e54686973207573657220646f6573206e6f742068617665207468697320746f6b656e20696e207374616b696e672ea26469706673582212202d459e6bec0e553ce6e09242a6d8738b83b146404d3b9abf2707cfd3384a7a6f64736f6c63430008170033
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061013d575f3560e01c806392e9c2db116100b4578063c2a672e011610079578063c2a672e014610280578063e18e025d14610293578063e233ad75146102a6578063f2295733146102b9578063f5f5ba72146102cc578063ffcad157146102d4575f80fd5b806392e9c2db146102275780639f40d0cd1461024a578063b187bd2614610255578063b59b933c14610265578063ba0bba4014610278575f80fd5b80634959cf99116101055780634959cf99146101ad5780635a737f13146101c057806379a83f5a146101d15780637e36ea2c146101e45780638456cb5914610205578063893d20e81461020d575f80fd5b80630b5ee00614610141578063178501f7146101565780632af4c31e1461017f5780633f4ba83a14610192578063478349f81461019a575b5f80fd5b61015461014f366004611b8a565b6102e7565b005b610169610164366004611c11565b6103e8565b6040516101769190611c86565b60405180910390f35b61015461018d366004611c98565b610535565b61015461063b565b6101546101a8366004611c98565b6106c1565b6101546101bb366004611cb1565b610780565b600154604051908152602001610176565b6101546101df366004611c11565b610add565b6101f76101f2366004611cea565b610e6f565b604051610176929190611d1b565b610154610ee4565b5f546040516001600160a01b039091168152602001610176565b61023a610235366004611c11565b610f46565b6040519015158152602001610176565b60025460ff1661023a565b600254610100900460ff1661023a565b610169610273366004611cea565b611000565b6101546110f6565b61015461028e366004611c11565b61119d565b6101546102a1366004611c11565b611551565b6101546102b4366004611c98565b6115fa565b6101696102c7366004611c98565b6116bc565b6101696117c4565b6101696102e2366004611cea565b611854565b5f546001600160a01b031633146103195760405162461bcd60e51b815260040161031090611d33565b60405180910390fd5b600254610100900460ff16156103415760405162461bcd60e51b815260040161031090611d6a565b60036040516103509190611dce565b60405180910390208282604051610368929190611e40565b6040518091039020036103d65760405162461bcd60e51b815260206004820152603060248201527f4e6577206e616d65206d75737420626520646966666572656e742066726f6d2060448201526f7468652063757272656e74206e616d6560801b6064820152608401610310565b60036103e3828483611eae565b505050565b6001600160a01b0382165f9081526005602052604090205460609082106104445760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081cdd185ad948125160821b6044820152606401610310565b6001600160a01b038084165f9081526007602090815260408083208684528252918290208251608081018452815490941680855260018201549285019290925260028101549284019290925260039091015460ff16151560608301526104a9906118b7565b6104b682602001516118cd565b6104c383604001516118cd565b83606001516104ec57604051806040016040528060028152602001614e6f60f01b815250610509565b6040518060400160405280600381526020016259657360e81b8152505b60405160200161051c9493929190611f68565b6040516020818303038152906040529150505b92915050565b5f546001600160a01b0316331461055e5760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff16156105865760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0381166105e85760405162461bcd60e51b8152602060048201526024808201527f4e6577206f776e65722063616e6e6f7420626520746865207a65726f206164646044820152637265737360e01b6064820152608401610310565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b5f546001600160a01b031633146106645760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff166106b45760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9858dd081a5cc81b9bdd081c185d5cd95960521b6044820152606401610310565b6002805461ff0019169055565b5f546001600160a01b031633146106ea5760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff16156107125760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0381166107385760405162461bcd60e51b815260040161031090612041565b6001600160a01b0381165f81815260046020526040808220805460ff19169055517f10255e2ac11d67622b1b47888617822abe5564acbaa9b34cae8a678a0a780d589190a250565b60025462010000900460ff16156107a95760405162461bcd60e51b815260040161031090612089565b6002805462ff00001916620100001790819055610100900460ff16156107e15760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0383165f9081526004602052604090205460ff166108185760405162461bcd60e51b8152600401610310906120c0565b6001600160a01b0383165f9081526007602090815260408083208584529091529020600381015460ff166108845760405162461bcd60e51b81526020600482015260136024820152725374616b65206973206e6f742061637469766560681b6044820152606401610310565b80546001600160a01b031633146108eb5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c7920746865206f776e65722063616e207472616e7366657220746865206044820152647374616b6560d81b6064820152608401610310565b6001600160a01b03821661094d5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610310565b6001600160a01b0384165f818152600860209081526040808320338085528184528285208054968652600985528386209186529084529184205492529091839190610998838061210b565b90915550506001600160a01b0386165f908152600960209081526040808320338452909152812080548392906109cf90849061210b565b90915550506001600160a01b038087165f90815260086020908152604080832093881683529290529081208054849290610a0a90849061211e565b90915550506001600160a01b038087165f90815260096020908152604080832093881683529290529081208054839290610a4590849061211e565b909155505082546001600160a01b0319166001600160a01b03858116918217855587165f81815260086020908152604080832033808552908352928190205481518b8152928301939093528101939093526060830152907f87d40198d627592e4eb297d4184f6c02d450663a49410694dcda272a9ccf5d3f9060800160405180910390a250506002805462ff00001916905550505050565b60025462010000900460ff1615610b065760405162461bcd60e51b815260040161031090612089565b6002805462ff00001916620100001790819055610100900460ff1615610b3e5760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0382165f9081526004602052604090205460ff16610b755760405162461bcd60e51b8152600401610310906120c0565b6040516370a0823160e01b815233600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa158015610bb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdd9190612131565b1015610c2b5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e63650000000000006044820152606401610310565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038316906323b872dd906064016020604051808303815f875af1158015610c7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9f9190612148565b610ce35760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610310565b6001600160a01b0382165f90815260056020526040812080549082610d0783612167565b9091555060408051608081018252338082526020808301858152428486019081526001606086018181526001600160a01b038c81165f818152600788528a81208c825288528a812099518a546001600160a01b03191693169290921789559451928801929092559151600287015590516003909501805460ff1916951515959095179094558352600881528383209183525290812080549293508492909190610db190849061211e565b90915550506001600160a01b0383165f90815260096020908152604080832033845290915281208054849290610de890849061211e565b90915550506001600160a01b0383165f818152600560205260409020547f9b68f01b80e516179521925c1a690f13d1fe61c92ac2f10fc202fb1252d7f111903390610e359060019061210b565b604080516001600160a01b0390931683526020830191909152810185905260600160405180910390a250506002805462ff00001916905550565b6001600160a01b038082165f90815260086020908152604080832093861683529290529081205490606090829003610ec1576040518060600160405280602e8152602001612344602e91399050610edd565b6040518060600160405280602481526020016122f06024913990505b9250929050565b5f546001600160a01b03163314610f0d5760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff1615610f355760405162461bcd60e51b815260040161031090611d6a565b6002805461ff001916610100179055565b6001600160a01b0382165f908152600560205260408120548210610f9f5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081cdd185ad948125160821b6044820152606401610310565b506001600160a01b039182165f908152600760209081526040808320938352928152908290208251608081018452815490941684526001810154918401919091526002810154918301919091526003015460ff161515606090910181905290565b60408051602081019091525f808252606091905b6001600160a01b0385165f908152600560205260409020548110156110ee576001600160a01b038086165f9081526007602090815260408083208584528252918290208251608081018452815485168082526001830154938201939093526002820154938101939093526003015460ff16151560608301529091861614801561109e575080606001515b156110e557826110ad836118cd565b6110c1886001600160a01b031660146119d2565b6040516020016110d39392919061217f565b60405160208183030381529060405292505b50600101611014565b509392505050565b60025460ff16156111415760405162461bcd60e51b8152602060048201526015602482015274536574757020616c72656164792063616c6c65642160581b6044820152606401610310565b5f80546001600160a01b031916339081179091554360018190556040519081527f9e4bd02b115dd3cb5ad86085de76fc3f2d3f9ea0b557c054c2d9cbdce10390139060200160405180910390a26002805460ff19166001179055565b60025462010000900460ff16156111c65760405162461bcd60e51b815260040161031090612089565b6002805462ff00001916620100001790819055610100900460ff16156111fe5760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0382165f9081526004602052604090205460ff166112355760405162461bcd60e51b8152600401610310906120c0565b6001600160a01b0382165f9081526007602090815260408083208484529091529020600381015460ff166112a15760405162461bcd60e51b81526020600482015260136024820152725374616b65206973206e6f742061637469766560681b6044820152606401610310565b80546001600160a01b031633146112fa5760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c7920746865206f776e65722063616e20756e7374616b650000000000006044820152606401610310565b6001600160a01b0383165f908152600660205260409020546002820154611321919061211e565b42101561137c5760405162461bcd60e51b8152602060048201526024808201527f4d696e696d756d207374616b696e672074696d6520686173206e6f7420656c616044820152631c1cd95960e21b6064820152608401610310565b6001600160a01b0383165f908152600860209081526040808320338452909152902054806113df5760405162461bcd60e51b815260206004820152601060248201526f139bc81d1bdad95b9cc81cdd185ad95960821b6044820152606401610310565b6001600160a01b0384165f9081526008602090815260408083203384529091528120805483929061141190849061210b565b909155505060038201805460ff191690556040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038516906323b872dd906064016020604051808303815f875af1158015611472573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114969190612148565b6114da5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610310565b6001600160a01b0384165f8181526008602090815260408083203380855290835292819020548151888152928301939093528101919091527ff6fba9a88a5110665e21aef3d4559593138f26d04b09c02afacad1e7e7fc6a419060600160405180910390a250506002805462ff0000191690555050565b5f546001600160a01b0316331461157a5760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff16156115a25760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0382165f8181526006602052604090819020839055517f092ee382e0672267975d7f91e9e9b0bd89fdfa489d86bbac79ba2e353988aa66906115ee9084815260200190565b60405180910390a25050565b5f546001600160a01b031633146116235760405162461bcd60e51b815260040161031090611d33565b600254610100900460ff161561164b5760405162461bcd60e51b815260040161031090611d6a565b6001600160a01b0381166116715760405162461bcd60e51b815260040161031090612041565b6001600160a01b0381165f81815260046020526040808220805460ff19166001179055517f01a223948ec8d3591d2f4ae7cf53e8139689940db47159700eb008e8e1b3bba79190a250565b60408051602081019091525f808252606091905b6001600160a01b0384165f908152600560205260409020548110156117bd576001600160a01b038085165f9081526007602090815260408083208584528252918290208251608081018452815490941684526001810154918401919091526002810154918301919091526003015460ff1615801560608301526117b4576001600160a01b038086165f908152600960209081526040808320855185168452909152902054825190918591611786911660146119d2565b61178f836118cd565b6040516020016117a1939291906121f7565b6040516020818303038152906040529350505b506001016116d0565b5092915050565b6060600380546117d390611d96565b80601f01602080910402602001604051908101604052809291908181526020018280546117ff90611d96565b801561184a5780601f106118215761010080835404028352916020019161184a565b820191905f5260205f20905b81548152906001019060200180831161182d57829003601f168201915b5050505050905090565b6001600160a01b038083165f9081526009602090815260408083209385168352929052908120546060918190036118a6576040518060600160405280603081526020016123146030913991505061052f565b6118af816118cd565b91505061052f565b606061052f826001600160a01b031660146119d2565b6060815f036118f35750506040805180820190915260018152600360fc1b602082015290565b815f5b811561191c578061190681612167565b91506119159050600a83612289565b91506118f6565b5f8167ffffffffffffffff81111561193657611936611e4f565b6040519080825280601f01601f191660200182016040528015611960576020820181803683370190505b5090505b84156119ca5761197560018361210b565b9150611982600a8661229c565b61198d90603061211e565b60f81b8183815181106119a2576119a26122af565b60200101906001600160f81b03191690815f1a9053506119c3600a86612289565b9450611964565b949350505050565b60605f6119e08360026122c3565b6119eb90600261211e565b67ffffffffffffffff811115611a0357611a03611e4f565b6040519080825280601f01601f191660200182016040528015611a2d576020820181803683370190505b509050600360fc1b815f81518110611a4757611a476122af565b60200101906001600160f81b03191690815f1a905350600f60fb1b81600181518110611a7557611a756122af565b60200101906001600160f81b03191690815f1a9053505f611a978460026122c3565b611aa290600161211e565b90505b6001811115611b34576009611abb60108761229c565b11611ac6575f611ac9565b60075b60ff16611ad760108761229c565b611ae290603061211e565b611aec919061211e565b60f81b828281518110611b0157611b016122af565b60200101906001600160f81b03191690815f1a905350611b22601086612289565b9450611b2d816122da565b9050611aa5565b508315611b835760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610310565b9392505050565b5f8060208385031215611b9b575f80fd5b823567ffffffffffffffff80821115611bb2575f80fd5b818501915085601f830112611bc5575f80fd5b813581811115611bd3575f80fd5b866020828501011115611be4575f80fd5b60209290920196919550909350505050565b80356001600160a01b0381168114611c0c575f80fd5b919050565b5f8060408385031215611c22575f80fd5b611c2b83611bf6565b946020939093013593505050565b5f5b83811015611c53578181015183820152602001611c3b565b50505f910152565b5f8151808452611c72816020860160208601611c39565b601f01601f19169290920160200192915050565b602081525f611b836020830184611c5b565b5f60208284031215611ca8575f80fd5b611b8382611bf6565b5f805f60608486031215611cc3575f80fd5b611ccc84611bf6565b925060208401359150611ce160408501611bf6565b90509250925092565b5f8060408385031215611cfb575f80fd5b611d0483611bf6565b9150611d1260208401611bf6565b90509250929050565b828152604060208201525f6119ca6040830184611c5b565b6020808252601c908201527f4d73672e73656e646572206973206e6f7420746865206f776e65722100000000604082015260600190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b600181811c90821680611daa57607f821691505b602082108103611dc857634e487b7160e01b5f52602260045260245ffd5b50919050565b5f808354611ddb81611d96565b60018281168015611df35760018114611e0857611e34565b60ff1984168752821515830287019450611e34565b875f526020805f205f5b85811015611e2b5781548a820152908401908201611e12565b50505082870194505b50929695505050505050565b818382375f9101908152919050565b634e487b7160e01b5f52604160045260245ffd5b601f8211156103e357805f5260205f20601f840160051c81016020851015611e885750805b601f840160051c820191505b81811015611ea7575f8155600101611e94565b5050505050565b67ffffffffffffffff831115611ec657611ec6611e4f565b611eda83611ed48354611d96565b83611e63565b5f601f841160018114611f0b575f8515611ef45750838201355b5f19600387901b1c1916600186901b178355611ea7565b5f83815260208120601f198716915b82811015611f3a5786850135825560209485019460019092019101611f1a565b5086821015611f56575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b66027bbb732b91d160cd1b81525f8551611f89816007850160208a01611c39565b600560f91b600791840191820181905269029ba30b5b29024a21d160b51b60088301528651611fbf816012850160208b01611c39565b601292019182018190526a02a34b6b2b9ba30b6b81d160ad1b60138301528551611ff081601e850160208a01611c39565b601e9201918201526a024b99020b1ba34bb329d160ad1b601f820152835161201f81602a840160208801611c39565b612035602a82840101600560f91b815260010190565b98975050505050505050565b60208082526028908201527f546f6b656e20616464726573732063616e6e6f7420626520746865207a65726f604082015267206164647265737360c01b606082015260800190565b60208082526017908201527f5265656e7472616e742063616c6c206465746563746564000000000000000000604082015260600190565b6020808252601e908201527f546f6b656e206e6f7420617070726f76656420666f72207374616b696e670000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561052f5761052f6120f7565b8082018082111561052f5761052f6120f7565b5f60208284031215612141575f80fd5b5051919050565b5f60208284031215612158575f80fd5b81518015158114611b83575f80fd5b5f60018201612178576121786120f7565b5060010190565b5f8451612190818460208901611c39565b63024a21d160e51b90830190815284516121b1816004840160208901611c39565b690103e102a37b5b2b71d160b51b6004929091019182015283516121dc81600e840160208801611c39565b600560f91b600e9290910191820152600f0195945050505050565b5f8451612208818460208901611c39565b68020b2323932b9b99d160bd1b908301908152845161222e816009840160208901611c39565b6a0103e102837b4b73a399d160ad1b60099290910191820152835161225a816014840160208801611c39565b600560f91b6014929091019182015260150195945050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261229757612297612275565b500490565b5f826122aa576122aa612275565b500690565b634e487b7160e01b5f52603260045260245ffd5b808202811582820484141761052f5761052f6120f7565b5f816122e8576122e86120f7565b505f19019056fe54686973207573657220686173207468697320746f6b656e20696e207374616b696e672e546865207374616b657220686173206e6f207374616b696e6720706f696e747320666f72207468697320746f6b656e2e54686973207573657220646f6573206e6f742068617665207468697320746f6b656e20696e207374616b696e672ea26469706673582212202d459e6bec0e553ce6e09242a6d8738b83b146404d3b9abf2707cfd3384a7a6f64736f6c63430008170033
Deployed Bytecode Sourcemap
2785:18438:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13754:307;;;;;;:::i;:::-;;:::i;:::-;;9283:554;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13399:237;;;;;;:::i;:::-;;:::i;6899:122::-;;;:::i;14633:297::-;;;;;;:::i;:::-;;:::i;18306:1077::-;;;;;;:::i;:::-;;:::i;7408:88::-;7478:10;;7408:88;;2474:25:1;;;2462:2;2447:18;7408:88:0;2328:177:1;16778:773:0;;;;;;:::i;:::-;;:::i;10310:440::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;6720:118::-;;;:::i;7153:81::-;7194:7;7221:5;7153:81;;-1:-1:-1;;;;;7221:5:0;;;3217:51:1;;3205:2;3190:18;7153:81:0;3071:203:1;11007:271:0;;;;;;:::i;:::-;;:::i;:::-;;;3444:14:1;;3437:22;3419:41;;3407:2;3392:18;11007:271:0;3279:187:1;8081:82:0;8148:7;;;;8081:82;;7596:80;7661:7;;;;;;;7596:80;;8449:560;;;;;;:::i;:::-;;:::i;13063:156::-;;;:::i;20268:952::-;;;;;;:::i;:::-;;:::i;15995:215::-;;;;;;:::i;:::-;;:::i;14199:290::-;;;;;;:::i;:::-;;:::i;12222:595::-;;;;;;:::i;:::-;;:::i;7806:101::-;;;:::i;11629:346::-;;;;;;:::i;:::-;;:::i;13754:307::-;6375:5;;-1:-1:-1;;;;;6375:5:0;6361:10;:19;6353:60;;;;-1:-1:-1;;;6353:60:0;;;;;;;:::i;:::-;;;;;;;;;5558:7:::1;::::0;::::1;::::0;::::1;;;5557:8;5549:39;;;;-1:-1:-1::0;;;5549:39:0::1;;;;;;;:::i;:::-;13895:12:::2;13879:30;;;;;;:::i;:::-;;;;;;;;13868:5;;13852:23;;;;;;;:::i;:::-;;;;;;;;:57:::0;13844:118:::2;;;::::0;-1:-1:-1;;;13844:118:0;;6017:2:1;13844:118:0::2;::::0;::::2;5999:21:1::0;6056:2;6036:18;;;6029:30;6095:34;6075:18;;;6068:62;-1:-1:-1;;;6146:18:1;;;6139:46;6202:19;;13844:118:0::2;5815:412:1::0;13844:118:0::2;14033:12;:20;14048:5:::0;;14033:12;:20:::2;:::i;:::-;;13754:307:::0;;:::o;9283:554::-;-1:-1:-1;;;;;9420:25:0;;;;;;:11;:25;;;;;;9376:13;;9410:35;;9402:64;;;;-1:-1:-1;;;9402:64:0;;8466:2:1;9402:64:0;;;8448:21:1;8505:2;8485:18;;;8478:30;-1:-1:-1;;;8524:18:1;;;8517:46;8580:18;;9402:64:0;8264:340:1;9402:64:0;-1:-1:-1;;;;;9502:20:0;;;9477:22;9502:20;;;:6;:20;;;;;;;;:29;;;;;;;;;9477:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9600:25;;:23;:25::i;:::-;9660:24;:5;:13;;;:22;:24::i;:::-;9720:26;:5;:15;;;:24;:26::i;:::-;9782:5;:14;;;:29;;;;;;;;;;;;;;;-1:-1:-1;;;9782:29:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9782:29:0;;;;9558:270;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9544:285;;;9283:554;;;;;:::o;13399:237::-;6375:5;;-1:-1:-1;;;;;6375:5:0;6361:10;:19;6353:60;;;;-1:-1:-1;;;6353:60:0;;;;;;;:::i;:::-;5558:7:::1;::::0;::::1;::::0;::::1;;;5557:8;5549:39;;;;-1:-1:-1::0;;;5549:39:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13492:22:0;::::2;13484:71;;;::::0;-1:-1:-1;;;13484:71:0;;10992:2:1;13484:71:0::2;::::0;::::2;10974:21:1::0;11031:2;11011:18;;;11004:30;11070:34;11050:18;;;11043:62;-1:-1:-1;;;11121:18:1;;;11114:34;11165:19;;13484:71:0::2;10790:400:1::0;13484:71:0::2;13566:5;:16:::0;;-1:-1:-1;;;;;;13566:16:0::2;-1:-1:-1::0;;;;;13566:16:0;::::2;::::0;;::::2;::::0;;;13598:30:::2;::::0;3217:51:1;;;13598:30:0::2;::::0;3205:2:1;3190:18;13598:30:0::2;;;;;;;13399:237:::0;:::o;6899:122::-;6375:5;;-1:-1:-1;;;;;6375:5:0;6361:10;:19;6353:60;;;;-1:-1:-1;;;6353:60:0;;;;;;;:::i;:::-;5826:7:::1;::::0;::::1;::::0;::::1;;;5818:42;;;::::0;-1:-1:-1;;;5818:42:0;;11397:2:1;5818:42:0::1;::::0;::::1;11379:21:1::0;11436:2;11416:18;;;11409:30;-1:-1:-1;;;11455:18:1;;;11448:52;11517:18;;5818:42:0::1;11195:346:1::0;5818:42:0::1;6957:7:::2;:15:::0;;-1:-1:-1;;6957:15:0::2;::::0;;6899:122::o;14633:297::-;6375:5;;-1:-1:-1;;;;;6375:5:0;6361:10;:19;6353:60;;;;-1:-1:-1;;;6353:60:0;;;;;;;:::i;:::-;5558:7:::1;::::0;::::1;::::0;::::1;;;5557:8;5549:39;;;;-1:-1:-1::0;;;5549:39:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;14742:26:0;::::2;14734:79;;;;-1:-1:-1::0;;;14734:79:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;14824:34:0;::::2;14861:5;14824:34:::0;;;:20:::2;:34;::::0;;;;;:42;;-1:-1:-1;;14824:42:0::2;::::0;;14882:40;::::2;::::0;14861:5;14882:40:::2;14633:297:::0;:::o;18306:1077::-;6123:6;;;;;;;6122:7;6114:43;;;;-1:-1:-1;;;6114:43:0;;;;;;;:::i;:::-;6168:6;:13;;-1:-1:-1;;6168:13:0;;;;;;;;5558:7;::::1;6168:13:::0;5558:7:::1;5557:8;5549:39;;;;-1:-1:-1::0;;;5549:39:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18442:34:0;::::2;;::::0;;;:20:::2;:34;::::0;;;;;::::2;;18434:77;;;;-1:-1:-1::0;;;18434:77:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18548:20:0;::::2;18522:23;18548:20:::0;;;:6:::2;:20;::::0;;;;;;;:29;;;;;;;;18596:14:::2;::::0;::::2;::::0;::::2;;18588:46;;;::::0;-1:-1:-1;;;18588:46:0;;12868:2:1;18588:46:0::2;::::0;::::2;12850:21:1::0;12907:2;12887:18;;;12880:30;-1:-1:-1;;;12926:18:1;;;12919:49;12985:18;;18588:46:0::2;12666:343:1::0;18588:46:0::2;18653:11:::0;;-1:-1:-1;;;;;18653:11:0::2;18668:10;18653:25;18645:75;;;::::0;-1:-1:-1;;;18645:75:0;;13216:2:1;18645:75:0::2;::::0;::::2;13198:21:1::0;13255:2;13235:18;;;13228:30;13294:34;13274:18;;;13267:62;-1:-1:-1;;;13345:18:1;;;13338:35;13390:19;;18645:75:0::2;13014:401:1::0;18645:75:0::2;-1:-1:-1::0;;;;;18739:16:0;::::2;18731:64;;;::::0;-1:-1:-1;;;18731:64:0;;13622:2:1;18731:64:0::2;::::0;::::2;13604:21:1::0;13661:2;13641:18;;;13634:30;13700:34;13680:18;;;13673:62;-1:-1:-1;;;13751:18:1;;;13744:33;13794:19;;18731:64:0::2;13420:399:1::0;18731:64:0::2;-1:-1:-1::0;;;;;18897:27:0;::::2;18880:14;18897:27:::0;;;:13:::2;:27;::::0;;;;;;;18925:10:::2;18897:39:::0;;;;;;;;;;;18964:27;;;:13:::2;:27:::0;;;;;:39;;;;;;;;;;19014;;18964;;18897;;;19014:49:::2;18897:39:::0;;19014:49:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;19074:27:0;::::2;;::::0;;;:13:::2;:27;::::0;;;;;;;19102:10:::2;19074:39:::0;;;;;;;:49;;19117:6;;19074:27;:49:::2;::::0;19117:6;;19074:49:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;19134:27:0;;::::2;;::::0;;;:13:::2;:27;::::0;;;;;;;:31;;::::2;::::0;;;;;;;;:41;;19169:6;;19134:27;:41:::2;::::0;19169:6;;19134:41:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;19186:27:0;;::::2;;::::0;;;:13:::2;:27;::::0;;;;;;;:31;;::::2;::::0;;;;;;;;:41;;19221:6;;19186:27;:41:::2;::::0;19221:6;;19186:41:::2;:::i;:::-;::::0;;;-1:-1:-1;;19240:16:0;;-1:-1:-1;;;;;;19240:16:0::2;-1:-1:-1::0;;;;;19240:16:0;;::::2;::::0;;::::2;::::0;;19272:103;::::2;-1:-1:-1::0;19335:27:0;;;:13:::2;:27;::::0;;;;;;;19319:10:::2;19335:39:::0;;;;;;;;;;;19272:103;;14450:25:1;;;14529:18;;;14522:43;;;;14581:18;;14574:43;;;;14648:2;14633:18;;14626:34;19272:103:0;::::2;::::0;14437:3:1;14422:19;19272:103:0::2;;;;;;;-1:-1:-1::0;;6204:6:0;:14;;-1:-1:-1;;6204:14:0;;;-1:-1:-1;;;;18306:1077:0:o;16778:773::-;6123:6;;;;;;;6122:7;6114:43;;;;-1:-1:-1;;;6114:43:0;;;;;;;:::i;:::-;6168:6;:13;;-1:-1:-1;;6168:13:0;;;;;;;;5558:7;::::1;6168:13:::0;5558:7:::1;5557:8;5549:39;;;;-1:-1:-1::0;;;5549:39:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16892:34:0;::::2;;::::0;;;:20:::2;:34;::::0;;;;;::::2;;16884:77;;;;-1:-1:-1::0;;;16884:77:0::2;;;;;;;:::i;:::-;16980:42;::::0;-1:-1:-1;;;16980:42:0;;17011:10:::2;16980:42;::::0;::::2;3217:51:1::0;17026:6:0;;-1:-1:-1;;;;;16980:30:0;::::2;::::0;::::2;::::0;3190:18:1;;16980:42:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;16972:91;;;::::0;-1:-1:-1;;;16972:91:0;;15062:2:1;16972:91:0::2;::::0;::::2;15044:21:1::0;15101:2;15081:18;;;15074:30;15140:28;15120:18;;;15113:56;15186:18;;16972:91:0::2;14860:350:1::0;16972:91:0::2;17082:68;::::0;-1:-1:-1;;;17082:68:0;;17116:10:::2;17082:68;::::0;::::2;15455:34:1::0;17136:4:0::2;15505:18:1::0;;;15498:43;15557:18;;;15550:34;;;-1:-1:-1;;;;;17082:33:0;::::2;::::0;::::2;::::0;15390:18:1;;17082:68:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17074:102;;;::::0;-1:-1:-1;;;17074:102:0;;16079:2:1;17074:102:0::2;::::0;::::2;16061:21:1::0;16118:2;16098:18;;;16091:30;-1:-1:-1;;;16137:18:1;;;16130:51;16198:18;;17074:102:0::2;15877:345:1::0;17074:102:0::2;-1:-1:-1::0;;;;;17207:25:0;::::2;17189:15;17207:25:::0;;;:11:::2;:25;::::0;;;;:27;;;17189:15;17207:27:::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;17277:53:0::2;::::0;;::::2;::::0;::::2;::::0;;17287:10:::2;17277:53:::0;;;::::2;::::0;;::::2;::::0;;;17308:15:::2;17277:53:::0;;;;;;17325:4:::2;17277:53:::0;;;;;;-1:-1:-1;;;;;17245:20:0;;::::2;-1:-1:-1::0;17245:20:0;;;:6:::2;:20:::0;;;;;:29;;;;;;;;:85;;;;-1:-1:-1;;;;;;17245:85:0::2;::::0;::::2;::::0;;;::::2;::::0;;;;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;17245:85:0::2;::::0;::::2;;::::0;;;::::2;::::0;;;17341:27;;:13:::2;:27:::0;;;;;:39;;;;;;;:49;;17277:53;;-1:-1:-1;17384:6:0;;17341:39;;-1:-1:-1;17341:49:0::2;::::0;17384:6;;17341:49:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;17401:27:0;::::2;;::::0;;;:13:::2;:27;::::0;;;;;;;17429:10:::2;17401:39:::0;;;;;;;:49;;17444:6;;17401:27;:49:::2;::::0;17444:6;;17401:49:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;17466:77:0;::::2;17505:25;::::0;;;:11:::2;:25;::::0;;;;;17466:77:::2;::::0;17493:10:::2;::::0;17505:29:::2;::::0;17533:1:::2;::::0;17505:29:::2;:::i;:::-;17466:77;::::0;;-1:-1:-1;;;;;16587:32:1;;;16569:51;;16651:2;16636:18;;16629:34;;;;16679:18;;16672:34;;;16557:2;16542:18;17466:77:0::2;;;;;;;-1:-1:-1::0;;6204:6:0;:14;;-1:-1:-1;;6204:14:0;;;-1:-1:-1;16778:773:0:o;10310:440::-;-1:-1:-1;;;;;10474:27:0;;;10415:14;10474:27;;;:13;:27;;;;;;;;:40;;;;;;;;;;;;;10431:21;;10529:11;;;10525:183;;10557:58;;;;;;;;;;;;;;;;;;;10525:183;;;10648:48;;;;;;;;;;;;;;;;;;;10525:183;10310:440;;;;;:::o;6720:118::-;6375:5;;-1:-1:-1;;;;;6375:5:0;6361:10;:19;6353:60;;;;-1:-1:-1;;;6353:60:0;;;;;;;:::i;:::-;5558:7:::1;::::0;::::1;::::0;::::1;;;5557:8;5549:39;;;;-1:-1:-1::0;;;5549:39:0::1;;;;;;;:::i;:::-;6779:7:::2;:14:::0;;-1:-1:-1;;6779:14:0::2;;;::::0;;6720:118::o;11007:271::-;-1:-1:-1;;;;;11127:25:0;;11092:4;11127:25;;;:11;:25;;;;;;11117:35;;11109:64;;;;-1:-1:-1;;;11109:64:0;;8466:2:1;11109:64:0;;;8448:21:1;8505:2;8485:18;;;8478:30;-1:-1:-1;;;8524:18:1;;;8517:46;8580:18;;11109:64:0;8264:340:1;11109:64:0;-1:-1:-1;;;;;;11209:20:0;;;11184:22;11209:20;;;:6;:20;;;;;;;;:29;;;;;;;;;;11184:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11007:271::o;8449:560::-;8563:25;;;;;;;;;:20;:25;;;8537:13;;8563:25;8601:375;-1:-1:-1;;;;;8625:25:0;;;;;;:11;:25;;;;;;8621:29;;8601:375;;;-1:-1:-1;;;;;8701:20:0;;;8672:26;8701:20;;;:6;:20;;;;;;;;:23;;;;;;;;;8672:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8743:25;;;:47;;;;;8772:9;:18;;;8743:47;8739:226;;;8844:6;8860:19;8877:1;8860:16;:19::i;:::-;8895:46;8923:12;-1:-1:-1;;;;;8895:46:0;8938:2;8895:19;:46::i;:::-;8827:121;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8811:138;;8739:226;-1:-1:-1;8652:3:0;;8601:375;;;-1:-1:-1;8995:6:0;8449:560;-1:-1:-1;;;8449:560:0:o;13063:156::-;6595:7;;;;6594:8;6586:42;;;;-1:-1:-1;;;6586:42:0;;18080:2:1;6586:42:0;;;18062:21:1;18119:2;18099:18;;;18092:30;-1:-1:-1;;;18138:18:1;;;18131:51;18199:18;;6586:42:0;17878:345:1;6586:42:0;13108:5:::1;:18:::0;;-1:-1:-1;;;;;;13108:18:0::1;13116:10;13108:18:::0;;::::1;::::0;;;13150:12:::1;-1:-1:-1::0;13137:25:0;;;13178:33:::1;::::0;2474:25:1;;;13178:33:0::1;::::0;2462:2:1;2447:18;13178:33:0::1;;;;;;;6651:7:::0;:14;;-1:-1:-1;;6651:14:0;6661:4;6651:14;;;13063:156::o;20268:952::-;6123:6;;;;;;;6122:7;6114:43;;;;-1:-1:-1;;;6114:43:0;;;;;;;:::i;:::-;6168:6;:13;;-1:-1:-1;;6168:13:0;;;;;;;;5558:7;::::1;6168:13:::0;5558:7:::1;5557:8;5549:39;;;;-1:-1:-1::0;;;5549:39:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20379:34:0;::::2;;::::0;;;:20:::2;:34;::::0;;;;;::::2;;20371:77;;;;-1:-1:-1::0;;;20371:77:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20485:20:0;::::2;20459:23;20485:20:::0;;;:6:::2;:20;::::0;;;;;;;:29;;;;;;;;20533:14:::2;::::0;::::2;::::0;::::2;;20525:46;;;::::0;-1:-1:-1;;;20525:46:0;;12868:2:1;20525:46:0::2;::::0;::::2;12850:21:1::0;12907:2;12887:18;;;12880:30;-1:-1:-1;;;12926:18:1;;;12919:49;12985:18;;20525:46:0::2;12666:343:1::0;20525:46:0::2;20590:11:::0;;-1:-1:-1;;;;;20590:11:0::2;20605:10;20590:25;20582:64;;;::::0;-1:-1:-1;;;20582:64:0;;18430:2:1;20582:64:0::2;::::0;::::2;18412:21:1::0;18469:2;18449:18;;;18442:30;18508:28;18488:18;;;18481:56;18554:18;;20582:64:0::2;18228:350:1::0;20582:64:0::2;-1:-1:-1::0;;;;;20702:32:0;::::2;;::::0;;;:18:::2;:32;::::0;;;;;20684:15:::2;::::0;::::2;::::0;:50:::2;::::0;20702:32;20684:50:::2;:::i;:::-;20665:15;:69;;20657:118;;;::::0;-1:-1:-1;;;20657:118:0;;18785:2:1;20657:118:0::2;::::0;::::2;18767:21:1::0;18824:2;18804:18;;;18797:30;18863:34;18843:18;;;18836:62;-1:-1:-1;;;18914:18:1;;;18907:34;18958:19;;20657:118:0::2;18583:400:1::0;20657:118:0::2;-1:-1:-1::0;;;;;20805:27:0;::::2;20788:14;20805:27:::0;;;:13:::2;:27;::::0;;;;;;;20833:10:::2;20805:39:::0;;;;;;;;20863:10;20855:39:::2;;;::::0;-1:-1:-1;;;20855:39:0;;19190:2:1;20855:39:0::2;::::0;::::2;19172:21:1::0;19229:2;19209:18;;;19202:30;-1:-1:-1;;;19248:18:1;;;19241:46;19304:18;;20855:39:0::2;18988:340:1::0;20855:39:0::2;-1:-1:-1::0;;;;;20907:27:0;::::2;;::::0;;;:13:::2;:27;::::0;;;;;;;20935:10:::2;20907:39:::0;;;;;;;:49;;20950:6;;20907:27;:49:::2;::::0;20950:6;;20907:49:::2;:::i;:::-;::::0;;;-1:-1:-1;;20969:14:0::2;::::0;::::2;:22:::0;;-1:-1:-1;;20969:22:0::2;::::0;;21012:68:::2;::::0;-1:-1:-1;;;21012:68:0;;21054:4:::2;21012:68;::::0;::::2;15455:34:1::0;21061:10:0::2;15505:18:1::0;;;15498:43;15557:18;;;15550:34;;;-1:-1:-1;;;;;21012:33:0;::::2;::::0;::::2;::::0;15390:18:1;;21012:68:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21004:102;;;::::0;-1:-1:-1;;;21004:102:0;;16079:2:1;21004:102:0::2;::::0;::::2;16061:21:1::0;16118:2;16098:18;;;16091:30;-1:-1:-1;;;16137:18:1;;;16130:51;16198:18;;21004:102:0::2;15877:345:1::0;21004:102:0::2;-1:-1:-1::0;;;;;21122:90:0;::::2;21172:27;::::0;;;:13:::2;:27;::::0;;;;;;;21160:10:::2;21172:39:::0;;;;;;;;;;;21122:90;;19535:25:1;;;19576:18;;;19569:60;;;;19645:18;;19638:34;;;;21122:90:0::2;::::0;19523:2:1;19508:18;21122:90:0::2;;;;;;;-1:-1:-1::0;;6204:6:0;:14;;-1:-1:-1;;6204:14:0;;;-1:-1:-1;;20268:952:0:o;15995:215::-;6375:5;;-1:-1:-1;;;;;6375:5:0;6361:10;:19;6353:60;;;;-1:-1:-1;;;6353:60:0;;;;;;;:::i;:::-;5558:7:::1;::::0;::::1;::::0;::::1;;;5557:8;5549:39;;;;-1:-1:-1::0;;;5549:39:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16106:32:0;::::2;;::::0;;;:18:::2;:32;::::0;;;;;;:39;;;16161:41;::::2;::::0;::::2;::::0;16141:4;2474:25:1;;2462:2;2447:18;;2328:177;16161:41:0::2;;;;;;;;15995:215:::0;;:::o;14199:290::-;6375:5;;-1:-1:-1;;;;;6375:5:0;6361:10;:19;6353:60;;;;-1:-1:-1;;;6353:60:0;;;;;;;:::i;:::-;5558:7:::1;::::0;::::1;::::0;::::1;;;5557:8;5549:39;;;;-1:-1:-1::0;;;5549:39:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;14305:26:0;::::2;14297:79;;;;-1:-1:-1::0;;;14297:79:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;14387:34:0;::::2;;::::0;;;:20:::2;:34;::::0;;;;;:41;;-1:-1:-1;;14387:41:0::2;14424:4;14387:41;::::0;;14444:37;::::2;::::0;14387:34;14444:37:::2;14199:290:::0;:::o;12222:595::-;12322:25;;;;;;;;;:20;:25;;;12296:13;;12322:25;12360:424;-1:-1:-1;;;;;12384:25:0;;;;;;:11;:25;;;;;;12380:29;;12360:424;;;-1:-1:-1;;;;;12456:20:0;;;12431:22;12456:20;;;:6;:20;;;;;;;;:23;;;;;;;;;12431:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12494:279;;-1:-1:-1;;;;;12550:27:0;;;12533:14;12550:27;;;:13;:27;;;;;;;;12578:11;;12550:40;;;;;;;;;;12691:11;;12550:40;;12642:6;;12663:45;;;12705:2;12663:19;:45::i;:::-;12725:24;12742:6;12725:16;:24::i;:::-;12625:131;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12609:148;;12514:259;12494:279;-1:-1:-1;12411:3:0;;12360:424;;;-1:-1:-1;12803:6:0;12222:595;-1:-1:-1;;12222:595:0:o;7806:101::-;7854:13;7887:12;7880:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7806:101;:::o;11629:346::-;-1:-1:-1;;;;;11757:27:0;;;11740:14;11757:27;;;:13;:27;;;;;;;;:35;;;;;;;;;;;;11714:13;;11807:11;;;11803:165;;11835:57;;;;;;;;;;;;;;;;;;;;;;11803:165;11932:24;11949:6;11932:16;:24::i;:::-;11925:31;;;;;1832:138;1890:13;1923:39;1951:4;-1:-1:-1;;;;;1935:22:0;1959:2;1923:11;:39::i;1037:580::-;1093:13;1165:5;1174:1;1165:10;1161:53;;-1:-1:-1;;1192:10:0;;;;;;;;;;;;-1:-1:-1;;;1192:10:0;;;;;1037:580::o;1161:53::-;1241:5;1226:12;1282:78;1289:9;;1282:78;;1315:8;;;;:::i;:::-;;-1:-1:-1;1338:10:0;;-1:-1:-1;1346:2:0;1338:10;;:::i;:::-;;;1282:78;;;1372:19;1404:6;1394:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1394:17:0;;1372:39;;1422:154;1429:10;;1422:154;;1456:11;1466:1;1456:11;;:::i;:::-;;-1:-1:-1;1525:10:0;1533:2;1525:5;:10;:::i;:::-;1512:24;;:2;:24;:::i;:::-;1499:39;;1482:6;1489;1482:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1482:56:0;;;;;;;;-1:-1:-1;1553:11:0;1562:2;1553:11;;:::i;:::-;;;1422:154;;;1602:6;1037:580;-1:-1:-1;;;;1037:580:0:o;2295:483::-;2370:13;2396:19;2428:10;2432:6;2428:1;:10;:::i;:::-;:14;;2441:1;2428:14;:::i;:::-;2418:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2418:25:0;;2396:47;;-1:-1:-1;;;2454:6:0;2461:1;2454:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;2454:15:0;;;;;;;;;-1:-1:-1;;;2480:6:0;2487:1;2480:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;2480:15:0;;;;;;;;-1:-1:-1;2511:9:0;2523:10;2527:6;2523:1;:10;:::i;:::-;:14;;2536:1;2523:14;:::i;:::-;2511:26;;2506:167;2543:1;2539;:5;2506:167;;;2623:1;2610:10;2618:2;2610:5;:10;:::i;:::-;:14;:22;;2631:1;2610:22;;;2627:1;2610:22;2591:42;;2596:10;2604:2;2596:5;:10;:::i;:::-;2591:15;;:2;:15;:::i;:::-;:42;;;;:::i;:::-;2578:57;;2566:6;2573:1;2566:9;;;;;;;;:::i;:::-;;;;:69;-1:-1:-1;;;;;2566:69:0;;;;;;;;-1:-1:-1;2650:11:0;2659:2;2650:11;;:::i;:::-;;-1:-1:-1;2546:3:0;;;:::i;:::-;;;2506:167;;;-1:-1:-1;2691:10:0;;2683:55;;;;-1:-1:-1;;;2683:55:0;;21872:2:1;2683:55:0;;;21854:21:1;;;21891:18;;;21884:30;21950:34;21930:18;;;21923:62;22002:18;;2683:55:0;21670:356:1;2683:55:0;2763:6;2295:483;-1:-1:-1;;;2295:483:0:o;14:592:1:-;85:6;93;146:2;134:9;125:7;121:23;117:32;114:52;;;162:1;159;152:12;114:52;202:9;189:23;231:18;272:2;264:6;261:14;258:34;;;288:1;285;278:12;258:34;326:6;315:9;311:22;301:32;;371:7;364:4;360:2;356:13;352:27;342:55;;393:1;390;383:12;342:55;433:2;420:16;459:2;451:6;448:14;445:34;;;475:1;472;465:12;445:34;520:7;515:2;506:6;502:2;498:15;494:24;491:37;488:57;;;541:1;538;531:12;488:57;572:2;564:11;;;;;594:6;;-1:-1:-1;14:592:1;;-1:-1:-1;;;;14:592:1:o;611:173::-;679:20;;-1:-1:-1;;;;;728:31:1;;718:42;;708:70;;774:1;771;764:12;708:70;611:173;;;:::o;789:254::-;857:6;865;918:2;906:9;897:7;893:23;889:32;886:52;;;934:1;931;924:12;886:52;957:29;976:9;957:29;:::i;:::-;947:39;1033:2;1018:18;;;;1005:32;;-1:-1:-1;;;789:254:1:o;1048:250::-;1133:1;1143:113;1157:6;1154:1;1151:13;1143:113;;;1233:11;;;1227:18;1214:11;;;1207:39;1179:2;1172:10;1143:113;;;-1:-1:-1;;1290:1:1;1272:16;;1265:27;1048:250::o;1303:271::-;1345:3;1383:5;1377:12;1410:6;1405:3;1398:19;1426:76;1495:6;1488:4;1483:3;1479:14;1472:4;1465:5;1461:16;1426:76;:::i;:::-;1556:2;1535:15;-1:-1:-1;;1531:29:1;1522:39;;;;1563:4;1518:50;;1303:271;-1:-1:-1;;1303:271:1:o;1579:220::-;1728:2;1717:9;1710:21;1691:4;1748:45;1789:2;1778:9;1774:18;1766:6;1748:45;:::i;1804:186::-;1863:6;1916:2;1904:9;1895:7;1891:23;1887:32;1884:52;;;1932:1;1929;1922:12;1884:52;1955:29;1974:9;1955:29;:::i;1995:328::-;2072:6;2080;2088;2141:2;2129:9;2120:7;2116:23;2112:32;2109:52;;;2157:1;2154;2147:12;2109:52;2180:29;2199:9;2180:29;:::i;:::-;2170:39;;2256:2;2245:9;2241:18;2228:32;2218:42;;2279:38;2313:2;2302:9;2298:18;2279:38;:::i;:::-;2269:48;;1995:328;;;;;:::o;2510:260::-;2578:6;2586;2639:2;2627:9;2618:7;2614:23;2610:32;2607:52;;;2655:1;2652;2645:12;2607:52;2678:29;2697:9;2678:29;:::i;:::-;2668:39;;2726:38;2760:2;2749:9;2745:18;2726:38;:::i;:::-;2716:48;;2510:260;;;;;:::o;2775:291::-;2952:6;2941:9;2934:25;2995:2;2990;2979:9;2975:18;2968:30;2915:4;3015:45;3056:2;3045:9;3041:18;3033:6;3015:45;:::i;3471:352::-;3673:2;3655:21;;;3712:2;3692:18;;;3685:30;3751;3746:2;3731:18;;3724:58;3814:2;3799:18;;3471:352::o;3828:342::-;4030:2;4012:21;;;4069:2;4049:18;;;4042:30;-1:-1:-1;;;4103:2:1;4088:18;;4081:48;4161:2;4146:18;;3828:342::o;4175:380::-;4254:1;4250:12;;;;4297;;;4318:61;;4372:4;4364:6;4360:17;4350:27;;4318:61;4425:2;4417:6;4414:14;4394:18;4391:38;4388:161;;4471:10;4466:3;4462:20;4459:1;4452:31;4506:4;4503:1;4496:15;4534:4;4531:1;4524:15;4388:161;;4175:380;;;:::o;4689:845::-;4819:3;4848:1;4881:6;4875:13;4911:36;4937:9;4911:36;:::i;:::-;4966:1;4983:17;;;5009:133;;;;5156:1;5151:358;;;;4976:533;;5009:133;-1:-1:-1;;5042:24:1;;5030:37;;5115:14;;5108:22;5096:35;;5087:45;;;-1:-1:-1;5009:133:1;;5151:358;5182:6;5179:1;5172:17;5212:4;5257;5254:1;5244:18;5284:1;5298:165;5312:6;5309:1;5306:13;5298:165;;;5390:14;;5377:11;;;5370:35;5433:16;;;;5327:10;;5298:165;;;5302:3;;;5492:6;5487:3;5483:16;5476:23;;4976:533;-1:-1:-1;5525:3:1;;4689:845;-1:-1:-1;;;;;;4689:845:1:o;5539:271::-;5722:6;5714;5709:3;5696:33;5678:3;5748:16;;5773:13;;;5748:16;5539:271;-1:-1:-1;5539:271:1:o;6232:127::-;6293:10;6288:3;6284:20;6281:1;6274:31;6324:4;6321:1;6314:15;6348:4;6345:1;6338:15;6364:518;6466:2;6461:3;6458:11;6455:421;;;6502:5;6499:1;6492:16;6546:4;6543:1;6533:18;6616:2;6604:10;6600:19;6597:1;6593:27;6587:4;6583:38;6652:4;6640:10;6637:20;6634:47;;;-1:-1:-1;6675:4:1;6634:47;6730:2;6725:3;6721:12;6718:1;6714:20;6708:4;6704:31;6694:41;;6785:81;6803:2;6796:5;6793:13;6785:81;;;6862:1;6848:16;;6829:1;6818:13;6785:81;;;6789:3;;6364:518;;;:::o;7058:1201::-;7182:18;7177:3;7174:27;7171:53;;;7204:18;;:::i;:::-;7233:94;7323:3;7283:38;7315:4;7309:11;7283:38;:::i;:::-;7277:4;7233:94;:::i;:::-;7353:1;7378:2;7373:3;7370:11;7395:1;7390:611;;;;8045:1;8062:3;8059:93;;;-1:-1:-1;8118:19:1;;;8105:33;8059:93;-1:-1:-1;;7015:1:1;7011:11;;;7007:24;7003:29;6993:40;7039:1;7035:11;;;6990:57;8165:78;;7363:890;;7390:611;4636:1;4629:14;;;4673:4;4660:18;;-1:-1:-1;;7426:17:1;;;7544:229;7558:7;7555:1;7552:14;7544:229;;;7647:19;;;7634:33;7619:49;;7754:4;7739:20;;;;7707:1;7695:14;;;;7574:12;7544:229;;;7548:3;7801;7792:7;7789:16;7786:159;;;7925:1;7921:6;7915:3;7909;7906:1;7902:11;7898:21;7894:34;7890:39;7877:9;7872:3;7868:19;7855:33;7851:79;7843:6;7836:95;7786:159;;;7988:1;7982:3;7979:1;7975:11;7971:19;7965:4;7958:33;7363:890;;7058:1201;;;:::o;8736:2049::-;-1:-1:-1;;;9844:3:1;9837:22;9819:3;9888:6;9882:13;9904:74;9971:6;9967:1;9962:3;9958:11;9951:4;9943:6;9939:17;9904:74;:::i;:::-;-1:-1:-1;;;10067:1:1;9997:16;;;10059:10;;;10052:22;;;-1:-1:-1;;;10098:1:1;10090:10;;10083:32;10140:13;;10162:76;10140:13;10224:2;10216:11;;10209:4;10197:17;;10162:76;:::i;:::-;10298:2;10257:17;;10290:11;;;10283:23;;;-1:-1:-1;;;10330:2:1;10322:11;;10315:34;10374:13;;10396:76;10374:13;10458:2;10450:11;;10443:4;10431:17;;10396:76;:::i;:::-;10532:2;10491:17;;10524:11;;;10517:23;-1:-1:-1;;;10564:2:1;10556:11;;10549:34;10608:13;;10630:76;10608:13;10692:2;10684:11;;10677:4;10665:17;;10630:76;:::i;:::-;10722:57;10775:2;10764:8;10760:2;10756:17;10752:26;-1:-1:-1;;;8674:24:1;;8723:1;8714:11;;8609:122;10722:57;10715:64;8736:2049;-1:-1:-1;;;;;;;;8736:2049:1:o;11546:404::-;11748:2;11730:21;;;11787:2;11767:18;;;11760:30;11826:34;11821:2;11806:18;;11799:62;-1:-1:-1;;;11892:2:1;11877:18;;11870:38;11940:3;11925:19;;11546:404::o;11955:347::-;12157:2;12139:21;;;12196:2;12176:18;;;12169:30;12235:25;12230:2;12215:18;;12208:53;12293:2;12278:18;;11955:347::o;12307:354::-;12509:2;12491:21;;;12548:2;12528:18;;;12521:30;12587:32;12582:2;12567:18;;12560:60;12652:2;12637:18;;12307:354::o;13824:127::-;13885:10;13880:3;13876:20;13873:1;13866:31;13916:4;13913:1;13906:15;13940:4;13937:1;13930:15;13956:128;14023:9;;;14044:11;;;14041:37;;;14058:18;;:::i;14089:125::-;14154:9;;;14175:10;;;14172:36;;;14188:18;;:::i;14671:184::-;14741:6;14794:2;14782:9;14773:7;14769:23;14765:32;14762:52;;;14810:1;14807;14800:12;14762:52;-1:-1:-1;14833:16:1;;14671:184;-1:-1:-1;14671:184:1:o;15595:277::-;15662:6;15715:2;15703:9;15694:7;15690:23;15686:32;15683:52;;;15731:1;15728;15721:12;15683:52;15763:9;15757:16;15816:5;15809:13;15802:21;15795:5;15792:32;15782:60;;15838:1;15835;15828:12;16227:135;16266:3;16287:17;;;16284:43;;16307:18;;:::i;:::-;-1:-1:-1;16354:1:1;16343:13;;16227:135::o;16717:1156::-;17247:3;17285:6;17279:13;17301:66;17360:6;17355:3;17348:4;17340:6;17336:17;17301:66;:::i;:::-;-1:-1:-1;;;17389:16:1;;;17414:21;;;17460:13;;17482:78;17460:13;17547:1;17536:13;;17529:4;17517:17;;17482:78;:::i;:::-;-1:-1:-1;;;17623:1:1;17579:20;;;;17615:10;;;17608:32;17665:13;;17687:76;17665:13;17749:2;17741:11;;17734:4;17722:17;;17687:76;:::i;:::-;-1:-1:-1;;;17823:2:1;17782:17;;;;17815:11;;;17808:32;17864:2;17856:11;;16717:1156;-1:-1:-1;;;;;16717:1156:1:o;19683:1162::-;20213:3;20251:6;20245:13;20267:66;20326:6;20321:3;20314:4;20306:6;20302:17;20267:66;:::i;:::-;-1:-1:-1;;;20355:16:1;;;20380:26;;;20431:13;;20453:78;20431:13;20518:1;20507:13;;20500:4;20488:17;;20453:78;:::i;:::-;-1:-1:-1;;;20594:1:1;20550:20;;;;20586:10;;;20579:33;20637:13;;20659:76;20637:13;20721:2;20713:11;;20706:4;20694:17;;20659:76;:::i;:::-;-1:-1:-1;;;20795:2:1;20754:17;;;;20787:11;;;20780:32;20836:2;20828:11;;19683:1162;-1:-1:-1;;;;;19683:1162:1:o;20850:127::-;20911:10;20906:3;20902:20;20899:1;20892:31;20942:4;20939:1;20932:15;20966:4;20963:1;20956:15;20982:120;21022:1;21048;21038:35;;21053:18;;:::i;:::-;-1:-1:-1;21087:9:1;;20982:120::o;21107:112::-;21139:1;21165;21155:35;;21170:18;;:::i;:::-;-1:-1:-1;21204:9:1;;21107:112::o;21224:127::-;21285:10;21280:3;21276:20;21273:1;21266:31;21316:4;21313:1;21306:15;21340:4;21337:1;21330:15;21356:168;21429:9;;;21460;;21477:15;;;21471:22;;21457:37;21447:71;;21498:18;;:::i;21529:136::-;21568:3;21596:5;21586:39;;21605:18;;:::i;:::-;-1:-1:-1;;;21641:18:1;;21529:136::o
Swarm Source
ipfs://2d459e6bec0e553ce6e09242a6d8738b83b146404d3b9abf2707cfd3384a7a6f
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 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.