ETH Price: $3,003.23 (+4.08%)
Gas: 10 Gwei

Token

pSTAKE Finance (PSTAKE)
 

Overview

Max Total Supply

500,000,000 PSTAKE

Holders

14,547 (0.00%)

Market

Price

$0.08 @ 0.000028 ETH (+12.46%)

Onchain Market Cap

$42,272,000.00

Circulating Supply Market Cap

$38,693,019.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000006310399096 PSTAKE

Value
$0.00 ( ~0 Eth) [0.0000%]
0x8f053c16bec4f980c3d94d38f815d5b9346e67b0
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

pSTAKE is a liquid staking protocol unlocking the liquidity of staked assets. Stakers of PoS tokens can stake their assets while maintaining the liquidity of these assets. Users earn staking rewards + receive 1:1 pegged staked representative tokens which can be used to generate additional yield.

Market

Volume (24H):$1,609,730.00
Market Capitalization:$38,693,019.00
Circulating Supply:464,444,448.00 PSTAKE
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
pStake

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license
File 1 of 10 : Orchestrator.sol
/*
 Copyright [2019] - [2021], PERSISTENCE TECHNOLOGIES PTE. LTD. and the ERC20 contributors
 SPDX-License-Identifier: Apache-2.0
*/

pragma solidity 0.8.4;

import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { pStake } from "./pStake.sol";
import { StepVesting } from "./StepVesting.sol";

contract Orchestrator is Ownable {

    struct VestingInfo {
        address beneficiary;
        uint64 cliffTime;
        uint256 stepAmount;
        uint256 cliffAmount;
        uint64 stepDuration;
        uint256 numOfSteps;
    }

    VestingInfo[] vestingInfos;

    address public mainOwner;

    address public immutable vestingImplementation;

    pStake public immutable token;

    mapping(address => address) public vestingMapping;

    constructor(VestingInfo[] memory _vestingInfos, address _mainOwner) {
        mainOwner = _mainOwner;
        
        for(uint i = 0; i<_vestingInfos.length; i++){
            VestingInfo memory vestingInfo = _vestingInfos[i];
            vestingInfos.push(vestingInfo);
        }

        StepVesting stepVesting = new StepVesting();
        vestingImplementation = address(stepVesting);
        token = new pStake(address(this), mainOwner);
    }


    function mintAndTransferTokens() external onlyOwner returns (address[] memory vestings) {

        vestings = new address[](vestingInfos.length);
        for(uint i = 0; i<vestingInfos.length; i++){
            VestingInfo memory vestingInfo = vestingInfos[i];
            address vesting = deploy();
            StepVesting(vesting).initialize(
                token, 
                vestingInfo.cliffTime, 
                vestingInfo.stepDuration, 
                vestingInfo.cliffAmount, 
                vestingInfo.stepAmount, 
                vestingInfo.numOfSteps, 
                vestingInfo.beneficiary);
            token.transfer(vesting, vestingInfo.cliffAmount + vestingInfo.stepAmount*vestingInfo.numOfSteps);
            vestings[i] = vesting;
            vestingMapping[vestingInfo.beneficiary] = vesting;
        }

    }

    function getAmountToMint() public view returns (uint256 amount) {
        for(uint i=0; i<vestingInfos.length; i++){
            VestingInfo memory vestingInfo = vestingInfos[i];
            amount += (vestingInfo.cliffAmount + vestingInfo.stepAmount*vestingInfo.numOfSteps);
        }
    }

    function deploy() internal returns (address cloneAddress) {
        bytes20 targetBytes = bytes20(vestingImplementation); // Takes the first 20 bytes of the masterContract's address
        assembly {
            let clone := mload(0x40)
            mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(clone, 0x14), targetBytes)
            mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            cloneAddress := create(0, clone, 0x37)
        }

    }

}

File 2 of 10 : Ownable.sol
// 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);
    }
}

File 3 of 10 : pStake.sol
/*
 Copyright [2019] - [2021], PERSISTENCE TECHNOLOGIES PTE. LTD. and the ERC20 contributors
 SPDX-License-Identifier: Apache-2.0
*/

pragma solidity 0.8.4;

// Forked from Uniswap's UNI
// Reference: https://etherscan.io/address/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984#code

import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IPstake is IERC20 {
    function delegate(address delegatee) external;
}

contract pStake is IPstake {
    /// @notice EIP-20 token name for this token
    // solhint-disable-next-line const-name-snakecase
    string public constant name = "pSTAKE Finance";

    /// @notice EIP-20 token symbol for this token
    // solhint-disable-next-line const-name-snakecase
    string public constant symbol = "PSTAKE";

    /// @notice EIP-20 token decimals for this token
    // solhint-disable-next-line const-name-snakecase
    uint8 public constant decimals = 18;

    /// @notice Total number of tokens in circulation
    // solhint-disable-next-line const-name-snakecase
    uint public override totalSupply = 500_000_000e18; // 500 million pStake

    /// @notice Address which may mint new tokens
    address public minter;

    /// @notice Allowance amounts on behalf of others
    mapping (address => mapping (address => uint96)) internal allowances;

    /// @notice Official record of token balances for each account
    mapping (address => uint96) internal balances;

    /// @notice A record of each accounts delegate
    mapping (address => address) public delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint96 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    /// @notice An event thats emitted when the minter address is changed
    event MinterChanged(address minter, address newMinter);

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    /**
     * @notice Construct a new pStake token
     * @param account The initial account to grant all the tokens
     * @param minter_ The account with minting ability
     */
    constructor(address account, address minter_) {
        balances[account] = uint96(totalSupply);
        emit Transfer(address(0), account, totalSupply);
        minter = minter_;
        emit MinterChanged(address(0), minter);
    }

    /**
     * @notice Change the minter address
     * @param minter_ The address of the new minter
     */
    function setMinter(address minter_) external {
        require(msg.sender == minter, "pStake: only the minter can change the minter address");
        emit MinterChanged(minter, minter_);
        minter = minter_;
    }

    /**
     * @notice Mint new tokens
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to be minted
     */
    function mint(address dst, uint rawAmount) external {
        require(msg.sender == minter, "pStake: only the minter can mint");
        require(dst != address(0), "pStake: cannot transfer to the zero address");

        // mint the amount
        uint96 amount = safe96(rawAmount, "pStake: amount exceeds 96 bits");
        uint96 safeSupply = safe96(totalSupply, "pStake: totalSupply exceeds 96 bits");
        totalSupply = add96(safeSupply, amount, "pStake: totalSupply exceeds 96 bits");

        // transfer the amount to the recipient
        balances[dst] = add96(balances[dst], amount, "pStake: transfer amount overflows");
        emit Transfer(address(0), dst, amount);

        // move delegates
        _moveDelegates(address(0), delegates[dst], amount);
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external override view returns (uint) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint rawAmount) external override returns (bool) {
        uint96 amount;
        if (rawAmount == type(uint).max) {
            amount = type(uint96).max;
        } else {
            amount = safe96(rawAmount, "pStake: amount exceeds 96 bits");
        }

        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function permit(address owner, address spender, uint rawAmount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        uint96 amount;
        if (rawAmount == type(uint).max) {
            amount = type(uint96).max;
        } else {
            amount = safe96(rawAmount, "pStake: amount exceeds 96 bits");
        }

        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this)));
        bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, rawAmount, nonces[owner]++, deadline));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "pStake: invalid signature");
        require(signatory == owner, "pStake: unauthorized");
        require(block.timestamp <= deadline, "pStake: signature expired");

        allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external override view returns (uint) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint rawAmount) external override returns (bool) {
        uint96 amount = safe96(rawAmount, "pStake: amount exceeds 96 bits");
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint rawAmount) external override returns (bool) {
        address spender = msg.sender;
        uint96 spenderAllowance = allowances[src][spender];
        uint96 amount = safe96(rawAmount, "pStake: amount exceeds 96 bits");

        if (spender != src && spenderAllowance != type(uint96).max) {
            uint96 newAllowance = sub96(spenderAllowance, amount, "pStake: transfer amount exceeds spender allowance");
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public override {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) public {
        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this)));
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "pStake: invalid signature");
        require(nonce == nonces[signatory]++, "pStake: invalid nonce");
        require(block.timestamp <= expiry, "pStake: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint96) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber) public view returns (uint96) {
        require(blockNumber < block.number, "pStake: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint96 delegatorBalance = balances[delegator];
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _transferTokens(address src, address dst, uint96 amount) internal {
        require(src != address(0), "pStake: cannot transfer from the zero address");
        require(dst != address(0), "pStake: cannot transfer to the zero address");

        balances[src] = sub96(balances[src], amount, "pStake: transfer amount exceeds balance");
        balances[dst] = add96(balances[dst], amount, "pStake: transfer amount overflows");
        emit Transfer(src, dst, amount);

        _moveDelegates(delegates[src], delegates[dst], amount);
    }

    function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint96 srcRepNew = sub96(srcRepOld, amount, "pStake: vote amount underflows");
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint96 dstRepNew = add96(dstRepOld, amount, "pStake: vote amount overflows");
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal {
      uint32 blockNumber = safe32(block.number, "pStake: block number exceeds 32 bits");

      if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
          checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
      } else {
          checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
          numCheckpoints[delegatee] = nCheckpoints + 1;
      }

      emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function safe96(uint n, string memory errorMessage) internal pure returns (uint96) {
        require(n < 2**96, errorMessage);
        return uint96(n);
    }

    function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
        uint96 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function getChainId() internal view returns (uint) {
        uint256 chainId;
        // solhint-disable-next-line no-inline-assembly
        assembly { chainId := chainid() }
        return chainId;
    }
}

File 4 of 10 : StepVesting.sol
/*
 Copyright [2019] - [2021], PERSISTENCE TECHNOLOGIES PTE. LTD. and the ERC20 contributors
 SPDX-License-Identifier: Apache-2.0
*/

pragma solidity 0.8.4;

import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import { Math } from "@openzeppelin/contracts/utils/math/Math.sol";
import { IPstake } from "./pStake.sol";

contract StepVesting is Initializable{

    using SafeERC20 for IPstake;

    event ReceiverChanged(address oldWallet, address newWallet);

    IPstake public token;
    uint64 public cliffTime;
    uint64 public stepDuration;
    uint256 public cliffAmount;
    uint256 public stepAmount;
    uint256 public numOfSteps;

    address public receiver;
    uint256 public claimed;

    modifier onlyReceiver {
        require(msg.sender == receiver, "access denied");
        _;
    }


    function initialize(
        IPstake _token,
        uint64 _cliffTime,
        uint64 _stepDuration,
        uint256 _cliffAmount,
        uint256 _stepAmount,
        uint256 _numOfSteps,
        address _receiver
    ) external initializer {
        require(
            address(_token) != address(0) && _receiver != address(0),
            "zero address not allowed"
        );

        require(_stepDuration != 0, "step duration can't be zero");

        token = _token;
        cliffTime = _cliffTime;
        stepDuration = _stepDuration;
        cliffAmount = _cliffAmount;
        stepAmount = _stepAmount;
        numOfSteps = _numOfSteps;
        receiver = _receiver;
        emit ReceiverChanged(address(0), _receiver);
    }

    function available() public view returns (uint256) {
        return claimable() - claimed;
    }

    function claimable() public view returns (uint256) {
        if (block.timestamp < cliffTime) {
            return 0;
        }

        uint256 passedSinceCliff = block.timestamp - cliffTime;
        uint256 stepsPassed = Math.min(
            numOfSteps,
            passedSinceCliff/stepDuration
        );
        return cliffAmount + (stepsPassed * stepAmount);
    }

    function setReceiver(address _receiver) public onlyReceiver {
        require(_receiver != address(0), "zero address not allowed");
        emit ReceiverChanged(receiver, _receiver);
        receiver = _receiver;
    }

    function claim() external onlyReceiver {
        uint256 amount = available();
        claimed = claimed + amount;
        token.safeTransfer(msg.sender, amount);
    }

    function delegate(address delegatee) external onlyReceiver {
        require(delegatee != address(0), "zero address not allowed");
        token.delegate(delegatee);
    }

}

File 5 of 10 : Context.sol
// 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;
    }
}

