ETH Price: $3,106.93 (-0.36%)
Gas: 3 Gwei

Token

QANX Token (QANX)
 

Overview

Max Total Supply

3,333,333,000 QANX

Holders

5,625 ( 0.036%)

Market

Price

$0.05 @ 0.000015 ETH (+1.19%)

Onchain Market Cap

$158,295,817.50

Circulating Supply Market Cap

$80,727,505.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
6,596.011608066711095789 QANX

Value
$313.24 ( ~0.100819861459835 Eth) [0.0002%]
0xf3741d089e150e05ea9034debfaad2e98de05b8e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

QANplatform is the quantum-resistant Layer 1 hybrid blockchain platform that will allow developers and enterprises to build quantum-resistant: smart contract, DApp, DeFi, DAO, token, CBDC, NFT, Metaverse, and Web3 solutions on top of the QAN blockchain platform in any programming language.

Market

Volume (24H):$1,419,921.00
Market Capitalization:$80,727,505.00
Circulating Supply:1,700,000,000.00 QANX
Market Data Source: Coinmarketcap

 


# Exchange Pair Price  24H Volume % Volume
1
BingX
QANX-USDT$0.0479
0.0000154 Eth
$620,176.00
12,970,415.820 QANX
44.0068%
2
PancakeSwap (v2)
0XAAA9214F675316182EAA21C85F0CA99160CC3AAA-WBNB$0.0471
0.0000152 Eth
$257,246.00
5,241,446.626 0XAAA9214F675316182EAA21C85F0CA99160CC3AAA
17.7835%
3
Uniswap V3 (Ethereum)
0XAAA9214F675316182EAA21C85F0CA99160CC3AAA-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.0471
0.0000151 Eth
$212,517.00
4,408,050.244 0XAAA9214F675316182EAA21C85F0CA99160CC3AAA
14.9559%
4
Gate.io
QANX-USDT$0.0473
0.0000152 Eth
$163,844.00
3,389,160.192 QANX
11.4990%
5
BitMart
QANX-USDT$0.0474
0.0000153 Eth
$161,814.00
3,417,059.600 QANX
11.5936%
6
Bilaxy
QANX-BNB$0.0449
0.0000144 Eth
$18,663.84
415,978.000 QANX
1.4114%
7
Matcha (Ethereum)
0XAAA9214F675316182EAA21C85F0CA99160CC3AAA-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.0505
0.0000171 Eth
$1,205.72
23,875.000 0XAAA9214F675316182EAA21C85F0CA99160CC3AAA
0.0810%
8
Pancakeswap V3 (BSC)
0XAAA9214F675316182EAA21C85F0CA99160CC3AAA-0XBB4CDB9CBD36B01BD1CBAEBF2DE08D9173BC095C$0.0471
0.0000151 Eth
$959.18
19,613.674 0XAAA9214F675316182EAA21C85F0CA99160CC3AAA
0.0665%
9
Uniswap V3 (Ethereum)
0XAAA9214F675316182EAA21C85F0CA99160CC3AAA-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.0482
0.0000155 Eth
$194.20
4,008.735 0XAAA9214F675316182EAA21C85F0CA99160CC3AAA
0.0136%

Contract Source Code Verified (Exact Match)

Contract Name:
QANX

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 5 of 5: QANX.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

import "./ERC20.sol";
///////////////////////////////////////////////
// QANX STARTS HERE, OPENZEPPELIN CODE ABOVE //
///////////////////////////////////////////////

contract QANX is ERC20 {

    /// @notice Represents a lock which might be applied on an address
    /// @dev Lock logic is described in the _applyLock() method
    struct Lock {
        uint256 tokenAmount;    /// How many tokens are locked
        uint256 unlockPerSec;   /// How many tokens are unlockable each sec from hl -> sl
        uint64 hardLockUntil;   /// Until when no locked tokens can be accessed
        uint64 softLockUntil;   /// Until when locked tokens can be gradually released
        uint64 lastUnlock;      /// Last gradual unlock time (softlock period)
        uint64 allowedHops;     /// How many transfers left with same lock params
    }

    /// @notice Cheque signer address
    /// @dev This is compared against a recovered secp256k1 signature
    address private chequeSigner;

    /// @notice This maps used cheques so they can not be encashed twice
    /// @dev Ensures that every unique cheque paramset can be encashed once
    mapping (bytes32 => bool) private chequesEncashed;

    /// @notice This maps lock params to certain addresses which received locked tokens
    /// @dev Lookup table for locks assigned to specific addresses
    mapping (address => Lock) private _locks;    

    /// @notice Emitted when a lock is applied on an account
    /// @dev The first param is indexed which makes it easy to listen to locks applied to a specific account
    event LockApplied(address indexed account, uint256 amount, uint64 hardLockUntil, uint64 softLockUntil, uint64 allowedHops);

    /// @notice Emitted when a lock is removed from an account
    /// @dev The account param is indexed which makes it easy to listen to locks getting removed from a specific account
    event LockRemoved(address indexed account);

    /// @notice Emitted when a lock amount is decreased on an account
    /// @dev The first param is indexed which makes it easy to listen to locked amount getting decreased on a specific account
    event LockDecreased(address indexed account, uint256 amount);

    /// @notice Emitted when a the permitted cheque signer address is changed
    /// @dev This will be new address the ecrecover result is compared against
    event ChequeSignerUpdated(address signer);

    /// @notice Initialize an erc20 token based on the openzeppelin version
    /// @dev Sets the initial cheque signer to the deployer address and mints total supply to the contract itself
    constructor() ERC20("QANX Token", "QANX") {

        // Assign deployer as cheque signer initially
        chequeSigner = msg.sender;

        // Initially mint total supply to contract itself
        _mint(address(this), 3_333_333_000 * 1e18);
    }

    /// @notice Refuse any kind of payment to the contract
    /// @dev This is the implicit default behavior, it just exists for verbosity
    receive() external payable {
        revert();
    }

    /// @notice Refuse any kind of payment to the contract
    /// @dev This is the implicit default behavior, it just exists for verbosity
    fallback() external payable {
        revert();
    }

    /// @notice Ability to update cheque signer
    /// @dev Make sure to externally double check the new cheque signer address!
    /// @param _newChequeSigner The address which new cheque signatures will be compared against from now
    function setChequeSigner(address _newChequeSigner) external {
        require(msg.sender == chequeSigner && _newChequeSigner != address(0), "Invalid cheque signer");
        chequeSigner = _newChequeSigner;
        emit ChequeSignerUpdated(chequeSigner);
    }

    /// @notice Method to encash a received cheque
    /// @dev Ability to encash offline signed cheques using on-chain signature verification.
    /// Please note that cheques are expected to be one cheque per address, so using CID as
    /// a nonce is intentional and works as designed.
    /// @param beneficiary The address which will receive the tokens
    /// @param amount The amount of tokens the beneficiary will receive
    /// @param hardLockUntil The UNIX timestamp until which the tokens are not transferable
    /// @param softLockUntil The UNIX timestamp until which the tokens are gradually unlockable
    /// @param allowedHops How many times the locked tokens can be transferred further
    /// @param signature The secp256k1 signature of CID as per EIP-2098 (r + _vs)
    function encashCheque(address beneficiary, uint256 amount, uint64 hardLockUntil, uint64 softLockUntil, uint64 allowedHops, bytes32[2] calldata signature) external {

        // Calculate cheque id
        bytes32 cid = keccak256(abi.encode(block.chainid, address(this), beneficiary, amount, hardLockUntil, softLockUntil, allowedHops));

        // Verify cheque signature
        require(verifyChequeSignature(cid, signature), "Cheque signature is invalid!");

        // Make sure this cheque was not encashed before
        require(!chequesEncashed[cid], "This cheque was encashed already!");

        // Mark cheque as encashed
        chequesEncashed[cid] = true;
        
        // If any lock related params were defined as non-zero
        if (hardLockUntil > 0) {

            // Encash through a locked transfer
            _transferLocked(address(this), beneficiary, amount, hardLockUntil, softLockUntil, allowedHops);
            return;
        }

        // Otherwise encash using a normal transfer
        _transfer(address(this), beneficiary, amount);
    }

    /// @notice Transfer function with lock parameters
    /// @dev Wraps the _transferLocked internal method
    /// @param recipient The address whose locked balance will be credited
    /// @param amount The amount which will be credited to the recipient address
    /// @param hardLockUntil The UNIX timestamp until which the tokens are not transferable
    /// @param softLockUntil The UNIX timestamp until which the tokens are gradually unlockable
    /// @param allowedHops How many times the locked tokens can be transferred further
    /// @return Success
    function transferLocked(address recipient, uint256 amount, uint64 hardLockUntil, uint64 softLockUntil, uint64 allowedHops) external returns (bool) {
        _transferLocked(_msgSender(), recipient, amount, hardLockUntil, softLockUntil, allowedHops);
        return true;
    }

    /// @notice Transferfrom function with lock parameters
    /// @dev Wraps the _transferLocked internal method
    /// @param sender The address whose balance will be debited
    /// @param recipient The address whose locked balance will be credited
    /// @param amount The amount which will be credited to the recipient address
    /// @param hardLockUntil The UNIX timestamp until which the tokens are not transferable
    /// @param softLockUntil The UNIX timestamp until which the tokens are gradually unlockable
    /// @param allowedHops How many times the locked tokens can be transferred further
    /// @return Success
    function transferFromLocked(address sender, address recipient, uint256 amount, uint64 hardLockUntil, uint64 softLockUntil, uint64 allowedHops) external returns (bool) {

        // Query current allowance of spender
        uint256 currentAllowance = _allowances[sender][_msgSender()];

        // If the allowance is not unlimited
        if (currentAllowance != type(uint256).max) {

            // Ensure sufficient allowance and decrease it by current amount
            require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
            unchecked {
                _approve(sender, _msgSender(), currentAllowance - amount);
            }
        }

        // Perform locked transfer
        _transferLocked(sender, recipient, amount, hardLockUntil, softLockUntil, allowedHops);
        return true;
    }

    /// @notice Unlocks all unlockable tokens of a particular account
    /// @dev Calculates the unlockable amount based on the private _locks mapping
    /// @param account The address whose tokens should be unlocked
    /// @return Success
    function unlock(address account) external returns (bool) {

        // Lookup lock
        Lock storage lock = _locks[account];

        // Calculate unlockable balance
        uint256 unlockable = unlockableBalanceOf(account);

        // Only addresses owning locked tokens and bypassed hardlock time are unlockable
        require(unlockable > 0 && lock.tokenAmount > 0, "No unlockable tokens!");

        // Set last unlock time, deduct from locked balance & credit to regular balance
        lock.lastUnlock = uint64(block.timestamp);
        lock.tokenAmount = lock.tokenAmount - unlockable;
        _balances[account] += unlockable;

        // If no more locked tokens left, remove lock object from address
        if(lock.tokenAmount == 0){
            delete _locks[account];
            emit LockRemoved(account);
        }

        // Unlock successful
        emit LockDecreased(account, unlockable);
        return true;
    }

    /// @notice Returns the locked token balance of a particular account
    /// @dev Reads the private _locks mapping to return data
    /// @param account The address whose locked balance should be read
    /// @return The number of locked tokens owned by the account
    function lockedBalanceOf(address account) external view returns (uint256) {
        return _locks[account].tokenAmount;
    }

    /// @notice Returns the unlocked token balance of a particular account
    /// @dev Reads the internal _balances mapping to return data
    /// @param account The address whose unlocked balance should be read
    /// @return The number of unlocked tokens owned by the account
    function unlockedBalanceOf(address account) external view returns (uint256) {
        return _balances[account];
    }

    /// @notice Returns lock information of a given address
    /// @dev Reads a whole entry of the private _locks mapping to return data
    /// @param account The address whose lock object should be read
    /// @return The lock object of the particular account
    function lockOf(address account) external view returns (Lock memory) {
        return _locks[account];
    }

    /// @notice Return the balance of unlocked and locked tokens combined
    /// @dev This overrides the OZ version for combined output
    /// @param account The address whose total balance is looked up
    /// @return The combined (unlocked + locked) balance of the particular account
    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account] + _locks[account].tokenAmount;
    }

    /// @notice Calculates the number of unlockable tokens of a particular account
    /// @dev Dynamically calculates unlockable balance based on current block timestamp
    /// @param account The address whose unlockable balance is calculated
    /// @return The amount of tokens which can be unlocked at the current block timestamp
    function unlockableBalanceOf(address account) public view returns (uint256) {

        // Lookup lock
        Lock memory lock = _locks[account];

        // If the hardlock has not passed yet, there are no unlockable tokens
        if(block.timestamp < lock.hardLockUntil) {
            return 0;
        }

        // If the softlock period passed, all currently tokens are unlockable
        if(block.timestamp > lock.softLockUntil) {
            return lock.tokenAmount;
        }

        // Otherwise the proportional amount is unlockable
        uint256 unlockable = (block.timestamp - lock.lastUnlock) * lock.unlockPerSec;
        return lock.tokenAmount < unlockable ? lock.tokenAmount : unlockable;
    }

    /// @dev Abstract method to execute locked transfers
    /// @param sender The address whose balance will be debited
    /// @param recipient The address whose locked balance will be credited
    /// @param amount The amount which will be credited to the recipient address
    /// @param hardLockUntil The UNIX timestamp until which the tokens are not transferable
    /// @param softLockUntil The UNIX timestamp until which the tokens are gradually unlockable
    /// @param allowedHops How many times the locked tokens can be transferred further
    /// @return Success
    function _transferLocked(address sender, address recipient, uint256 amount, uint64 hardLockUntil, uint64 softLockUntil, uint64 allowedHops) internal returns (bool) {

        // Perform zero address validation
        require(recipient != address(0), "ERC20: transfer to the zero address");

        // Lookup sender balance
        uint256 sBalance = _balances[sender];

        // Lookup lock of sender and recipient
        Lock storage rLock = _locks[recipient];
        Lock storage sLock = _locks[sender];

        // Only a single set of lock parameters allowed per recipient
        if (rLock.tokenAmount > 0){
            require(
                hardLockUntil == rLock.hardLockUntil &&
                softLockUntil == rLock.softLockUntil &&
                allowedHops == rLock.allowedHops
            , "Only one lock params per address allowed!");
        }

        // Sender must have enough tokens (unlocked + locked balance combined)
        require(sBalance + sLock.tokenAmount >= amount, "Transfer amount exceeds balance");

        // If sender has enough unlocked balance, then lock params can be chosen
        if(sBalance >= amount){

            // Deduct sender balance
            unchecked {
                _balances[sender] = sBalance - amount;
            }

            // Apply lock
            return _applyLock(sender, recipient, amount, hardLockUntil, softLockUntil, allowedHops);
        }

        // Otherwise require that the chosen lock params are same / stricter (allowedhops) than the sender's
        require(
            hardLockUntil >= sLock.hardLockUntil && 
            softLockUntil >= sLock.softLockUntil && 
            allowedHops < sLock.allowedHops
            , "Only same / stricter lock params allowed!"
        );

        // If sender has enough locked balance
        if(sLock.tokenAmount >= amount){

            // Decrease locked balance of sender
            unchecked {
                sLock.tokenAmount = sLock.tokenAmount - amount;
            }

            // Apply lock
            return _applyLock(sender, recipient, amount, hardLockUntil, softLockUntil, allowedHops);
        }

        // If no conditions were met so far, deduct from the unlocked balance
        unchecked {
            _balances[sender] = sBalance - (amount - sLock.tokenAmount);
        }

        // Then spend locked balance of sender first
        sLock.tokenAmount = 0;

        // Apply lock
        return _applyLock(sender, recipient, amount, hardLockUntil, softLockUntil, allowedHops);
    }

    /// @notice Applies lock to recipient with specified params and emits a transfer event
    /// @param sender The address whose balance will be debited
    /// @param recipient The address whose locked balance will be credited
    /// @param amount The amount which will be credited to the recipient address
    /// @param hardLockUntil The UNIX timestamp until which the tokens are not transferable
    /// @param softLockUntil The UNIX timestamp until which the tokens are gradually unlockable
    /// @param allowedHops How many times the locked tokens can be transferred further
    /// @return Success
    function _applyLock(address sender, address recipient, uint256 amount, uint64 hardLockUntil, uint64 softLockUntil, uint64 allowedHops) private returns (bool) {

        // Make sure that softlock is not before hardlock
        require(softLockUntil >= hardLockUntil, "SoftLock must be >= HardLock!");

        // Make sure that hardlock is in the future
        require(hardLockUntil >= block.timestamp, "HardLock must be in the future!");

        // Make sure that the amount is increased if a lock already exists
        uint256 totalAmount;
        uint256 lockSeconds;
        uint256 unlockPerSec;
        unchecked {
            totalAmount = _locks[recipient].tokenAmount + amount;
            lockSeconds = softLockUntil - hardLockUntil;
            unlockPerSec = lockSeconds > 0 ? totalAmount / lockSeconds : 0;
        }

        // Apply lock, emit transfer event
        _locks[recipient] = Lock({
            tokenAmount: totalAmount,
            unlockPerSec: unlockPerSec,
            hardLockUntil: hardLockUntil,
            softLockUntil: softLockUntil,
            lastUnlock: hardLockUntil,
            allowedHops: allowedHops
        });
        emit LockApplied(recipient, totalAmount, hardLockUntil, softLockUntil, allowedHops);
        emit Transfer(sender, recipient, amount);
        return true;
    }

    /// @notice Method to verify cheque signature
    /// @dev This verifies a compact secp256k1 signature as per EIP-2098
    /// @param cid The Cheque ID which is calculated deterministically based on cheque params
    /// @param signature The EIP-2098 signature which was created offline by the permitted chequeSigner
    /// @return Whether the recovered signer address matches the permitted chequeSigner
    function verifyChequeSignature(bytes32 cid, bytes32[2] memory signature) private view returns (bool) {

        // Determine s and v from vs (signature[1])
        bytes32 s = signature[1] & bytes32(0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
        uint8 v = uint8((uint256(signature[1]) >> 255) + 27);

        // Ensure valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return false;
        }

        // Recover & verify signer identity related to amount
        return ecrecover(cid, v, signature[0], s) == chequeSigner;
    }
}

