ETH Price: $3,355.80 (-0.98%)

Coin98 Staking Certificate (C98SC)
 

Overview

TokenID

9898364713740058

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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:
Coin98Stake

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-14
*/

/**
 *Submitted for verification at BscScan.com on 2021-09-14
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

interface IBEP20 {
    function totalSupply() external view returns (uint);
    function balanceOf(address account) external view returns (uint);
    function transfer(address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    function balanceOf(address owner) external view returns (uint balance);
    function ownerOf(uint tokenId) external view returns (address owner);
    function safeTransferFrom(address from, address to, uint tokenId) external;
    function transferFrom(address from, address to, uint tokenId) external;
    function approve(address to, uint tokenId) external;
    function getApproved(uint tokenId) external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function safeTransferFrom(address from, address to, uint tokenId, bytes calldata data) external;
}

interface IERC721Receiver {
    function onERC721Received(address operator, address from, uint tokenId, bytes calldata data) external returns (bytes4);
}

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint tokenId) external view returns (string memory);
}

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library Strings {
    bytes16 private constant alphabet = "0123456789abcdef";

    /**
     * @dev Converts a `uint` to its ASCII `string` decimal representation.
     */
    function toString(uint value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint temp = value;
        uint digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}

library Math {
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

abstract contract Context {
    function _msgSender() internal view returns (address payable) {
        return payable(msg.sender);
    }
    function _msgData() internal view returns (bytes memory) {
        this;
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override
    returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint) private _balances;

    // Mapping from token ID to approved address
    mapping(uint => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC165, IERC165)
    returns (bool)
    {
        return
        interfaceId == type(IERC721).interfaceId ||
        interfaceId == type(IERC721Metadata).interfaceId ||
        super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner)
    public
    view
    virtual
    override
    returns (uint)
    {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint tokenId)
    public
    view
    virtual
    override
    returns (address)
    {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint tokenId)
    public
    view
    virtual
    override
    returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();
        return
        bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, tokenId.toString()))
        : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint tokenId)
    public
    view
    virtual
    override
    returns (address)
    {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
    public
    virtual
    override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
    public
    view
    virtual
    override
    returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _exists(uint tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint tokenId)
    internal
    view
    virtual
    returns (bool)
    {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
        getApproved(tokenId) == spender ||
        ERC721.isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(
        address to,
        uint tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _mint(address to, uint tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    function _burn(uint tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    function _transfer(
        address from,
        address to,
        uint tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
            IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint tokenId
    ) internal virtual {}
}

interface IERC721Enumerable is IERC721 {
    function totalSupply() external view returns (uint);
    function tokenOfOwnerByIndex(address owner, uint index) external view returns (uint tokenId);
    function tokenByIndex(uint index) external view returns (uint);
}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint => uint)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint => uint) private _ownedTokensIndex;

    // The current index of the token
    uint currentIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(IERC165, ERC721)
    returns (bool)
    {
        return
        interfaceId == type(IERC721Enumerable).interfaceId ||
        super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint index)
    public
    view
    virtual
    override
    returns (uint)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        return _ownedTokens[owner][uint(index)];
    }

    function totalSupply() public view virtual override returns (uint) {
        return currentIndex;
    }

    function tokenByIndex(uint index)
    public
    view
    virtual
    override
    returns (uint)
    {
        require(
            index < currentIndex,
            "ERC721Enumerable: global index out of bounds"
        );
        return index;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint tokenId
    ) internal virtual override {
        require (to != address(0), "Token not burnable");

        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            currentIndex++;
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }

        if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    function _addTokenToOwnerEnumeration(address to, uint tokenId) private {
        uint length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _removeTokenFromOwnerEnumeration(address from, uint tokenId)
    private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint lastTokenIndex = uint(ERC721.balanceOf(from) - 1);
        uint tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }
}

library Convertible {
    function convertAddressToString(address sender) internal pure returns (string memory) {
        return toString(abi.encodePacked(sender));
    }

    function compareStrings(string memory a, string memory b) internal pure returns (bool) {
        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
    }

    function toString(bytes memory data) public pure returns(string memory) {
        bytes memory alphabet = "0123456789abcdef";

        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint i = 0; i < data.length; i++) {
            str[2+i*2] = alphabet[uint(uint8(data[i] >> 4))];
            str[3+i*2] = alphabet[uint(uint8(data[i] & 0x0f))];
        }
        return string(str);
    }
    
    function sliceString(uint256 begin, uint256 end, string memory text) internal pure returns (string memory) {
        bytes memory a = new bytes(end-begin+1);
        for(uint i=0;i<=end-begin;i++){
            a[i] = bytes(text)[i+begin-1];
        }
        return string(a);    
    }
    
    function stringToBytes32(string memory source) internal pure returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }
    
        assembly {
            result := mload(add(source, 32))
        }
    }
    
    function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    /// @dev Converts a numeric string to it's unsigned integer representation.
    /// @param v The string to be converted.
    function bytesToUInt(bytes32 v) pure internal returns (uint256 ret) {
        if (v == 0x0) {
            revert();
        }

        uint digit;

        for (uint i = 0; i < 32; i++) {
            digit = uint((uint(v) / (2 ** (8 * (31 - i)))) & 0xff);
            if (digit == 0) {
                break;
            }
            else if (digit < 48 || digit > 57) {
               revert();
            }
            ret *= 10;
            ret += (digit - 48);
        }
        return ret;
    }
}

/**
 * @title SafeERC20
 */