File 6 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 7 of 10 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 8 of 10 : Initializable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)

pragma solidity ^0.8.0;

import "../../utils/Address.sol";

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
 * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() initializer {}
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        // If the contract is initializing we ignore whether _initialized is set in order to support multiple
        // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
        // contract may have been reentered.
        require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} modifier, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    function _isConstructor() private view returns (bool) {
        return !Address.isContract(address(this));
    }
}

File 9 of 10 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

File 10 of 10 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"minter_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"address","name":"newMinter","type":"address"}],"name":"MinterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526b019d971e4fe8401e740000006000553480156200002157600080fd5b5060405162003d3038038062003d308339818101604052810190620000479190620001df565b600054600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000546040516200011991906200026f565b60405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3b0007eb941cf645526cbb3a4fdaecda9d28ce4843167d9263b536a1f1edc0f66000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051620001b892919062000242565b60405180910390a15050620002e4565b600081519050620001d981620002ca565b92915050565b60008060408385031215620001f357600080fd5b60006200020385828601620001c8565b92505060206200021685828601620001c8565b9150509250929050565b6200022b816200028c565b82525050565b6200023c81620002c0565b82525050565b600060408201905062000259600083018562000220565b62000268602083018462000220565b9392505050565b600060208201905062000286600083018462000231565b92915050565b60006200029982620002a0565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b620002d5816200028c565b8114620002e157600080fd5b50565b613a3c80620002f46000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806370a08231116100c3578063c3cda5201161007c578063c3cda52014610417578063d505accf14610433578063dd62ed3e1461044f578063e7a324dc1461047f578063f1127ed81461049d578063fca3b5aa146104ce57610158565b806370a0823114610309578063782d6fe1146103395780637ecebe001461036957806395d89b4114610399578063a9059cbb146103b7578063b4b5ea57146103e757610158565b806330adf81f1161011557806330adf81f14610235578063313ce5671461025357806340c10f1914610271578063587cde1e1461028d5780635c19a95c146102bd5780636fcfff45146102d957610158565b806306fdde031461015d578063075461721461017b578063095ea7b31461019957806318160ddd146101c957806320606b70146101e757806323b872dd14610205575b600080fd5b6101656104ea565b60405161017291906131e2565b60405180910390f35b610183610523565b6040516101909190613038565b60405180910390f35b6101b360048036038101906101ae9190612cda565b610549565b6040516101c0919061307c565b60405180910390f35b6101d16106e5565b6040516101de9190613324565b60405180910390f35b6101ef6106eb565b6040516101fc9190613097565b60405180910390f35b61021f600480360381019061021a9190612bed565b61070f565b60405161022c919061307c565b60405180910390f35b61023d6109a0565b60405161024a9190613097565b60405180910390f35b61025b6109c4565b6040516102689190613383565b60405180910390f35b61028b60048036038101906102869190612cda565b6109c9565b005b6102a760048036038101906102a29190612b88565b610d29565b6040516102b49190613038565b60405180910390f35b6102d760048036038101906102d29190612b88565b610d5c565b005b6102f360048036038101906102ee9190612b88565b610d69565b604051610300919061333f565b60405180910390f35b610323600480360381019061031e9190612b88565b610d8c565b6040516103309190613324565b60405180910390f35b610353600480360381019061034e9190612cda565b610dfb565b60405161036091906133b9565b60405180910390f35b610383600480360381019061037e9190612b88565b611236565b6040516103909190613324565b60405180910390f35b6103a161124e565b6040516103ae91906131e2565b60405180910390f35b6103d160048036038101906103cc9190612cda565b611287565b6040516103de919061307c565b60405180910390f35b61040160048036038101906103fc9190612b88565b6112e1565b60405161040e91906133b9565b60405180910390f35b610431600480360381019061042c9190612d16565b6113d8565b005b61044d60048036038101906104489190612c3c565b61169b565b005b61046960048036038101906104649190612bb1565b611b16565b6040516104769190613324565b60405180910390f35b610487611bc3565b6040516104949190613097565b60405180910390f35b6104b760048036038101906104b29190612d9f565b611be7565b6040516104c592919061335a565b60405180910390f35b6104e860048036038101906104e39190612b88565b611c40565b005b6040518060400160405280600e81526020017f705354414b452046696e616e636500000000000000000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831415610588576bffffffffffffffffffffffff90506105ca565b6105c7836040518060400160405280601e81526020017f705374616b653a20616d6f756e74206578636565647320393620626974730000815250611d6f565b90505b80600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516106d2919061339e565b60405180910390a3600191505092915050565b60005481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000803390506000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff16905060006107ef856040518060400160405280601e81526020017f705374616b653a20616d6f756e74206578636565647320393620626974730000815250611d6f565b90508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561084957506bffffffffffffffffffffffff8016826bffffffffffffffffffffffff1614155b1561098757600061087383836040518060600160405280603181526020016139b260319139611dcd565b905080600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161097d919061339e565b60405180910390a3505b610992878783611e47565b600193505050509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a50906132a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac090613264565b60405180910390fd5b6000610b0a826040518060400160405280601e81526020017f705374616b653a20616d6f756e74206578636565647320393620626974730000815250611d6f565b90506000610b3260005460405180606001604052806023815260200161398f60239139611d6f565b9050610b57818360405180606001604052806023815260200161398f60239139612228565b6bffffffffffffffffffffffff16600081905550610be5600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff168360405180606001604052806021815260200161396e60219139612228565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb0919061339e565b60405180910390a3610d236000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846122a7565b50505050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d6633826125ee565b50565b60066020528060005260406000206000915054906101000a900463ffffffff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff169050919050565b6000438210610e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3690613224565b60405180910390fd5b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610eac576000915050611230565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610efb91906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610fc057600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610f8291906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff16915050611230565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115611041576000915050611230565b60008060018361105191906134d1565b90505b8163ffffffff168163ffffffff1611156111b25760006002838361107891906134d1565b61108291906134a0565b8261108d91906134d1565b90506000600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905086816000015163ffffffff16141561118157806020015195505050505050611230565b86816000015163ffffffff16101561119b578193506111ab565b6001826111a891906134d1565b92505b5050611054565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff1693505050505b92915050565b60076020528060005260406000206000915090505481565b6040518060400160405280600681526020017f505354414b45000000000000000000000000000000000000000000000000000081525081565b6000806112c9836040518060400160405280601e81526020017f705374616b653a20616d6f756e74206578636565647320393620626974730000815250611d6f565b90506112d6338583611e47565b600191505092915050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161161134b5760006113d0565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018361139991906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600e81526020017f705354414b452046696e616e6365000000000000000000000000000000000000815250805190602001206114406127ae565b306040516020016114549493929190613158565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8888886040516020016114a59493929190613113565b604051602081830303815290604052805190602001209050600082826040516020016114d2929190613001565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161150f949392919061319d565b6020604051602081039080840390855afa158015611531573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a4906132e4565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906115fd90613605565b919050558914611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990613244565b60405180910390fd5b87421115611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90613304565b60405180910390fd5b61168f818b6125ee565b50505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8614156116d9576bffffffffffffffffffffffff905061171b565b611718866040518060400160405280601e81526020017f705374616b653a20616d6f756e74206578636565647320393620626974730000815250611d6f565b90505b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600e81526020017f705354414b452046696e616e6365000000000000000000000000000000000000815250805190602001206117836127ae565b306040516020016117979493929190613158565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600760008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061182590613605565b919050558b60405160200161183f969594939291906130b2565b6040516020818303038152906040528051906020012090506000828260405160200161186c929190613001565b6040516020818303038152906040528051906020012090506000600182898989604051600081526020016040526040516118a9949392919061319d565b6020604051602081039080840390855afa1580156118cb573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193e906132e4565b60405180910390fd5b8b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ac906132c4565b60405180910390fd5b884211156119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90613304565b60405180910390fd5b84600260008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611b00919061339e565b60405180910390a3505050505050505050505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6005602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060000160049054906101000a90046bffffffffffffffffffffffff16905082565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790613204565b60405180910390fd5b7f3b0007eb941cf645526cbb3a4fdaecda9d28ce4843167d9263b536a1f1edc0f6600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051611d23929190613053565b60405180910390a180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006c0100000000000000000000000083108290611dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dba91906131e2565b60405180910390fd5b5082905092915050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff1611158290611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2891906131e2565b60405180910390fd5b508284611e3e9190613505565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae90613284565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e90613264565b60405180910390fd5b611fa1600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff168260405180606001604052806027815260200161394760279139611dcd565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550612088600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff168260405180606001604052806021815260200161396e60219139612228565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612152919061339e565b60405180910390a3612223600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836122a7565b505050565b6000808385612237919061345e565b9050846bffffffffffffffffffffffff16816bffffffffffffffffffffffff161015839061229b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229291906131e2565b60405180910390fd5b50809150509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156122f157506000816bffffffffffffffffffffffff16115b156125e957600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461246f576000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611612394576000612419565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846123e291906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b9050600061245d82856040518060400160405280601e81526020017f705374616b653a20766f746520616d6f756e7420756e646572666c6f77730000815250611dcd565b905061246b868484846127bb565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125e8576000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161250d576000612592565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461255b91906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b905060006125d682856040518060400160405280601d81526020017f705374616b653a20766f746520616d6f756e74206f766572666c6f7773000000815250612228565b90506125e4858484846127bb565b5050505b5b505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff16905082600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46127a88284836122a7565b50505050565b6000804690508091505090565b60006127df436040518060600160405280602481526020016139e360249139612ac9565b905060008463ffffffff1611801561287d57508063ffffffff16600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018761284791906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156129215781600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876128d191906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160046101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550612a72565b60405180604001604052808263ffffffff168152602001836bffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050600184612a149190613424565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051612aba9291906133d4565b60405180910390a25050505050565b600064010000000083108290612b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0c91906131e2565b60405180910390fd5b5082905092915050565b600081359050612b2e816138d3565b92915050565b600081359050612b43816138ea565b92915050565b600081359050612b5881613901565b92915050565b600081359050612b6d81613918565b92915050565b600081359050612b828161392f565b92915050565b600060208284031215612b9a57600080fd5b6000612ba884828501612b1f565b91505092915050565b60008060408385031215612bc457600080fd5b6000612bd285828601612b1f565b9250506020612be385828601612b1f565b9150509250929050565b600080600060608486031215612c0257600080fd5b6000612c1086828701612b1f565b9350506020612c2186828701612b1f565b9250506040612c3286828701612b49565b9150509250925092565b600080600080600080600060e0888a031215612c5757600080fd5b6000612c658a828b01612b1f565b9750506020612c768a828b01612b1f565b9650506040612c878a828b01612b49565b9550506060612c988a828b01612b49565b9450506080612ca98a828b01612b73565b93505060a0612cba8a828b01612b34565b92505060c0612ccb8a828b01612b34565b91505092959891949750929550565b60008060408385031215612ced57600080fd5b6000612cfb85828601612b1f565b9250506020612d0c85828601612b49565b9150509250929050565b60008060008060008060c08789031215612d2f57600080fd5b6000612d3d89828a01612b1f565b9650506020612d4e89828a01612b49565b9550506040612d5f89828a01612b49565b9450506060612d7089828a01612b73565b9350506080612d8189828a01612b34565b92505060a0612d9289828a01612b34565b9150509295509295509295565b60008060408385031215612db257600080fd5b6000612dc085828601612b1f565b9250506020612dd185828601612b5e565b9150509250929050565b612de481613539565b82525050565b612df38161354b565b82525050565b612e0281613557565b82525050565b612e19612e1482613557565b61364e565b82525050565b6000612e2a826133fd565b612e348185613408565b9350612e448185602086016135d2565b612e4d816136b6565b840191505092915050565b6000612e65603583613408565b9150612e70826136c7565b604082019050919050565b6000612e88601a83613408565b9150612e9382613716565b602082019050919050565b6000612eab600283613419565b9150612eb68261373f565b600282019050919050565b6000612ece601583613408565b9150612ed982613768565b602082019050919050565b6000612ef1602b83613408565b9150612efc82613791565b604082019050919050565b6000612f14602d83613408565b9150612f1f826137e0565b604082019050919050565b6000612f37602083613408565b9150612f428261382f565b602082019050919050565b6000612f5a601483613408565b9150612f6582613858565b602082019050919050565b6000612f7d601983613408565b9150612f8882613881565b602082019050919050565b6000612fa0601983613408565b9150612fab826138aa565b602082019050919050565b612fbf81613581565b82525050565b612fce8161358b565b82525050565b612fdd8161359b565b82525050565b612fec816135c0565b82525050565b612ffb816135a8565b82525050565b600061300c82612e9e565b91506130188285612e08565b6020820191506130288284612e08565b6020820191508190509392505050565b600060208201905061304d6000830184612ddb565b92915050565b60006040820190506130686000830185612ddb565b6130756020830184612ddb565b9392505050565b60006020820190506130916000830184612dea565b92915050565b60006020820190506130ac6000830184612df9565b92915050565b600060c0820190506130c76000830189612df9565b6130d46020830188612ddb565b6130e16040830187612ddb565b6130ee6060830186612fb6565b6130fb6080830185612fb6565b61310860a0830184612fb6565b979650505050505050565b60006080820190506131286000830187612df9565b6131356020830186612ddb565b6131426040830185612fb6565b61314f6060830184612fb6565b95945050505050565b600060808201905061316d6000830187612df9565b61317a6020830186612df9565b6131876040830185612fb6565b6131946060830184612ddb565b95945050505050565b60006080820190506131b26000830187612df9565b6131bf6020830186612fd4565b6131cc6040830185612df9565b6131d96060830184612df9565b95945050505050565b600060208201905081810360008301526131fc8184612e1f565b905092915050565b6000602082019050818103600083015261321d81612e58565b9050919050565b6000602082019050818103600083015261323d81612e7b565b9050919050565b6000602082019050818103600083015261325d81612ec1565b9050919050565b6000602082019050818103600083015261327d81612ee4565b9050919050565b6000602082019050818103600083015261329d81612f07565b9050919050565b600060208201905081810360008301526132bd81612f2a565b9050919050565b600060208201905081810360008301526132dd81612f4d565b9050919050565b600060208201905081810360008301526132fd81612f70565b9050919050565b6000602082019050818103600083015261331d81612f93565b9050919050565b60006020820190506133396000830184612fb6565b92915050565b60006020820190506133546000830184612fc5565b92915050565b600060408201905061336f6000830185612fc5565b61337c6020830184612ff2565b9392505050565b60006020820190506133986000830184612fd4565b92915050565b60006020820190506133b36000830184612fe3565b92915050565b60006020820190506133ce6000830184612ff2565b92915050565b60006040820190506133e96000830185612fe3565b6133f66020830184612fe3565b9392505050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061342f8261358b565b915061343a8361358b565b92508263ffffffff0382111561345357613452613658565b5b828201905092915050565b6000613469826135a8565b9150613474836135a8565b9250826bffffffffffffffffffffffff0382111561349557613494613658565b5b828201905092915050565b60006134ab8261358b565b91506134b68361358b565b9250826134c6576134c5613687565b5b828204905092915050565b60006134dc8261358b565b91506134e78361358b565b9250828210156134fa576134f9613658565b5b828203905092915050565b6000613510826135a8565b915061351b836135a8565b92508282101561352e5761352d613658565b5b828203905092915050565b600061354482613561565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b60006135cb826135a8565b9050919050565b60005b838110156135f05780820151818401526020810190506135d5565b838111156135ff576000848401525b50505050565b600061361082613581565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561364357613642613658565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b7f705374616b653a206f6e6c7920746865206d696e7465722063616e206368616e60008201527f676520746865206d696e74657220616464726573730000000000000000000000602082015250565b7f705374616b653a206e6f74207965742064657465726d696e6564000000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f705374616b653a20696e76616c6964206e6f6e63650000000000000000000000600082015250565b7f705374616b653a2063616e6e6f74207472616e7366657220746f20746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f705374616b653a2063616e6e6f74207472616e736665722066726f6d2074686560008201527f207a65726f206164647265737300000000000000000000000000000000000000602082015250565b7f705374616b653a206f6e6c7920746865206d696e7465722063616e206d696e74600082015250565b7f705374616b653a20756e617574686f72697a6564000000000000000000000000600082015250565b7f705374616b653a20696e76616c6964207369676e617475726500000000000000600082015250565b7f705374616b653a207369676e6174757265206578706972656400000000000000600082015250565b6138dc81613539565b81146138e757600080fd5b50565b6138f381613557565b81146138fe57600080fd5b50565b61390a81613581565b811461391557600080fd5b50565b6139218161358b565b811461392c57600080fd5b50565b6139388161359b565b811461394357600080fd5b5056fe705374616b653a207472616e7366657220616d6f756e7420657863656564732062616c616e6365705374616b653a207472616e7366657220616d6f756e74206f766572666c6f7773705374616b653a20746f74616c537570706c7920657863656564732039362062697473705374616b653a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e6365705374616b653a20626c6f636b206e756d62657220657863656564732033322062697473a264697066735822122083f7a00e989e916b7fcbb902d9221b6f7141afdfc931c10cd90d95008c08c89064736f6c6343000804003300000000000000000000000092febab0073d48aa600d95d19e579d4a667a2c5000000000000000000000000068d28564226567151d2389e2a6fdd167e31cdb79

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c806370a08231116100c3578063c3cda5201161007c578063c3cda52014610417578063d505accf14610433578063dd62ed3e1461044f578063e7a324dc1461047f578063f1127ed81461049d578063fca3b5aa146104ce57610158565b806370a0823114610309578063782d6fe1146103395780637ecebe001461036957806395d89b4114610399578063a9059cbb146103b7578063b4b5ea57146103e757610158565b806330adf81f1161011557806330adf81f14610235578063313ce5671461025357806340c10f1914610271578063587cde1e1461028d5780635c19a95c146102bd5780636fcfff45146102d957610158565b806306fdde031461015d578063075461721461017b578063095ea7b31461019957806318160ddd146101c957806320606b70146101e757806323b872dd14610205575b600080fd5b6101656104ea565b60405161017291906131e2565b60405180910390f35b610183610523565b6040516101909190613038565b60405180910390f35b6101b360048036038101906101ae9190612cda565b610549565b6040516101c0919061307c565b60405180910390f35b6101d16106e5565b6040516101de9190613324565b60405180910390f35b6101ef6106eb565b6040516101fc9190613097565b60405180910390f35b61021f600480360381019061021a9190612bed565b61070f565b60405161022c919061307c565b60405180910390f35b61023d6109a0565b60405161024a9190613097565b60405180910390f35b61025b6109c4565b6040516102689190613383565b60405180910390f35b61028b60048036038101906102869190612cda565b6109c9565b005b6102a760048036038101906102a29190612b88565b610d29565b6040516102b49190613038565b60405180910390f35b6102d760048036038101906102d29190612b88565b610d5c565b005b6102f360048036038101906102ee9190612b88565b610d69565b604051610300919061333f565b60405180910390f35b610323600480360381019061031e9190612b88565b610d8c565b6040516103309190613324565b60405180910390f35b610353600480360381019061034e9190612cda565b610dfb565b60405161036091906133b9565b60405180910390f35b610383600480360381019061037e9190612b88565b611236565b6040516103909190613324565b60405180910390f35b6103a161124e565b6040516103ae91906131e2565b60405180910390f35b6103d160048036038101906103cc9190612cda565b611287565b6040516103de919061307c565b60405180910390f35b61040160048036038101906103fc9190612b88565b6112e1565b60405161040e91906133b9565b60405180910390f35b610431600480360381019061042c9190612d16565b6113d8565b005b61044d60048036038101906104489190612c3c565b61169b565b005b61046960048036038101906104649190612bb1565b611b16565b6040516104769190613324565b60405180910390f35b610487611bc3565b6040516104949190613097565b60405180910390f35b6104b760048036038101906104b29190612d9f565b611be7565b6040516104c592919061335a565b60405180910390f35b6104e860048036038101906104e39190612b88565b611c40565b005b6040518060400160405280600e81526020017f705354414b452046696e616e636500000000000000000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831415610588576bffffffffffffffffffffffff90506105ca565b6105c7836040518060400160405280601e81526020017f705374616b653a20616d6f756e74206578636565647320393620626974730000815250611d6f565b90505b80600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516106d2919061339e565b60405180910390a3600191505092915050565b60005481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000803390506000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff16905060006107ef856040518060400160405280601e81526020017f705374616b653a20616d6f756e74206578636565647320393620626974730000815250611d6f565b90508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561084957506bffffffffffffffffffffffff8016826bffffffffffffffffffffffff1614155b1561098757600061087383836040518060600160405280603181526020016139b260319139611dcd565b905080600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161097d919061339e565b60405180910390a3505b610992878783611e47565b600193505050509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a50906132a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac090613264565b60405180910390fd5b6000610b0a826040518060400160405280601e81526020017f705374616b653a20616d6f756e74206578636565647320393620626974730000815250611d6f565b90506000610b3260005460405180606001604052806023815260200161398f60239139611d6f565b9050610b57818360405180606001604052806023815260200161398f60239139612228565b6bffffffffffffffffffffffff16600081905550610be5600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff168360405180606001604052806021815260200161396e60219139612228565b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb0919061339e565b60405180910390a3610d236000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846122a7565b50505050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d6633826125ee565b50565b60066020528060005260406000206000915054906101000a900463ffffffff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff169050919050565b6000438210610e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3690613224565b60405180910390fd5b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610eac576000915050611230565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610efb91906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610fc057600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610f8291906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff16915050611230565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115611041576000915050611230565b60008060018361105191906134d1565b90505b8163ffffffff168163ffffffff1611156111b25760006002838361107891906134d1565b61108291906134a0565b8261108d91906134d1565b90506000600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905086816000015163ffffffff16141561118157806020015195505050505050611230565b86816000015163ffffffff16101561119b578193506111ab565b6001826111a891906134d1565b92505b5050611054565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff1693505050505b92915050565b60076020528060005260406000206000915090505481565b6040518060400160405280600681526020017f505354414b45000000000000000000000000000000000000000000000000000081525081565b6000806112c9836040518060400160405280601e81526020017f705374616b653a20616d6f756e74206578636565647320393620626974730000815250611d6f565b90506112d6338583611e47565b600191505092915050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161161134b5760006113d0565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018361139991906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600e81526020017f705354414b452046696e616e6365000000000000000000000000000000000000815250805190602001206114406127ae565b306040516020016114549493929190613158565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8888886040516020016114a59493929190613113565b604051602081830303815290604052805190602001209050600082826040516020016114d2929190613001565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161150f949392919061319d565b6020604051602081039080840390855afa158015611531573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a4906132e4565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906115fd90613605565b919050558914611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990613244565b60405180910390fd5b87421115611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90613304565b60405180910390fd5b61168f818b6125ee565b50505050505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8614156116d9576bffffffffffffffffffffffff905061171b565b611718866040518060400160405280601e81526020017f705374616b653a20616d6f756e74206578636565647320393620626974730000815250611d6f565b90505b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600e81526020017f705354414b452046696e616e6365000000000000000000000000000000000000815250805190602001206117836127ae565b306040516020016117979493929190613158565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600760008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061182590613605565b919050558b60405160200161183f969594939291906130b2565b6040516020818303038152906040528051906020012090506000828260405160200161186c929190613001565b6040516020818303038152906040528051906020012090506000600182898989604051600081526020016040526040516118a9949392919061319d565b6020604051602081039080840390855afa1580156118cb573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193e906132e4565b60405180910390fd5b8b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ac906132c4565b60405180910390fd5b884211156119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90613304565b60405180910390fd5b84600260008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051611b00919061339e565b60405180910390a3505050505050505050505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6005602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060000160049054906101000a90046bffffffffffffffffffffffff16905082565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790613204565b60405180910390fd5b7f3b0007eb941cf645526cbb3a4fdaecda9d28ce4843167d9263b536a1f1edc0f6600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051611d23929190613053565b60405180910390a180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006c0100000000000000000000000083108290611dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dba91906131e2565b60405180910390fd5b5082905092915050565b6000836bffffffffffffffffffffffff16836bffffffffffffffffffffffff1611158290611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2891906131e2565b60405180910390fd5b508284611e3e9190613505565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eae90613284565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e90613264565b60405180910390fd5b611fa1600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff168260405180606001604052806027815260200161394760279139611dcd565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550612088600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff168260405180606001604052806021815260200161396e60219139612228565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612152919061339e565b60405180910390a3612223600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836122a7565b505050565b6000808385612237919061345e565b9050846bffffffffffffffffffffffff16816bffffffffffffffffffffffff161015839061229b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229291906131e2565b60405180910390fd5b50809150509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156122f157506000816bffffffffffffffffffffffff16115b156125e957600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461246f576000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611612394576000612419565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846123e291906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b9050600061245d82856040518060400160405280601e81526020017f705374616b653a20766f746520616d6f756e7420756e646572666c6f77730000815250611dcd565b905061246b868484846127bb565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125e8576000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161250d576000612592565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461255b91906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90046bffffffffffffffffffffffff165b905060006125d682856040518060400160405280601d81526020017f705374616b653a20766f746520616d6f756e74206f766572666c6f7773000000815250612228565b90506125e4858484846127bb565b5050505b5b505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046bffffffffffffffffffffffff16905082600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46127a88284836122a7565b50505050565b6000804690508091505090565b60006127df436040518060600160405280602481526020016139e360249139612ac9565b905060008463ffffffff1611801561287d57508063ffffffff16600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018761284791906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156129215781600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876128d191906134d1565b63ffffffff1663ffffffff16815260200190815260200160002060000160046101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550612a72565b60405180604001604052808263ffffffff168152602001836bffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050600184612a149190613424565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051612aba9291906133d4565b60405180910390a25050505050565b600064010000000083108290612b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0c91906131e2565b60405180910390fd5b5082905092915050565b600081359050612b2e816138d3565b92915050565b600081359050612b43816138ea565b92915050565b600081359050612b5881613901565b92915050565b600081359050612b6d81613918565b92915050565b600081359050612b828161392f565b92915050565b600060208284031215612b9a57600080fd5b6000612ba884828501612b1f565b91505092915050565b60008060408385031215612bc457600080fd5b6000612bd285828601612b1f565b9250506020612be385828601612b1f565b9150509250929050565b600080600060608486031215612c0257600080fd5b6000612c1086828701612b1f565b9350506020612c2186828701612b1f565b9250506040612c3286828701612b49565b9150509250925092565b600080600080600080600060e0888a031215612c5757600080fd5b6000612c658a828b01612b1f565b9750506020612c768a828b01612b1f565b9650506040612c878a828b01612b49565b9550506060612c988a828b01612b49565b9450506080612ca98a828b01612b73565b93505060a0612cba8a828b01612b34565b92505060c0612ccb8a828b01612b34565b91505092959891949750929550565b60008060408385031215612ced57600080fd5b6000612cfb85828601612b1f565b9250506020612d0c85828601612b49565b9150509250929050565b60008060008060008060c08789031215612d2f57600080fd5b6000612d3d89828a01612b1f565b9650506020612d4e89828a01612b49565b9550506040612d5f89828a01612b49565b9450506060612d7089828a01612b73565b9350506080612d8189828a01612b34565b92505060a0612d9289828a01612b34565b9150509295509295509295565b60008060408385031215612db257600080fd5b6000612dc085828601612b1f565b9250506020612dd185828601612b5e565b9150509250929050565b612de481613539565b82525050565b612df38161354b565b82525050565b612e0281613557565b82525050565b612e19612e1482613557565b61364e565b82525050565b6000612e2a826133fd565b612e348185613408565b9350612e448185602086016135d2565b612e4d816136b6565b840191505092915050565b6000612e65603583613408565b9150612e70826136c7565b604082019050919050565b6000612e88601a83613408565b9150612e9382613716565b602082019050919050565b6000612eab600283613419565b9150612eb68261373f565b600282019050919050565b6000612ece601583613408565b9150612ed982613768565b602082019050919050565b6000612ef1602b83613408565b9150612efc82613791565b604082019050919050565b6000612f14602d83613408565b9150612f1f826137e0565b604082019050919050565b6000612f37602083613408565b9150612f428261382f565b602082019050919050565b6000612f5a601483613408565b9150612f6582613858565b602082019050919050565b6000612f7d601983613408565b9150612f8882613881565b602082019050919050565b6000612fa0601983613408565b9150612fab826138aa565b602082019050919050565b612fbf81613581565b82525050565b612fce8161358b565b82525050565b612fdd8161359b565b82525050565b612fec816135c0565b82525050565b612ffb816135a8565b82525050565b600061300c82612e9e565b91506130188285612e08565b6020820191506130288284612e08565b6020820191508190509392505050565b600060208201905061304d6000830184612ddb565b92915050565b60006040820190506130686000830185612ddb565b6130756020830184612ddb565b9392505050565b60006020820190506130916000830184612dea565b92915050565b60006020820190506130ac6000830184612df9565b92915050565b600060c0820190506130c76000830189612df9565b6130d46020830188612ddb565b6130e16040830187612ddb565b6130ee6060830186612fb6565b6130fb6080830185612fb6565b61310860a0830184612fb6565b979650505050505050565b60006080820190506131286000830187612df9565b6131356020830186612ddb565b6131426040830185612fb6565b61314f6060830184612fb6565b95945050505050565b600060808201905061316d6000830187612df9565b61317a6020830186612df9565b6131876040830185612fb6565b6131946060830184612ddb565b95945050505050565b60006080820190506131b26000830187612df9565b6131bf6020830186612fd4565b6131cc6040830185612df9565b6131d96060830184612df9565b95945050505050565b600060208201905081810360008301526131fc8184612e1f565b905092915050565b6000602082019050818103600083015261321d81612e58565b9050919050565b6000602082019050818103600083015261323d81612e7b565b9050919050565b6000602082019050818103600083015261325d81612ec1565b9050919050565b6000602082019050818103600083015261327d81612ee4565b9050919050565b6000602082019050818103600083015261329d81612f07565b9050919050565b600060208201905081810360008301526132bd81612f2a565b9050919050565b600060208201905081810360008301526132dd81612f4d565b9050919050565b600060208201905081810360008301526132fd81612f70565b9050919050565b6000602082019050818103600083015261331d81612f93565b9050919050565b60006020820190506133396000830184612fb6565b92915050565b60006020820190506133546000830184612fc5565b92915050565b600060408201905061336f6000830185612fc5565b61337c6020830184612ff2565b9392505050565b60006020820190506133986000830184612fd4565b92915050565b60006020820190506133b36000830184612fe3565b92915050565b60006020820190506133ce6000830184612ff2565b92915050565b60006040820190506133e96000830185612fe3565b6133f66020830184612fe3565b9392505050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061342f8261358b565b915061343a8361358b565b92508263ffffffff0382111561345357613452613658565b5b828201905092915050565b6000613469826135a8565b9150613474836135a8565b9250826bffffffffffffffffffffffff0382111561349557613494613658565b5b828201905092915050565b60006134ab8261358b565b91506134b68361358b565b9250826134c6576134c5613687565b5b828204905092915050565b60006134dc8261358b565b91506134e78361358b565b9250828210156134fa576134f9613658565b5b828203905092915050565b6000613510826135a8565b915061351b836135a8565b92508282101561352e5761352d613658565b5b828203905092915050565b600061354482613561565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b60006135cb826135a8565b9050919050565b60005b838110156135f05780820151818401526020810190506135d5565b838111156135ff576000848401525b50505050565b600061361082613581565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561364357613642613658565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b7f705374616b653a206f6e6c7920746865206d696e7465722063616e206368616e60008201527f676520746865206d696e74657220616464726573730000000000000000000000602082015250565b7f705374616b653a206e6f74207965742064657465726d696e6564000000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f705374616b653a20696e76616c6964206e6f6e63650000000000000000000000600082015250565b7f705374616b653a2063616e6e6f74207472616e7366657220746f20746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f705374616b653a2063616e6e6f74207472616e736665722066726f6d2074686560008201527f207a65726f206164647265737300000000000000000000000000000000000000602082015250565b7f705374616b653a206f6e6c7920746865206d696e7465722063616e206d696e74600082015250565b7f705374616b653a20756e617574686f72697a6564000000000000000000000000600082015250565b7f705374616b653a20696e76616c6964207369676e617475726500000000000000600082015250565b7f705374616b653a207369676e6174757265206578706972656400000000000000600082015250565b6138dc81613539565b81146138e757600080fd5b50565b6138f381613557565b81146138fe57600080fd5b50565b61390a81613581565b811461391557600080fd5b50565b6139218161358b565b811461392c57600080fd5b50565b6139388161359b565b811461394357600080fd5b5056fe705374616b653a207472616e7366657220616d6f756e7420657863656564732062616c616e6365705374616b653a207472616e7366657220616d6f756e74206f766572666c6f7773705374616b653a20746f74616c537570706c7920657863656564732039362062697473705374616b653a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e6365705374616b653a20626c6f636b206e756d62657220657863656564732033322062697473a264697066735822122083f7a00e989e916b7fcbb902d9221b6f7141afdfc931c10cd90d95008c08c89064736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000092febab0073d48aa600d95d19e579d4a667a2c5000000000000000000000000068d28564226567151d2389e2a6fdd167e31cdb79

