ETH Price: $2,988.79 (-2.18%)
Gas: 1 Gwei

Token

EMTRI Token (EMT)
 

Overview

Max Total Supply

10,010 EMT

Holders

156

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
29.999251160095940397 EMT

Value
$0.00
0x51b27b3bbe0e7dd84028548d076bf113098a30fd
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EMTToken

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-15
*/

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @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);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @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.zeppelin.solutions/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) private _balances;

    mapping(address => mapping(address => uint256)) private _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() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public 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() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public 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) public 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) public 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
    ) public 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) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[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) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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;
        }
        _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;
        _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;
        }
        _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 Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * 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: contracts/EMTToken.sol


/*
*
* EMTRI Corporation, incorporated and registered in California, USA; 'EMTRI'.
*
* EMTRI empowers the Farmers, Cultivators, Strain Producers and Distributors 
* (clients) who work to bring quality medical-grade & premium adult-use cannabis 
* to the market.
*
* EMTRI clients use Ethereum blockchain technologies to attest to their crop 
* cultivations. In return for attesting to crop lifecycle events using blockchain, 
* EMTRI rewards its clients with EMT tokens, the 'mint'.
*
* EMTRI introduces clients to cannabis distributors that sell the attested-to
* cannabis to wholesale and retail customers, who actually pay a cash premium to 
* EMTRI because the cannabis their clients produce is attestested to using blockchain.
*
* Up to 50% of the cash premium paid to EMTRI is used to buyback EMT tokens on the
* Uniswap decentralized token exchange, the 'burn'. 

* So, EMTs are minted only as cultivator and distributor rewards, and then bought
* back upon the sale of the client cannabis, thereby creating the Uniswap marketplace.
*
*
* https://abbey.ch/         -- Abbey Technology GmbH, Zug, Switzerland
* 
* ABBEY DEFI
* ========== 
* 1. Decentralized Finance (DeFi) is designed to be globally inclusive. 
* 2. Centralized finance is based around private share sales to wealthy individuals or
*    the trading of shares on national stock markets, both have high barriers to entry. 
* 3. The Abbey DeFi methodology offers public and private companies exposure to DeFi.
*
* Abbey is a Uniswap-based DeFi service provider that allows companies to offer people a 
* novel way to participate in the success a business may have in a decentralized manner.
* 
* The premise is both elegant and simple, the company commits to a token buyback based on 
* its revenues.
* 
* Using Abbey as a Uniswap DeFi management agency, the company spends some revenues 
* buying one side of a bespoke Uniswap trading pair. The other side of the Uniswap pair 
* is the EMT token.
* 
* DeFi traders wishing to participate in the success a business may have deposit USDC in return 
* for EMT tokens. The Uniswap Automated Market Maker ensures DeFi market liquidity and
* legitimate price discovery. The more USDC that the company deposits in buy backs over time, 
* the higher the value of the EMT token, as held by DeFi speculators.
*
*/

pragma solidity 0.8.15;



/**
 * @title EMT Token contract for Uniswap v3.
 * @author Abbey Technology GmbH
 * @notice Token contract for use with Uniswap. Enforces restrictions outlined on the website.
 */
