ETH Price: $2,666.07 (+2.10%)

Token

 

Overview

Max Total Supply

830

Holders

36

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xA7CFd6D948f400445A486F6ccA9d60F21293C048
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:
Dvision_1155dvi

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/token/ERC20/IERC20.sol



pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/utils/Address.sol



pragma solidity >=0.6.2 <0.8.0;

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

        uint256 size;
        // 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);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(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);
            }
        }
    }
}

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/math/SafeMath.sol



pragma solidity >=0.6.0 <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, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * 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);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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;
    }
}

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/utils/Context.sol



pragma solidity >=0.6.0 <0.8.0;

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/access/Ownable.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/introspection/IERC165.sol



pragma solidity >=0.6.0 <0.8.0;

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

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/introspection/ERC165.sol



pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/token/ERC1155/IERC1155Receiver.sol



pragma solidity >=0.6.0 <0.8.0;


/**
 * _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {

    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
        returns(bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
        returns(bytes4);
}

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/token/ERC1155/ERC1155Receiver.sol



pragma solidity >=0.6.0 <0.8.0;



/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    constructor() internal {
        _registerInterface(
            ERC1155Receiver(address(0)).onERC1155Received.selector ^
            ERC1155Receiver(address(0)).onERC1155BatchReceived.selector
        );
    }
}

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/token/ERC1155/ERC1155Holder.sol



pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/token/ERC1155/IERC1155.sol



pragma solidity >=0.6.2 <0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/token/ERC1155/IERC1155MetadataURI.sol



pragma solidity >=0.6.2 <0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/token/ERC1155/ERC1155.sol



pragma solidity >=0.6.0 <0.8.0;








/**
 *
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using SafeMath for uint256;
    using Address for address;

    // Mapping from token ID to account balances
    mapping (uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /*
     *     bytes4(keccak256('balanceOf(address,uint256)')) == 0x00fdd58e
     *     bytes4(keccak256('balanceOfBatch(address[],uint256[])')) == 0x4e1273f4
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,uint256,bytes)')) == 0xf242432a
     *     bytes4(keccak256('safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)')) == 0x2eb2c2d6
     *
     *     => 0x00fdd58e ^ 0x4e1273f4 ^ 0xa22cb465 ^
     *        0xe985e9c5 ^ 0xf242432a ^ 0x2eb2c2d6 == 0xd9b67a26
     */
    bytes4 private constant _INTERFACE_ID_ERC1155 = 0xd9b67a26;

    /*
     *     bytes4(keccak256('uri(uint256)')) == 0x0e89341c
     */
    bytes4 private constant _INTERFACE_ID_ERC1155_METADATA_URI = 0x0e89341c;

    /**
     * @dev See {_setURI}.
     */
    constructor (string memory uri_) public {
        _setURI(uri_);

        // register the supported interfaces to conform to ERC1155 via ERC165
        _registerInterface(_INTERFACE_ID_ERC1155);

        // register the supported interfaces to conform to ERC1155MetadataURI via ERC165
        _registerInterface(_INTERFACE_ID_ERC1155_METADATA_URI);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) external view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] memory accounts,
        uint256[] memory ids
    )
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
        public
        virtual
        override
    {
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][from] = _balances[id][from].sub(amount, "ERC1155: insufficient balance for transfer");
        _balances[id][to] = _balances[id][to].add(amount);

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        public
        virtual
        override
    {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            _balances[id][from] = _balances[id][from].sub(
                amount,
                "ERC1155: insufficient balance for transfer"
            );
            _balances[id][to] = _balances[id][to].add(amount);
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][account] = _balances[id][account].add(amount);
        emit TransferSingle(operator, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] = amounts[i].add(_balances[ids[i]][to]);
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(address account, uint256 id, uint256 amount) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        _balances[id][account] = _balances[id][account].sub(
            amount,
            "ERC1155: burn amount exceeds balance"
        );

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint i = 0; i < ids.length; i++) {
            _balances[ids[i]][account] = _balances[ids[i]][account].sub(
                amounts[i],
                "ERC1155: burn amount exceeds balance"
            );
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        internal
        virtual
    { }

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
        private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: Dvision_1155dvi.sol



pragma solidity >=0.6.0 <0.7.0;







contract Dvision_1155dvi is ERC1155, Ownable 
{    
    using SafeMath for uint256;
    
    constructor(address _erc20, address payable _fee_addr, string memory _uri) 
    ERC1155("DVI 1155") Ownable() public 
    {
       currencyToken = IERC20(_erc20);
       fee_addr = _fee_addr;
       _setURI(_uri);
    }
    
    uint private _currentTokenId = 0;
    uint private _currentOrderId = 0;
    uint private _currentSaleAmount = 0;
    
    mapping(uint => bool) public _itemExists;
    mapping(address => mapping(uint => Item)) public _items;
    //mapping(uint => uint256) public _itemSupply;
    mapping(uint => Order) public _itemForSale;
    

    //token
    struct Item 
    { 
        uint256 supply;
        uint256 amount;
        uint256 orderId;
    }
    
    struct Order
    {
        address seller;
        uint256 tokenId;
        uint256 price;
        uint256 currency;
        uint256 sell_amount;
        bool forSale;
    }
    
    
    event ItemSelled(uint256 _tokenId);
    event mint_event(uint256 _tokenId);
    
    address payable fee_addr;
    uint256 fee_percent = 10;
    uint256 fee_on_mint = 0;
    
    
    IERC20 currencyToken;
    
    function Set_20Token(address _new) onlyOwner public 
    {
        currencyToken = IERC20(_new);
    }
    
    function Show_20Token() onlyOwner public view returns(address)
    {
        return address(currencyToken);
    }
    
    function Set_URI (string memory _new_uri) public onlyOwner {
       _setURI(_new_uri);
    }
    
    function Mint(uint256 _amount) public payable returns(uint256)
    {
        require(_amount > 0, "ERC1155 : Amount of token to create must be bigger than 0");
        require(msg.value >= fee_on_mint, "fee is not enough");
        
        Item memory _item = Item({
            supply : _amount,
            amount : _amount,
            orderId : 0
        });
        
        uint _id = _getNextTokenId();
        _mint(msg.sender, _id, _amount, "");
        
        _incrementTokenId();
        
        _items[msg.sender][_id] = _item;
        _itemExists[_id] = true;
        
        //_itemSupply[_id] = _amount;
        
        emit mint_event(_id);
        return (_id);
    }
    
    function MintTo(address _to, uint256 _amount) public onlyOwner returns(uint256)
    {
        require(_amount > 0, "ERC1155 : Amount of token to create must be bigger than 0");
        
        Item memory _item = Item({
            supply : _amount,
            amount : _amount,
            orderId : 0
        });
        
        uint _id = _getNextTokenId();
        _mint(_to, _id, _amount, "");
        
        _incrementTokenId();
        
        _items[_to][_id] = _item;
        _itemExists[_id] = true;

        //_itemSupply[_id] = _amount;
        
        emit mint_event(_id);
        return (_id);
    }
    
    
    function _getNextTokenId() private view returns (uint256) 
    {
        return _currentTokenId.add(1);
    }
    
    function _incrementTokenId() private 
    {
        _currentTokenId++;
    }
    
    function Sell_Item(address _marketaddress, uint256 _tokenId, uint256 _price, uint256 _currency, uint256 _sell_amount) public 
    {
        require(balanceOf(msg.sender, _tokenId) >= _sell_amount);
        
        if(_items[msg.sender][_tokenId].orderId > 0)
        {
            if(_itemForSale[_items[msg.sender][_tokenId].orderId].forSale == false) //selled many times
            {
                uint _orderId = _getNextOrderId();
                _items[msg.sender][_tokenId].orderId = _orderId;
                
                _itemForSale[_orderId].seller = msg.sender;
                _itemForSale[_orderId].tokenId = _tokenId;
                _itemForSale[_orderId].sell_amount = _sell_amount;
                _itemForSale[_orderId].price = _price;
                _itemForSale[_orderId].currency = _currency;
                _itemForSale[_orderId].forSale = true;
                
                setApprovalForAll(_marketaddress, true);
                
                _currentSaleAmount++;
                _incrementOrderId();
                
                emit ItemSelled(_tokenId);
            }
            else //renewed selling data
            {
                _itemForSale[_items[msg.sender][_tokenId].orderId].seller = msg.sender;
                _itemForSale[_items[msg.sender][_tokenId].orderId].tokenId = _tokenId;
                _itemForSale[_items[msg.sender][_tokenId].orderId].sell_amount = _sell_amount;
                _itemForSale[_items[msg.sender][_tokenId].orderId].price = _price;
                _itemForSale[_items[msg.sender][_tokenId].orderId].currency = _currency;
                _itemForSale[_items[msg.sender][_tokenId].orderId].forSale = true;
                
                setApprovalForAll(_marketaddress, true);
                
                emit ItemSelled(_tokenId);
            }
        }
        else // selled first time
        {
            uint _orderId = _getNextOrderId();
            _items[msg.sender][_tokenId].orderId = _orderId;
            
            _itemForSale[_orderId].seller = msg.sender;
            _itemForSale[_orderId].tokenId = _tokenId;
            _itemForSale[_orderId].sell_amount = _sell_amount;
            _itemForSale[_orderId].price = _price;
            _itemForSale[_orderId].currency = _currency;
            _itemForSale[_orderId].forSale = true;
            
            setApprovalForAll(_marketaddress, true);
            
            _currentSaleAmount++;
            _incrementOrderId();
            
            emit ItemSelled(_tokenId);
        }        
    }
    
    //_from : seller, _to : buyer
    function Transaction_Item(address _from, address _to, uint256 _tokenId, uint256 _amount) external payable 
    { 
        address payable owner = address(uint160(_from));
        require(owner != msg.sender, "Owner can't buy their tokens.");
        require(owner != address(0), "Owner must not be zero address.");
        
        //Item storage _item = _items[_from][_tokenId];
        require(msg.value >= _itemForSale[_items[_from][_tokenId].orderId].price * _amount, "Not Enough Pays.");
        require(_itemForSale[_items[_from][_tokenId].orderId].sell_amount > 0, "Not For Sale.");
        require(_itemForSale[_items[_from][_tokenId].orderId].sell_amount >= _amount, "Not Enough Tokens.");
        require(_itemForSale[_items[_from][_tokenId].orderId].currency == 0, "This token can buy on ethereum.");
        
        //approve(_to, _order.itemId);
        owner.transfer(_itemForSale[_items[_from][_tokenId].orderId].price * _amount * (1 - fee_percent / 100));
        fee_addr.transfer(_itemForSale[_items[_from][_tokenId].orderId].price * _amount * (fee_percent / 100));
        
        safeTransferFrom(owner, _to, _tokenId, _amount, "");
        
        _itemForSale[_items[_from][_tokenId].orderId].sell_amount -= _amount;
        _items[_from][_tokenId].amount -= _amount;
        
        _items[_to][_tokenId].amount += _amount;
        
       
        if(_items[_from][_tokenId].amount == 0)
        {
            _itemForSale[_items[_from][_tokenId].orderId].forSale = false;
            
            if(_currentSaleAmount > 0)
            {
                _currentSaleAmount--;
            }
        }
    }
    
    //_from : seller, _to : buyer
    function Transaction_Item_WithToken(address _from, address _to, uint256 _tokenId, uint256 _amount, uint256 _price) external 
    {
        address owner = address(uint160(_from));
        require(owner != msg.sender, "Owner can't buy their tokens.");
        require(owner != address(0), "Owner must not be zero address.");
    
        //Item storage _item = _items[_from][_tokenId];
        require(_price >= _itemForSale[_items[_from][_tokenId].orderId].price * _amount, "Not Enough Pays.");
        require(_itemForSale[_items[_from][_tokenId].orderId].sell_amount > 0, "Not For Sale.");
        require(_itemForSale[_items[_from][_tokenId].orderId].sell_amount >= _amount, "Not Enough Tokens");
        require(_itemForSale[_items[_from][_tokenId].orderId].currency == 1, "This token can buy on DVI token.");
        
        //approve(_to, _order.itemId);
        bool result = currencyToken.transferFrom(_to, owner, _price);
        require(result, "transfer token failed");
        
        safeTransferFrom(owner, _to, _tokenId, _amount, "");
        
        _itemForSale[_items[_from][_tokenId].orderId].sell_amount -= _amount;
        _items[_from][_tokenId].amount -= _amount;
        
        _items[_to][_tokenId].amount += _amount;
        
        if(_items[_from][_tokenId].amount == 0)
        {
            _itemForSale[_items[_from][_tokenId].orderId].forSale = false;
            
            if(_currentSaleAmount > 0)
            {
                _currentSaleAmount--;
            }
        }
    }
    
    function _getNextOrderId() private view returns (uint256) 
    {
        return _currentOrderId.add(1);
    }
    
    function _incrementOrderId() private 
    {
        _currentOrderId++;
    }
    
    
    function Get_Orders(address _seller, uint _tokenId) 
    public 
    view 
    returns(uint256 _id, uint256 _price, uint256 _currency, uint256 _amount, address _owner)
    {
        Order storage _order = _itemForSale[_items[_seller][_tokenId].orderId];
        
        _id = _tokenId;
        _price = _order.price;
        _currency = _order.currency;
        _amount = _order.sell_amount;
        _owner = _order.seller;
    }
    
    function TokensOfOwner(address _owner) public view returns(uint[] memory)
    {
        uint256 _balance = 0;
        
        uint256 _maxTokenId = _currentTokenId;
        uint256 _tokenId = 0;
        
        
        for(_tokenId = 1; _tokenId < _maxTokenId + 1; _tokenId++)
        {
            if(balanceOf(_owner, _tokenId) > 0)
            {
                _balance++;
            }
        }
        
        if(_balance == 0)
        {
            return new uint256[](0);
        }
        else
        {
            uint[] memory _result = new uint[](_balance);
            uint256 _idx = 0;
            
            for(_tokenId = 1; _tokenId < _maxTokenId + 1; _tokenId++)
            {
                if(balanceOf(_owner, _tokenId) > 0)
                {
                    _result[_idx] = _tokenId;
                    _idx++;
                }
            }
            
            return _result;
        }
    }
    
    function Get_SellingItems() 
    public
    view
    returns(uint[] memory, address[] memory, uint[] memory, uint[] memory, uint[] memory)
    {
        uint[] memory _result_Id = new uint[](_currentSaleAmount);
        address[] memory _result_Addr = new address[](_currentSaleAmount);
        uint[] memory _result_Price = new uint[](_currentSaleAmount); 
        uint[] memory _result_Currency = new uint[](_currentSaleAmount);
        uint[] memory _result_SellAmount = new uint[](_currentSaleAmount);

        uint256 _maxOrderId = _currentOrderId;
        uint256 _idx = 0;
        
        uint256 _orderId = 0;
        for(_orderId = 1; _orderId < _maxOrderId + 1; _orderId++)
        {
            if(_itemForSale[_orderId].forSale == true)
            {
                _result_Id[_idx] = _orderId;
                _result_Addr[_idx] = _itemForSale[_orderId].seller;
                _result_Price[_idx] = _itemForSale[_orderId].price;
                _result_Currency[_idx] = _itemForSale[_orderId].currency;
                _result_SellAmount[_idx] = _itemForSale[_orderId].sell_amount;
                _idx++;
            }
        }   
            
        return (_result_Id, _result_Addr, _result_Price, _result_Currency, _result_SellAmount);
    }
    
    //// About Fee
    function Change_Fee_Addr(address payable _addr) onlyOwner public returns(address)
    {
        fee_addr = _addr;
        
        return(fee_addr);
    }
    
    function Show_Fee_Addr() onlyOwner public view returns(address)
    {
        return(fee_addr);
    }
    
    function Change_Fee_Percent(uint256 _percent) onlyOwner public returns(uint256)
    {
        fee_percent = _percent;
        
        return(fee_percent);
    }
    
    function Show_Fee_Percent() public view returns(uint256){
        return(fee_percent);
    }
    
    function Change_Fee_On_Mint(uint256 _new) onlyOwner public returns(uint256)
    {
        fee_on_mint = _new;
        
        return(fee_on_mint);
    }
    
    function Show_Fee_On_Mint() public view returns(uint256)
    {
        return(fee_on_mint);
    }
    
    
    
    
    function Set_Base_URI(string memory _new) onlyOwner public returns(string memory)
    {
        _setURI(_new);
        return _new;
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_erc20","type":"address"},{"internalType":"address payable","name":"_fee_addr","type":"address"},{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ItemSelled","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mint_event","type":"event"},{"inputs":[{"internalType":"address payable","name":"_addr","type":"address"}],"name":"Change_Fee_Addr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"Change_Fee_On_Mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"Change_Fee_Percent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_seller","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Get_Orders","outputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_currency","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Get_SellingItems","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"MintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketaddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_currency","type":"uint256"},{"internalType":"uint256","name":"_sell_amount","type":"uint256"}],"name":"Sell_Item","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"Set_20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_new","type":"string"}],"name":"Set_Base_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_new_uri","type":"string"}],"name":"Set_URI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Show_20Token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Show_Fee_Addr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Show_Fee_On_Mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Show_Fee_Percent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"TokensOfOwner","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"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Transaction_Item","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"Transaction_Item_WithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_itemExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_itemForSale","outputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"currency","type":"uint256"},{"internalType":"uint256","name":"sell_amount","type":"uint256"},{"internalType":"bool","name":"forSale","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_items","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"orderId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

6080604052600060055560006006556000600755600a600c556000600d553480156200002a57600080fd5b506040516200630f3803806200630f833981810160405260608110156200005057600080fd5b810190808051906020019092919080519060200190929190805160405193929190846401000000008211156200008557600080fd5b838201915060208201858111156200009c57600080fd5b8251866001820283011164010000000082111715620000ba57600080fd5b8083526020830192505050908051906020019080838360005b83811015620000f0578082015181840152602081019050620000d3565b50505050905090810190601f1680156200011e5780820380516001836020036101000a031916815260200191505b506040525050506040518060400160405280600881526020017f4456492031313535000000000000000000000000000000000000000000000000815250620001736301ffc9a760e01b6200030260201b60201c565b62000184816200040b60201b60201c565b6200019c63d9b67a2660e01b6200030260201b60201c565b620001b4630e89341c60e01b6200030260201b60201c565b506000620001c76200042760201b60201c565b905080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002f9816200040b60201b60201c565b505050620004d5565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200039f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8060039080519060200190620004239291906200042f565b5050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200047257805160ff1916838001178555620004a3565b82800160010185558215620004a3579182015b82811115620004a257825182559160200191906001019062000485565b5b509050620004b29190620004b6565b5090565b5b80821115620004d1576000816000905550600101620004b7565b5090565b615e2a80620004e56000396000f3fe6080604052600436106101e25760003560e01c80636c6030c611610102578063e985e9c511610095578063f2fde38b11610064578063f2fde38b1461134c578063f54f05a01461139d578063fca7cb97146113de578063ff6d32021461142d576101e2565b8063e985e9c5146110d0578063f10f514714611157578063f242432a146111a6578063f2e7d9e5146112c2576101e2565b806393f31109116100d157806393f3110914610f255780639c929fd614610fa2578063a22cb46514610fcd578063e3dc4f7c1461102a576101e2565b80636c6030c614610dc5578063715018a614610e5457806383003b4b14610e6b5780638da5cb5b14610ee4576101e2565b80632ccee9be1161017a5780634e1273f4116101495780634e1273f4146109bd5780634f6b8aac14610b6b5780635c3e97bf14610c335780635f857bdb14610d74576101e2565b80632ccee9be146105515780632eb2c2d6146105c057806330b98ec7146107f05780633ee628a91461097c576101e2565b80630b20c607116101b65780630b20c607146103335780630e89341c146103ab57806320cf9c991461045f578063271cc17a146104b0576101e2565b8062fdd58e146101e757806301ffc9a71461025657806305b50975146102c657806307883703146102f1575b600080fd5b3480156101f357600080fd5b506102406004803603604081101561020a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114a8565b6040518082815260200191505060405180910390f35b34801561026257600080fd5b506102ae6004803603602081101561027957600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611588565b60405180821515815260200191505060405180910390f35b3480156102d257600080fd5b506102db6115ef565b6040518082815260200191505060405180910390f35b61031d6004803603602081101561030757600080fd5b81019080803590602001909291905050506115f9565b6040518082815260200191505060405180910390f35b6103a96004803603608081101561034957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506117ff565b005b3480156103b757600080fd5b506103e4600480360360208110156103ce57600080fd5b81019080803590602001909291905050506120c6565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610424578082015181840152602081019050610409565b50505050905090810190601f1680156104515780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046b57600080fd5b506104986004803603602081101561048257600080fd5b810190808035906020019092919050505061216a565b60405180821515815260200191505060405180910390f35b3480156104bc57600080fd5b50610509600480360360408110156104d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061218a565b604051808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390f35b34801561055d57600080fd5b506105aa6004803603604081101561057457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612245565b6040518082815260200191505060405180910390f35b3480156105cc57600080fd5b506107ee600480360360a08110156105e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561064057600080fd5b82018360208201111561065257600080fd5b8035906020019184602083028401116401000000008311171561067457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156106d457600080fd5b8201836020820111156106e657600080fd5b8035906020019184602083028401116401000000008311171561070857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561076857600080fd5b82018360208201111561077a57600080fd5b8035906020019184600183028401116401000000008311171561079c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612484565b005b3480156107fc57600080fd5b5061080561290f565b60405180806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b8381101561085857808201518184015260208101905061083d565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b8381101561089a57808201518184015260208101905061087f565b50505050905001868103845289818151815260200191508051906020019060200280838360005b838110156108dc5780820151818401526020810190506108c1565b50505050905001868103835288818151815260200191508051906020019060200280838360005b8381101561091e578082015181840152602081019050610903565b50505050905001868103825287818151815260200191508051906020019060200280838360005b83811015610960578082015181840152602081019050610945565b505050509050019a505050505050505050505060405180910390f35b34801561098857600080fd5b50610991612c38565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109c957600080fd5b50610b14600480360360408110156109e057600080fd5b81019080803590602001906401000000008111156109fd57600080fd5b820183602082011115610a0f57600080fd5b80359060200191846020830284011164010000000083111715610a3157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a9157600080fd5b820183602082011115610aa357600080fd5b80359060200191846020830284011164010000000083111715610ac557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612d11565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b57578082015181840152602081019050610b3c565b505050509050019250505060405180910390f35b348015610b7757600080fd5b50610c3160048036036020811015610b8e57600080fd5b8101908080359060200190640100000000811115610bab57600080fd5b820183602082011115610bbd57600080fd5b80359060200191846001830284011164010000000083111715610bdf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612e23565b005b348015610c3f57600080fd5b50610cf960048036036020811015610c5657600080fd5b8101908080359060200190640100000000811115610c7357600080fd5b820183602082011115610c8557600080fd5b80359060200191846001830284011164010000000083111715610ca757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612ede565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d39578082015181840152602081019050610d1e565b50505050905090810190601f168015610d665780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610d8057600080fd5b50610dc360048036036020811015610d9757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fa0565b005b348015610dd157600080fd5b50610e52600480360360a0811015610de857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050613093565b005b348015610e6057600080fd5b50610e6961391a565b005b348015610e7757600080fd5b50610ee2600480360360a0811015610e8e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050613a8a565b005b348015610ef057600080fd5b50610ef9614218565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f3157600080fd5b50610f7e60048036036040811015610f4857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614242565b60405180848152602001838152602001828152602001935050505060405180910390f35b348015610fae57600080fd5b50610fb7614279565b6040518082815260200191505060405180910390f35b348015610fd957600080fd5b5061102860048036036040811015610ff057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050614283565b005b34801561103657600080fd5b506110796004803603602081101561104d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061441c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156110bc5780820151818401526020810190506110a1565b505050509050019250505060405180910390f35b3480156110dc57600080fd5b5061113f600480360360408110156110f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614567565b60405180821515815260200191505060405180910390f35b34801561116357600080fd5b506111906004803603602081101561117a57600080fd5b81019080803590602001909291905050506145fb565b6040518082815260200191505060405180910390f35b3480156111b257600080fd5b506112c0600480360360a08110156111c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561123a57600080fd5b82018360208201111561124c57600080fd5b8035906020019184600183028401116401000000008311171561126e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506146bd565b005b3480156112ce57600080fd5b506112fb600480360360208110156112e557600080fd5b8101908080359060200190929190505050614a32565b604051808773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018381526020018215158152602001965050505050505060405180910390f35b34801561135857600080fd5b5061139b6004803603602081101561136f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614a9b565b005b3480156113a957600080fd5b506113b2614c90565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156113ea57600080fd5b506114176004803603602081101561140157600080fd5b8101908080359060200190929190505050614d69565b6040518082815260200191505060405180910390f35b34801561143957600080fd5b5061147c6004803603602081101561145057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614e2b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561152f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615c26602b913960400191505060405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000600d54905090565b6000808211611653576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180615cf76039913960400191505060405180910390fd5b600d543410156116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f666565206973206e6f7420656e6f75676800000000000000000000000000000081525060200191505060405180910390fd5b6116d3615a37565b60405180606001604052808481526020018481526020016000815250905060006116fb614f47565b905061171833828660405180602001604052806000815250614f64565b611720615167565b81600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505060016008600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc5400c8078819920752282e86bfc8e0d23a003d097cbd9929b708578cc421c9c816040518082815260200191505060405180910390a18092505050919050565b60008490503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722063616e27742062757920746865697220746f6b656e732e00000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f776e6572206d757374206e6f74206265207a65726f20616464726573732e0081525060200191505060405180910390fd5b81600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015481526020019081526020016000206002015402341015611a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e6f7420456e6f75676820506179732e0000000000000000000000000000000081525060200191505060405180910390fd5b6000600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015481526020019081526020016000206004015411611b09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4e6f7420466f722053616c652e0000000000000000000000000000000000000081525060200191505060405180910390fd5b81600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600201548152602001908152602001600020600401541015611be8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f7420456e6f75676820546f6b656e732e000000000000000000000000000081525060200191505060405180910390fd5b6000600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015481526020019081526020016000206003015414611cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5468697320746f6b656e2063616e20627579206f6e20657468657265756d2e0081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc6064600c5481611ced57fe5b0460010384600a6000600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000206002015481526020019081526020016000206002015402029081150290604051600060405180830381858888f19350505050158015611d89573d6000803e3d6000fd5b50600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6064600c5481611dd257fe5b0484600a6000600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000206002015481526020019081526020016000206002015402029081150290604051600060405180830381858888f19350505050158015611e6b573d6000803e3d6000fd5b50611e8881858585604051806020016040528060008152506146bd565b81600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015481526020019081526020016000206004016000828254039250508190555081600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206001016000828254039250508190555081600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600101600082825401925050819055506000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206001015414156120bf576000600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060020154815260200190815260200160002060050160006101000a81548160ff021916908315150217905550600060075411156120be57600760008154809291906001900391905055505b5b5050505050565b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561215e5780601f106121335761010080835404028352916020019161215e565b820191906000526020600020905b81548152906001019060200180831161214157829003601f168201915b50505050509050919050565b60086020528060005260406000206000915054906101000a900460ff1681565b600080600080600080600a6000600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a815260200190815260200160002060020154815260200190815260200160002090508695508060020154945080600301549350806004015492508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150509295509295909350565b600061224f61517b565b73ffffffffffffffffffffffffffffffffffffffff1661226d614218565b73ffffffffffffffffffffffffffffffffffffffff16146122f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000821161234f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180615cf76039913960400191505060405180910390fd5b612357615a37565b604051806060016040528084815260200184815260200160008152509050600061237f614f47565b905061239c85828660405180602001604052806000815250614f64565b6123a4615167565b81600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505060016008600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc5400c8078819920752282e86bfc8e0d23a003d097cbd9929b708578cc421c9c816040518082815260200191505060405180910390a1809250505092915050565b81518351146124de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615dac6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612564576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615ca06025913960400191505060405180910390fd5b61256c61517b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806125b257506125b1856125ac61517b565b614567565b5b612607576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180615cc56032913960400191505060405180910390fd5b600061261161517b565b9050612621818787878787615183565b60005b84518110156127f257600085828151811061263b57fe5b60200260200101519050600085838151811061265357fe5b602002602001015190506126da816040518060600160405280602a8152602001615d30602a91396001600086815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461518b9092919063ffffffff16565b6001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612791816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461524590919063ffffffff16565b6001600084815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050806001019050612624565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156128a2578082015181840152602081019050612887565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156128e45780820151818401526020810190506128c9565b5050505090500194505050505060405180910390a46129078187878787876152cd565b505050505050565b60608060608060608060075467ffffffffffffffff8111801561293157600080fd5b506040519080825280602002602001820160405280156129605781602001602082028036833780820191505090505b509050606060075467ffffffffffffffff8111801561297e57600080fd5b506040519080825280602002602001820160405280156129ad5781602001602082028036833780820191505090505b509050606060075467ffffffffffffffff811180156129cb57600080fd5b506040519080825280602002602001820160405280156129fa5781602001602082028036833780820191505090505b509050606060075467ffffffffffffffff81118015612a1857600080fd5b50604051908082528060200260200182016040528015612a475781602001602082028036833780820191505090505b509050606060075467ffffffffffffffff81118015612a6557600080fd5b50604051908082528060200260200182016040528015612a945781602001602082028036833780820191505090505b50905060006006549050600080600190505b60018301811015612c1a5760011515600a600083815260200190815260200160002060050160009054906101000a900460ff1615151415612c0d5780888381518110612aee57fe5b602002602001018181525050600a600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16878381518110612b3d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a600082815260200190815260200160002060020154868381518110612b9a57fe5b602002602001018181525050600a600082815260200190815260200160002060030154858381518110612bc957fe5b602002602001018181525050600a600082815260200190815260200160002060040154848381518110612bf857fe5b60200260200101818152505081806001019250505b8080600101915050612aa6565b87878787879c509c509c509c509c5050505050505050509091929394565b6000612c4261517b565b73ffffffffffffffffffffffffffffffffffffffff16612c60614218565b73ffffffffffffffffffffffffffffffffffffffff1614612ce9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60608151835114612d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615d836029913960400191505060405180910390fd5b6060835167ffffffffffffffff81118015612d8757600080fd5b50604051908082528060200260200182016040528015612db65781602001602082028036833780820191505090505b50905060005b8451811015612e1857612df5858281518110612dd457fe5b6020026020010151858381518110612de857fe5b60200260200101516114a8565b828281518110612e0157fe5b602002602001018181525050806001019050612dbc565b508091505092915050565b612e2b61517b565b73ffffffffffffffffffffffffffffffffffffffff16612e49614218565b73ffffffffffffffffffffffffffffffffffffffff1614612ed2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612edb8161565c565b50565b6060612ee861517b565b73ffffffffffffffffffffffffffffffffffffffff16612f06614218565b73ffffffffffffffffffffffffffffffffffffffff1614612f8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612f988261565c565b819050919050565b612fa861517b565b73ffffffffffffffffffffffffffffffffffffffff16612fc6614218565b73ffffffffffffffffffffffffffffffffffffffff161461304f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008590503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561313a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722063616e27742062757920746865697220746f6b656e732e00000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f776e6572206d757374206e6f74206265207a65726f20616464726573732e0081525060200191505060405180910390fd5b82600a6000600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060020154815260200190815260200160002060020154028210156132be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e6f7420456e6f75676820506179732e0000000000000000000000000000000081525060200191505060405180910390fd5b6000600a6000600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020600201548152602001908152602001600020600401541161339d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4e6f7420466f722053616c652e0000000000000000000000000000000000000081525060200191505060405180910390fd5b82600a6000600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060020154815260200190815260200160002060040154101561347c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420456e6f75676820546f6b656e7300000000000000000000000000000081525060200191505060405180910390fd5b6001600a6000600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020600201548152602001908152602001600020600301541461355b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5468697320746f6b656e2063616e20627579206f6e2044564920746f6b656e2e81525060200191505060405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8784866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561360e57600080fd5b505af1158015613622573d6000803e3d6000fd5b505050506040513d602081101561363857600080fd5b81019080805190602001909291905050509050806136be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7472616e7366657220746f6b656e206661696c6564000000000000000000000081525060200191505060405180910390fd5b6136da82878787604051806020016040528060008152506146bd565b83600a6000600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000206002015481526020019081526020016000206004016000828254039250508190555083600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206001016000828254039250508190555083600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600101600082825401925050819055506000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600101541415613911576000600a6000600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002060020154815260200190815260200160002060050160006101000a81548160ff0219169083151502179055506000600754111561391057600760008154809291906001900391905055505b5b50505050505050565b61392261517b565b73ffffffffffffffffffffffffffffffffffffffff16613940614218565b73ffffffffffffffffffffffffffffffffffffffff16146139c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b80613a9533866114a8565b1015613aa057600080fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060020154111561405f5760001515600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060020154815260200190815260200160002060050160009054906101000a900460ff1615151415613d35576000613b89615676565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002018190555033600a600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600a60008381526020019081526020016000206001018190555081600a60008381526020019081526020016000206004018190555083600a60008381526020019081526020016000206002018190555082600a6000838152602001908152602001600020600301819055506001600a600083815260200190815260200160002060050160006101000a81548160ff021916908315150217905550613cde866001614283565b600760008154809291906001019190505550613cf8615693565b7f6deec04288283ab1fdcb2a42a76a3078113acd7f4ad23f5219e0f94319d2afff856040518082815260200191505060405180910390a15061405a565b33600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060020154815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000206002015481526020019081526020016000206001018190555080600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000206002015481526020019081526020016000206004018190555082600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000206002015481526020019081526020016000206002018190555081600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020600201548152602001908152602001600020600301819055506001600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060020154815260200190815260200160002060050160006101000a81548160ff021916908315150217905550614022856001614283565b7f6deec04288283ab1fdcb2a42a76a3078113acd7f4ad23f5219e0f94319d2afff846040518082815260200191505060405180910390a15b614211565b6000614069615676565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002018190555033600a600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600a60008381526020019081526020016000206001018190555081600a60008381526020019081526020016000206004018190555083600a60008381526020019081526020016000206002018190555082600a6000838152602001908152602001600020600301819055506001600a600083815260200190815260200160002060050160006101000a81548160ff0219169083151502179055506141be866001614283565b6007600081548092919060010191905055506141d8615693565b7f6deec04288283ab1fdcb2a42a76a3078113acd7f4ad23f5219e0f94319d2afff856040518082815260200191505060405180910390a1505b5050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6009602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b6000600c54905090565b8173ffffffffffffffffffffffffffffffffffffffff166142a261517b565b73ffffffffffffffffffffffffffffffffffffffff16141561430f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615d5a6029913960400191505060405180910390fd5b806002600061431c61517b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166143c961517b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b606060008060055490506000600190505b6001820181101561446057600061444486836114a8565b11156144535782806001019350505b808060010191505061442d565b60008314156144bb57600067ffffffffffffffff8111801561448157600080fd5b506040519080825280602002602001820160405280156144b05781602001602082028036833780820191505090505b509350505050614562565b60608367ffffffffffffffff811180156144d457600080fd5b506040519080825280602002602001820160405280156145035781602001602082028036833780820191505090505b5090506000600192505b6001840183101561455957600061452488856114a8565b111561454c578282828151811061453757fe5b60200260200101818152505080806001019150505b828060010193505061450d565b81955050505050505b919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061460561517b565b73ffffffffffffffffffffffffffffffffffffffff16614623614218565b73ffffffffffffffffffffffffffffffffffffffff16146146ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600d81905550600d549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614743576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615ca06025913960400191505060405180910390fd5b61474b61517b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061479157506147908561478b61517b565b614567565b5b6147e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615c776029913960400191505060405180910390fd5b60006147f061517b565b9050614810818787614801886156a7565b61480a886156a7565b87615183565b61488d836040518060600160405280602a8152602001615d30602a91396001600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461518b9092919063ffffffff16565b6001600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614944836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461524590919063ffffffff16565b6001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4614a2a818787878787615717565b505050505050565b600a6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16905086565b614aa361517b565b73ffffffffffffffffffffffffffffffffffffffff16614ac1614218565b73ffffffffffffffffffffffffffffffffffffffff1614614b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c516026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000614c9a61517b565b73ffffffffffffffffffffffffffffffffffffffff16614cb8614218565b73ffffffffffffffffffffffffffffffffffffffff1614614d41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000614d7361517b565b73ffffffffffffffffffffffffffffffffffffffff16614d91614218565b73ffffffffffffffffffffffffffffffffffffffff1614614e1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600c81905550600c549050919050565b6000614e3561517b565b73ffffffffffffffffffffffffffffffffffffffff16614e53614218565b73ffffffffffffffffffffffffffffffffffffffff1614614edc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000614f5f600160055461524590919063ffffffff16565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615dd46021913960400191505060405180910390fd5b6000614ff461517b565b905061501581600087615006886156a7565b61500f886156a7565b87615183565b615078836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461524590919063ffffffff16565b6001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a461516081600087878787615717565b5050505050565b600560008154809291906001019190505550565b600033905090565b505050505050565b6000838311158290615238576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156151fd5780820151818401526020810190506151e2565b50505050905090810190601f16801561522a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082840390509392505050565b6000808284019050838110156152c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6152ec8473ffffffffffffffffffffffffffffffffffffffff16615a24565b15615654578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156153a4578082015181840152602081019050615389565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156153e65780820151818401526020810190506153cb565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561542557808201518184015260208101905061540a565b50505050905090810190601f1680156154525780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561547757600080fd5b505af19250505080156154ab57506040513d602081101561549757600080fd5b810190808051906020019092919050505060015b6155b5576154b7615b13565b806154c25750615564565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561552957808201518184015260208101905061550e565b50505050905090810190601f1680156155565780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180615bca6034913960400191505060405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614615652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615bfe6028913960400191505060405180910390fd5b505b505050505050565b8060039080519060200190615672929190615a58565b5050565b600061568e600160065461524590919063ffffffff16565b905090565b600660008154809291906001019190505550565b606080600167ffffffffffffffff811180156156c257600080fd5b506040519080825280602002602001820160405280156156f15781602001602082028036833780820191505090505b509050828160008151811061570257fe5b60200260200101818152505080915050919050565b6157368473ffffffffffffffffffffffffffffffffffffffff16615a24565b15615a1c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156157ef5780820151818401526020810190506157d4565b50505050905090810190601f16801561581c5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561583f57600080fd5b505af192505050801561587357506040513d602081101561585f57600080fd5b810190808051906020019092919050505060015b61597d5761587f615b13565b8061588a575061592c565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156158f15780820151818401526020810190506158d6565b50505050905090810190601f16801561591e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180615bca6034913960400191505060405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614615a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615bfe6028913960400191505060405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b60405180606001604052806000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615a9957805160ff1916838001178555615ac7565b82800160010185558215615ac7579182015b82811115615ac6578251825591602001919060010190615aab565b5b509050615ad49190615ad8565b5090565b5b80821115615af1576000816000905550600101615ad9565b5090565b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d1015615b2357615bc6565b60046000803e615b34600051615b06565b6308c379a08114615b455750615bc6565b60405160043d036004823e80513d602482011167ffffffffffffffff82111715615b7157505050615bc6565b808201805167ffffffffffffffff811115615b90575050505050615bc6565b8060208301013d8501811115615bab57505050505050615bc6565b615bb482615af5565b60208401016040528296505050505050505b9056fe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e73455243313135353a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243313135353a207472616e7366657220746f20746865207a65726f2061646472657373455243313135353a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656445524331313535203a20416d6f756e74206f6620746f6b656e20746f20637265617465206d75737420626520626967676572207468616e2030455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e73666572455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66455243313135353a206163636f756e747320616e6420696473206c656e677468206d69736d61746368455243313135353a2069647320616e6420616d6f756e7473206c656e677468206d69736d61746368455243313135353a206d696e7420746f20746865207a65726f2061646472657373a2646970667358221220198ed9270311e14829483217875f32f81b57f905a61991f96567d09e6ea5687c64736f6c634300060c003300000000000000000000000010633216e7e8281e33c86f02bf8e565a635d9770000000000000000000000000dfb78299b80228fb402287160c3fad06de0895e80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002b68747470733a2f2f7777772e6d756c746976657273652e736f2f6d2f6170692f7365617263685f31313535000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101e25760003560e01c80636c6030c611610102578063e985e9c511610095578063f2fde38b11610064578063f2fde38b1461134c578063f54f05a01461139d578063fca7cb97146113de578063ff6d32021461142d576101e2565b8063e985e9c5146110d0578063f10f514714611157578063f242432a146111a6578063f2e7d9e5146112c2576101e2565b806393f31109116100d157806393f3110914610f255780639c929fd614610fa2578063a22cb46514610fcd578063e3dc4f7c1461102a576101e2565b80636c6030c614610dc5578063715018a614610e5457806383003b4b14610e6b5780638da5cb5b14610ee4576101e2565b80632ccee9be1161017a5780634e1273f4116101495780634e1273f4146109bd5780634f6b8aac14610b6b5780635c3e97bf14610c335780635f857bdb14610d74576101e2565b80632ccee9be146105515780632eb2c2d6146105c057806330b98ec7146107f05780633ee628a91461097c576101e2565b80630b20c607116101b65780630b20c607146103335780630e89341c146103ab57806320cf9c991461045f578063271cc17a146104b0576101e2565b8062fdd58e146101e757806301ffc9a71461025657806305b50975146102c657806307883703146102f1575b600080fd5b3480156101f357600080fd5b506102406004803603604081101561020a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114a8565b6040518082815260200191505060405180910390f35b34801561026257600080fd5b506102ae6004803603602081101561027957600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611588565b60405180821515815260200191505060405180910390f35b3480156102d257600080fd5b506102db6115ef565b6040518082815260200191505060405180910390f35b61031d6004803603602081101561030757600080fd5b81019080803590602001909291905050506115f9565b6040518082815260200191505060405180910390f35b6103a96004803603608081101561034957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506117ff565b005b3480156103b757600080fd5b506103e4600480360360208110156103ce57600080fd5b81019080803590602001909291905050506120c6565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610424578082015181840152602081019050610409565b50505050905090810190601f1680156104515780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046b57600080fd5b506104986004803603602081101561048257600080fd5b810190808035906020019092919050505061216a565b60405180821515815260200191505060405180910390f35b3480156104bc57600080fd5b50610509600480360360408110156104d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061218a565b604051808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390f35b34801561055d57600080fd5b506105aa6004803603604081101561057457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612245565b6040518082815260200191505060405180910390f35b3480156105cc57600080fd5b506107ee600480360360a08110156105e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561064057600080fd5b82018360208201111561065257600080fd5b8035906020019184602083028401116401000000008311171561067457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156106d457600080fd5b8201836020820111156106e657600080fd5b8035906020019184602083028401116401000000008311171561070857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561076857600080fd5b82018360208201111561077a57600080fd5b8035906020019184600183028401116401000000008311171561079c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612484565b005b3480156107fc57600080fd5b5061080561290f565b60405180806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b8381101561085857808201518184015260208101905061083d565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b8381101561089a57808201518184015260208101905061087f565b50505050905001868103845289818151815260200191508051906020019060200280838360005b838110156108dc5780820151818401526020810190506108c1565b50505050905001868103835288818151815260200191508051906020019060200280838360005b8381101561091e578082015181840152602081019050610903565b50505050905001868103825287818151815260200191508051906020019060200280838360005b83811015610960578082015181840152602081019050610945565b505050509050019a505050505050505050505060405180910390f35b34801561098857600080fd5b50610991612c38565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109c957600080fd5b50610b14600480360360408110156109e057600080fd5b81019080803590602001906401000000008111156109fd57600080fd5b820183602082011115610a0f57600080fd5b80359060200191846020830284011164010000000083111715610a3157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a9157600080fd5b820183602082011115610aa357600080fd5b80359060200191846020830284011164010000000083111715610ac557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612d11565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b57578082015181840152602081019050610b3c565b505050509050019250505060405180910390f35b348015610b7757600080fd5b50610c3160048036036020811015610b8e57600080fd5b8101908080359060200190640100000000811115610bab57600080fd5b820183602082011115610bbd57600080fd5b80359060200191846001830284011164010000000083111715610bdf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612e23565b005b348015610c3f57600080fd5b50610cf960048036036020811015610c5657600080fd5b8101908080359060200190640100000000811115610c7357600080fd5b820183602082011115610c8557600080fd5b80359060200191846001830284011164010000000083111715610ca757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612ede565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d39578082015181840152602081019050610d1e565b50505050905090810190601f168015610d665780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610d8057600080fd5b50610dc360048036036020811015610d9757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fa0565b005b348015610dd157600080fd5b50610e52600480360360a0811015610de857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050613093565b005b348015610e6057600080fd5b50610e6961391a565b005b348015610e7757600080fd5b50610ee2600480360360a0811015610e8e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050613a8a565b005b348015610ef057600080fd5b50610ef9614218565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f3157600080fd5b50610f7e60048036036040811015610f4857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614242565b60405180848152602001838152602001828152602001935050505060405180910390f35b348015610fae57600080fd5b50610fb7614279565b6040518082815260200191505060405180910390f35b348015610fd957600080fd5b5061102860048036036040811015610ff057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050614283565b005b34801561103657600080fd5b506110796004803603602081101561104d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061441c565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156110bc5780820151818401526020810190506110a1565b505050509050019250505060405180910390f35b3480156110dc57600080fd5b5061113f600480360360408110156110f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614567565b60405180821515815260200191505060405180910390f35b34801561116357600080fd5b506111906004803603602081101561117a57600080fd5b81019080803590602001909291905050506145fb565b6040518082815260200191505060405180910390f35b3480156111b257600080fd5b506112c0600480360360a08110156111c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561123a57600080fd5b82018360208201111561124c57600080fd5b8035906020019184600183028401116401000000008311171561126e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506146bd565b005b3480156112ce57600080fd5b506112fb600480360360208110156112e557600080fd5b8101908080359060200190929190505050614a32565b604051808773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018381526020018215158152602001965050505050505060405180910390f35b34801561135857600080fd5b5061139b6004803603602081101561136f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614a9b565b005b3480156113a957600080fd5b506113b2614c90565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156113ea57600080fd5b506114176004803603602081101561140157600080fd5b8101908080359060200190929190505050614d69565b6040518082815260200191505060405180910390f35b34801561143957600080fd5b5061147c6004803603602081101561145057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614e2b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561152f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615c26602b913960400191505060405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000600d54905090565b6000808211611653576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180615cf76039913960400191505060405180910390fd5b600d543410156116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f666565206973206e6f7420656e6f75676800000000000000000000000000000081525060200191505060405180910390fd5b6116d3615a37565b60405180606001604052808481526020018481526020016000815250905060006116fb614f47565b905061171833828660405180602001604052806000815250614f64565b611720615167565b81600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505060016008600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc5400c8078819920752282e86bfc8e0d23a003d097cbd9929b708578cc421c9c816040518082815260200191505060405180910390a18092505050919050565b60008490503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722063616e27742062757920746865697220746f6b656e732e00000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f776e6572206d757374206e6f74206265207a65726f20616464726573732e0081525060200191505060405180910390fd5b81600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015481526020019081526020016000206002015402341015611a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e6f7420456e6f75676820506179732e0000000000000000000000000000000081525060200191505060405180910390fd5b6000600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015481526020019081526020016000206004015411611b09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4e6f7420466f722053616c652e0000000000000000000000000000000000000081525060200191505060405180910390fd5b81600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600201548152602001908152602001600020600401541015611be8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f7420456e6f75676820546f6b656e732e000000000000000000000000000081525060200191505060405180910390fd5b6000600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015481526020019081526020016000206003015414611cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5468697320746f6b656e2063616e20627579206f6e20657468657265756d2e0081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc6064600c5481611ced57fe5b0460010384600a6000600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000206002015481526020019081526020016000206002015402029081150290604051600060405180830381858888f19350505050158015611d89573d6000803e3d6000fd5b50600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6064600c5481611dd257fe5b0484600a6000600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a81526020019081526020016000206002015481526020019081526020016000206002015402029081150290604051600060405180830381858888f19350505050158015611e6b573d6000803e3d6000fd5b50611e8881858585604051806020016040528060008152506146bd565b81600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015481526020019081526020016000206004016000828254039250508190555081600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206001016000828254039250508190555081600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600101600082825401925050819055506000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206001015414156120bf576000600a6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060020154815260200190815260200160002060050160006101000a81548160ff021916908315150217905550600060075411156120be57600760008154809291906001900391905055505b5b5050505050565b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561215e5780601f106121335761010080835404028352916020019161215e565b820191906000526020600020905b81548152906001019060200180831161214157829003601f168201915b50505050509050919050565b60086020528060005260406000206000915054906101000a900460ff1681565b600080600080600080600a6000600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a815260200190815260200160002060020154815260200190815260200160002090508695508060020154945080600301549350806004015492508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150509295509295909350565b600061224f61517b565b73ffffffffffffffffffffffffffffffffffffffff1661226d614218565b73ffffffffffffffffffffffffffffffffffffffff16146122f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000821161234f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180615cf76039913960400191505060405180910390fd5b612357615a37565b604051806060016040528084815260200184815260200160008152509050600061237f614f47565b905061239c85828660405180602001604052806000815250614f64565b6123a4615167565b81600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505060016008600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507fc5400c8078819920752282e86bfc8e0d23a003d097cbd9929b708578cc421c9c816040518082815260200191505060405180910390a1809250505092915050565b81518351146124de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615dac6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612564576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615ca06025913960400191505060405180910390fd5b61256c61517b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806125b257506125b1856125ac61517b565b614567565b5b612607576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180615cc56032913960400191505060405180910390fd5b600061261161517b565b9050612621818787878787615183565b60005b84518110156127f257600085828151811061263b57fe5b60200260200101519050600085838151811061265357fe5b602002602001015190506126da816040518060600160405280602a8152602001615d30602a91396001600086815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461518b9092919063ffffffff16565b6001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612791816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461524590919063ffffffff16565b6001600084815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050806001019050612624565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156128a2578082015181840152602081019050612887565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156128e45780820151818401526020810190506128c9565b5050505090500194505050505060405180910390a46129078187878787876152cd565b505050505050565b60608060608060608060075467ffffffffffffffff8111801561293157600080fd5b506040519080825280602002602001820160405280156129605781602001602082028036833780820191505090505b509050606060075467ffffffffffffffff8111801561297e57600080fd5b506040519080825280602002602001820160405280156129ad5781602001602082028036833780820191505090505b509050606060075467ffffffffffffffff811180156129cb57600080fd5b506040519080825280602002602001820160405280156129fa5781602001602082028036833780820191505090505b509050606060075467ffffffffffffffff81118015612a1857600080fd5b50604051908082528060200260200182016040528015612a475781602001602082028036833780820191505090505b509050606060075467ffffffffffffffff81118015612a6557600080fd5b50604051908082528060200260200182016040528015612a945781602001602082028036833780820191505090505b50905060006006549050600080600190505b60018301811015612c1a5760011515600a600083815260200190815260200160002060050160009054906101000a900460ff1615151415612c0d5780888381518110612aee57fe5b602002602001018181525050600a600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16878381518110612b3d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a600082815260200190815260200160002060020154868381518110612b9a57fe5b602002602001018181525050600a600082815260200190815260200160002060030154858381518110612bc957fe5b602002602001018181525050600a600082815260200190815260200160002060040154848381518110612bf857fe5b60200260200101818152505081806001019250505b8080600101915050612aa6565b87878787879c509c509c509c509c5050505050505050509091929394565b6000612c4261517b565b73ffffffffffffffffffffffffffffffffffffffff16612c60614218565b73ffffffffffffffffffffffffffffffffffffffff1614612ce9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60608151835114612d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615d836029913960400191505060405180910390fd5b6060835167ffffffffffffffff81118015612d8757600080fd5b50604051908082528060200260200182016040528015612db65781602001602082028036833780820191505090505b50905060005b8451811015612e1857612df5858281518110612dd457fe5b6020026020010151858381518110612de857fe5b60200260200101516114a8565b828281518110612e0157fe5b602002602001018181525050806001019050612dbc565b508091505092915050565b612e2b61517b565b73ffffffffffffffffffffffffffffffffffffffff16612e49614218565b73ffffffffffffffffffffffffffffffffffffffff1614612ed2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612edb8161565c565b50565b6060612ee861517b565b73ffffffffffffffffffffffffffffffffffffffff16612f06614218565b73ffffffffffffffffffffffffffffffffffffffff1614612f8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612f988261565c565b819050919050565b612fa861517b565b73ffffffffffffffffffffffffffffffffffffffff16612fc6614218565b73ffffffffffffffffffffffffffffffffffffffff161461304f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008590503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561313a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722063616e27742062757920746865697220746f6b656e732e00000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f776e6572206d757374206e6f74206265207a65726f20616464726573732e0081525060200191505060405180910390fd5b82600a6000600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060020154815260200190815260200160002060020154028210156132be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e6f7420456e6f75676820506179732e0000000000000000000000000000000081525060200191505060405180910390fd5b6000600a6000600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020600201548152602001908152602001600020600401541161339d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4e6f7420466f722053616c652e0000000000000000000000000000000000000081525060200191505060405180910390fd5b82600a6000600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060020154815260200190815260200160002060040154101561347c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4e6f7420456e6f75676820546f6b656e7300000000000000000000000000000081525060200191505060405180910390fd5b6001600a6000600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020600201548152602001908152602001600020600301541461355b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5468697320746f6b656e2063616e20627579206f6e2044564920746f6b656e2e81525060200191505060405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8784866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561360e57600080fd5b505af1158015613622573d6000803e3d6000fd5b505050506040513d602081101561363857600080fd5b81019080805190602001909291905050509050806136be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7472616e7366657220746f6b656e206661696c6564000000000000000000000081525060200191505060405180910390fd5b6136da82878787604051806020016040528060008152506146bd565b83600a6000600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008981526020019081526020016000206002015481526020019081526020016000206004016000828254039250508190555083600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206001016000828254039250508190555083600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600101600082825401925050819055506000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600101541415613911576000600a6000600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002060020154815260200190815260200160002060050160006101000a81548160ff0219169083151502179055506000600754111561391057600760008154809291906001900391905055505b5b50505050505050565b61392261517b565b73ffffffffffffffffffffffffffffffffffffffff16613940614218565b73ffffffffffffffffffffffffffffffffffffffff16146139c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b80613a9533866114a8565b1015613aa057600080fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060020154111561405f5760001515600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060020154815260200190815260200160002060050160009054906101000a900460ff1615151415613d35576000613b89615676565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002018190555033600a600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600a60008381526020019081526020016000206001018190555081600a60008381526020019081526020016000206004018190555083600a60008381526020019081526020016000206002018190555082600a6000838152602001908152602001600020600301819055506001600a600083815260200190815260200160002060050160006101000a81548160ff021916908315150217905550613cde866001614283565b600760008154809291906001019190505550613cf8615693565b7f6deec04288283ab1fdcb2a42a76a3078113acd7f4ad23f5219e0f94319d2afff856040518082815260200191505060405180910390a15061405a565b33600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060020154815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000206002015481526020019081526020016000206001018190555080600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000206002015481526020019081526020016000206004018190555082600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008881526020019081526020016000206002015481526020019081526020016000206002018190555081600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000888152602001908152602001600020600201548152602001908152602001600020600301819055506001600a6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060020154815260200190815260200160002060050160006101000a81548160ff021916908315150217905550614022856001614283565b7f6deec04288283ab1fdcb2a42a76a3078113acd7f4ad23f5219e0f94319d2afff846040518082815260200191505060405180910390a15b614211565b6000614069615676565b905080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002018190555033600a600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600a60008381526020019081526020016000206001018190555081600a60008381526020019081526020016000206004018190555083600a60008381526020019081526020016000206002018190555082600a6000838152602001908152602001600020600301819055506001600a600083815260200190815260200160002060050160006101000a81548160ff0219169083151502179055506141be866001614283565b6007600081548092919060010191905055506141d8615693565b7f6deec04288283ab1fdcb2a42a76a3078113acd7f4ad23f5219e0f94319d2afff856040518082815260200191505060405180910390a1505b5050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6009602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b6000600c54905090565b8173ffffffffffffffffffffffffffffffffffffffff166142a261517b565b73ffffffffffffffffffffffffffffffffffffffff16141561430f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615d5a6029913960400191505060405180910390fd5b806002600061431c61517b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166143c961517b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b606060008060055490506000600190505b6001820181101561446057600061444486836114a8565b11156144535782806001019350505b808060010191505061442d565b60008314156144bb57600067ffffffffffffffff8111801561448157600080fd5b506040519080825280602002602001820160405280156144b05781602001602082028036833780820191505090505b509350505050614562565b60608367ffffffffffffffff811180156144d457600080fd5b506040519080825280602002602001820160405280156145035781602001602082028036833780820191505090505b5090506000600192505b6001840183101561455957600061452488856114a8565b111561454c578282828151811061453757fe5b60200260200101818152505080806001019150505b828060010193505061450d565b81955050505050505b919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061460561517b565b73ffffffffffffffffffffffffffffffffffffffff16614623614218565b73ffffffffffffffffffffffffffffffffffffffff16146146ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600d81905550600d549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614743576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615ca06025913960400191505060405180910390fd5b61474b61517b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061479157506147908561478b61517b565b614567565b5b6147e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615c776029913960400191505060405180910390fd5b60006147f061517b565b9050614810818787614801886156a7565b61480a886156a7565b87615183565b61488d836040518060600160405280602a8152602001615d30602a91396001600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461518b9092919063ffffffff16565b6001600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614944836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461524590919063ffffffff16565b6001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4614a2a818787878787615717565b505050505050565b600a6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16905086565b614aa361517b565b73ffffffffffffffffffffffffffffffffffffffff16614ac1614218565b73ffffffffffffffffffffffffffffffffffffffff1614614b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c516026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000614c9a61517b565b73ffffffffffffffffffffffffffffffffffffffff16614cb8614218565b73ffffffffffffffffffffffffffffffffffffffff1614614d41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000614d7361517b565b73ffffffffffffffffffffffffffffffffffffffff16614d91614218565b73ffffffffffffffffffffffffffffffffffffffff1614614e1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600c81905550600c549050919050565b6000614e3561517b565b73ffffffffffffffffffffffffffffffffffffffff16614e53614218565b73ffffffffffffffffffffffffffffffffffffffff1614614edc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000614f5f600160055461524590919063ffffffff16565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180615dd46021913960400191505060405180910390fd5b6000614ff461517b565b905061501581600087615006886156a7565b61500f886156a7565b87615183565b615078836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461524590919063ffffffff16565b6001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a461516081600087878787615717565b5050505050565b600560008154809291906001019190505550565b600033905090565b505050505050565b6000838311158290615238576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156151fd5780820151818401526020810190506151e2565b50505050905090810190601f16801561522a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082840390509392505050565b6000808284019050838110156152c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6152ec8473ffffffffffffffffffffffffffffffffffffffff16615a24565b15615654578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156153a4578082015181840152602081019050615389565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156153e65780820151818401526020810190506153cb565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561542557808201518184015260208101905061540a565b50505050905090810190601f1680156154525780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561547757600080fd5b505af19250505080156154ab57506040513d602081101561549757600080fd5b810190808051906020019092919050505060015b6155b5576154b7615b13565b806154c25750615564565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561552957808201518184015260208101905061550e565b50505050905090810190601f1680156155565780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180615bca6034913960400191505060405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614615652576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615bfe6028913960400191505060405180910390fd5b505b505050505050565b8060039080519060200190615672929190615a58565b5050565b600061568e600160065461524590919063ffffffff16565b905090565b600660008154809291906001019190505550565b606080600167ffffffffffffffff811180156156c257600080fd5b506040519080825280602002602001820160405280156156f15781602001602082028036833780820191505090505b509050828160008151811061570257fe5b60200260200101818152505080915050919050565b6157368473ffffffffffffffffffffffffffffffffffffffff16615a24565b15615a1c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156157ef5780820151818401526020810190506157d4565b50505050905090810190601f16801561581c5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561583f57600080fd5b505af192505050801561587357506040513d602081101561585f57600080fd5b810190808051906020019092919050505060015b61597d5761587f615b13565b8061588a575061592c565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156158f15780820151818401526020810190506158d6565b50505050905090810190601f16801561591e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180615bca6034913960400191505060405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614615a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615bfe6028913960400191505060405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b60405180606001604052806000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615a9957805160ff1916838001178555615ac7565b82800160010185558215615ac7579182015b82811115615ac6578251825591602001919060010190615aab565b5b509050615ad49190615ad8565b5090565b5b80821115615af1576000816000905550600101615ad9565b5090565b6000601f19601f8301169050919050565b60008160e01c9050919050565b600060443d1015615b2357615bc6565b60046000803e615b34600051615b06565b6308c379a08114615b455750615bc6565b60405160043d036004823e80513d602482011167ffffffffffffffff82111715615b7157505050615bc6565b808201805167ffffffffffffffff811115615b90575050505050615bc6565b8060208301013d8501811115615bab57505050505050615bc6565b615bb482615af5565b60208401016040528296505050505050505b9056fe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e73455243313135353a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243313135353a207472616e7366657220746f20746865207a65726f2061646472657373455243313135353a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656445524331313535203a20416d6f756e74206f6620746f6b656e20746f20637265617465206d75737420626520626967676572207468616e2030455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e73666572455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66455243313135353a206163636f756e747320616e6420696473206c656e677468206d69736d61746368455243313135353a2069647320616e6420616d6f756e7473206c656e677468206d69736d61746368455243313135353a206d696e7420746f20746865207a65726f2061646472657373a2646970667358221220198ed9270311e14829483217875f32f81b57f905a61991f96567d09e6ea5687c64736f6c634300060c0033

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

00000000000000000000000010633216e7e8281e33c86f02bf8e565a635d9770000000000000000000000000dfb78299b80228fb402287160c3fad06de0895e80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002b68747470733a2f2f7777772e6d756c746976657273652e736f2f6d2f6170692f7365617263685f31313535000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _erc20 (address): 0x10633216E7E8281e33c86F02Bf8e565a635D9770
Arg [1] : _fee_addr (address): 0xDfb78299B80228FB402287160C3FaD06DE0895E8
Arg [2] : _uri (string): https://www.multiverse.so/m/api/search_1155

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000010633216e7e8281e33c86f02bf8e565a635d9770
Arg [1] : 000000000000000000000000dfb78299b80228fb402287160c3fad06de0895e8
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 000000000000000000000000000000000000000000000000000000000000002b
Arg [4] : 68747470733a2f2f7777772e6d756c746976657273652e736f2f6d2f6170692f
Arg [5] : 7365617263685f31313535000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

47450:13146:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35792:231;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23798:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;60316:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49031:713;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53311:1667;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35534:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47910:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56813:442;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49756:643;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38435:1220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58251:1292;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48797:116;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36189:549;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48925:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60446:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48680:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55025:1555;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21295:148;;;;;;;;;;;;;:::i;:::-;;50632:2632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20644:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47957:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60040:94;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36811:311;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57267:972;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37194:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;60146:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37434:924;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48071:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21598:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59746:104;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;59862:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59575:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35792:231;35878:7;35925:1;35906:21;;:7;:21;;;;35898:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35993:9;:13;36003:2;35993:13;;;;;;;;;;;:22;36007:7;35993:22;;;;;;;;;;;;;;;;35986:29;;35792:231;;;;:::o;23798:150::-;23883:4;23907:20;:33;23928:11;23907:33;;;;;;;;;;;;;;;;;;;;;;;;;;;23900:40;;23798:150;;;:::o;60316:100::-;60364:7;60396:11;;60389:19;;60316:100;:::o;49031:713::-;49085:7;49128:1;49118:7;:11;49110:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49223:11;;49210:9;:24;;49202:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49277:17;;:::i;:::-;49297:105;;;;;;;;49326:7;49297:105;;;;49357:7;49297:105;;;;49389:1;49297:105;;;49277:125;;49423:8;49434:17;:15;:17::i;:::-;49423:28;;49462:35;49468:10;49480:3;49485:7;49462:35;;;;;;;;;;;;:5;:35::i;:::-;49518:19;:17;:19::i;:::-;49584:5;49558:6;:18;49565:10;49558:18;;;;;;;;;;;;;;;:23;49577:3;49558:23;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;49619:4;49600:11;:16;49612:3;49600:16;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;49698:15;49709:3;49698:15;;;;;;;;;;;;;;;;;;49732:3;49724:12;;;;49031:713;;;:::o;53311:1667::-;53435:21;53475:5;53435:47;;53510:10;53501:19;;:5;:19;;;;53493:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53590:1;53573:19;;:5;:19;;;;53565:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53781:7;53727:12;:45;53740:6;:13;53747:5;53740:13;;;;;;;;;;;;;;;:23;53754:8;53740:23;;;;;;;;;;;:31;;;53727:45;;;;;;;;;;;:51;;;:61;53714:9;:74;;53706:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53888:1;53828:12;:45;53841:6;:13;53848:5;53841:13;;;;;;;;;;;;;;;:23;53855:8;53841:23;;;;;;;;;;;:31;;;53828:45;;;;;;;;;;;:57;;;:61;53820:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53987:7;53926:12;:45;53939:6;:13;53946:5;53939:13;;;;;;;;;;;;;;;:23;53953:8;53939:23;;;;;;;;;;;:31;;;53926:45;;;;;;;;;;;:57;;;:68;;53918:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54094:1;54036:12;:45;54049:6;:13;54056:5;54049:13;;;;;;;;;;;;;;;:23;54063:8;54049:23;;;;;;;;;;;:31;;;54036:45;;;;;;;;;;;:54;;;:59;54028:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54192:5;:14;;:103;54290:3;54276:11;;:17;;;;;;54272:1;:21;54261:7;54207:12;:45;54220:6;:13;54227:5;54220:13;;;;;;;;;;;;;;;:23;54234:8;54220:23;;;;;;;;;;;:31;;;54207:45;;;;;;;;;;;:51;;;:61;:87;54192:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54306:8;;;;;;;;;;;:17;;:102;54403:3;54389:11;;:17;;;;;;54378:7;54324:12;:45;54337:6;:13;54344:5;54337:13;;;;;;;;;;;;;;;:23;54351:8;54337:23;;;;;;;;;;;:31;;;54324:45;;;;;;;;;;;:51;;;:61;:83;54306:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54429:51;54446:5;54453:3;54458:8;54468:7;54429:51;;;;;;;;;;;;:16;:51::i;:::-;54562:7;54501:12;:45;54514:6;:13;54521:5;54514:13;;;;;;;;;;;;;;;:23;54528:8;54514:23;;;;;;;;;;;:31;;;54501:45;;;;;;;;;;;:57;;;:68;;;;;;;;;;;54614:7;54580:6;:13;54587:5;54580:13;;;;;;;;;;;;;;;:23;54594:8;54580:23;;;;;;;;;;;:30;;;:41;;;;;;;;;;;54674:7;54642:6;:11;54649:3;54642:11;;;;;;;;;;;;;;;:21;54654:8;54642:21;;;;;;;;;;;:28;;;:39;;;;;;;;;;;54748:1;54714:6;:13;54721:5;54714:13;;;;;;;;;;;;;;;:23;54728:8;54714:23;;;;;;;;;;;:30;;;:35;54711:260;;;54831:5;54775:12;:45;54788:6;:13;54795:5;54788:13;;;;;;;;;;;;;;;:23;54802:8;54788:23;;;;;;;;;;;:31;;;54775:45;;;;;;;;;;;:53;;;:61;;;;;;;;;;;;;;;;;;54889:1;54868:18;;:22;54865:95;;;54924:18;;:20;;;;;;;;;;;;;;54865:95;54711:260;53311:1667;;;;;:::o;35534:107::-;35596:13;35629:4;35622:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35534:107;;;:::o;47910:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;56813:442::-;56903:11;56916:14;56932:17;56951:15;56968:14;57000:20;57023:12;:47;57036:6;:15;57043:7;57036:15;;;;;;;;;;;;;;;:25;57052:8;57036:25;;;;;;;;;;;:33;;;57023:47;;;;;;;;;;;57000:70;;57097:8;57091:14;;57125:6;:12;;;57116:21;;57160:6;:15;;;57148:27;;57196:6;:18;;;57186:28;;57234:6;:13;;;;;;;;;;;;57225:22;;56813:442;;;;;;;;;:::o;49756:643::-;49827:7;20875:12;:10;:12::i;:::-;20864:23;;:7;:5;:7::i;:::-;:23;;;20856:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49870:1:::1;49860:7;:11;49852:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49954:17;;:::i;:::-;49974:105;;;;;;;;50003:7;49974:105;;;;50034:7;49974:105;;;;50066:1;49974:105;;::::0;49954:125:::1;;50100:8;50111:17;:15;:17::i;:::-;50100:28;;50139;50145:3;50150;50155:7;50139:28;;;;;;;;;;;::::0;:5:::1;:28::i;:::-;50188:19;:17;:19::i;:::-;50247:5;50228:6;:11;50235:3;50228:11;;;;;;;;;;;;;;;:16;50240:3;50228:16;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;50282:4;50263:11;:16;50275:3;50263:16;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;50353:15;50364:3;50353:15;;;;;;;;;;;;;;;;;;50387:3;50379:12;;;;49756:643:::0;;;;:::o;38435:1220::-;38700:7;:14;38686:3;:10;:28;38678:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38792:1;38778:16;;:2;:16;;;;38770:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38877:12;:10;:12::i;:::-;38869:20;;:4;:20;;;:60;;;;38893:36;38910:4;38916:12;:10;:12::i;:::-;38893:16;:36::i;:::-;38869:60;38847:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39020:16;39039:12;:10;:12::i;:::-;39020:31;;39064:60;39085:8;39095:4;39101:2;39105:3;39110:7;39119:4;39064:20;:60::i;:::-;39142:9;39137:358;39161:3;:10;39157:1;:14;39137:358;;;39193:10;39206:3;39210:1;39206:6;;;;;;;;;;;;;;39193:19;;39227:14;39244:7;39252:1;39244:10;;;;;;;;;;;;;;39227:27;;39293:126;39335:6;39293:126;;;;;;;;;;;;;;;;;:9;:13;39303:2;39293:13;;;;;;;;;;;:19;39307:4;39293:19;;;;;;;;;;;;;;;;:23;;:126;;;;;:::i;:::-;39271:9;:13;39281:2;39271:13;;;;;;;;;;;:19;39285:4;39271:19;;;;;;;;;;;;;;;:148;;;;39454:29;39476:6;39454:9;:13;39464:2;39454:13;;;;;;;;;;;:17;39468:2;39454:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;39434:9;:13;39444:2;39434:13;;;;;;;;;;;:17;39448:2;39434:17;;;;;;;;;;;;;;;:49;;;;39137:358;;39173:3;;;;;39137:358;;;;39542:2;39512:47;;39536:4;39512:47;;39526:8;39512:47;;;39546:3;39551:7;39512:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39572:75;39608:8;39618:4;39624:2;39628:3;39633:7;39642:4;39572:35;:75::i;:::-;38435:1220;;;;;;:::o;58251:1292::-;58315:13;58330:16;58348:13;58363;58378;58409:24;58447:18;;58436:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58409:57;;58477:29;58523:18;;58509:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58477:65;;58553:27;58594:18;;58583:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58553:60;;58625:30;58669:18;;58658:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58625:63;;58699:32;58745:18;;58734:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58699:65;;58777:19;58799:15;;58777:37;;58825:12;58862:16;58908:1;58897:12;;58893:529;58936:1;58922:11;:15;58911:8;:26;58893:529;;;59012:4;58978:38;;:12;:22;58991:8;58978:22;;;;;;;;;;;:30;;;;;;;;;;;;:38;;;58975:436;;;59069:8;59050:10;59061:4;59050:16;;;;;;;;;;;;;:27;;;;;59117:12;:22;59130:8;59117:22;;;;;;;;;;;:29;;;;;;;;;;;;59096:12;59109:4;59096:18;;;;;;;;;;;;;:50;;;;;;;;;;;59187:12;:22;59200:8;59187:22;;;;;;;;;;;:28;;;59165:13;59179:4;59165:19;;;;;;;;;;;;;:50;;;;;59259:12;:22;59272:8;59259:22;;;;;;;;;;;:31;;;59234:16;59251:4;59234:22;;;;;;;;;;;;;:56;;;;;59336:12;:22;59349:8;59336:22;;;;;;;;;;;:34;;;59309:18;59328:4;59309:24;;;;;;;;;;;;;:61;;;;;59389:6;;;;;;;58975:436;58939:10;;;;;;;58893:529;;;59457:10;59469:12;59483:13;59498:16;59516:18;59449:86;;;;;;;;;;;;;;;;;;58251:1292;;;;;:::o;48797:116::-;48851:7;20875:12;:10;:12::i;:::-;20864:23;;:7;:5;:7::i;:::-;:23;;;20856:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48891:13:::1;;;;;;;;;;;48876:29;;48797:116:::0;:::o;36189:549::-;36370:16;36431:3;:10;36412:8;:15;:29;36404:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36500:30;36547:8;:15;36533:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36500:63;;36581:9;36576:122;36600:8;:15;36596:1;:19;36576:122;;;36656:30;36666:8;36675:1;36666:11;;;;;;;;;;;;;;36679:3;36683:1;36679:6;;;;;;;;;;;;;;36656:9;:30::i;:::-;36637:13;36651:1;36637:16;;;;;;;;;;;;;:49;;;;;36617:3;;;;;36576:122;;;;36717:13;36710:20;;;36189:549;;;;:::o;48925:94::-;20875:12;:10;:12::i;:::-;20864:23;;:7;:5;:7::i;:::-;:23;;;20856:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48994:17:::1;49002:8;48994:7;:17::i;:::-;48925:94:::0;:::o;60446:141::-;60513:13;20875:12;:10;:12::i;:::-;20864:23;;:7;:5;:7::i;:::-;:23;;;20856:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60544:13:::1;60552:4;60544:7;:13::i;:::-;60575:4;60568:11;;60446:141:::0;;;:::o;48680:105::-;20875:12;:10;:12::i;:::-;20864:23;;:7;:5;:7::i;:::-;:23;;;20856:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48772:4:::1;48749:13;;:28;;;;;;;;;;;;;;;;;;48680:105:::0;:::o;55025:1555::-;55166:13;55198:5;55166:39;;55233:10;55224:19;;:5;:19;;;;55216:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55313:1;55296:19;;:5;:19;;;;55288:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55497:7;55443:12;:45;55456:6;:13;55463:5;55456:13;;;;;;;;;;;;;;;:23;55470:8;55456:23;;;;;;;;;;;:31;;;55443:45;;;;;;;;;;;:51;;;:61;55433:6;:71;;55425:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55604:1;55544:12;:45;55557:6;:13;55564:5;55557:13;;;;;;;;;;;;;;;:23;55571:8;55557:23;;;;;;;;;;;:31;;;55544:45;;;;;;;;;;;:57;;;:61;55536:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55703:7;55642:12;:45;55655:6;:13;55662:5;55655:13;;;;;;;;;;;;;;;:23;55669:8;55655:23;;;;;;;;;;;:31;;;55642:45;;;;;;;;;;;:57;;;:68;;55634:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55809:1;55751:12;:45;55764:6;:13;55771:5;55764:13;;;;;;;;;;;;;;;:23;55778:8;55764:23;;;;;;;;;;;:31;;;55751:45;;;;;;;;;;;:54;;;:59;55743:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55908:11;55922:13;;;;;;;;;;;:26;;;55949:3;55954:5;55961:6;55922:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55908:60;;55987:6;55979:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56040:51;56057:5;56064:3;56069:8;56079:7;56040:51;;;;;;;;;;;;:16;:51::i;:::-;56173:7;56112:12;:45;56125:6;:13;56132:5;56125:13;;;;;;;;;;;;;;;:23;56139:8;56125:23;;;;;;;;;;;:31;;;56112:45;;;;;;;;;;;:57;;;:68;;;;;;;;;;;56225:7;56191:6;:13;56198:5;56191:13;;;;;;;;;;;;;;;:23;56205:8;56191:23;;;;;;;;;;;:30;;;:41;;;;;;;;;;;56285:7;56253:6;:11;56260:3;56253:11;;;;;;;;;;;;;;;:21;56265:8;56253:21;;;;;;;;;;;:28;;;:39;;;;;;;;;;;56350:1;56316:6;:13;56323:5;56316:13;;;;;;;;;;;;;;;:23;56330:8;56316:23;;;;;;;;;;;:30;;;:35;56313:260;;;56433:5;56377:12;:45;56390:6;:13;56397:5;56390:13;;;;;;;;;;;;;;;:23;56404:8;56390:23;;;;;;;;;;;:31;;;56377:45;;;;;;;;;;;:53;;;:61;;;;;;;;;;;;;;;;;;56491:1;56470:18;;:22;56467:95;;;56526:18;;:20;;;;;;;;;;;;;;56467:95;56313:260;55025:1555;;;;;;;:::o;21295:148::-;20875:12;:10;:12::i;:::-;20864:23;;:7;:5;:7::i;:::-;:23;;;20856:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21402:1:::1;21365:40;;21386:6;;;;;;;;;;;21365:40;;;;;;;;;;;;21433:1;21416:6;;:19;;;;;;;;;;;;;;;;;;21295:148::o:0;50632:2632::-;50817:12;50782:31;50792:10;50804:8;50782:9;:31::i;:::-;:47;;50774:56;;;;;;50893:1;50854:6;:18;50861:10;50854:18;;;;;;;;;;;;;;;:28;50873:8;50854:28;;;;;;;;;;;:36;;;:40;50851:2398;;;50985:5;50923:67;;:12;:50;50936:6;:18;50943:10;50936:18;;;;;;;;;;;;;;;:28;50955:8;50936:28;;;;;;;;;;;:36;;;50923:50;;;;;;;;;;;:58;;;;;;;;;;;;:67;;;50920:1593;;;51044:13;51060:17;:15;:17::i;:::-;51044:33;;51135:8;51096:6;:18;51103:10;51096:18;;;;;;;;;;;;;;;:28;51115:8;51096:28;;;;;;;;;;;:36;;:47;;;;51212:10;51180:12;:22;51193:8;51180:22;;;;;;;;;;;:29;;;:42;;;;;;;;;;;;;;;;;;51274:8;51241:12;:22;51254:8;51241:22;;;;;;;;;;;:30;;:41;;;;51338:12;51301;:22;51314:8;51301:22;;;;;;;;;;;:34;;:49;;;;51400:6;51369:12;:22;51382:8;51369:22;;;;;;;;;;;:28;;:37;;;;51459:9;51425:12;:22;51438:8;51425:22;;;;;;;;;;;:31;;:43;;;;51520:4;51487:12;:22;51500:8;51487:22;;;;;;;;;;;:30;;;:37;;;;;;;;;;;;;;;;;;51561:39;51579:14;51595:4;51561:17;:39::i;:::-;51637:18;;:20;;;;;;;;;;;;;51676:19;:17;:19::i;:::-;51737:20;51748:8;51737:20;;;;;;;;;;;;;;;;;;50920:1593;;;;51907:10;51847:12;:50;51860:6;:18;51867:10;51860:18;;;;;;;;;;;;;;;:28;51879:8;51860:28;;;;;;;;;;;:36;;;51847:50;;;;;;;;;;;:57;;;:70;;;;;;;;;;;;;;;;;;51997:8;51936:12;:50;51949:6;:18;51956:10;51949:18;;;;;;;;;;;;;;;:28;51968:8;51949:28;;;;;;;;;;;:36;;;51936:50;;;;;;;;;;;:58;;:69;;;;52089:12;52024;:50;52037:6;:18;52044:10;52037:18;;;;;;;;;;;;;;;:28;52056:8;52037:28;;;;;;;;;;;:36;;;52024:50;;;;;;;;;;;:62;;:77;;;;52179:6;52120:12;:50;52133:6;:18;52140:10;52133:18;;;;;;;;;;;;;;;:28;52152:8;52133:28;;;;;;;;;;;:36;;;52120:50;;;;;;;;;;;:56;;:65;;;;52266:9;52204:12;:50;52217:6;:18;52224:10;52217:18;;;;;;;;;;;;;;;:28;52236:8;52217:28;;;;;;;;;;;:36;;;52204:50;;;;;;;;;;;:59;;:71;;;;52355:4;52294:12;:50;52307:6;:18;52314:10;52307:18;;;;;;;;;;;;;;;:28;52326:8;52307:28;;;;;;;;;;;:36;;;52294:50;;;;;;;;;;;:58;;;:65;;;;;;;;;;;;;;;;;;52396:39;52414:14;52430:4;52396:17;:39::i;:::-;52477:20;52488:8;52477:20;;;;;;;;;;;;;;;;;;50920:1593;50851:2398;;;52584:13;52600:17;:15;:17::i;:::-;52584:33;;52671:8;52632:6;:18;52639:10;52632:18;;;;;;;;;;;;;;;:28;52651:8;52632:28;;;;;;;;;;;:36;;:47;;;;52740:10;52708:12;:22;52721:8;52708:22;;;;;;;;;;;:29;;;:42;;;;;;;;;;;;;;;;;;52798:8;52765:12;:22;52778:8;52765:22;;;;;;;;;;;:30;;:41;;;;52858:12;52821;:22;52834:8;52821:22;;;;;;;;;;;:34;;:49;;;;52916:6;52885:12;:22;52898:8;52885:22;;;;;;;;;;;:28;;:37;;;;52971:9;52937:12;:22;52950:8;52937:22;;;;;;;;;;;:31;;:43;;;;53028:4;52995:12;:22;53008:8;52995:22;;;;;;;;;;;:30;;;:37;;;;;;;;;;;;;;;;;;53061:39;53079:14;53095:4;53061:17;:39::i;:::-;53129:18;;:20;;;;;;;;;;;;;53164:19;:17;:19::i;:::-;53217:20;53228:8;53217:20;;;;;;;;;;;;;;;;;;50851:2398;;50632:2632;;;;;:::o;20644:87::-;20690:7;20717:6;;;;;;;;;;;20710:13;;20644:87;:::o;47957:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60040:94::-;60088:7;60114:11;;60107:19;;60040:94;:::o;36811:311::-;36930:8;36914:24;;:12;:10;:12::i;:::-;:24;;;;36906:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37042:8;36997:18;:32;37016:12;:10;:12::i;:::-;36997:32;;;;;;;;;;;;;;;:42;37030:8;36997:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37095:8;37066:48;;37081:12;:10;:12::i;:::-;37066:48;;;37105:8;37066:48;;;;;;;;;;;;;;;;;;;;36811:311;;:::o;57267:972::-;57326:13;57357:16;57398:19;57420:15;;57398:37;;57446:16;57512:1;57501:12;;57497:187;57540:1;57526:11;:15;57515:8;:26;57497:187;;;57612:1;57582:27;57592:6;57600:8;57582:9;:27::i;:::-;:31;57579:94;;;57647:10;;;;;;;57579:94;57543:10;;;;;;;57497:187;;;57719:1;57707:8;:13;57704:528;;;57767:1;57753:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57746:23;;;;;;;57704:528;57820:21;57855:8;57844:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57820:44;;57879:12;57939:1;57928:12;;57924:254;57967:1;57953:11;:15;57942:8;:26;57924:254;;;58047:1;58017:27;58027:6;58035:8;58017:9;:27::i;:::-;:31;58014:149;;;58106:8;58090:7;58098:4;58090:13;;;;;;;;;;;;;:24;;;;;58137:6;;;;;;;58014:149;57970:10;;;;;;;57924:254;;;58213:7;58206:14;;;;;;;57267:972;;;;:::o;37194:168::-;37293:4;37317:18;:27;37336:7;37317:27;;;;;;;;;;;;;;;:37;37345:8;37317:37;;;;;;;;;;;;;;;;;;;;;;;;;37310:44;;37194:168;;;;:::o;60146:158::-;60213:7;20875:12;:10;:12::i;:::-;20864:23;;:7;:5;:7::i;:::-;:23;;;20856:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60252:4:::1;60238:11;:18;;;;60284:11;;60277:19;;60146:158:::0;;;:::o;37434:924::-;37674:1;37660:16;;:2;:16;;;;37652:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37759:12;:10;:12::i;:::-;37751:20;;:4;:20;;;:60;;;;37775:36;37792:4;37798:12;:10;:12::i;:::-;37775:16;:36::i;:::-;37751:60;37729:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37893:16;37912:12;:10;:12::i;:::-;37893:31;;37937:96;37958:8;37968:4;37974:2;37978:21;37996:2;37978:17;:21::i;:::-;38001:25;38019:6;38001:17;:25::i;:::-;38028:4;37937:20;:96::i;:::-;38068:77;38092:6;38068:77;;;;;;;;;;;;;;;;;:9;:13;38078:2;38068:13;;;;;;;;;;;:19;38082:4;38068:19;;;;;;;;;;;;;;;;:23;;:77;;;;;:::i;:::-;38046:9;:13;38056:2;38046:13;;;;;;;;;;;:19;38060:4;38046:19;;;;;;;;;;;;;;;:99;;;;38176:29;38198:6;38176:9;:13;38186:2;38176:13;;;;;;;;;;;:17;38190:2;38176:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;38156:9;:13;38166:2;38156:13;;;;;;;;;;;:17;38170:2;38156:17;;;;;;;;;;;;;;;:49;;;;38254:2;38223:46;;38248:4;38223:46;;38238:8;38223:46;;;38258:2;38262:6;38223:46;;;;;;;;;;;;;;;;;;;;;;;;38282:68;38313:8;38323:4;38329:2;38333;38337:6;38345:4;38282:30;:68::i;:::-;37434:924;;;;;;:::o;48071:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21598:244::-;20875:12;:10;:12::i;:::-;20864:23;;:7;:5;:7::i;:::-;:23;;;20856:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21707:1:::1;21687:22;;:8;:22;;;;21679:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21797:8;21768:38;;21789:6;;;;;;;;;;;21768:38;;;;;;;;;;;;21826:8;21817:6;;:17;;;;;;;;;;;;;;;;;;21598:244:::0;:::o;59746:104::-;59801:7;20875:12;:10;:12::i;:::-;20864:23;;:7;:5;:7::i;:::-;:23;;;20856:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59833:8:::1;;;;;;;;;;;59826:16;;59746:104:::0;:::o;59862:166::-;59933:7;20875:12;:10;:12::i;:::-;20864:23;;:7;:5;:7::i;:::-;:23;;;20856:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59972:8:::1;59958:11;:22;;;;60008:11;;60001:19;;59862:166:::0;;;:::o;59575:159::-;59648:7;20875:12;:10;:12::i;:::-;20864:23;;:7;:5;:7::i;:::-;:23;;;20856:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59684:5:::1;59673:8;;:16;;;;;;;;;;;;;;;;;;59717:8;;;;;;;;;;;59710:16;;59575:159:::0;;;:::o;50417:112::-;50466:7;50499:22;50519:1;50499:15;;:19;;:22;;;;:::i;:::-;50492:29;;50417:112;:::o;40988:583::-;41122:1;41103:21;;:7;:21;;;;41095:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41175:16;41194:12;:10;:12::i;:::-;41175:31;;41219:107;41240:8;41258:1;41262:7;41271:21;41289:2;41271:17;:21::i;:::-;41294:25;41312:6;41294:17;:25::i;:::-;41321:4;41219:20;:107::i;:::-;41364:34;41391:6;41364:9;:13;41374:2;41364:13;;;;;;;;;;;:22;41378:7;41364:22;;;;;;;;;;;;;;;;:26;;:34;;;;:::i;:::-;41339:9;:13;41349:2;41339:13;;;;;;;;;;;:22;41353:7;41339:22;;;;;;;;;;;;;;;:59;;;;41451:7;41414:57;;41447:1;41414:57;;41429:8;41414:57;;;41460:2;41464:6;41414:57;;;;;;;;;;;;;;;;;;;;;;;;41484:79;41515:8;41533:1;41537:7;41546:2;41550:6;41558:4;41484:30;:79::i;:::-;40988:583;;;;;:::o;50541:79::-;50595:15;;:17;;;;;;;;;;;;;50541:79::o;19132:106::-;19185:15;19220:10;19213:17;;19132:106;:::o;45332:245::-;;;;;;;:::o;16609:166::-;16695:7;16728:1;16723;:6;;16731:12;16715:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16766:1;16762;:5;16755:12;;16609:166;;;;;:::o;13782:179::-;13840:7;13860:9;13876:1;13872;:5;13860:17;;13901:1;13896;:6;;13888:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13952:1;13945:8;;;13782:179;;;;:::o;46355:799::-;46609:15;:2;:13;;;:15::i;:::-;46605:542;;;46662:2;46645:43;;;46689:8;46699:4;46705:3;46710:7;46719:4;46645:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46641:495;;;;:::i;:::-;;;;;;;;47009:6;47002:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46641:495;47058:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46641:495;46786:52;;;46774:64;;;:8;:64;;;;46770:163;;46863:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46770:163;46725:223;46605:542;46355:799;;;;;;:::o;40499:88::-;40573:6;40566:4;:13;;;;;;;;;;;;:::i;:::-;;40499:88;:::o;56592:112::-;56641:7;56674:22;56694:1;56674:15;;:19;;:22;;;;:::i;:::-;56667:29;;56592:112;:::o;56716:79::-;56770:15;;:17;;;;;;;;;;;;;56716:79::o;47162:198::-;47228:16;47257:22;47296:1;47282:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47257:41;;47320:7;47309:5;47315:1;47309:8;;;;;;;;;;;;;:18;;;;;47347:5;47340:12;;;47162:198;;;:::o;45585:762::-;45814:15;:2;:13;;;:15::i;:::-;45810:530;;;45867:2;45850:38;;;45889:8;45899:4;45905:2;45909:6;45917:4;45850:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45846:483;;;;:::i;:::-;;;;;;;;46202:6;46195:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45846:483;46251:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45846:483;45984:47;;;45972:59;;;:8;:59;;;;45968:158;;46056:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45968:158;45923:218;45810:530;45585:762;;;;;;:::o;3679:422::-;3739:4;3947:12;4058:7;4046:20;4038:28;;4092:1;4085:4;:8;4078:15;;;3679:422;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:97::-;;93:2;89:7;84:2;77:5;73:14;69:28;59:38;;53:49;;;:::o;110:106::-;;200:5;195:3;191:15;169:37;;163:53;;;:::o;224:739::-;;297:4;279:16;276:26;273:2;;;305:5;;273:2;339:1;336;333;318:23;357:34;388:1;382:8;357:34;:::i;:::-;414:10;409:3;406:19;396:2;;429:5;;;396:2;460;454:9;514:1;496:16;492:24;489:1;483:4;468:49;543:4;537:11;624:16;617:4;609:6;605:17;602:39;576:18;568:6;565:30;556:91;553:2;;;655:5;;;;;553:2;693:6;687:4;683:17;725:3;719:10;748:18;740:6;737:30;734:2;;;770:5;;;;;;;734:2;814:6;807:4;802:3;798:14;794:27;847:16;841:4;837:27;832:3;829:36;826:2;;;868:5;;;;;;;;826:2;912:29;934:6;912:29;:::i;:::-;905:4;900:3;896:14;892:50;888:2;881:62;955:3;948:10;;267:696;;;;;;;;:::o

Swarm Source

ipfs://198ed9270311e14829483217875f32f81b57f905a61991f96567d09e6ea5687c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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