-----Decoded View---------------
Arg [0] : account (address): 0x92FEBAb0073d48AA600D95D19e579d4A667a2C50
Arg [1] : minter_ (address): 0x68d28564226567151D2389e2a6fDD167e31cDB79

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000092febab0073d48aa600d95d19e579d4a667a2c50
Arg [1] : 00000000000000000000000068d28564226567151d2389e2a6fdd167e31cdb79


Deployed Bytecode Sourcemap

437:15836:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;573:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1163:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5807:421;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1035:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2025:122;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8844:654;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2442:137;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;885:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4127:773;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1490:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9640:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1906:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7937:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11760:1173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2657:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;731:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8308:235;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11119:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10172:753;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6706:1035;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5196:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2238:117;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1770:70;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;3740:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;573:46;;;;;;;;;;;;;;;;;;;:::o;1163:21::-;;;;;;;;;;;;;:::o;5807:421::-;5884:4;5900:13;5940:14;5927:9;:27;5923:174;;;5979:16;5970:25;;5923:174;;;6035:51;6042:9;6035:51;;;;;;;;;;;;;;;;;:6;:51::i;:::-;6026:60;;5923:174;6141:6;6107:10;:22;6118:10;6107:22;;;;;;;;;;;;;;;:31;6130:7;6107:31;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;6184:7;6163:37;;6172:10;6163:37;;;6193:6;6163:37;;;;;;:::i;:::-;;;;;;;;6217:4;6210:11;;;5807:421;;;;:::o;1035:49::-;;;;:::o;2025:122::-;2067:80;2025:122;:::o;8844:654::-;8935:4;8951:15;8969:10;8951:28;;8989:23;9015:10;:15;9026:3;9015:15;;;;;;;;;;;;;;;:24;9031:7;9015:24;;;;;;;;;;;;;;;;;;;;;;;;;8989:50;;9049:13;9065:51;9072:9;9065:51;;;;;;;;;;;;;;;;;:6;:51::i;:::-;9049:67;;9142:3;9131:14;;:7;:14;;;;:54;;;;;9169:16;9149:36;;:16;:36;;;;9131:54;9127:300;;;9201:19;9223:84;9229:16;9247:6;9223:84;;;;;;;;;;;;;;;;;:5;:84::i;:::-;9201:106;;9348:12;9321:10;:15;9332:3;9321:15;;;;;;;;;;;;;;;:24;9337:7;9321:24;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;9394:7;9380:36;;9389:3;9380:36;;;9403:12;9380:36;;;;;;:::i;:::-;;;;;;;;9127:300;;9437:33;9453:3;9458;9463:6;9437:15;:33::i;:::-;9487:4;9480:11;;;;;8844:654;;;;;:::o;2442:137::-;2484:95;2442:137;:::o;885:35::-;918:2;885:35;:::o;4127:773::-;4211:6;;;;;;;;;;;4197:20;;:10;:20;;;4189:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;4287:1;4272:17;;:3;:17;;;;4264:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4375:13;4391:51;4398:9;4391:51;;;;;;;;;;;;;;;;;:6;:51::i;:::-;4375:67;;4452:17;4472:58;4479:11;;4472:58;;;;;;;;;;;;;;;;;:6;:58::i;:::-;4452:78;;4554:64;4560:10;4572:6;4554:64;;;;;;;;;;;;;;;;;:5;:64::i;:::-;4540:78;;:11;:78;;;;4693:65;4699:8;:13;4708:3;4699:13;;;;;;;;;;;;;;;;;;;;;;;;;4714:6;4693:65;;;;;;;;;;;;;;;;;:5;:65::i;:::-;4677:8;:13;4686:3;4677:13;;;;;;;;;;;;;;;;:81;;;;;;;;;;;;;;;;;;4794:3;4773:33;;4790:1;4773:33;;;4799:6;4773:33;;;;;;:::i;:::-;;;;;;;;4843:50;4866:1;4870:9;:14;4880:3;4870:14;;;;;;;;;;;;;;;;;;;;;;;;;4886:6;4843:14;:50::i;:::-;4127:773;;;;:::o;1490:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;9640:109::-;9710:32;9720:10;9732:9;9710;:32::i;:::-;9640:109;:::o;1906:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;7937:115::-;8005:4;8028:8;:17;8037:7;8028:17;;;;;;;;;;;;;;;;;;;;;;;;;8021:24;;;;7937:115;;;:::o;11760:1173::-;11839:6;11879:12;11865:11;:26;11857:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11933:19;11955:14;:23;11970:7;11955:23;;;;;;;;;;;;;;;;;;;;;;;;;11933:45;;12008:1;11992:12;:17;;;11988:56;;;12032:1;12025:8;;;;;11988:56;12153:11;12101;:20;12113:7;12101:20;;;;;;;;;;;;;;;:38;12137:1;12122:12;:16;;;;:::i;:::-;12101:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;12097:145;;12187:11;:20;12199:7;12187:20;;;;;;;;;;;;;;;:38;12223:1;12208:12;:16;;;;:::i;:::-;12187:38;;;;;;;;;;;;;;;:44;;;;;;;;;;;;12180:51;;;;;12097:145;12336:11;12300;:20;12312:7;12300:20;;;;;;;;;;;;;;;:23;12321:1;12300:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;12296:86;;;12370:1;12363:8;;;;;12296:86;12392:12;12418;12448:1;12433:12;:16;;;;:::i;:::-;12418:31;;12459:418;12474:5;12466:13;;:5;:13;;;12459:418;;;12495:13;12537:1;12528:5;12520;:13;;;;:::i;:::-;12519:19;;;;:::i;:::-;12511:5;:27;;;;:::i;:::-;12495:43;;12579:20;12602:11;:20;12614:7;12602:20;;;;;;;;;;;;;;;:28;12623:6;12602:28;;;;;;;;;;;;;;;12579:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12664:11;12648:2;:12;;;:27;;;12644:223;;;12702:2;:8;;;12695:15;;;;;;;;;12644:223;12750:11;12735:2;:12;;;:26;;;12731:136;;;12789:6;12781:14;;12731:136;;;12851:1;12842:6;:10;;;;:::i;:::-;12834:18;;12731:136;12459:418;;;;;12893:11;:20;12905:7;12893:20;;;;;;;;;;;;;;;:27;12914:5;12893:27;;;;;;;;;;;;;;;:33;;;;;;;;;;;;12886:40;;;;;11760:1173;;;;;:::o;2657:39::-;;;;;;;;;;;;;;;;;:::o;731:40::-;;;;;;;;;;;;;;;;;;;:::o;8308:235::-;8382:4;8398:13;8414:51;8421:9;8414:51;;;;;;;;;;;;;;;;;:6;:51::i;:::-;8398:67;;8475:40;8491:10;8503:3;8508:6;8475:15;:40::i;:::-;8532:4;8525:11;;;8308:235;;;;:::o;11119:219::-;11184:6;11202:19;11224:14;:23;11239:7;11224:23;;;;;;;;;;;;;;;;;;;;;;;;;11202:45;;11279:1;11264:12;:16;;;:67;;11330:1;11264:67;;;11283:11;:20;11295:7;11283:20;;;;;;;;;;;;;;;:38;11319:1;11304:12;:16;;;;:::i;:::-;11283:38;;;;;;;;;;;;;;;:44;;;;;;;;;;;;11264:67;11257:74;;;11119:219;;;:::o;10172:753::-;10287:23;2067:80;10367:4;;;;;;;;;;;;;;;;;10351:22;;;;;;10375:12;:10;:12::i;:::-;10397:4;10323:80;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10313:91;;;;;;10287:117;;10414:18;2284:71;10477:9;10488:5;10495:6;10445:57;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10435:68;;;;;;10414:89;;10513:14;10569:15;10586:10;10540:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10530:68;;;;;;10513:85;;10608:17;10628:26;10638:6;10646:1;10649;10652;10628:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10608:46;;10693:1;10672:23;;:9;:23;;;;10664:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;10752:6;:17;10759:9;10752:17;;;;;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;10743:5;:28;10735:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;10834:6;10815:15;:25;;10807:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10887:31;10897:9;10908;10887;:31::i;:::-;10880:38;;;;10172:753;;;;;;:::o;6706:1035::-;6835:13;6875:14;6862:9;:27;6858:174;;;6914:16;6905:25;;6858:174;;;6970:51;6977:9;6970:51;;;;;;;;;;;;;;;;;:6;:51::i;:::-;6961:60;;6858:174;7042:23;2067:80;7122:4;;;;;;;;;;;;;;;;;7106:22;;;;;;7130:12;:10;:12::i;:::-;7152:4;7078:80;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7068:91;;;;;;7042:117;;7169:18;2484:95;7228:5;7235:7;7244:9;7255:6;:13;7262:5;7255:13;;;;;;;;;;;;;;;;:15;;;;;;;;;:::i;:::-;;;;;7272:8;7200:81;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7190:92;;;;;;7169:113;;7292:14;7348:15;7365:10;7319:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7309:68;;;;;;7292:85;;7387:17;7407:26;7417:6;7425:1;7428;7431;7407:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7387:46;;7472:1;7451:23;;:9;:23;;;;7443:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;7535:5;7522:18;;:9;:18;;;7514:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;7602:8;7583:15;:27;;7575:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;7680:6;7651:10;:17;7662:5;7651:17;;;;;;;;;;;;;;;:26;7669:7;7651:26;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;7718:7;7702:32;;7711:5;7702:32;;;7727:6;7702:32;;;;;;:::i;:::-;;;;;;;;6706:1035;;;;;;;;;;;;:::o;5196:143::-;5281:4;5304:10;:19;5315:7;5304:19;;;;;;;;;;;;;;;:28;5324:7;5304:28;;;;;;;;;;;;;;;;;;;;;;;;;5297:35;;;;5196:143;;;;:::o;2238:117::-;2284:71;2238:117;:::o;1770:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3740:219::-;3817:6;;;;;;;;;;;3803:20;;:10;:20;;;3795:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;3896:30;3910:6;;;;;;;;;;;3918:7;3896:30;;;;;;;:::i;:::-;;;;;;;;3945:7;3936:6;;:16;;;;;;;;;;;;;;;;;;3740:219;:::o;15544:158::-;15619:6;15649:5;15645:1;:9;15656:12;15637:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15693:1;15679:16;;15544:158;;;;:::o;15898:162::-;15984:6;16015:1;16010:6;;:1;:6;;;;16018:12;16002:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16052:1;16048;:5;;;;:::i;:::-;16041:12;;15898:162;;;;;:::o;13312:545::-;13420:1;13405:17;;:3;:17;;;;13397:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;13505:1;13490:17;;:3;:17;;;;13482:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13582:71;13588:8;:13;13597:3;13588:13;;;;;;;;;;;;;;;;;;;;;;;;;13603:6;13582:71;;;;;;;;;;;;;;;;;:5;:71::i;:::-;13566:8;:13;13575:3;13566:13;;;;;;;;;;;;;;;;:87;;;;;;;;;;;;;;;;;;13679:65;13685:8;:13;13694:3;13685:13;;;;;;;;;;;;;;;;;;;;;;;;;13700:6;13679:65;;;;;;;;;;;;;;;;;:5;:65::i;:::-;13663:8;:13;13672:3;13663:13;;;;;;;;;;;;;;;;:81;;;;;;;;;;;;;;;;;;13773:3;13759:26;;13768:3;13759:26;;;13778:6;13759:26;;;;;;:::i;:::-;;;;;;;;13796:54;13811:9;:14;13821:3;13811:14;;;;;;;;;;;;;;;;;;;;;;;;;13827:9;:14;13837:3;13827:14;;;;;;;;;;;;;;;;;;;;;;;;;13843:6;13796:14;:54::i;:::-;13312:545;;;:::o;15708:184::-;15794:6;15812:8;15827:1;15823;:5;;;;:::i;:::-;15812:16;;15851:1;15846:6;;:1;:6;;;;15854:12;15838:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15884:1;15877:8;;;15708:184;;;;;:::o;13863:903::-;13967:6;13957:16;;:6;:16;;;;:30;;;;;13986:1;13977:6;:10;;;13957:30;13953:807;;;14025:1;14007:20;;:6;:20;;;14003:367;;14047:16;14066:14;:22;14081:6;14066:22;;;;;;;;;;;;;;;;;;;;;;;;;14047:41;;14106:16;14137:1;14125:9;:13;;;:60;;14184:1;14125:60;;;14141:11;:19;14153:6;14141:19;;;;;;;;;;;;;;;:34;14173:1;14161:9;:13;;;;:::i;:::-;14141:34;;;;;;;;;;;;;;;:40;;;;;;;;;;;;14125:60;14106:79;;14203:16;14222:58;14228:9;14239:6;14222:58;;;;;;;;;;;;;;;;;:5;:58::i;:::-;14203:77;;14298:57;14315:6;14323:9;14334;14345;14298:16;:57::i;:::-;14003:367;;;;14406:1;14388:20;;:6;:20;;;14384:366;;14428:16;14447:14;:22;14462:6;14447:22;;;;;;;;;;;;;;;;;;;;;;;;;14428:41;;14487:16;14518:1;14506:9;:13;;;:60;;14565:1;14506:60;;;14522:11;:19;14534:6;14522:19;;;;;;;;;;;;;;;:34;14554:1;14542:9;:13;;;;:::i;:::-;14522:34;;;;;;;;;;;;;;;:40;;;;;;;;;;;;14506:60;14487:79;;14584:16;14603:57;14609:9;14620:6;14603:57;;;;;;;;;;;;;;;;;:5;:57::i;:::-;14584:76;;14678:57;14695:6;14703:9;14714;14725;14678:16;:57::i;:::-;14384:366;;;;13953:807;13863:903;;;:::o;12939:367::-;13015:23;13041:9;:20;13051:9;13041:20;;;;;;;;;;;;;;;;;;;;;;;;;13015:46;;13071:23;13097:8;:19;13106:9;13097:19;;;;;;;;;;;;;;;;;;;;;;;;;13071:45;;13149:9;13126;:20;13136:9;13126:20;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;13218:9;13174:54;;13201:15;13174:54;;13190:9;13174:54;;;;;;;;;;;;13239:60;13254:15;13271:9;13282:16;13239:14;:60::i;:::-;12939:367;;;;:::o;16066:205::-;16111:4;16127:15;16230:9;16219:20;;16257:7;16250:14;;;16066:205;:::o;14772:602::-;14889:18;14910:60;14917:12;14910:60;;;;;;;;;;;;;;;;;:6;:60::i;:::-;14889:81;;14998:1;14983:12;:16;;;:85;;;;;15057:11;15003:65;;:11;:22;15015:9;15003:22;;;;;;;;;;;;;;;:40;15041:1;15026:12;:16;;;;:::i;:::-;15003:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;14983:85;14979:324;;;15131:8;15082:11;:22;15094:9;15082:22;;;;;;;;;;;;;;;:40;15120:1;15105:12;:16;;;;:::i;:::-;15082:40;;;;;;;;;;;;;;;:46;;;:57;;;;;;;;;;;;;;;;;;14979:324;;;15205:33;;;;;;;;15216:11;15205:33;;;;;;15229:8;15205:33;;;;;15166:11;:22;15178:9;15166:22;;;;;;;;;;;;;;;:36;15189:12;15166:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15293:1;15278:12;:16;;;;:::i;:::-;15250:14;:25;15265:9;15250:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;14979:324;15337:9;15316:51;;;15348:8;15358;15316:51;;;;;;;:::i;:::-;;;;;;;;14772:602;;;;;:::o;15380:158::-;15455:6;15485:5;15481:1;:9;15492:12;15473:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15529:1;15515:16;;15380:158;;;;:::o;7:139:10:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:139::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;204:87;;;;:::o;297:139::-;343:5;381:6;368:20;359:29;;397:33;424:5;397:33;:::i;:::-;349:87;;;;:::o;442:137::-;487:5;525:6;512:20;503:29;;541:32;567:5;541:32;:::i;:::-;493:86;;;;:::o;585:135::-;629:5;667:6;654:20;645:29;;683:31;708:5;683:31;:::i;:::-;635:85;;;;:::o;726:262::-;785:6;834:2;822:9;813:7;809:23;805:32;802:2;;;850:1;847;840:12;802:2;893:1;918:53;963:7;954:6;943:9;939:22;918:53;:::i;:::-;908:63;;864:117;792:196;;;;:::o;994:407::-;1062:6;1070;1119:2;1107:9;1098:7;1094:23;1090:32;1087:2;;;1135:1;1132;1125:12;1087:2;1178:1;1203:53;1248:7;1239:6;1228:9;1224:22;1203:53;:::i;:::-;1193:63;;1149:117;1305:2;1331:53;1376:7;1367:6;1356:9;1352:22;1331:53;:::i;:::-;1321:63;;1276:118;1077:324;;;;;:::o;1407:552::-;1484:6;1492;1500;1549:2;1537:9;1528:7;1524:23;1520:32;1517:2;;;1565:1;1562;1555:12;1517:2;1608:1;1633:53;1678:7;1669:6;1658:9;1654:22;1633:53;:::i;:::-;1623:63;;1579:117;1735:2;1761:53;1806:7;1797:6;1786:9;1782:22;1761:53;:::i;:::-;1751:63;;1706:118;1863:2;1889:53;1934:7;1925:6;1914:9;1910:22;1889:53;:::i;:::-;1879:63;;1834:118;1507:452;;;;;:::o;1965:1132::-;2076:6;2084;2092;2100;2108;2116;2124;2173:3;2161:9;2152:7;2148:23;2144:33;2141:2;;;2190:1;2187;2180:12;2141:2;2233:1;2258:53;2303:7;2294:6;2283:9;2279:22;2258:53;:::i;:::-;2248:63;;2204:117;2360:2;2386:53;2431:7;2422:6;2411:9;2407:22;2386:53;:::i;:::-;2376:63;;2331:118;2488:2;2514:53;2559:7;2550:6;2539:9;2535:22;2514:53;:::i;:::-;2504:63;;2459:118;2616:2;2642:53;2687:7;2678:6;2667:9;2663:22;2642:53;:::i;:::-;2632:63;;2587:118;2744:3;2771:51;2814:7;2805:6;2794:9;2790:22;2771:51;:::i;:::-;2761:61;;2715:117;2871:3;2898:53;2943:7;2934:6;2923:9;2919:22;2898:53;:::i;:::-;2888:63;;2842:119;3000:3;3027:53;3072:7;3063:6;3052:9;3048:22;3027:53;:::i;:::-;3017:63;;2971:119;2131:966;;;;;;;;;;:::o;3103:407::-;3171:6;3179;3228:2;3216:9;3207:7;3203:23;3199:32;3196:2;;;3244:1;3241;3234:12;3196:2;3287:1;3312:53;3357:7;3348:6;3337:9;3333:22;3312:53;:::i;:::-;3302:63;;3258:117;3414:2;3440:53;3485:7;3476:6;3465:9;3461:22;3440:53;:::i;:::-;3430:63;;3385:118;3186:324;;;;;:::o;3516:986::-;3618:6;3626;3634;3642;3650;3658;3707:3;3695:9;3686:7;3682:23;3678:33;3675:2;;;3724:1;3721;3714:12;3675:2;3767:1;3792:53;3837:7;3828:6;3817:9;3813:22;3792:53;:::i;:::-;3782:63;;3738:117;3894:2;3920:53;3965:7;3956:6;3945:9;3941:22;3920:53;:::i;:::-;3910:63;;3865:118;4022:2;4048:53;4093:7;4084:6;4073:9;4069:22;4048:53;:::i;:::-;4038:63;;3993:118;4150:2;4176:51;4219:7;4210:6;4199:9;4195:22;4176:51;:::i;:::-;4166:61;;4121:116;4276:3;4303:53;4348:7;4339:6;4328:9;4324:22;4303:53;:::i;:::-;4293:63;;4247:119;4405:3;4432:53;4477:7;4468:6;4457:9;4453:22;4432:53;:::i;:::-;4422:63;;4376:119;3665:837;;;;;;;;:::o;4508:405::-;4575:6;4583;4632:2;4620:9;4611:7;4607:23;4603:32;4600:2;;;4648:1;4645;4638:12;4600:2;4691:1;4716:53;4761:7;4752:6;4741:9;4737:22;4716:53;:::i;:::-;4706:63;;4662:117;4818:2;4844:52;4888:7;4879:6;4868:9;4864:22;4844:52;:::i;:::-;4834:62;;4789:117;4590:323;;;;;:::o;4919:118::-;5006:24;5024:5;5006:24;:::i;:::-;5001:3;4994:37;4984:53;;:::o;5043:109::-;5124:21;5139:5;5124:21;:::i;:::-;5119:3;5112:34;5102:50;;:::o;5158:118::-;5245:24;5263:5;5245:24;:::i;:::-;5240:3;5233:37;5223:53;;:::o;5282:157::-;5387:45;5407:24;5425:5;5407:24;:::i;:::-;5387:45;:::i;:::-;5382:3;5375:58;5365:74;;:::o;5445:364::-;5533:3;5561:39;5594:5;5561:39;:::i;:::-;5616:71;5680:6;5675:3;5616:71;:::i;:::-;5609:78;;5696:52;5741:6;5736:3;5729:4;5722:5;5718:16;5696:52;:::i;:::-;5773:29;5795:6;5773:29;:::i;:::-;5768:3;5764:39;5757:46;;5537:272;;;;;:::o;5815:366::-;5957:3;5978:67;6042:2;6037:3;5978:67;:::i;:::-;5971:74;;6054:93;6143:3;6054:93;:::i;:::-;6172:2;6167:3;6163:12;6156:19;;5961:220;;;:::o;6187:366::-;6329:3;6350:67;6414:2;6409:3;6350:67;:::i;:::-;6343:74;;6426:93;6515:3;6426:93;:::i;:::-;6544:2;6539:3;6535:12;6528:19;;6333:220;;;:::o;6559:400::-;6719:3;6740:84;6822:1;6817:3;6740:84;:::i;:::-;6733:91;;6833:93;6922:3;6833:93;:::i;:::-;6951:1;6946:3;6942:11;6935:18;;6723:236;;;:::o;6965:366::-;7107:3;7128:67;7192:2;7187:3;7128:67;:::i;:::-;7121:74;;7204:93;7293:3;7204:93;:::i;:::-;7322:2;7317:3;7313:12;7306:19;;7111:220;;;:::o;7337:366::-;7479:3;7500:67;7564:2;7559:3;7500:67;:::i;:::-;7493:74;;7576:93;7665:3;7576:93;:::i;:::-;7694:2;7689:3;7685:12;7678:19;;7483:220;;;:::o;7709:366::-;7851:3;7872:67;7936:2;7931:3;7872:67;:::i;:::-;7865:74;;7948:93;8037:3;7948:93;:::i;:::-;8066:2;8061:3;8057:12;8050:19;;7855:220;;;:::o;8081:366::-;8223:3;8244:67;8308:2;8303:3;8244:67;:::i;:::-;8237:74;;8320:93;8409:3;8320:93;:::i;:::-;8438:2;8433:3;8429:12;8422:19;;8227:220;;;:::o;8453:366::-;8595:3;8616:67;8680:2;8675:3;8616:67;:::i;:::-;8609:74;;8692:93;8781:3;8692:93;:::i;:::-;8810:2;8805:3;8801:12;8794:19;;8599:220;;;:::o;8825:366::-;8967:3;8988:67;9052:2;9047:3;8988:67;:::i;:::-;8981:74;;9064:93;9153:3;9064:93;:::i;:::-;9182:2;9177:3;9173:12;9166:19;;8971:220;;;:::o;9197:366::-;9339:3;9360:67;9424:2;9419:3;9360:67;:::i;:::-;9353:74;;9436:93;9525:3;9436:93;:::i;:::-;9554:2;9549:3;9545:12;9538:19;;9343:220;;;:::o;9569:118::-;9656:24;9674:5;9656:24;:::i;:::-;9651:3;9644:37;9634:53;;:::o;9693:115::-;9778:23;9795:5;9778:23;:::i;:::-;9773:3;9766:36;9756:52;;:::o;9814:112::-;9897:22;9913:5;9897:22;:::i;:::-;9892:3;9885:35;9875:51;;:::o;9932:129::-;10018:36;10048:5;10018:36;:::i;:::-;10013:3;10006:49;9996:65;;:::o;10067:115::-;10152:23;10169:5;10152:23;:::i;:::-;10147:3;10140:36;10130:52;;:::o;10188:663::-;10429:3;10451:148;10595:3;10451:148;:::i;:::-;10444:155;;10609:75;10680:3;10671:6;10609:75;:::i;:::-;10709:2;10704:3;10700:12;10693:19;;10722:75;10793:3;10784:6;10722:75;:::i;:::-;10822:2;10817:3;10813:12;10806:19;;10842:3;10835:10;;10433:418;;;;;:::o;10857:222::-;10950:4;10988:2;10977:9;10973:18;10965:26;;11001:71;11069:1;11058:9;11054:17;11045:6;11001:71;:::i;:::-;10955:124;;;;:::o;11085:332::-;11206:4;11244:2;11233:9;11229:18;11221:26;;11257:71;11325:1;11314:9;11310:17;11301:6;11257:71;:::i;:::-;11338:72;11406:2;11395:9;11391:18;11382:6;11338:72;:::i;:::-;11211:206;;;;;:::o;11423:210::-;11510:4;11548:2;11537:9;11533:18;11525:26;;11561:65;11623:1;11612:9;11608:17;11599:6;11561:65;:::i;:::-;11515:118;;;;:::o;11639:222::-;11732:4;11770:2;11759:9;11755:18;11747:26;;11783:71;11851:1;11840:9;11836:17;11827:6;11783:71;:::i;:::-;11737:124;;;;:::o;11867:775::-;12100:4;12138:3;12127:9;12123:19;12115:27;;12152:71;12220:1;12209:9;12205:17;12196:6;12152:71;:::i;:::-;12233:72;12301:2;12290:9;12286:18;12277:6;12233:72;:::i;:::-;12315;12383:2;12372:9;12368:18;12359:6;12315:72;:::i;:::-;12397;12465:2;12454:9;12450:18;12441:6;12397:72;:::i;:::-;12479:73;12547:3;12536:9;12532:19;12523:6;12479:73;:::i;:::-;12562;12630:3;12619:9;12615:19;12606:6;12562:73;:::i;:::-;12105:537;;;;;;;;;:::o;12648:553::-;12825:4;12863:3;12852:9;12848:19;12840:27;;12877:71;12945:1;12934:9;12930:17;12921:6;12877:71;:::i;:::-;12958:72;13026:2;13015:9;13011:18;13002:6;12958:72;:::i;:::-;13040;13108:2;13097:9;13093:18;13084:6;13040:72;:::i;:::-;13122;13190:2;13179:9;13175:18;13166:6;13122:72;:::i;:::-;12830:371;;;;;;;:::o;13207:553::-;13384:4;13422:3;13411:9;13407:19;13399:27;;13436:71;13504:1;13493:9;13489:17;13480:6;13436:71;:::i;:::-;13517:72;13585:2;13574:9;13570:18;13561:6;13517:72;:::i;:::-;13599;13667:2;13656:9;13652:18;13643:6;13599:72;:::i;:::-;13681;13749:2;13738:9;13734:18;13725:6;13681:72;:::i;:::-;13389:371;;;;;;;:::o;13766:545::-;13939:4;13977:3;13966:9;13962:19;13954:27;;13991:71;14059:1;14048:9;14044:17;14035:6;13991:71;:::i;:::-;14072:68;14136:2;14125:9;14121:18;14112:6;14072:68;:::i;:::-;14150:72;14218:2;14207:9;14203:18;14194:6;14150:72;:::i;:::-;14232;14300:2;14289:9;14285:18;14276:6;14232:72;:::i;:::-;13944:367;;;;;;;:::o;14317:313::-;14430:4;14468:2;14457:9;14453:18;14445:26;;14517:9;14511:4;14507:20;14503:1;14492:9;14488:17;14481:47;14545:78;14618:4;14609:6;14545:78;:::i;:::-;14537:86;;14435:195;;;;:::o;14636:419::-;14802:4;14840:2;14829:9;14825:18;14817:26;;14889:9;14883:4;14879:20;14875:1;14864:9;14860:17;14853:47;14917:131;15043:4;14917:131;:::i;:::-;14909:139;;14807:248;;;:::o;15061:419::-;15227:4;15265:2;15254:9;15250:18;15242:26;;15314:9;15308:4;15304:20;15300:1;15289:9;15285:17;15278:47;15342:131;15468:4;15342:131;:::i;:::-;15334:139;;15232:248;;;:::o;15486:419::-;15652:4;15690:2;15679:9;15675:18;15667:26;;15739:9;15733:4;15729:20;15725:1;15714:9;15710:17;15703:47;15767:131;15893:4;15767:131;:::i;:::-;15759:139;;15657:248;;;:::o;15911:419::-;16077:4;16115:2;16104:9;16100:18;16092:26;;16164:9;16158:4;16154:20;16150:1;16139:9;16135:17;16128:47;16192:131;16318:4;16192:131;:::i;:::-;16184:139;;16082:248;;;:::o;16336:419::-;16502:4;16540:2;16529:9;16525:18;16517:26;;16589:9;16583:4;16579:20;16575:1;16564:9;16560:17;16553:47;16617:131;16743:4;16617:131;:::i;:::-;16609:139;;16507:248;;;:::o;16761:419::-;16927:4;16965:2;16954:9;16950:18;16942:26;;17014:9;17008:4;17004:20;17000:1;16989:9;16985:17;16978:47;17042:131;17168:4;17042:131;:::i;:::-;17034:139;;16932:248;;;:::o;17186:419::-;17352:4;17390:2;17379:9;17375:18;17367:26;;17439:9;17433:4;17429:20;17425:1;17414:9;17410:17;17403:47;17467:131;17593:4;17467:131;:::i;:::-;17459:139;;17357:248;;;:::o;17611:419::-;17777:4;17815:2;17804:9;17800:18;17792:26;;17864:9;17858:4;17854:20;17850:1;17839:9;17835:17;17828:47;17892:131;18018:4;17892:131;:::i;:::-;17884:139;;17782:248;;;:::o;18036:419::-;18202:4;18240:2;18229:9;18225:18;18217:26;;18289:9;18283:4;18279:20;18275:1;18264:9;18260:17;18253:47;18317:131;18443:4;18317:131;:::i;:::-;18309:139;;18207:248;;;:::o;18461:222::-;18554:4;18592:2;18581:9;18577:18;18569:26;;18605:71;18673:1;18662:9;18658:17;18649:6;18605:71;:::i;:::-;18559:124;;;;:::o;18689:218::-;18780:4;18818:2;18807:9;18803:18;18795:26;;18831:69;18897:1;18886:9;18882:17;18873:6;18831:69;:::i;:::-;18785:122;;;;:::o;18913:324::-;19030:4;19068:2;19057:9;19053:18;19045:26;;19081:69;19147:1;19136:9;19132:17;19123:6;19081:69;:::i;:::-;19160:70;19226:2;19215:9;19211:18;19202:6;19160:70;:::i;:::-;19035:202;;;;;:::o;19243:214::-;19332:4;19370:2;19359:9;19355:18;19347:26;;19383:67;19447:1;19436:9;19432:17;19423:6;19383:67;:::i;:::-;19337:120;;;;:::o;19463:220::-;19555:4;19593:2;19582:9;19578:18;19570:26;;19606:70;19673:1;19662:9;19658:17;19649:6;19606:70;:::i;:::-;19560:123;;;;:::o;19689:218::-;19780:4;19818:2;19807:9;19803:18;19795:26;;19831:69;19897:1;19886:9;19882:17;19873:6;19831:69;:::i;:::-;19785:122;;;;:::o;19913:328::-;20032:4;20070:2;20059:9;20055:18;20047:26;;20083:70;20150:1;20139:9;20135:17;20126:6;20083:70;:::i;:::-;20163:71;20230:2;20219:9;20215:18;20206:6;20163:71;:::i;:::-;20037:204;;;;;:::o;20247:99::-;20299:6;20333:5;20327:12;20317:22;;20306:40;;;:::o;20352:169::-;20436:11;20470:6;20465:3;20458:19;20510:4;20505:3;20501:14;20486:29;;20448:73;;;;:::o;20527:148::-;20629:11;20666:3;20651:18;;20641:34;;;;:::o;20681:246::-;20720:3;20739:19;20756:1;20739:19;:::i;:::-;20734:24;;20772:19;20789:1;20772:19;:::i;:::-;20767:24;;20869:1;20857:10;20853:18;20850:1;20847:25;20844:2;;;20875:18;;:::i;:::-;20844:2;20919:1;20916;20912:9;20905:16;;20724:203;;;;:::o;20933:262::-;20972:3;20991:19;21008:1;20991:19;:::i;:::-;20986:24;;21024:19;21041:1;21024:19;:::i;:::-;21019:24;;21137:1;21109:26;21105:34;21102:1;21099:41;21096:2;;;21143:18;;:::i;:::-;21096:2;21187:1;21184;21180:9;21173:16;;20976:219;;;;:::o;21201:182::-;21240:1;21257:19;21274:1;21257:19;:::i;:::-;21252:24;;21290:19;21307:1;21290:19;:::i;:::-;21285:24;;21328:1;21318:2;;21333:18;;:::i;:::-;21318:2;21375:1;21372;21368:9;21363:14;;21242:141;;;;:::o;21389:188::-;21428:4;21448:19;21465:1;21448:19;:::i;:::-;21443:24;;21481:19;21498:1;21481:19;:::i;:::-;21476:24;;21519:1;21516;21513:8;21510:2;;;21524:18;;:::i;:::-;21510:2;21569:1;21566;21562:9;21554:17;;21433:144;;;;:::o;21583:188::-;21622:4;21642:19;21659:1;21642:19;:::i;:::-;21637:24;;21675:19;21692:1;21675:19;:::i;:::-;21670:24;;21713:1;21710;21707:8;21704:2;;;21718:18;;:::i;:::-;21704:2;21763:1;21760;21756:9;21748:17;;21627:144;;;;:::o;21777:96::-;21814:7;21843:24;21861:5;21843:24;:::i;:::-;21832:35;;21822:51;;;:::o;21879:90::-;21913:7;21956:5;21949:13;21942:21;21931:32;;21921:48;;;:::o;21975:77::-;22012:7;22041:5;22030:16;;22020:32;;;:::o;22058:126::-;22095:7;22135:42;22128:5;22124:54;22113:65;;22103:81;;;:::o;22190:77::-;22227:7;22256:5;22245:16;;22235:32;;;:::o;22273:93::-;22309:7;22349:10;22342:5;22338:22;22327:33;;22317:49;;;:::o;22372:86::-;22407:7;22447:4;22440:5;22436:16;22425:27;;22415:43;;;:::o;22464:109::-;22500:7;22540:26;22533:5;22529:38;22518:49;;22508:65;;;:::o;22579:111::-;22628:9;22661:23;22678:5;22661:23;:::i;:::-;22648:36;;22638:52;;;:::o;22696:307::-;22764:1;22774:113;22788:6;22785:1;22782:13;22774:113;;;22873:1;22868:3;22864:11;22858:18;22854:1;22849:3;22845:11;22838:39;22810:2;22807:1;22803:10;22798:15;;22774:113;;;22905:6;22902:1;22899:13;22896:2;;;22985:1;22976:6;22971:3;22967:16;22960:27;22896:2;22745:258;;;;:::o;23009:233::-;23048:3;23071:24;23089:5;23071:24;:::i;:::-;23062:33;;23117:66;23110:5;23107:77;23104:2;;;23187:18;;:::i;:::-;23104:2;23234:1;23227:5;23223:13;23216:20;;23052:190;;;:::o;23248:79::-;23287:7;23316:5;23305:16;;23295:32;;;:::o;23333:180::-;23381:77;23378:1;23371:88;23478:4;23475:1;23468:15;23502:4;23499:1;23492:15;23519:180;23567:77;23564:1;23557:88;23664:4;23661:1;23654:15;23688:4;23685:1;23678:15;23705:102;23746:6;23797:2;23793:7;23788:2;23781:5;23777:14;23773:28;23763:38;;23753:54;;;:::o;23813:240::-;23953:34;23949:1;23941:6;23937:14;23930:58;24022:23;24017:2;24009:6;24005:15;23998:48;23919:134;:::o;24059:176::-;24199:28;24195:1;24187:6;24183:14;24176:52;24165:70;:::o;24241:214::-;24381:66;24377:1;24369:6;24365:14;24358:90;24347:108;:::o;24461:171::-;24601:23;24597:1;24589:6;24585:14;24578:47;24567:65;:::o;24638:230::-;24778:34;24774:1;24766:6;24762:14;24755:58;24847:13;24842:2;24834:6;24830:15;24823:38;24744:124;:::o;24874:232::-;25014:34;25010:1;25002:6;24998:14;24991:58;25083:15;25078:2;25070:6;25066:15;25059:40;24980:126;:::o;25112:182::-;25252:34;25248:1;25240:6;25236:14;25229:58;25218:76;:::o;25300:170::-;25440:22;25436:1;25428:6;25424:14;25417:46;25406:64;:::o;25476:175::-;25616:27;25612:1;25604:6;25600:14;25593:51;25582:69;:::o;25657:175::-;25797:27;25793:1;25785:6;25781:14;25774:51;25763:69;:::o;25838:122::-;25911:24;25929:5;25911:24;:::i;:::-;25904:5;25901:35;25891:2;;25950:1;25947;25940:12;25891:2;25881:79;:::o;25966:122::-;26039:24;26057:5;26039:24;:::i;:::-;26032:5;26029:35;26019:2;;26078:1;26075;26068:12;26019:2;26009:79;:::o;26094:122::-;26167:24;26185:5;26167:24;:::i;:::-;26160:5;26157:35;26147:2;;26206:1;26203;26196:12;26147:2;26137:79;:::o;26222:120::-;26294:23;26311:5;26294:23;:::i;:::-;26287:5;26284:34;26274:2;;26332:1;26329;26322:12;26274:2;26264:78;:::o;26348:118::-;26419:22;26435:5;26419:22;:::i;:::-;26412:5;26409:33;26399:2;;26456:1;26453;26446:12;26399:2;26389:77;:::o

Swarm Source

ipfs://83f7a00e989e916b7fcbb902d9221b6f7141afdfc931c10cd90d95008c08c890
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.