contract EMTToken is ERC20 {

    /**
     * @notice The details of a future company cashout.
     */
    struct Notice {
        // The maximum number of tokens proposed for sale.
        uint256 amount;

        // The date after which company tokens can be swapped.
        uint256 releaseDate;
    }

    // Event fired when a restricted wallet gives notice of a potential future trade.
    event NoticeGiven(address indexed who, uint256 amount, uint256 releaseDate);

    /**
     * @notice Notice must be given to the public before treasury tokens can be swapped.
     */
    Notice public noticeTreasury;

    /**
     * @notice Notice must be given to the public before Liquidity Tokens can be removed from the pool.
     */
    Notice public noticeLiquidity;

    /**
    * @notice The account that created this contract, also functions as the liquidity provider.
    */
    address public owner;

    /**
     * @notice Holder of the company's tokens.  Must give notice before tokens are moved.
     */
    address public treasury;

    /**
     * @notice The account that performs the buyback of tokens, all bought tokens are burned.
     * @dev They cannot be autoburned during transfer as the Uniswap client prevents the transaction.
     */
    address public buyback;

    /**
     * @notice The account that facilitates moving tokens between Mainnet and Efixii L2.
     */
    address public flip;    

    /**
     * @notice The address of the Uniswap Pool ERC20 contract holding the Liquidity Pool tokens.
     */
    address public poolAddress;

    /**
     * @notice The address of the Uniswap NFT ERC721 Positions contract that tracks ownership of liquidity pools.
     */
    address public positionsAddress;

    /**
     * @notice The NFT id of the Liquidity Pool in the Uniswap Positions contract.
     */
    uint256 public nftId;    

    /**
     * @notice The minimum duration notice given (to give the public a chance to act and to prevent a rug pull).
     */
    uint256 private MinimumNotice = 7 days;

    /**
     * @notice Restrict functionaly to the contract owner.
     */
    modifier onlyOwner {
        require(_msgSender() == owner, "You are not Owner.");
        _;
    }

    /**
     * @notice Create the contract setting already known values that are unlikely to change.  The tokens for the Uniswap
     *         liquidity pool are also created.
     * 
     * @param initialSupply The number of tokens to create the Uniswap pool.
     * @param name          The name of the token.
     * @param symbol        The short symbol for this token.
     * @param treasuryAddr  The address of the treasury wallet.
     * @param buybackAddr   The wallet that performs buybacks and optional burns of tokens.
     * @param flipAddr      The wallet used to move tokens between L2 and Mainnet.
     */
    constructor(uint256 initialSupply, string memory name, string memory symbol, address treasuryAddr, address buybackAddr, address flipAddr, address positionsAddr) ERC20(name, symbol) {
        owner = _msgSender();

        treasury = treasuryAddr;
        buyback = buybackAddr;
        flip = flipAddr;
        positionsAddress = positionsAddr;

        _mint(owner, initialSupply);
    }

    /**
     * @notice Set the address of the account holding EMT tokens on behalf of the company.
     */
    function setTreasury(address who) public onlyOwner {
        require(who != address(0x0), "Cannot assign to null address");

        _migrateTokens(treasury, who);
        treasury = who;
    }

    /**
     * @notice Set the address of the company account that buys tokens to increase the token price.
     */
    function setBuyback(address who) public onlyOwner {
        require(who != address(0x0), "Cannot assign to null address");

        _migrateTokens(buyback, who);
        buyback = who;
    }

    /**
     * @notice Set the address of the account that allows moving tokens between L2 and Mainnet.
     */
    function setFlip(address who) public onlyOwner {
        require(who != address(0x0), "Cannot assign to null address");

        _migrateTokens(flip, who);
        flip = who;
    }

    /**
     * When changing the address of a role in the contract move all tokens to the new
     * address - the tokens are restricted by role so need to move with the role address
     * change.
     */
    function _migrateTokens(address from, address to) private {
        if(from != address(0x0) && balanceOf(from) > 0)
            _transfer(from, to, balanceOf(from));
    }

    /**
     * @notice Set the address of the Uniswap Pool contract.
     */
    function setPoolAddress(address who) public onlyOwner {
        poolAddress = who;
    }

    /**
     * @notice Set the address of the Uniswap NFT contract that tracks Liquidity Pool ownership.
     */
    function setPositionsAddress(address who) public onlyOwner {
        positionsAddress = who;
    }

    /**
     * @notice Set the id of the position token that determines ownership of the Liquidity Pool.
     */
    function setNftId(uint256 id) public onlyOwner {
        nftId = id;
    }

    /**
     * @notice Treasury tokens must give advanced notice to the public before they can be used.
     * A public announcement will be made at the same time this notice is set in the contract.
     *
     * @param who The treasury address.
     * @param amount The maximum number of tokens (in wei).
     * @param numSeconds The number of seconds the tokens are held before being acted on.
     */
    function treasuryTransferNotice(address who, uint256 amount, uint256 numSeconds) public onlyOwner {
        require(who == treasury, "Specified address is not Treasury.");
        require(numSeconds >= MinimumNotice, "Not enough notice given.");

        uint256 when = block.timestamp + (numSeconds * 1 seconds);

        require(noticeTreasury.releaseDate == 0 || block.timestamp >= noticeTreasury.releaseDate, "Cannot overwrite an active existing notice.");
        require(amount <= balanceOf(who), "Can't give notice for more EMT tokens than owned.");
        noticeTreasury = Notice(amount, when);
        emit NoticeGiven(who, amount, when);
    }

    /**
     * @notice Liquidity Pool tokens must give advanced notice to the public before they can be used.
     * A public announcement will be made at the same time this notice is set in the contract.     
     *
     * @param who The owner of the Uniswap Positions NFT token.
     * @param amount The maximum number of tokens (in wei).
     * @param numSeconds The number of seconds the tokens are held before being acted on.
     */
    function liquidityRedemptionNotice(address who, uint256 amount, uint256 numSeconds) public onlyOwner {
        require(positionsAddress != address(0), "Uniswap Position Manager must be set.");
        require(numSeconds >= MinimumNotice, "Not enough notice given.");
        require(nftId != 0, "Uniswap Position NFT Id must be set.");
        require(poolAddress != address(0), "The Uniswap Pool contract address must be set.");

        IERC721 positions = IERC721(positionsAddress);
        address lpOwner = positions.ownerOf(nftId);
        require(who == lpOwner, "The specified address does not own the Positions NFT Token.");

        uint256 when = block.timestamp + (numSeconds * 1 seconds);

        require(noticeLiquidity.releaseDate == 0 || block.timestamp >= noticeLiquidity.releaseDate, "Cannot overwrite an active existing notice.");
        require(amount <= balanceOf(poolAddress), "Can't give notice for more Liquidity Tokens than owned.");
        noticeLiquidity = Notice(amount, when);
        emit NoticeGiven(who, amount, when);
    }

    /**
     * @notice Enforce rules around the company accounts:
     * - Once buyback buys tokens they can never be moved, the only real option is to burn.
     * - Two key accounts: treasury and the owner of the liquidity pool are restricted.
     * - A public announcement of the company's intent along with a time locked notice set in this contract before any token movement.
     * - Only after the deadline can these restricted tokens move.
     * - No restrictions are in place for any other wallet.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal override {
        require(sender != buyback, "Buyback cannot transfer tokens, it can only burn.");
        if(sender == treasury) {
            require(noticeTreasury.releaseDate != 0 && block.timestamp >= noticeTreasury.releaseDate, "Notice period has not been set or has not expired.");
            require(amount <= noticeTreasury.amount, "Treasury can't transfer more tokens than given notice for.");

            // Clear the remaining notice balance, this prevents giving notice on all tokens and
            // trickling them out.
            noticeTreasury = Notice(0, 0);
        }
        else if(nftId != 0) { // Check if the receiver is the Liquidity Pool owner.
            IERC721 positions = IERC721(positionsAddress);
            address lpOwner = positions.ownerOf(nftId);
            if(recipient == lpOwner) {
                require(noticeLiquidity.releaseDate != 0 && block.timestamp >= noticeLiquidity.releaseDate, "LP notice period has not been set or has not expired.");
                require(amount <= noticeLiquidity.amount, "LP can't transfer more tokens than given notice for.");

                // Clear the remaining notice balance, this prevents giving notice on all tokens and
                // trickling them out.
                noticeLiquidity = Notice(0, 0);
            }
        }

        super._transfer(sender, recipient, amount);
    }

    /**
     * @notice mint is only called when EMT tokens are burned on the L2 side of the EMT bridge 
     * and are then minted one-for-one to this contract on the Mainnet L1 side of the EMT bridge.
     * Once minted, EMTs are ready to trade on Uniswap.
     *
     * @param who The address to mint to the tokens to.
     * @param quantity The number of tokens to create, in wei.
     */
    function mint(address who, uint256 quantity) public onlyOwner {
        _mint(who, quantity);
    }

    /**
     * @notice Tokens are burned here on Mainnet to reduce total supply available to trade on Uniswap.
     *
     * @param quantity The number of tokens to destroy, in wei.
     */
    function burn(uint256 quantity) public {
        _burn(_msgSender(), quantity);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"treasuryAddr","type":"address"},{"internalType":"address","name":"buybackAddr","type":"address"},{"internalType":"address","name":"flipAddr","type":"address"},{"internalType":"address","name":"positionsAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseDate","type":"uint256"}],"name":"NoticeGiven","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyback","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"flip","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"who","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"numSeconds","type":"uint256"}],"name":"liquidityRedemptionNotice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noticeLiquidity","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"releaseDate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noticeTreasury","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"releaseDate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"positionsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"setBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"setFlip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"setNftId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"setPoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"setPositionsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"setTreasury","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":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"numSeconds","type":"uint256"}],"name":"treasuryTransferNotice","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405262093a806010553480156200001857600080fd5b50604051620044b7380380620044b783398181016040528101906200003e9190620005c2565b85858160039081620000519190620008f4565b508060049081620000639190620008f4565b50505062000076620001fb60201b60201c565b600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001ee600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886200020360201b60201c565b5050505050505062000b18565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000275576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026c9062000a3c565b60405180910390fd5b62000289600083836200037b60201b60201c565b80600260008282546200029d919062000a8d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620002f4919062000a8d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200035b919062000afb565b60405180910390a362000377600083836200038060201b60201c565b5050565b505050565b505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620003ae8162000399565b8114620003ba57600080fd5b50565b600081519050620003ce81620003a3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200042982620003de565b810181811067ffffffffffffffff821117156200044b576200044a620003ef565b5b80604052505050565b60006200046062000385565b90506200046e82826200041e565b919050565b600067ffffffffffffffff821115620004915762000490620003ef565b5b6200049c82620003de565b9050602081019050919050565b60005b83811015620004c9578082015181840152602081019050620004ac565b83811115620004d9576000848401525b50505050565b6000620004f6620004f08462000473565b62000454565b905082815260208101848484011115620005155762000514620003d9565b5b62000522848285620004a9565b509392505050565b600082601f830112620005425762000541620003d4565b5b815162000554848260208601620004df565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200058a826200055d565b9050919050565b6200059c816200057d565b8114620005a857600080fd5b50565b600081519050620005bc8162000591565b92915050565b600080600080600080600060e0888a031215620005e457620005e36200038f565b5b6000620005f48a828b01620003bd565b975050602088015167ffffffffffffffff81111562000618576200061762000394565b5b620006268a828b016200052a565b965050604088015167ffffffffffffffff8111156200064a576200064962000394565b5b620006588a828b016200052a565b95505060606200066b8a828b01620005ab565b94505060806200067e8a828b01620005ab565b93505060a0620006918a828b01620005ab565b92505060c0620006a48a828b01620005ab565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200070657607f821691505b6020821081036200071c576200071b620006be565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000747565b62000792868362000747565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620007d5620007cf620007c98462000399565b620007aa565b62000399565b9050919050565b6000819050919050565b620007f183620007b4565b620008096200080082620007dc565b84845462000754565b825550505050565b600090565b6200082062000811565b6200082d818484620007e6565b505050565b5b8181101562000855576200084960008262000816565b60018101905062000833565b5050565b601f821115620008a4576200086e8162000722565b620008798462000737565b8101602085101562000889578190505b620008a1620008988562000737565b83018262000832565b50505b505050565b600082821c905092915050565b6000620008c960001984600802620008a9565b1980831691505092915050565b6000620008e48383620008b6565b9150826002028217905092915050565b620008ff82620006b3565b67ffffffffffffffff8111156200091b576200091a620003ef565b5b620009278254620006ed565b6200093482828562000859565b600060209050601f8311600181146200096c576000841562000957578287015190505b620009638582620008d6565b865550620009d3565b601f1984166200097c8662000722565b60005b82811015620009a6578489015182556001820191506020850194506020810190506200097f565b86831015620009c65784890151620009c2601f891682620008b6565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000a24601f83620009db565b915062000a3182620009ec565b602082019050919050565b6000602082019050818103600083015262000a578162000a15565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000a9a8262000399565b915062000aa78362000399565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000adf5762000ade62000a5e565b5b828201905092915050565b62000af58162000399565b82525050565b600060208201905062000b12600083018462000aea565b92915050565b61398f8062000b286000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80638da5cb5b11610104578063bbeed845116100a2578063e9e15b4f11610071578063e9e15b4f1461055d578063f0f4426014610579578063f3856e7614610595578063f8ec6911146105b1576101da565b8063bbeed845146104d2578063c6bc5182146104f1578063cde4efa91461050f578063dd62ed3e1461052d576101da565b80639aebd086116100de5780639aebd08614610438578063a457c2d714610454578063a9059cbb14610484578063b3716d49146104b4576101da565b80638da5cb5b146103e057806395d89b41146103fe57806399b320f91461041c576101da565b8063313ce5671161017c578063470887261161014b578063470887261461035a57806361d027b31461037657806370a082311461039457806380e709d9146103c4576101da565b8063313ce567146102d457806339509351146102f257806340c10f191461032257806342966c681461033e576101da565b806318160ddd116101b857806318160ddd1461024b5780631dab900f1461026957806323b872dd146102855780632f071467146102b5576101da565b806306fdde03146101df578063095ea7b3146101fd5780631755ff211461022d575b600080fd5b6101e76105cf565b6040516101f49190612669565b60405180910390f35b61021760048036038101906102129190612724565b610661565b604051610224919061277f565b60405180910390f35b610235610684565b60405161024291906127a9565b60405180910390f35b6102536106aa565b60405161026091906127d3565b60405180910390f35b610283600480360381019061027e91906127ee565b6106b4565b005b61029f600480360381019061029a9190612841565b610b73565b6040516102ac919061277f565b60405180910390f35b6102bd610ba2565b6040516102cb929190612894565b60405180910390f35b6102dc610bb4565b6040516102e991906128d9565b60405180910390f35b61030c60048036038101906103079190612724565b610bbd565b604051610319919061277f565b60405180910390f35b61033c60048036038101906103379190612724565b610c67565b005b610358600480360381019061035391906128f4565b610d0c565b005b610374600480360381019061036f9190612921565b610d20565b005b61037e610e96565b60405161038b91906127a9565b60405180910390f35b6103ae60048036038101906103a99190612921565b610ebc565b6040516103bb91906127d3565b60405180910390f35b6103de60048036038101906103d991906128f4565b610f04565b005b6103e8610fa5565b6040516103f591906127a9565b60405180910390f35b610406610fcb565b6040516104139190612669565b60405180910390f35b610436600480360381019061043191906127ee565b61105d565b005b610452600480360381019061044d9190612921565b61130c565b005b61046e60048036038101906104699190612724565b6113e7565b60405161047b919061277f565b60405180910390f35b61049e60048036038101906104999190612724565b6114d1565b6040516104ab919061277f565b60405180910390f35b6104bc6114f4565b6040516104c991906127a9565b60405180910390f35b6104da61151a565b6040516104e8929190612894565b60405180910390f35b6104f961152c565b60405161050691906127d3565b60405180910390f35b610517611532565b60405161052491906127a9565b60405180910390f35b6105476004803603810190610542919061294e565b611558565b60405161055491906127d3565b60405180910390f35b61057760048036038101906105729190612921565b6115df565b005b610593600480360381019061058e9190612921565b6116ba565b005b6105af60048036038101906105aa9190612921565b611830565b005b6105b96119a6565b6040516105c691906127a9565b60405180910390f35b6060600380546105de906129bd565b80601f016020809104026020016040519081016040528092919081815260200182805461060a906129bd565b80156106575780601f1061062c57610100808354040283529160200191610657565b820191906000526020600020905b81548152906001019060200180831161063a57829003601f168201915b5050505050905090565b60008061066c6119cc565b90506106798185856119d4565b600191505092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166106f56119cc565b73ffffffffffffffffffffffffffffffffffffffff161461074b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074290612a3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036107dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d390612acc565b60405180910390fd5b601054811015610821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081890612b38565b60405180910390fd5b6000600f5403610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085d90612bca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90612c5c565b60405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e600f546040518263ffffffff1660e01b815260040161095b91906127d3565b602060405180830381865afa158015610978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099c9190612c91565b90508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0390612d30565b60405180910390fd5b6000600184610a1b9190612d7f565b42610a269190612dd9565b905060006007600101541480610a4157506007600101544210155b610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790612ea1565b60405180910390fd5b610aab600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610ebc565b851115610aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae490612f33565b60405180910390fd5b604051806040016040528086815260200182815250600760008201518160000155602082015181600101559050508573ffffffffffffffffffffffffffffffffffffffff167f070a0bf37a5cd52578f68438a1f23bb8b3b38d86ade0a09abd709982bdb1527f8683604051610b63929190612894565b60405180910390a2505050505050565b600080610b7e6119cc565b9050610b8b858285611b9d565b610b96858585611c29565b60019150509392505050565b60078060000154908060010154905082565b60006012905090565b600080610bc86119cc565b9050610c5c818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c579190612dd9565b6119d4565b600191505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ca86119cc565b73ffffffffffffffffffffffffffffffffffffffff1614610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590612a3a565b60405180910390fd5b610d088282611fb0565b5050565b610d1d610d176119cc565b8261210f565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d616119cc565b73ffffffffffffffffffffffffffffffffffffffff1614610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae90612a3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1d90612f9f565b60405180910390fd5b610e52600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826122e5565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f456119cc565b73ffffffffffffffffffffffffffffffffffffffff1614610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290612a3a565b60405180910390fd5b80600f8190555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054610fda906129bd565b80601f0160208091040260200160405190810160405280929190818152602001828054611006906129bd565b80156110535780601f1061102857610100808354040283529160200191611053565b820191906000526020600020905b81548152906001019060200180831161103657829003601f168201915b5050505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661109e6119cc565b73ffffffffffffffffffffffffffffffffffffffff16146110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb90612a3a565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90613031565b60405180910390fd5b6010548110156111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c090612b38565b60405180910390fd5b60006001826111d89190612d7f565b426111e39190612dd9565b9050600060056001015414806111fe57506005600101544210155b61123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123490612ea1565b60405180910390fd5b61124684610ebc565b831115611288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127f906130c3565b60405180910390fd5b604051806040016040528084815260200182815250600560008201518160000155602082015181600101559050508373ffffffffffffffffffffffffffffffffffffffff167f070a0bf37a5cd52578f68438a1f23bb8b3b38d86ade0a09abd709982bdb1527f84836040516112fe929190612894565b60405180910390a250505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661134d6119cc565b73ffffffffffffffffffffffffffffffffffffffff16146113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90612a3a565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806113f26119cc565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90613155565b60405180910390fd5b6114c582868684036119d4565b60019250505092915050565b6000806114dc6119cc565b90506114e9818585611c29565b600191505092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058060000154908060010154905082565b600f5481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166116206119cc565b73ffffffffffffffffffffffffffffffffffffffff1614611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166d90612a3a565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166116fb6119cc565b73ffffffffffffffffffffffffffffffffffffffff1614611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890612a3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790612f9f565b60405180910390fd5b6117ec600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826122e5565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118716119cc565b73ffffffffffffffffffffffffffffffffffffffff16146118c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118be90612a3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d90612f9f565b60405180910390fd5b611962600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826122e5565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a906131e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990613279565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611b9091906127d3565b60405180910390a3505050565b6000611ba98484611558565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611c235781811015611c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0c906132e5565b60405180910390fd5b611c2284848484036119d4565b5b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090613377565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611de557600060056001015414158015611d2957506005600101544210155b611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90613409565b60405180910390fd5b600560000154811115611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da79061349b565b60405180910390fd5b604051806040016040528060008152602001600081525060056000820151816000015560208201518160010155905050611fa0565b6000600f5414611f9f576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e600f546040518263ffffffff1660e01b8152600401611e5391906127d3565b602060405180830381865afa158015611e70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e949190612c91565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f9c57600060076001015414158015611ee457506007600101544210155b611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a9061352d565b60405180910390fd5b600760000154831115611f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f62906135bf565b60405180910390fd5b6040518060400160405280600081526020016000815250600760008201518160000155602082015181600101559050505b50505b5b611fab838383612347565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361201f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120169061362b565b60405180910390fd5b61202b600083836125c6565b806002600082825461203d9190612dd9565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120929190612dd9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120f791906127d3565b60405180910390a361210b600083836125cb565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361217e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612175906136bd565b60405180910390fd5b61218a826000836125c6565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122079061374f565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254612267919061376f565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122cc91906127d3565b60405180910390a36122e0836000846125cb565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561232a5750600061232883610ebc565b115b1561234357612342828261233d85610ebc565b611c29565b5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ad90613815565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c906138a7565b60405180910390fd5b6124308383836125c6565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156124b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ad90613939565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125499190612dd9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125ad91906127d3565b60405180910390a36125c08484846125cb565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561260a5780820151818401526020810190506125ef565b83811115612619576000848401525b50505050565b6000601f19601f8301169050919050565b600061263b826125d0565b61264581856125db565b93506126558185602086016125ec565b61265e8161261f565b840191505092915050565b600060208201905081810360008301526126838184612630565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126bb82612690565b9050919050565b6126cb816126b0565b81146126d657600080fd5b50565b6000813590506126e8816126c2565b92915050565b6000819050919050565b612701816126ee565b811461270c57600080fd5b50565b60008135905061271e816126f8565b92915050565b6000806040838503121561273b5761273a61268b565b5b6000612749858286016126d9565b925050602061275a8582860161270f565b9150509250929050565b60008115159050919050565b61277981612764565b82525050565b60006020820190506127946000830184612770565b92915050565b6127a3816126b0565b82525050565b60006020820190506127be600083018461279a565b92915050565b6127cd816126ee565b82525050565b60006020820190506127e860008301846127c4565b92915050565b6000806000606084860312156128075761280661268b565b5b6000612815868287016126d9565b93505060206128268682870161270f565b92505060406128378682870161270f565b9150509250925092565b60008060006060848603121561285a5761285961268b565b5b6000612868868287016126d9565b9350506020612879868287016126d9565b925050604061288a8682870161270f565b9150509250925092565b60006040820190506128a960008301856127c4565b6128b660208301846127c4565b9392505050565b600060ff82169050919050565b6128d3816128bd565b82525050565b60006020820190506128ee60008301846128ca565b92915050565b60006020828403121561290a5761290961268b565b5b60006129188482850161270f565b91505092915050565b6000602082840312156129375761293661268b565b5b6000612945848285016126d9565b91505092915050565b600080604083850312156129655761296461268b565b5b6000612973858286016126d9565b9250506020612984858286016126d9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129d557607f821691505b6020821081036129e8576129e761298e565b5b50919050565b7f596f7520617265206e6f74204f776e65722e0000000000000000000000000000600082015250565b6000612a246012836125db565b9150612a2f826129ee565b602082019050919050565b60006020820190508181036000830152612a5381612a17565b9050919050565b7f556e697377617020506f736974696f6e204d616e61676572206d75737420626560008201527f207365742e000000000000000000000000000000000000000000000000000000602082015250565b6000612ab66025836125db565b9150612ac182612a5a565b604082019050919050565b60006020820190508181036000830152612ae581612aa9565b9050919050565b7f4e6f7420656e6f756768206e6f7469636520676976656e2e0000000000000000600082015250565b6000612b226018836125db565b9150612b2d82612aec565b602082019050919050565b60006020820190508181036000830152612b5181612b15565b9050919050565b7f556e697377617020506f736974696f6e204e4654204964206d7573742062652060008201527f7365742e00000000000000000000000000000000000000000000000000000000602082015250565b6000612bb46024836125db565b9150612bbf82612b58565b604082019050919050565b60006020820190508181036000830152612be381612ba7565b9050919050565b7f54686520556e697377617020506f6f6c20636f6e74726163742061646472657360008201527f73206d757374206265207365742e000000000000000000000000000000000000602082015250565b6000612c46602e836125db565b9150612c5182612bea565b604082019050919050565b60006020820190508181036000830152612c7581612c39565b9050919050565b600081519050612c8b816126c2565b92915050565b600060208284031215612ca757612ca661268b565b5b6000612cb584828501612c7c565b91505092915050565b7f54686520737065636966696564206164647265737320646f6573206e6f74206f60008201527f776e2074686520506f736974696f6e73204e465420546f6b656e2e0000000000602082015250565b6000612d1a603b836125db565b9150612d2582612cbe565b604082019050919050565b60006020820190508181036000830152612d4981612d0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d8a826126ee565b9150612d95836126ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612dce57612dcd612d50565b5b828202905092915050565b6000612de4826126ee565b9150612def836126ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e2457612e23612d50565b5b828201905092915050565b7f43616e6e6f74206f766572777269746520616e2061637469766520657869737460008201527f696e67206e6f746963652e000000000000000000000000000000000000000000602082015250565b6000612e8b602b836125db565b9150612e9682612e2f565b604082019050919050565b60006020820190508181036000830152612eba81612e7e565b9050919050565b7f43616e27742067697665206e6f7469636520666f72206d6f7265204c6971756960008201527f6469747920546f6b656e73207468616e206f776e65642e000000000000000000602082015250565b6000612f1d6037836125db565b9150612f2882612ec1565b604082019050919050565b60006020820190508181036000830152612f4c81612f10565b9050919050565b7f43616e6e6f742061737369676e20746f206e756c6c2061646472657373000000600082015250565b6000612f89601d836125db565b9150612f9482612f53565b602082019050919050565b60006020820190508181036000830152612fb881612f7c565b9050919050565b7f5370656369666965642061646472657373206973206e6f74205472656173757260008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b600061301b6022836125db565b915061302682612fbf565b604082019050919050565b6000602082019050818103600083015261304a8161300e565b9050919050565b7f43616e27742067697665206e6f7469636520666f72206d6f726520454d54207460008201527f6f6b656e73207468616e206f776e65642e000000000000000000000000000000602082015250565b60006130ad6031836125db565b91506130b882613051565b604082019050919050565b600060208201905081810360008301526130dc816130a0565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061313f6025836125db565b915061314a826130e3565b604082019050919050565b6000602082019050818103600083015261316e81613132565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131d16024836125db565b91506131dc82613175565b604082019050919050565b60006020820190508181036000830152613200816131c4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006132636022836125db565b915061326e82613207565b604082019050919050565b6000602082019050818103600083015261329281613256565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006132cf601d836125db565b91506132da82613299565b602082019050919050565b600060208201905081810360008301526132fe816132c2565b9050919050565b7f4275796261636b2063616e6e6f74207472616e7366657220746f6b656e732c2060008201527f69742063616e206f6e6c79206275726e2e000000000000000000000000000000602082015250565b60006133616031836125db565b915061336c82613305565b604082019050919050565b6000602082019050818103600083015261339081613354565b9050919050565b7f4e6f7469636520706572696f6420686173206e6f74206265656e20736574206f60008201527f7220686173206e6f7420657870697265642e0000000000000000000000000000602082015250565b60006133f36032836125db565b91506133fe82613397565b604082019050919050565b60006020820190508181036000830152613422816133e6565b9050919050565b7f54726561737572792063616e2774207472616e73666572206d6f726520746f6b60008201527f656e73207468616e20676976656e206e6f7469636520666f722e000000000000602082015250565b6000613485603a836125db565b915061349082613429565b604082019050919050565b600060208201905081810360008301526134b481613478565b9050919050565b7f4c50206e6f7469636520706572696f6420686173206e6f74206265656e20736560008201527f74206f7220686173206e6f7420657870697265642e0000000000000000000000602082015250565b60006135176035836125db565b9150613522826134bb565b604082019050919050565b600060208201905081810360008301526135468161350a565b9050919050565b7f4c502063616e2774207472616e73666572206d6f726520746f6b656e7320746860008201527f616e20676976656e206e6f7469636520666f722e000000000000000000000000602082015250565b60006135a96034836125db565b91506135b48261354d565b604082019050919050565b600060208201905081810360008301526135d88161359c565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613615601f836125db565b9150613620826135df565b602082019050919050565b6000602082019050818103600083015261364481613608565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006136a76021836125db565b91506136b28261364b565b604082019050919050565b600060208201905081810360008301526136d68161369a565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006137396022836125db565b9150613744826136dd565b604082019050919050565b600060208201905081810360008301526137688161372c565b9050919050565b600061377a826126ee565b9150613785836126ee565b92508282101561379857613797612d50565b5b828203905092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137ff6025836125db565b915061380a826137a3565b604082019050919050565b6000602082019050818103600083015261382e816137f2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006138916023836125db565b915061389c82613835565b604082019050919050565b600060208201905081810360008301526138c081613884565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006139236026836125db565b915061392e826138c7565b604082019050919050565b6000602082019050818103600083015261395281613916565b905091905056fea26469706673582212208e0ce738372dbf1e409d114e543c060891edf4ef6bb21366bc86926c9d717d5b64736f6c634300080f003300000000000000000000000000000000000000000000021e19e0c9bab240000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000006bc693dbd2b197e3067832ac71ed0b6d38cfd85a00000000000000000000000044734875a9cfac1ea21a9721b37954d33a24139b0000000000000000000000002ec7d593763eed26defa231b4c566252e2667a6b0000000000000000000000001fa6d184abbfee00220d6acfcd3ec6dcd0373da2000000000000000000000000000000000000000000000000000000000000000b454d54524920546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003454d540000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80638da5cb5b11610104578063bbeed845116100a2578063e9e15b4f11610071578063e9e15b4f1461055d578063f0f4426014610579578063f3856e7614610595578063f8ec6911146105b1576101da565b8063bbeed845146104d2578063c6bc5182146104f1578063cde4efa91461050f578063dd62ed3e1461052d576101da565b80639aebd086116100de5780639aebd08614610438578063a457c2d714610454578063a9059cbb14610484578063b3716d49146104b4576101da565b80638da5cb5b146103e057806395d89b41146103fe57806399b320f91461041c576101da565b8063313ce5671161017c578063470887261161014b578063470887261461035a57806361d027b31461037657806370a082311461039457806380e709d9146103c4576101da565b8063313ce567146102d457806339509351146102f257806340c10f191461032257806342966c681461033e576101da565b806318160ddd116101b857806318160ddd1461024b5780631dab900f1461026957806323b872dd146102855780632f071467146102b5576101da565b806306fdde03146101df578063095ea7b3146101fd5780631755ff211461022d575b600080fd5b6101e76105cf565b6040516101f49190612669565b60405180910390f35b61021760048036038101906102129190612724565b610661565b604051610224919061277f565b60405180910390f35b610235610684565b60405161024291906127a9565b60405180910390f35b6102536106aa565b60405161026091906127d3565b60405180910390f35b610283600480360381019061027e91906127ee565b6106b4565b005b61029f600480360381019061029a9190612841565b610b73565b6040516102ac919061277f565b60405180910390f35b6102bd610ba2565b6040516102cb929190612894565b60405180910390f35b6102dc610bb4565b6040516102e991906128d9565b60405180910390f35b61030c60048036038101906103079190612724565b610bbd565b604051610319919061277f565b60405180910390f35b61033c60048036038101906103379190612724565b610c67565b005b610358600480360381019061035391906128f4565b610d0c565b005b610374600480360381019061036f9190612921565b610d20565b005b61037e610e96565b60405161038b91906127a9565b60405180910390f35b6103ae60048036038101906103a99190612921565b610ebc565b6040516103bb91906127d3565b60405180910390f35b6103de60048036038101906103d991906128f4565b610f04565b005b6103e8610fa5565b6040516103f591906127a9565b60405180910390f35b610406610fcb565b6040516104139190612669565b60405180910390f35b610436600480360381019061043191906127ee565b61105d565b005b610452600480360381019061044d9190612921565b61130c565b005b61046e60048036038101906104699190612724565b6113e7565b60405161047b919061277f565b60405180910390f35b61049e60048036038101906104999190612724565b6114d1565b6040516104ab919061277f565b60405180910390f35b6104bc6114f4565b6040516104c991906127a9565b60405180910390f35b6104da61151a565b6040516104e8929190612894565b60405180910390f35b6104f961152c565b60405161050691906127d3565b60405180910390f35b610517611532565b60405161052491906127a9565b60405180910390f35b6105476004803603810190610542919061294e565b611558565b60405161055491906127d3565b60405180910390f35b61057760048036038101906105729190612921565b6115df565b005b610593600480360381019061058e9190612921565b6116ba565b005b6105af60048036038101906105aa9190612921565b611830565b005b6105b96119a6565b6040516105c691906127a9565b60405180910390f35b6060600380546105de906129bd565b80601f016020809104026020016040519081016040528092919081815260200182805461060a906129bd565b80156106575780601f1061062c57610100808354040283529160200191610657565b820191906000526020600020905b81548152906001019060200180831161063a57829003601f168201915b5050505050905090565b60008061066c6119cc565b90506106798185856119d4565b600191505092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166106f56119cc565b73ffffffffffffffffffffffffffffffffffffffff161461074b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074290612a3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036107dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d390612acc565b60405180910390fd5b601054811015610821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081890612b38565b60405180910390fd5b6000600f5403610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085d90612bca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee90612c5c565b60405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e600f546040518263ffffffff1660e01b815260040161095b91906127d3565b602060405180830381865afa158015610978573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099c9190612c91565b90508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0390612d30565b60405180910390fd5b6000600184610a1b9190612d7f565b42610a269190612dd9565b905060006007600101541480610a4157506007600101544210155b610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790612ea1565b60405180910390fd5b610aab600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610ebc565b851115610aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae490612f33565b60405180910390fd5b604051806040016040528086815260200182815250600760008201518160000155602082015181600101559050508573ffffffffffffffffffffffffffffffffffffffff167f070a0bf37a5cd52578f68438a1f23bb8b3b38d86ade0a09abd709982bdb1527f8683604051610b63929190612894565b60405180910390a2505050505050565b600080610b7e6119cc565b9050610b8b858285611b9d565b610b96858585611c29565b60019150509392505050565b60078060000154908060010154905082565b60006012905090565b600080610bc86119cc565b9050610c5c818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c579190612dd9565b6119d4565b600191505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ca86119cc565b73ffffffffffffffffffffffffffffffffffffffff1614610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590612a3a565b60405180910390fd5b610d088282611fb0565b5050565b610d1d610d176119cc565b8261210f565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d616119cc565b73ffffffffffffffffffffffffffffffffffffffff1614610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae90612a3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1d90612f9f565b60405180910390fd5b610e52600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826122e5565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f456119cc565b73ffffffffffffffffffffffffffffffffffffffff1614610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290612a3a565b60405180910390fd5b80600f8190555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054610fda906129bd565b80601f0160208091040260200160405190810160405280929190818152602001828054611006906129bd565b80156110535780601f1061102857610100808354040283529160200191611053565b820191906000526020600020905b81548152906001019060200180831161103657829003601f168201915b5050505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661109e6119cc565b73ffffffffffffffffffffffffffffffffffffffff16146110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110eb90612a3a565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90613031565b60405180910390fd5b6010548110156111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c090612b38565b60405180910390fd5b60006001826111d89190612d7f565b426111e39190612dd9565b9050600060056001015414806111fe57506005600101544210155b61123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123490612ea1565b60405180910390fd5b61124684610ebc565b831115611288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127f906130c3565b60405180910390fd5b604051806040016040528084815260200182815250600560008201518160000155602082015181600101559050508373ffffffffffffffffffffffffffffffffffffffff167f070a0bf37a5cd52578f68438a1f23bb8b3b38d86ade0a09abd709982bdb1527f84836040516112fe929190612894565b60405180910390a250505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661134d6119cc565b73ffffffffffffffffffffffffffffffffffffffff16146113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90612a3a565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806113f26119cc565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90613155565b60405180910390fd5b6114c582868684036119d4565b60019250505092915050565b6000806114dc6119cc565b90506114e9818585611c29565b600191505092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058060000154908060010154905082565b600f5481565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166116206119cc565b73ffffffffffffffffffffffffffffffffffffffff1614611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166d90612a3a565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166116fb6119cc565b73ffffffffffffffffffffffffffffffffffffffff1614611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890612a3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790612f9f565b60405180910390fd5b6117ec600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826122e5565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118716119cc565b73ffffffffffffffffffffffffffffffffffffffff16146118c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118be90612a3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d90612f9f565b60405180910390fd5b611962600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826122e5565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a906131e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990613279565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611b9091906127d3565b60405180910390a3505050565b6000611ba98484611558565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611c235781811015611c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0c906132e5565b60405180910390fd5b611c2284848484036119d4565b5b50505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090613377565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611de557600060056001015414158015611d2957506005600101544210155b611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90613409565b60405180910390fd5b600560000154811115611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da79061349b565b60405180910390fd5b604051806040016040528060008152602001600081525060056000820151816000015560208201518160010155905050611fa0565b6000600f5414611f9f576000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16636352211e600f546040518263ffffffff1660e01b8152600401611e5391906127d3565b602060405180830381865afa158015611e70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e949190612c91565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f9c57600060076001015414158015611ee457506007600101544210155b611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a9061352d565b60405180910390fd5b600760000154831115611f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f62906135bf565b60405180910390fd5b6040518060400160405280600081526020016000815250600760008201518160000155602082015181600101559050505b50505b5b611fab838383612347565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361201f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120169061362b565b60405180910390fd5b61202b600083836125c6565b806002600082825461203d9190612dd9565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120929190612dd9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120f791906127d3565b60405180910390a361210b600083836125cb565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361217e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612175906136bd565b60405180910390fd5b61218a826000836125c6565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122079061374f565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254612267919061376f565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122cc91906127d3565b60405180910390a36122e0836000846125cb565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561232a5750600061232883610ebc565b115b1561234357612342828261233d85610ebc565b611c29565b5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ad90613815565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c906138a7565b60405180910390fd5b6124308383836125c6565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156124b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ad90613939565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125499190612dd9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125ad91906127d3565b60405180910390a36125c08484846125cb565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561260a5780820151818401526020810190506125ef565b83811115612619576000848401525b50505050565b6000601f19601f8301169050919050565b600061263b826125d0565b61264581856125db565b93506126558185602086016125ec565b61265e8161261f565b840191505092915050565b600060208201905081810360008301526126838184612630565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126bb82612690565b9050919050565b6126cb816126b0565b81146126d657600080fd5b50565b6000813590506126e8816126c2565b92915050565b6000819050919050565b612701816126ee565b811461270c57600080fd5b50565b60008135905061271e816126f8565b92915050565b6000806040838503121561273b5761273a61268b565b5b6000612749858286016126d9565b925050602061275a8582860161270f565b9150509250929050565b60008115159050919050565b61277981612764565b82525050565b60006020820190506127946000830184612770565b92915050565b6127a3816126b0565b82525050565b60006020820190506127be600083018461279a565b92915050565b6127cd816126ee565b82525050565b60006020820190506127e860008301846127c4565b92915050565b6000806000606084860312156128075761280661268b565b5b6000612815868287016126d9565b93505060206128268682870161270f565b92505060406128378682870161270f565b9150509250925092565b60008060006060848603121561285a5761285961268b565b5b6000612868868287016126d9565b9350506020612879868287016126d9565b925050604061288a8682870161270f565b9150509250925092565b60006040820190506128a960008301856127c4565b6128b660208301846127c4565b9392505050565b600060ff82169050919050565b6128d3816128bd565b82525050565b60006020820190506128ee60008301846128ca565b92915050565b60006020828403121561290a5761290961268b565b5b60006129188482850161270f565b91505092915050565b6000602082840312156129375761293661268b565b5b6000612945848285016126d9565b91505092915050565b600080604083850312156129655761296461268b565b5b6000612973858286016126d9565b9250506020612984858286016126d9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129d557607f821691505b6020821081036129e8576129e761298e565b5b50919050565b7f596f7520617265206e6f74204f776e65722e0000000000000000000000000000600082015250565b6000612a246012836125db565b9150612a2f826129ee565b602082019050919050565b60006020820190508181036000830152612a5381612a17565b9050919050565b7f556e697377617020506f736974696f6e204d616e61676572206d75737420626560008201527f207365742e000000000000000000000000000000000000000000000000000000602082015250565b6000612ab66025836125db565b9150612ac182612a5a565b604082019050919050565b60006020820190508181036000830152612ae581612aa9565b9050919050565b7f4e6f7420656e6f756768206e6f7469636520676976656e2e0000000000000000600082015250565b6000612b226018836125db565b9150612b2d82612aec565b602082019050919050565b60006020820190508181036000830152612b5181612b15565b9050919050565b7f556e697377617020506f736974696f6e204e4654204964206d7573742062652060008201527f7365742e00000000000000000000000000000000000000000000000000000000602082015250565b6000612bb46024836125db565b9150612bbf82612b58565b604082019050919050565b60006020820190508181036000830152612be381612ba7565b9050919050565b7f54686520556e697377617020506f6f6c20636f6e74726163742061646472657360008201527f73206d757374206265207365742e000000000000000000000000000000000000602082015250565b6000612c46602e836125db565b9150612c5182612bea565b604082019050919050565b60006020820190508181036000830152612c7581612c39565b9050919050565b600081519050612c8b816126c2565b92915050565b600060208284031215612ca757612ca661268b565b5b6000612cb584828501612c7c565b91505092915050565b7f54686520737065636966696564206164647265737320646f6573206e6f74206f60008201527f776e2074686520506f736974696f6e73204e465420546f6b656e2e0000000000602082015250565b6000612d1a603b836125db565b9150612d2582612cbe565b604082019050919050565b60006020820190508181036000830152612d4981612d0d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d8a826126ee565b9150612d95836126ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612dce57612dcd612d50565b5b828202905092915050565b6000612de4826126ee565b9150612def836126ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e2457612e23612d50565b5b828201905092915050565b7f43616e6e6f74206f766572777269746520616e2061637469766520657869737460008201527f696e67206e6f746963652e000000000000000000000000000000000000000000602082015250565b6000612e8b602b836125db565b9150612e9682612e2f565b604082019050919050565b60006020820190508181036000830152612eba81612e7e565b9050919050565b7f43616e27742067697665206e6f7469636520666f72206d6f7265204c6971756960008201527f6469747920546f6b656e73207468616e206f776e65642e000000000000000000602082015250565b6000612f1d6037836125db565b9150612f2882612ec1565b604082019050919050565b60006020820190508181036000830152612f4c81612f10565b9050919050565b7f43616e6e6f742061737369676e20746f206e756c6c2061646472657373000000600082015250565b6000612f89601d836125db565b9150612f9482612f53565b602082019050919050565b60006020820190508181036000830152612fb881612f7c565b9050919050565b7f5370656369666965642061646472657373206973206e6f74205472656173757260008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b600061301b6022836125db565b915061302682612fbf565b604082019050919050565b6000602082019050818103600083015261304a8161300e565b9050919050565b7f43616e27742067697665206e6f7469636520666f72206d6f726520454d54207460008201527f6f6b656e73207468616e206f776e65642e000000000000000000000000000000602082015250565b60006130ad6031836125db565b91506130b882613051565b604082019050919050565b600060208201905081810360008301526130dc816130a0565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061313f6025836125db565b915061314a826130e3565b604082019050919050565b6000602082019050818103600083015261316e81613132565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131d16024836125db565b91506131dc82613175565b604082019050919050565b60006020820190508181036000830152613200816131c4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006132636022836125db565b915061326e82613207565b604082019050919050565b6000602082019050818103600083015261329281613256565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006132cf601d836125db565b91506132da82613299565b602082019050919050565b600060208201905081810360008301526132fe816132c2565b9050919050565b7f4275796261636b2063616e6e6f74207472616e7366657220746f6b656e732c2060008201527f69742063616e206f6e6c79206275726e2e000000000000000000000000000000602082015250565b60006133616031836125db565b915061336c82613305565b604082019050919050565b6000602082019050818103600083015261339081613354565b9050919050565b7f4e6f7469636520706572696f6420686173206e6f74206265656e20736574206f60008201527f7220686173206e6f7420657870697265642e0000000000000000000000000000602082015250565b60006133f36032836125db565b91506133fe82613397565b604082019050919050565b60006020820190508181036000830152613422816133e6565b9050919050565b7f54726561737572792063616e2774207472616e73666572206d6f726520746f6b60008201527f656e73207468616e20676976656e206e6f7469636520666f722e000000000000602082015250565b6000613485603a836125db565b915061349082613429565b604082019050919050565b600060208201905081810360008301526134b481613478565b9050919050565b7f4c50206e6f7469636520706572696f6420686173206e6f74206265656e20736560008201527f74206f7220686173206e6f7420657870697265642e0000000000000000000000602082015250565b60006135176035836125db565b9150613522826134bb565b604082019050919050565b600060208201905081810360008301526135468161350a565b9050919050565b7f4c502063616e2774207472616e73666572206d6f726520746f6b656e7320746860008201527f616e20676976656e206e6f7469636520666f722e000000000000000000000000602082015250565b60006135a96034836125db565b91506135b48261354d565b604082019050919050565b600060208201905081810360008301526135d88161359c565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613615601f836125db565b9150613620826135df565b602082019050919050565b6000602082019050818103600083015261364481613608565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006136a76021836125db565b91506136b28261364b565b604082019050919050565b600060208201905081810360008301526136d68161369a565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006137396022836125db565b9150613744826136dd565b604082019050919050565b600060208201905081810360008301526137688161372c565b9050919050565b600061377a826126ee565b9150613785836126ee565b92508282101561379857613797612d50565b5b828203905092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137ff6025836125db565b915061380a826137a3565b604082019050919050565b6000602082019050818103600083015261382e816137f2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006138916023836125db565b915061389c82613835565b604082019050919050565b600060208201905081810360008301526138c081613884565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006139236026836125db565b915061392e826138c7565b604082019050919050565b6000602082019050818103600083015261395281613916565b905091905056fea26469706673582212208e0ce738372dbf1e409d114e543c060891edf4ef6bb21366bc86926c9d717d5b64736f6c634300080f0033

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