library SafeERC20 {
    using Address for address;

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

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

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

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

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

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

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

/**
 * Coin98 Staking Contract
 * The main Token used for staking is Coin98 (C98)
 * Each staking in the Contract will have an NFT ID with a prefix + 12 random numbers
 * The Default locked time after staking is based on locked_time (E.g 15 days)
 * The Default floating_rate is the profit when a user does not meet the condition in any package and wants to withdraw soon
 * Example 9898 1234 5678 9101
 * Naming will be free at the first time when first inititiating a staking. After that, will charge a naming_fee will be charged each time the staking name is changed
 */
contract Coin98Stake is ERC721Enumerable, Ownable {
    using SafeERC20 for IBEP20;
    using SafeMath for uint256;
    using Counters for Counters.Counter;
    
    uint256 private Percent = 10000;
    uint256 yearTimestamp = 31104000;
    
    string public baseTokenURI;
    Counters.Counter private _tokenIdTracker;

    // Meta information
    struct MetaInfo {
        uint256 total_staked; // Total Meta staked amount
        uint256 max_staked; // Max Meta staked amount
        uint256 naming_fee; // The Fee charged when changing the Staking name
        uint256 id_fee; // The Fee charged when user wants to customize NFT ID
        uint256 locked_time; // The Lock time after tokens are deposited
        uint256 pending_time; // The Pending time after over staked time
        uint256 floating_rate; // Floating rate
        string name_prefix; // Prefix first for Name
        string nft_prefix; // Prefix first for NFT ID
    }
    
    // Package information
    struct PackageInfo {
        address meta; // Meta token address
        uint256 min; // Min package amount
        uint256 max; // Max package amount
        uint256 time; // Package time
        uint256 rate; // Package rate
    }
    
    // Stake information
    struct StakeInfo {
        bool pending_flag; // Flag for checking pending_time
        bool flag; // Flag for check staked status
        string name; // Staking name
        uint256 amount; // Staking amount
        uint256 time; // Staking time
        string packageID; // Package ID
        
        bool isCustomID; // Flag for checking the custom ID
        address meta; // Meta token address
        uint256 package_time; // Package time
        uint256 pending_time; // Pending time
        uint256 rate; // Package rate

        // Saved Informations after unstaked        
        uint256 unstaked_time; // Unstaked Time
        uint256 claim_pending_time; // Claim Pending Time
        uint256 earn_staked; // Earn Staked

        // Read Informations
        uint256 id; // NFT ID
        uint256 est_staked; // Estimated Staked
    }

   // Map the meta address for each Meta information
    mapping(address => MetaInfo) public MetaInfos;
    // Map the package id for each information
    mapping(string => PackageInfo) public PackageInfos;
    // Map the stakeId for each information
    mapping(uint256 => StakeInfo) private StakeInfos;
    
    // emit event when a user starts staking
    event _stake(uint256 id,bool isCustomID);
    // emit event when a user renames an NFT
    event _renaming(uint256 id,string name);
    // emit event when a user unstakes
    event _unstake(uint256 id,uint256 amount, uint256 time);
    // emit event when a user claim pending
    event _claim(uint256 id,uint256 amount, uint256 time);

    constructor(string memory baseURI) ERC721("Coin98 Staking Certificate", "C98SC"){
        setBaseURI(baseURI);
    }

    /**
     * @dev Register a new meta for the package register in
     *
     * Requirements:
     *
     * - `token` the meta staked token.
     * - `max` the maximum staked amount in meta.
     * - `naming_fee` the fee charged when changing an NFT's name.
     * - `id_fee` the fee charged when customizing an NFT's ID.
     * - `lockedTime` the lock time after depositing tokens
     * - `pending_time` the pending time after over staked time
     * - `floatingRate` the default rate when a user does not meet the package rate condition.
     * - `name_prefix` the prefix first for name NFT
     * - `nft_prefix` the prefix first for NFT ID
     */
    function registerMeta(
        address _token,
        uint256 _max_staked,
        uint256 _naming_fee,
        uint256 _id_fee,
        uint256 _locked_time,
        uint256 _pending_time,
        uint256 _floating_rate,
        string memory _name_prefix,
        string memory _nft_prefix
    )
        public
        onlyOwner()
    {
        uint256 nameSize = bytes(_name_prefix).length;
        require(nameSize <= 5, "C98Stake: Name prefix size error");
        uint256 nftPrefixSize = bytes(_nft_prefix).length;
        require(nftPrefixSize == 4, "C98Stake: NFT prefix size error");

        MetaInfo storage metaInfo = MetaInfos[_token];

        metaInfo.floating_rate = _floating_rate;
        metaInfo.max_staked = _max_staked;
        metaInfo.naming_fee = _naming_fee;
        metaInfo.id_fee = _id_fee;
        metaInfo.pending_time = _pending_time;
        metaInfo.locked_time = _locked_time;
        metaInfo.name_prefix = _name_prefix;
        metaInfo.nft_prefix = _nft_prefix;
    }

    function validMeta(address _token) internal view returns (bool isValid){
        return MetaInfos[_token].max_staked > 0;
    }
    
    /**
     * @dev Check validate package condition
     *
     * Requirements:
     *
     * - `package` must be existed.
     * - `min` must be larger than zero and less than max.
     * - `max` must be larger than zero and larger than min.
     */
    function validPackage(string memory _package) internal view returns (bool isValid){
        PackageInfo memory pkInfo = PackageInfos[_package];
        
        return pkInfo.min > 0 && pkInfo.max > 0 && pkInfo.min < pkInfo.max;
    }
    
    function validPackageCondition(uint256 _min, uint256 _max, uint256 _time, uint256 _rate, address _meta) internal view{
        require(_min>0 && _max >0 && _min < _max , "C98Stake: Wrong numeric format");
        MetaInfo memory metaInfo = MetaInfos[_meta];

        require(_time > metaInfo.locked_time && _rate > metaInfo.floating_rate,"C98Stake: Lower than minimum time & rate");
    }

    /**
     * @dev Register a new package for the user to stake in
     *
     * Requirements:
     *
     * - `package` must not be existed.
     * - `meta` the meta staked token.
     * - `min` must be larger than zero and less than max.
     * - `max` must be larger than zero and larger than min.
     * - `time` in staking the user needs to meet before can get `rate` staked.
     * - `rate` profit if the user can meet the package time condition.
     */
    function register(
        string memory _package,
        address _meta,
        uint256 _min,
        uint256 _max,
        uint256 _time,
        uint256 _rate
    )
        public
        onlyOwner()
    {
        require(!validPackage(_package), "C98Stake: Package already existed");
        require(validMeta(_meta),"C98Stake: Unregistered Meta");
        validPackageCondition(_min,_max,_time,_rate,_meta);

        PackageInfo storage pkInfo = PackageInfos[_package];

        pkInfo.meta = _meta;
        pkInfo.min = _min;
        pkInfo.max = _max;
        pkInfo.time = _time;
        pkInfo.rate = _rate;
    }
    
    /**
     * @dev UnRegister existed package
     *
     * Requirements:
     *
     * - `package` must be existed.
    */
    function unRegister(
        string memory _package
    )
        public
        onlyOwner()
    {
        require(validPackage(_package), "C98Stake: Package not found");
        delete PackageInfos[_package];
    }

    /**
     * @dev Configure variable for existed package
     *
     * Requirements:
     *
     * - `package` must be existed.
     * - `min` must be larger than zero and less than max.
     * - `max` must be larger than zero and larger than min.
     * - `time` in staking a user needs to meet before can get `rate` staked.
     * - `rate` profit if the user can meet the package time condition.
     */
    function configurePackage(
        string memory _package,
        uint256 _min,
        uint256 _max,
        uint256 _time,
        uint256 _rate
    )
        public
        onlyOwner()
    {
        require(validPackage(_package), "C98Stake: Package not found");
        PackageInfo storage pkInfo = PackageInfos[_package];

        validPackageCondition(_min,_max,_time,_rate,pkInfo.meta);

        pkInfo.min = _min;
        pkInfo.max = _max;
        pkInfo.time = _time;
        pkInfo.rate = _rate;
    }
    
    /**
     * @dev Return `profit` staked by NFT ID
     *
     * Requirements:
     *
     * - `tokenId` must be existed.
     * -  if the `timeStaked` does not meet the`locked_time` condition or the user has already unstaked, the result will return to zero.
     * -  if the `timeStaked` does not meet the package time condition, the rate will be based on the `floating_rate`
     */
    function getStakedByTokenId(uint256 _tokenId) private view returns (uint256) {
        StakeInfo memory stakeInfo = StakeInfos[_tokenId];
        MetaInfo memory metaInfo = MetaInfos[stakeInfo.meta];

        uint256 current = block.timestamp;
        uint256 timeStaked = current - stakeInfo.time;
        
        if(!stakeInfo.flag || (timeStaked < metaInfo.locked_time)){
            return 0;
        } else {
            uint256 calRate = timeStaked < stakeInfo.package_time ? metaInfo.floating_rate: stakeInfo.rate;
            
            uint256 amountProfitBySeconds = stakeInfo.amount.div(Percent).div(yearTimestamp).mul(calRate);
            return amountProfitBySeconds.mul(timeStaked);
        }
    }

    function validateCustomName(string memory name, string memory name_prefix, address user) private pure returns (bool){
        uint256 nameSize = bytes(name).length;
        uint256 prefixNameSize = bytes(name_prefix).length;
        if(prefixNameSize == 0){
            return Convertible.compareStrings(Convertible.sliceString(1,10, Convertible.convertAddressToString(user)), name);
        }
        return Convertible.compareStrings(Convertible.sliceString(1,prefixNameSize,name), name_prefix) && nameSize == 10;
    }
    
    /**
     * @dev Staking an `amount` in the registered package and returning an NFT to msg.sender.
     *
     * Requirements:
     *
     * - `amount` must be larger than zero.
     * - `name` charge `naming_fee` when user wants to customize the name ( if following C98 Rule Ref ID not charging `naming_fee` ).
     * - `package` registered package ID
     * - `customID` The custom NFT ID is optional for user and will be charged in `id_fee`. If input 0 the system will make a random ID.
     * Emits a {_stake} event.
     */
    function stake(uint256 _amount, string memory _name, string memory _package, uint256 _customID) public {
        require(validPackage(_package), "C98Stake: Package not found");
        
        PackageInfo memory pkInfo = PackageInfos[_package];
        // Check the validity of the package min, max & the amount of transferFrom
        require(_amount >= pkInfo.min && _amount < pkInfo.max , "C98Stake: Wrong min max format");
        MetaInfo storage metaInfo = MetaInfos[pkInfo.meta];
        IBEP20 metaToken = IBEP20(pkInfo.meta);

        uint256 totalStakedFinal = metaInfo.total_staked.add(_amount);
        require(totalStakedFinal <= metaInfo.max_staked, "C98Stake: Maximum number of staked");
    
        bool _isCustomID = _customID != 0;
        //Validate the custom name if basing on C98 Ref ID Rule, it will be free of change
        uint256 nameSize = bytes(_name).length;

        bool _isNotCustomname = validateCustomName(_name, metaInfo.name_prefix, msg.sender);
        
        if(!_isNotCustomname){
            require(nameSize <= 20 && nameSize > 0,"C98Stake: Not meet name condition");
        }
        
        uint256 payAmount =  _amount.add(_isCustomID ? metaInfo.id_fee : 0 ).add(_isNotCustomname ? 0 : metaInfo.naming_fee);
        metaToken.safeTransferFrom(msg.sender, address(this), payAmount);
        
        string memory randomID;
        
        if (_isCustomID){
            randomID = Convertible.uint2str(_customID);
        } else {
            string memory randomConvert = Convertible.uint2str(uint256(keccak256(abi.encodePacked(totalToken().add(1),_amount,block.timestamp,metaInfo.nft_prefix))));
            randomID = Convertible.sliceString(10,21,randomConvert);
        }
        
        // Random string after prefix is fixed at 12
        require(bytes(randomID).length == 12);
        
        // Token ID start with nft_prefix
        uint256 nftPackageId = Convertible.bytesToUInt(Convertible.stringToBytes32(string(abi.encodePacked(metaInfo.nft_prefix,randomID))));
        
        require(!_exists(nftPackageId), "ERC721: token already minted");
        
        // Storage stake information
        StakeInfo storage stakeInfo = StakeInfos[nftPackageId];
        stakeInfo.flag = true;
        stakeInfo.amount = _amount;
        stakeInfo.time = block.timestamp;
        stakeInfo.packageID = _package;
        stakeInfo.meta = pkInfo.meta;
        
        stakeInfo.name = _name;
        stakeInfo.isCustomID = _isCustomID;
        
        stakeInfo.pending_flag = false;
        stakeInfo.pending_time = metaInfo.pending_time;
        stakeInfo.package_time = pkInfo.time;
        stakeInfo.rate = pkInfo.rate;
        
        metaInfo.total_staked = totalStakedFinal;
        _mintAnElement(msg.sender, nftPackageId, _isCustomID);
    }
    
    /**
     * @dev Renaming the existed NFT and charging `naming_fee`.
     *
     * Requirements:
     *
     * - `tokenId` must be existed.
     * - `name` must be existed.
     * Emits a {_renaming} event.
     */
    function renaming (uint256 _tokenId,string memory _name) public {
        StakeInfo storage stakeInfo = StakeInfos[_tokenId];
        MetaInfo memory metaInfo = MetaInfos[stakeInfo.meta];
        IBEP20 metaToken = IBEP20(stakeInfo.meta);

        require(ownerOf(_tokenId) == msg.sender, "C98Stake: Not meet owner condition");
        metaToken.safeTransferFrom(msg.sender, address(this), metaInfo.naming_fee);
        uint256 nameSize = bytes(_name).length;
        require(nameSize <= 20 && nameSize > 0,"C98Stake: Not meet name condition");
        
        stakeInfo.name = _name;
        emit _renaming(_tokenId, _name);
    }
    
    /**
     * @dev Unstake the `amount` in NFT and get the profit following the previous conditions.
     *
     * Requirements:
     *
     * - `tokenId` must be existed.
     * Emits a {_unstake} event.
     */
    function unstake(uint256 _tokenId) public {
        StakeInfo storage stakeInfo = StakeInfos[_tokenId];
        MetaInfo storage metaInfo = MetaInfos[stakeInfo.meta];

        uint256 _profit = getStakedByTokenId(_tokenId);
        require(_profit > 0, "C98Stake: Not meet unstake condition");
        require(ownerOf(_tokenId) == msg.sender, "C98Stake: Not meet owner condition");
        
        IBEP20 metaToken = IBEP20(stakeInfo.meta);
         
        uint256 _profitTotal = _profit.add(stakeInfo.amount);
          
        require(metaToken.balanceOf(address(this)) >= _profitTotal);
        stakeInfo.flag = false;
        metaInfo.total_staked = metaInfo.total_staked.sub(stakeInfo.amount);
        
        if(stakeInfo.pending_time == 0){
          metaToken.safeTransfer(msg.sender, _profitTotal);
        } else {
            stakeInfo.pending_flag = true;
        }
        
        stakeInfo.unstaked_time = block.timestamp;
        stakeInfo.earn_staked  = _profitTotal;
        
        emit _unstake(_tokenId, _profitTotal, stakeInfo.time);
    }

    /**
     * @dev Claim Pending the `amount` in NFT and get the earn_staked after unstake and wait for pending_time.
     *
     * Requirements:
     *
     * - `tokenId` must be existed and already unstaked.
     * Emits a {_claim} event.
     */
    function claimPending(uint256 _tokenId) public {
        StakeInfo storage stakeInfo = StakeInfos[_tokenId];

        require(stakeInfo.pending_flag, "C98Stake: Not meet claim pending condition");
        require(ownerOf(_tokenId) == msg.sender, "C98Stake: Not meet owner condition");

        IBEP20 metaToken = IBEP20(stakeInfo.meta);

        require(metaToken.balanceOf(address(this)) >= stakeInfo.earn_staked,"C98Stake: Not enough pool");

        stakeInfo.pending_flag = false;
        metaToken.safeTransfer(msg.sender, stakeInfo.earn_staked);
        
        stakeInfo.claim_pending_time = block.timestamp;
        
        emit _claim(_tokenId, stakeInfo.earn_staked, stakeInfo.time);
    }
    
    function _mintAnElement(address _to, uint256 _tokenId, bool _isCustomID) private {
        _tokenIdTracker.increment();
        _safeMint(_to, _tokenId);
        emit _stake(_tokenId, _isCustomID);
    }
    
    /**
     * @dev The Owner withdraws any tokens for emergency case
     *
     * Requirements:
     *
     * - `amount` must be larger than zero.
     */
    function withdraw(uint256 _amount, IBEP20 _token) public onlyOwner {
        require(_amount > 0);
        require(_token.balanceOf(address(this)) >= _amount);
        _token.safeTransfer(msg.sender, _amount);
    }

    /**
     * @dev Get info Staked by NFT ID
     */
    function getStakedInfo(uint256 tokenId) external view returns (StakeInfo memory) {
        StakeInfo memory stakeInfo = StakeInfos[tokenId];
        stakeInfo.est_staked = getStakedByTokenId(tokenId);
        stakeInfo.id = tokenId;
        return stakeInfo;
    }

    /**
     * @dev Get list NFT staked by address
     */
    function walletOfOwner(address _owner) external view returns (StakeInfo[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        StakeInfo[]memory addressStaked = new StakeInfo[](tokenCount);
        
        for (uint256 i = 0; i < tokenCount; i++) {
            uint256 tokenIndex = tokenOfOwnerByIndex(_owner, i);
            StakeInfo memory stakeInfoIndex = StakeInfos[tokenIndex];
            stakeInfoIndex.est_staked = getStakedByTokenId(tokenIndex);
            stakeInfoIndex.id = tokenIndex;
            addressStaked[i] = stakeInfoIndex;
        }
    
        return addressStaked;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
    }

    function totalToken() public view returns (uint256) {
        return _tokenIdTracker.current();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"_claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"_renaming","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isCustomID","type":"bool"}],"name":"_stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"_unstake","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"MetaInfos","outputs":[{"internalType":"uint256","name":"total_staked","type":"uint256"},{"internalType":"uint256","name":"max_staked","type":"uint256"},{"internalType":"uint256","name":"naming_fee","type":"uint256"},{"internalType":"uint256","name":"id_fee","type":"uint256"},{"internalType":"uint256","name":"locked_time","type":"uint256"},{"internalType":"uint256","name":"pending_time","type":"uint256"},{"internalType":"uint256","name":"floating_rate","type":"uint256"},{"internalType":"string","name":"name_prefix","type":"string"},{"internalType":"string","name":"nft_prefix","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"PackageInfos","outputs":[{"internalType":"address","name":"meta","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimPending","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_package","type":"string"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"},{"internalType":"uint256","name":"_time","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"configurePackage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStakedInfo","outputs":[{"components":[{"internalType":"bool","name":"pending_flag","type":"bool"},{"internalType":"bool","name":"flag","type":"bool"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"string","name":"packageID","type":"string"},{"internalType":"bool","name":"isCustomID","type":"bool"},{"internalType":"address","name":"meta","type":"address"},{"internalType":"uint256","name":"package_time","type":"uint256"},{"internalType":"uint256","name":"pending_time","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"unstaked_time","type":"uint256"},{"internalType":"uint256","name":"claim_pending_time","type":"uint256"},{"internalType":"uint256","name":"earn_staked","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"est_staked","type":"uint256"}],"internalType":"struct Coin98Stake.StakeInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_package","type":"string"},{"internalType":"address","name":"_meta","type":"address"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"},{"internalType":"uint256","name":"_time","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_max_staked","type":"uint256"},{"internalType":"uint256","name":"_naming_fee","type":"uint256"},{"internalType":"uint256","name":"_id_fee","type":"uint256"},{"internalType":"uint256","name":"_locked_time","type":"uint256"},{"internalType":"uint256","name":"_pending_time","type":"uint256"},{"internalType":"uint256","name":"_floating_rate","type":"uint256"},{"internalType":"string","name":"_name_prefix","type":"string"},{"internalType":"string","name":"_nft_prefix","type":"string"}],"name":"registerMeta","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"renaming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_package","type":"string"},{"internalType":"uint256","name":"_customID","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_package","type":"string"}],"name":"unRegister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"components":[{"internalType":"bool","name":"pending_flag","type":"bool"},{"internalType":"bool","name":"flag","type":"bool"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"string","name":"packageID","type":"string"},{"internalType":"bool","name":"isCustomID","type":"bool"},{"internalType":"address","name":"meta","type":"address"},{"internalType":"uint256","name":"package_time","type":"uint256"},{"internalType":"uint256","name":"pending_time","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"unstaked_time","type":"uint256"},{"internalType":"uint256","name":"claim_pending_time","type":"uint256"},{"internalType":"uint256","name":"earn_staked","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"est_staked","type":"uint256"}],"internalType":"struct Coin98Stake.StakeInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"contract IBEP20","name":"_token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600a556301da9c00600b553480156200001f57600080fd5b50604051620050a7380380620050a7833981016040819052620000429162000273565b604080518082018252601a81527f436f696e3938205374616b696e67204365727469666963617465000000000000602080830191825283518085019094526005845264433938534360d81b908401528151919291620000a491600091620001b7565b508051620000ba906001906020840190620001b7565b505050620000d7620000d1620000e960201b60201c565b620000ed565b620000e2816200013f565b506200038c565b3390565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009546001600160a01b031633146200019e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620001b390600c906020840190620001b7565b5050565b828054620001c5906200034f565b90600052602060002090601f016020900481019282620001e9576000855562000234565b82601f106200020457805160ff191683800117855562000234565b8280016001018555821562000234579182015b828111156200023457825182559160200191906001019062000217565b506200024292915062000246565b5090565b5b8082111562000242576000815560010162000247565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200028757600080fd5b82516001600160401b03808211156200029f57600080fd5b818501915085601f830112620002b457600080fd5b815181811115620002c957620002c96200025d565b604051601f8201601f19908116603f01168101908382118183101715620002f457620002f46200025d565b8160405282815288868487010111156200030d57600080fd5b600093505b8284101562000331578484018601518185018701529285019262000312565b82841115620003435760008684830101525b98975050505050505050565b600181811c908216806200036457607f821691505b602082108114156200038657634e487b7160e01b600052602260045260246000fd5b50919050565b614d0b806200039c6000396000f3fe608060405234801561001057600080fd5b50600436106102055760003560e01c80636352211e1161011a578063b37f105b116100ad578063c87b56dd1161007c578063c87b56dd146104e9578063cb0da8b3146104fc578063d547cfb71461050f578063e985e9c514610517578063f2fde38b1461055357600080fd5b8063b37f105b14610490578063b88d4fde146104b0578063bf3fc3a8146104c3578063c5edc915146104d657600080fd5b80638da5cb5b116100e95780638da5cb5b14610451578063939f14a11461046257806395d89b4114610475578063a22cb4651461047d57600080fd5b80636352211e1461040557806370a08231146104185780637edc167b1461042b57806389ad0f901461043e57600080fd5b80632e17de781161019d57806345f631b51161016c57806345f631b51461039c5780634f6ccce7146103c457806351da2975146103d757806355f804b3146103ea578063626be567146103fd57600080fd5b80632e17de78146103435780632f745c591461035657806342842e0e14610369578063438b63001461037c57600080fd5b8063081812fc116101d9578063081812fc146102e0578063095ea7b31461030b57806318160ddd1461031e57806323b872dd1461033057600080fd5b8062f714ce1461020a578063013ef95d1461021f57806301ffc9a7146102a857806306fdde03146102cb575b600080fd5b61021d610218366004614024565b610566565b005b61027161022d3660046140ff565b8051602081830181018051600f82529282019190930120915280546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0015b60405180910390f35b6102bb6102b6366004614149565b610633565b604051901515815260200161029f565b6102d361065e565b60405161029f91906141be565b6102f36102ee3660046141d1565b6106f0565b6040516001600160a01b03909116815260200161029f565b61021d6103193660046141ea565b610785565b6008545b60405190815260200161029f565b61021d61033e366004614216565b61089b565b61021d6103513660046141d1565b6108cc565b6103226103643660046141ea565b610ad8565b61021d610377366004614216565b610b6e565b61038f61038a366004614257565b610b89565b60405161029f919061436a565b6103af6103aa366004614257565b610e4c565b60405161029f999897969594939291906143cc565b6103226103d23660046141d1565b610faa565b61021d6103e536600461442f565b611016565b61021d6103f83660046140ff565b6114ca565b610322611507565b6102f36104133660046141d1565b611517565b610322610426366004614257565b61158e565b61021d6104393660046144a3565b611615565b61021d61044c3660046144e9565b611896565b6009546001600160a01b03166102f3565b61021d610470366004614599565b6119e4565b6102d3611a91565b61021d61048b366004614603565b611aa0565b6104a361049e3660046141d1565b611b65565b60405161029f9190614631565b61021d6104be366004614644565b611d73565b61021d6104d13660046140ff565b611dab565b61021d6104e43660046146c3565b611e47565b6102d36104f73660046141d1565b611fa5565b61021d61050a3660046141d1565b612080565b6102d3612261565b6102bb610525366004614734565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61021d610561366004614257565b6122ef565b6009546001600160a01b031633146105995760405162461bcd60e51b815260040161059090614762565b60405180910390fd5b600082116105a657600080fd5b6040516370a0823160e01b815230600482015282906001600160a01b038316906370a0823190602401602060405180830381865afa1580156105ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106109190614797565b101561061b57600080fd5b61062f6001600160a01b038216338461238a565b5050565b60006001600160e01b0319821663780e9d6360e01b14806106585750610658826123ed565b92915050565b60606000805461066d906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610699906147b0565b80156106e65780601f106106bb576101008083540402835291602001916106e6565b820191906000526020600020905b8154815290600101906020018083116106c957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107695760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610590565b506000908152600460205260409020546001600160a01b031690565b600061079082611517565b9050806001600160a01b0316836001600160a01b031614156107fe5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610590565b336001600160a01b038216148061081a575061081a8133610525565b61088c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610590565b610896838361243d565b505050565b6108a533826124ab565b6108c15760405162461bcd60e51b8152600401610590906147eb565b6108968383836125a2565b6000818152601060209081526040808320600581015461010090046001600160a01b03168452600e909252822090916109048461274d565b9050600081116109625760405162461bcd60e51b8152602060048201526024808201527f4339385374616b653a204e6f74206d65657420756e7374616b6520636f6e64696044820152633a34b7b760e11b6064820152608401610590565b3361096c85611517565b6001600160a01b0316146109925760405162461bcd60e51b81526004016105909061483c565b600583015460028401546101009091046001600160a01b0316906000906109ba908490612ba7565b6040516370a0823160e01b815230600482015290915081906001600160a01b038416906370a0823190602401602060405180830381865afa158015610a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a279190614797565b1015610a3257600080fd5b845461ff001916855560028501548454610a4b91612c06565b84556007850154610a6f57610a6a6001600160a01b038316338361238a565b610a7b565b845460ff191660011785555b426009860155600b850181905560038501546040805188815260208101849052908101919091527f823fc0206464443571f97eb923196ee730df989f889f9542dff3a1741d55b653906060015b60405180910390a1505050505050565b6000610ae38361158e565b8210610b455760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610590565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61089683838360405180602001604052806000815250611d73565b60606000610b968361158e565b90506000816001600160401b03811115610bb257610bb2614054565b604051908082528060200260200182016040528015610beb57816020015b610bd8613ef3565b815260200190600190039081610bd05790505b50905060005b82811015610e44576000610c058683610ad8565b6000818152601060209081526040808320815161020081018352815460ff808216151583526101009091041615159381019390935260018101805495965093949293909291840191610c56906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c82906147b0565b8015610ccf5780601f10610ca457610100808354040283529160200191610ccf565b820191906000526020600020905b815481529060010190602001808311610cb257829003601f168201915b505050505081526020016002820154815260200160038201548152602001600482018054610cfc906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610d28906147b0565b8015610d755780601f10610d4a57610100808354040283529160200191610d75565b820191906000526020600020905b815481529060010190602001808311610d5857829003601f168201915b5050509183525050600582015460ff8116151560208301526001600160a01b03610100918290041660408301526006830154606083015260078301546080830152600883015460a0830152600983015460c0830152600a83015460e0830152600b83015490820152600c820154610120820152600d90910154610140909101529050610e008261274d565b6101e08201526101c0810182905283518190859085908110610e2457610e2461487e565b602002602001018190525050508080610e3c906148aa565b915050610bf1565b509392505050565b600e602052806000526040600020600091509050806000015490806001015490806002015490806003015490806004015490806005015490806006015490806007018054610e99906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec5906147b0565b8015610f125780601f10610ee757610100808354040283529160200191610f12565b820191906000526020600020905b815481529060010190602001808311610ef557829003601f168201915b505050505090806008018054610f27906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610f53906147b0565b8015610fa05780601f10610f7557610100808354040283529160200191610fa0565b820191906000526020600020905b815481529060010190602001808311610f8357829003601f168201915b5050505050905089565b600060085482106110125760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610590565b5090565b61101f82612c48565b61103b5760405162461bcd60e51b8152600401610590906148c5565b6000600f8360405161104d91906148fc565b908152604080516020928190038301812060a08201835280546001600160a01b031682526001810154938201849052600281015492820192909252600382015460608201526004909101546080820152915085108015906110b15750806040015185105b6110fd5760405162461bcd60e51b815260206004820152601e60248201527f4339385374616b653a2057726f6e67206d696e206d617820666f726d617400006044820152606401610590565b80516001600160a01b03166000908152600e6020526040812082518154919290916111289089612ba7565b905082600101548111156111895760405162461bcd60e51b815260206004820152602260248201527f4339385374616b653a204d6178696d756d206e756d626572206f66207374616b604482015261195960f21b6064820152608401610590565b8651600784018054871515929160009161122c918c916111a8906147b0565b80601f01602080910402602001604051908101604052809291908181526020018280546111d4906147b0565b80156112215780601f106111f657610100808354040283529160200191611221565b820191906000526020600020905b81548152906001019060200180831161120457829003601f168201915b505050505033612cd8565b90508061126057601482111580156112445750600082115b6112605760405162461bcd60e51b815260040161059090614918565b600061129982611274578760020154611277565b60005b6112938661128657600061128c565b89600301545b8f90612ba7565b90612ba7565b90506112b06001600160a01b038716333084612d37565b606084156112c8576112c18a612d6f565b9050611324565b60006113116112da6001611293611507565b8f428c6008016040516020016112f394939291906149f3565b6040516020818303038152906040528051906020012060001c612d6f565b9050611320600a601583612e97565b9150505b8051600c1461133257600080fd5b60006113696113648a60080184604051602001611350929190614a11565b604051602081830303815290604052612f74565b612f91565b6000818152600260205260409020549091506001600160a01b0316156113d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610590565b600060106000838152602001908152602001600020905060018160000160016101000a81548160ff0219169083151502179055508e81600201819055504281600301819055508c81600401908051906020019061142f929190613f7f565b508a600001518160050160016101000a8154816001600160a01b0302191690836001600160a01b031602179055508d816001019080519060200190611475929190613f7f565b506005808201805489151560ff199182161790915582541682558a0154600782015560608b0151600682015560808b01516008820155878a556114b933838961303a565b505050505050505050505050505050565b6009546001600160a01b031633146114f45760405162461bcd60e51b815260040161059090614762565b805161062f90600c906020840190613f7f565b6000611512600d5490565b905090565b6000818152600260205260408120546001600160a01b0316806106585760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610590565b60006001600160a01b0382166115f95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610590565b506001600160a01b031660009081526003602052604090205490565b600082815260106020908152604080832060058082015461010090046001600160a01b03168552600e845282852083516101208101855281548152600182015495810195909552600281015493850193909352600383015460608501526004830154608085015282015460a0840152600682015460c0840152600782018054919493929160e0840191906116a8906147b0565b80601f01602080910402602001604051908101604052809291908181526020018280546116d4906147b0565b80156117215780601f106116f657610100808354040283529160200191611721565b820191906000526020600020905b81548152906001019060200180831161170457829003601f168201915b5050505050815260200160088201805461173a906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611766906147b0565b80156117b35780601f10611788576101008083540402835291602001916117b3565b820191906000526020600020905b81548152906001019060200180831161179657829003601f168201915b50505091909252505050600583015490915061010090046001600160a01b0316336117dd86611517565b6001600160a01b0316146118035760405162461bcd60e51b81526004016105909061483c565b6040820151611820906001600160a01b0383169033903090612d37565b8351601481118015906118335750600081115b61184f5760405162461bcd60e51b815260040161059090614918565b84516118649060018601906020880190613f7f565b507fa45a2191bfa6eff9a0f0c0db689db0b068a86f3cadcb18f196aa630410d9616d8686604051610ac8929190614a36565b6009546001600160a01b031633146118c05760405162461bcd60e51b815260040161059090614762565b815160058111156119135760405162461bcd60e51b815260206004820181905260248201527f4339385374616b653a204e616d65207072656669782073697a65206572726f726044820152606401610590565b8151600481146119655760405162461bcd60e51b815260206004820152601f60248201527f4339385374616b653a204e4654207072656669782073697a65206572726f72006044820152606401610590565b6001600160a01b038b166000908152600e6020908152604090912060068101879055600181018c9055600281018b9055600381018a90556005810188905560048101899055855190916119bf916007840191880190613f7f565b5083516119d59060088301906020870190613f7f565b50505050505050505050505050565b6009546001600160a01b03163314611a0e5760405162461bcd60e51b815260040161059090614762565b611a1785612c48565b611a335760405162461bcd60e51b8152600401610590906148c5565b6000600f86604051611a4591906148fc565b9081526040519081900360200190208054909150611a739086908690869086906001600160a01b0316613085565b60018101949094556002840192909255600383015560049091015550565b60606001805461066d906147b0565b6001600160a01b038216331415611af95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610590565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611b6d613ef3565b6000828152601060209081526040808320815161020081018352815460ff80821615158352610100909104161515938101939093526001810180549192840191611bb6906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611be2906147b0565b8015611c2f5780601f10611c0457610100808354040283529160200191611c2f565b820191906000526020600020905b815481529060010190602001808311611c1257829003601f168201915b505050505081526020016002820154815260200160038201548152602001600482018054611c5c906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c88906147b0565b8015611cd55780601f10611caa57610100808354040283529160200191611cd5565b820191906000526020600020905b815481529060010190602001808311611cb857829003601f168201915b5050509183525050600582015460ff8116151560208301526001600160a01b03610100918290041660408301526006830154606083015260078301546080830152600883015460a0830152600983015460c0830152600a83015460e0830152600b83015490820152600c820154610120820152600d90910154610140909101529050611d608361274d565b6101e08201526101c08101929092525090565b611d7d33836124ab565b611d995760405162461bcd60e51b8152600401610590906147eb565b611da584848484613306565b50505050565b6009546001600160a01b03163314611dd55760405162461bcd60e51b815260040161059090614762565b611dde81612c48565b611dfa5760405162461bcd60e51b8152600401610590906148c5565b600f81604051611e0a91906148fc565b90815260405190819003602001902080546001600160a01b0319168155600060018201819055600282018190556003820181905560049091015550565b6009546001600160a01b03163314611e715760405162461bcd60e51b815260040161059090614762565b611e7a86612c48565b15611ed15760405162461bcd60e51b815260206004820152602160248201527f4339385374616b653a205061636b61676520616c7265616479206578697374656044820152601960fa1b6064820152608401610590565b6001600160a01b0385166000908152600e6020526040902060010154611f395760405162461bcd60e51b815260206004820152601b60248201527f4339385374616b653a20556e72656769737465726564204d65746100000000006044820152606401610590565b611f468484848489613085565b6000600f87604051611f5891906148fc565b90815260405190819003602001902080546001600160a01b039097166001600160a01b03199097169690961786555060018501939093556002840191909155600383015560049091015550565b6000818152600260205260409020546060906001600160a01b03166120245760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610590565b600061202e613339565b9050600081511161204e5760405180602001604052806000815250612079565b8061205884613348565b604051602001612069929190614a4f565b6040516020818303038152906040525b9392505050565b6000818152601060205260409020805460ff166120f25760405162461bcd60e51b815260206004820152602a60248201527f4339385374616b653a204e6f74206d65657420636c61696d2070656e64696e676044820152691031b7b73234ba34b7b760b11b6064820152608401610590565b336120fc83611517565b6001600160a01b0316146121225760405162461bcd60e51b81526004016105909061483c565b6005810154600b8201546040516370a0823160e01b81523060048201526101009092046001600160a01b03169182906370a0823190602401602060405180830381865afa158015612177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219b9190614797565b10156121e95760405162461bcd60e51b815260206004820152601960248201527f4339385374616b653a204e6f7420656e6f75676820706f6f6c000000000000006044820152606401610590565b815460ff19168255600b82015461220c906001600160a01b03831690339061238a565b42600a830155600b82015460038301546040805186815260208101939093528201527f526db653bbb15297dbfd9e71369d8703ba6cf4e2a57faa5844d4906170205a00906060015b60405180910390a1505050565b600c805461226e906147b0565b80601f016020809104026020016040519081016040528092919081815260200182805461229a906147b0565b80156122e75780601f106122bc576101008083540402835291602001916122e7565b820191906000526020600020905b8154815290600101906020018083116122ca57829003601f168201915b505050505081565b6009546001600160a01b031633146123195760405162461bcd60e51b815260040161059090614762565b6001600160a01b03811661237e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610590565b61238781613445565b50565b6040516001600160a01b03831660248201526044810182905261089690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613497565b60006001600160e01b031982166380ac58cd60e01b148061241e57506001600160e01b03198216635b5e139f60e01b145b8061065857506301ffc9a760e01b6001600160e01b0319831614610658565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061247282611517565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166125245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610590565b600061252f83611517565b9050806001600160a01b0316846001600160a01b0316148061256a5750836001600160a01b031661255f846106f0565b6001600160a01b0316145b8061259a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166125b582611517565b6001600160a01b03161461261d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610590565b6001600160a01b03821661267f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610590565b61268a838383613569565b61269560008261243d565b6001600160a01b03831660009081526003602052604081208054600192906126be908490614a75565b90915550506001600160a01b03821660009081526003602052604081208054600192906126ec908490614a8c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152601060209081526040808320815161020081018352815460ff808216151583526101009091041615159381019390935260018101805485949384019190612798906147b0565b80601f01602080910402602001604051908101604052809291908181526020018280546127c4906147b0565b80156128115780601f106127e657610100808354040283529160200191612811565b820191906000526020600020905b8154815290600101906020018083116127f457829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201805461283e906147b0565b80601f016020809104026020016040519081016040528092919081815260200182805461286a906147b0565b80156128b75780601f1061288c576101008083540402835291602001916128b7565b820191906000526020600020905b81548152906001019060200180831161289a57829003601f168201915b505050505081526020016005820160009054906101000a900460ff161515151581526020016005820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152505090506000600e60008360e001516001600160a01b03166001600160a01b0316815260200190815260200160002060405180610120016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820180546129e9906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612a15906147b0565b8015612a625780601f10612a3757610100808354040283529160200191612a62565b820191906000526020600020905b815481529060010190602001808311612a4557829003601f168201915b50505050508152602001600882018054612a7b906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa7906147b0565b8015612af45780601f10612ac957610100808354040283529160200191612af4565b820191906000526020600020905b815481529060010190602001808311612ad757829003601f168201915b505050505081525050905060004290506000836080015182612b169190614a75565b905083602001511580612b2c5750826080015181105b15612b3d5750600095945050505050565b60008461010001518210612b5657846101400151612b5c565b8360c001515b90506000612b8f82612b89600b54612b83600a548b6060015161362290919063ffffffff16565b90613622565b90613664565b9050612b9b8184613664565b98975050505050505050565b600080612bb48385614a8c565b9050838110156120795760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610590565b600061207983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506136e3565b600080600f83604051612c5b91906148fc565b908152604080516020928190038301812060a08201835280546001600160a01b031682526001810154938201849052600281015492820192909252600382015460608201526004909101546080820152915015801590612cbf575060008160400151115b8015612079575080604001518160200151109392505050565b825182516000919080612d0c57612d03612cfd6001600a612cf88861371d565b612e97565b87613755565b92505050612079565b612d21612d1b60018389612e97565b86613755565b8015612d2d575081600a145b9695505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611da59085906323b872dd60e01b906084016123b6565b606081612d935750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612dbd5780612da7816148aa565b9150612db69050600a83614aba565b9150612d97565b6000816001600160401b03811115612dd757612dd7614054565b6040519080825280601f01601f191660200182016040528015612e01576020820181803683370190505b509050815b8515612e8e57612e17600182614a75565b90506000612e26600a88614aba565b612e3190600a614ace565b612e3b9088614a75565b612e46906030614aed565b905060008160f81b905080848481518110612e6357612e6361487e565b60200101906001600160f81b031916908160001a905350612e85600a89614aba565b97505050612e06565b50949350505050565b60606000612ea58585614a75565b612eb0906001614a8c565b6001600160401b03811115612ec757612ec7614054565b6040519080825280601f01601f191660200182016040528015612ef1576020820181803683370190505b50905060005b612f018686614a75565b8111612e8e57836001612f148884614a8c565b612f1e9190614a75565b81518110612f2e57612f2e61487e565b602001015160f81c60f81b828281518110612f4b57612f4b61487e565b60200101906001600160f81b031916908160001a90535080612f6c816148aa565b915050612ef7565b80516000908290612f885750600092915050565b50506020015190565b600081612f9d57600080fd5b6000805b602081101561303357612fb581601f614a75565b612fc0906008614ace565b612fcb906002614bf6565b612fd59085614aba565b60ff16915081612fe457613033565b6030821080612ff35750603982115b15612ffd57600080fd5b613008600a84614ace565b9250613015603083614a75565b61301f9084614a8c565b92508061302b816148aa565b915050612fa1565b5050919050565b613044600d6137ae565b61304e83836137cb565b6040805183815282151560208201527feae6e78e35289970c8d501e986b0d886dcbf3802108c3cf328b59cd51c41d6b79101612254565b6000851180156130955750600084115b80156130a057508385105b6130ec5760405162461bcd60e51b815260206004820152601e60248201527f4339385374616b653a2057726f6e67206e756d6572696320666f726d617400006044820152606401610590565b6000600e6000836001600160a01b03166001600160a01b031681526020019081526020016000206040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782018054613175906147b0565b80601f01602080910402602001604051908101604052809291908181526020018280546131a1906147b0565b80156131ee5780601f106131c3576101008083540402835291602001916131ee565b820191906000526020600020905b8154815290600101906020018083116131d157829003601f168201915b50505050508152602001600882018054613207906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054613233906147b0565b80156132805780601f1061325557610100808354040283529160200191613280565b820191906000526020600020905b81548152906001019060200180831161326357829003601f168201915b50505050508152505090508060800151841180156132a157508060c0015183115b6132fe5760405162461bcd60e51b815260206004820152602860248201527f4339385374616b653a204c6f776572207468616e206d696e696d756d2074696d604482015267652026207261746560c01b6064820152608401610590565b505050505050565b6133118484846125a2565b61331d848484846137e5565b611da55760405162461bcd60e51b815260040161059090614c02565b6060600c805461066d906147b0565b60608161336c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156133965780613380816148aa565b915061338f9050600a83614aba565b9150613370565b6000816001600160401b038111156133b0576133b0614054565b6040519080825280601f01601f1916602001820160405280156133da576020820181803683370190505b5090505b841561259a576133ef600183614a75565b91506133fc600a86614c54565b613407906030614a8c565b60f81b81838151811061341c5761341c61487e565b60200101906001600160f81b031916908160001a90535061343e600a86614aba565b94506133de565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006134ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138e39092919063ffffffff16565b805190915015610896578080602001905181019061350a9190614c68565b6108965760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610590565b6001600160a01b0382166135b45760405162461bcd60e51b8152602060048201526012602482015271546f6b656e206e6f74206275726e61626c6560701b6044820152606401610590565b6001600160a01b0383166135dc57600880549060006135d2836148aa565b91905055506135ff565b816001600160a01b0316836001600160a01b0316146135ff576135ff83826138f2565b826001600160a01b0316826001600160a01b03161461089657610896828261398f565b600061207983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506139d3565b60008261367357506000610658565b600061367f8385614ace565b90508261368c8583614aba565b146120795760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610590565b600081848411156137075760405162461bcd60e51b815260040161059091906141be565b5060006137148486614a75565b95945050505050565b604051606082811b6bffffffffffffffffffffffff191660208301529061065890603401604051602081830303815290604052613a01565b60008160405160200161376891906148fc565b604051602081830303815290604052805190602001208360405160200161378f91906148fc565b6040516020818303038152906040528051906020012014905092915050565b60018160000160008282546137c39190614a8c565b909155505050565b61062f828260405180602001604052806000815250613c11565b60006001600160a01b0384163b156138d857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613829903390899088908890600401614c85565b6020604051808303816000875af1925050508015613864575060408051601f3d908101601f1916820190925261386191810190614cb8565b60015b6138be573d808015613892576040519150601f19603f3d011682016040523d82523d6000602084013e613897565b606091505b5080516138b65760405162461bcd60e51b815260040161059090614c02565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061259a565b506001949350505050565b606061259a8484600085613c44565b600060016138ff8461158e565b6139099190614a75565b60008381526007602052604090205490915080821461395c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600061399a8361158e565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600081836139f45760405162461bcd60e51b815260040161059091906141be565b5060006137148486614aba565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090613a3c906002614ace565b613a47906002614a8c565b6001600160401b03811115613a5e57613a5e614054565b6040519080825280601f01601f191660200182016040528015613a88576020820181803683370190505b509050600360fc1b81600081518110613aa357613aa361487e565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613ad257613ad261487e565b60200101906001600160f81b031916908160001a90535060005b8451811015610e4457826004868381518110613b0a57613b0a61487e565b016020015182516001600160f81b031990911690911c60f81c908110613b3257613b3261487e565b01602001516001600160f81b03191682613b4d836002614ace565b613b58906002614a8c565b81518110613b6857613b6861487e565b60200101906001600160f81b031916908160001a90535082858281518110613b9257613b9261487e565b602091010151815160f89190911c600f16908110613bb257613bb261487e565b01602001516001600160f81b03191682613bcd836002614ace565b613bd8906003614a8c565b81518110613be857613be861487e565b60200101906001600160f81b031916908160001a90535080613c09816148aa565b915050613aec565b613c1b8383613d6c565b613c2860008484846137e5565b6108965760405162461bcd60e51b815260040161059090614c02565b606082471015613ca55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610590565b843b613cf35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610590565b600080866001600160a01b03168587604051613d0f91906148fc565b60006040518083038185875af1925050503d8060008114613d4c576040519150601f19603f3d011682016040523d82523d6000602084013e613d51565b606091505b5091509150613d61828286613eba565b979650505050505050565b6001600160a01b038216613dc25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610590565b6000818152600260205260409020546001600160a01b031615613e275760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610590565b613e3360008383613569565b6001600160a01b0382166000908152600360205260408120805460019290613e5c908490614a8c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608315613ec9575081612079565b825115613ed95782518084602001fd5b8160405162461bcd60e51b815260040161059091906141be565b6040518061020001604052806000151581526020016000151581526020016060815260200160008152602001600081526020016060815260200160001515815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054613f8b906147b0565b90600052602060002090601f016020900481019282613fad5760008555613ff3565b82601f10613fc657805160ff1916838001178555613ff3565b82800160010185558215613ff3579182015b82811115613ff3578251825591602001919060010190613fd8565b506110129291505b808211156110125760008155600101613ffb565b6001600160a01b038116811461238757600080fd5b6000806040838503121561403757600080fd5b8235915060208301356140498161400f565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561408457614084614054565b604051601f8501601f19908116603f011681019082821181831017156140ac576140ac614054565b816040528093508581528686860111156140c557600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126140f057600080fd5b6120798383356020850161406a565b60006020828403121561411157600080fd5b81356001600160401b0381111561412757600080fd5b61259a848285016140df565b6001600160e01b03198116811461238757600080fd5b60006020828403121561415b57600080fd5b813561207981614133565b60005b83811015614181578181015183820152602001614169565b83811115611da55750506000910152565b600081518084526141aa816020860160208601614166565b601f01601f19169290920160200192915050565b6020815260006120796020830184614192565b6000602082840312156141e357600080fd5b5035919050565b600080604083850312156141fd57600080fd5b82356142088161400f565b946020939093013593505050565b60008060006060848603121561422b57600080fd5b83356142368161400f565b925060208401356142468161400f565b929592945050506040919091013590565b60006020828403121561426957600080fd5b81356120798161400f565b80511515825260006102006020830151614292602086018215159052565b5060408301518160408601526142aa82860182614192565b915050606083015160608501526080830151608085015260a083015184820360a08601526142d88282614192565b91505060c08301516142ee60c086018215159052565b5060e083015161430960e08601826001600160a01b03169052565b50610100838101519085015261012080840151908501526101408084015190850152610160808401519085015261018080840151908501526101a080840151908501526101c080840151908501526101e09283015192909301919091525090565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156143bf57603f198886030184526143ad858351614274565b94509285019290850190600101614391565b5092979650505050505050565b60006101208b83528a60208401528960408401528860608401528760808401528660a08401528560c08401528060e084015261440a81840186614192565b905082810361010084015261441f8185614192565b9c9b505050505050505050505050565b6000806000806080858703121561444557600080fd5b8435935060208501356001600160401b038082111561446357600080fd5b61446f888389016140df565b9450604087013591508082111561448557600080fd5b50614492878288016140df565b949793965093946060013593505050565b600080604083850312156144b657600080fd5b8235915060208301356001600160401b038111156144d357600080fd5b6144df858286016140df565b9150509250929050565b60008060008060008060008060006101208a8c03121561450857600080fd5b89356145138161400f565b985060208a0135975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a01356001600160401b038082111561455957600080fd5b6145658d838e016140df565b93506101008c013591508082111561457c57600080fd5b506145898c828d016140df565b9150509295985092959850929598565b600080600080600060a086880312156145b157600080fd5b85356001600160401b038111156145c757600080fd5b6145d3888289016140df565b9860208801359850604088013597606081013597506080013595509350505050565b801515811461238757600080fd5b6000806040838503121561461657600080fd5b82356146218161400f565b91506020830135614049816145f5565b6020815260006120796020830184614274565b6000806000806080858703121561465a57600080fd5b84356146658161400f565b935060208501356146758161400f565b92506040850135915060608501356001600160401b0381111561469757600080fd5b8501601f810187136146a857600080fd5b6146b78782356020840161406a565b91505092959194509250565b60008060008060008060c087890312156146dc57600080fd5b86356001600160401b038111156146f257600080fd5b6146fe89828a016140df565b965050602087013561470f8161400f565b95989597505050506040840135936060810135936080820135935060a0909101359150565b6000806040838503121561474757600080fd5b82356147528161400f565b915060208301356140498161400f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156147a957600080fd5b5051919050565b600181811c908216806147c457607f821691505b602082108114156147e557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f4339385374616b653a204e6f74206d656574206f776e657220636f6e6469746960408201526137b760f11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156148be576148be614894565b5060010190565b6020808252601b908201527f4339385374616b653a205061636b616765206e6f7420666f756e640000000000604082015260600190565b6000825161490e818460208701614166565b9190910192915050565b60208082526021908201527f4339385374616b653a204e6f74206d656574206e616d6520636f6e646974696f6040820152603760f91b606082015260800190565b8054600090600181811c908083168061497357607f831692505b602080841082141561499557634e487b7160e01b600052602260045260246000fd5b8180156149a957600181146149ba576149e7565b60ff198616895284890196506149e7565b60008881526020902060005b868110156149df5781548b8201529085019083016149c6565b505084890196505b50505050505092915050565b8481528360208201528260408201526000612d2d6060830184614959565b6000614a1d8285614959565b8351614a2d818360208801614166565b01949350505050565b82815260406020820152600061259a6040830184614192565b60008351614a61818460208801614166565b835190830190614a2d818360208801614166565b600082821015614a8757614a87614894565b500390565b60008219821115614a9f57614a9f614894565b500190565b634e487b7160e01b600052601260045260246000fd5b600082614ac957614ac9614aa4565b500490565b6000816000190483118215151615614ae857614ae8614894565b500290565b600060ff821660ff84168060ff03821115614b0a57614b0a614894565b019392505050565b600181815b80851115614b4d578160001904821115614b3357614b33614894565b80851615614b4057918102915b93841c9390800290614b17565b509250929050565b600082614b6457506001610658565b81614b7157506000610658565b8160018114614b875760028114614b9157614bad565b6001915050610658565b60ff841115614ba257614ba2614894565b50506001821b610658565b5060208310610133831016604e8410600b8410161715614bd0575081810a610658565b614bda8383614b12565b8060001904821115614bee57614bee614894565b029392505050565b60006120798383614b55565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082614c6357614c63614aa4565b500690565b600060208284031215614c7a57600080fd5b8151612079816145f5565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d2d90830184614192565b600060208284031215614cca57600080fd5b81516120798161413356fea2646970667358221220ca05c3bde03b925bc04535ed54850ae55a9794372ac46626a7998f29f6001e7164736f6c634300080a00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f66696c652e636f696e39382e636f6d2f7374616b652f6574682f000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102055760003560e01c80636352211e1161011a578063b37f105b116100ad578063c87b56dd1161007c578063c87b56dd146104e9578063cb0da8b3146104fc578063d547cfb71461050f578063e985e9c514610517578063f2fde38b1461055357600080fd5b8063b37f105b14610490578063b88d4fde146104b0578063bf3fc3a8146104c3578063c5edc915146104d657600080fd5b80638da5cb5b116100e95780638da5cb5b14610451578063939f14a11461046257806395d89b4114610475578063a22cb4651461047d57600080fd5b80636352211e1461040557806370a08231146104185780637edc167b1461042b57806389ad0f901461043e57600080fd5b80632e17de781161019d57806345f631b51161016c57806345f631b51461039c5780634f6ccce7146103c457806351da2975146103d757806355f804b3146103ea578063626be567146103fd57600080fd5b80632e17de78146103435780632f745c591461035657806342842e0e14610369578063438b63001461037c57600080fd5b8063081812fc116101d9578063081812fc146102e0578063095ea7b31461030b57806318160ddd1461031e57806323b872dd1461033057600080fd5b8062f714ce1461020a578063013ef95d1461021f57806301ffc9a7146102a857806306fdde03146102cb575b600080fd5b61021d610218366004614024565b610566565b005b61027161022d3660046140ff565b8051602081830181018051600f82529282019190930120915280546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0015b60405180910390f35b6102bb6102b6366004614149565b610633565b604051901515815260200161029f565b6102d361065e565b60405161029f91906141be565b6102f36102ee3660046141d1565b6106f0565b6040516001600160a01b03909116815260200161029f565b61021d6103193660046141ea565b610785565b6008545b60405190815260200161029f565b61021d61033e366004614216565b61089b565b61021d6103513660046141d1565b6108cc565b6103226103643660046141ea565b610ad8565b61021d610377366004614216565b610b6e565b61038f61038a366004614257565b610b89565b60405161029f919061436a565b6103af6103aa366004614257565b610e4c565b60405161029f999897969594939291906143cc565b6103226103d23660046141d1565b610faa565b61021d6103e536600461442f565b611016565b61021d6103f83660046140ff565b6114ca565b610322611507565b6102f36104133660046141d1565b611517565b610322610426366004614257565b61158e565b61021d6104393660046144a3565b611615565b61021d61044c3660046144e9565b611896565b6009546001600160a01b03166102f3565b61021d610470366004614599565b6119e4565b6102d3611a91565b61021d61048b366004614603565b611aa0565b6104a361049e3660046141d1565b611b65565b60405161029f9190614631565b61021d6104be366004614644565b611d73565b61021d6104d13660046140ff565b611dab565b61021d6104e43660046146c3565b611e47565b6102d36104f73660046141d1565b611fa5565b61021d61050a3660046141d1565b612080565b6102d3612261565b6102bb610525366004614734565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61021d610561366004614257565b6122ef565b6009546001600160a01b031633146105995760405162461bcd60e51b815260040161059090614762565b60405180910390fd5b600082116105a657600080fd5b6040516370a0823160e01b815230600482015282906001600160a01b038316906370a0823190602401602060405180830381865afa1580156105ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106109190614797565b101561061b57600080fd5b61062f6001600160a01b038216338461238a565b5050565b60006001600160e01b0319821663780e9d6360e01b14806106585750610658826123ed565b92915050565b60606000805461066d906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610699906147b0565b80156106e65780601f106106bb576101008083540402835291602001916106e6565b820191906000526020600020905b8154815290600101906020018083116106c957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107695760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610590565b506000908152600460205260409020546001600160a01b031690565b600061079082611517565b9050806001600160a01b0316836001600160a01b031614156107fe5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610590565b336001600160a01b038216148061081a575061081a8133610525565b61088c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610590565b610896838361243d565b505050565b6108a533826124ab565b6108c15760405162461bcd60e51b8152600401610590906147eb565b6108968383836125a2565b6000818152601060209081526040808320600581015461010090046001600160a01b03168452600e909252822090916109048461274d565b9050600081116109625760405162461bcd60e51b8152602060048201526024808201527f4339385374616b653a204e6f74206d65657420756e7374616b6520636f6e64696044820152633a34b7b760e11b6064820152608401610590565b3361096c85611517565b6001600160a01b0316146109925760405162461bcd60e51b81526004016105909061483c565b600583015460028401546101009091046001600160a01b0316906000906109ba908490612ba7565b6040516370a0823160e01b815230600482015290915081906001600160a01b038416906370a0823190602401602060405180830381865afa158015610a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a279190614797565b1015610a3257600080fd5b845461ff001916855560028501548454610a4b91612c06565b84556007850154610a6f57610a6a6001600160a01b038316338361238a565b610a7b565b845460ff191660011785555b426009860155600b850181905560038501546040805188815260208101849052908101919091527f823fc0206464443571f97eb923196ee730df989f889f9542dff3a1741d55b653906060015b60405180910390a1505050505050565b6000610ae38361158e565b8210610b455760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610590565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61089683838360405180602001604052806000815250611d73565b60606000610b968361158e565b90506000816001600160401b03811115610bb257610bb2614054565b604051908082528060200260200182016040528015610beb57816020015b610bd8613ef3565b815260200190600190039081610bd05790505b50905060005b82811015610e44576000610c058683610ad8565b6000818152601060209081526040808320815161020081018352815460ff808216151583526101009091041615159381019390935260018101805495965093949293909291840191610c56906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c82906147b0565b8015610ccf5780601f10610ca457610100808354040283529160200191610ccf565b820191906000526020600020905b815481529060010190602001808311610cb257829003601f168201915b505050505081526020016002820154815260200160038201548152602001600482018054610cfc906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610d28906147b0565b8015610d755780601f10610d4a57610100808354040283529160200191610d75565b820191906000526020600020905b815481529060010190602001808311610d5857829003601f168201915b5050509183525050600582015460ff8116151560208301526001600160a01b03610100918290041660408301526006830154606083015260078301546080830152600883015460a0830152600983015460c0830152600a83015460e0830152600b83015490820152600c820154610120820152600d90910154610140909101529050610e008261274d565b6101e08201526101c0810182905283518190859085908110610e2457610e2461487e565b602002602001018190525050508080610e3c906148aa565b915050610bf1565b509392505050565b600e602052806000526040600020600091509050806000015490806001015490806002015490806003015490806004015490806005015490806006015490806007018054610e99906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec5906147b0565b8015610f125780601f10610ee757610100808354040283529160200191610f12565b820191906000526020600020905b815481529060010190602001808311610ef557829003601f168201915b505050505090806008018054610f27906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610f53906147b0565b8015610fa05780601f10610f7557610100808354040283529160200191610fa0565b820191906000526020600020905b815481529060010190602001808311610f8357829003601f168201915b5050505050905089565b600060085482106110125760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610590565b5090565b61101f82612c48565b61103b5760405162461bcd60e51b8152600401610590906148c5565b6000600f8360405161104d91906148fc565b908152604080516020928190038301812060a08201835280546001600160a01b031682526001810154938201849052600281015492820192909252600382015460608201526004909101546080820152915085108015906110b15750806040015185105b6110fd5760405162461bcd60e51b815260206004820152601e60248201527f4339385374616b653a2057726f6e67206d696e206d617820666f726d617400006044820152606401610590565b80516001600160a01b03166000908152600e6020526040812082518154919290916111289089612ba7565b905082600101548111156111895760405162461bcd60e51b815260206004820152602260248201527f4339385374616b653a204d6178696d756d206e756d626572206f66207374616b604482015261195960f21b6064820152608401610590565b8651600784018054871515929160009161122c918c916111a8906147b0565b80601f01602080910402602001604051908101604052809291908181526020018280546111d4906147b0565b80156112215780601f106111f657610100808354040283529160200191611221565b820191906000526020600020905b81548152906001019060200180831161120457829003601f168201915b505050505033612cd8565b90508061126057601482111580156112445750600082115b6112605760405162461bcd60e51b815260040161059090614918565b600061129982611274578760020154611277565b60005b6112938661128657600061128c565b89600301545b8f90612ba7565b90612ba7565b90506112b06001600160a01b038716333084612d37565b606084156112c8576112c18a612d6f565b9050611324565b60006113116112da6001611293611507565b8f428c6008016040516020016112f394939291906149f3565b6040516020818303038152906040528051906020012060001c612d6f565b9050611320600a601583612e97565b9150505b8051600c1461133257600080fd5b60006113696113648a60080184604051602001611350929190614a11565b604051602081830303815290604052612f74565b612f91565b6000818152600260205260409020549091506001600160a01b0316156113d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610590565b600060106000838152602001908152602001600020905060018160000160016101000a81548160ff0219169083151502179055508e81600201819055504281600301819055508c81600401908051906020019061142f929190613f7f565b508a600001518160050160016101000a8154816001600160a01b0302191690836001600160a01b031602179055508d816001019080519060200190611475929190613f7f565b506005808201805489151560ff199182161790915582541682558a0154600782015560608b0151600682015560808b01516008820155878a556114b933838961303a565b505050505050505050505050505050565b6009546001600160a01b031633146114f45760405162461bcd60e51b815260040161059090614762565b805161062f90600c906020840190613f7f565b6000611512600d5490565b905090565b6000818152600260205260408120546001600160a01b0316806106585760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610590565b60006001600160a01b0382166115f95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610590565b506001600160a01b031660009081526003602052604090205490565b600082815260106020908152604080832060058082015461010090046001600160a01b03168552600e845282852083516101208101855281548152600182015495810195909552600281015493850193909352600383015460608501526004830154608085015282015460a0840152600682015460c0840152600782018054919493929160e0840191906116a8906147b0565b80601f01602080910402602001604051908101604052809291908181526020018280546116d4906147b0565b80156117215780601f106116f657610100808354040283529160200191611721565b820191906000526020600020905b81548152906001019060200180831161170457829003601f168201915b5050505050815260200160088201805461173a906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611766906147b0565b80156117b35780601f10611788576101008083540402835291602001916117b3565b820191906000526020600020905b81548152906001019060200180831161179657829003601f168201915b50505091909252505050600583015490915061010090046001600160a01b0316336117dd86611517565b6001600160a01b0316146118035760405162461bcd60e51b81526004016105909061483c565b6040820151611820906001600160a01b0383169033903090612d37565b8351601481118015906118335750600081115b61184f5760405162461bcd60e51b815260040161059090614918565b84516118649060018601906020880190613f7f565b507fa45a2191bfa6eff9a0f0c0db689db0b068a86f3cadcb18f196aa630410d9616d8686604051610ac8929190614a36565b6009546001600160a01b031633146118c05760405162461bcd60e51b815260040161059090614762565b815160058111156119135760405162461bcd60e51b815260206004820181905260248201527f4339385374616b653a204e616d65207072656669782073697a65206572726f726044820152606401610590565b8151600481146119655760405162461bcd60e51b815260206004820152601f60248201527f4339385374616b653a204e4654207072656669782073697a65206572726f72006044820152606401610590565b6001600160a01b038b166000908152600e6020908152604090912060068101879055600181018c9055600281018b9055600381018a90556005810188905560048101899055855190916119bf916007840191880190613f7f565b5083516119d59060088301906020870190613f7f565b50505050505050505050505050565b6009546001600160a01b03163314611a0e5760405162461bcd60e51b815260040161059090614762565b611a1785612c48565b611a335760405162461bcd60e51b8152600401610590906148c5565b6000600f86604051611a4591906148fc565b9081526040519081900360200190208054909150611a739086908690869086906001600160a01b0316613085565b60018101949094556002840192909255600383015560049091015550565b60606001805461066d906147b0565b6001600160a01b038216331415611af95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610590565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611b6d613ef3565b6000828152601060209081526040808320815161020081018352815460ff80821615158352610100909104161515938101939093526001810180549192840191611bb6906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611be2906147b0565b8015611c2f5780601f10611c0457610100808354040283529160200191611c2f565b820191906000526020600020905b815481529060010190602001808311611c1257829003601f168201915b505050505081526020016002820154815260200160038201548152602001600482018054611c5c906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c88906147b0565b8015611cd55780601f10611caa57610100808354040283529160200191611cd5565b820191906000526020600020905b815481529060010190602001808311611cb857829003601f168201915b5050509183525050600582015460ff8116151560208301526001600160a01b03610100918290041660408301526006830154606083015260078301546080830152600883015460a0830152600983015460c0830152600a83015460e0830152600b83015490820152600c820154610120820152600d90910154610140909101529050611d608361274d565b6101e08201526101c08101929092525090565b611d7d33836124ab565b611d995760405162461bcd60e51b8152600401610590906147eb565b611da584848484613306565b50505050565b6009546001600160a01b03163314611dd55760405162461bcd60e51b815260040161059090614762565b611dde81612c48565b611dfa5760405162461bcd60e51b8152600401610590906148c5565b600f81604051611e0a91906148fc565b90815260405190819003602001902080546001600160a01b0319168155600060018201819055600282018190556003820181905560049091015550565b6009546001600160a01b03163314611e715760405162461bcd60e51b815260040161059090614762565b611e7a86612c48565b15611ed15760405162461bcd60e51b815260206004820152602160248201527f4339385374616b653a205061636b61676520616c7265616479206578697374656044820152601960fa1b6064820152608401610590565b6001600160a01b0385166000908152600e6020526040902060010154611f395760405162461bcd60e51b815260206004820152601b60248201527f4339385374616b653a20556e72656769737465726564204d65746100000000006044820152606401610590565b611f468484848489613085565b6000600f87604051611f5891906148fc565b90815260405190819003602001902080546001600160a01b039097166001600160a01b03199097169690961786555060018501939093556002840191909155600383015560049091015550565b6000818152600260205260409020546060906001600160a01b03166120245760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610590565b600061202e613339565b9050600081511161204e5760405180602001604052806000815250612079565b8061205884613348565b604051602001612069929190614a4f565b6040516020818303038152906040525b9392505050565b6000818152601060205260409020805460ff166120f25760405162461bcd60e51b815260206004820152602a60248201527f4339385374616b653a204e6f74206d65657420636c61696d2070656e64696e676044820152691031b7b73234ba34b7b760b11b6064820152608401610590565b336120fc83611517565b6001600160a01b0316146121225760405162461bcd60e51b81526004016105909061483c565b6005810154600b8201546040516370a0823160e01b81523060048201526101009092046001600160a01b03169182906370a0823190602401602060405180830381865afa158015612177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219b9190614797565b10156121e95760405162461bcd60e51b815260206004820152601960248201527f4339385374616b653a204e6f7420656e6f75676820706f6f6c000000000000006044820152606401610590565b815460ff19168255600b82015461220c906001600160a01b03831690339061238a565b42600a830155600b82015460038301546040805186815260208101939093528201527f526db653bbb15297dbfd9e71369d8703ba6cf4e2a57faa5844d4906170205a00906060015b60405180910390a1505050565b600c805461226e906147b0565b80601f016020809104026020016040519081016040528092919081815260200182805461229a906147b0565b80156122e75780601f106122bc576101008083540402835291602001916122e7565b820191906000526020600020905b8154815290600101906020018083116122ca57829003601f168201915b505050505081565b6009546001600160a01b031633146123195760405162461bcd60e51b815260040161059090614762565b6001600160a01b03811661237e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610590565b61238781613445565b50565b6040516001600160a01b03831660248201526044810182905261089690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613497565b60006001600160e01b031982166380ac58cd60e01b148061241e57506001600160e01b03198216635b5e139f60e01b145b8061065857506301ffc9a760e01b6001600160e01b0319831614610658565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061247282611517565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166125245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610590565b600061252f83611517565b9050806001600160a01b0316846001600160a01b0316148061256a5750836001600160a01b031661255f846106f0565b6001600160a01b0316145b8061259a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166125b582611517565b6001600160a01b03161461261d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610590565b6001600160a01b03821661267f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610590565b61268a838383613569565b61269560008261243d565b6001600160a01b03831660009081526003602052604081208054600192906126be908490614a75565b90915550506001600160a01b03821660009081526003602052604081208054600192906126ec908490614a8c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152601060209081526040808320815161020081018352815460ff808216151583526101009091041615159381019390935260018101805485949384019190612798906147b0565b80601f01602080910402602001604051908101604052809291908181526020018280546127c4906147b0565b80156128115780601f106127e657610100808354040283529160200191612811565b820191906000526020600020905b8154815290600101906020018083116127f457829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201805461283e906147b0565b80601f016020809104026020016040519081016040528092919081815260200182805461286a906147b0565b80156128b75780601f1061288c576101008083540402835291602001916128b7565b820191906000526020600020905b81548152906001019060200180831161289a57829003601f168201915b505050505081526020016005820160009054906101000a900460ff161515151581526020016005820160019054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152505090506000600e60008360e001516001600160a01b03166001600160a01b0316815260200190815260200160002060405180610120016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820180546129e9906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612a15906147b0565b8015612a625780601f10612a3757610100808354040283529160200191612a62565b820191906000526020600020905b815481529060010190602001808311612a4557829003601f168201915b50505050508152602001600882018054612a7b906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa7906147b0565b8015612af45780601f10612ac957610100808354040283529160200191612af4565b820191906000526020600020905b815481529060010190602001808311612ad757829003601f168201915b505050505081525050905060004290506000836080015182612b169190614a75565b905083602001511580612b2c5750826080015181105b15612b3d5750600095945050505050565b60008461010001518210612b5657846101400151612b5c565b8360c001515b90506000612b8f82612b89600b54612b83600a548b6060015161362290919063ffffffff16565b90613622565b90613664565b9050612b9b8184613664565b98975050505050505050565b600080612bb48385614a8c565b9050838110156120795760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610590565b600061207983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506136e3565b600080600f83604051612c5b91906148fc565b908152604080516020928190038301812060a08201835280546001600160a01b031682526001810154938201849052600281015492820192909252600382015460608201526004909101546080820152915015801590612cbf575060008160400151115b8015612079575080604001518160200151109392505050565b825182516000919080612d0c57612d03612cfd6001600a612cf88861371d565b612e97565b87613755565b92505050612079565b612d21612d1b60018389612e97565b86613755565b8015612d2d575081600a145b9695505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611da59085906323b872dd60e01b906084016123b6565b606081612d935750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612dbd5780612da7816148aa565b9150612db69050600a83614aba565b9150612d97565b6000816001600160401b03811115612dd757612dd7614054565b6040519080825280601f01601f191660200182016040528015612e01576020820181803683370190505b509050815b8515612e8e57612e17600182614a75565b90506000612e26600a88614aba565b612e3190600a614ace565b612e3b9088614a75565b612e46906030614aed565b905060008160f81b905080848481518110612e6357612e6361487e565b60200101906001600160f81b031916908160001a905350612e85600a89614aba565b97505050612e06565b50949350505050565b60606000612ea58585614a75565b612eb0906001614a8c565b6001600160401b03811115612ec757612ec7614054565b6040519080825280601f01601f191660200182016040528015612ef1576020820181803683370190505b50905060005b612f018686614a75565b8111612e8e57836001612f148884614a8c565b612f1e9190614a75565b81518110612f2e57612f2e61487e565b602001015160f81c60f81b828281518110612f4b57612f4b61487e565b60200101906001600160f81b031916908160001a90535080612f6c816148aa565b915050612ef7565b80516000908290612f885750600092915050565b50506020015190565b600081612f9d57600080fd5b6000805b602081101561303357612fb581601f614a75565b612fc0906008614ace565b612fcb906002614bf6565b612fd59085614aba565b60ff16915081612fe457613033565b6030821080612ff35750603982115b15612ffd57600080fd5b613008600a84614ace565b9250613015603083614a75565b61301f9084614a8c565b92508061302b816148aa565b915050612fa1565b5050919050565b613044600d6137ae565b61304e83836137cb565b6040805183815282151560208201527feae6e78e35289970c8d501e986b0d886dcbf3802108c3cf328b59cd51c41d6b79101612254565b6000851180156130955750600084115b80156130a057508385105b6130ec5760405162461bcd60e51b815260206004820152601e60248201527f4339385374616b653a2057726f6e67206e756d6572696320666f726d617400006044820152606401610590565b6000600e6000836001600160a01b03166001600160a01b031681526020019081526020016000206040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782018054613175906147b0565b80601f01602080910402602001604051908101604052809291908181526020018280546131a1906147b0565b80156131ee5780601f106131c3576101008083540402835291602001916131ee565b820191906000526020600020905b8154815290600101906020018083116131d157829003601f168201915b50505050508152602001600882018054613207906147b0565b80601f0160208091040260200160405190810160405280929190818152602001828054613233906147b0565b80156132805780601f1061325557610100808354040283529160200191613280565b820191906000526020600020905b81548152906001019060200180831161326357829003601f168201915b50505050508152505090508060800151841180156132a157508060c0015183115b6132fe5760405162461bcd60e51b815260206004820152602860248201527f4339385374616b653a204c6f776572207468616e206d696e696d756d2074696d604482015267652026207261746560c01b6064820152608401610590565b505050505050565b6133118484846125a2565b61331d848484846137e5565b611da55760405162461bcd60e51b815260040161059090614c02565b6060600c805461066d906147b0565b60608161336c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156133965780613380816148aa565b915061338f9050600a83614aba565b9150613370565b6000816001600160401b038111156133b0576133b0614054565b6040519080825280601f01601f1916602001820160405280156133da576020820181803683370190505b5090505b841561259a576133ef600183614a75565b91506133fc600a86614c54565b613407906030614a8c565b60f81b81838151811061341c5761341c61487e565b60200101906001600160f81b031916908160001a90535061343e600a86614aba565b94506133de565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006134ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138e39092919063ffffffff16565b805190915015610896578080602001905181019061350a9190614c68565b6108965760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610590565b6001600160a01b0382166135b45760405162461bcd60e51b8152602060048201526012602482015271546f6b656e206e6f74206275726e61626c6560701b6044820152606401610590565b6001600160a01b0383166135dc57600880549060006135d2836148aa565b91905055506135ff565b816001600160a01b0316836001600160a01b0316146135ff576135ff83826138f2565b826001600160a01b0316826001600160a01b03161461089657610896828261398f565b600061207983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506139d3565b60008261367357506000610658565b600061367f8385614ace565b90508261368c8583614aba565b146120795760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610590565b600081848411156137075760405162461bcd60e51b815260040161059091906141be565b5060006137148486614a75565b95945050505050565b604051606082811b6bffffffffffffffffffffffff191660208301529061065890603401604051602081830303815290604052613a01565b60008160405160200161376891906148fc565b604051602081830303815290604052805190602001208360405160200161378f91906148fc565b6040516020818303038152906040528051906020012014905092915050565b60018160000160008282546137c39190614a8c565b909155505050565b61062f828260405180602001604052806000815250613c11565b60006001600160a01b0384163b156138d857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613829903390899088908890600401614c85565b6020604051808303816000875af1925050508015613864575060408051601f3d908101601f1916820190925261386191810190614cb8565b60015b6138be573d808015613892576040519150601f19603f3d011682016040523d82523d6000602084013e613897565b606091505b5080516138b65760405162461bcd60e51b815260040161059090614c02565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061259a565b506001949350505050565b606061259a8484600085613c44565b600060016138ff8461158e565b6139099190614a75565b60008381526007602052604090205490915080821461395c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600061399a8361158e565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600081836139f45760405162461bcd60e51b815260040161059091906141be565b5060006137148486614aba565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090613a3c906002614ace565b613a47906002614a8c565b6001600160401b03811115613a5e57613a5e614054565b6040519080825280601f01601f191660200182016040528015613a88576020820181803683370190505b509050600360fc1b81600081518110613aa357613aa361487e565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613ad257613ad261487e565b60200101906001600160f81b031916908160001a90535060005b8451811015610e4457826004868381518110613b0a57613b0a61487e565b016020015182516001600160f81b031990911690911c60f81c908110613b3257613b3261487e565b01602001516001600160f81b03191682613b4d836002614ace565b613b58906002614a8c565b81518110613b6857613b6861487e565b60200101906001600160f81b031916908160001a90535082858281518110613b9257613b9261487e565b602091010151815160f89190911c600f16908110613bb257613bb261487e565b01602001516001600160f81b03191682613bcd836002614ace565b613bd8906003614a8c565b81518110613be857613be861487e565b60200101906001600160f81b031916908160001a90535080613c09816148aa565b915050613aec565b613c1b8383613d6c565b613c2860008484846137e5565b6108965760405162461bcd60e51b815260040161059090614c02565b606082471015613ca55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610590565b843b613cf35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610590565b600080866001600160a01b03168587604051613d0f91906148fc565b60006040518083038185875af1925050503d8060008114613d4c576040519150601f19603f3d011682016040523d82523d6000602084013e613d51565b606091505b5091509150613d61828286613eba565b979650505050505050565b6001600160a01b038216613dc25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610590565b6000818152600260205260409020546001600160a01b031615613e275760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610590565b613e3360008383613569565b6001600160a01b0382166000908152600360205260408120805460019290613e5c908490614a8c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608315613ec9575081612079565b825115613ed95782518084602001fd5b8160405162461bcd60e51b815260040161059091906141be565b6040518061020001604052806000151581526020016000151581526020016060815260200160008152602001600081526020016060815260200160001515815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054613f8b906147b0565b90600052602060002090601f016020900481019282613fad5760008555613ff3565b82601f10613fc657805160ff1916838001178555613ff3565b82800160010185558215613ff3579182015b82811115613ff3578251825591602001919060010190613fd8565b506110129291505b808211156110125760008155600101613ffb565b6001600160a01b038116811461238757600080fd5b6000806040838503121561403757600080fd5b8235915060208301356140498161400f565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561408457614084614054565b604051601f8501601f19908116603f011681019082821181831017156140ac576140ac614054565b816040528093508581528686860111156140c557600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126140f057600080fd5b6120798383356020850161406a565b60006020828403121561411157600080fd5b81356001600160401b0381111561412757600080fd5b61259a848285016140df565b6001600160e01b03198116811461238757600080fd5b60006020828403121561415b57600080fd5b813561207981614133565b60005b83811015614181578181015183820152602001614169565b83811115611da55750506000910152565b600081518084526141aa816020860160208601614166565b601f01601f19169290920160200192915050565b6020815260006120796020830184614192565b6000602082840312156141e357600080fd5b5035919050565b600080604083850312156141fd57600080fd5b82356142088161400f565b946020939093013593505050565b60008060006060848603121561422b57600080fd5b83356142368161400f565b925060208401356142468161400f565b929592945050506040919091013590565b60006020828403121561426957600080fd5b81356120798161400f565b80511515825260006102006020830151614292602086018215159052565b5060408301518160408601526142aa82860182614192565b915050606083015160608501526080830151608085015260a083015184820360a08601526142d88282614192565b91505060c08301516142ee60c086018215159052565b5060e083015161430960e08601826001600160a01b03169052565b50610100838101519085015261012080840151908501526101408084015190850152610160808401519085015261018080840151908501526101a080840151908501526101c080840151908501526101e09283015192909301919091525090565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156143bf57603f198886030184526143ad858351614274565b94509285019290850190600101614391565b5092979650505050505050565b60006101208b83528a60208401528960408401528860608401528760808401528660a08401528560c08401528060e084015261440a81840186614192565b905082810361010084015261441f8185614192565b9c9b505050505050505050505050565b6000806000806080858703121561444557600080fd5b8435935060208501356001600160401b038082111561446357600080fd5b61446f888389016140df565b9450604087013591508082111561448557600080fd5b50614492878288016140df565b949793965093946060013593505050565b600080604083850312156144b657600080fd5b8235915060208301356001600160401b038111156144d357600080fd5b6144df858286016140df565b9150509250929050565b60008060008060008060008060006101208a8c03121561450857600080fd5b89356145138161400f565b985060208a0135975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a01356001600160401b038082111561455957600080fd5b6145658d838e016140df565b93506101008c013591508082111561457c57600080fd5b506145898c828d016140df565b9150509295985092959850929598565b600080600080600060a086880312156145b157600080fd5b85356001600160401b038111156145c757600080fd5b6145d3888289016140df565b9860208801359850604088013597606081013597506080013595509350505050565b801515811461238757600080fd5b6000806040838503121561461657600080fd5b82356146218161400f565b91506020830135614049816145f5565b6020815260006120796020830184614274565b6000806000806080858703121561465a57600080fd5b84356146658161400f565b935060208501356146758161400f565b92506040850135915060608501356001600160401b0381111561469757600080fd5b8501601f810187136146a857600080fd5b6146b78782356020840161406a565b91505092959194509250565b60008060008060008060c087890312156146dc57600080fd5b86356001600160401b038111156146f257600080fd5b6146fe89828a016140df565b965050602087013561470f8161400f565b95989597505050506040840135936060810135936080820135935060a0909101359150565b6000806040838503121561474757600080fd5b82356147528161400f565b915060208301356140498161400f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156147a957600080fd5b5051919050565b600181811c908216806147c457607f821691505b602082108114156147e557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f4339385374616b653a204e6f74206d656574206f776e657220636f6e6469746960408201526137b760f11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156148be576148be614894565b5060010190565b6020808252601b908201527f4339385374616b653a205061636b616765206e6f7420666f756e640000000000604082015260600190565b6000825161490e818460208701614166565b9190910192915050565b60208082526021908201527f4339385374616b653a204e6f74206d656574206e616d6520636f6e646974696f6040820152603760f91b606082015260800190565b8054600090600181811c908083168061497357607f831692505b602080841082141561499557634e487b7160e01b600052602260045260246000fd5b8180156149a957600181146149ba576149e7565b60ff198616895284890196506149e7565b60008881526020902060005b868110156149df5781548b8201529085019083016149c6565b505084890196505b50505050505092915050565b8481528360208201528260408201526000612d2d6060830184614959565b6000614a1d8285614959565b8351614a2d818360208801614166565b01949350505050565b82815260406020820152600061259a6040830184614192565b60008351614a61818460208801614166565b835190830190614a2d818360208801614166565b600082821015614a8757614a87614894565b500390565b60008219821115614a9f57614a9f614894565b500190565b634e487b7160e01b600052601260045260246000fd5b600082614ac957614ac9614aa4565b500490565b6000816000190483118215151615614ae857614ae8614894565b500290565b600060ff821660ff84168060ff03821115614b0a57614b0a614894565b019392505050565b600181815b80851115614b4d578160001904821115614b3357614b33614894565b80851615614b4057918102915b93841c9390800290614b17565b509250929050565b600082614b6457506001610658565b81614b7157506000610658565b8160018114614b875760028114614b9157614bad565b6001915050610658565b60ff841115614ba257614ba2614894565b50506001821b610658565b5060208310610133831016604e8410600b8410161715614bd0575081810a610658565b614bda8383614b12565b8060001904821115614bee57614bee614894565b029392505050565b60006120798383614b55565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082614c6357614c63614aa4565b500690565b600060208284031215614c7a57600080fd5b8151612079816145f5565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d2d90830184614192565b600060208284031215614cca57600080fd5b81516120798161413356fea2646970667358221220ca05c3bde03b925bc04535ed54850ae55a9794372ac46626a7998f29f6001e7164736f6c634300080a0033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f66696c652e636f696e39382e636f6d2f7374616b652f6574682f000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://file.coin98.com/stake/eth/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [2] : 68747470733a2f2f66696c652e636f696e39382e636f6d2f7374616b652f6574
Arg [3] : 682f000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

38923:18485:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55815:219;;;;;;:::i;:::-;;:::i;:::-;;41235:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41235:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2209:32:1;;;2191:51;;2273:2;2258:18;;2251:34;;;;2301:18;;;2294:34;;;;2359:2;2344:18;;2337:34;2402:3;2387:19;;2380:35;2178:3;2163:19;41235:50:0;;;;;;;;29411:272;;;;;;:::i;:::-;;:::i;:::-;;;3073:14:1;;3066:22;3048:41;;3036:2;3021:18;29411:272:0;2908:187:1;21199:100:0;;;:::i;:::-;;;;;;;:::i;22742:248::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4200:32:1;;;4182:51;;4170:2;4155:18;22742:248:0;4036:203:1;22261:415:0;;;;;;:::i;:::-;;:::i;30098:105::-;30183:12;;30098:105;;;4718:25:1;;;4706:2;4691:18;30098:105:0;4572:177:1;23709:373:0;;;;;;:::i;:::-;;:::i;53344:1093::-;;;;;;:::i;:::-;;:::i;29767:323::-;;;;;;:::i;:::-;;:::i;24153:182::-;;;;;;:::i;:::-;;:::i;56438:626::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41135:45::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;30211:264::-;;;;;;:::i;:::-;;:::i;49358:2869::-;;;;;;:::i;:::-;;:::i;57193:101::-;;;;;;:::i;:::-;;:::i;57302:103::-;;;:::i;20866:266::-;;;;;;:::i;:::-;;:::i;20569:235::-;;;;;;:::i;:::-;;:::i;52466:644::-;;;;;;:::i;:::-;;:::i;42587:1035::-;;;;;;:::i;:::-;;:::i;17904:87::-;17977:6;;-1:-1:-1;;;;;17977:6:0;17904:87;;46596:532;;;;;;:::i;:::-;;:::i;21368:104::-;;;:::i;23062:315::-;;;;;;:::i;:::-;;:::i;56099:269::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24406:362::-;;;;;;:::i;:::-;;:::i;45946:223::-;;;;;;:::i;:::-;;:::i;45157:645::-;;;;;;:::i;:::-;;:::i;21543:425::-;;;;;;:::i;:::-;;:::i;54703:717::-;;;;;;:::i;:::-;;:::i;39177:26::-;;;:::i;23448:194::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23599:25:0;;;23570:4;23599:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23448:194;18359:201;;;;;;:::i;:::-;;:::i;55815:219::-;17977:6;;-1:-1:-1;;;;;17977:6:0;17354:10;18124:23;18116:68;;;;-1:-1:-1;;;18116:68:0;;;;;;;:::i;:::-;;;;;;;;;55911:1:::1;55901:7;:11;55893:20;;;::::0;::::1;;55932:31;::::0;-1:-1:-1;;;55932:31:0;;55957:4:::1;55932:31;::::0;::::1;4182:51:1::0;55967:7:0;;-1:-1:-1;;;;;55932:16:0;::::1;::::0;::::1;::::0;4155:18:1;;55932:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;55924:51;;;::::0;::::1;;55986:40;-1:-1:-1::0;;;;;55986:19:0;::::1;56006:10;56018:7:::0;55986:19:::1;:40::i;:::-;55815:219:::0;;:::o;29411:272::-;29538:4;-1:-1:-1;;;;;;29576:50:0;;-1:-1:-1;;;29576:50:0;;:99;;;29639:36;29663:11;29639:23;:36::i;:::-;29560:115;29411:272;-1:-1:-1;;29411:272:0:o;21199:100::-;21253:13;21286:5;21279:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21199:100;:::o;22742:248::-;22840:7;25219:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25219:16:0;22865:73;;;;-1:-1:-1;;;22865:73:0;;15474:2:1;22865:73:0;;;15456:21:1;15513:2;15493:18;;;15486:30;15552:34;15532:18;;;15525:62;-1:-1:-1;;;15603:18:1;;;15596:42;15655:19;;22865:73:0;15272:408:1;22865:73:0;-1:-1:-1;22958:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22958:24:0;;22742:248::o;22261:415::-;22339:13;22355:23;22370:7;22355:14;:23::i;:::-;22339:39;;22403:5;-1:-1:-1;;;;;22397:11:0;:2;-1:-1:-1;;;;;22397:11:0;;;22389:57;;;;-1:-1:-1;;;22389:57:0;;15887:2:1;22389:57:0;;;15869:21:1;15926:2;15906:18;;;15899:30;15965:34;15945:18;;;15938:62;-1:-1:-1;;;16016:18:1;;;16009:31;16057:19;;22389:57:0;15685:397:1;22389:57:0;17354:10;-1:-1:-1;;;;;22481:21:0;;;;:69;;-1:-1:-1;22506:44:0;22530:5;17354:10;23448:194;:::i;22506:44::-;22459:175;;;;-1:-1:-1;;;22459:175:0;;16289:2:1;22459:175:0;;;16271:21:1;16328:2;16308:18;;;16301:30;16367:34;16347:18;;;16340:62;16438:26;16418:18;;;16411:54;16482:19;;22459:175:0;16087:420:1;22459:175:0;22647:21;22656:2;22660:7;22647:8;:21::i;:::-;22328:348;22261:415;;:::o;23709:373::-;23915:41;17354:10;23948:7;23915:18;:41::i;:::-;23893:140;;;;-1:-1:-1;;;23893:140:0;;;;;;;:::i;:::-;24046:28;24056:4;24062:2;24066:7;24046:9;:28::i;53344:1093::-;53397:27;53427:20;;;:10;:20;;;;;;;;53496:14;;;;;;;-1:-1:-1;;;;;53496:14:0;53486:25;;:9;:25;;;;;53427:20;;53542:28;53427:20;53542:18;:28::i;:::-;53524:46;;53599:1;53589:7;:11;53581:60;;;;-1:-1:-1;;;53581:60:0;;17132:2:1;53581:60:0;;;17114:21:1;17171:2;17151:18;;;17144:30;17210:34;17190:18;;;17183:62;-1:-1:-1;;;17261:18:1;;;17254:34;17305:19;;53581:60:0;16930:400:1;53581:60:0;53681:10;53660:17;53668:8;53660:7;:17::i;:::-;-1:-1:-1;;;;;53660:31:0;;53652:78;;;;-1:-1:-1;;;53652:78:0;;;;;;;:::i;:::-;53777:14;;;;53849:16;;;;53777:14;;;;-1:-1:-1;;;;;53777:14:0;;53751:16;;53837:29;;:7;;:11;:29::i;:::-;53897:34;;-1:-1:-1;;;53897:34:0;;53925:4;53897:34;;;4182:51:1;53814:52:0;;-1:-1:-1;53814:52:0;;-1:-1:-1;;;;;53897:19:0;;;;;4155:18:1;;53897:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;53889:59;;;;;;53959:22;;-1:-1:-1;;53959:22:0;;;54042:16;;;;54016:21;;:43;;:25;:43::i;:::-;53992:67;;54083:22;;;;54080:166;;54124:48;-1:-1:-1;;;;;54124:22:0;;54147:10;54159:12;54124:22;:48::i;:::-;54080:166;;;54205:29;;-1:-1:-1;;54205:29:0;54230:4;54205:29;;;54080:166;54292:15;54266:23;;;:41;54318:21;;;:37;;;54414:14;;;;54381:48;;;17940:25:1;;;17996:2;17981:18;;17974:34;;;18024:18;;;18017:34;;;;54381:48:0;;17928:2:1;17913:18;54381:48:0;;;;;;;;53386:1051;;;;;53344:1093;:::o;29767:323::-;29886:4;29938:23;29955:5;29938:16;:23::i;:::-;29930:5;:31;29908:124;;;;-1:-1:-1;;;29908:124:0;;18264:2:1;29908:124:0;;;18246:21:1;18303:2;18283:18;;;18276:30;18342:34;18322:18;;;18315:62;-1:-1:-1;;;18393:18:1;;;18386:41;18444:19;;29908:124:0;18062:407:1;29908:124:0;-1:-1:-1;;;;;;30050:19:0;;;;;;;;:12;:19;;;;;;;;:32;;;;;;;;;29767:323::o;24153:182::-;24288:39;24305:4;24311:2;24315:7;24288:39;;;;;;;;;;;;:16;:39::i;56438:626::-;56500:18;56531;56552:17;56562:6;56552:9;:17::i;:::-;56531:38;;56582:31;56632:10;-1:-1:-1;;;;;56616:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;56582:61;;56669:9;56664:356;56688:10;56684:1;:14;56664:356;;;56720:18;56741:30;56761:6;56769:1;56741:19;:30::i;:::-;56786:31;56820:22;;;:10;:22;;;;;;;;56786:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56720:51;;-1:-1:-1;56786:31:0;;:56;;56820:22;;56786:56;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56786:56:0;;;-1:-1:-1;;56786:56:0;;;;;;;;;;;;;-1:-1:-1;;;;;56786:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56885:30:0;56904:10;56885:18;:30::i;:::-;56857:25;;;:58;56930:17;;;:30;;;56975:16;;56857:14;;56975:13;;56989:1;;56975:16;;;;;;:::i;:::-;;;;;;:33;;;;56705:315;;56700:3;;;;;:::i;:::-;;;;56664:356;;;-1:-1:-1;57043:13:0;56438:626;-1:-1:-1;;;56438:626:0:o;41135:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30211:264::-;30308:4;30360:12;;30352:5;:20;30330:114;;;;-1:-1:-1;;;30330:114:0;;19080:2:1;30330:114:0;;;19062:21:1;19119:2;19099:18;;;19092:30;19158:34;19138:18;;;19131:62;-1:-1:-1;;;19209:18:1;;;19202:42;19261:19;;30330:114:0;18878:408:1;30330:114:0;-1:-1:-1;30462:5:0;30211:264::o;49358:2869::-;49480:22;49493:8;49480:12;:22::i;:::-;49472:62;;;;-1:-1:-1;;;49472:62:0;;;;;;;:::i;:::-;49555:25;49583:12;49596:8;49583:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;49555:50;;;;;;;-1:-1:-1;;;;;49555:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49583:22;-1:-1:-1;49708:21:0;;;;;:45;;;49743:6;:10;;;49733:7;:20;49708:45;49700:89;;;;-1:-1:-1;;;49700:89:0;;20130:2:1;49700:89:0;;;20112:21:1;20169:2;20149:18;;;20142:30;20208:32;20188:18;;;20181:60;20258:18;;49700:89:0;19928:354:1;49700:89:0;49838:11;;-1:-1:-1;;;;;49828:22:0;49800:25;49828:22;;;:9;:22;;;;;49887:11;;49939:21;;49828:22;;49887:11;;49939:34;;49965:7;49939:25;:34::i;:::-;49912:61;;50012:8;:19;;;49992:16;:39;;49984:86;;;;-1:-1:-1;;;49984:86:0;;20489:2:1;49984:86:0;;;20471:21:1;20528:2;20508:18;;;20501:30;20567:34;20547:18;;;20540:62;-1:-1:-1;;;20618:18:1;;;20611:32;20660:19;;49984:86:0;20287:398:1;49984:86:0;50242:19;;50324:20;;;50298:59;;50106:14;;;;50242:19;50087:16;;50298:59;;50248:5;;50298:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50346:10;50298:18;:59::i;:::-;50274:83;;50382:16;50378:123;;50434:2;50422:8;:14;;:30;;;;;50451:1;50440:8;:12;50422:30;50414:75;;;;-1:-1:-1;;;50414:75:0;;;;;;;:::i;:::-;50521:17;50542:95;50594:16;:42;;50617:8;:19;;;50594:42;;;50613:1;50594:42;50542:47;50554:11;:33;;50586:1;50554:33;;;50568:8;:15;;;50554:33;50542:7;;:11;:47::i;:::-;:51;;:95::i;:::-;50521:116;-1:-1:-1;50648:64:0;-1:-1:-1;;;;;50648:26:0;;50675:10;50695:4;50521:116;50648:26;:64::i;:::-;50733:22;50780:11;50776:341;;;50818:31;50839:9;50818:20;:31::i;:::-;50807:42;;50776:341;;;50882:27;50912:123;50968:19;50985:1;50968:12;:10;:12::i;:19::-;50988:7;50996:15;51012:8;:19;;50951:81;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50941:92;;;;;;50933:101;;50912:20;:123::i;:::-;50882:153;;51061:44;51085:2;51088;51091:13;51061:23;:44::i;:::-;51050:55;;50867:250;50776:341;51205:8;51199:22;51225:2;51199:28;51191:37;;;;;;51292:20;51315:108;51339:83;51391:8;:19;;51411:8;51374:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51339:27;:83::i;:::-;51315:23;:108::i;:::-;25195:4;25219:16;;;:7;:16;;;;;;51292:131;;-1:-1:-1;;;;;;25219:16:0;:30;51444:63;;;;-1:-1:-1;;;51444:63:0;;23176:2:1;51444:63:0;;;23158:21:1;23215:2;23195:18;;;23188:30;23254;23234:18;;;23227:58;23302:18;;51444:63:0;22974:352:1;51444:63:0;51566:27;51596:10;:24;51607:12;51596:24;;;;;;;;;;;51566:54;;51648:4;51631:9;:14;;;:21;;;;;;;;;;;;;;;;;;51682:7;51663:9;:16;;:26;;;;51717:15;51700:9;:14;;:32;;;;51765:8;51743:9;:19;;:30;;;;;;;;;;;;:::i;:::-;;51801:6;:11;;;51784:9;:14;;;:28;;;;;-1:-1:-1;;;;;51784:28:0;;;;;-1:-1:-1;;;;;51784:28:0;;;;;;51850:5;51833:9;:14;;:22;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51866:20:0;;;;:34;;;;;-1:-1:-1;;51866:34:0;;;;;;;51921:30;;;;;51987:21;;;51962:22;;;:46;52044:11;;;;52019:22;;;:36;52083:11;;;;52066:14;;;:28;52115:40;;;52166:53;52181:10;52193:12;51889:11;52166:14;:53::i;:::-;49461:2766;;;;;;;;;;;49358:2869;;;;:::o;57193:101::-;17977:6;;-1:-1:-1;;;;;17977:6:0;17354:10;18124:23;18116:68;;;;-1:-1:-1;;;18116:68:0;;;;;;;:::i;:::-;57264:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;57302:103::-:0;57345:7;57372:25;:15;6553:14;;6461:114;57372:25;57365:32;;57302:103;:::o;20866:266::-;20960:7;21001:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21001:16:0;21036:19;21028:73;;;;-1:-1:-1;;;21028:73:0;;23533:2:1;21028:73:0;;;23515:21:1;23572:2;23552:18;;;23545:30;23611:34;23591:18;;;23584:62;-1:-1:-1;;;23662:18:1;;;23655:39;23711:19;;21028:73:0;23331:405:1;20569:235:0;20666:4;-1:-1:-1;;;;;20696:19:0;;20688:74;;;;-1:-1:-1;;;20688:74:0;;23943:2:1;20688:74:0;;;23925:21:1;23982:2;23962:18;;;23955:30;24021:34;24001:18;;;23994:62;-1:-1:-1;;;24072:18:1;;;24065:40;24122:19;;20688:74:0;23741:406:1;20688:74:0;-1:-1:-1;;;;;;20780:16:0;;;;;:9;:16;;;;;;;20569:235::o;52466:644::-;52541:27;52571:20;;;:10;:20;;;;;;;;52639:14;;;;;;;;-1:-1:-1;;;;;52639:14:0;52629:25;;:9;:25;;;;;52602:52;;;;;;;;;;;52639:14;52602:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52571:20;;52541:27;52602:52;52629:25;52602:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52602:52:0;;;;-1:-1:-1;;;52691:14:0;;;;52602:52;;-1:-1:-1;52691:14:0;;;-1:-1:-1;;;;;52691:14:0;52748:10;52727:17;52735:8;52727:7;:17::i;:::-;-1:-1:-1;;;;;52727:31:0;;52719:78;;;;-1:-1:-1;;;52719:78:0;;;;;;;:::i;:::-;52862:19;;;;52808:74;;-1:-1:-1;;;;;52808:26:0;;;52835:10;;52855:4;;52808:26;:74::i;:::-;52912:19;;52962:2;52950:14;;;;;:30;;;52979:1;52968:8;:12;52950:30;52942:75;;;;-1:-1:-1;;;52942:75:0;;;;;;;:::i;:::-;53038:22;;;;:14;;;;:22;;;;;:::i;:::-;;53076:26;53086:8;53096:5;53076:26;;;;;;;:::i;42587:1035::-;17977:6;;-1:-1:-1;;;;;17977:6:0;17354:10;18124:23;18116:68;;;;-1:-1:-1;;;18116:68:0;;;;;;;:::i;:::-;42968:26;;43025:1:::1;43013:13:::0;::::1;;43005:58;;;::::0;-1:-1:-1;;;43005:58:0;;24650:2:1;43005:58:0::1;::::0;::::1;24632:21:1::0;;;24669:18;;;24662:30;24728:34;24708:18;;;24701:62;24780:18;;43005:58:0::1;24448:356:1::0;43005:58:0::1;43098:25:::0;;43159:1:::1;43142:18:::0;::::1;43134:62;;;::::0;-1:-1:-1;;;43134:62:0;;25011:2:1;43134:62:0::1;::::0;::::1;24993:21:1::0;25050:2;25030:18;;;25023:30;25089:33;25069:18;;;25062:61;25140:18;;43134:62:0::1;24809:355:1::0;43134:62:0::1;-1:-1:-1::0;;;;;43237:17:0;::::1;43209:25;43237:17:::0;;;:9:::1;:17;::::0;;;;;;;43267:22:::1;::::0;::::1;:39:::0;;;43317:19:::1;::::0;::::1;:33:::0;;;43361:19:::1;::::0;::::1;:33:::0;;;43405:15:::1;::::0;::::1;:25:::0;;;-1:-1:-1;43441:21:0;::::1;:37:::0;;;-1:-1:-1;43489:20:0;::::1;:35:::0;;;43535;;43237:17;;43535:35:::1;::::0;:20:::1;::::0;::::1;::::0;:35;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;43581:33:0;;::::1;::::0;:19:::1;::::0;::::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;:::-;;42938:684;;;42587:1035:::0;;;;;;;;;:::o;46596:532::-;17977:6;;-1:-1:-1;;;;;17977:6:0;17354:10;18124:23;18116:68;;;;-1:-1:-1;;;18116:68:0;;;;;;;:::i;:::-;46817:22:::1;46830:8;46817:12;:22::i;:::-;46809:62;;;;-1:-1:-1::0;;;46809:62:0::1;;;;;;;:::i;:::-;46882:26;46911:12;46924:8;46911:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;46990:11;;46911:22;;-1:-1:-1;46946:56:0::1;::::0;46968:4;;46973;;46978:5;;46984;;-1:-1:-1;;;;;46990:11:0::1;46946:21;:56::i;:::-;47015:10;::::0;::::1;:17:::0;;;;47043:10:::1;::::0;::::1;:17:::0;;;;47071:11:::1;::::0;::::1;:19:::0;47101:11:::1;::::0;;::::1;:19:::0;-1:-1:-1;46596:532:0:o;21368:104::-;21424:13;21457:7;21450:14;;;;;:::i;23062:315::-;-1:-1:-1;;;;;23185:24:0;;17354:10;23185:24;;23177:62;;;;-1:-1:-1;;;23177:62:0;;25371:2:1;23177:62:0;;;25353:21:1;25410:2;25390:18;;;25383:30;25449:27;25429:18;;;25422:55;25494:18;;23177:62:0;25169:349:1;23177:62:0;17354:10;23252:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23252:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23252:53:0;;;;;;;;;;23321:48;;3048:41:1;;;23252:42:0;;17354:10;23321:48;;3021:18:1;23321:48:0;;;;;;;23062:315;;:::o;56099:269::-;56162:16;;:::i;:::-;56191:26;56220:19;;;:10;:19;;;;;;;;56191:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56220:19;;56191:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56191:48:0;;;-1:-1:-1;;56191:48:0;;;;;;;;;;;;;-1:-1:-1;;;;;56191:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56273:27:0;56292:7;56273:18;:27::i;:::-;56250:20;;;:50;56311:12;;;:22;;;;-1:-1:-1;56250:9:0;56099:269::o;24406:362::-;24592:41;17354:10;24625:7;24592:18;:41::i;:::-;24570:140;;;;-1:-1:-1;;;24570:140:0;;;;;;;:::i;:::-;24721:39;24735:4;24741:2;24745:7;24754:5;24721:13;:39::i;:::-;24406:362;;;;:::o;45946:223::-;17977:6;;-1:-1:-1;;;;;17977:6:0;17354:10;18124:23;18116:68;;;;-1:-1:-1;;;18116:68:0;;;;;;;:::i;:::-;46067:22:::1;46080:8;46067:12;:22::i;:::-;46059:62;;;;-1:-1:-1::0;;;46059:62:0::1;;;;;;;:::i;:::-;46139:12;46152:8;46139:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;46132:29;;-1:-1:-1;;;;;;46132:29:0::1;::::0;;46139:22:::1;46132:29:::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;-1:-1:-1;45946:223:0:o;45157:645::-;17977:6;;-1:-1:-1;;;;;17977:6:0;17354:10;18124:23;18116:68;;;;-1:-1:-1;;;18116:68:0;;;;;;;:::i;:::-;45395:22:::1;45408:8;45395:12;:22::i;:::-;45394:23;45386:69;;;::::0;-1:-1:-1;;;45386:69:0;;25725:2:1;45386:69:0::1;::::0;::::1;25707:21:1::0;25764:2;25744:18;;;25737:30;25803:34;25783:18;;;25776:62;-1:-1:-1;;;25854:18:1;;;25847:31;25895:19;;45386:69:0::1;25523:397:1::0;45386:69:0::1;-1:-1:-1::0;;;;;43719:17:0;;43688:12;43719:17;;;:9;:17;;;;;:28;;;45466:55:::1;;;::::0;-1:-1:-1;;;45466:55:0;;26127:2:1;45466:55:0::1;::::0;::::1;26109:21:1::0;26166:2;26146:18;;;26139:30;26205:29;26185:18;;;26178:57;26252:18;;45466:55:0::1;25925:351:1::0;45466:55:0::1;45532:50;45554:4;45559;45564:5;45570;45576;45532:21;:50::i;:::-;45595:26;45624:12;45637:8;45624:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;45659:19;;-1:-1:-1;;;;;45659:19:0;;::::1;-1:-1:-1::0;;;;;;45659:19:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;45659:19:0;45689:10;::::1;:17:::0;;;;45717:10:::1;::::0;::::1;:17:::0;;;;45745:11:::1;::::0;::::1;:19:::0;45775:11:::1;::::0;;::::1;:19:::0;-1:-1:-1;45157:645:0:o;21543:425::-;25195:4;25219:16;;;:7;:16;;;;;;21638:13;;-1:-1:-1;;;;;25219:16:0;21669:113;;;;-1:-1:-1;;;21669:113:0;;26483:2:1;21669:113:0;;;26465:21:1;26522:2;26502:18;;;26495:30;26561:34;26541:18;;;26534:62;-1:-1:-1;;;26612:18:1;;;26605:45;26667:19;;21669:113:0;26281:411:1;21669:113:0;21795:21;21819:10;:8;:10::i;:::-;21795:34;;21880:1;21862:7;21856:21;:25;:104;;;;;;;;;;;;;;;;;21917:7;21926:18;:7;:16;:18::i;:::-;21900:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21856:104;21840:120;21543:425;-1:-1:-1;;;21543:425:0:o;54703:717::-;54761:27;54791:20;;;:10;:20;;;;;54832:22;;;;54824:77;;;;-1:-1:-1;;;54824:77:0;;27374:2:1;54824:77:0;;;27356:21:1;27413:2;27393:18;;;27386:30;27452:34;27432:18;;;27425:62;-1:-1:-1;;;27503:18:1;;;27496:40;27553:19;;54824:77:0;27172:406:1;54824:77:0;54941:10;54920:17;54928:8;54920:7;:17::i;:::-;-1:-1:-1;;;;;54920:31:0;;54912:78;;;;-1:-1:-1;;;54912:78:0;;;;;;;:::i;:::-;55029:14;;;;55103:21;;;;55065:34;;-1:-1:-1;;;55065:34:0;;55093:4;55065:34;;;4182:51:1;55029:14:0;;;;-1:-1:-1;;;;;55029:14:0;;;;55065:19;;4155:18:1;;55065:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;55057:96;;;;-1:-1:-1;;;55057:96:0;;27785:2:1;55057:96:0;;;27767:21:1;27824:2;27804:18;;;27797:30;27863:27;27843:18;;;27836:55;27908:18;;55057:96:0;27583:349:1;55057:96:0;55166:30;;-1:-1:-1;;55166:30:0;;;55242:21;;;;55207:57;;-1:-1:-1;;;;;55207:22:0;;;55230:10;;55207:22;:57::i;:::-;55316:15;55285:28;;;:46;55374:21;;;;55397:14;;;;55357:55;;;17940:25:1;;;17996:2;17981:18;;17974:34;;;;18024:18;;18017:34;55357:55:0;;17928:2:1;17913:18;55357:55:0;;;;;;;;54750:670;;54703:717;:::o;39177:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18359:201::-;17977:6;;-1:-1:-1;;;;;17977:6:0;17354:10;18124:23;18116:68;;;;-1:-1:-1;;;18116:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18448:22:0;::::1;18440:73;;;::::0;-1:-1:-1;;;18440:73:0;;28139:2:1;18440:73:0::1;::::0;::::1;28121:21:1::0;28178:2;28158:18;;;28151:30;28217:34;28197:18;;;28190:62;-1:-1:-1;;;28268:18:1;;;28261:36;28314:19;;18440:73:0::1;27937:402:1::0;18440:73:0::1;18524:28;18543:8;18524:18;:28::i;:::-;18359:201:::0;:::o;35044:211::-;35188:58;;-1:-1:-1;;;;;28536:32:1;;35188:58:0;;;28518:51:1;28585:18;;;28578:34;;;35161:86:0;;35181:5;;-1:-1:-1;;;35211:23:0;28491:18:1;;35188:58:0;;;;-1:-1:-1;;35188:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;35188:58:0;-1:-1:-1;;;;;;35188:58:0;;;;;;;;;;35161:19;:86::i;20182:323::-;20309:4;-1:-1:-1;;;;;;20347:40:0;;-1:-1:-1;;;20347:40:0;;:101;;-1:-1:-1;;;;;;;20400:48:0;;-1:-1:-1;;;20400:48:0;20347:101;:150;;;-1:-1:-1;;;;;;;;;;19164:40:0;;;20461:36;19025:187;27481:171;27553:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;27553:29:0;-1:-1:-1;;;;;27553:29:0;;;;;;;;:24;;27607:23;27553:24;27607:14;:23::i;:::-;-1:-1:-1;;;;;27598:46:0;;;;;;;;;;;27481:171;;:::o;25265:395::-;25375:4;25219:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25219:16:0;25397:73;;;;-1:-1:-1;;;25397:73:0;;28825:2:1;25397:73:0;;;28807:21:1;28864:2;28844:18;;;28837:30;28903:34;28883:18;;;28876:62;-1:-1:-1;;;28954:18:1;;;28947:42;29006:19;;25397:73:0;28623:408:1;25397:73:0;25481:13;25497:23;25512:7;25497:14;:23::i;:::-;25481:39;;25550:5;-1:-1:-1;;;;;25539:16:0;:7;-1:-1:-1;;;;;25539:16:0;;:60;;;;25592:7;-1:-1:-1;;;;;25568:31:0;:20;25580:7;25568:11;:20::i;:::-;-1:-1:-1;;;;;25568:31:0;;25539:60;:112;;;-1:-1:-1;;;;;;23599:25:0;;;23570:4;23599:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;25612:39;25531:121;25265:395;-1:-1:-1;;;;25265:395:0:o;26861:612::-;27031:4;-1:-1:-1;;;;;27004:31:0;:23;27019:7;27004:14;:23::i;:::-;-1:-1:-1;;;;;27004:31:0;;26982:122;;;;-1:-1:-1;;;26982:122:0;;29238:2:1;26982:122:0;;;29220:21:1;29277:2;29257:18;;;29250:30;29316:34;29296:18;;;29289:62;-1:-1:-1;;;29367:18:1;;;29360:39;29416:19;;26982:122:0;29036:405:1;26982:122:0;-1:-1:-1;;;;;27123:16:0;;27115:65;;;;-1:-1:-1;;;27115:65:0;;29648:2:1;27115:65:0;;;29630:21:1;29687:2;29667:18;;;29660:30;29726:34;29706:18;;;29699:62;-1:-1:-1;;;29777:18:1;;;29770:34;29821:19;;27115:65:0;29446:400:1;27115:65:0;27193:39;27214:4;27220:2;27224:7;27193:20;:39::i;:::-;27297:29;27314:1;27318:7;27297:8;:29::i;:::-;-1:-1:-1;;;;;27339:15:0;;;;;;:9;:15;;;;;:20;;27358:1;;27339:15;:20;;27358:1;;27339:20;:::i;:::-;;;;-1:-1:-1;;;;;;;27370:13:0;;;;;;:9;:13;;;;;:18;;27387:1;;27370:13;:18;;27387:1;;27370:18;:::i;:::-;;;;-1:-1:-1;;27399:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;27399:21:0;-1:-1:-1;;;;;27399:21:0;;;;;;;;;27438:27;;27399:16;;27438:27;;;;;;;26861:612;;;:::o;47536:731::-;47604:7;47653:20;;;:10;:20;;;;;;;;47624:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47604:7;;47624:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47624:49:0;-1:-1:-1;;;;;47624:49:0;-1:-1:-1;;;;;47624:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47684:24;47711:9;:25;47721:9;:14;;;-1:-1:-1;;;;;47711:25:0;-1:-1:-1;;;;;47711:25:0;;;;;;;;;;;;47684:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47749:15;47767;47749:33;;47793:18;47824:9;:14;;;47814:7;:24;;;;:::i;:::-;47793:45;;47863:9;:14;;;47862:15;:54;;;;47895:8;:20;;;47882:10;:33;47862:54;47859:401;;;-1:-1:-1;47939:1:0;;47536:731;-1:-1:-1;;;;;47536:731:0:o;47859:401::-;47973:15;48004:9;:22;;;47991:10;:35;:76;;48053:9;:14;;;47991:76;;;48029:8;:22;;;47991:76;47973:94;;48096:29;48128:61;48181:7;48128:48;48162:13;;48128:29;48149:7;;48128:9;:16;;;:20;;:29;;;;:::i;:::-;:33;;:48::i;:::-;:52;;:61::i;:::-;48096:93;-1:-1:-1;48211:37:0;48096:93;48237:10;48211:25;:37::i;:::-;48204:44;47536:731;-1:-1:-1;;;;;;;;47536:731:0:o;972:181::-;1030:7;;1062:5;1066:1;1062;:5;:::i;:::-;1050:17;;1091:1;1086;:6;;1078:46;;;;-1:-1:-1;;;1078:46:0;;30316:2:1;1078:46:0;;;30298:21:1;30355:2;30335:18;;;30328:30;30394:29;30374:18;;;30367:57;30441:18;;1078:46:0;30114:351:1;1436:136:0;1494:7;1521:43;1525:1;1528;1521:43;;;;;;;;;;;;;;;;;:3;:43::i;44032:238::-;44101:12;44125:25;44153:12;44166:8;44153:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;44125:50;;;;;;;-1:-1:-1;;;;;44125:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44153:22;-1:-1:-1;44203:14:0;;;;:32;;;44234:1;44221:6;:10;;;:14;44203:32;:59;;;;;44252:6;:10;;;44239:6;:10;;;:23;44196:66;44032:238;-1:-1:-1;;;44032:238:0:o;48275:528::-;48421:18;;48475:25;;48386:4;;48421:18;48514:19;48511:162;;48556:105;48583:71;48607:1;48609:2;48613:40;48648:4;48613:34;:40::i;:::-;48583:23;:71::i;:::-;48656:4;48556:26;:105::i;:::-;48549:112;;;;;;48511:162;48690:87;48717:46;48741:1;48743:14;48758:4;48717:23;:46::i;:::-;48765:11;48690:26;:87::i;:::-;:105;;;;;48781:8;48793:2;48781:14;48690:105;48683:112;48275:528;-1:-1:-1;;;;;;48275:528:0:o;35263:248::-;35434:68;;-1:-1:-1;;;;;30728:15:1;;;35434:68:0;;;30710:34:1;30780:15;;30760:18;;;30753:43;30812:18;;;30805:34;;;35407:96:0;;35427:5;;-1:-1:-1;;;35457:27:0;30645:18:1;;35434:68:0;30470:375:1;33715:576:0;33768:27;33812:7;33808:50;;-1:-1:-1;;33836:10:0;;;;;;;;;;;;-1:-1:-1;;;33836:10:0;;;;;33715:576::o;33808:50::-;33877:2;33868:6;33909:69;33916:6;;33909:69;;33939:5;;;;:::i;:::-;;-1:-1:-1;33959:7:0;;-1:-1:-1;33964:2:0;33959:7;;:::i;:::-;;;33909:69;;;33988:17;34018:3;-1:-1:-1;;;;;34008:14:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34008:14:0;-1:-1:-1;33988:34:0;-1:-1:-1;34042:3:0;34056:198;34063:7;;34056:198;;34091:3;34093:1;34091;:3;:::i;:::-;34087:7;-1:-1:-1;34109:10:0;34139:7;34144:2;34139;:7;:::i;:::-;:12;;34149:2;34139:12;:::i;:::-;34134:17;;:2;:17;:::i;:::-;34123:29;;:2;:29;:::i;:::-;34109:44;;34168:9;34187:4;34180:12;;34168:24;;34217:2;34207:4;34212:1;34207:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;34207:12:0;;;;;;;;-1:-1:-1;34234:8:0;34240:2;34234:8;;:::i;:::-;;;34072:182;;34056:198;;;-1:-1:-1;34278:4:0;33715:576;-1:-1:-1;;;;33715:576:0:o;33079:292::-;33171:13;33197:14;33224:9;33228:5;33224:3;:9;:::i;:::-;:11;;33234:1;33224:11;:::i;:::-;-1:-1:-1;;;;;33214:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33214:22:0;;33197:39;;33251:6;33247:86;33263:9;33267:5;33263:3;:9;:::i;:::-;33260:1;:12;33247:86;;33305:4;33319:1;33311:7;33313:5;33311:1;:7;:::i;:::-;:9;;;;:::i;:::-;33299:22;;;;;;;;:::i;:::-;;;;;;;;;33292:1;33294;33292:4;;;;;;;;:::i;:::-;;;;:29;-1:-1:-1;;;;;33292:29:0;;;;;;;;-1:-1:-1;33273:3:0;;;;:::i;:::-;;;;33247:86;;33383:320;33543:26;;33453:14;;33521:6;;33539:74;;-1:-1:-1;33598:3:0;;33383:320;-1:-1:-1;;33383:320:0:o;33539:74::-;-1:-1:-1;;33681:2:0;33669:15;33663:22;;33383:320::o;34426:521::-;34481:11;34509:8;34505:49;;34534:8;;;34505:49;34566:10;;34589:330;34610:2;34606:1;:6;34589:330;;;34670:6;34675:1;34670:2;:6;:::i;:::-;34665:12;;:1;:12;:::i;:::-;34659:19;;:1;:19;:::i;:::-;34648:31;;34653:1;34648:31;:::i;:::-;34683:4;34647:40;;-1:-1:-1;34707:10:0;34703:147;;34738:5;;34703:147;34790:2;34782:5;:10;:24;;;;34804:2;34796:5;:10;34782:24;34778:72;;;34826:8;;;34778:72;34864:9;34871:2;34864:9;;:::i;:::-;;-1:-1:-1;34896:10:0;34904:2;34896:5;:10;:::i;:::-;34888:19;;;;:::i;:::-;;-1:-1:-1;34614:3:0;;;;:::i;:::-;;;;34589:330;;;;34929:10;34426:521;;;:::o;55432:207::-;55524:27;:15;:25;:27::i;:::-;55562:24;55572:3;55577:8;55562:9;:24::i;:::-;55602:29;;;33031:25:1;;;33099:14;;33092:22;33087:2;33072:18;;33065:50;55602:29:0;;33004:18:1;55602:29:0;32863:258:1;44282:393:0;44423:1;44418:4;:6;:17;;;;;44434:1;44428:4;:7;44418:17;:32;;;;;44446:4;44439;:11;44418:32;44410:76;;;;-1:-1:-1;;;44410:76:0;;33328:2:1;44410:76:0;;;33310:21:1;33367:2;33347:18;;;33340:30;33406:32;33386:18;;;33379:60;33456:18;;44410:76:0;33126:354:1;44410:76:0;44497:24;44524:9;:16;44534:5;-1:-1:-1;;;;;44524:16:0;-1:-1:-1;;;;;44524:16:0;;;;;;;;;;;;44497:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44569:8;:20;;;44561:5;:28;:62;;;;;44601:8;:22;;;44593:5;:30;44561:62;44553:114;;;;-1:-1:-1;;;44553:114:0;;33687:2:1;44553:114:0;;;33669:21:1;33726:2;33706:18;;;33699:30;33765:34;33745:18;;;33738:62;-1:-1:-1;;;33816:18:1;;;33809:38;33864:19;;44553:114:0;33485:404:1;44553:114:0;44399:276;44282:393;;;;;:::o;24776:349::-;24930:28;24940:4;24946:2;24950:7;24930:9;:28::i;:::-;24991:48;25014:4;25020:2;25024:7;25033:5;24991:22;:48::i;:::-;24969:148;;;;-1:-1:-1;;;24969:148:0;;;;;;;:::i;57072:113::-;57132:13;57165:12;57158:19;;;;;:::i;16125:711::-;16178:13;16399:10;16395:53;;-1:-1:-1;;16426:10:0;;;;;;;;;;;;-1:-1:-1;;;16426:10:0;;;;;16125:711::o;16395:53::-;16470:5;16458:9;16508:78;16515:9;;16508:78;;16541:8;;;;:::i;:::-;;-1:-1:-1;16564:10:0;;-1:-1:-1;16572:2:0;16564:10;;:::i;:::-;;;16508:78;;;16596:19;16628:6;-1:-1:-1;;;;;16618:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16618:17:0;;16596:39;;16646:151;16653:10;;16646:151;;16680:11;16690:1;16680:11;;:::i;:::-;;-1:-1:-1;16746:10:0;16754:2;16746:5;:10;:::i;:::-;16736:21;;:2;:21;:::i;:::-;16723:36;;16706:6;16713;16706:14;;;;;;;;:::i;:::-;;;;:53;-1:-1:-1;;;;;16706:53:0;;;;;;;;-1:-1:-1;16774:11:0;16783:2;16774:11;;:::i;:::-;;;16646:151;;18720:191;18813:6;;;-1:-1:-1;;;;;18830:17:0;;;-1:-1:-1;;;;;;18830:17:0;;;;;;;18863:40;;18813:6;;;18830:17;18813:6;;18863:40;;18794:16;;18863:40;18783:128;18720:191;:::o;37617:716::-;38041:23;38067:69;38095:4;38067:69;;;;;;;;;;;;;;;;;38075:5;-1:-1:-1;;;;;38067:27:0;;;:69;;;;;:::i;:::-;38151:17;;38041:95;;-1:-1:-1;38151:21:0;38147:179;;38248:10;38237:30;;;;;;;;;;;;:::i;:::-;38229:85;;;;-1:-1:-1;;;38229:85:0;;34882:2:1;38229:85:0;;;34864:21:1;34921:2;34901:18;;;34894:30;34960:34;34940:18;;;34933:62;-1:-1:-1;;;35011:18:1;;;35004:40;35061:19;;38229:85:0;34680:406:1;30483:523:0;-1:-1:-1;;;;;30633:16:0;;30624:48;;;;-1:-1:-1;;;30624:48:0;;35293:2:1;30624:48:0;;;35275:21:1;35332:2;35312:18;;;35305:30;-1:-1:-1;;;35351:18:1;;;35344:48;35409:18;;30624:48:0;35091:342:1;30624:48:0;-1:-1:-1;;;;;30747:18:0;;30743:161;;30782:12;:14;;;:12;:14;;;:::i;:::-;;;;;;30743:161;;;30826:2;-1:-1:-1;;;;;30818:10:0;:4;-1:-1:-1;;;;;30818:10:0;;30814:90;;30845:47;30878:4;30884:7;30845:32;:47::i;:::-;30926:4;-1:-1:-1;;;;;30920:10:0;:2;-1:-1:-1;;;;;30920:10:0;;30916:83;;30947:40;30975:2;30979:7;30947:27;:40::i;3273:132::-;3331:7;3358:39;3362:1;3365;3358:39;;;;;;;;;;;;;;;;;:3;:39::i;2326:471::-;2384:7;2629:6;2625:47;;-1:-1:-1;2659:1:0;2652:8;;2625:47;2684:9;2696:5;2700:1;2696;:5;:::i;:::-;2684:17;-1:-1:-1;2729:1:0;2720:5;2724:1;2684:17;2720:5;:::i;:::-;:10;2712:56;;;;-1:-1:-1;;;2712:56:0;;35640:2:1;2712:56:0;;;35622:21:1;35679:2;35659:18;;;35652:30;35718:34;35698:18;;;35691:62;-1:-1:-1;;;35769:18:1;;;35762:31;35810:19;;2712:56:0;35438:397:1;1875:192:0;1961:7;1997:12;1989:6;;;;1981:29;;;;-1:-1:-1;;;1981:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2021:9:0;2033:5;2037:1;2033;:5;:::i;:::-;2021:17;1875:192;-1:-1:-1;;;;;1875:192:0:o;32263:146::-;32376:24;;32334:13;35985:15:1;;;-1:-1:-1;;35981:53:1;32376:24:0;;;35969:66:1;32334:13:0;32367:34;;36051:12:1;;32376:24:0;;;;;;;;;;;;32367:8;:34::i;32417:183::-;32498:4;32587:1;32569:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;32559:32;;;;;;32551:1;32533:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;32523:32;;;;;;:68;32515:77;;32417:183;;;;:::o;6583:181::-;6755:1;6737:7;:14;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;6583:181:0:o;25668:107::-;25741:26;25751:2;25755:7;25741:26;;;;;;;;;;;;:9;:26::i;27660:895::-;27812:4;-1:-1:-1;;;;;27833:13:0;;10056:20;10095:8;27829:719;;27882:72;;-1:-1:-1;;;27882:72:0;;-1:-1:-1;;;;;27882:36:0;;;;;:72;;17354:10;;27933:4;;27939:7;;27948:5;;27882:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27882:72:0;;;;;;;;-1:-1:-1;;27882:72:0;;;;;;;;;;;;:::i;:::-;;;27865:628;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28141:13:0;;28137:341;;28184:60;;-1:-1:-1;;;28184:60:0;;;;;;;:::i;28137:341::-;28428:6;28422:13;28413:6;28409:2;28405:15;28398:38;27865:628;-1:-1:-1;;;;;;28018:55:0;-1:-1:-1;;;28018:55:0;;-1:-1:-1;28011:62:0;;27829:719;-1:-1:-1;28532:4:0;27660:895;;;;;;:::o;12607:195::-;12710:12;12742:52;12764:6;12772:4;12778:1;12781:12;12742:21;:52::i;31237:992::-;31510:19;31562:1;31537:22;31554:4;31537:16;:22::i;:::-;:26;;;;:::i;:::-;31575:15;31593:26;;;:17;:26;;;;;;31510:54;;-1:-1:-1;31726:28:0;;;31722:325;;-1:-1:-1;;;;;31790:18:0;;31771:16;31790:18;;;:12;:18;;;;;;;;:34;;;;;;;;;31841:30;;;;;;:44;;;31958:30;;:17;:30;;;;;:43;;;31722:325;-1:-1:-1;32143:26:0;;;;:17;:26;;;;;;;;32136:33;;;-1:-1:-1;;;;;32187:18:0;;;;;:12;:18;;;;;:34;;;;;;;32180:41;31237:992::o;31014:215::-;31096:11;31110:20;31127:2;31110:16;:20::i;:::-;-1:-1:-1;;;;;31141:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;31186:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;31014:215:0:o;3901:278::-;3987:7;4022:12;4015:5;4007:28;;;;-1:-1:-1;;;4007:28:0;;;;;;;;:::i;:::-;-1:-1:-1;4046:9:0;4058:5;4062:1;4058;:5;:::i;32608:459::-;32691:42;;;;;;;;;;;;-1:-1:-1;;;32691:42:0;;;;32779:11;;32665:13;;32691:42;:21;;32779:15;;32793:1;32779:15;:::i;:::-;32775:19;;:1;:19;:::i;:::-;-1:-1:-1;;;;;32765:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32765:30:0;;32746:49;;-1:-1:-1;;;32806:3:0;32810:1;32806:6;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;32806:12:0;;;;;;;;;-1:-1:-1;;;32829:3:0;32833:1;32829:6;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;32829:12:0;;;;;;;;;32857:6;32852:179;32873:4;:11;32869:1;:15;32852:179;;;32919:8;32950:1;32939:4;32944:1;32939:7;;;;;;;;:::i;:::-;;;;;32919:35;;-1:-1:-1;;;;;;32939:7:0;;;:12;;;:7;32933:19;;32919:35;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;32919:35:0;32906:3;32912;:1;32914;32912:3;:::i;:::-;32910:5;;:1;:5;:::i;:::-;32906:10;;;;;;;;:::i;:::-;;;;:48;-1:-1:-1;;;;;32906:48:0;;;;;;;;;32982:8;33002:4;33007:1;33002:7;;;;;;;;:::i;:::-;;;;;;32982:37;;33002:7;;;;;33012:4;32996:21;;32982:37;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;32982:37:0;32969:3;32975;:1;32977;32975:3;:::i;:::-;32973:5;;:1;:5;:::i;:::-;32969:10;;;;;;;;:::i;:::-;;;;:50;-1:-1:-1;;;;;32969:50:0;;;;;;;;-1:-1:-1;32886:3:0;;;;:::i;:::-;;;;32852:179;;25783:318;25910:18;25916:2;25920:7;25910:5;:18::i;:::-;25961:54;25992:1;25996:2;26000:7;26009:5;25961:22;:54::i;:::-;25939:154;;;;-1:-1:-1;;;25939:154:0;;;;;;;:::i;13659:530::-;13786:12;13844:5;13819:21;:30;;13811:81;;;;-1:-1:-1;;;13811:81:0;;37032:2:1;13811:81:0;;;37014:21:1;37071:2;37051:18;;;37044:30;37110:34;37090:18;;;37083:62;-1:-1:-1;;;37161:18:1;;;37154:36;37207:19;;13811:81:0;36830:402:1;13811:81:0;10056:20;;13903:60;;;;-1:-1:-1;;;13903:60:0;;37439:2:1;13903:60:0;;;37421:21:1;37478:2;37458:18;;;37451:30;37517:31;37497:18;;;37490:59;37566:18;;13903:60:0;37237:353:1;13903:60:0;14037:12;14051:23;14078:6;-1:-1:-1;;;;;14078:11:0;14098:5;14106:4;14078:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14036:75;;;;14129:52;14147:7;14156:10;14168:12;14129:17;:52::i;:::-;14122:59;13659:530;-1:-1:-1;;;;;;;13659:530:0:o;26109:379::-;-1:-1:-1;;;;;26186:16:0;;26178:61;;;;-1:-1:-1;;;26178:61:0;;38076:2:1;26178:61:0;;;38058:21:1;;;38095:18;;;38088:30;38154:34;38134:18;;;38127:62;38206:18;;26178:61:0;37874:356:1;26178:61:0;25195:4;25219:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25219:16:0;:30;26250:58;;;;-1:-1:-1;;;26250:58:0;;23176:2:1;26250:58:0;;;23158:21:1;23215:2;23195:18;;;23188:30;23254;23234:18;;;23227:58;23302:18;;26250:58:0;22974:352:1;26250:58:0;26321:45;26350:1;26354:2;26358:7;26321:20;:45::i;:::-;-1:-1:-1;;;;;26379:13:0;;;;;;:9;:13;;;;;:18;;26396:1;;26379:13;:18;;26396:1;;26379:18;:::i;:::-;;;;-1:-1:-1;;26408:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;26408:21:0;-1:-1:-1;;;;;26408:21:0;;;;;;;;26447:33;;26408:16;;;26447:33;;26408:16;;26447:33;26109:379;;:::o;15195:742::-;15310:12;15339:7;15335:595;;;-1:-1:-1;15370:10:0;15363:17;;15335:595;15484:17;;:21;15480:439;;15747:10;15741:17;15808:15;15795:10;15791:2;15787:19;15780:44;15480:439;15890:12;15883:20;;-1:-1:-1;;;15883:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:139:1;-1:-1:-1;;;;;97:31:1;;87:42;;77:70;;143:1;140;133:12;158:337;240:6;248;301:2;289:9;280:7;276:23;272:32;269:52;;;317:1;314;307:12;269:52;353:9;340:23;330:33;;413:2;402:9;398:18;385:32;426:39;459:5;426:39;:::i;:::-;484:5;474:15;;;158:337;;;;;:::o;500:127::-;561:10;556:3;552:20;549:1;542:31;592:4;589:1;582:15;616:4;613:1;606:15;632:632;697:5;-1:-1:-1;;;;;768:2:1;760:6;757:14;754:40;;;774:18;;:::i;:::-;849:2;843:9;817:2;903:15;;-1:-1:-1;;899:24:1;;;925:2;895:33;891:42;879:55;;;949:18;;;969:22;;;946:46;943:72;;;995:18;;:::i;:::-;1035:10;1031:2;1024:22;1064:6;1055:15;;1094:6;1086;1079:22;1134:3;1125:6;1120:3;1116:16;1113:25;1110:45;;;1151:1;1148;1141:12;1110:45;1201:6;1196:3;1189:4;1181:6;1177:17;1164:44;1256:1;1249:4;1240:6;1232;1228:19;1224:30;1217:41;;;;632:632;;;;;:::o;1269:222::-;1312:5;1365:3;1358:4;1350:6;1346:17;1342:27;1332:55;;1383:1;1380;1373:12;1332:55;1405:80;1481:3;1472:6;1459:20;1452:4;1444:6;1440:17;1405:80;:::i;1496:322::-;1565:6;1618:2;1606:9;1597:7;1593:23;1589:32;1586:52;;;1634:1;1631;1624:12;1586:52;1674:9;1661:23;-1:-1:-1;;;;;1699:6:1;1696:30;1693:50;;;1739:1;1736;1729:12;1693:50;1762;1804:7;1795:6;1784:9;1780:22;1762:50;:::i;2426:131::-;-1:-1:-1;;;;;;2500:32:1;;2490:43;;2480:71;;2547:1;2544;2537:12;2562:245;2620:6;2673:2;2661:9;2652:7;2648:23;2644:32;2641:52;;;2689:1;2686;2679:12;2641:52;2728:9;2715:23;2747:30;2771:5;2747:30;:::i;3100:258::-;3172:1;3182:113;3196:6;3193:1;3190:13;3182:113;;;3272:11;;;3266:18;3253:11;;;3246:39;3218:2;3211:10;3182:113;;;3313:6;3310:1;3307:13;3304:48;;;-1:-1:-1;;3348:1:1;3330:16;;3323:27;3100:258::o;3363:::-;3405:3;3443:5;3437:12;3470:6;3465:3;3458:19;3486:63;3542:6;3535:4;3530:3;3526:14;3519:4;3512:5;3508:16;3486:63;:::i;:::-;3603:2;3582:15;-1:-1:-1;;3578:29:1;3569:39;;;;3610:4;3565:50;;3363:258;-1:-1:-1;;3363:258:1:o;3626:220::-;3775:2;3764:9;3757:21;3738:4;3795:45;3836:2;3825:9;3821:18;3813:6;3795:45;:::i;3851:180::-;3910:6;3963:2;3951:9;3942:7;3938:23;3934:32;3931:52;;;3979:1;3976;3969:12;3931:52;-1:-1:-1;4002:23:1;;3851:180;-1:-1:-1;3851:180:1:o;4244:323::-;4312:6;4320;4373:2;4361:9;4352:7;4348:23;4344:32;4341:52;;;4389:1;4386;4379:12;4341:52;4428:9;4415:23;4447:39;4480:5;4447:39;:::i;:::-;4505:5;4557:2;4542:18;;;;4529:32;;-1:-1:-1;;;4244:323:1:o;4754:472::-;4831:6;4839;4847;4900:2;4888:9;4879:7;4875:23;4871:32;4868:52;;;4916:1;4913;4906:12;4868:52;4955:9;4942:23;4974:39;5007:5;4974:39;:::i;:::-;5032:5;-1:-1:-1;5089:2:1;5074:18;;5061:32;5102:41;5061:32;5102:41;:::i;:::-;4754:472;;5162:7;;-1:-1:-1;;;5216:2:1;5201:18;;;;5188:32;;4754:472::o;5231:255::-;5290:6;5343:2;5331:9;5322:7;5318:23;5314:32;5311:52;;;5359:1;5356;5349:12;5311:52;5398:9;5385:23;5417:39;5450:5;5417:39;:::i;5491:1534::-;5602:12;;2882:13;2875:21;2863:34;;5543:3;5571:6;5666:4;5659:5;5655:16;5649:23;5681:45;5720:4;5715:3;5711:14;5697:12;2882:13;2875:21;2863:34;;2812:91;5681:45;;5774:4;5767:5;5763:16;5757:23;5812:2;5805:4;5800:3;5796:14;5789:26;5836:47;5879:2;5874:3;5870:12;5854:14;5836:47;:::i;:::-;5824:59;;;5932:4;5925:5;5921:16;5915:23;5908:4;5903:3;5899:14;5892:47;5988:4;5981:5;5977:16;5971:23;5964:4;5959:3;5955:14;5948:47;6043:4;6036:5;6032:16;6026:23;6091:3;6085:4;6081:14;6074:4;6069:3;6065:14;6058:38;6119:39;6153:4;6137:14;6119:39;:::i;:::-;6105:53;;;6206:4;6199:5;6195:16;6189:23;6221:47;6262:4;6257:3;6253:14;6237;2882:13;2875:21;2863:34;;2812:91;6221:47;;6316:4;6309:5;6305:16;6299:23;6331:50;6375:4;6370:3;6366:14;6350;-1:-1:-1;;;;;1889:31:1;1877:44;;1823:104;6331:50;-1:-1:-1;6400:6:1;6442:14;;;6436:21;6422:12;;;6415:43;6477:6;6519:14;;;6513:21;6499:12;;;6492:43;6554:6;6596:14;;;6590:21;6576:12;;;6569:43;6631:6;6673:14;;;6667:21;6653:12;;;6646:43;6708:6;6750:14;;;6744:21;6730:12;;;6723:43;6785:6;6827:14;;;6821:21;6807:12;;;6800:43;6862:6;6904:14;;;6898:21;6884:12;;;6877:43;6939:6;6981:14;;;6975:21;6961:12;;;;6954:43;;;;-1:-1:-1;7013:6:1;5491:1534::o;7030:847::-;7226:4;7255:2;7295;7284:9;7280:18;7325:2;7314:9;7307:21;7348:6;7383;7377:13;7414:6;7406;7399:22;7452:2;7441:9;7437:18;7430:25;;7514:2;7504:6;7501:1;7497:14;7486:9;7482:30;7478:39;7464:53;;7552:2;7544:6;7540:15;7573:1;7583:265;7597:6;7594:1;7591:13;7583:265;;;7690:2;7686:7;7674:9;7666:6;7662:22;7658:36;7653:3;7646:49;7718:50;7761:6;7752;7746:13;7718:50;:::i;:::-;7708:60;-1:-1:-1;7826:12:1;;;;7791:15;;;;7619:1;7612:9;7583:265;;;-1:-1:-1;7865:6:1;;7030:847;-1:-1:-1;;;;;;;7030:847:1:o;7882:907::-;8238:4;8267:3;8297:6;8286:9;8279:25;8340:6;8335:2;8324:9;8320:18;8313:34;8383:6;8378:2;8367:9;8363:18;8356:34;8426:6;8421:2;8410:9;8406:18;8399:34;8470:6;8464:3;8453:9;8449:19;8442:35;8514:6;8508:3;8497:9;8493:19;8486:35;8558:6;8552:3;8541:9;8537:19;8530:35;8602:2;8596:3;8585:9;8581:19;8574:31;8628:45;8669:2;8658:9;8654:18;8646:6;8628:45;:::i;:::-;8614:59;;8722:9;8714:6;8710:22;8704:3;8693:9;8689:19;8682:51;8750:33;8776:6;8768;8750:33;:::i;:::-;8742:41;7882:907;-1:-1:-1;;;;;;;;;;;;7882:907:1:o;8794:680::-;8900:6;8908;8916;8924;8977:3;8965:9;8956:7;8952:23;8948:33;8945:53;;;8994:1;8991;8984:12;8945:53;9030:9;9017:23;9007:33;;9091:2;9080:9;9076:18;9063:32;-1:-1:-1;;;;;9155:2:1;9147:6;9144:14;9141:34;;;9171:1;9168;9161:12;9141:34;9194:50;9236:7;9227:6;9216:9;9212:22;9194:50;:::i;:::-;9184:60;;9297:2;9286:9;9282:18;9269:32;9253:48;;9326:2;9316:8;9313:16;9310:36;;;9342:1;9339;9332:12;9310:36;;9365:52;9409:7;9398:8;9387:9;9383:24;9365:52;:::i;:::-;8794:680;;;;-1:-1:-1;9355:62:1;;9464:2;9449:18;9436:32;;-1:-1:-1;;;8794:680:1:o;9479:390::-;9557:6;9565;9618:2;9606:9;9597:7;9593:23;9589:32;9586:52;;;9634:1;9631;9624:12;9586:52;9670:9;9657:23;9647:33;;9731:2;9720:9;9716:18;9703:32;-1:-1:-1;;;;;9750:6:1;9747:30;9744:50;;;9790:1;9787;9780:12;9744:50;9813;9855:7;9846:6;9835:9;9831:22;9813:50;:::i;:::-;9803:60;;;9479:390;;;;;:::o;9874:1100::-;10025:6;10033;10041;10049;10057;10065;10073;10081;10089;10142:3;10130:9;10121:7;10117:23;10113:33;10110:53;;;10159:1;10156;10149:12;10110:53;10198:9;10185:23;10217:39;10250:5;10217:39;:::i;:::-;10275:5;-1:-1:-1;10327:2:1;10312:18;;10299:32;;-1:-1:-1;10378:2:1;10363:18;;10350:32;;-1:-1:-1;10429:2:1;10414:18;;10401:32;;-1:-1:-1;10480:3:1;10465:19;;10452:33;;-1:-1:-1;10532:3:1;10517:19;;10504:33;;-1:-1:-1;10584:3:1;10569:19;;10556:33;;-1:-1:-1;10640:3:1;10625:19;;10612:33;-1:-1:-1;;;;;10694:14:1;;;10691:34;;;10721:1;10718;10711:12;10691:34;10744:50;10786:7;10777:6;10766:9;10762:22;10744:50;:::i;:::-;10734:60;;10847:3;10836:9;10832:19;10819:33;10803:49;;10877:2;10867:8;10864:16;10861:36;;;10893:1;10890;10883:12;10861:36;;10916:52;10960:7;10949:8;10938:9;10934:24;10916:52;:::i;:::-;10906:62;;;9874:1100;;;;;;;;;;;:::o;10979:596::-;11084:6;11092;11100;11108;11116;11169:3;11157:9;11148:7;11144:23;11140:33;11137:53;;;11186:1;11183;11176:12;11137:53;11226:9;11213:23;-1:-1:-1;;;;;11251:6:1;11248:30;11245:50;;;11291:1;11288;11281:12;11245:50;11314;11356:7;11347:6;11336:9;11332:22;11314:50;:::i;:::-;11304:60;11411:2;11396:18;;11383:32;;-1:-1:-1;11462:2:1;11447:18;;11434:32;;11513:2;11498:18;;11485:32;;-1:-1:-1;11564:3:1;11549:19;11536:33;;-1:-1:-1;10979:596:1;-1:-1:-1;;;;10979:596:1:o;11580:118::-;11666:5;11659:13;11652:21;11645:5;11642:32;11632:60;;11688:1;11685;11678:12;11703:390;11768:6;11776;11829:2;11817:9;11808:7;11804:23;11800:32;11797:52;;;11845:1;11842;11835:12;11797:52;11884:9;11871:23;11903:39;11936:5;11903:39;:::i;:::-;11961:5;-1:-1:-1;12018:2:1;12003:18;;11990:32;12031:30;11990:32;12031:30;:::i;12098:264::-;12281:2;12270:9;12263:21;12244:4;12301:55;12352:2;12341:9;12337:18;12329:6;12301:55;:::i;12367:811::-;12462:6;12470;12478;12486;12539:3;12527:9;12518:7;12514:23;12510:33;12507:53;;;12556:1;12553;12546:12;12507:53;12595:9;12582:23;12614:39;12647:5;12614:39;:::i;:::-;12672:5;-1:-1:-1;12729:2:1;12714:18;;12701:32;12742:41;12701:32;12742:41;:::i;:::-;12802:7;-1:-1:-1;12856:2:1;12841:18;;12828:32;;-1:-1:-1;12911:2:1;12896:18;;12883:32;-1:-1:-1;;;;;12927:30:1;;12924:50;;;12970:1;12967;12960:12;12924:50;12993:22;;13046:4;13038:13;;13034:27;-1:-1:-1;13024:55:1;;13075:1;13072;13065:12;13024:55;13098:74;13164:7;13159:2;13146:16;13141:2;13137;13133:11;13098:74;:::i;:::-;13088:84;;;12367:811;;;;;;;:::o;13183:740::-;13297:6;13305;13313;13321;13329;13337;13390:3;13378:9;13369:7;13365:23;13361:33;13358:53;;;13407:1;13404;13397:12;13358:53;13447:9;13434:23;-1:-1:-1;;;;;13472:6:1;13469:30;13466:50;;;13512:1;13509;13502:12;13466:50;13535;13577:7;13568:6;13557:9;13553:22;13535:50;:::i;:::-;13525:60;;;13635:2;13624:9;13620:18;13607:32;13648:39;13681:5;13648:39;:::i;:::-;13183:740;;13706:5;;-1:-1:-1;;;;13758:2:1;13743:18;;13730:32;;13809:2;13794:18;;13781:32;;13860:3;13845:19;;13832:33;;-1:-1:-1;13912:3:1;13897:19;;;13884:33;;-1:-1:-1;13183:740:1:o;13928:404::-;13996:6;14004;14057:2;14045:9;14036:7;14032:23;14028:32;14025:52;;;14073:1;14070;14063:12;14025:52;14112:9;14099:23;14131:39;14164:5;14131:39;:::i;:::-;14189:5;-1:-1:-1;14246:2:1;14231:18;;14218:32;14259:41;14218:32;14259:41;:::i;14337:356::-;14539:2;14521:21;;;14558:18;;;14551:30;14617:34;14612:2;14597:18;;14590:62;14684:2;14669:18;;14337:356::o;14698:184::-;14768:6;14821:2;14809:9;14800:7;14796:23;14792:32;14789:52;;;14837:1;14834;14827:12;14789:52;-1:-1:-1;14860:16:1;;14698:184;-1:-1:-1;14698:184:1:o;14887:380::-;14966:1;14962:12;;;;15009;;;15030:61;;15084:4;15076:6;15072:17;15062:27;;15030:61;15137:2;15129:6;15126:14;15106:18;15103:38;15100:161;;;15183:10;15178:3;15174:20;15171:1;15164:31;15218:4;15215:1;15208:15;15246:4;15243:1;15236:15;15100:161;;14887:380;;;:::o;16512:413::-;16714:2;16696:21;;;16753:2;16733:18;;;16726:30;16792:34;16787:2;16772:18;;16765:62;-1:-1:-1;;;16858:2:1;16843:18;;16836:47;16915:3;16900:19;;16512:413::o;17335:398::-;17537:2;17519:21;;;17576:2;17556:18;;;17549:30;17615:34;17610:2;17595:18;;17588:62;-1:-1:-1;;;17681:2:1;17666:18;;17659:32;17723:3;17708:19;;17335:398::o;18474:127::-;18535:10;18530:3;18526:20;18523:1;18516:31;18566:4;18563:1;18556:15;18590:4;18587:1;18580:15;18606:127;18667:10;18662:3;18658:20;18655:1;18648:31;18698:4;18695:1;18688:15;18722:4;18719:1;18712:15;18738:135;18777:3;-1:-1:-1;;18798:17:1;;18795:43;;;18818:18;;:::i;:::-;-1:-1:-1;18865:1:1;18854:13;;18738:135::o;19291:351::-;19493:2;19475:21;;;19532:2;19512:18;;;19505:30;19571:29;19566:2;19551:18;;19544:57;19633:2;19618:18;;19291:351::o;19647:276::-;19778:3;19816:6;19810:13;19832:53;19878:6;19873:3;19866:4;19858:6;19854:17;19832:53;:::i;:::-;19901:16;;;;;19647:276;-1:-1:-1;;19647:276:1:o;20690:397::-;20892:2;20874:21;;;20931:2;20911:18;;;20904:30;20970:34;20965:2;20950:18;;20943:62;-1:-1:-1;;;21036:2:1;21021:18;;21014:31;21077:3;21062:19;;20690:397::o;21218:973::-;21303:12;;21268:3;;21358:1;21378:18;;;;21431;;;;21458:61;;21512:4;21504:6;21500:17;21490:27;;21458:61;21538:2;21586;21578:6;21575:14;21555:18;21552:38;21549:161;;;21632:10;21627:3;21623:20;21620:1;21613:31;21667:4;21664:1;21657:15;21695:4;21692:1;21685:15;21549:161;21726:18;21753:104;;;;21871:1;21866:319;;;;21719:466;;21753:104;-1:-1:-1;;21786:24:1;;21774:37;;21831:16;;;;-1:-1:-1;21753:104:1;;21866:319;21165:1;21158:14;;;21202:4;21189:18;;21960:1;21974:165;21988:6;21985:1;21982:13;21974:165;;;22066:14;;22053:11;;;22046:35;22109:16;;;;22003:10;;21974:165;;;21978:3;;22168:6;22163:3;22159:16;22152:23;;21719:466;;;;;;;21218:973;;;;:::o;22196:392::-;22438:6;22433:3;22426:19;22475:6;22470:2;22465:3;22461:12;22454:28;22512:6;22507:2;22502:3;22498:12;22491:28;22408:3;22535:47;22578:2;22573:3;22569:12;22561:6;22535:47;:::i;22593:376::-;22769:3;22797:38;22831:3;22823:6;22797:38;:::i;:::-;22864:6;22858:13;22880:52;22925:6;22921:2;22914:4;22906:6;22902:17;22880:52;:::i;:::-;22948:15;;22593:376;-1:-1:-1;;;;22593:376:1:o;24152:291::-;24329:6;24318:9;24311:25;24372:2;24367;24356:9;24352:18;24345:30;24292:4;24392:45;24433:2;24422:9;24418:18;24410:6;24392:45;:::i;26697:470::-;26876:3;26914:6;26908:13;26930:53;26976:6;26971:3;26964:4;26956:6;26952:17;26930:53;:::i;:::-;27046:13;;27005:16;;;;27068:57;27046:13;27005:16;27102:4;27090:17;;27068:57;:::i;29851:125::-;29891:4;29919:1;29916;29913:8;29910:34;;;29924:18;;:::i;:::-;-1:-1:-1;29961:9:1;;29851:125::o;29981:128::-;30021:3;30052:1;30048:6;30045:1;30042:13;30039:39;;;30058:18;;:::i;:::-;-1:-1:-1;30094:9:1;;29981:128::o;30850:127::-;30911:10;30906:3;30902:20;30899:1;30892:31;30942:4;30939:1;30932:15;30966:4;30963:1;30956:15;30982:120;31022:1;31048;31038:35;;31053:18;;:::i;:::-;-1:-1:-1;31087:9:1;;30982:120::o;31107:168::-;31147:7;31213:1;31209;31205:6;31201:14;31198:1;31195:21;31190:1;31183:9;31176:17;31172:45;31169:71;;;31220:18;;:::i;:::-;-1:-1:-1;31260:9:1;;31107:168::o;31280:204::-;31318:3;31354:4;31351:1;31347:12;31386:4;31383:1;31379:12;31421:3;31415:4;31411:14;31406:3;31403:23;31400:49;;;31429:18;;:::i;:::-;31465:13;;31280:204;-1:-1:-1;;;31280:204:1:o;31489:422::-;31578:1;31621:5;31578:1;31635:270;31656:7;31646:8;31643:21;31635:270;;;31715:4;31711:1;31707:6;31703:17;31697:4;31694:27;31691:53;;;31724:18;;:::i;:::-;31774:7;31764:8;31760:22;31757:55;;;31794:16;;;;31757:55;31873:22;;;;31833:15;;;;31635:270;;;31639:3;31489:422;;;;;:::o;31916:806::-;31965:5;31995:8;31985:80;;-1:-1:-1;32036:1:1;32050:5;;31985:80;32084:4;32074:76;;-1:-1:-1;32121:1:1;32135:5;;32074:76;32166:4;32184:1;32179:59;;;;32252:1;32247:130;;;;32159:218;;32179:59;32209:1;32200:10;;32223:5;;;32247:130;32284:3;32274:8;32271:17;32268:43;;;32291:18;;:::i;:::-;-1:-1:-1;;32347:1:1;32333:16;;32362:5;;32159:218;;32461:2;32451:8;32448:16;32442:3;32436:4;32433:13;32429:36;32423:2;32413:8;32410:16;32405:2;32399:4;32396:12;32392:35;32389:77;32386:159;;;-1:-1:-1;32498:19:1;;;32530:5;;32386:159;32577:34;32602:8;32596:4;32577:34;:::i;:::-;32647:6;32643:1;32639:6;32635:19;32626:7;32623:32;32620:58;;;32658:18;;:::i;:::-;32696:20;;31916:806;-1:-1:-1;;;31916:806:1:o;32727:131::-;32787:5;32816:36;32843:8;32837:4;32816:36;:::i;33894:414::-;34096:2;34078:21;;;34135:2;34115:18;;;34108:30;34174:34;34169:2;34154:18;;34147:62;-1:-1:-1;;;34240:2:1;34225:18;;34218:48;34298:3;34283:19;;33894:414::o;34313:112::-;34345:1;34371;34361:35;;34376:18;;:::i;:::-;-1:-1:-1;34410:9:1;;34313:112::o;34430:245::-;34497:6;34550:2;34538:9;34529:7;34525:23;34521:32;34518:52;;;34566:1;34563;34556:12;34518:52;34598:9;34592:16;34617:28;34639:5;34617:28;:::i;36074:497::-;-1:-1:-1;;;;;36351:15:1;;;36333:34;;36403:15;;36398:2;36383:18;;36376:43;36450:2;36435:18;;36428:34;;;36498:3;36493:2;36478:18;;36471:31;;;36276:4;;36519:46;;36545:19;;36537:6;36519:46;:::i;36576:249::-;36645:6;36698:2;36686:9;36677:7;36673:23;36669:32;36666:52;;;36714:1;36711;36704:12;36666:52;36746:9;36740:16;36765:30;36789:5;36765:30;:::i

Swarm Source

ipfs://ca05c3bde03b925bc04535ed54850ae55a9794372ac46626a7998f29f6001e71
Loading...
Loading
Loading...
Loading
[ 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.