File 1 of 5: Context.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

/**
 * @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 2 of 5: ERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

import "./IERC20Metadata.sol";
import "./Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) internal _balances;

    mapping(address => mapping(address => uint256)) internal _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() external view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() external view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() external view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) external view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) external virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) external virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 3 of 5: IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

File 4 of 5: IERC20Metadata.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":false,"internalType":"address","name":"signer","type":"address"}],"name":"ChequeSignerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"hardLockUntil","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"softLockUntil","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"allowedHops","type":"uint64"}],"name":"LockApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LockDecreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockRemoved","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"owner","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":"amount","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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"hardLockUntil","type":"uint64"},{"internalType":"uint64","name":"softLockUntil","type":"uint64"},{"internalType":"uint64","name":"allowedHops","type":"uint64"},{"internalType":"bytes32[2]","name":"signature","type":"bytes32[2]"}],"name":"encashCheque","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"lockOf","outputs":[{"components":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"unlockPerSec","type":"uint256"},{"internalType":"uint64","name":"hardLockUntil","type":"uint64"},{"internalType":"uint64","name":"softLockUntil","type":"uint64"},{"internalType":"uint64","name":"lastUnlock","type":"uint64"},{"internalType":"uint64","name":"allowedHops","type":"uint64"}],"internalType":"struct QANX.Lock","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"lockedBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newChequeSigner","type":"address"}],"name":"setChequeSigner","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"hardLockUntil","type":"uint64"},{"internalType":"uint64","name":"softLockUntil","type":"uint64"},{"internalType":"uint64","name":"allowedHops","type":"uint64"}],"name":"transferFromLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"hardLockUntil","type":"uint64"},{"internalType":"uint64","name":"softLockUntil","type":"uint64"},{"internalType":"uint64","name":"allowedHops","type":"uint64"}],"name":"transferLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unlockableBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unlockedBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f51414e5820546f6b656e000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f51414e580000000000000000000000000000000000000000000000000000000081525081600390816200008f9190620004fa565b508060049081620000a19190620004fa565b50505033600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000103306b0ac544b802c91c33bb2000006200010960201b60201c565b620006fc565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200017b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001729062000642565b60405180910390fd5b6200018f600083836200027660201b60201c565b8060026000828254620001a3919062000693565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002569190620006df565b60405180910390a362000272600083836200027b60201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200030257607f821691505b602082108103620003185762000317620002ba565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000343565b6200038e868362000343565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003db620003d5620003cf84620003a6565b620003b0565b620003a6565b9050919050565b6000819050919050565b620003f783620003ba565b6200040f6200040682620003e2565b84845462000350565b825550505050565b600090565b6200042662000417565b62000433818484620003ec565b505050565b5b818110156200045b576200044f6000826200041c565b60018101905062000439565b5050565b601f821115620004aa5762000474816200031e565b6200047f8462000333565b810160208510156200048f578190505b620004a76200049e8562000333565b83018262000438565b50505b505050565b600082821c905092915050565b6000620004cf60001984600802620004af565b1980831691505092915050565b6000620004ea8383620004bc565b9150826002028217905092915050565b620005058262000280565b67ffffffffffffffff8111156200052157620005206200028b565b5b6200052d8254620002e9565b6200053a8282856200045f565b600060209050601f8311600181146200057257600084156200055d578287015190505b620005698582620004dc565b865550620005d9565b601f19841662000582866200031e565b60005b82811015620005ac5784890151825560018201915060208501945060208101905062000585565b86831015620005cc5784890151620005c8601f891682620004bc565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200062a601f83620005e1565b91506200063782620005f2565b602082019050919050565b600060208201905081810360008301526200065d816200061b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620006a082620003a6565b9150620006ad83620003a6565b9250828201905080821115620006c857620006c762000664565b5b92915050565b620006d981620003a6565b82525050565b6000602082019050620006f66000830184620006ce565b92915050565b6132ff806200070c6000396000f3fe6080604052600436106101235760003560e01c806370a08231116100a0578063a9059cbb11610064578063a9059cbb14610469578063dd62ed3e146104a6578063eb20c5bc146104e3578063eb8454fd14610520578063ee01698e146105495761012d565b806370a082311461034a578063740499ab1461038757806384955c88146103c457806395d89b4114610401578063a457c2d71461042c5761012d565b8063313ce567116100e7578063313ce5671461023f578063395093511461026a57806359355736146102a7578063599d866e146102e45780635a46d3b51461030d5761012d565b806306fdde0314610132578063095ea7b31461015d57806318160ddd1461019a57806323b872dd146101c55780632f6c493c146102025761012d565b3661012d57600080fd5b600080fd5b34801561013e57600080fd5b50610147610586565b604051610154919061223d565b60405180910390f35b34801561016957600080fd5b50610184600480360381019061017f91906122f8565b610618565b6040516101919190612353565b60405180910390f35b3480156101a657600080fd5b506101af61063b565b6040516101bc919061237d565b60405180910390f35b3480156101d157600080fd5b506101ec60048036038101906101e79190612398565b610645565b6040516101f99190612353565b60405180910390f35b34801561020e57600080fd5b50610229600480360381019061022491906123eb565b610674565b6040516102369190612353565b60405180910390f35b34801561024b57600080fd5b50610254610917565b6040516102619190612434565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c91906122f8565b610920565b60405161029e9190612353565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c991906123eb565b610957565b6040516102db919061237d565b60405180910390f35b3480156102f057600080fd5b5061030b600480360381019061030691906124b6565b6109a3565b005b34801561031957600080fd5b50610334600480360381019061032f91906123eb565b610b24565b60405161034191906125dc565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c91906123eb565b610c59565b60405161037e919061237d565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a991906123eb565b610cee565b6040516103bb919061237d565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906123eb565b610eaa565b6040516103f8919061237d565b60405180910390f35b34801561040d57600080fd5b50610416610ef2565b604051610423919061223d565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906122f8565b610f84565b6040516104609190612353565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b91906122f8565b610ffb565b60405161049d9190612353565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c891906125f7565b61101e565b6040516104da919061237d565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190612637565b6110a5565b6040516105179190612353565b60405180910390f35b34801561052c57600080fd5b50610547600480360381019061054291906123eb565b6111cb565b005b34801561055557600080fd5b50610570600480360381019061056b91906126c4565b611331565b60405161057d9190612353565b60405180910390f35b6060600380546105959061276e565b80601f01602080910402602001604051908101604052809291908181526020018280546105c19061276e565b801561060e5780601f106105e35761010080835404028352916020019161060e565b820191906000526020600020905b8154815290600101906020018083116105f157829003601f168201915b5050505050905090565b600080610623611356565b905061063081858561135e565b600191505092915050565b6000600254905090565b600080610650611356565b905061065d858285611527565b6106688585856115b3565b60019150509392505050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006106c384610cee565b90506000811180156106d9575060008260000154115b610718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070f906127eb565b60405180910390fd5b428260020160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550808260000154610753919061283a565b8260000181905550806000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107a9919061286e565b9250508190555060008260000154036108be57600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff02191690556002820160106101000a81549067ffffffffffffffff02191690556002820160186101000a81549067ffffffffffffffff021916905550508373ffffffffffffffffffffffffffffffffffffffff167f064f67e76df103eb3e142dac6110a06fcfc7a01ef2da651312b88eb6f0dd3d2860405160405180910390a25b8373ffffffffffffffffffffffffffffffffffffffff167f9c12b285834f9d1e649ea976a1e52e28e1f970147ba4ce1ffea1750195c225db82604051610904919061237d565b60405180910390a2600192505050919050565b60006012905090565b60008061092b611356565b905061094c81858561093d858961101e565b610947919061286e565b61135e565b600191505092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000463088888888886040516020016109c297969594939291906128c0565b604051602081830303815290604052805190602001209050610a1b81836002806020026040519081016040528092919082600260200280828437600081840152601f19601f820116905080830192505050505050611829565b610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a519061297b565b60405180910390fd5b6006600082815260200190815260200160002060009054906101000a900460ff1615610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab290612a0d565b60405180910390fd5b60016006600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060008567ffffffffffffffff161115610b0f57610b08308888888888611994565b5050610b1c565b610b1a3088886115b3565b505b505050505050565b610b2c61214f565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ce7919061286e565b9050919050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050806040015167ffffffffffffffff16421015610e39576000915050610ea5565b806060015167ffffffffffffffff16421115610e5c578060000151915050610ea5565b60008160200151826080015167ffffffffffffffff1642610e7d919061283a565b610e879190612a2d565b905080826000015110610e9a5780610ea0565b81600001515b925050505b919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060048054610f019061276e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2d9061276e565b8015610f7a5780601f10610f4f57610100808354040283529160200191610f7a565b820191906000526020600020905b815481529060010190602001808311610f5d57829003601f168201915b5050505050905090565b600080610f8f611356565b90506000610f9d828661101e565b905083811015610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd990612ae1565b60405180910390fd5b610fef828686840361135e565b60019250505092915050565b600080611006611356565b90506110138185856115b3565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006110f1611356565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111ad5785811015611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90612b73565b60405180910390fd5b6111ac886111a4611356565b88840361135e565b5b6111bb888888888888611994565b5060019150509695505050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480156112555750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90612bdf565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f0b35050b9a10c7ebfedf47e208eb4167e1386112072928c5842a60e2297140d6600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516113269190612bff565b60405180910390a150565b600061134861133e611356565b8787878787611994565b506001905095945050505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c490612c8c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390612d1e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161151a919061237d565b60405180910390a3505050565b6000611533848461101e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115ad578181101561159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690612d8a565b60405180910390fd5b6115ac848484840361135e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990612e1c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890612eae565b60405180910390fd5b61169c838383611df0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171990612f40565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611810919061237d565b60405180910390a3611823848484611df5565b50505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b8360016002811061186457611863612f60565b5b60200201511690506000601b60ff8560016002811061188657611885612f60565b5b602002015160001c901c61189a919061286e565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156118d25760009250505061198e565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600186838760006002811061192357611922612f60565b5b602002015186604051600081526020016040526040516119469493929190612fa8565b6020604051602081039080840390855afa158015611968573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614925050505b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb90612eae565b60405180910390fd5b60008060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600001541115611bb7578160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168767ffffffffffffffff16148015611b4057508160020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff168667ffffffffffffffff16145b8015611b7757508160020160189054906101000a900467ffffffffffffffff1667ffffffffffffffff168567ffffffffffffffff16145b611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad9061305f565b60405180910390fd5b5b87816000015484611bc8919061286e565b1015611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c00906130cb565b60405180910390fd5b878310611c6d578783036000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c638a8a8a8a8a8a611dfa565b9350505050611de6565b8060020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168767ffffffffffffffff1610158015611cd557508060020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff168667ffffffffffffffff1610155b8015611d0c57508060020160189054906101000a900467ffffffffffffffff1667ffffffffffffffff168567ffffffffffffffff16105b611d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d429061315d565b60405180910390fd5b87816000015410611d7d57878160000154038160000181905550611d738a8a8a8a8a8a611dfa565b9350505050611de6565b8060000154880383036000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008160000181905550611de08a8a8a8a8a8a611dfa565b93505050505b9695505050505050565b505050565b505050565b60008367ffffffffffffffff168367ffffffffffffffff161015611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a906131c9565b60405180910390fd5b428467ffffffffffffffff161015611ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9790613235565b60405180910390fd5b600080600087600760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015401925086860367ffffffffffffffff16915060008211611f0a576000611f1c565b818381611f1a57611f19613255565b5b045b90506040518060c001604052808481526020018281526020018867ffffffffffffffff1681526020018767ffffffffffffffff1681526020018867ffffffffffffffff1681526020018667ffffffffffffffff16815250600760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160020160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050508873ffffffffffffffffffffffffffffffffffffffff167f74e0938598868b4c1e871f3cff0292e8399ee8cc53264926f8956ef711f7bc37848989896040516120d19493929190613284565b60405180910390a28873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a604051612136919061237d565b60405180910390a3600193505050509695505050505050565b6040518060c001604052806000815260200160008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156121e75780820151818401526020810190506121cc565b60008484015250505050565b6000601f19601f8301169050919050565b600061220f826121ad565b61221981856121b8565b93506122298185602086016121c9565b612232816121f3565b840191505092915050565b600060208201905081810360008301526122578184612204565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061228f82612264565b9050919050565b61229f81612284565b81146122aa57600080fd5b50565b6000813590506122bc81612296565b92915050565b6000819050919050565b6122d5816122c2565b81146122e057600080fd5b50565b6000813590506122f2816122cc565b92915050565b6000806040838503121561230f5761230e61225f565b5b600061231d858286016122ad565b925050602061232e858286016122e3565b9150509250929050565b60008115159050919050565b61234d81612338565b82525050565b60006020820190506123686000830184612344565b92915050565b612377816122c2565b82525050565b6000602082019050612392600083018461236e565b92915050565b6000806000606084860312156123b1576123b061225f565b5b60006123bf868287016122ad565b93505060206123d0868287016122ad565b92505060406123e1868287016122e3565b9150509250925092565b6000602082840312156124015761240061225f565b5b600061240f848285016122ad565b91505092915050565b600060ff82169050919050565b61242e81612418565b82525050565b60006020820190506124496000830184612425565b92915050565b600067ffffffffffffffff82169050919050565b61246c8161244f565b811461247757600080fd5b50565b60008135905061248981612463565b92915050565b600080fd5b6000819050826020600202820111156124b0576124af61248f565b5b92915050565b60008060008060008060e087890312156124d3576124d261225f565b5b60006124e189828a016122ad565b96505060206124f289828a016122e3565b955050604061250389828a0161247a565b945050606061251489828a0161247a565b935050608061252589828a0161247a565b92505060a061253689828a01612494565b9150509295509295509295565b61254c816122c2565b82525050565b61255b8161244f565b82525050565b60c0820160008201516125776000850182612543565b50602082015161258a6020850182612543565b50604082015161259d6040850182612552565b5060608201516125b06060850182612552565b5060808201516125c36080850182612552565b5060a08201516125d660a0850182612552565b50505050565b600060c0820190506125f16000830184612561565b92915050565b6000806040838503121561260e5761260d61225f565b5b600061261c858286016122ad565b925050602061262d858286016122ad565b9150509250929050565b60008060008060008060c087890312156126545761265361225f565b5b600061266289828a016122ad565b965050602061267389828a016122ad565b955050604061268489828a016122e3565b945050606061269589828a0161247a565b93505060806126a689828a0161247a565b92505060a06126b789828a0161247a565b9150509295509295509295565b600080600080600060a086880312156126e0576126df61225f565b5b60006126ee888289016122ad565b95505060206126ff888289016122e3565b94505060406127108882890161247a565b93505060606127218882890161247a565b92505060806127328882890161247a565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061278657607f821691505b6020821081036127995761279861273f565b5b50919050565b7f4e6f20756e6c6f636b61626c6520746f6b656e73210000000000000000000000600082015250565b60006127d56015836121b8565b91506127e08261279f565b602082019050919050565b60006020820190508181036000830152612804816127c8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612845826122c2565b9150612850836122c2565b92508282039050818111156128685761286761280b565b5b92915050565b6000612879826122c2565b9150612884836122c2565b925082820190508082111561289c5761289b61280b565b5b92915050565b6128ab81612284565b82525050565b6128ba8161244f565b82525050565b600060e0820190506128d5600083018a61236e565b6128e260208301896128a2565b6128ef60408301886128a2565b6128fc606083018761236e565b61290960808301866128b1565b61291660a08301856128b1565b61292360c08301846128b1565b98975050505050505050565b7f436865717565207369676e617475726520697320696e76616c69642100000000600082015250565b6000612965601c836121b8565b91506129708261292f565b602082019050919050565b6000602082019050818103600083015261299481612958565b9050919050565b7f54686973206368657175652077617320656e63617368656420616c726561647960008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b60006129f76021836121b8565b9150612a028261299b565b604082019050919050565b60006020820190508181036000830152612a26816129ea565b9050919050565b6000612a38826122c2565b9150612a43836122c2565b9250828202612a51816122c2565b91508282048414831517612a6857612a6761280b565b5b5092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612acb6025836121b8565b9150612ad682612a6f565b604082019050919050565b60006020820190508181036000830152612afa81612abe565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612b5d6028836121b8565b9150612b6882612b01565b604082019050919050565b60006020820190508181036000830152612b8c81612b50565b9050919050565b7f496e76616c696420636865717565207369676e65720000000000000000000000600082015250565b6000612bc96015836121b8565b9150612bd482612b93565b602082019050919050565b60006020820190508181036000830152612bf881612bbc565b9050919050565b6000602082019050612c1460008301846128a2565b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612c766024836121b8565b9150612c8182612c1a565b604082019050919050565b60006020820190508181036000830152612ca581612c69565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d086022836121b8565b9150612d1382612cac565b604082019050919050565b60006020820190508181036000830152612d3781612cfb565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612d74601d836121b8565b9150612d7f82612d3e565b602082019050919050565b60006020820190508181036000830152612da381612d67565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612e066025836121b8565b9150612e1182612daa565b604082019050919050565b60006020820190508181036000830152612e3581612df9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612e986023836121b8565b9150612ea382612e3c565b604082019050919050565b60006020820190508181036000830152612ec781612e8b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612f2a6026836121b8565b9150612f3582612ece565b604082019050919050565b60006020820190508181036000830152612f5981612f1d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b612fa281612f8f565b82525050565b6000608082019050612fbd6000830187612f99565b612fca6020830186612425565b612fd76040830185612f99565b612fe46060830184612f99565b95945050505050565b7f4f6e6c79206f6e65206c6f636b20706172616d7320706572206164647265737360008201527f20616c6c6f776564210000000000000000000000000000000000000000000000602082015250565b60006130496029836121b8565b915061305482612fed565b604082019050919050565b600060208201905081810360008301526130788161303c565b9050919050565b7f5472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b60006130b5601f836121b8565b91506130c08261307f565b602082019050919050565b600060208201905081810360008301526130e4816130a8565b9050919050565b7f4f6e6c792073616d65202f207374726963746572206c6f636b20706172616d7360008201527f20616c6c6f776564210000000000000000000000000000000000000000000000602082015250565b60006131476029836121b8565b9150613152826130eb565b604082019050919050565b600060208201905081810360008301526131768161313a565b9050919050565b7f536f66744c6f636b206d757374206265203e3d20486172644c6f636b21000000600082015250565b60006131b3601d836121b8565b91506131be8261317d565b602082019050919050565b600060208201905081810360008301526131e2816131a6565b9050919050565b7f486172644c6f636b206d75737420626520696e20746865206675747572652100600082015250565b600061321f601f836121b8565b915061322a826131e9565b602082019050919050565b6000602082019050818103600083015261324e81613212565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000608082019050613299600083018761236e565b6132a660208301866128b1565b6132b360408301856128b1565b6132c060608301846128b1565b9594505050505056fea2646970667358221220102d244c79e4fc94e8b0ed396a2709d169a12a4e469a341c29590c69b4ee8d3664736f6c63430008110033

Deployed Bytecode

0x6080604052600436106101235760003560e01c806370a08231116100a0578063a9059cbb11610064578063a9059cbb14610469578063dd62ed3e146104a6578063eb20c5bc146104e3578063eb8454fd14610520578063ee01698e146105495761012d565b806370a082311461034a578063740499ab1461038757806384955c88146103c457806395d89b4114610401578063a457c2d71461042c5761012d565b8063313ce567116100e7578063313ce5671461023f578063395093511461026a57806359355736146102a7578063599d866e146102e45780635a46d3b51461030d5761012d565b806306fdde0314610132578063095ea7b31461015d57806318160ddd1461019a57806323b872dd146101c55780632f6c493c146102025761012d565b3661012d57600080fd5b600080fd5b34801561013e57600080fd5b50610147610586565b604051610154919061223d565b60405180910390f35b34801561016957600080fd5b50610184600480360381019061017f91906122f8565b610618565b6040516101919190612353565b60405180910390f35b3480156101a657600080fd5b506101af61063b565b6040516101bc919061237d565b60405180910390f35b3480156101d157600080fd5b506101ec60048036038101906101e79190612398565b610645565b6040516101f99190612353565b60405180910390f35b34801561020e57600080fd5b50610229600480360381019061022491906123eb565b610674565b6040516102369190612353565b60405180910390f35b34801561024b57600080fd5b50610254610917565b6040516102619190612434565b60405180910390f35b34801561027657600080fd5b50610291600480360381019061028c91906122f8565b610920565b60405161029e9190612353565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c991906123eb565b610957565b6040516102db919061237d565b60405180910390f35b3480156102f057600080fd5b5061030b600480360381019061030691906124b6565b6109a3565b005b34801561031957600080fd5b50610334600480360381019061032f91906123eb565b610b24565b60405161034191906125dc565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c91906123eb565b610c59565b60405161037e919061237d565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a991906123eb565b610cee565b6040516103bb919061237d565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906123eb565b610eaa565b6040516103f8919061237d565b60405180910390f35b34801561040d57600080fd5b50610416610ef2565b604051610423919061223d565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906122f8565b610f84565b6040516104609190612353565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b91906122f8565b610ffb565b60405161049d9190612353565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c891906125f7565b61101e565b6040516104da919061237d565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190612637565b6110a5565b6040516105179190612353565b60405180910390f35b34801561052c57600080fd5b50610547600480360381019061054291906123eb565b6111cb565b005b34801561055557600080fd5b50610570600480360381019061056b91906126c4565b611331565b60405161057d9190612353565b60405180910390f35b6060600380546105959061276e565b80601f01602080910402602001604051908101604052809291908181526020018280546105c19061276e565b801561060e5780601f106105e35761010080835404028352916020019161060e565b820191906000526020600020905b8154815290600101906020018083116105f157829003601f168201915b5050505050905090565b600080610623611356565b905061063081858561135e565b600191505092915050565b6000600254905090565b600080610650611356565b905061065d858285611527565b6106688585856115b3565b60019150509392505050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006106c384610cee565b90506000811180156106d9575060008260000154115b610718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070f906127eb565b60405180910390fd5b428260020160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550808260000154610753919061283a565b8260000181905550806000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107a9919061286e565b9250508190555060008260000154036108be57600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff02191690556002820160106101000a81549067ffffffffffffffff02191690556002820160186101000a81549067ffffffffffffffff021916905550508373ffffffffffffffffffffffffffffffffffffffff167f064f67e76df103eb3e142dac6110a06fcfc7a01ef2da651312b88eb6f0dd3d2860405160405180910390a25b8373ffffffffffffffffffffffffffffffffffffffff167f9c12b285834f9d1e649ea976a1e52e28e1f970147ba4ce1ffea1750195c225db82604051610904919061237d565b60405180910390a2600192505050919050565b60006012905090565b60008061092b611356565b905061094c81858561093d858961101e565b610947919061286e565b61135e565b600191505092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000463088888888886040516020016109c297969594939291906128c0565b604051602081830303815290604052805190602001209050610a1b81836002806020026040519081016040528092919082600260200280828437600081840152601f19601f820116905080830192505050505050611829565b610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a519061297b565b60405180910390fd5b6006600082815260200190815260200160002060009054906101000a900460ff1615610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab290612a0d565b60405180910390fd5b60016006600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060008567ffffffffffffffff161115610b0f57610b08308888888888611994565b5050610b1c565b610b1a3088886115b3565b505b505050505050565b610b2c61214f565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ce7919061286e565b9050919050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050806040015167ffffffffffffffff16421015610e39576000915050610ea5565b806060015167ffffffffffffffff16421115610e5c578060000151915050610ea5565b60008160200151826080015167ffffffffffffffff1642610e7d919061283a565b610e879190612a2d565b905080826000015110610e9a5780610ea0565b81600001515b925050505b919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060048054610f019061276e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2d9061276e565b8015610f7a5780601f10610f4f57610100808354040283529160200191610f7a565b820191906000526020600020905b815481529060010190602001808311610f5d57829003601f168201915b5050505050905090565b600080610f8f611356565b90506000610f9d828661101e565b905083811015610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd990612ae1565b60405180910390fd5b610fef828686840361135e565b60019250505092915050565b600080611006611356565b90506110138185856115b3565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006110f1611356565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111ad5785811015611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90612b73565b60405180910390fd5b6111ac886111a4611356565b88840361135e565b5b6111bb888888888888611994565b5060019150509695505050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480156112555750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90612bdf565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f0b35050b9a10c7ebfedf47e208eb4167e1386112072928c5842a60e2297140d6600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516113269190612bff565b60405180910390a150565b600061134861133e611356565b8787878787611994565b506001905095945050505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c490612c8c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390612d1e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161151a919061237d565b60405180910390a3505050565b6000611533848461101e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115ad578181101561159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690612d8a565b60405180910390fd5b6115ac848484840361135e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990612e1c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890612eae565b60405180910390fd5b61169c838383611df0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171990612f40565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611810919061237d565b60405180910390a3611823848484611df5565b50505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b8360016002811061186457611863612f60565b5b60200201511690506000601b60ff8560016002811061188657611885612f60565b5b602002015160001c901c61189a919061286e565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156118d25760009250505061198e565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600186838760006002811061192357611922612f60565b5b602002015186604051600081526020016040526040516119469493929190612fa8565b6020604051602081039080840390855afa158015611968573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614925050505b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb90612eae565b60405180910390fd5b60008060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600001541115611bb7578160020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168767ffffffffffffffff16148015611b4057508160020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff168667ffffffffffffffff16145b8015611b7757508160020160189054906101000a900467ffffffffffffffff1667ffffffffffffffff168567ffffffffffffffff16145b611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad9061305f565b60405180910390fd5b5b87816000015484611bc8919061286e565b1015611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c00906130cb565b60405180910390fd5b878310611c6d578783036000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c638a8a8a8a8a8a611dfa565b9350505050611de6565b8060020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168767ffffffffffffffff1610158015611cd557508060020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff168667ffffffffffffffff1610155b8015611d0c57508060020160189054906101000a900467ffffffffffffffff1667ffffffffffffffff168567ffffffffffffffff16105b611d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d429061315d565b60405180910390fd5b87816000015410611d7d57878160000154038160000181905550611d738a8a8a8a8a8a611dfa565b9350505050611de6565b8060000154880383036000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008160000181905550611de08a8a8a8a8a8a611dfa565b93505050505b9695505050505050565b505050565b505050565b60008367ffffffffffffffff168367ffffffffffffffff161015611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a906131c9565b60405180910390fd5b428467ffffffffffffffff161015611ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9790613235565b60405180910390fd5b600080600087600760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015401925086860367ffffffffffffffff16915060008211611f0a576000611f1c565b818381611f1a57611f19613255565b5b045b90506040518060c001604052808481526020018281526020018867ffffffffffffffff1681526020018767ffffffffffffffff1681526020018867ffffffffffffffff1681526020018667ffffffffffffffff16815250600760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160020160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050508873ffffffffffffffffffffffffffffffffffffffff167f74e0938598868b4c1e871f3cff0292e8399ee8cc53264926f8956ef711f7bc37848989896040516120d19493929190613284565b60405180910390a28873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a604051612136919061237d565b60405180910390a3600193505050509695505050505050565b6040518060c001604052806000815260200160008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156121e75780820151818401526020810190506121cc565b60008484015250505050565b6000601f19601f8301169050919050565b600061220f826121ad565b61221981856121b8565b93506122298185602086016121c9565b612232816121f3565b840191505092915050565b600060208201905081810360008301526122578184612204565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061228f82612264565b9050919050565b61229f81612284565b81146122aa57600080fd5b50565b6000813590506122bc81612296565b92915050565b6000819050919050565b6122d5816122c2565b81146122e057600080fd5b50565b6000813590506122f2816122cc565b92915050565b6000806040838503121561230f5761230e61225f565b5b600061231d858286016122ad565b925050602061232e858286016122e3565b9150509250929050565b60008115159050919050565b61234d81612338565b82525050565b60006020820190506123686000830184612344565b92915050565b612377816122c2565b82525050565b6000602082019050612392600083018461236e565b92915050565b6000806000606084860312156123b1576123b061225f565b5b60006123bf868287016122ad565b93505060206123d0868287016122ad565b92505060406123e1868287016122e3565b9150509250925092565b6000602082840312156124015761240061225f565b5b600061240f848285016122ad565b91505092915050565b600060ff82169050919050565b61242e81612418565b82525050565b60006020820190506124496000830184612425565b92915050565b600067ffffffffffffffff82169050919050565b61246c8161244f565b811461247757600080fd5b50565b60008135905061248981612463565b92915050565b600080fd5b6000819050826020600202820111156124b0576124af61248f565b5b92915050565b60008060008060008060e087890312156124d3576124d261225f565b5b60006124e189828a016122ad565b96505060206124f289828a016122e3565b955050604061250389828a0161247a565b945050606061251489828a0161247a565b935050608061252589828a0161247a565b92505060a061253689828a01612494565b9150509295509295509295565b61254c816122c2565b82525050565b61255b8161244f565b82525050565b60c0820160008201516125776000850182612543565b50602082015161258a6020850182612543565b50604082015161259d6040850182612552565b5060608201516125b06060850182612552565b5060808201516125c36080850182612552565b5060a08201516125d660a0850182612552565b50505050565b600060c0820190506125f16000830184612561565b92915050565b6000806040838503121561260e5761260d61225f565b5b600061261c858286016122ad565b925050602061262d858286016122ad565b9150509250929050565b60008060008060008060c087890312156126545761265361225f565b5b600061266289828a016122ad565b965050602061267389828a016122ad565b955050604061268489828a016122e3565b945050606061269589828a0161247a565b93505060806126a689828a0161247a565b92505060a06126b789828a0161247a565b9150509295509295509295565b600080600080600060a086880312156126e0576126df61225f565b5b60006126ee888289016122ad565b95505060206126ff888289016122e3565b94505060406127108882890161247a565b93505060606127218882890161247a565b92505060806127328882890161247a565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061278657607f821691505b6020821081036127995761279861273f565b5b50919050565b7f4e6f20756e6c6f636b61626c6520746f6b656e73210000000000000000000000600082015250565b60006127d56015836121b8565b91506127e08261279f565b602082019050919050565b60006020820190508181036000830152612804816127c8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612845826122c2565b9150612850836122c2565b92508282039050818111156128685761286761280b565b5b92915050565b6000612879826122c2565b9150612884836122c2565b925082820190508082111561289c5761289b61280b565b5b92915050565b6128ab81612284565b82525050565b6128ba8161244f565b82525050565b600060e0820190506128d5600083018a61236e565b6128e260208301896128a2565b6128ef60408301886128a2565b6128fc606083018761236e565b61290960808301866128b1565b61291660a08301856128b1565b61292360c08301846128b1565b98975050505050505050565b7f436865717565207369676e617475726520697320696e76616c69642100000000600082015250565b6000612965601c836121b8565b91506129708261292f565b602082019050919050565b6000602082019050818103600083015261299481612958565b9050919050565b7f54686973206368657175652077617320656e63617368656420616c726561647960008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b60006129f76021836121b8565b9150612a028261299b565b604082019050919050565b60006020820190508181036000830152612a26816129ea565b9050919050565b6000612a38826122c2565b9150612a43836122c2565b9250828202612a51816122c2565b91508282048414831517612a6857612a6761280b565b5b5092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612acb6025836121b8565b9150612ad682612a6f565b604082019050919050565b60006020820190508181036000830152612afa81612abe565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612b5d6028836121b8565b9150612b6882612b01565b604082019050919050565b60006020820190508181036000830152612b8c81612b50565b9050919050565b7f496e76616c696420636865717565207369676e65720000000000000000000000600082015250565b6000612bc96015836121b8565b9150612bd482612b93565b602082019050919050565b60006020820190508181036000830152612bf881612bbc565b9050919050565b6000602082019050612c1460008301846128a2565b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612c766024836121b8565b9150612c8182612c1a565b604082019050919050565b60006020820190508181036000830152612ca581612c69565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d086022836121b8565b9150612d1382612cac565b604082019050919050565b60006020820190508181036000830152612d3781612cfb565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612d74601d836121b8565b9150612d7f82612d3e565b602082019050919050565b60006020820190508181036000830152612da381612d67565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612e066025836121b8565b9150612e1182612daa565b604082019050919050565b60006020820190508181036000830152612e3581612df9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612e986023836121b8565b9150612ea382612e3c565b604082019050919050565b60006020820190508181036000830152612ec781612e8b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612f2a6026836121b8565b9150612f3582612ece565b604082019050919050565b60006020820190508181036000830152612f5981612f1d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b612fa281612f8f565b82525050565b6000608082019050612fbd6000830187612f99565b612fca6020830186612425565b612fd76040830185612f99565b612fe46060830184612f99565b95945050505050565b7f4f6e6c79206f6e65206c6f636b20706172616d7320706572206164647265737360008201527f20616c6c6f776564210000000000000000000000000000000000000000000000602082015250565b60006130496029836121b8565b915061305482612fed565b604082019050919050565b600060208201905081810360008301526130788161303c565b9050919050565b7f5472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b60006130b5601f836121b8565b91506130c08261307f565b602082019050919050565b600060208201905081810360008301526130e4816130a8565b9050919050565b7f4f6e6c792073616d65202f207374726963746572206c6f636b20706172616d7360008201527f20616c6c6f776564210000000000000000000000000000000000000000000000602082015250565b60006131476029836121b8565b9150613152826130eb565b604082019050919050565b600060208201905081810360008301526131768161313a565b9050919050565b7f536f66744c6f636b206d757374206265203e3d20486172644c6f636b21000000600082015250565b60006131b3601d836121b8565b91506131be8261317d565b602082019050919050565b600060208201905081810360008301526131e2816131a6565b9050919050565b7f486172644c6f636b206d75737420626520696e20746865206675747572652100600082015250565b600061321f601f836121b8565b915061322a826131e9565b602082019050919050565b6000602082019050818103600083015261324e81613212565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000608082019050613299600083018761236e565b6132a660208301866128b1565b6132b360408301856128b1565b6132c060608301846128b1565b9594505050505056fea2646970667358221220102d244c79e4fc94e8b0ed396a2709d169a12a4e469a341c29590c69b4ee8d3664736f6c63430008110033

Deployed Bytecode Sourcemap

224:17783:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3073:8;;;224:17783;3272:8;;;2039:100:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4328:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3133:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5089:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8226:940:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2980:93:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5772:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9442:125:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4582:1073;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10241:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10643:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11133:714;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9853:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2252:104:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6495:429;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3622:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3871:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7141:836:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3528:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6226:276;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2039:100:1;2095:13;2127:5;2120:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2039:100;:::o;4328:199::-;4413:4;4429:13;4445:12;:10;:12::i;:::-;4429:28;;4467:32;4476:5;4483:7;4492:6;4467:8;:32::i;:::-;4516:4;4509:11;;;4328:199;;;;:::o;3133:108::-;3196:7;3222:12;;3215:19;;3133:108;:::o;5089:288::-;5218:4;5234:15;5252:12;:10;:12::i;:::-;5234:30;;5274:38;5290:4;5296:7;5305:6;5274:15;:38::i;:::-;5322:27;5332:4;5338:2;5342:6;5322:9;:27::i;:::-;5366:4;5359:11;;;5089:288;;;;;:::o;8226:940:4:-;8277:4;8317:17;8337:6;:15;8344:7;8337:15;;;;;;;;;;;;;;;8317:35;;8403:18;8424:28;8444:7;8424:19;:28::i;:::-;8403:49;;8573:1;8560:10;:14;:38;;;;;8597:1;8578:4;:16;;;:20;8560:38;8552:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;8748:15;8723:4;:15;;;:41;;;;;;;;;;;;;;;;;;8812:10;8793:4;:16;;;:29;;;;:::i;:::-;8774:4;:16;;:48;;;;8854:10;8832:9;:18;8842:7;8832:18;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;8972:1;8952:4;:16;;;:21;8949:111;;8995:6;:15;9002:7;8995:15;;;;;;;;;;;;;;;;8988:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9041:7;9029:20;;;;;;;;;;;;8949:111;9118:7;9104:34;;;9127:10;9104:34;;;;;;:::i;:::-;;;;;;;;9155:4;9148:11;;;;8226:940;;;:::o;2980:93:1:-;3040:5;3064:2;3057:9;;2980:93;:::o;5772:236::-;5862:4;5878:13;5894:12;:10;:12::i;:::-;5878:28;;5916:64;5925:5;5932:7;5969:10;5941:25;5951:5;5958:7;5941:9;:25::i;:::-;:38;;;;:::i;:::-;5916:8;:64::i;:::-;5997:4;5990:11;;;5772:236;;;;:::o;9442:125:4:-;9507:7;9533:6;:15;9540:7;9533:15;;;;;;;;;;;;;;;:27;;;9526:34;;9442:125;;;:::o;4582:1073::-;4787:11;4822:13;4845:4;4852:11;4865:6;4873:13;4888;4903:11;4811:104;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4801:115;;;;;;4787:129;;4970:37;4992:3;4997:9;4970:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:37::i;:::-;4962:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;5117:15;:20;5133:3;5117:20;;;;;;;;;;;;;;;;;;;;;5116:21;5108:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5244:4;5221:15;:20;5237:3;5221:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;5350:1;5334:13;:17;;;5330:211;;;5416:94;5440:4;5447:11;5460:6;5468:13;5483;5498:11;5416:15;:94::i;:::-;;5524:7;;;5330:211;5603:45;5621:4;5628:11;5641:6;5603:9;:45::i;:::-;4745:910;4582:1073;;;;;;;:::o;10241:108::-;10297:11;;:::i;:::-;10327:6;:15;10334:7;10327:15;;;;;;;;;;;;;;;10320:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10241:108;;;:::o;10643:149::-;10711:7;10758:6;:15;10765:7;10758:15;;;;;;;;;;;;;;;:27;;;10737:9;:18;10747:7;10737:18;;;;;;;;;;;;;;;;:48;;;;:::i;:::-;10730:55;;10643:149;;;:::o;11133:714::-;11200:7;11243:16;11262:6;:15;11269:7;11262:15;;;;;;;;;;;;;;;11243:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11387:4;:18;;;11369:36;;:15;:36;11366:74;;;11428:1;11421:8;;;;;11366:74;11549:4;:18;;;11531:36;;:15;:36;11528:89;;;11590:4;:16;;;11583:23;;;;;11528:89;11686:18;11745:4;:17;;;11726:4;:15;;;11708:33;;:15;:33;;;;:::i;:::-;11707:55;;;;:::i;:::-;11686:76;;11798:10;11779:4;:16;;;:29;:61;;11830:10;11779:61;;;11811:4;:16;;;11779:61;11772:68;;;;11133:714;;;;:::o;9853:118::-;9920:7;9946:9;:18;9956:7;9946:18;;;;;;;;;;;;;;;;9939:25;;9853:118;;;:::o;2252:104:1:-;2310:13;2342:7;2335:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2252:104;:::o;6495:429::-;6590:4;6606:13;6622:12;:10;:12::i;:::-;6606:28;;6644:24;6671:25;6681:5;6688:7;6671:9;:25::i;:::-;6644:52;;6734:15;6714:16;:35;;6706:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;6825:60;6834:5;6841:7;6869:15;6850:16;:34;6825:8;:60::i;:::-;6913:4;6906:11;;;;6495:429;;;;:::o;3622:191::-;3703:4;3719:13;3735:12;:10;:12::i;:::-;3719:28;;3757;3767:5;3774:2;3778:6;3757:9;:28::i;:::-;3802:4;3795:11;;;3622:191;;;;:::o;3871:149::-;3960:7;3986:11;:18;3998:5;3986:18;;;;;;;;;;;;;;;:27;4005:7;3986:27;;;;;;;;;;;;;;;;3979:34;;3871:149;;;;:::o;7141:836:4:-;7302:4;7365:24;7392:11;:19;7404:6;7392:19;;;;;;;;;;;;;;;:33;7412:12;:10;:12::i;:::-;7392:33;;;;;;;;;;;;;;;;7365:60;;7505:17;7485:16;:37;7481:338;;7644:6;7624:16;:26;;7616:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;7737:57;7746:6;7754:12;:10;:12::i;:::-;7787:6;7768:16;:25;7737:8;:57::i;:::-;7481:338;7864:85;7880:6;7888:9;7899:6;7907:13;7922;7937:11;7864:15;:85::i;:::-;;7966:4;7959:11;;;7141:836;;;;;;;;:::o;3528:260::-;3620:12;;;;;;;;;;;3606:26;;:10;:26;;;:60;;;;;3664:1;3636:30;;:16;:30;;;;3606:60;3598:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;3717:16;3702:12;;:31;;;;;;;;;;;;;;;;;;3748:33;3768:12;;;;;;;;;;;3748:33;;;;;;:::i;:::-;;;;;;;;3528:260;:::o;6226:276::-;6367:4;6383:91;6399:12;:10;:12::i;:::-;6413:9;6424:6;6432:13;6447;6462:11;6383:15;:91::i;:::-;;6491:4;6484:11;;6226:276;;;;;;;:::o;586:96:0:-;639:7;665:10;658:17;;586:96;:::o;10409:370:1:-;10557:1;10540:19;;:5;:19;;;10532:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10637:1;10618:21;;:7;:21;;;10610:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10719:6;10689:11;:18;10701:5;10689:18;;;;;;;;;;;;;;;:27;10708:7;10689:27;;;;;;;;;;;;;;;:36;;;;10756:7;10740:32;;10749:5;10740:32;;;10765:6;10740:32;;;;;;:::i;:::-;;;;;;;;10409:370;;;:::o;11060:441::-;11190:24;11217:25;11227:5;11234:7;11217:9;:25::i;:::-;11190:52;;11276:17;11256:16;:37;11252:243;;11337:6;11317:16;:26;;11309:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11419:51;11428:5;11435:7;11463:6;11444:16;:25;11419:8;:51::i;:::-;11252:243;11180:321;11060:441;;;:::o;7378:818::-;7520:1;7504:18;;:4;:18;;;7496:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7596:1;7582:16;;:2;:16;;;7574:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;7649:38;7670:4;7676:2;7680:6;7649:20;:38::i;:::-;7698:19;7720:9;:15;7730:4;7720:15;;;;;;;;;;;;;;;;7698:37;;7768:6;7753:11;:21;;7745:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;7883:6;7869:11;:20;7851:9;:15;7861:4;7851:15;;;;;;;;;;;;;;;:38;;;;8083:6;8066:9;:13;8076:2;8066:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;8130:2;8115:26;;8124:4;8115:26;;;8134:6;8115:26;;;;;;:::i;:::-;;;;;;;;8152:37;8172:4;8178:2;8182:6;8152:19;:37::i;:::-;7486:710;7378:818;;;:::o;17334:671:4:-;17429:4;17498:9;17533:66;17525:75;;17510:9;17520:1;17510:12;;;;;;;:::i;:::-;;;;;;:90;17498:102;;17610:7;17659:2;17652:3;17635:9;17645:1;17635:12;;;;;;;:::i;:::-;;;;;;17627:21;;:28;;17626:35;;;;:::i;:::-;17610:52;;17764:66;17759:1;17751:10;;:79;17747:122;;;17853:5;17846:12;;;;;;17747:122;17986:12;;;;;;;;;;;17948:50;;:34;17958:3;17963:1;17966:9;17976:1;17966:12;;;;;;;:::i;:::-;;;;;;17980:1;17948:34;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;17941:57;;;;17334:671;;;;;:::o;12429:2543::-;12587:4;12676:1;12655:23;;:9;:23;;;12647:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12762:16;12781:9;:17;12791:6;12781:17;;;;;;;;;;;;;;;;12762:36;;12856:18;12877:6;:17;12884:9;12877:17;;;;;;;;;;;;;;;12856:38;;12904:18;12925:6;:14;12932:6;12925:14;;;;;;;;;;;;;;;12904:35;;13044:1;13024:5;:17;;;:21;13020:279;;;13102:5;:19;;;;;;;;;;;;13085:36;;:13;:36;;;:92;;;;;13158:5;:19;;;;;;;;;;;;13141:36;;:13;:36;;;13085:92;:144;;;;;13212:5;:17;;;;;;;;;;;;13197:32;;:11;:32;;;13085:144;13060:228;;;;;;;;;;;;:::i;:::-;;;;;;;;;13020:279;13428:6;13407:5;:17;;;13396:8;:28;;;;:::i;:::-;:38;;13388:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;13577:6;13565:8;:18;13562:292;;13695:6;13684:8;:17;13664:9;:17;13674:6;13664:17;;;;;;;;;;;;;;;:37;;;;13763:80;13774:6;13782:9;13793:6;13801:13;13816;13831:11;13763:10;:80::i;:::-;13756:87;;;;;;;13562:292;14011:5;:19;;;;;;;;;;;;13994:36;;:13;:36;;;;:89;;;;;14064:5;:19;;;;;;;;;;;;14047:36;;:13;:36;;;;13994:89;:137;;;;;14114:5;:17;;;;;;;;;;;;14100:31;;:11;:31;;;13994:137;13973:226;;;;;;;;;;;;:::i;:::-;;;;;;;;;14281:6;14260:5;:17;;;:27;14257:322;;14420:6;14400:5;:17;;;:26;14380:5;:17;;:46;;;;14488:80;14499:6;14507:9;14518:6;14526:13;14541;14556:11;14488:10;:80::i;:::-;14481:87;;;;;;;14257:322;14732:5;:17;;;14723:6;:26;14711:8;:39;14691:9;:17;14701:6;14691:17;;;;;;;;;;;;;;;:59;;;;14844:1;14824:5;:17;;:21;;;;14885:80;14896:6;14904:9;14915:6;14923:13;14938;14953:11;14885:10;:80::i;:::-;14878:87;;;;;12429:2543;;;;;;;;;:::o;12085:121:1:-;;;;:::o;12794:120::-;;;;:::o;15588:1331:4:-;15740:4;15840:13;15823:30;;:13;:30;;;;15815:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;15975:15;15958:13;:32;;;;15950:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;16112:19;16141;16170:20;16270:6;16238;:17;16245:9;16238:17;;;;;;;;;;;;;;;:29;;;:38;16224:52;;16320:13;16304;:29;16290:43;;;;16376:1;16362:11;:15;:47;;16408:1;16362:47;;;16394:11;16380;:25;;;;;:::i;:::-;;;16362:47;16347:62;;16493:255;;;;;;;;16525:11;16493:255;;;;16564:12;16493:255;;;;16605:13;16493:255;;;;;;16647:13;16493:255;;;;;;16686:13;16493:255;;;;;;16726:11;16493:255;;;;;16473:6;:17;16480:9;16473:17;;;;;;;;;;;;;;;:275;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16775:9;16763:78;;;16786:11;16799:13;16814;16829:11;16763:78;;;;;;;;;:::i;:::-;;;;;;;;16873:9;16856:35;;16865:6;16856:35;;;16884:6;16856:35;;;;;;:::i;:::-;;;;;;;;16908:4;16901:11;;;;;15588:1331;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:99:5:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:329::-;4482:6;4531:2;4519:9;4510:7;4506:23;4502:32;4499:119;;;4537:79;;:::i;:::-;4499:119;4657:1;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4628:117;4423:329;;;;:::o;4758:86::-;4793:7;4833:4;4826:5;4822:16;4811:27;;4758:86;;;:::o;4850:112::-;4933:22;4949:5;4933:22;:::i;:::-;4928:3;4921:35;4850:112;;:::o;4968:214::-;5057:4;5095:2;5084:9;5080:18;5072:26;;5108:67;5172:1;5161:9;5157:17;5148:6;5108:67;:::i;:::-;4968:214;;;;:::o;5188:101::-;5224:7;5264:18;5257:5;5253:30;5242:41;;5188:101;;;:::o;5295:120::-;5367:23;5384:5;5367:23;:::i;:::-;5360:5;5357:34;5347:62;;5405:1;5402;5395:12;5347:62;5295:120;:::o;5421:137::-;5466:5;5504:6;5491:20;5482:29;;5520:32;5546:5;5520:32;:::i;:::-;5421:137;;;;:::o;5564:117::-;5673:1;5670;5663:12;5705:249;5776:8;5807:6;5795:18;;5860:3;5852:4;5846;5842:15;5832:8;5828:30;5825:39;5822:126;;;5867:79;;:::i;:::-;5822:126;5705:249;;;;:::o;5960:1101::-;6086:6;6094;6102;6110;6118;6126;6175:3;6163:9;6154:7;6150:23;6146:33;6143:120;;;6182:79;;:::i;:::-;6143:120;6302:1;6327:53;6372:7;6363:6;6352:9;6348:22;6327:53;:::i;:::-;6317:63;;6273:117;6429:2;6455:53;6500:7;6491:6;6480:9;6476:22;6455:53;:::i;:::-;6445:63;;6400:118;6557:2;6583:52;6627:7;6618:6;6607:9;6603:22;6583:52;:::i;:::-;6573:62;;6528:117;6684:2;6710:52;6754:7;6745:6;6734:9;6730:22;6710:52;:::i;:::-;6700:62;;6655:117;6811:3;6838:52;6882:7;6873:6;6862:9;6858:22;6838:52;:::i;:::-;6828:62;;6782:118;6939:3;6966:78;7036:7;7027:6;7016:9;7012:22;6966:78;:::i;:::-;6956:88;;6910:144;5960:1101;;;;;;;;:::o;7067:108::-;7144:24;7162:5;7144:24;:::i;:::-;7139:3;7132:37;7067:108;;:::o;7181:105::-;7256:23;7273:5;7256:23;:::i;:::-;7251:3;7244:36;7181:105;;:::o;7336:1233::-;7475:4;7470:3;7466:14;7569:4;7562:5;7558:16;7552:23;7588:63;7645:4;7640:3;7636:14;7622:12;7588:63;:::i;:::-;7490:171;7751:4;7744:5;7740:16;7734:23;7770:63;7827:4;7822:3;7818:14;7804:12;7770:63;:::i;:::-;7671:172;7934:4;7927:5;7923:16;7917:23;7953:61;8008:4;8003:3;7999:14;7985:12;7953:61;:::i;:::-;7853:171;8115:4;8108:5;8104:16;8098:23;8134:61;8189:4;8184:3;8180:14;8166:12;8134:61;:::i;:::-;8034:171;8293:4;8286:5;8282:16;8276:23;8312:61;8367:4;8362:3;8358:14;8344:12;8312:61;:::i;:::-;8215:168;8472:4;8465:5;8461:16;8455:23;8491:61;8546:4;8541:3;8537:14;8523:12;8491:61;:::i;:::-;8393:169;7444:1125;7336:1233;;:::o;8575:307::-;8710:4;8748:3;8737:9;8733:19;8725:27;;8762:113;8872:1;8861:9;8857:17;8848:6;8762:113;:::i;:::-;8575:307;;;;:::o;8888:474::-;8956:6;8964;9013:2;9001:9;8992:7;8988:23;8984:32;8981:119;;;9019:79;;:::i;:::-;8981:119;9139:1;9164:53;9209:7;9200:6;9189:9;9185:22;9164:53;:::i;:::-;9154:63;;9110:117;9266:2;9292:53;9337:7;9328:6;9317:9;9313:22;9292:53;:::i;:::-;9282:63;;9237:118;8888:474;;;;;:::o;9368:1051::-;9469:6;9477;9485;9493;9501;9509;9558:3;9546:9;9537:7;9533:23;9529:33;9526:120;;;9565:79;;:::i;:::-;9526:120;9685:1;9710:53;9755:7;9746:6;9735:9;9731:22;9710:53;:::i;:::-;9700:63;;9656:117;9812:2;9838:53;9883:7;9874:6;9863:9;9859:22;9838:53;:::i;:::-;9828:63;;9783:118;9940:2;9966:53;10011:7;10002:6;9991:9;9987:22;9966:53;:::i;:::-;9956:63;;9911:118;10068:2;10094:52;10138:7;10129:6;10118:9;10114:22;10094:52;:::i;:::-;10084:62;;10039:117;10195:3;10222:52;10266:7;10257:6;10246:9;10242:22;10222:52;:::i;:::-;10212:62;;10166:118;10323:3;10350:52;10394:7;10385:6;10374:9;10370:22;10350:52;:::i;:::-;10340:62;;10294:118;9368:1051;;;;;;;;:::o;10425:905::-;10517:6;10525;10533;10541;10549;10598:3;10586:9;10577:7;10573:23;10569:33;10566:120;;;10605:79;;:::i;:::-;10566:120;10725:1;10750:53;10795:7;10786:6;10775:9;10771:22;10750:53;:::i;:::-;10740:63;;10696:117;10852:2;10878:53;10923:7;10914:6;10903:9;10899:22;10878:53;:::i;:::-;10868:63;;10823:118;10980:2;11006:52;11050:7;11041:6;11030:9;11026:22;11006:52;:::i;:::-;10996:62;;10951:117;11107:2;11133:52;11177:7;11168:6;11157:9;11153:22;11133:52;:::i;:::-;11123:62;;11078:117;11234:3;11261:52;11305:7;11296:6;11285:9;11281:22;11261:52;:::i;:::-;11251:62;;11205:118;10425:905;;;;;;;;:::o;11336:180::-;11384:77;11381:1;11374:88;11481:4;11478:1;11471:15;11505:4;11502:1;11495:15;11522:320;11566:6;11603:1;11597:4;11593:12;11583:22;;11650:1;11644:4;11640:12;11671:18;11661:81;;11727:4;11719:6;11715:17;11705:27;;11661:81;11789:2;11781:6;11778:14;11758:18;11755:38;11752:84;;11808:18;;:::i;:::-;11752:84;11573:269;11522:320;;;:::o;11848:171::-;11988:23;11984:1;11976:6;11972:14;11965:47;11848:171;:::o;12025:366::-;12167:3;12188:67;12252:2;12247:3;12188:67;:::i;:::-;12181:74;;12264:93;12353:3;12264:93;:::i;:::-;12382:2;12377:3;12373:12;12366:19;;12025:366;;;:::o;12397:419::-;12563:4;12601:2;12590:9;12586:18;12578:26;;12650:9;12644:4;12640:20;12636:1;12625:9;12621:17;12614:47;12678:131;12804:4;12678:131;:::i;:::-;12670:139;;12397:419;;;:::o;12822:180::-;12870:77;12867:1;12860:88;12967:4;12964:1;12957:15;12991:4;12988:1;12981:15;13008:194;13048:4;13068:20;13086:1;13068:20;:::i;:::-;13063:25;;13102:20;13120:1;13102:20;:::i;:::-;13097:25;;13146:1;13143;13139:9;13131:17;;13170:1;13164:4;13161:11;13158:37;;;13175:18;;:::i;:::-;13158:37;13008:194;;;;:::o;13208:191::-;13248:3;13267:20;13285:1;13267:20;:::i;:::-;13262:25;;13301:20;13319:1;13301:20;:::i;:::-;13296:25;;13344:1;13341;13337:9;13330:16;;13365:3;13362:1;13359:10;13356:36;;;13372:18;;:::i;:::-;13356:36;13208:191;;;;:::o;13405:118::-;13492:24;13510:5;13492:24;:::i;:::-;13487:3;13480:37;13405:118;;:::o;13529:115::-;13614:23;13631:5;13614:23;:::i;:::-;13609:3;13602:36;13529:115;;:::o;13650:874::-;13905:4;13943:3;13932:9;13928:19;13920:27;;13957:71;14025:1;14014:9;14010:17;14001:6;13957:71;:::i;:::-;14038:72;14106:2;14095:9;14091:18;14082:6;14038:72;:::i;:::-;14120;14188:2;14177:9;14173:18;14164:6;14120:72;:::i;:::-;14202;14270:2;14259:9;14255:18;14246:6;14202:72;:::i;:::-;14284:71;14350:3;14339:9;14335:19;14326:6;14284:71;:::i;:::-;14365;14431:3;14420:9;14416:19;14407:6;14365:71;:::i;:::-;14446;14512:3;14501:9;14497:19;14488:6;14446:71;:::i;:::-;13650:874;;;;;;;;;;:::o;14530:178::-;14670:30;14666:1;14658:6;14654:14;14647:54;14530:178;:::o;14714:366::-;14856:3;14877:67;14941:2;14936:3;14877:67;:::i;:::-;14870:74;;14953:93;15042:3;14953:93;:::i;:::-;15071:2;15066:3;15062:12;15055:19;;14714:366;;;:::o;15086:419::-;15252:4;15290:2;15279:9;15275:18;15267:26;;15339:9;15333:4;15329:20;15325:1;15314:9;15310:17;15303:47;15367:131;15493:4;15367:131;:::i;:::-;15359:139;;15086:419;;;:::o;15511:220::-;15651:34;15647:1;15639:6;15635:14;15628:58;15720:3;15715:2;15707:6;15703:15;15696:28;15511:220;:::o;15737:366::-;15879:3;15900:67;15964:2;15959:3;15900:67;:::i;:::-;15893:74;;15976:93;16065:3;15976:93;:::i;:::-;16094:2;16089:3;16085:12;16078:19;;15737:366;;;:::o;16109:419::-;16275:4;16313:2;16302:9;16298:18;16290:26;;16362:9;16356:4;16352:20;16348:1;16337:9;16333:17;16326:47;16390:131;16516:4;16390:131;:::i;:::-;16382:139;;16109:419;;;:::o;16534:410::-;16574:7;16597:20;16615:1;16597:20;:::i;:::-;16592:25;;16631:20;16649:1;16631:20;:::i;:::-;16626:25;;16686:1;16683;16679:9;16708:30;16726:11;16708:30;:::i;:::-;16697:41;;16887:1;16878:7;16874:15;16871:1;16868:22;16848:1;16841:9;16821:83;16798:139;;16917:18;;:::i;:::-;16798:139;16582:362;16534:410;;;;:::o;16950:224::-;17090:34;17086:1;17078:6;17074:14;17067:58;17159:7;17154:2;17146:6;17142:15;17135:32;16950:224;:::o;17180:366::-;17322:3;17343:67;17407:2;17402:3;17343:67;:::i;:::-;17336:74;;17419:93;17508:3;17419:93;:::i;:::-;17537:2;17532:3;17528:12;17521:19;;17180:366;;;:::o;17552:419::-;17718:4;17756:2;17745:9;17741:18;17733:26;;17805:9;17799:4;17795:20;17791:1;17780:9;17776:17;17769:47;17833:131;17959:4;17833:131;:::i;:::-;17825:139;;17552:419;;;:::o;17977:227::-;18117:34;18113:1;18105:6;18101:14;18094:58;18186:10;18181:2;18173:6;18169:15;18162:35;17977:227;:::o;18210:366::-;18352:3;18373:67;18437:2;18432:3;18373:67;:::i;:::-;18366:74;;18449:93;18538:3;18449:93;:::i;:::-;18567:2;18562:3;18558:12;18551:19;;18210:366;;;:::o;18582:419::-;18748:4;18786:2;18775:9;18771:18;18763:26;;18835:9;18829:4;18825:20;18821:1;18810:9;18806:17;18799:47;18863:131;18989:4;18863:131;:::i;:::-;18855:139;;18582:419;;;:::o;19007:171::-;19147:23;19143:1;19135:6;19131:14;19124:47;19007:171;:::o;19184:366::-;19326:3;19347:67;19411:2;19406:3;19347:67;:::i;:::-;19340:74;;19423:93;19512:3;19423:93;:::i;:::-;19541:2;19536:3;19532:12;19525:19;;19184:366;;;:::o;19556:419::-;19722:4;19760:2;19749:9;19745:18;19737:26;;19809:9;19803:4;19799:20;19795:1;19784:9;19780:17;19773:47;19837:131;19963:4;19837:131;:::i;:::-;19829:139;;19556:419;;;:::o;19981:222::-;20074:4;20112:2;20101:9;20097:18;20089:26;;20125:71;20193:1;20182:9;20178:17;20169:6;20125:71;:::i;:::-;19981:222;;;;:::o;20209:223::-;20349:34;20345:1;20337:6;20333:14;20326:58;20418:6;20413:2;20405:6;20401:15;20394:31;20209:223;:::o;20438:366::-;20580:3;20601:67;20665:2;20660:3;20601:67;:::i;:::-;20594:74;;20677:93;20766:3;20677:93;:::i;:::-;20795:2;20790:3;20786:12;20779:19;;20438:366;;;:::o;20810:419::-;20976:4;21014:2;21003:9;20999:18;20991:26;;21063:9;21057:4;21053:20;21049:1;21038:9;21034:17;21027:47;21091:131;21217:4;21091:131;:::i;:::-;21083:139;;20810:419;;;:::o;21235:221::-;21375:34;21371:1;21363:6;21359:14;21352:58;21444:4;21439:2;21431:6;21427:15;21420:29;21235:221;:::o;21462:366::-;21604:3;21625:67;21689:2;21684:3;21625:67;:::i;:::-;21618:74;;21701:93;21790:3;21701:93;:::i;:::-;21819:2;21814:3;21810:12;21803:19;;21462:366;;;:::o;21834:419::-;22000:4;22038:2;22027:9;22023:18;22015:26;;22087:9;22081:4;22077:20;22073:1;22062:9;22058:17;22051:47;22115:131;22241:4;22115:131;:::i;:::-;22107:139;;21834:419;;;:::o;22259:179::-;22399:31;22395:1;22387:6;22383:14;22376:55;22259:179;:::o;22444:366::-;22586:3;22607:67;22671:2;22666:3;22607:67;:::i;:::-;22600:74;;22683:93;22772:3;22683:93;:::i;:::-;22801:2;22796:3;22792:12;22785:19;;22444:366;;;:::o;22816:419::-;22982:4;23020:2;23009:9;23005:18;22997:26;;23069:9;23063:4;23059:20;23055:1;23044:9;23040:17;23033:47;23097:131;23223:4;23097:131;:::i;:::-;23089:139;;22816:419;;;:::o;23241:224::-;23381:34;23377:1;23369:6;23365:14;23358:58;23450:7;23445:2;23437:6;23433:15;23426:32;23241:224;:::o;23471:366::-;23613:3;23634:67;23698:2;23693:3;23634:67;:::i;:::-;23627:74;;23710:93;23799:3;23710:93;:::i;:::-;23828:2;23823:3;23819:12;23812:19;;23471:366;;;:::o;23843:419::-;24009:4;24047:2;24036:9;24032:18;24024:26;;24096:9;24090:4;24086:20;24082:1;24071:9;24067:17;24060:47;24124:131;24250:4;24124:131;:::i;:::-;24116:139;;23843:419;;;:::o;24268:222::-;24408:34;24404:1;24396:6;24392:14;24385:58;24477:5;24472:2;24464:6;24460:15;24453:30;24268:222;:::o;24496:366::-;24638:3;24659:67;24723:2;24718:3;24659:67;:::i;:::-;24652:74;;24735:93;24824:3;24735:93;:::i;:::-;24853:2;24848:3;24844:12;24837:19;;24496:366;;;:::o;24868:419::-;25034:4;25072:2;25061:9;25057:18;25049:26;;25121:9;25115:4;25111:20;25107:1;25096:9;25092:17;25085:47;25149:131;25275:4;25149:131;:::i;:::-;25141:139;;24868:419;;;:::o;25293:225::-;25433:34;25429:1;25421:6;25417:14;25410:58;25502:8;25497:2;25489:6;25485:15;25478:33;25293:225;:::o;25524:366::-;25666:3;25687:67;25751:2;25746:3;25687:67;:::i;:::-;25680:74;;25763:93;25852:3;25763:93;:::i;:::-;25881:2;25876:3;25872:12;25865:19;;25524:366;;;:::o;25896:419::-;26062:4;26100:2;26089:9;26085:18;26077:26;;26149:9;26143:4;26139:20;26135:1;26124:9;26120:17;26113:47;26177:131;26303:4;26177:131;:::i;:::-;26169:139;;25896:419;;;:::o;26321:180::-;26369:77;26366:1;26359:88;26466:4;26463:1;26456:15;26490:4;26487:1;26480:15;26507:77;26544:7;26573:5;26562:16;;26507:77;;;:::o;26590:118::-;26677:24;26695:5;26677:24;:::i;:::-;26672:3;26665:37;26590:118;;:::o;26714:545::-;26887:4;26925:3;26914:9;26910:19;26902:27;;26939:71;27007:1;26996:9;26992:17;26983:6;26939:71;:::i;:::-;27020:68;27084:2;27073:9;27069:18;27060:6;27020:68;:::i;:::-;27098:72;27166:2;27155:9;27151:18;27142:6;27098:72;:::i;:::-;27180;27248:2;27237:9;27233:18;27224:6;27180:72;:::i;:::-;26714:545;;;;;;;:::o;27265:228::-;27405:34;27401:1;27393:6;27389:14;27382:58;27474:11;27469:2;27461:6;27457:15;27450:36;27265:228;:::o;27499:366::-;27641:3;27662:67;27726:2;27721:3;27662:67;:::i;:::-;27655:74;;27738:93;27827:3;27738:93;:::i;:::-;27856:2;27851:3;27847:12;27840:19;;27499:366;;;:::o;27871:419::-;28037:4;28075:2;28064:9;28060:18;28052:26;;28124:9;28118:4;28114:20;28110:1;28099:9;28095:17;28088:47;28152:131;28278:4;28152:131;:::i;:::-;28144:139;;27871:419;;;:::o;28296:181::-;28436:33;28432:1;28424:6;28420:14;28413:57;28296:181;:::o;28483:366::-;28625:3;28646:67;28710:2;28705:3;28646:67;:::i;:::-;28639:74;;28722:93;28811:3;28722:93;:::i;:::-;28840:2;28835:3;28831:12;28824:19;;28483:366;;;:::o;28855:419::-;29021:4;29059:2;29048:9;29044:18;29036:26;;29108:9;29102:4;29098:20;29094:1;29083:9;29079:17;29072:47;29136:131;29262:4;29136:131;:::i;:::-;29128:139;;28855:419;;;:::o;29280:228::-;29420:34;29416:1;29408:6;29404:14;29397:58;29489:11;29484:2;29476:6;29472:15;29465:36;29280:228;:::o;29514:366::-;29656:3;29677:67;29741:2;29736:3;29677:67;:::i;:::-;29670:74;;29753:93;29842:3;29753:93;:::i;:::-;29871:2;29866:3;29862:12;29855:19;;29514:366;;;:::o;29886:419::-;30052:4;30090:2;30079:9;30075:18;30067:26;;30139:9;30133:4;30129:20;30125:1;30114:9;30110:17;30103:47;30167:131;30293:4;30167:131;:::i;:::-;30159:139;;29886:419;;;:::o;30311:179::-;30451:31;30447:1;30439:6;30435:14;30428:55;30311:179;:::o;30496:366::-;30638:3;30659:67;30723:2;30718:3;30659:67;:::i;:::-;30652:74;;30735:93;30824:3;30735:93;:::i;:::-;30853:2;30848:3;30844:12;30837:19;;30496:366;;;:::o;30868:419::-;31034:4;31072:2;31061:9;31057:18;31049:26;;31121:9;31115:4;31111:20;31107:1;31096:9;31092:17;31085:47;31149:131;31275:4;31149:131;:::i;:::-;31141:139;;30868:419;;;:::o;31293:181::-;31433:33;31429:1;31421:6;31417:14;31410:57;31293:181;:::o;31480:366::-;31622:3;31643:67;31707:2;31702:3;31643:67;:::i;:::-;31636:74;;31719:93;31808:3;31719:93;:::i;:::-;31837:2;31832:3;31828:12;31821:19;;31480:366;;;:::o;31852:419::-;32018:4;32056:2;32045:9;32041:18;32033:26;;32105:9;32099:4;32095:20;32091:1;32080:9;32076:17;32069:47;32133:131;32259:4;32133:131;:::i;:::-;32125:139;;31852:419;;;:::o;32277:180::-;32325:77;32322:1;32315:88;32422:4;32419:1;32412:15;32446:4;32443:1;32436:15;32463:541;32634:4;32672:3;32661:9;32657:19;32649:27;;32686:71;32754:1;32743:9;32739:17;32730:6;32686:71;:::i;:::-;32767:70;32833:2;32822:9;32818:18;32809:6;32767:70;:::i;:::-;32847;32913:2;32902:9;32898:18;32889:6;32847:70;:::i;:::-;32927;32993:2;32982:9;32978:18;32969:6;32927:70;:::i;:::-;32463:541;;;;;;;:::o

Swarm Source

ipfs://102d244c79e4fc94e8b0ed396a2709d169a12a4e469a341c29590c69b4ee8d36
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.