00000000000000000000000000000000000000000000021e19e0c9bab240000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000006bc693dbd2b197e3067832ac71ed0b6d38cfd85a00000000000000000000000044734875a9cfac1ea21a9721b37954d33a24139b0000000000000000000000002ec7d593763eed26defa231b4c566252e2667a6b0000000000000000000000001fa6d184abbfee00220d6acfcd3ec6dcd0373da2000000000000000000000000000000000000000000000000000000000000000b454d54524920546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003454d540000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : initialSupply (uint256): 10000000000000000000000
Arg [1] : name (string): EMTRI Token
Arg [2] : symbol (string): EMT
Arg [3] : treasuryAddr (address): 0x6bC693DBd2b197e3067832Ac71eD0B6d38CFD85A
Arg [4] : buybackAddr (address): 0x44734875A9CFAc1ea21a9721B37954D33a24139B
Arg [5] : flipAddr (address): 0x2eC7d593763eed26DEFA231B4c566252E2667A6b
Arg [6] : positionsAddr (address): 0x1FA6D184abbfEe00220d6acFCD3Ec6dcD0373dA2

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000021e19e0c9bab2400000
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000006bc693dbd2b197e3067832ac71ed0b6d38cfd85a
Arg [4] : 00000000000000000000000044734875a9cfac1ea21a9721b37954d33a24139b
Arg [5] : 0000000000000000000000002ec7d593763eed26defa231b4c566252e2667a6b
Arg [6] : 0000000000000000000000001fa6d184abbfee00220d6acfcd3ec6dcd0373da2
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [8] : 454d54524920546f6b656e000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 454d540000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

