ETH Price: $3,267.48 (+1.39%)

Token

NvirWorld (Nvir)
 

Overview

Max Total Supply

5 Nvir

Holders

3

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 Nvir
0x943770299dfe403f2687844870632b84965ce017
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:
AuctionMarket

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-01
*/

pragma solidity >=0.6.0 <0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

    constructor() {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    modifier onlyOwner() {
        require(
            msg.sender == _owner,
            "Ownable : Function called by unauthorized user."
        );
        _;
    }

    function owner() external view returns (address ownerAddress) {
        ownerAddress = _owner;
    }

    function transferOwnership(address newOwner)
        public
        onlyOwner
        returns (bool success)
    {
        require(newOwner != address(0), "Ownable/transferOwnership : cannot transfer ownership to zero address");
        success = _transferOwnership(newOwner);
    }

    function renounceOwnership() external onlyOwner returns (bool success) {
        success = _transferOwnership(address(0));
    }

    function _transferOwnership(address newOwner) internal returns (bool success) {
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
        success = true;
    }
}
interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    function transferFrom(address from, address to, uint256 tokenId) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
interface IERC721Metadata is IERC721 {

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

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

    /**
     * @dev  Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
interface IERC721Enumerable is IERC721 {
	
    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

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

abstract contract ERC165 is IERC165 {
	
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


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;
    }
}
library Address {
    function isContract(address account) internal view returns (bool) {

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

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    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");
    }

    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);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev  Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev  Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev  Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev  Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev  Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev  Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev  Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev  Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev  Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev  Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev  Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev  Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev  Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev  Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev  Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev  Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev  Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev  Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev  Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev  Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev  Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev  Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}
library Strings {
    /**
     * @dev  Converts a `uint256` to its ASCII `string` representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

abstract contract ERC721Pausable is  Context,Ownable {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    constructor () {
        _paused = false;
    }

    function paused() public view virtual returns (bool) {
        return _paused;
    }


    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }


    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    
    function pause() onlyOwner whenNotPaused public {
        _paused = true;
        emit Paused(_msgSender());
    }

    function unpause() onlyOwner whenPaused public {
        _paused = false;
        emit Unpaused(_msgSender());
    }
	
}
abstract contract ERC721Fees is  Context,Ownable {
    event FeePaused();
	event FeeUnPaused();
	
	event CancelFeePaused();
	event CancelFeeUnPaused();
	
	event SetFee(uint feeRate);
	event SetCancelFee(uint feeRate);

    uint private _feeRate;
    uint private _cancelFeeRate;
	
    bool private _feePaused;
    bool private _cancelFeePaused;

    constructor (uint feeRate_,uint cancelFeeRate_) {
		_feeRate         = feeRate_;
		_cancelFeeRate   = cancelFeeRate_;
		
        _feePaused       = false;
        _cancelFeePaused = false;
    }
	
    function feeRate() public view virtual returns (uint) {
		if(feePaused() == true){
			return 0;
		}
		
        return _feeRate;
    }	
	
    function cancelFeeRate() public view virtual returns (uint) {
		if(cancelFeePaused() == true){
			return 0;
		}
		
        return _cancelFeeRate;
    }	
	
    function feePaused() public view virtual returns (bool) {
        return _feePaused;
    }	
	
    function cancelFeePaused() public view virtual returns (bool) {
        return _cancelFeePaused;
    }
	
    modifier whenNotFeePaused() {
        require(!feePaused(), "Pausable: paused");
        _;
    }

    modifier whenFeePaused() {
        require(feePaused(), "Pausable: not paused");
        _;
    }	
	
    modifier whenNotCancelFeePaused() {
        require(!cancelFeePaused(), "Pausable: paused");
        _;
    }

    modifier whenCancelFeePaused() {
        require(cancelFeePaused(), "Pausable: not paused");
        _;
    }
	
    function feePause() onlyOwner whenNotFeePaused public {
        _feePaused = true;
        emit FeePaused();
    }

    function feeUnPause() onlyOwner whenFeePaused public {
        _feePaused = false;
        emit FeeUnPaused();
    }	
	
    function cancelFeePause() onlyOwner whenNotCancelFeePaused public {
        _cancelFeePaused = true;
        emit CancelFeePaused();
    }

    function cancelFeeUnPause() onlyOwner whenCancelFeePaused public {
        _cancelFeePaused = false;
        emit CancelFeeUnPaused();
    }
	
		
    function setFee(uint feeRate_) onlyOwner public {
		require(feeRate_ <= 100, "Up to 100 commission");
		
        _feeRate = feeRate_;
        emit SetFee(feeRate_);
    }	
	
    function setCancelFee(uint feeRate_) onlyOwner public {
		require(feeRate_ <= 100, "Up to 100 commission");
		
        _cancelFeeRate = feeRate_;
        emit SetCancelFee(feeRate_);
    }	
}
	
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable 
,ERC721Pausable
,ERC721Fees
{
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using Strings for uint256;
	using EnumerableMap for EnumerableMap.UintToAddressMap;
	
	EnumerableMap.UintToAddressMap internal _tokenOwners;
	
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    mapping (address => EnumerableSet.UintSet) internal _holderTokens;

    mapping (uint256 => address) private _tokenApprovals;

    mapping (address => mapping (address => bool)) internal _operatorApprovals;

    mapping (uint256 => string) internal _tokenURIs;

    string internal _baseURI;
	
    string private _name;

    string private _symbol;
	
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;	
    
	constructor (string memory name_, string memory symbol_) 
	 
	ERC721Fees(100,1)
		{
        _name = name_;
        _symbol = symbol_;

        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }
	
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _tokenOwners.get(tokenId);
    }
	
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data));
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId));
        address owner = _ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || _operatorApprovals[owner][spender]);
    }

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

    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data));
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0));
        require(!_exists(tokenId));

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

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = _ownerOf(tokenId); // internal owner

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

        _approve(address(0), tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

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

    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(_ownerOf(tokenId) == from);
        require(to != address(0));

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId));
        _tokenURIs[tokenId] = _tokenURI;
    }

    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

    function _approve(address to, uint256 tokenId) internal {
        _tokenApprovals[tokenId] = to;
        emit Approval(_ownerOf(tokenId), to, tokenId); // internal owner
    }

			function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual {
			require(!paused());
		}
	    
	
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId));

        return _tokenApprovals[tokenId];
    }	
	
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0));
        return _holderTokens[owner].length();
    }
	
    function setBaseURI(string memory baseURI_) onlyOwner public virtual {
        _setBaseURI(baseURI_);
    }	
	
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }
	
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId));

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _tokenOwners.length();
    }
	

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }
	
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }
	
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _ownerOf(tokenId);
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }


    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner);

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()));

        _approve(to, tokenId);
    }

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

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

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

    /**
     * @dev  See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId));
				require(hasAuction(tokenId) == false);
		
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev  See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId));
				require(hasAuction(tokenId) == false);
				
        _safeTransfer(from, to, tokenId, _data);
    }	
	
		struct Offer {
        bool isForSale;
        address seller;
        uint minValue; 
		uint endTime;
    }

    struct Bid {
        bool hasBid;
        address bidder;
        uint value;
    }
	
	// NFT 경매 등록 목록
    mapping (uint256 => Offer) public offers;

    // NFT 입찰 목록
    mapping (uint256 => Bid) public bids;
	
	event CreateAuction(address indexed owner,uint _tokenId, uint _minValue,uint _endTime);
	event CancelAuction(uint _tokenId);
	event EndAuction(uint _tokenId,uint price);
	
	event Bidding(uint _tokenId,uint value);
	event CancelBid(uint _tokenId);
	
	//경매등록
	function _createAuction(uint256 _tokenId, uint _minValue,uint _auctionTime) internal virtual {
		require(_ownerOf(_tokenId) == msg.sender);//토큰 소유자인지 확인
		
		Offer storage offer =  offers[_tokenId];
		require(offer.isForSale != true);//현재 판매중인지 확인
		
        offers[_tokenId] = Offer(true, msg.sender, _minValue,block.timestamp + _auctionTime);
		emit CreateAuction(msg.sender, _tokenId, _minValue,block.timestamp + _auctionTime);
	}
	
	//경매취소
    function _cancelAuction(uint256 _tokenId) internal virtual {
       require(_ownerOf(_tokenId) == msg.sender);//토큰 소유자인지 체크
	   
	   Offer storage offer =  offers[_tokenId];
	   require(offer.isForSale == true);//현재 경매중인지 체크
	   
	   Bid storage bid = bids[_tokenId];
	   require(bid.hasBid != true);//입찰자가 있을경우 경매 취소 불가능

	   offers[_tokenId] = Offer(false, msg.sender, 0,0);
	   
	   emit CancelAuction(_tokenId);
    }
	
	//입찰하기
    function _bid(uint256 _tokenId) internal virtual {
		require(_ownerOf(_tokenId) != msg.sender);//토큰 보유자
		
		Offer storage offer =  offers[_tokenId];
		require(block.timestamp < offer.endTime);//경매가 종료되었을 경우
		require(msg.value >= offer.minValue);//입찰 금액이 최소 입찰액보다 작은지 체크
		
        Bid storage existing = bids[_tokenId];
		require(msg.value > existing.value);//입찰금액이 이전 입찰금액보다 적을경우 트랜잭션 취소
		
        if (existing.value > 0) {
			//이전 입찰자에게 이더리움을 돌려줌
			address payable bidder = payable(existing.bidder);
			bidder.transfer(existing.value);
        }
		
        bids[_tokenId] = Bid(true, msg.sender, msg.value);
		
		emit Bidding(_tokenId,msg.value);
    }	
	
	//입찰취소
    function _cancelBid(uint256 _tokenId) internal virtual {
		Offer storage offer =  offers[_tokenId];
		require(offer.isForSale == true);//경매가 진행중인지 체크
		require(block.timestamp < offer.endTime);//경매가 종료되었을 경우

        Bid storage bid = bids[_tokenId];
		require(bid.hasBid == true);
		require(bid.bidder == msg.sender);//입찰자가 본인인 경우
		
		
		
		address payable bidder = payable(bid.bidder);
		address payable seller = payable(offer.seller);
		
					uint cancelFee = bid.value * cancelFeeRate() / 1000;
			bidder.transfer(bid.value - cancelFee);
			seller.transfer(cancelFee);
				
		bids[_tokenId] = Bid(false, address(0), 0);
		
		emit CancelBid(_tokenId);
    }
	
	//경매종료
    function _endAuction(uint256 _tokenId) internal virtual {
        Offer storage offer =  offers[_tokenId];
		require(block.timestamp >= offer.endTime);//경매 종료 시간이 아닐경우 오류
		require(offer.isForSale == true);//경매가 이미 종료된 경우
		
		address payable seller = payable(_ownerOf(_tokenId));
		
		Bid storage bid = bids[_tokenId];
		_transfer(offer.seller, bid.bidder, _tokenId);

        
					// 수수료
			uint _commissionValue = bid.value * feeRate() / 1000;
			uint _sellerValue = bid.value - _commissionValue;
			
			seller.transfer(_sellerValue);//판매자에게 판매대금 지급
			
			address payable contractOwner = payable(_owner);
			contractOwner.transfer(_commissionValue);//발행자에게 수수료 지급
				
		emit EndAuction(_tokenId,bid.value);
		_resetAuction(_tokenId);
	}	
	
	
	function _resetAuction(uint256 _tokenId) internal virtual {
        offers[_tokenId] = Offer(false, address(0), 0,0);
        bids[_tokenId] = Bid(false, address(0), 0);
	}
	
	
	function hasAuction(uint256 _tokenId) public view virtual returns (bool){
		Offer storage offer =  offers[_tokenId];
		if(offer.isForSale != true){
			return false;
		}
		
		return true;
	}
	
}


abstract contract ERC721Burnable is ERC721
{
	
    function burn(uint256 _tokenId) external payable{
        require(_isApprovedOrOwner(_msgSender(), _tokenId) || _owner == _msgSender(), "ERC721Burnable: caller is not owner nor approved");
		
				Offer storage offer =  offers[_tokenId];
		if(offer.isForSale == true){
			
			Bid storage bid = bids[_tokenId];
			if(bid.hasBid == true){
				address payable bidder = payable(bid.bidder);
				bidder.transfer(bid.value);
			}
			
			_resetAuction(_tokenId);
		}
				
        _burn(_tokenId);
    }

}
abstract
contract Market is
 ERC721Burnable
{
    address payable public _contractOwner;

    mapping (uint => uint) public price;
    mapping (uint => bool) public listedMap;

    event Purchase(address indexed previousOwner, address indexed newOwner, uint price, uint nftID, string uri);

    event Minted(address indexed minter, uint256 price, uint nftID, string uri);

    event PriceUpdate(address indexed owner, uint oldPrice, uint newPrice, uint nftID);

    event NftListStatus(address indexed owner, uint nftID, bool isListed);
	
		
	//즉시 판매 생성
    function mint(string memory _tokenURI, address _toAddress, uint256 _price) public returns (uint) {
        uint _tokenId = totalSupply() + 1;
        price[_tokenId] = _price;
        listedMap[_tokenId] = true;

        _safeMint(_toAddress, _tokenId);
        _setTokenURI(_tokenId, _tokenURI);

        emit Minted(_toAddress, _price, _tokenId, _tokenURI);

        return _tokenId;
    }
	
    function buy(uint _id) external payable {
        _validate(_id);

        address _previousOwner = ownerOf(_id);
        address _newOwner = msg.sender;

        _trade(_id);

        emit Purchase(_previousOwner, _newOwner, price[_id], _id, tokenURI(_id));
    }

    function _validate(uint _id) internal {
        bool isItemListed = listedMap[_id];
        require(_exists(_id));
        require(isItemListed);
        require(msg.value >= price[_id]);
        require(msg.sender != ownerOf(_id));
    }

    function _trade(uint _id) internal {
        address payable contractOwner = payable(_owner);
        address payable _buyer = payable(msg.sender);
        address payable _owner = payable(ownerOf(_id));

        _transfer(_owner, _buyer, _id);
		

					uint _commissionValue = price[_id] * feeRate() / 1000;
			uint _sellerValue = price[_id] - _commissionValue;

			_owner.transfer(_sellerValue);
			contractOwner.transfer(_commissionValue);
		
        // If buyer sent more than price, we send them back their rest of funds
        if (msg.value > price[_id]) {
            _buyer.transfer(msg.value - price[_id]);
        }

        listedMap[_id] = false;
    }
	
    function updatePrice(uint _tokenId, uint _price) public returns (bool) {
				require(hasAuction(_tokenId) == false);
		        uint oldPrice = price[_tokenId];
        require(msg.sender == ownerOf(_tokenId));
        price[_tokenId] = _price;

        emit PriceUpdate(msg.sender, oldPrice, _price, _tokenId);
        return true;
    }
	
    function updateListingStatus(uint _tokenId, bool shouldBeListed) public returns (bool) {
        require(msg.sender == ownerOf(_tokenId));
		        require(hasAuction(_tokenId) == false);
		
        listedMap[_tokenId] = shouldBeListed;

        emit NftListStatus(msg.sender, _tokenId, shouldBeListed);

        return true;
    }	
	
    function updateSale(uint256 _tokenId, uint256 _price) public returns (bool) {
				require(hasAuction(_tokenId) == false);
		        uint oldPrice = price[_tokenId];
        require(msg.sender == ownerOf(_tokenId));
		
        price[_tokenId] = _price;
		emit NftListStatus(msg.sender, _tokenId, true);
		
		if (listedMap[_tokenId] != true) {
			listedMap[_tokenId] = true;
			emit PriceUpdate(msg.sender, oldPrice, _price, _tokenId);
		}
        return true;
    }
	
}


contract AuctionMarket is Market {
	
    constructor() ERC721("NvirWorld", "Nvir") {
        
    }
	
	//경매 판매 생성
    function auctionMint(string memory _tokenURI, address _toAddress,uint _minValue,uint _auctionTime) public returns (uint) {
        uint _tokenId = totalSupply() + 1;
        price[_tokenId] = _minValue;

        _safeMint(_toAddress, _tokenId);
        _setTokenURI(_tokenId, _tokenURI);

        emit Minted(_toAddress, _minValue, _tokenId, _tokenURI);
		
		_createAuction(_tokenId,_minValue,_auctionTime);
        return _tokenId;
    }
	
	//경매생성
    function createAuction(uint _tokenId, uint _minValue,uint _auctionTime)  public virtual {
		require(listedMap[_tokenId] == false); // 즉시판매 진행중
		
		_createAuction(_tokenId,_minValue,_auctionTime);
    }
	
	//경매취소
	function cancelAuction(uint _tokenId)  public virtual {
		
		_cancelAuction(_tokenId);
	}	
	
	//입찰
	function bid(uint _tokenId) external payable {
		_bid(_tokenId);
	}
	
		//입찰취소
	function cancelBid(uint _tokenId) external payable {
		
		_cancelBid(_tokenId);
	}	
		
	//경매종료
	function endAuction(uint _tokenId) external payable {
		
		_endAuction(_tokenId);
	}
	

	
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Bidding","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"CancelAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"CancelBid","type":"event"},{"anonymous":false,"inputs":[],"name":"CancelFeePaused","type":"event"},{"anonymous":false,"inputs":[],"name":"CancelFeeUnPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_minValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"CreateAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"EndAuction","type":"event"},{"anonymous":false,"inputs":[],"name":"FeePaused","type":"event"},{"anonymous":false,"inputs":[],"name":"FeeUnPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isListed","type":"bool"}],"name":"NftListStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currentOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"}],"name":"PriceUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"Purchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeRate","type":"uint256"}],"name":"SetCancelFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeRate","type":"uint256"}],"name":"SetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_contractOwner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_minValue","type":"uint256"},{"internalType":"uint256","name":"_auctionTime","type":"uint256"}],"name":"auctionMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bids","outputs":[{"internalType":"bool","name":"hasBid","type":"bool"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"cancelAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"cancelBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cancelFeePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelFeePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelFeeUnPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minValue","type":"uint256"},{"internalType":"uint256","name":"_auctionTime","type":"uint256"}],"name":"createAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"endAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeUnPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hasAuction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listedMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offers","outputs":[{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"ownerAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feeRate_","type":"uint256"}],"name":"setCancelFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feeRate_","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"shouldBeListed","type":"bool"}],"name":"updateListingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updatePrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600981526020017f4e766972576f726c6400000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e76697200000000000000000000000000000000000000000000000000000000815250606460016200009a6301ffc9a760e01b6200021960201b60201c565b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160146101000a81548160ff02191690831515021790555081600281905550806003819055506000600460006101000a81548160ff0219169083151502179055506000600460016101000a81548160ff021916908315150217905550505081600c9080519060200190620001af92919062000322565b5080600d9080519060200190620001c892919062000322565b50620001e16380ac58cd60e01b6200021960201b60201c565b620001f9635b5e139f60e01b6200021960201b60201c565b6200021163780e9d6360e01b6200021960201b60201c565b5050620003d8565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200035a5760008555620003a6565b82601f106200037557805160ff1916838001178555620003a6565b82800160010185558215620003a6579182015b82811115620003a557825182559160200191906001019062000388565b5b509050620003b59190620003b9565b5090565b5b80821115620003d4576000816000905550600101620003ba565b5090565b615da280620003e86000396000f3fe6080604052600436106102ff5760003560e01c80637e8816b911610190578063b88d4fde116100dc578063ca52a43311610095578063d96a094a1161006f578063d96a094a14611400578063e985e9c51461142e578063f1462921146114b5578063f2fde38b14611506576102ff565b8063ca52a43314611383578063cda4beef1461139a578063d16fd8d4146113e9576102ff565b8063b88d4fde146110a8578063b9a2de3a146111ba578063bc8ba28f146111e8578063bdde789714611239578063c2fffd6b14611294578063c87b56dd146112cf576102ff565b806395d89b4111610149578063978bbdb911610123578063978bbdb914610fac5780639819826a14610fd757806398214bcb14610fee578063a22cb4651461104b576102ff565b806395d89b4114610eb357806396b5a75514610f435780639703ef3514610f7e576102ff565b80637e8816b914610b6e57806382367b2d14610c745780638456cb5914610ccf5780638804da6314610ce65780638a72ea6a14610df65780638da5cb5b14610e72576102ff565b806342966c681161024f57806355f804b31161020857806369fe0e2d116101e257806369fe0e2d14610a115780636c0360eb14610a4c57806370a0823114610adc578063715018a614610b41576102ff565b806355f804b3146108b75780635c975abb1461097f5780636352211e146109ac576102ff565b806342966c68146107535780634423c5f114610781578063454a2ab3146107f65780634e79f1a1146108245780634f6ccce71461083b57806350f1c94f1461088a576102ff565b806326a49e37116102bc5780632f745c59116102965780632f745c59146106275780633c4da553146106965780633f4ba83a146106c157806342842e0e146106d8576102ff565b806326a49e371461056a57806327fbe123146105b95780632bb3b114146105e6576102ff565b806301ffc9a71461030457806306fdde0314610374578063081812fc14610404578063095ea7b31461046957806318160ddd146104c457806323b872dd146104ef575b600080fd5b34801561031057600080fd5b5061035c6004803603602081101561032757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061156d565b60405180821515815260200191505060405180910390f35b34801561038057600080fd5b506103896115d4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c95780820151818401526020810190506103ae565b50505050905090810190601f1680156103f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041057600080fd5b5061043d6004803603602081101561042757600080fd5b8101908080359060200190929190505050611676565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561047557600080fd5b506104c26004803603604081101561048c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116c5565b005b3480156104d057600080fd5b506104d9611771565b6040518082815260200191505060405180910390f35b3480156104fb57600080fd5b506105686004803603606081101561051257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611782565b005b34801561057657600080fd5b506105a36004803603602081101561058d57600080fd5b81019080803590602001909291905050506117c5565b6040518082815260200191505060405180910390f35b3480156105c557600080fd5b506105ce6117dd565b60405180821515815260200191505060405180910390f35b3480156105f257600080fd5b506105fb6117f4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561063357600080fd5b506106806004803603604081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061181a565b6040518082815260200191505060405180910390f35b3480156106a257600080fd5b506106ab611875565b6040518082815260200191505060405180910390f35b3480156106cd57600080fd5b506106d661189d565b005b3480156106e457600080fd5b50610751600480360360608110156106fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a2e565b005b61077f6004803603602081101561076957600080fd5b8101908080359060200190929190505050611a67565b005b34801561078d57600080fd5b506107ba600480360360208110156107a457600080fd5b8101908080359060200190929190505050611c24565b6040518084151581526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390f35b6108226004803603602081101561080c57600080fd5b8101908080359060200190929190505050611c7b565b005b34801561083057600080fd5b50610839611c87565b005b34801561084757600080fd5b506108746004803603602081101561085e57600080fd5b8101908080359060200190929190505050611df0565b6040518082815260200191505060405180910390f35b34801561089657600080fd5b5061089f611e13565b60405180821515815260200191505060405180910390f35b3480156108c357600080fd5b5061097d600480360360208110156108da57600080fd5b81019080803590602001906401000000008111156108f757600080fd5b82018360208201111561090957600080fd5b8035906020019184600183028401116401000000008311171561092b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611e2a565b005b34801561098b57600080fd5b50610994611edc565b60405180821515815260200191505060405180910390f35b3480156109b857600080fd5b506109e5600480360360208110156109cf57600080fd5b8101908080359060200190929190505050611ef3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a1d57600080fd5b50610a4a60048036036020811015610a3457600080fd5b8101908080359060200190929190505050611f05565b005b348015610a5857600080fd5b50610a61612062565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aa1578082015181840152602081019050610a86565b50505050905090810190601f168015610ace5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ae857600080fd5b50610b2b60048036036020811015610aff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612104565b6040518082815260200191505060405180910390f35b348015610b4d57600080fd5b50610b5661218d565b60405180821515815260200191505060405180910390f35b348015610b7a57600080fd5b50610c5e60048036036060811015610b9157600080fd5b8101908080359060200190640100000000811115610bae57600080fd5b820183602082011115610bc057600080fd5b80359060200191846001830284011164010000000083111715610be257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612244565b6040518082815260200191505060405180910390f35b348015610c8057600080fd5b50610cb760048036036040811015610c9757600080fd5b81019080803590602001909291908035906020019092919050505061237a565b60405180821515815260200191505060405180910390f35b348015610cdb57600080fd5b50610ce461246d565b005b348015610cf257600080fd5b50610de060048036036080811015610d0957600080fd5b8101908080359060200190640100000000811115610d2657600080fd5b820183602082011115610d3857600080fd5b80359060200191846001830284011164010000000083111715610d5a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506125fe565b6040518082815260200191505060405180910390f35b348015610e0257600080fd5b50610e2f60048036036020811015610e1957600080fd5b8101908080359060200190929190505050612714565b6040518085151581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390f35b348015610e7e57600080fd5b50610e87612771565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ebf57600080fd5b50610ec861279b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f08578082015181840152602081019050610eed565b50505050905090810190601f168015610f355780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610f4f57600080fd5b50610f7c60048036036020811015610f6657600080fd5b810190808035906020019092919050505061283d565b005b610faa60048036036020811015610f9457600080fd5b8101908080359060200190929190505050612849565b005b348015610fb857600080fd5b50610fc1612855565b6040518082815260200191505060405180910390f35b348015610fe357600080fd5b50610fec61287d565b005b348015610ffa57600080fd5b506110336004803603604081101561101157600080fd5b81019080803590602001909291908035151590602001909291905050506129e7565b60405180821515815260200191505060405180910390f35b34801561105757600080fd5b506110a66004803603604081101561106e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612acf565b005b3480156110b457600080fd5b506111b8600480360360808110156110cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561113257600080fd5b82018360208201111561114457600080fd5b8035906020019184600183028401116401000000008311171561116657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c1c565b005b6111e6600480360360208110156111d057600080fd5b8101908080359060200190929190505050612c61565b005b3480156111f457600080fd5b506112216004803603602081101561120b57600080fd5b8101908080359060200190929190505050612c6d565b60405180821515815260200191505060405180910390f35b34801561124557600080fd5b5061127c6004803603604081101561125c57600080fd5b810190808035906020019092919080359060200190929190505050612c8d565b60405180821515815260200191505060405180910390f35b3480156112a057600080fd5b506112cd600480360360208110156112b757600080fd5b8101908080359060200190929190505050612e32565b005b3480156112db57600080fd5b50611308600480360360208110156112f257600080fd5b8101908080359060200190929190505050612f90565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561134857808201518184015260208101905061132d565b50505050905090810190601f1680156113755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561138f57600080fd5b50611398613215565b005b3480156113a657600080fd5b506113e7600480360360608110156113bd57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061337e565b005b3480156113f557600080fd5b506113fe6133bf565b005b61142c6004803603602081101561141657600080fd5b8101908080359060200190929190505050613529565b005b34801561143a57600080fd5b5061149d6004803603604081101561145157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613647565b60405180821515815260200191505060405180910390f35b3480156114c157600080fd5b506114ee600480360360208110156114d857600080fd5b81019080803590602001909291905050506136db565b60405180821515815260200191505060405180910390f35b34801561151257600080fd5b506115556004803603602081101561152957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613725565b60405180821515815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561166c5780601f106116415761010080835404028352916020019161166c565b820191906000526020600020905b81548152906001019060200180831161164f57829003601f168201915b5050505050905090565b600061168182613863565b61168a57600080fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006116d082611ef3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561170b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1661172a613880565b73ffffffffffffffffffffffffffffffffffffffff161480611759575061175881611753613880565b613647565b5b61176257600080fd5b61176c8383613888565b505050565b600061177d6005613941565b905090565b61179361178d613880565b82613956565b61179c57600080fd5b600015156117a9826136db565b1515146117b557600080fd5b6117c0838383613a7e565b505050565b60116020528060005260406000206000915090505481565b6000600460019054906101000a900460ff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061186d82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613c2990919063ffffffff16565b905092915050565b6000600115156118836117dd565b15151415611894576000905061189a565b60035490505b90565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b61194b611edc565b6119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600160146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611a01613880565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b60001515611a3b826136db565b151514611a4757600080fd5b611a6283838360405180602001604052806000815250612c1c565b505050565b611a78611a72613880565b82613956565b80611ad75750611a86613880565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180615cf86030913960400191505060405180910390fd5b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415611c17576000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415611c0c5760008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015611c09573d6000803e3d6000fd5b50505b611c1583613c43565b505b611c2082613dd1565b5050565b600f6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905083565b611c8481613f0b565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b611d35611e13565b611da7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600460006101000a81548160ff0219169083151502179055507f0a9d058aff97d3ed3388247bac7d508f44a460217484407ce5bba66affc17daf60405160405180910390a1565b600080611e0783600561412d90919063ffffffff16565b50905080915050919050565b6000600460009054906101000a900460ff16905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ed0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b611ed981614159565b50565b6000600160149054906101000a900460ff16905090565b6000611efe82614173565b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b6064811115612022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f557020746f2031303020636f6d6d697373696f6e00000000000000000000000081525060200191505060405180910390fd5b806002819055507e172ddfc5ae88d08b3de01a5a187667c37a5a53989e8c175055cb6c993792a7816040518082815260200191505060405180910390a150565b6060600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120fa5780601f106120cf576101008083540402835291602001916120fa565b820191906000526020600020905b8154815290600101906020018083116120dd57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561213f57600080fd5b612186600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614190565b9050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b61223f60006141a5565b905090565b6000806001612251611771565b01905082601160008381526020019081526020016000208190555060016012600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506122a2848261426d565b6122ac818661428b565b8373ffffffffffffffffffffffffffffffffffffffff167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b48483886040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612333578082015181840152602081019050612318565b50505050905090810190601f1680156123605780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2809150509392505050565b6000801515612388846136db565b15151461239457600080fd5b6000601160008581526020019081526020016000205490506123b584611ef3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123ec57600080fd5b8260116000868152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e011682858760405180848152602001838152602001828152602001935050505060405180910390a2600191505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b61251b611edc565b1561258e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60018060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125d1613880565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600080600161260b611771565b019050836011600083815260200190815260200160002081905550612630858261426d565b61263a818761428b565b8473ffffffffffffffffffffffffffffffffffffffff167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b48583896040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156126c15780820151818401526020810190506126a6565b50505050905090810190601f1680156126ee5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26127088185856142c9565b80915050949350505050565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905084565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128335780601f1061280857610100808354040283529160200191612833565b820191906000526020600020905b81548152906001019060200180831161281657829003601f168201915b5050505050905090565b61284681614476565b50565b61285281614632565b50565b600060011515612863611e13565b15151415612874576000905061287a565b60025490505b90565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b61292b611e13565b1561299e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600460006101000a81548160ff0219169083151502179055507f51f99560a97e6809d74ff4458c12419031c9b6d4d8eae6a6b26bf8386fb0c4fa60405160405180910390a1565b60006129f283611ef3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a2957600080fd5b60001515612a36846136db565b151514612a4257600080fd5b816012600085815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc84846040518083815260200182151581526020019250505060405180910390a26001905092915050565b612ad7613880565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b0f57600080fd5b8060096000612b1c613880565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612bc9613880565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b612c2d612c27613880565b83613956565b612c3657600080fd5b60001515612c43836136db565b151514612c4f57600080fd5b612c5b8484848461490f565b50505050565b612c6a81614935565b50565b60126020528060005260406000206000915054906101000a900460ff1681565b6000801515612c9b846136db565b151514612ca757600080fd5b600060116000858152602001908152602001600020549050612cc884611ef3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cff57600080fd5b8260116000868152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc8560016040518083815260200182151581526020019250505060405180910390a2600115156012600086815260200190815260200160002060009054906101000a900460ff16151514612e275760016012600086815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e011682858760405180848152602001838152602001828152602001935050505060405180910390a25b600191505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b6064811115612f4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f557020746f2031303020636f6d6d697373696f6e00000000000000000000000081525060200191505060405180910390fd5b806003819055507fb0bd0bcf4953b497ec896cb758888392f62fa6f295bfc13eee9b91900febb33d816040518082815260200191505060405180910390a150565b6060612f9b82613863565b612fa457600080fd5b6000600a60008481526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561304d5780601f106130225761010080835404028352916020019161304d565b820191906000526020600020905b81548152906001019060200180831161303057829003601f168201915b50505050509050600061305e612062565b9050600081511415613074578192505050613210565b6000825111156131455780826040516020018083805190602001908083835b602083106130b65780518252602082019150602081019050602083039250613093565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061310757805182526020820191506020810190506020830392506130e4565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050613210565b8061314f85614b28565b6040516020018083805190602001908083835b602083106131855780518252602082019150602081019050602083039250613162565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b602083106131d657805182526020820191506020810190506020830392506131b3565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050505b919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b6132c36117dd565b613335576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600460016101000a81548160ff0219169083151502179055507f67592efac9ad4bc8a051561f7008dd48427e81ea709a2f61ad386fa68189b35c60405160405180910390a1565b600015156012600085815260200190815260200160002060009054906101000a900460ff161515146133af57600080fd5b6133ba8383836142c9565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b61346d6117dd565b156134e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600460016101000a81548160ff0219169083151502179055507f6f941072281a73a3d1a56154741446c3752559d3c97ae913f09e25382677933560405160405180910390a1565b61353281614c6f565b600061353d82611ef3565b9050600033905061354d83614d15565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fef258f47a33a1cba99d81ea828f234ff5d6cb31034c0f79ecb5198f8c6d118f66011600087815260200190815260200160002054866135ba88612f90565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156136065780820151818401526020810190506135eb565b50505050905090810190601f1680156136335780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a3505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600e60008481526020019081526020016000209050600115158160000160009054906101000a900460ff1615151461371a576000915050613720565b60019150505b919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146137cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613853576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180615d286045913960600191505060405180910390fd5b61385c826141a5565b9050919050565b6000613879826005614ed990919063ffffffff16565b9050919050565b600033905090565b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166138fb83614173565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061394f82600001614ef3565b9050919050565b600061396182613863565b61396a57600080fd5b600061397583614173565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806139e457508373ffffffffffffffffffffffffffffffffffffffff166139cc84611676565b73ffffffffffffffffffffffffffffffffffffffff16145b80613a755750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16613a9e82614173565b73ffffffffffffffffffffffffffffffffffffffff1614613abe57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613af857600080fd5b613b03838383614f04565b613b0e600082613888565b613b5f81600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f1b90919063ffffffff16565b50613bb181600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f3590919063ffffffff16565b50613bc881836005614f4f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000613c388360000183614f84565b60001c905092915050565b6040518060800160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815250600e600083815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050506040518060600160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f600083815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015590505050565b6000613ddc82614173565b9050613dea81600084614f04565b613df5600083613888565b6000600a600084815260200190815260200160002080546001816001161561010002031660029004905014613e4457600a60008381526020019081526020016000206000613e439190615b39565b5b613e9582600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f1b90919063ffffffff16565b50613eaa82600561500790919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b3373ffffffffffffffffffffffffffffffffffffffff16613f2b82614173565b73ffffffffffffffffffffffffffffffffffffffff161415613f4c57600080fd5b6000600e6000838152602001908152602001600020905080600201544210613f7357600080fd5b8060010154341015613f8457600080fd5b6000600f6000848152602001908152602001600020905080600101543411613fab57600080fd5b60008160010154111561402e5760008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f1935050505015801561402b573d6000803e3d6000fd5b50505b60405180606001604052806001151581526020013373ffffffffffffffffffffffffffffffffffffffff16815260200134815250600f600085815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600101559050507f6fe605fcf3f0af8122bf2ca880af248fc500eed81268c984dc2f51f73d96fc668334604051808381526020018281526020019250505060405180910390a1505050565b6000806000806141408660000186615021565b915091508160001c8160001c9350935050509250929050565b80600b908051906020019061416f929190615b81565b5050565b60006141898260056150ba90919063ffffffff16565b9050919050565b600061419e826000016150d7565b9050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a381600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6142878282604051806020016040528060008152506150e8565b5050565b61429482613863565b61429d57600080fd5b80600a600084815260200190815260200160002090805190602001906142c4929190615b81565b505050565b3373ffffffffffffffffffffffffffffffffffffffff166142e984614173565b73ffffffffffffffffffffffffffffffffffffffff161461430957600080fd5b6000600e60008581526020019081526020016000209050600115158160000160009054906101000a900460ff161515141561434357600080fd5b60405180608001604052806001151581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001834201815250600e600086815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050503373ffffffffffffffffffffffffffffffffffffffff167f5e4dbe799442580e0983dedea209e02d0497b6e3383338a9e1ac3aa117b491ec858585420160405180848152602001838152602001828152602001935050505060405180910390a250505050565b3373ffffffffffffffffffffffffffffffffffffffff1661449682614173565b73ffffffffffffffffffffffffffffffffffffffff16146144b657600080fd5b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff161515146144ef57600080fd5b6000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff161515141561452957600080fd5b60405180608001604052806000151581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815250600e600085815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050507fbea0e66c2d42b9131695ceea7d1aaa21b37e93070cde19c9b5fbd686a3259292836040518082815260200191505060405180910390a1505050565b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff1615151461466b57600080fd5b8060020154421061467b57600080fd5b6000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff161515146146b457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461471057600080fd5b60008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006103e861476f611875565b8560010154028161477c57fe5b0490508273ffffffffffffffffffffffffffffffffffffffff166108fc828660010154039081150290604051600060405180830381858888f193505050501580156147cb573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614812573d6000803e3d6000fd5b506040518060600160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f600088815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600101559050507f7687efe94566d20f7ebb8eff43bb57b2c014749dfd9ad179089e58c338ecdfa7866040518082815260200191505060405180910390a1505050505050565b61491a848484613a7e565b6149268484848461510d565b61492f57600080fd5b50505050565b6000600e60008381526020019081526020016000209050806002015442101561495d57600080fd5b600115158160000160009054906101000a900460ff1615151461497f57600080fd5b600061498a83614173565b90506000600f600085815260200190815260200160002090506149f68360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686613a7e565b60006103e8614a03612855565b83600101540281614a1057fe5b04905060008183600101540390508373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614a64573d6000803e3d6000fd5b506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015614ad2573d6000803e3d6000fd5b507fc87036081503cc1fd53dc456ee0c40aef140882f77b06b4b4b554fee2b60816a878560010154604051808381526020018281526020019250505060405180910390a1614b1f87613c43565b50505050505050565b60606000821415614b70576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614c6a565b600082905060005b60008214614b9a578080600101915050600a8281614b9257fe5b049150614b78565b60008167ffffffffffffffff81118015614bb357600080fd5b506040519080825280601f01601f191660200182016040528015614be65781602001600182028036833780820191505090505b50905060006001830390508593505b60008414614c6257600a8481614c0757fe5b0660300160f81b82828060019003935081518110614c2157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481614c5a57fe5b049350614bf5565b819450505050505b919050565b60006012600083815260200190815260200160002060009054906101000a900460ff169050614c9d82613863565b614ca657600080fd5b80614cb057600080fd5b6011600083815260200190815260200160002054341015614cd057600080fd5b614cd982611ef3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415614d1157600080fd5b5050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060003390506000614d4c84611ef3565b9050614d59818386613a7e565b60006103e8614d66612855565b60116000888152602001908152602001600020540281614d8257fe5b04905060008160116000888152602001908152602001600020540390508273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614de5573d6000803e3d6000fd5b508473ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015614e2c573d6000803e3d6000fd5b506011600087815260200190815260200160002054341115614ea5578373ffffffffffffffffffffffffffffffffffffffff166108fc601160008981526020019081526020016000205434039081150290604051600060405180830381858888f19350505050158015614ea3573d6000803e3d6000fd5b505b60006012600088815260200190815260200160002060006101000a81548160ff021916908315150217905550505050505050565b6000614eeb836000018360001b615326565b905092915050565b600081600001805490509050919050565b614f0c611edc565b15614f1657600080fd5b505050565b6000614f2d836000018360001b615349565b905092915050565b6000614f47836000018360001b615431565b905092915050565b6000614f7b846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6154a1565b90509392505050565b600081836000018054905011614fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615c2d6022913960400191505060405180910390fd5b826000018281548110614ff457fe5b9060005260206000200154905092915050565b6000615019836000018360001b61557d565b905092915050565b60008082846000018054905011615083576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615cd66022913960400191505060405180910390fd5b600084600001848154811061509457fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60006150cc836000018360001b615696565b60001c905092915050565b600081600001805490509050919050565b6150f28383615755565b6150ff600084848461510d565b61510857600080fd5b505050565b600061512e8473ffffffffffffffffffffffffffffffffffffffff16615877565b61513b576001905061531e565b60006152a563150b7a0260e01b615150613880565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156151d45780820151818401526020810190506151b9565b50505050905090810190601f1680156152015780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615c4f603291398773ffffffffffffffffffffffffffffffffffffffff1661588a9092919063ffffffff16565b905060008180602001905160208110156152be57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114615425576000600182039050600060018660000180549050039050600086600001828154811061539457fe5b90600052602060002001549050808760000184815481106153b157fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806153e957fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061542b565b60009150505b92915050565b600061543d83836158a2565b61549657826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061549b565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561554857846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050615576565b8285600001600183038154811061555b57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b6000808360010160008481526020019081526020016000205490506000811461568a57600060018203905060006001866000018054905003905060008660000182815481106155c857fe5b90600052602060002090600202019050808760000184815481106155e857fe5b906000526020600020906002020160008201548160000155600182015481600101559050506001830187600101600083600001548152602001908152602001600020819055508660000180548061563b57fe5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055866001016000878152602001908152602001600020600090556001945050505050615690565b60009150505b92915050565b6000808360010160008481526020019081526020016000205490506000811415615728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000081525060200191505060405180910390fd5b83600001600182038154811061573a57fe5b90600052602060002090600202016001015491505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561578f57600080fd5b61579881613863565b156157a257600080fd5b6157ae60008383614f04565b6157ff81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f3590919063ffffffff16565b5061581681836005614f4f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606061589984846000856158c5565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015615920576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c816026913960400191505060405180910390fd5b61592985615877565b61599b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106159ea57805182526020820191506020810190506020830392506159c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615a4c576040519150601f19603f3d011682016040523d82523d6000602084013e615a51565b606091505b5091509150615a61828286615a6d565b92505050949350505050565b60608315615a7d57829050615b32565b600083511115615a905782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615af7578082015181840152602081019050615adc565b50505050905090810190601f168015615b245780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b50805460018160011615610100020316600290046000825580601f10615b5f5750615b7e565b601f016020900490600052602060002090810190615b7d9190615c0f565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282615bb75760008555615bfe565b82601f10615bd057805160ff1916838001178555615bfe565b82800160010185558215615bfe579182015b82811115615bfd578251825591602001919060010190615be2565b5b509050615c0b9190615c0f565b5090565b5b80821115615c28576000816000905550600101615c10565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4f776e61626c65203a2046756e6374696f6e2063616c6c656420627920756e617574686f72697a656420757365722e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732314275726e61626c653a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644f776e61626c652f7472616e736665724f776e657273686970203a2063616e6e6f74207472616e73666572206f776e65727368697020746f207a65726f2061646472657373a264697066735822122085dca7bd110e0ef876530aefcd305195d7b7ad31ea214f2ca2afb6441935c0ad64736f6c6343000706003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000094e766972576f726c64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e76697200000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c80637e8816b911610190578063b88d4fde116100dc578063ca52a43311610095578063d96a094a1161006f578063d96a094a14611400578063e985e9c51461142e578063f1462921146114b5578063f2fde38b14611506576102ff565b8063ca52a43314611383578063cda4beef1461139a578063d16fd8d4146113e9576102ff565b8063b88d4fde146110a8578063b9a2de3a146111ba578063bc8ba28f146111e8578063bdde789714611239578063c2fffd6b14611294578063c87b56dd146112cf576102ff565b806395d89b4111610149578063978bbdb911610123578063978bbdb914610fac5780639819826a14610fd757806398214bcb14610fee578063a22cb4651461104b576102ff565b806395d89b4114610eb357806396b5a75514610f435780639703ef3514610f7e576102ff565b80637e8816b914610b6e57806382367b2d14610c745780638456cb5914610ccf5780638804da6314610ce65780638a72ea6a14610df65780638da5cb5b14610e72576102ff565b806342966c681161024f57806355f804b31161020857806369fe0e2d116101e257806369fe0e2d14610a115780636c0360eb14610a4c57806370a0823114610adc578063715018a614610b41576102ff565b806355f804b3146108b75780635c975abb1461097f5780636352211e146109ac576102ff565b806342966c68146107535780634423c5f114610781578063454a2ab3146107f65780634e79f1a1146108245780634f6ccce71461083b57806350f1c94f1461088a576102ff565b806326a49e37116102bc5780632f745c59116102965780632f745c59146106275780633c4da553146106965780633f4ba83a146106c157806342842e0e146106d8576102ff565b806326a49e371461056a57806327fbe123146105b95780632bb3b114146105e6576102ff565b806301ffc9a71461030457806306fdde0314610374578063081812fc14610404578063095ea7b31461046957806318160ddd146104c457806323b872dd146104ef575b600080fd5b34801561031057600080fd5b5061035c6004803603602081101561032757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061156d565b60405180821515815260200191505060405180910390f35b34801561038057600080fd5b506103896115d4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c95780820151818401526020810190506103ae565b50505050905090810190601f1680156103f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041057600080fd5b5061043d6004803603602081101561042757600080fd5b8101908080359060200190929190505050611676565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561047557600080fd5b506104c26004803603604081101561048c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116c5565b005b3480156104d057600080fd5b506104d9611771565b6040518082815260200191505060405180910390f35b3480156104fb57600080fd5b506105686004803603606081101561051257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611782565b005b34801561057657600080fd5b506105a36004803603602081101561058d57600080fd5b81019080803590602001909291905050506117c5565b6040518082815260200191505060405180910390f35b3480156105c557600080fd5b506105ce6117dd565b60405180821515815260200191505060405180910390f35b3480156105f257600080fd5b506105fb6117f4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561063357600080fd5b506106806004803603604081101561064a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061181a565b6040518082815260200191505060405180910390f35b3480156106a257600080fd5b506106ab611875565b6040518082815260200191505060405180910390f35b3480156106cd57600080fd5b506106d661189d565b005b3480156106e457600080fd5b50610751600480360360608110156106fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a2e565b005b61077f6004803603602081101561076957600080fd5b8101908080359060200190929190505050611a67565b005b34801561078d57600080fd5b506107ba600480360360208110156107a457600080fd5b8101908080359060200190929190505050611c24565b6040518084151581526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390f35b6108226004803603602081101561080c57600080fd5b8101908080359060200190929190505050611c7b565b005b34801561083057600080fd5b50610839611c87565b005b34801561084757600080fd5b506108746004803603602081101561085e57600080fd5b8101908080359060200190929190505050611df0565b6040518082815260200191505060405180910390f35b34801561089657600080fd5b5061089f611e13565b60405180821515815260200191505060405180910390f35b3480156108c357600080fd5b5061097d600480360360208110156108da57600080fd5b81019080803590602001906401000000008111156108f757600080fd5b82018360208201111561090957600080fd5b8035906020019184600183028401116401000000008311171561092b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611e2a565b005b34801561098b57600080fd5b50610994611edc565b60405180821515815260200191505060405180910390f35b3480156109b857600080fd5b506109e5600480360360208110156109cf57600080fd5b8101908080359060200190929190505050611ef3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a1d57600080fd5b50610a4a60048036036020811015610a3457600080fd5b8101908080359060200190929190505050611f05565b005b348015610a5857600080fd5b50610a61612062565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aa1578082015181840152602081019050610a86565b50505050905090810190601f168015610ace5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ae857600080fd5b50610b2b60048036036020811015610aff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612104565b6040518082815260200191505060405180910390f35b348015610b4d57600080fd5b50610b5661218d565b60405180821515815260200191505060405180910390f35b348015610b7a57600080fd5b50610c5e60048036036060811015610b9157600080fd5b8101908080359060200190640100000000811115610bae57600080fd5b820183602082011115610bc057600080fd5b80359060200191846001830284011164010000000083111715610be257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612244565b6040518082815260200191505060405180910390f35b348015610c8057600080fd5b50610cb760048036036040811015610c9757600080fd5b81019080803590602001909291908035906020019092919050505061237a565b60405180821515815260200191505060405180910390f35b348015610cdb57600080fd5b50610ce461246d565b005b348015610cf257600080fd5b50610de060048036036080811015610d0957600080fd5b8101908080359060200190640100000000811115610d2657600080fd5b820183602082011115610d3857600080fd5b80359060200191846001830284011164010000000083111715610d5a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506125fe565b6040518082815260200191505060405180910390f35b348015610e0257600080fd5b50610e2f60048036036020811015610e1957600080fd5b8101908080359060200190929190505050612714565b6040518085151581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390f35b348015610e7e57600080fd5b50610e87612771565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ebf57600080fd5b50610ec861279b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f08578082015181840152602081019050610eed565b50505050905090810190601f168015610f355780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610f4f57600080fd5b50610f7c60048036036020811015610f6657600080fd5b810190808035906020019092919050505061283d565b005b610faa60048036036020811015610f9457600080fd5b8101908080359060200190929190505050612849565b005b348015610fb857600080fd5b50610fc1612855565b6040518082815260200191505060405180910390f35b348015610fe357600080fd5b50610fec61287d565b005b348015610ffa57600080fd5b506110336004803603604081101561101157600080fd5b81019080803590602001909291908035151590602001909291905050506129e7565b60405180821515815260200191505060405180910390f35b34801561105757600080fd5b506110a66004803603604081101561106e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612acf565b005b3480156110b457600080fd5b506111b8600480360360808110156110cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561113257600080fd5b82018360208201111561114457600080fd5b8035906020019184600183028401116401000000008311171561116657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c1c565b005b6111e6600480360360208110156111d057600080fd5b8101908080359060200190929190505050612c61565b005b3480156111f457600080fd5b506112216004803603602081101561120b57600080fd5b8101908080359060200190929190505050612c6d565b60405180821515815260200191505060405180910390f35b34801561124557600080fd5b5061127c6004803603604081101561125c57600080fd5b810190808035906020019092919080359060200190929190505050612c8d565b60405180821515815260200191505060405180910390f35b3480156112a057600080fd5b506112cd600480360360208110156112b757600080fd5b8101908080359060200190929190505050612e32565b005b3480156112db57600080fd5b50611308600480360360208110156112f257600080fd5b8101908080359060200190929190505050612f90565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561134857808201518184015260208101905061132d565b50505050905090810190601f1680156113755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561138f57600080fd5b50611398613215565b005b3480156113a657600080fd5b506113e7600480360360608110156113bd57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919050505061337e565b005b3480156113f557600080fd5b506113fe6133bf565b005b61142c6004803603602081101561141657600080fd5b8101908080359060200190929190505050613529565b005b34801561143a57600080fd5b5061149d6004803603604081101561145157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613647565b60405180821515815260200191505060405180910390f35b3480156114c157600080fd5b506114ee600480360360208110156114d857600080fd5b81019080803590602001909291905050506136db565b60405180821515815260200191505060405180910390f35b34801561151257600080fd5b506115556004803603602081101561152957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613725565b60405180821515815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561166c5780601f106116415761010080835404028352916020019161166c565b820191906000526020600020905b81548152906001019060200180831161164f57829003601f168201915b5050505050905090565b600061168182613863565b61168a57600080fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006116d082611ef3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561170b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1661172a613880565b73ffffffffffffffffffffffffffffffffffffffff161480611759575061175881611753613880565b613647565b5b61176257600080fd5b61176c8383613888565b505050565b600061177d6005613941565b905090565b61179361178d613880565b82613956565b61179c57600080fd5b600015156117a9826136db565b1515146117b557600080fd5b6117c0838383613a7e565b505050565b60116020528060005260406000206000915090505481565b6000600460019054906101000a900460ff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061186d82600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613c2990919063ffffffff16565b905092915050565b6000600115156118836117dd565b15151415611894576000905061189a565b60035490505b90565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b61194b611edc565b6119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600160146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611a01613880565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b60001515611a3b826136db565b151514611a4757600080fd5b611a6283838360405180602001604052806000815250612c1c565b505050565b611a78611a72613880565b82613956565b80611ad75750611a86613880565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180615cf86030913960400191505060405180910390fd5b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415611c17576000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415611c0c5760008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015611c09573d6000803e3d6000fd5b50505b611c1583613c43565b505b611c2082613dd1565b5050565b600f6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905083565b611c8481613f0b565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b611d35611e13565b611da7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600460006101000a81548160ff0219169083151502179055507f0a9d058aff97d3ed3388247bac7d508f44a460217484407ce5bba66affc17daf60405160405180910390a1565b600080611e0783600561412d90919063ffffffff16565b50905080915050919050565b6000600460009054906101000a900460ff16905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ed0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b611ed981614159565b50565b6000600160149054906101000a900460ff16905090565b6000611efe82614173565b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b6064811115612022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f557020746f2031303020636f6d6d697373696f6e00000000000000000000000081525060200191505060405180910390fd5b806002819055507e172ddfc5ae88d08b3de01a5a187667c37a5a53989e8c175055cb6c993792a7816040518082815260200191505060405180910390a150565b6060600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120fa5780601f106120cf576101008083540402835291602001916120fa565b820191906000526020600020905b8154815290600101906020018083116120dd57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561213f57600080fd5b612186600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614190565b9050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b61223f60006141a5565b905090565b6000806001612251611771565b01905082601160008381526020019081526020016000208190555060016012600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506122a2848261426d565b6122ac818661428b565b8373ffffffffffffffffffffffffffffffffffffffff167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b48483886040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612333578082015181840152602081019050612318565b50505050905090810190601f1680156123605780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2809150509392505050565b6000801515612388846136db565b15151461239457600080fd5b6000601160008581526020019081526020016000205490506123b584611ef3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123ec57600080fd5b8260116000868152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e011682858760405180848152602001838152602001828152602001935050505060405180910390a2600191505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b61251b611edc565b1561258e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60018060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125d1613880565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600080600161260b611771565b019050836011600083815260200190815260200160002081905550612630858261426d565b61263a818761428b565b8473ffffffffffffffffffffffffffffffffffffffff167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b48583896040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156126c15780820151818401526020810190506126a6565b50505050905090810190601f1680156126ee5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26127088185856142c9565b80915050949350505050565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905084565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128335780601f1061280857610100808354040283529160200191612833565b820191906000526020600020905b81548152906001019060200180831161281657829003601f168201915b5050505050905090565b61284681614476565b50565b61285281614632565b50565b600060011515612863611e13565b15151415612874576000905061287a565b60025490505b90565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b61292b611e13565b1561299e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600460006101000a81548160ff0219169083151502179055507f51f99560a97e6809d74ff4458c12419031c9b6d4d8eae6a6b26bf8386fb0c4fa60405160405180910390a1565b60006129f283611ef3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a2957600080fd5b60001515612a36846136db565b151514612a4257600080fd5b816012600085815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc84846040518083815260200182151581526020019250505060405180910390a26001905092915050565b612ad7613880565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b0f57600080fd5b8060096000612b1c613880565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612bc9613880565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b612c2d612c27613880565b83613956565b612c3657600080fd5b60001515612c43836136db565b151514612c4f57600080fd5b612c5b8484848461490f565b50505050565b612c6a81614935565b50565b60126020528060005260406000206000915054906101000a900460ff1681565b6000801515612c9b846136db565b151514612ca757600080fd5b600060116000858152602001908152602001600020549050612cc884611ef3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cff57600080fd5b8260116000868152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc8560016040518083815260200182151581526020019250505060405180910390a2600115156012600086815260200190815260200160002060009054906101000a900460ff16151514612e275760016012600086815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e011682858760405180848152602001838152602001828152602001935050505060405180910390a25b600191505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b6064811115612f4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f557020746f2031303020636f6d6d697373696f6e00000000000000000000000081525060200191505060405180910390fd5b806003819055507fb0bd0bcf4953b497ec896cb758888392f62fa6f295bfc13eee9b91900febb33d816040518082815260200191505060405180910390a150565b6060612f9b82613863565b612fa457600080fd5b6000600a60008481526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561304d5780601f106130225761010080835404028352916020019161304d565b820191906000526020600020905b81548152906001019060200180831161303057829003601f168201915b50505050509050600061305e612062565b9050600081511415613074578192505050613210565b6000825111156131455780826040516020018083805190602001908083835b602083106130b65780518252602082019150602081019050602083039250613093565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061310757805182526020820191506020810190506020830392506130e4565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050613210565b8061314f85614b28565b6040516020018083805190602001908083835b602083106131855780518252602082019150602081019050602083039250613162565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b602083106131d657805182526020820191506020810190506020830392506131b3565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050505b919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b6132c36117dd565b613335576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600460016101000a81548160ff0219169083151502179055507f67592efac9ad4bc8a051561f7008dd48427e81ea709a2f61ad386fa68189b35c60405160405180910390a1565b600015156012600085815260200190815260200160002060009054906101000a900460ff161515146133af57600080fd5b6133ba8383836142c9565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b61346d6117dd565b156134e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600460016101000a81548160ff0219169083151502179055507f6f941072281a73a3d1a56154741446c3752559d3c97ae913f09e25382677933560405160405180910390a1565b61353281614c6f565b600061353d82611ef3565b9050600033905061354d83614d15565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fef258f47a33a1cba99d81ea828f234ff5d6cb31034c0f79ecb5198f8c6d118f66011600087815260200190815260200160002054866135ba88612f90565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156136065780820151818401526020810190506135eb565b50505050905090810190601f1680156136335780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a3505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600e60008481526020019081526020016000209050600115158160000160009054906101000a900460ff1615151461371a576000915050613720565b60019150505b919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146137cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615ca7602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613853576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180615d286045913960600191505060405180910390fd5b61385c826141a5565b9050919050565b6000613879826005614ed990919063ffffffff16565b9050919050565b600033905090565b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166138fb83614173565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061394f82600001614ef3565b9050919050565b600061396182613863565b61396a57600080fd5b600061397583614173565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806139e457508373ffffffffffffffffffffffffffffffffffffffff166139cc84611676565b73ffffffffffffffffffffffffffffffffffffffff16145b80613a755750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16613a9e82614173565b73ffffffffffffffffffffffffffffffffffffffff1614613abe57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613af857600080fd5b613b03838383614f04565b613b0e600082613888565b613b5f81600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f1b90919063ffffffff16565b50613bb181600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f3590919063ffffffff16565b50613bc881836005614f4f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000613c388360000183614f84565b60001c905092915050565b6040518060800160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815250600e600083815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050506040518060600160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f600083815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015590505050565b6000613ddc82614173565b9050613dea81600084614f04565b613df5600083613888565b6000600a600084815260200190815260200160002080546001816001161561010002031660029004905014613e4457600a60008381526020019081526020016000206000613e439190615b39565b5b613e9582600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f1b90919063ffffffff16565b50613eaa82600561500790919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b3373ffffffffffffffffffffffffffffffffffffffff16613f2b82614173565b73ffffffffffffffffffffffffffffffffffffffff161415613f4c57600080fd5b6000600e6000838152602001908152602001600020905080600201544210613f7357600080fd5b8060010154341015613f8457600080fd5b6000600f6000848152602001908152602001600020905080600101543411613fab57600080fd5b60008160010154111561402e5760008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f1935050505015801561402b573d6000803e3d6000fd5b50505b60405180606001604052806001151581526020013373ffffffffffffffffffffffffffffffffffffffff16815260200134815250600f600085815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600101559050507f6fe605fcf3f0af8122bf2ca880af248fc500eed81268c984dc2f51f73d96fc668334604051808381526020018281526020019250505060405180910390a1505050565b6000806000806141408660000186615021565b915091508160001c8160001c9350935050509250929050565b80600b908051906020019061416f929190615b81565b5050565b60006141898260056150ba90919063ffffffff16565b9050919050565b600061419e826000016150d7565b9050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a381600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6142878282604051806020016040528060008152506150e8565b5050565b61429482613863565b61429d57600080fd5b80600a600084815260200190815260200160002090805190602001906142c4929190615b81565b505050565b3373ffffffffffffffffffffffffffffffffffffffff166142e984614173565b73ffffffffffffffffffffffffffffffffffffffff161461430957600080fd5b6000600e60008581526020019081526020016000209050600115158160000160009054906101000a900460ff161515141561434357600080fd5b60405180608001604052806001151581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001834201815250600e600086815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050503373ffffffffffffffffffffffffffffffffffffffff167f5e4dbe799442580e0983dedea209e02d0497b6e3383338a9e1ac3aa117b491ec858585420160405180848152602001838152602001828152602001935050505060405180910390a250505050565b3373ffffffffffffffffffffffffffffffffffffffff1661449682614173565b73ffffffffffffffffffffffffffffffffffffffff16146144b657600080fd5b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff161515146144ef57600080fd5b6000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff161515141561452957600080fd5b60405180608001604052806000151581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815250600e600085815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050507fbea0e66c2d42b9131695ceea7d1aaa21b37e93070cde19c9b5fbd686a3259292836040518082815260200191505060405180910390a1505050565b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff1615151461466b57600080fd5b8060020154421061467b57600080fd5b6000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff161515146146b457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461471057600080fd5b60008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006103e861476f611875565b8560010154028161477c57fe5b0490508273ffffffffffffffffffffffffffffffffffffffff166108fc828660010154039081150290604051600060405180830381858888f193505050501580156147cb573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614812573d6000803e3d6000fd5b506040518060600160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f600088815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600101559050507f7687efe94566d20f7ebb8eff43bb57b2c014749dfd9ad179089e58c338ecdfa7866040518082815260200191505060405180910390a1505050505050565b61491a848484613a7e565b6149268484848461510d565b61492f57600080fd5b50505050565b6000600e60008381526020019081526020016000209050806002015442101561495d57600080fd5b600115158160000160009054906101000a900460ff1615151461497f57600080fd5b600061498a83614173565b90506000600f600085815260200190815260200160002090506149f68360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686613a7e565b60006103e8614a03612855565b83600101540281614a1057fe5b04905060008183600101540390508373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614a64573d6000803e3d6000fd5b506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015614ad2573d6000803e3d6000fd5b507fc87036081503cc1fd53dc456ee0c40aef140882f77b06b4b4b554fee2b60816a878560010154604051808381526020018281526020019250505060405180910390a1614b1f87613c43565b50505050505050565b60606000821415614b70576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614c6a565b600082905060005b60008214614b9a578080600101915050600a8281614b9257fe5b049150614b78565b60008167ffffffffffffffff81118015614bb357600080fd5b506040519080825280601f01601f191660200182016040528015614be65781602001600182028036833780820191505090505b50905060006001830390508593505b60008414614c6257600a8481614c0757fe5b0660300160f81b82828060019003935081518110614c2157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481614c5a57fe5b049350614bf5565b819450505050505b919050565b60006012600083815260200190815260200160002060009054906101000a900460ff169050614c9d82613863565b614ca657600080fd5b80614cb057600080fd5b6011600083815260200190815260200160002054341015614cd057600080fd5b614cd982611ef3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415614d1157600080fd5b5050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060003390506000614d4c84611ef3565b9050614d59818386613a7e565b60006103e8614d66612855565b60116000888152602001908152602001600020540281614d8257fe5b04905060008160116000888152602001908152602001600020540390508273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614de5573d6000803e3d6000fd5b508473ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015614e2c573d6000803e3d6000fd5b506011600087815260200190815260200160002054341115614ea5578373ffffffffffffffffffffffffffffffffffffffff166108fc601160008981526020019081526020016000205434039081150290604051600060405180830381858888f19350505050158015614ea3573d6000803e3d6000fd5b505b60006012600088815260200190815260200160002060006101000a81548160ff021916908315150217905550505050505050565b6000614eeb836000018360001b615326565b905092915050565b600081600001805490509050919050565b614f0c611edc565b15614f1657600080fd5b505050565b6000614f2d836000018360001b615349565b905092915050565b6000614f47836000018360001b615431565b905092915050565b6000614f7b846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6154a1565b90509392505050565b600081836000018054905011614fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615c2d6022913960400191505060405180910390fd5b826000018281548110614ff457fe5b9060005260206000200154905092915050565b6000615019836000018360001b61557d565b905092915050565b60008082846000018054905011615083576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615cd66022913960400191505060405180910390fd5b600084600001848154811061509457fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60006150cc836000018360001b615696565b60001c905092915050565b600081600001805490509050919050565b6150f28383615755565b6150ff600084848461510d565b61510857600080fd5b505050565b600061512e8473ffffffffffffffffffffffffffffffffffffffff16615877565b61513b576001905061531e565b60006152a563150b7a0260e01b615150613880565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156151d45780820151818401526020810190506151b9565b50505050905090810190601f1680156152015780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615c4f603291398773ffffffffffffffffffffffffffffffffffffffff1661588a9092919063ffffffff16565b905060008180602001905160208110156152be57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114615425576000600182039050600060018660000180549050039050600086600001828154811061539457fe5b90600052602060002001549050808760000184815481106153b157fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806153e957fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061542b565b60009150505b92915050565b600061543d83836158a2565b61549657826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061549b565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561554857846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050615576565b8285600001600183038154811061555b57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b6000808360010160008481526020019081526020016000205490506000811461568a57600060018203905060006001866000018054905003905060008660000182815481106155c857fe5b90600052602060002090600202019050808760000184815481106155e857fe5b906000526020600020906002020160008201548160000155600182015481600101559050506001830187600101600083600001548152602001908152602001600020819055508660000180548061563b57fe5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055866001016000878152602001908152602001600020600090556001945050505050615690565b60009150505b92915050565b6000808360010160008481526020019081526020016000205490506000811415615728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000081525060200191505060405180910390fd5b83600001600182038154811061573a57fe5b90600052602060002090600202016001015491505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561578f57600080fd5b61579881613863565b156157a257600080fd5b6157ae60008383614f04565b6157ff81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614f3590919063ffffffff16565b5061581681836005614f4f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606061589984846000856158c5565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015615920576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c816026913960400191505060405180910390fd5b61592985615877565b61599b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106159ea57805182526020820191506020810190506020830392506159c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615a4c576040519150601f19603f3d011682016040523d82523d6000602084013e615a51565b606091505b5091509150615a61828286615a6d565b92505050949350505050565b60608315615a7d57829050615b32565b600083511115615a905782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615af7578082015181840152602081019050615adc565b50505050905090810190601f168015615b245780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b50805460018160011615610100020316600290046000825580601f10615b5f5750615b7e565b601f016020900490600052602060002090810190615b7d9190615c0f565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282615bb75760008555615bfe565b82601f10615bd057805160ff1916838001178555615bfe565b82800160010185558215615bfe579182015b82811115615bfd578251825591602001919060010190615be2565b5b509050615c0b9190615c0f565b5090565b5b80821115615c28576000816000905550600101615c10565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4f776e61626c65203a2046756e6374696f6e2063616c6c656420627920756e617574686f72697a656420757365722e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732314275726e61626c653a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644f776e61626c652f7472616e736665724f776e657273686970203a2063616e6e6f74207472616e73666572206f776e65727368697020746f207a65726f2061646472657373a264697066735822122085dca7bd110e0ef876530aefcd305195d7b7ad31ea214f2ca2afb6441935c0ad64736f6c63430007060033

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

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000094e766972576f726c64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e76697200000000000000000000000000000000000000000000000000000000

-----Decoded View---------------

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 4e766972576f726c640000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4e76697200000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53243:1266:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4021:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42699:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40746:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42921:270;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42087:117;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43834:245;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49922:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34188:104;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49876:37;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42396:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33919:157;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33068:119;;;;;;;;;;;;;:::i;:::-;;44151:201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49305:510;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45036:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54208:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34885:119;;;;;;;;;;;;;:::i;:::-;;42215:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34086:92;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41113:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32635:86;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42567:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35319:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41232:97;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40929:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1299:130;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50411:402;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52049:345;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32943:117;;;;;;;;;;;;;:::i;:::-;;53380:449;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44961:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;892:102;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42807:104;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54098:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54301:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33770:139;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34760:117;;;;;;;;;;;;;:::i;:::-;;52403:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;43264:266;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44424:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54411:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49964:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52754:477;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35504:193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41338:741;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35163:143;;;;;;;;;;;;;:::i;:::-;;53855:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35014:141;;;;;;;;;;;;;:::i;:::-;;50822:273;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43602:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49043:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1002:289;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4021:150;4106:4;4130:20;:33;4151:11;4130:33;;;;;;;;;;;;;;;;;;;;;;;;;;;4123:40;;4021:150;;;:::o;42699:100::-;42753:13;42786:5;42779:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42699:100;:::o;40746:173::-;40822:7;40850:16;40858:7;40850;:16::i;:::-;40842:25;;;;;;40887:15;:24;40903:7;40887:24;;;;;;;;;;;;;;;;;;;;;40880:31;;40746:173;;;:::o;42921:270::-;43002:13;43018:16;43026:7;43018;:16::i;:::-;43002:32;;43059:5;43053:11;;:2;:11;;;;43045:20;;;;;;43102:5;43086:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43111:37;43128:5;43135:12;:10;:12::i;:::-;43111:16;:37::i;:::-;43086:62;43078:71;;;;;;43162:21;43171:2;43175:7;43162:8;:21::i;:::-;42921:270;;;:::o;42087:117::-;42148:7;42175:21;:12;:19;:21::i;:::-;42168:28;;42087:117;:::o;43834:245::-;43942:41;43961:12;:10;:12::i;:::-;43975:7;43942:18;:41::i;:::-;43934:50;;;;;;44022:5;43999:28;;:19;44010:7;43999:10;:19::i;:::-;:28;;;43991:37;;;;;;44043:28;44053:4;44059:2;44063:7;44043:9;:28::i;:::-;43834:245;;;:::o;49922:35::-;;;;;;;;;;;;;;;;;:::o;34188:104::-;34244:4;34268:16;;;;;;;;;;;34261:23;;34188:104;:::o;49876:37::-;;;;;;;;;;;;;:::o;42396:162::-;42493:7;42520:30;42544:5;42520:13;:20;42534:5;42520:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;42513:37;;42396:162;;;;:::o;33919:157::-;33973:4;34008;33987:25;;:17;:15;:17::i;:::-;:25;;;33984:49;;;34026:1;34019:8;;;;33984:49;34054:14;;34047:21;;33919:157;;:::o;33068:119::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32876:8:::1;:6;:8::i;:::-;32868:41;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33136:5:::2;33126:7;;:15;;;;;;;;;;;;;;;;;;33157:22;33166:12;:10;:12::i;:::-;33157:22;;;;;;;;;;;;;;;;;;;;33068:119::o:0;44151:201::-;44282:5;44259:28;;:19;44270:7;44259:10;:19::i;:::-;:28;;;44251:37;;;;;;44305:39;44322:4;44328:2;44332:7;44305:39;;;;;;;;;;;;:16;:39::i;:::-;44151:201;;;:::o;49305:510::-;49372:42;49391:12;:10;:12::i;:::-;49405:8;49372:18;:42::i;:::-;:68;;;;49428:12;:10;:12::i;:::-;49418:22;;:6;;;;;;;;;;;:22;;;49372:68;49364:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49504:19;49527:6;:16;49534:8;49527:16;;;;;;;;;;;49504:39;;49570:4;49551:23;;:5;:15;;;;;;;;;;;;:23;;;49548:228;;;49586:15;49604:4;:14;49609:8;49604:14;;;;;;;;;;;49586:32;;49641:4;49627:18;;:3;:10;;;;;;;;;;;;:18;;;49624:113;;;49653:22;49686:3;:10;;;;;;;;;;;;49653:44;;49704:6;:15;;:26;49720:3;:9;;;49704:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49624:113;;49747:23;49761:8;49747:13;:23::i;:::-;49548:228;;49792:15;49798:8;49792:5;:15::i;:::-;49305:510;;:::o;45036:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54208:69::-;54258:14;54263:8;54258:4;:14::i;:::-;54208:69;:::o;34885:119::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34453:11:::1;:9;:11::i;:::-;34445:44;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;34962:5:::2;34949:10;;:18;;;;;;;;;;;;;;;;;;34983:13;;;;;;;;;;34885:119::o:0;42215:172::-;42290:7;42311:15;42332:22;42348:5;42332:12;:15;;:22;;;;:::i;:::-;42310:44;;;42372:7;42365:14;;;42215:172;;;:::o;34086:92::-;34136:4;34160:10;;;;;;;;;;;34153:17;;34086:92;:::o;41113:109::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41193:21:::1;41205:8;41193:11;:21::i;:::-;41113:109:::0;:::o;32635:86::-;32682:4;32706:7;;;;;;;;;;;32699:14;;32635:86;:::o;42567:124::-;42639:7;42666:17;42675:7;42666:8;:17::i;:::-;42659:24;;42567:124;;;:::o;35319:175::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35392:3:::1;35380:8;:15;;35372:48;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35446:8;35435;:19;;;;35470:16;35477:8;35470:16;;;;;;;;;;;;;;;;;;35319:175:::0;:::o;41232:97::-;41280:13;41313:8;41306:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41232:97;:::o;40929:175::-;41001:7;41046:1;41029:19;;:5;:19;;;;41021:28;;;;;;41067:29;:13;:20;41081:5;41067:20;;;;;;;;;;;;;;;:27;:29::i;:::-;41060:36;;40929:175;;;:::o;1299:130::-;1356:12;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1391:30:::1;1418:1;1391:18;:30::i;:::-;1381:40;;1299:130:::0;:::o;50411:402::-;50502:4;50519:13;50551:1;50535:13;:11;:13::i;:::-;:17;50519:33;;50581:6;50563:5;:15;50569:8;50563:15;;;;;;;;;;;:24;;;;50620:4;50598:9;:19;50608:8;50598:19;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;50637:31;50647:10;50659:8;50637:9;:31::i;:::-;50679:33;50692:8;50702:9;50679:12;:33::i;:::-;50737:10;50730:47;;;50749:6;50757:8;50767:9;50730:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50797:8;50790:15;;;50411:402;;;;;:::o;52049:345::-;52114:4;52159:5;52135:29;;:20;52146:8;52135:10;:20::i;:::-;:29;;;52127:38;;;;;;52178:13;52194:5;:15;52200:8;52194:15;;;;;;;;;;;;52178:31;;52242:17;52250:8;52242:7;:17::i;:::-;52228:31;;:10;:31;;;52220:40;;;;;;52289:6;52271:5;:15;52277:8;52271:15;;;;;;;;;;;:24;;;;52325:10;52313:51;;;52337:8;52347:6;52355:8;52313:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52382:4;52375:11;;;52049:345;;;;:::o;32943:117::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32776:8:::1;:6;:8::i;:::-;32775:9;32767:38;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33012:4:::2;33002:7:::0;::::2;:14;;;;;;;;;;;;;;;;;;33032:20;33039:12;:10;:12::i;:::-;33032:20;;;;;;;;;;;;;;;;;;;;32943:117::o:0;53380:449::-;53495:4;53512:13;53544:1;53528:13;:11;:13::i;:::-;:17;53512:33;;53574:9;53556:5;:15;53562:8;53556:15;;;;;;;;;;;:27;;;;53596:31;53606:10;53618:8;53596:9;:31::i;:::-;53638:33;53651:8;53661:9;53638:12;:33::i;:::-;53696:10;53689:50;;;53708:9;53719:8;53729:9;53689:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53748:47;53763:8;53772:9;53782:12;53748:14;:47::i;:::-;53813:8;53806:15;;;53380:449;;;;;;:::o;44961:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;892:102::-;932:20;980:6;;;;;;;;;;;965:21;;892:102;:::o;42807:104::-;42863:13;42896:7;42889:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42807:104;:::o;54098:92::-;54161:24;54176:8;54161:14;:24::i;:::-;54098:92;:::o;54301:85::-;54361:20;54372:8;54361:10;:20::i;:::-;54301:85;:::o;33770:139::-;33818:4;33847;33832:19;;:11;:9;:11::i;:::-;:19;;;33829:43;;;33865:1;33858:8;;;;33829:43;33893:8;;33886:15;;33770:139;;:::o;34760:117::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34349:11:::1;:9;:11::i;:::-;34348:12;34340:41;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;34838:4:::2;34825:10;;:17;;;;;;;;;;;;;;;;;;34858:11;;;;;;;;;;34760:117::o:0;52403:341::-;52484:4;52523:17;52531:8;52523:7;:17::i;:::-;52509:31;;:10;:31;;;52501:40;;;;;;52586:5;52562:29;;:20;52573:8;52562:10;:20::i;:::-;:29;;;52554:38;;;;;;52629:14;52607:9;:19;52617:8;52607:19;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;52675:10;52661:51;;;52687:8;52697:14;52661:51;;;;;;;;;;;;;;;;;;;;;;;;;;52732:4;52725:11;;52403:341;;;;:::o;43264:266::-;43379:12;:10;:12::i;:::-;43367:24;;:8;:24;;;;43359:33;;;;;;43450:8;43405:18;:32;43424:12;:10;:12::i;:::-;43405:32;;;;;;;;;;;;;;;:42;43438:8;43405:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;43503:8;43474:48;;43489:12;:10;:12::i;:::-;43474:48;;;43513:8;43474:48;;;;;;;;;;;;;;;;;;;;43264:266;;:::o;44424:282::-;44556:41;44575:12;:10;:12::i;:::-;44589:7;44556:18;:41::i;:::-;44548:50;;;;;;44636:5;44613:28;;:19;44624:7;44613:10;:19::i;:::-;:28;;;44605:37;;;;;;44659:39;44673:4;44679:2;44683:7;44692:5;44659:13;:39::i;:::-;44424:282;;;;:::o;54411:87::-;54472:21;54484:8;54472:11;:21::i;:::-;54411:87;:::o;49964:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;52754:477::-;52824:4;52869:5;52845:29;;:20;52856:8;52845:10;:20::i;:::-;:29;;;52837:38;;;;;;52888:13;52904:5;:15;52910:8;52904:15;;;;;;;;;;;;52888:31;;52952:17;52960:8;52952:7;:17::i;:::-;52938:31;;:10;:31;;;52930:40;;;;;;53003:6;52985:5;:15;52991:8;52985:15;;;;;;;;;;;:24;;;;53033:10;53019:41;;;53045:8;53055:4;53019:41;;;;;;;;;;;;;;;;;;;;;;;;;;53096:4;53073:27;;:9;:19;53083:8;53073:19;;;;;;;;;;;;;;;;;;;;;:27;;;53069:133;;53130:4;53108:9;:19;53118:8;53108:19;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;53157:10;53145:51;;;53169:8;53179:6;53187:8;53145:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53069:133;53219:4;53212:11;;;52754:477;;;;:::o;35504:193::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35583:3:::1;35571:8;:15;;35563:48;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35643:8;35626:14;:25;;;;35667:22;35680:8;35667:22;;;;;;;;;;;;;;;;;;35504:193:::0;:::o;41338:741::-;41411:13;41445:16;41453:7;41445;:16::i;:::-;41437:25;;;;;;41475:23;41501:10;:19;41512:7;41501:19;;;;;;;;;;;41475:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41531:18;41552:9;:7;:9::i;:::-;41531:30;;41659:1;41643:4;41637:18;:23;41633:72;;;41684:9;41677:16;;;;;;41633:72;41835:1;41815:9;41809:23;:27;41805:108;;;41884:4;41890:9;41867:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41853:48;;;;;;41805:108;42045:4;42051:18;:7;:16;:18::i;:::-;42028:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42014:57;;;;41338:741;;;;:::o;35163:143::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34689:17:::1;:15;:17::i;:::-;34681:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35258:5:::2;35239:16;;:24;;;;;;;;;;;;;;;;;;35279:19;;;;;;;;;;35163:143::o:0;53855:220::-;53979:5;53956:28;;:9;:19;53966:8;53956:19;;;;;;;;;;;;;;;;;;;;;:28;;;53948:37;;;;;;54020:47;54035:8;54044:9;54054:12;54020:14;:47::i;:::-;53855:220;;;:::o;35014:141::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34573:17:::1;:15;:17::i;:::-;34572:18;34564:47;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35110:4:::2;35091:16;;:23;;;;;;;;;;;;;;;;;;35130:17;;;;;;;;;;35014:141::o:0;50822:273::-;50873:14;50883:3;50873:9;:14::i;:::-;50900:22;50925:12;50933:3;50925:7;:12::i;:::-;50900:37;;50948:17;50968:10;50948:30;;50991:11;50998:3;50991:6;:11::i;:::-;51045:9;51020:67;;51029:14;51020:67;;;51056:5;:10;51062:3;51056:10;;;;;;;;;;;;51068:3;51073:13;51082:3;51073:8;:13::i;:::-;51020:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50822:273;;;:::o;43602:164::-;43699:4;43723:18;:25;43742:5;43723:25;;;;;;;;;;;;;;;:35;43749:8;43723:35;;;;;;;;;;;;;;;;;;;;;;;;;43716:42;;43602:164;;;;:::o;49043:196::-;49110:4;49120:19;49143:6;:16;49150:8;49143:16;;;;;;;;;;;49120:39;;49186:4;49167:23;;:5;:15;;;;;;;;;;;;:23;;;49164:51;;49204:5;49197:12;;;;;49164:51;49230:4;49223:11;;;49043:196;;;;:::o;1002:289::-;1100:12;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1158:1:::1;1138:22;;:8;:22;;;;1130:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1255:28;1274:8;1255:18;:28::i;:::-;1245:38;;1002:289:::0;;;:::o;37444:127::-;37509:4;37533:30;37555:7;37533:12;:21;;:30;;;;:::i;:::-;37526:37;;37444:127;;;:::o;68:98::-;121:7;148:10;141:17;;68:98;:::o;40425:178::-;40519:2;40492:15;:24;40508:7;40492:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40569:7;40565:2;40537:40;;40546:17;40555:7;40546:8;:17::i;:::-;40537:40;;;;;;;;;;;;40425:178;;:::o;29576:123::-;29645:7;29672:19;29680:3;:10;;29672:7;:19::i;:::-;29665:26;;29576:123;;;:::o;37579:296::-;37672:4;37697:16;37705:7;37697;:16::i;:::-;37689:25;;;;;;37725:13;37741:17;37750:7;37741:8;:17::i;:::-;37725:33;;37788:5;37777:16;;:7;:16;;;:51;;;;37821:7;37797:31;;:20;37809:7;37797:11;:20::i;:::-;:31;;;37777:51;:89;;;;37832:18;:25;37851:5;37832:25;;;;;;;;;;;;;;;:34;37858:7;37832:34;;;;;;;;;;;;;;;;;;;;;;;;;37777:89;37769:98;;;37579:296;;;;:::o;39032:490::-;39151:4;39130:25;;:17;39139:7;39130:8;:17::i;:::-;:25;;;39122:34;;;;;;39189:1;39175:16;;:2;:16;;;;39167:25;;;;;;39205:39;39226:4;39232:2;39236:7;39205:20;:39::i;:::-;39309:29;39326:1;39330:7;39309:8;:29::i;:::-;39351:35;39378:7;39351:13;:19;39365:4;39351:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;39397:30;39419:7;39397:13;:17;39411:2;39397:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;39440:29;39457:7;39466:2;39440:12;:16;;:29;;;;;:::i;:::-;;39506:7;39502:2;39487:27;;39496:4;39487:27;;;;;;;;;;;;39032:490;;;:::o;22186:137::-;22257:7;22292:22;22296:3;:10;;22308:5;22292:3;:22::i;:::-;22284:31;;22277:38;;22186:137;;;;:::o;48859:175::-;48947:29;;;;;;;;48953:5;48947:29;;;;;;48968:1;48947:29;;;;;;48972:1;48947:29;;;;48974:1;48947:29;;;48928:6;:16;48935:8;48928:16;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49004:25;;;;;;;;49008:5;49004:25;;;;;;49023:1;49004:25;;;;;;49027:1;49004:25;;;48987:4;:14;48992:8;48987:14;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48859:175;:::o;38549:475::-;38609:13;38625:17;38634:7;38625:8;:17::i;:::-;38609:33;;38673:48;38694:5;38709:1;38713:7;38673:20;:48::i;:::-;38734:29;38751:1;38755:7;38734:8;:29::i;:::-;38817:1;38786:10;:19;38797:7;38786:19;;;;;;;;;;;38780:33;;;;;;;;;;;;;;;;:38;38776:97;;38842:10;:19;38853:7;38842:19;;;;;;;;;;;;38835:26;;;;:::i;:::-;38776:97;38885:36;38913:7;38885:13;:20;38899:5;38885:20;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;;38934:28;38954:7;38934:12;:19;;:28;;;;:::i;:::-;;39008:7;39004:1;38980:36;;38989:5;38980:36;;;;;;;;;;;;38549:475;;:::o;46381:817::-;46465:10;46443:32;;:18;46452:8;46443;:18::i;:::-;:32;;;;46435:41;;;;;;46503:19;46526:6;:16;46533:8;46526:16;;;;;;;;;;;46503:39;;46573:5;:13;;;46555:15;:31;46547:40;;;;;;46647:5;:14;;;46634:9;:27;;46626:36;;;;;;46735:20;46758:4;:14;46763:8;46758:14;;;;;;;;;;;46735:37;;46797:8;:14;;;46785:9;:26;46777:35;;;;;;46924:1;46907:8;:14;;;:18;46903:183;;;46988:22;47021:8;:15;;;;;;;;;;;;46988:49;;47043:6;:15;;:31;47059:8;:14;;;47043:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46903:183;;47117:32;;;;;;;;47121:4;47117:32;;;;;;47127:10;47117:32;;;;;;47139:9;47117:32;;;47100:4;:14;47105:8;47100:14;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47163:27;47171:8;47180:9;47163:27;;;;;;;;;;;;;;;;;;;;;;;;46381:817;;;:::o;30039:236::-;30119:7;30128;30149:11;30162:13;30179:22;30183:3;:10;;30195:5;30179:3;:22::i;:::-;30148:53;;;;30228:3;30220:12;;30258:5;30250:14;;30212:55;;;;;;30039:236;;;;;:::o;39705:100::-;39789:8;39778;:19;;;;;;;;;;;;:::i;:::-;;39705:100;:::o;37083:126::-;37149:7;37176:25;37193:7;37176:12;:16;;:25;;;;:::i;:::-;37169:32;;37083:126;;;:::o;21727:114::-;21787:7;21814:19;21822:3;:10;;21814:7;:19::i;:::-;21807:26;;21727:114;;;:::o;1437:193::-;1501:12;1560:8;1531:38;;1552:6;;;;;;;;;;;1531:38;;;;;;;;;;;;1589:8;1580:6;;:17;;;;;;;;;;;;;;;;;;1618:4;1608:14;;1437:193;;;:::o;37883:110::-;37959:26;37969:2;37973:7;37959:26;;;;;;;;;;;;:9;:26::i;:::-;37883:110;;:::o;39530:167::-;39630:16;39638:7;39630;:16::i;:::-;39622:25;;;;;;39680:9;39658:10;:19;39669:7;39658:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;39530:167;;:::o;45353:477::-;45481:10;45459:32;;:18;45468:8;45459;:18::i;:::-;:32;;;45451:41;;;;;;45532:19;45555:6;:16;45562:8;45555:16;;;;;;;;;;;45532:39;;45603:4;45584:23;;:5;:15;;;;;;;;;;;;:23;;;;45576:32;;;;;;45673:65;;;;;;;;45679:4;45673:65;;;;;;45685:10;45673:65;;;;;;45697:9;45673:65;;;;45725:12;45707:15;:30;45673:65;;;45654:6;:16;45661:8;45654:16;;;;;;;;;;;:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45762:10;45748:77;;;45774:8;45784:9;45812:12;45794:15;:30;45748:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45353:477;;;;:::o;45856:499::-;45955:10;45933:32;;:18;45942:8;45933;:18::i;:::-;:32;;;45925:41;;;;;;46010:19;46033:6;:16;46040:8;46033:16;;;;;;;;;;;46010:39;;46083:4;46064:23;;:5;:15;;;;;;;;;;;;:23;;;46056:32;;;;;;46132:15;46150:4;:14;46155:8;46150:14;;;;;;;;;;;46132:32;;46193:4;46179:18;;:3;:10;;;;;;;;;;;;:18;;;;46171:27;;;;;;46277:29;;;;;;;;46283:5;46277:29;;;;;;46290:10;46277:29;;;;;;46302:1;46277:29;;;;46304:1;46277:29;;;46258:6;:16;46265:8;46258:16;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46324:23;46338:8;46324:23;;;;;;;;;;;;;;;;;;45856:499;;;:::o;47225:740::-;47285:19;47308:6;:16;47315:8;47308:16;;;;;;;;;;;47285:39;;47356:4;47337:23;;:5;:15;;;;;;;;;;;;:23;;;47329:32;;;;;;47426:5;:13;;;47408:15;:31;47400:40;;;;;;47487:15;47505:4;:14;47510:8;47505:14;;;;;;;;;;;47487:32;;47546:4;47532:18;;:3;:10;;;;;;;;;;;;:18;;;47524:27;;;;;;47578:10;47564:24;;:3;:10;;;;;;;;;;;;:24;;;47556:33;;;;;;47637:22;47670:3;:10;;;;;;;;;;;;47637:44;;47686:22;47719:5;:12;;;;;;;;;;;;47686:46;;47744:14;47791:4;47773:15;:13;:15::i;:::-;47761:3;:9;;;:27;:34;;;;;;47744:51;;47801:6;:15;;:38;47829:9;47817:3;:9;;;:21;47801:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47845:6;:15;;:26;47861:9;47845:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47899:25;;;;;;;;47903:5;47899:25;;;;;;47918:1;47899:25;;;;;;47922:1;47899:25;;;47882:4;:14;47887:8;47882:14;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47938:19;47948:8;47938:19;;;;;;;;;;;;;;;;;;47225:740;;;;;;:::o;37218:218::-;37332:28;37342:4;37348:2;37352:7;37332:9;:28::i;:::-;37379:48;37402:4;37408:2;37412:7;37421:5;37379:22;:48::i;:::-;37371:57;;;;;;37218:218;;;;:::o;47991:858::-;48058:19;48081:6;:16;48088:8;48081:16;;;;;;;;;;;48058:39;;48129:5;:13;;;48110:15;:32;;48102:41;;;;;;48220:4;48201:23;;:5;:15;;;;;;;;;;;;:23;;;48193:32;;;;;;48269:22;48302:18;48311:8;48302;:18::i;:::-;48269:52;;48330:15;48348:4;:14;48353:8;48348:14;;;;;;;;;;;48330:32;;48367:45;48377:5;:12;;;;;;;;;;;;48391:3;:10;;;;;;;;;;;;48403:8;48367:9;:45::i;:::-;48449:21;48497:4;48485:9;:7;:9::i;:::-;48473:3;:9;;;:21;:28;;;;;;48449:52;;48507:17;48539:16;48527:3;:9;;;:28;48507:48;;48566:6;:15;;:29;48582:12;48566:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48643;48683:6;;;;;;;;;;;48643:47;;48696:13;:22;;:40;48719:16;48696:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48786:30;48797:8;48806:3;:9;;;48786:30;;;;;;;;;;;;;;;;;;;;;;;;48821:23;48835:8;48821:13;:23::i;:::-;47991:858;;;;;;;:::o;31660:746::-;31716:13;31946:1;31937:5;:10;31933:53;;;31964:10;;;;;;;;;;;;;;;;;;;;;31933:53;31996:12;32011:5;31996:20;;32027:14;32052:78;32067:1;32059:4;:9;32052:78;;32085:8;;;;;;;32116:2;32108:10;;;;;;;;;32052:78;;;32140:19;32172:6;32162:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32140:39;;32190:13;32215:1;32206:6;:10;32190:26;;32234:5;32227:12;;32250:117;32265:1;32257:4;:9;32250:117;;32326:2;32319:4;:9;;;;;;32314:2;:14;32301:29;;32283:6;32290:7;;;;;;;32283:15;;;;;;;;;;;:47;;;;;;;;;;;32353:2;32345:10;;;;;;;;;32250:117;;;32391:6;32377:21;;;;;;31660:746;;;;:::o;51103:244::-;51152:17;51172:9;:14;51182:3;51172:14;;;;;;;;;;;;;;;;;;;;;51152:34;;51205:12;51213:3;51205:7;:12::i;:::-;51197:21;;;;;;51237:12;51229:21;;;;;;51282:5;:10;51288:3;51282:10;;;;;;;;;;;;51269:9;:23;;51261:32;;;;;;51326:12;51334:3;51326:7;:12::i;:::-;51312:26;;:10;:26;;;;51304:35;;;;;;51103:244;;:::o;51355:685::-;51401:29;51441:6;;;;;;;;;;;51401:47;;51459:22;51492:10;51459:44;;51514:22;51547:12;51555:3;51547:7;:12::i;:::-;51514:46;;51573:30;51583:6;51591;51599:3;51573:9;:30::i;:::-;51617:21;51666:4;51654:9;:7;:9::i;:::-;51641:5;:10;51647:3;51641:10;;;;;;;;;;;;:22;:29;;;;;;51617:53;;51676:17;51709:16;51696:5;:10;51702:3;51696:10;;;;;;;;;;;;:29;51676:49;;51733:6;:15;;:29;51749:12;51733:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51768:13;:22;;:40;51791:16;51768:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51920:5;:10;51926:3;51920:10;;;;;;;;;;;;51908:9;:22;51904:94;;;51947:6;:15;;:39;51975:5;:10;51981:3;51975:10;;;;;;;;;;;;51963:9;:22;51947:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51904:94;52027:5;52010:9;:14;52020:3;52010:14;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;51355:685;;;;;;:::o;29336:151::-;29420:4;29444:35;29454:3;:10;;29474:3;29466:12;;29444:9;:35::i;:::-;29437:42;;29336:151;;;;:::o;26147:110::-;26203:7;26230:3;:12;;:19;;;;26223:26;;26147:110;;;:::o;40610:120::-;40715:8;:6;:8::i;:::-;40714:9;40706:18;;;;;;40610:120;;;:::o;21270:137::-;21340:4;21364:35;21372:3;:10;;21392:5;21384:14;;21364:7;:35::i;:::-;21357:42;;21270:137;;;;:::o;20962:131::-;21029:4;21053:32;21058:3;:10;;21078:5;21070:14;;21053:4;:32::i;:::-;21046:39;;20962:131;;;;:::o;28757:185::-;28846:4;28870:64;28875:3;:10;;28895:3;28887:12;;28925:5;28909:23;;28901:32;;28870:4;:64::i;:::-;28863:71;;28757:185;;;;;:::o;17209:204::-;17276:7;17325:5;17304:3;:11;;:18;;;;:26;17296:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17387:3;:11;;17399:5;17387:18;;;;;;;;;;;;;;;;17380:25;;17209:204;;;;:::o;29109:142::-;29186:4;29210:33;29218:3;:10;;29238:3;29230:12;;29210:7;:33::i;:::-;29203:40;;29109:142;;;;:::o;26613:279::-;26680:7;26689;26739:5;26717:3;:12;;:19;;;;:27;26709:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26796:22;26821:3;:12;;26834:5;26821:19;;;;;;;;;;;;;;;;;;26796:44;;26859:5;:10;;;26871:5;:12;;;26851:33;;;;;26613:279;;;;;:::o;30868:171::-;30947:7;30998:30;31003:3;:10;;31023:3;31015:12;;30998:4;:30::i;:::-;30990:39;;30967:64;;30868:171;;;;:::o;16755:109::-;16811:7;16838:3;:11;;:18;;;;16831:25;;16755:109;;;:::o;38001:196::-;38097:18;38103:2;38107:7;38097:5;:18::i;:::-;38134:54;38165:1;38169:2;38173:7;38182:5;38134:22;:54::i;:::-;38126:63;;;;;;38001:196;;;:::o;39813:604::-;39934:4;39961:15;:2;:13;;;:15::i;:::-;39956:60;;40000:4;39993:11;;;;39956:60;40026:23;40052:252;40105:45;;;40165:12;:10;:12::i;:::-;40192:4;40211:7;40233:5;40068:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40052:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;40026:278;;40315:13;40342:10;40331:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40315:48;;36146:10;40392:16;;40382:26;;;:6;:26;;;;40374:35;;;;39813:604;;;;;;;:::o;25926:125::-;25997:4;26042:1;26021:3;:12;;:17;26034:3;26021:17;;;;;;;;;;;;:22;;26014:29;;25926:125;;;;:::o;14908:1544::-;14974:4;15092:18;15113:3;:12;;:19;15126:5;15113:19;;;;;;;;;;;;15092:40;;15163:1;15149:10;:15;15145:1300;;15511:21;15548:1;15535:10;:14;15511:38;;15564:17;15605:1;15584:3;:11;;:18;;;;:22;15564:42;;15851:17;15871:3;:11;;15883:9;15871:22;;;;;;;;;;;;;;;;15851:42;;16017:9;15988:3;:11;;16000:13;15988:26;;;;;;;;;;;;;;;:38;;;;16136:1;16120:13;:17;16094:3;:12;;:23;16107:9;16094:23;;;;;;;;;;;:43;;;;16246:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;16341:3;:12;;:19;16354:5;16341:19;;;;;;;;;;;16334:26;;;16384:4;16377:11;;;;;;;;15145:1300;16428:5;16421:12;;;14908:1544;;;;;:::o;14317:414::-;14380:4;14402:21;14412:3;14417:5;14402:9;:21::i;:::-;14397:327;;14440:3;:11;;14457:5;14440:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14623:3;:11;;:18;;;;14601:3;:12;;:19;14614:5;14601:19;;;;;;;;;;;:40;;;;14663:4;14656:11;;;;14397:327;14707:5;14700:12;;14317:414;;;;;:::o;23424:692::-;23500:4;23616:16;23635:3;:12;;:17;23648:3;23635:17;;;;;;;;;;;;23616:36;;23681:1;23669:8;:13;23665:444;;;23736:3;:12;;23754:38;;;;;;;;23771:3;23754:38;;;;23784:5;23754:38;;;23736:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23951:3;:12;;:19;;;;23931:3;:12;;:17;23944:3;23931:17;;;;;;;;;;;:39;;;;23992:4;23985:11;;;;;23665:444;24065:5;24029:3;:12;;24053:1;24042:8;:12;24029:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;24092:5;24085:12;;;23424:692;;;;;;:::o;24292:1549::-;24356:4;24472:16;24491:3;:12;;:17;24504:3;24491:17;;;;;;;;;;;;24472:36;;24537:1;24525:8;:13;24521:1313;;24886:21;24921:1;24910:8;:12;24886:36;;24937:17;24979:1;24957:3;:12;;:19;;;;:23;24937:43;;25225:26;25254:3;:12;;25267:9;25254:23;;;;;;;;;;;;;;;;;;25225:52;;25402:9;25372:3;:12;;25385:13;25372:27;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;;25526:1;25510:13;:17;25479:3;:12;;:28;25492:9;:14;;;25479:28;;;;;;;;;;;:48;;;;25636:3;:12;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25732:3;:12;;:17;25745:3;25732:17;;;;;;;;;;;25725:24;;;25773:4;25766:11;;;;;;;;24521:1313;25817:5;25810:12;;;24292:1549;;;;;:::o;27511:311::-;27577:7;27597:16;27616:3;:12;;:17;27629:3;27616:17;;;;;;;;;;;;27597:36;;27664:1;27652:8;:13;;27644:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27754:3;:12;;27778:1;27767:8;:12;27754:26;;;;;;;;;;;;;;;;;;:33;;;27747:40;;;27511:311;;;;:::o;38205:336::-;38299:1;38285:16;;:2;:16;;;;38277:25;;;;;;38322:16;38330:7;38322;:16::i;:::-;38321:17;38313:26;;;;;;38352:45;38381:1;38385:2;38389:7;38352:20;:45::i;:::-;38410:30;38432:7;38410:13;:17;38424:2;38410:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;38453:29;38470:7;38479:2;38453:12;:16;;:29;;;;;:::i;:::-;;38525:7;38521:2;38500:33;;38517:1;38500:33;;;;;;;;;;;;38205:336;;:::o;11217:176::-;11277:4;11296:12;11350:7;11338:20;11330:28;;11384:1;11377:4;:8;11370:15;;;11217:176;;;:::o;11909:195::-;12012:12;12044:52;12066:6;12074:4;12080:1;12083:12;12044:21;:52::i;:::-;12037:59;;11909:195;;;;;:::o;16539:129::-;16612:4;16659:1;16636:3;:12;;:19;16649:5;16636:19;;;;;;;;;;;;:24;;16629:31;;16539:129;;;;:::o;12346:530::-;12473:12;12531:5;12506:21;:30;;12498:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12598:18;12609:6;12598:10;:18::i;:::-;12590:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12724:12;12738:23;12765:6;:11;;12785:5;12793:4;12765:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12723:75;;;;12816:52;12834:7;12843:10;12855:12;12816:17;:52::i;:::-;12809:59;;;;12346:530;;;;;;:::o;12884:515::-;12999:12;13028:7;13024:368;;;13059:10;13052:17;;;;13024:368;13126:1;13106:10;:17;:21;13102:279;;;13209:10;13203:17;13270:15;13257:10;13253:2;13249:19;13242:44;13157:148;13352:12;13345:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12884:515;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://85dca7bd110e0ef876530aefcd305195d7b7ad31ea214f2ca2afb6441935c0ad
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.