25856:10700:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12432:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14783:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27442:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13552:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32662:1075;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15564:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26617:29;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;13394:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16268:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36162:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36466:87;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29942:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26907:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13723:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31047:76;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26769:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12651:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31543:664;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30823:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17011:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14056:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27610:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26457:28;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;27752:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27294:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14312:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30609:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29299:198;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29624:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27155:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12432:100;12486:13;12519:5;12512:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12432:100;:::o;14783:201::-;14866:4;14883:13;14899:12;:10;:12::i;:::-;14883:28;;14922:32;14931:5;14938:7;14947:6;14922:8;:32::i;:::-;14972:4;14965:11;;;14783:201;;;;:::o;27442:26::-;;;;;;;;;;;;;:::o;13552:108::-;13613:7;13640:12;;13633:19;;13552:108;:::o;32662:1075::-;28096:5;;;;;;;;;;;28080:21;;:12;:10;:12::i;:::-;:21;;;28072:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;32810:1:::1;32782:30;;:16;;;;;;;;;;;:30;;::::0;32774:80:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;32887:13;;32873:10;:27;;32865:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32957:1;32948:5;;:10:::0;32940:59:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;33041:1;33018:25;;:11;;;;;;;;;;;:25;;::::0;33010:84:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;33107:17;33135:16;;;;;;;;;;;33107:45;;33163:15;33181:9;:17;;;33199:5;;33181:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33163:42;;33231:7;33224:14;;:3;:14;;;33216:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;33315:12;33362:9;33349:10;:22;;;;:::i;:::-;33330:15;:42;;;;:::i;:::-;33315:57;;33424:1;33393:15;:27;;;:32;:82;;;;33448:15;:27;;;33429:15;:46;;33393:82;33385:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;33552:22;33562:11;;;;;;;;;;;33552:9;:22::i;:::-;33542:6;:32;;33534:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;33663:20;;;;;;;;33670:6;33663:20;;;;33678:4;33663:20;;::::0;33645:15:::1;:38;;;;;;;;;;;;;;;;;;;33711:3;33699:30;;;33716:6;33724:4;33699:30;;;;;;;:::i;:::-;;;;;;;;32763:974;;;32662:1075:::0;;;:::o;15564:295::-;15695:4;15712:15;15730:12;:10;:12::i;:::-;15712:30;;15753:38;15769:4;15775:7;15784:6;15753:15;:38::i;:::-;15802:27;15812:4;15818:2;15822:6;15802:9;:27::i;:::-;15847:4;15840:11;;;15564:295;;;;;:::o;26617:29::-;;;;;;;;;;;;;;:::o;13394:93::-;13452:5;13477:2;13470:9;;13394:93;:::o;16268:240::-;16356:4;16373:13;16389:12;:10;:12::i;:::-;16373:28;;16412:66;16421:5;16428:7;16467:10;16437:11;:18;16449:5;16437:18;;;;;;;;;;;;;;;:27;16456:7;16437:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;16412:8;:66::i;:::-;16496:4;16489:11;;;16268:240;;;;:::o;36162:101::-;28096:5;;;;;;;;;;;28080:21;;:12;:10;:12::i;:::-;:21;;;28072:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;36235:20:::1;36241:3;36246:8;36235:5;:20::i;:::-;36162:101:::0;;:::o;36466:87::-;36516:29;36522:12;:10;:12::i;:::-;36536:8;36516:5;:29::i;:::-;36466:87;:::o;29942:186::-;28096:5;;;;;;;;;;;28080:21;;:12;:10;:12::i;:::-;:21;;;28072:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;30023:3:::1;30008:19;;:3;:19;;::::0;30000:61:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;30074:25;30089:4;;;;;;;;;;;30095:3;30074:14;:25::i;:::-;30117:3;30110:4;;:10;;;;;;;;;;;;;;;;;;29942:186:::0;:::o;26907:23::-;;;;;;;;;;;;;:::o;13723:127::-;13797:7;13824:9;:18;13834:7;13824:18;;;;;;;;;;;;;;;;13817:25;;13723:127;;;:::o;31047:76::-;28096:5;;;;;;;;;;;28080:21;;:12;:10;:12::i;:::-;:21;;;28072:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;31113:2:::1;31105:5;:10;;;;31047:76:::0;:::o;26769:20::-;;;;;;;;;;;;;:::o;12651:104::-;12707:13;12740:7;12733:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12651:104;:::o;31543:664::-;28096:5;;;;;;;;;;;28080:21;;:12;:10;:12::i;:::-;:21;;;28072:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;31667:8:::1;;;;;;;;;;;31660:15;;:3;:15;;;31652:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;31747:13;;31733:10;:27;;31725:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31802:12;31849:9;31836:10;:22;;;;:::i;:::-;31817:15;:42;;;;:::i;:::-;31802:57;;31910:1;31880:14;:26;;;:31;:80;;;;31934:14;:26;;;31915:15;:45;;31880:80;31872:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;32037:14;32047:3;32037:9;:14::i;:::-;32027:6;:24;;32019:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;32133:20;;;;;;;;32140:6;32133:20;;;;32148:4;32133:20;;::::0;32116:14:::1;:37;;;;;;;;;;;;;;;;;;;32181:3;32169:30;;;32186:6;32194:4;32169:30;;;;;;;:::i;:::-;;;;;;;;31641:566;31543:664:::0;;;:::o;30823:100::-;28096:5;;;;;;;;;;;28080:21;;:12;:10;:12::i;:::-;:21;;;28072:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;30912:3:::1;30893:16;;:22;;;;;;;;;;;;;;;;;;30823:100:::0;:::o;17011:438::-;17104:4;17121:13;17137:12;:10;:12::i;:::-;17121:28;;17160:24;17187:11;:18;17199:5;17187:18;;;;;;;;;;;;;;;:27;17206:7;17187:27;;;;;;;;;;;;;;;;17160:54;;17253:15;17233:16;:35;;17225:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;17346:60;17355:5;17362:7;17390:15;17371:16;:34;17346:8;:60::i;:::-;17437:4;17430:11;;;;17011:438;;;;:::o;14056:193::-;14135:4;14152:13;14168:12;:10;:12::i;:::-;14152:28;;14191;14201:5;14208:2;14212:6;14191:9;:28::i;:::-;14237:4;14230:11;;;14056:193;;;;:::o;27610:31::-;;;;;;;;;;;;;:::o;26457:28::-;;;;;;;;;;;;;;:::o;27752:20::-;;;;:::o;27294:19::-;;;;;;;;;;;;;:::o;14312:151::-;14401:7;14428:11;:18;14440:5;14428:18;;;;;;;;;;;;;;;:27;14447:7;14428:27;;;;;;;;;;;;;;;;14421:34;;14312:151;;;;:::o;30609:90::-;28096:5;;;;;;;;;;;28080:21;;:12;:10;:12::i;:::-;:21;;;28072:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;30688:3:::1;30674:11;;:17;;;;;;;;;;;;;;;;;;30609:90:::0;:::o;29299:198::-;28096:5;;;;;;;;;;;28080:21;;:12;:10;:12::i;:::-;:21;;;28072:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;29384:3:::1;29369:19;;:3;:19;;::::0;29361:61:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;29435:29;29450:8;;;;;;;;;;;29460:3;29435:14;:29::i;:::-;29486:3;29475:8;;:14;;;;;;;;;;;;;;;;;;29299:198:::0;:::o;29624:195::-;28096:5;;;;;;;;;;;28080:21;;:12;:10;:12::i;:::-;:21;;;28072:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;29708:3:::1;29693:19;;:3;:19;;::::0;29685:61:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;29759:28;29774:7;;;;;;;;;;;29783:3;29759:14;:28::i;:::-;29808:3;29798:7;;:13;;;;;;;;;;;;;;;;;;29624:195:::0;:::o;27155:22::-;;;;;;;;;;;;;:::o;6458:98::-;6511:7;6538:10;6531:17;;6458:98;:::o;20647:380::-;20800:1;20783:19;;:5;:19;;;20775:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20881:1;20862:21;;:7;:21;;;20854:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20965:6;20935:11;:18;20947:5;20935:18;;;;;;;;;;;;;;;:27;20954:7;20935:27;;;;;;;;;;;;;;;:36;;;;21003:7;20987:32;;20996:5;20987:32;;;21012:6;20987:32;;;;;;:::i;:::-;;;;;;;;20647:380;;;:::o;21314:453::-;21449:24;21476:25;21486:5;21493:7;21476:9;:25::i;:::-;21449:52;;21536:17;21516:16;:37;21512:248;;21598:6;21578:16;:26;;21570:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21682:51;21691:5;21698:7;21726:6;21707:16;:25;21682:8;:51::i;:::-;21512:248;21438:329;21314:453;;;:::o;34269:1485::-;34386:7;;;;;;;;;;;34376:17;;:6;:17;;;34368:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;34471:8;;;;;;;;;;;34461:18;;:6;:18;;;34458:1234;;34534:1;34504:14;:26;;;:31;;:80;;;;;34558:14;:26;;;34539:15;:45;;34504:80;34496:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;34672:14;:21;;;34662:6;:31;;34654:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;34924:12;;;;;;;;34931:1;34924:12;;;;34934:1;34924:12;;;34907:14;:29;;;;;;;;;;;;;;;;;;;34458:1234;;;34975:1;34966:5;;:10;34963:729;;35047:17;35075:16;;;;;;;;;;;35047:45;;35107:15;35125:9;:17;;;35143:5;;35125:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35107:42;;35180:7;35167:20;;:9;:20;;;35164:517;;35247:1;35216:15;:27;;;:32;;:82;;;;;35271:15;:27;;;35252:15;:46;;35216:82;35208:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;35393:15;:22;;;35383:6;:32;;35375:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;35653:12;;;;;;;;35660:1;35653:12;;;;35663:1;35653:12;;;35635:15;:30;;;;;;;;;;;;;;;;;;;35164:517;34978:714;;34963:729;34458:1234;35704:42;35720:6;35728:9;35739:6;35704:15;:42::i;:::-;34269:1485;;;:::o;18886:399::-;18989:1;18970:21;;:7;:21;;;18962:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;19040:49;19069:1;19073:7;19082:6;19040:20;:49::i;:::-;19118:6;19102:12;;:22;;;;;;;:::i;:::-;;;;;;;;19157:6;19135:9;:18;19145:7;19135:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;19200:7;19179:37;;19196:1;19179:37;;;19209:6;19179:37;;;;;;:::i;:::-;;;;;;;;19229:48;19257:1;19261:7;19270:6;19229:19;:48::i;:::-;18886:399;;:::o;19618:591::-;19721:1;19702:21;;:7;:21;;;19694:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19774:49;19795:7;19812:1;19816:6;19774:20;:49::i;:::-;19836:22;19861:9;:18;19871:7;19861:18;;;;;;;;;;;;;;;;19836:43;;19916:6;19898:14;:24;;19890:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;20035:6;20018:14;:23;19997:9;:18;20007:7;19997:18;;;;;;;;;;;;;;;:44;;;;20079:6;20063:12;;:22;;;;;;;:::i;:::-;;;;;;;;20129:1;20103:37;;20112:7;20103:37;;;20133:6;20103:37;;;;;;:::i;:::-;;;;;;;;20153:48;20173:7;20190:1;20194:6;20153:19;:48::i;:::-;19683:526;19618:591;;:::o;30347:174::-;30435:3;30419:20;;:4;:20;;;;:43;;;;;30461:1;30443:15;30453:4;30443:9;:15::i;:::-;:19;30419:43;30416:97;;;30477:36;30487:4;30493:2;30497:15;30507:4;30497:9;:15::i;:::-;30477:9;:36::i;:::-;30416:97;30347:174;;:::o;17928:671::-;18075:1;18059:18;;:4;:18;;;18051:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18152:1;18138:16;;:2;:16;;;18130:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;18207:38;18228:4;18234:2;18238:6;18207:20;:38::i;:::-;18258:19;18280:9;:15;18290:4;18280:15;;;;;;;;;;;;;;;;18258:37;;18329:6;18314:11;:21;;18306:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;18446:6;18432:11;:20;18414:9;:15;18424:4;18414:15;;;;;;;;;;;;;;;:38;;;;18491:6;18474:9;:13;18484:2;18474:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;18530:2;18515:26;;18524:4;18515:26;;;18534:6;18515:26;;;;;;:::i;:::-;;;;;;;;18554:37;18574:4;18580:2;18584:6;18554:19;:37::i;:::-;18040:559;17928:671;;;:::o;22367:125::-;;;;:::o;23096:124::-;;;;:::o;7:99:1:-;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:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:118::-;3933:24;3951:5;3933:24;:::i;:::-;3928:3;3921:37;3846:118;;:::o;3970:222::-;4063:4;4101:2;4090:9;4086:18;4078:26;;4114:71;4182:1;4171:9;4167:17;4158:6;4114:71;:::i;:::-;3970:222;;;;:::o;4198:619::-;4275:6;4283;4291;4340:2;4328:9;4319:7;4315:23;4311:32;4308:119;;;4346:79;;:::i;:::-;4308:119;4466:1;4491:53;4536:7;4527:6;4516:9;4512:22;4491:53;:::i;:::-;4481:63;;4437:117;4593:2;4619:53;4664:7;4655:6;4644:9;4640:22;4619:53;:::i;:::-;4609:63;;4564:118;4721:2;4747:53;4792:7;4783:6;4772:9;4768:22;4747:53;:::i;:::-;4737:63;;4692:118;4198:619;;;;;:::o;4823:::-;4900:6;4908;4916;4965:2;4953:9;4944:7;4940:23;4936:32;4933:119;;;4971:79;;:::i;:::-;4933:119;5091:1;5116:53;5161:7;5152:6;5141:9;5137:22;5116:53;:::i;:::-;5106:63;;5062:117;5218:2;5244:53;5289:7;5280:6;5269:9;5265:22;5244:53;:::i;:::-;5234:63;;5189:118;5346:2;5372:53;5417:7;5408:6;5397:9;5393:22;5372:53;:::i;:::-;5362:63;;5317:118;4823:619;;;;;:::o;5448:332::-;5569:4;5607:2;5596:9;5592:18;5584:26;;5620:71;5688:1;5677:9;5673:17;5664:6;5620:71;:::i;:::-;5701:72;5769:2;5758:9;5754:18;5745:6;5701:72;:::i;:::-;5448:332;;;;;:::o;5786:86::-;5821:7;5861:4;5854:5;5850:16;5839:27;;5786:86;;;:::o;5878:112::-;5961:22;5977:5;5961:22;:::i;:::-;5956:3;5949:35;5878:112;;:::o;5996:214::-;6085:4;6123:2;6112:9;6108:18;6100:26;;6136:67;6200:1;6189:9;6185:17;6176:6;6136:67;:::i;:::-;5996:214;;;;:::o;6216:329::-;6275:6;6324:2;6312:9;6303:7;6299:23;6295:32;6292:119;;;6330:79;;:::i;:::-;6292:119;6450:1;6475:53;6520:7;6511:6;6500:9;6496:22;6475:53;:::i;:::-;6465:63;;6421:117;6216:329;;;;:::o;6551:::-;6610:6;6659:2;6647:9;6638:7;6634:23;6630:32;6627:119;;;6665:79;;:::i;:::-;6627:119;6785:1;6810:53;6855:7;6846:6;6835:9;6831:22;6810:53;:::i;:::-;6800:63;;6756:117;6551:329;;;;:::o;6886:474::-;6954:6;6962;7011:2;6999:9;6990:7;6986:23;6982:32;6979:119;;;7017:79;;:::i;:::-;6979:119;7137:1;7162:53;7207:7;7198:6;7187:9;7183:22;7162:53;:::i;:::-;7152:63;;7108:117;7264:2;7290:53;7335:7;7326:6;7315:9;7311:22;7290:53;:::i;:::-;7280:63;;7235:118;6886:474;;;;;:::o;7366:180::-;7414:77;7411:1;7404:88;7511:4;7508:1;7501:15;7535:4;7532:1;7525:15;7552:320;7596:6;7633:1;7627:4;7623:12;7613:22;;7680:1;7674:4;7670:12;7701:18;7691:81;;7757:4;7749:6;7745:17;7735:27;;7691:81;7819:2;7811:6;7808:14;7788:18;7785:38;7782:84;;7838:18;;:::i;:::-;7782:84;7603:269;7552:320;;;:::o;7878:168::-;8018:20;8014:1;8006:6;8002:14;7995:44;7878:168;:::o;8052:366::-;8194:3;8215:67;8279:2;8274:3;8215:67;:::i;:::-;8208:74;;8291:93;8380:3;8291:93;:::i;:::-;8409:2;8404:3;8400:12;8393:19;;8052:366;;;:::o;8424:419::-;8590:4;8628:2;8617:9;8613:18;8605:26;;8677:9;8671:4;8667:20;8663:1;8652:9;8648:17;8641:47;8705:131;8831:4;8705:131;:::i;:::-;8697:139;;8424:419;;;:::o;8849:224::-;8989:34;8985:1;8977:6;8973:14;8966:58;9058:7;9053:2;9045:6;9041:15;9034:32;8849:224;:::o;9079:366::-;9221:3;9242:67;9306:2;9301:3;9242:67;:::i;:::-;9235:74;;9318:93;9407:3;9318:93;:::i;:::-;9436:2;9431:3;9427:12;9420:19;;9079:366;;;:::o;9451:419::-;9617:4;9655:2;9644:9;9640:18;9632:26;;9704:9;9698:4;9694:20;9690:1;9679:9;9675:17;9668:47;9732:131;9858:4;9732:131;:::i;:::-;9724:139;;9451:419;;;:::o;9876:174::-;10016:26;10012:1;10004:6;10000:14;9993:50;9876:174;:::o;10056:366::-;10198:3;10219:67;10283:2;10278:3;10219:67;:::i;:::-;10212:74;;10295:93;10384:3;10295:93;:::i;:::-;10413:2;10408:3;10404:12;10397:19;;10056:366;;;:::o;10428:419::-;10594:4;10632:2;10621:9;10617:18;10609:26;;10681:9;10675:4;10671:20;10667:1;10656:9;10652:17;10645:47;10709:131;10835:4;10709:131;:::i;:::-;10701:139;;10428:419;;;:::o;10853:223::-;10993:34;10989:1;10981:6;10977:14;10970:58;11062:6;11057:2;11049:6;11045:15;11038:31;10853:223;:::o;11082:366::-;11224:3;11245:67;11309:2;11304:3;11245:67;:::i;:::-;11238:74;;11321:93;11410:3;11321:93;:::i;:::-;11439:2;11434:3;11430:12;11423:19;;11082:366;;;:::o;11454:419::-;11620:4;11658:2;11647:9;11643:18;11635:26;;11707:9;11701:4;11697:20;11693:1;11682:9;11678:17;11671:47;11735:131;11861:4;11735:131;:::i;:::-;11727:139;;11454:419;;;:::o;11879:233::-;12019:34;12015:1;12007:6;12003:14;11996:58;12088:16;12083:2;12075:6;12071:15;12064:41;11879:233;:::o;12118:366::-;12260:3;12281:67;12345:2;12340:3;12281:67;:::i;:::-;12274:74;;12357:93;12446:3;12357:93;:::i;:::-;12475:2;12470:3;12466:12;12459:19;;12118:366;;;:::o;12490:419::-;12656:4;12694:2;12683:9;12679:18;12671:26;;12743:9;12737:4;12733:20;12729:1;12718:9;12714:17;12707:47;12771:131;12897:4;12771:131;:::i;:::-;12763:139;;12490:419;;;:::o;12915:143::-;12972:5;13003:6;12997:13;12988:22;;13019:33;13046:5;13019:33;:::i;:::-;12915:143;;;;:::o;13064:351::-;13134:6;13183:2;13171:9;13162:7;13158:23;13154:32;13151:119;;;13189:79;;:::i;:::-;13151:119;13309:1;13334:64;13390:7;13381:6;13370:9;13366:22;13334:64;:::i;:::-;13324:74;;13280:128;13064:351;;;;:::o;13421:246::-;13561:34;13557:1;13549:6;13545:14;13538:58;13630:29;13625:2;13617:6;13613:15;13606:54;13421:246;:::o;13673:366::-;13815:3;13836:67;13900:2;13895:3;13836:67;:::i;:::-;13829:74;;13912:93;14001:3;13912:93;:::i;:::-;14030:2;14025:3;14021:12;14014:19;;13673:366;;;:::o;14045:419::-;14211:4;14249:2;14238:9;14234:18;14226:26;;14298:9;14292:4;14288:20;14284:1;14273:9;14269:17;14262:47;14326:131;14452:4;14326:131;:::i;:::-;14318:139;;14045:419;;;:::o;14470:180::-;14518:77;14515:1;14508:88;14615:4;14612:1;14605:15;14639:4;14636:1;14629:15;14656:348;14696:7;14719:20;14737:1;14719:20;:::i;:::-;14714:25;;14753:20;14771:1;14753:20;:::i;:::-;14748:25;;14941:1;14873:66;14869:74;14866:1;14863:81;14858:1;14851:9;14844:17;14840:105;14837:131;;;14948:18;;:::i;:::-;14837:131;14996:1;14993;14989:9;14978:20;;14656:348;;;;:::o;15010:305::-;15050:3;15069:20;15087:1;15069:20;:::i;:::-;15064:25;;15103:20;15121:1;15103:20;:::i;:::-;15098:25;;15257:1;15189:66;15185:74;15182:1;15179:81;15176:107;;;15263:18;;:::i;:::-;15176:107;15307:1;15304;15300:9;15293:16;;15010:305;;;;:::o;15321:230::-;15461:34;15457:1;15449:6;15445:14;15438:58;15530:13;15525:2;15517:6;15513:15;15506:38;15321:230;:::o;15557:366::-;15699:3;15720:67;15784:2;15779:3;15720:67;:::i;:::-;15713:74;;15796:93;15885:3;15796:93;:::i;:::-;15914:2;15909:3;15905:12;15898:19;;15557:366;;;:::o;15929:419::-;16095:4;16133:2;16122:9;16118:18;16110:26;;16182:9;16176:4;16172:20;16168:1;16157:9;16153:17;16146:47;16210:131;16336:4;16210:131;:::i;:::-;16202:139;;15929:419;;;:::o;16354:242::-;16494:34;16490:1;16482:6;16478:14;16471:58;16563:25;16558:2;16550:6;16546:15;16539:50;16354:242;:::o;16602:366::-;16744:3;16765:67;16829:2;16824:3;16765:67;:::i;:::-;16758:74;;16841:93;16930:3;16841:93;:::i;:::-;16959:2;16954:3;16950:12;16943:19;;16602:366;;;:::o;16974:419::-;17140:4;17178:2;17167:9;17163:18;17155:26;;17227:9;17221:4;17217:20;17213:1;17202:9;17198:17;17191:47;17255:131;17381:4;17255:131;:::i;:::-;17247:139;;16974:419;;;:::o;17399:179::-;17539:31;17535:1;17527:6;17523:14;17516:55;17399:179;:::o;17584:366::-;17726:3;17747:67;17811:2;17806:3;17747:67;:::i;:::-;17740:74;;17823:93;17912:3;17823:93;:::i;:::-;17941:2;17936:3;17932:12;17925:19;;17584:366;;;:::o;17956:419::-;18122:4;18160:2;18149:9;18145:18;18137:26;;18209:9;18203:4;18199:20;18195:1;18184:9;18180:17;18173:47;18237:131;18363:4;18237:131;:::i;:::-;18229:139;;17956:419;;;:::o;18381:221::-;18521:34;18517:1;18509:6;18505:14;18498:58;18590:4;18585:2;18577:6;18573:15;18566:29;18381:221;:::o;18608:366::-;18750:3;18771:67;18835:2;18830:3;18771:67;:::i;:::-;18764:74;;18847:93;18936:3;18847:93;:::i;:::-;18965:2;18960:3;18956:12;18949:19;;18608:366;;;:::o;18980:419::-;19146:4;19184:2;19173:9;19169:18;19161:26;;19233:9;19227:4;19223:20;19219:1;19208:9;19204:17;19197:47;19261:131;19387:4;19261:131;:::i;:::-;19253:139;;18980:419;;;:::o;19405:236::-;19545:34;19541:1;19533:6;19529:14;19522:58;19614:19;19609:2;19601:6;19597:15;19590:44;19405:236;:::o;19647:366::-;19789:3;19810:67;19874:2;19869:3;19810:67;:::i;:::-;19803:74;;19886:93;19975:3;19886:93;:::i;:::-;20004:2;19999:3;19995:12;19988:19;;19647:366;;;:::o;20019:419::-;20185:4;20223:2;20212:9;20208:18;20200:26;;20272:9;20266:4;20262:20;20258:1;20247:9;20243:17;20236:47;20300:131;20426:4;20300:131;:::i;:::-;20292:139;;20019:419;;;:::o;20444:224::-;20584:34;20580:1;20572:6;20568:14;20561:58;20653:7;20648:2;20640:6;20636:15;20629:32;20444:224;:::o;20674:366::-;20816:3;20837:67;20901:2;20896:3;20837:67;:::i;:::-;20830:74;;20913:93;21002:3;20913:93;:::i;:::-;21031:2;21026:3;21022:12;21015:19;;20674:366;;;:::o;21046:419::-;21212:4;21250:2;21239:9;21235:18;21227:26;;21299:9;21293:4;21289:20;21285:1;21274:9;21270:17;21263:47;21327:131;21453:4;21327:131;:::i;:::-;21319:139;;21046:419;;;:::o;21471:223::-;21611:34;21607:1;21599:6;21595:14;21588:58;21680:6;21675:2;21667:6;21663:15;21656:31;21471:223;:::o;21700:366::-;21842:3;21863:67;21927:2;21922:3;21863:67;:::i;:::-;21856:74;;21939:93;22028:3;21939:93;:::i;:::-;22057:2;22052:3;22048:12;22041:19;;21700:366;;;:::o;22072:419::-;22238:4;22276:2;22265:9;22261:18;22253:26;;22325:9;22319:4;22315:20;22311:1;22300:9;22296:17;22289:47;22353:131;22479:4;22353:131;:::i;:::-;22345:139;;22072:419;;;:::o;22497:221::-;22637:34;22633:1;22625:6;22621:14;22614:58;22706:4;22701:2;22693:6;22689:15;22682:29;22497:221;:::o;22724:366::-;22866:3;22887:67;22951:2;22946:3;22887:67;:::i;:::-;22880:74;;22963:93;23052:3;22963:93;:::i;:::-;23081:2;23076:3;23072:12;23065:19;;22724:366;;;:::o;23096:419::-;23262:4;23300:2;23289:9;23285:18;23277:26;;23349:9;23343:4;23339:20;23335:1;23324:9;23320:17;23313:47;23377:131;23503:4;23377:131;:::i;:::-;23369:139;;23096:419;;;:::o;23521:179::-;23661:31;23657:1;23649:6;23645:14;23638:55;23521:179;:::o;23706:366::-;23848:3;23869:67;23933:2;23928:3;23869:67;:::i;:::-;23862:74;;23945:93;24034:3;23945:93;:::i;:::-;24063:2;24058:3;24054:12;24047:19;;23706:366;;;:::o;24078:419::-;24244:4;24282:2;24271:9;24267:18;24259:26;;24331:9;24325:4;24321:20;24317:1;24306:9;24302:17;24295:47;24359:131;24485:4;24359:131;:::i;:::-;24351:139;;24078:419;;;:::o;24503:236::-;24643:34;24639:1;24631:6;24627:14;24620:58;24712:19;24707:2;24699:6;24695:15;24688:44;24503:236;:::o;24745:366::-;24887:3;24908:67;24972:2;24967:3;24908:67;:::i;:::-;24901:74;;24984:93;25073:3;24984:93;:::i;:::-;25102:2;25097:3;25093:12;25086:19;;24745:366;;;:::o;25117:419::-;25283:4;25321:2;25310:9;25306:18;25298:26;;25370:9;25364:4;25360:20;25356:1;25345:9;25341:17;25334:47;25398:131;25524:4;25398:131;:::i;:::-;25390:139;;25117:419;;;:::o;25542:237::-;25682:34;25678:1;25670:6;25666:14;25659:58;25751:20;25746:2;25738:6;25734:15;25727:45;25542:237;:::o;25785:366::-;25927:3;25948:67;26012:2;26007:3;25948:67;:::i;:::-;25941:74;;26024:93;26113:3;26024:93;:::i;:::-;26142:2;26137:3;26133:12;26126:19;;25785:366;;;:::o;26157:419::-;26323:4;26361:2;26350:9;26346:18;26338:26;;26410:9;26404:4;26400:20;26396:1;26385:9;26381:17;26374:47;26438:131;26564:4;26438:131;:::i;:::-;26430:139;;26157:419;;;:::o;26582:245::-;26722:34;26718:1;26710:6;26706:14;26699:58;26791:28;26786:2;26778:6;26774:15;26767:53;26582:245;:::o;26833:366::-;26975:3;26996:67;27060:2;27055:3;26996:67;:::i;:::-;26989:74;;27072:93;27161:3;27072:93;:::i;:::-;27190:2;27185:3;27181:12;27174:19;;26833:366;;;:::o;27205:419::-;27371:4;27409:2;27398:9;27394:18;27386:26;;27458:9;27452:4;27448:20;27444:1;27433:9;27429:17;27422:47;27486:131;27612:4;27486:131;:::i;:::-;27478:139;;27205:419;;;:::o;27630:240::-;27770:34;27766:1;27758:6;27754:14;27747:58;27839:23;27834:2;27826:6;27822:15;27815:48;27630:240;:::o;27876:366::-;28018:3;28039:67;28103:2;28098:3;28039:67;:::i;:::-;28032:74;;28115:93;28204:3;28115:93;:::i;:::-;28233:2;28228:3;28224:12;28217:19;;27876:366;;;:::o;28248:419::-;28414:4;28452:2;28441:9;28437:18;28429:26;;28501:9;28495:4;28491:20;28487:1;28476:9;28472:17;28465:47;28529:131;28655:4;28529:131;:::i;:::-;28521:139;;28248:419;;;:::o;28673:239::-;28813:34;28809:1;28801:6;28797:14;28790:58;28882:22;28877:2;28869:6;28865:15;28858:47;28673:239;:::o;28918:366::-;29060:3;29081:67;29145:2;29140:3;29081:67;:::i;:::-;29074:74;;29157:93;29246:3;29157:93;:::i;:::-;29275:2;29270:3;29266:12;29259:19;;28918:366;;;:::o;29290:419::-;29456:4;29494:2;29483:9;29479:18;29471:26;;29543:9;29537:4;29533:20;29529:1;29518:9;29514:17;29507:47;29571:131;29697:4;29571:131;:::i;:::-;29563:139;;29290:419;;;:::o;29715:181::-;29855:33;29851:1;29843:6;29839:14;29832:57;29715:181;:::o;29902:366::-;30044:3;30065:67;30129:2;30124:3;30065:67;:::i;:::-;30058:74;;30141:93;30230:3;30141:93;:::i;:::-;30259:2;30254:3;30250:12;30243:19;;29902:366;;;:::o;30274:419::-;30440:4;30478:2;30467:9;30463:18;30455:26;;30527:9;30521:4;30517:20;30513:1;30502:9;30498:17;30491:47;30555:131;30681:4;30555:131;:::i;:::-;30547:139;;30274:419;;;:::o;30699:220::-;30839:34;30835:1;30827:6;30823:14;30816:58;30908:3;30903:2;30895:6;30891:15;30884:28;30699:220;:::o;30925:366::-;31067:3;31088:67;31152:2;31147:3;31088:67;:::i;:::-;31081:74;;31164:93;31253:3;31164:93;:::i;:::-;31282:2;31277:3;31273:12;31266:19;;30925:366;;;:::o;31297:419::-;31463:4;31501:2;31490:9;31486:18;31478:26;;31550:9;31544:4;31540:20;31536:1;31525:9;31521:17;31514:47;31578:131;31704:4;31578:131;:::i;:::-;31570:139;;31297:419;;;:::o;31722:221::-;31862:34;31858:1;31850:6;31846:14;31839:58;31931:4;31926:2;31918:6;31914:15;31907:29;31722:221;:::o;31949:366::-;32091:3;32112:67;32176:2;32171:3;32112:67;:::i;:::-;32105:74;;32188:93;32277:3;32188:93;:::i;:::-;32306:2;32301:3;32297:12;32290:19;;31949:366;;;:::o;32321:419::-;32487:4;32525:2;32514:9;32510:18;32502:26;;32574:9;32568:4;32564:20;32560:1;32549:9;32545:17;32538:47;32602:131;32728:4;32602:131;:::i;:::-;32594:139;;32321:419;;;:::o;32746:191::-;32786:4;32806:20;32824:1;32806:20;:::i;:::-;32801:25;;32840:20;32858:1;32840:20;:::i;:::-;32835:25;;32879:1;32876;32873:8;32870:34;;;32884:18;;:::i;:::-;32870:34;32929:1;32926;32922:9;32914:17;;32746:191;;;;:::o;32943:224::-;33083:34;33079:1;33071:6;33067:14;33060:58;33152:7;33147:2;33139:6;33135:15;33128:32;32943:224;:::o;33173:366::-;33315:3;33336:67;33400:2;33395:3;33336:67;:::i;:::-;33329:74;;33412:93;33501:3;33412:93;:::i;:::-;33530:2;33525:3;33521:12;33514:19;;33173:366;;;:::o;33545:419::-;33711:4;33749:2;33738:9;33734:18;33726:26;;33798:9;33792:4;33788:20;33784:1;33773:9;33769:17;33762:47;33826:131;33952:4;33826:131;:::i;:::-;33818:139;;33545:419;;;:::o;33970:222::-;34110:34;34106:1;34098:6;34094:14;34087:58;34179:5;34174:2;34166:6;34162:15;34155:30;33970:222;:::o;34198:366::-;34340:3;34361:67;34425:2;34420:3;34361:67;:::i;:::-;34354:74;;34437:93;34526:3;34437:93;:::i;:::-;34555:2;34550:3;34546:12;34539:19;;34198:366;;;:::o;34570:419::-;34736:4;34774:2;34763:9;34759:18;34751:26;;34823:9;34817:4;34813:20;34809:1;34798:9;34794:17;34787:47;34851:131;34977:4;34851:131;:::i;:::-;34843:139;;34570:419;;;:::o;34995:225::-;35135:34;35131:1;35123:6;35119:14;35112:58;35204:8;35199:2;35191:6;35187:15;35180:33;34995:225;:::o;35226:366::-;35368:3;35389:67;35453:2;35448:3;35389:67;:::i;:::-;35382:74;;35465:93;35554:3;35465:93;:::i;:::-;35583:2;35578:3;35574:12;35567:19;;35226:366;;;:::o;35598:419::-;35764:4;35802:2;35791:9;35787:18;35779:26;;35851:9;35845:4;35841:20;35837:1;35826:9;35822:17;35815:47;35879:131;36005:4;35879:131;:::i;:::-;35871:139;;35598:419;;;:::o

Swarm Source

ipfs://8e0ce738372dbf1e409d114e543c060891edf4ef6bb21366bc86926c9d717d5b
Loading...
Loading
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.