ETH Price: $3,650.86 (+2.02%)

Token

ERC-20: Generatives (GEN)
 

Overview

Max Total Supply

1,499 GEN

Holders

313

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 GEN
0x54e44b2185a7e2217d2a110a3ee8025bfa56349c
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:
Generatives

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-23
*/

pragma solidity >=0.6.0 <0.8.0;

abstract contract Context {

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

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

pragma solidity >=0.6.0 <0.8.0;

interface IERC165 {

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

pragma solidity >=0.6.2 <0.8.0;

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

pragma solidity >=0.6.2 <0.8.0;

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);


    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

pragma solidity >=0.6.2 <0.8.0;

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

pragma solidity >=0.6.0 <0.8.0;

interface IERC721Receiver {

    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

pragma solidity >=0.6.0 <0.8.0;

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

pragma solidity >=0.6.0 <0.8.0;

library SafeMath {
   
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

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

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

pragma solidity >=0.6.2 <0.8.0;

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

        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

library EnumerableSet {

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

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) { // Equivalent to contains(set, value)
         
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            bytes32 lastvalue = set._values[lastIndex];

            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = toDeleteIndex + 1; 
            set._values.pop();

            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.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;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }
    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

pragma solidity >=0.6.0 <0.8.0;

library EnumerableMap {
    
    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        MapEntry[] _entries;

        mapping (bytes32 => uint256) _indexes;
    }

    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    function _remove(Map storage map, bytes32 key) private returns (bool) {
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { 

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;
        
            MapEntry storage lastEntry = map._entries[lastIndex];

            map._entries[toDeleteIndex] = lastEntry;
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            map._entries.pop();

            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }


    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    function _length(Map storage map) private view returns (uint256) {
        return map._entries.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);
    }

    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
    }

    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
    }

    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
    }

    struct UintToAddressMap {
        Map _inner;
    }

    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

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

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

    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

pragma solidity >=0.6.0 <0.8.0;

library Strings {
   
    function toString(uint256 value) internal pure returns (string memory) {
        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);
    }
    function strConcat(string memory _a, string memory _b) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, "", "", "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory _concatenatedString) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
        bytes memory babcde = bytes(abcde);
        uint k = 0;
        uint i = 0;
        for (i = 0; i < _ba.length; i++) {
            babcde[k++] = _ba[i];
        }
        for (i = 0; i < _bb.length; i++) {
            babcde[k++] = _bb[i];
        }
        for (i = 0; i < _bc.length; i++) {
            babcde[k++] = _bc[i];
        }
        for (i = 0; i < _bd.length; i++) {
            babcde[k++] = _bd[i];
        }
        for (i = 0; i < _be.length; i++) {
            babcde[k++] = _be[i];
        }
        return string(babcde);
    }

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }
}

pragma solidity >=0.6.0 <0.8.0;

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

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

    EnumerableMap.UintToAddressMap private _tokenOwners;

    mapping (uint256 => address) private _tokenApprovals;

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

    string private _name;

    string private _symbol;

    mapping (uint256 => string) private _tokenURIs;

    string private _baseURI;

    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_) public {
        _name = name_;
        _symbol = symbol_;

        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _holderTokens[owner].length();
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

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

    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), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, 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), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.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(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        _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), "ERC721Metadata: URI set of nonexistent token");
        _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 virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
    }

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

pragma solidity >=0.6.0 <0.8.0;

abstract contract Ownable is Context {
    address private _owner;

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

    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

pragma solidity 0.7.0;

contract Generatives is ERC721, Ownable {
    constructor() ERC721("Generatives", "GEN") {
    }
    
    using SafeMath for uint256;
    
    struct Project {
        string name;
        uint256 pricePerTokenInWei;
        string projectBaseURI;
        string projectBaseIpfsURI;
        uint256 invocations;
        uint256 maxInvocations;
    }
    uint256 constant ONE_MILLION = 1000000;
    uint256 public nextProjectId;
    mapping(uint256 => Project) projects;
    mapping(uint256 => uint256) public tokenIdToProjectId;
    mapping(uint256 => uint256[]) internal projectIdToTokenIds;


    
    function addProject(string memory _projectname, uint256 _pricePerTokenInWei, uint256 _maxInvocations, string memory _projectBaseURI) public onlyOwner {

        uint256 projectId = nextProjectId;
        projects[projectId].name = _projectname;
        projects[projectId].pricePerTokenInWei = _pricePerTokenInWei;
        projects[projectId].maxInvocations = _maxInvocations;
        projects[projectId].projectBaseURI = _projectBaseURI;
        _setBaseURI(_projectBaseURI);
        nextProjectId = nextProjectId.add(1);
    }

    function purchaseToken(uint256 _projectId, uint numberOfTokens) public payable {
        require(projects[_projectId].invocations.add(numberOfTokens) <= projects[_projectId].maxInvocations, "Purchase would exceed max supply of Tokens");
        require(projects[_projectId].pricePerTokenInWei.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");
        for(uint i = 0; i < numberOfTokens; i++) {
            _mintTokens(msg.sender, _projectId);
        }
    }

    function _mintTokens(address _to, uint256 _projectId) internal {

        uint256 tokenIdToBe = (_projectId * ONE_MILLION) + projects[_projectId].invocations;
        _safeMint(_to, tokenIdToBe);
        projects[_projectId].invocations = projects[_projectId].invocations.add(1);
        tokenIdToProjectId[tokenIdToBe] = _projectId;
        projectIdToTokenIds[_projectId].push(tokenIdToBe);
    }
    
    function projectDetails(uint256 _projectId) view public returns (string memory projectName,  uint256 pricePerTokenInWei, uint256 maxInvocations, string memory projectBaseURI) {
        projectName = projects[_projectId].name;
        pricePerTokenInWei = projects[_projectId].pricePerTokenInWei;
        maxInvocations = projects[_projectId].maxInvocations;
        projectBaseURI = projects[_projectId].projectBaseURI;
    }
    
    function updateProjectPricePerTokenInWei(uint256 _projectId, uint256 _pricePerTokenInWei) public onlyOwner {
        projects[_projectId].pricePerTokenInWei = _pricePerTokenInWei;
    }
    
    function updateProjectMaxInvocations(uint256 _projectId, uint256 _maxInvocations) public onlyOwner {
        require(_maxInvocations > projects[_projectId].invocations, "You must set max invocations greater than current invocations");
        projects[_projectId].maxInvocations = _maxInvocations;
    }
    
    function updateProjectBaseURI(uint256 _projectId, string memory _newBaseURI) public onlyOwner {
        projects[_projectId].projectBaseURI = _newBaseURI;
    }
    
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        return Strings.strConcat(projects[tokenIdToProjectId[_tokenId]].projectBaseURI, Strings.uint2str(_tokenId));
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        msg.sender.transfer(balance);
    }
    

}

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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"_projectname","type":"string"},{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"},{"internalType":"uint256","name":"_maxInvocations","type":"uint256"},{"internalType":"string","name":"_projectBaseURI","type":"string"}],"name":"addProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProjectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectDetails","outputs":[{"internalType":"string","name":"projectName","type":"string"},{"internalType":"uint256","name":"pricePerTokenInWei","type":"uint256"},{"internalType":"uint256","name":"maxInvocations","type":"uint256"},{"internalType":"string","name":"projectBaseURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchaseToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"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":"uint256","name":"","type":"uint256"}],"name":"tokenIdToProjectId","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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"updateProjectBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_maxInvocations","type":"uint256"}],"name":"updateProjectMaxInvocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"}],"name":"updateProjectPricePerTokenInWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600b81526020017f47656e65726174697665730000000000000000000000000000000000000000008152506040518060400160405280600381526020017f47454e0000000000000000000000000000000000000000000000000000000000815250620000966301ffc9a760e01b620001c960201b60201c565b8160069080519060200190620000ae929190620002da565b508060079080519060200190620000c7929190620002da565b50620000e06380ac58cd60e01b620001c960201b60201c565b620000f8635b5e139f60e01b620001c960201b60201c565b6200011063780e9d6360e01b620001c960201b60201c565b5050600062000124620002d260201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000380565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200031d57805160ff19168380011785556200034e565b828001600101855582156200034e579182015b828111156200034d57825182559160200191906001019062000330565b5b5090506200035d919062000361565b5090565b5b808211156200037c57600081600090555060010162000362565b5090565b6140d380620003906000396000f3fe6080604052600436106101c25760003560e01c80636352211e116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd14610db2578063e935b7b114610e66578063e985e9c514610e91578063f2fde38b14610f18576101c2565b806395d89b4114610b6e57806397dc86cf14610bfe578063a22cb46514610c43578063b88d4fde14610ca0576101c2565b8063715018a6116100d1578063715018a6146109a3578063826fc391146109ba5780638da5cb5b146109ff5780638dd91a5614610a40576101c2565b80636352211e146108495780636c0360eb146108ae57806370a082311461093e576101c2565b80632cc238d5116101645780633ccfd60b1161013e5780633ccfd60b146106965780633e48e848146106ad57806342842e0e1461077f5780634f6ccce7146107fa576101c2565b80632cc238d51461047c5780632f745c59146105ef578063301c5b901461065e576101c2565b8063095ea7b3116101a0578063095ea7b31461032c57806318160ddd146103875780631b689c0b146103b257806323b872dd14610401576101c2565b806301ffc9a7146101c757806306fdde0314610237578063081812fc146102c7575b600080fd5b3480156101d357600080fd5b5061021f600480360360208110156101ea57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610f69565b60405180821515815260200191505060405180910390f35b34801561024357600080fd5b5061024c610fd0565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561028c578082015181840152602081019050610271565b50505050905090810190601f1680156102b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102d357600080fd5b50610300600480360360208110156102ea57600080fd5b8101908080359060200190929190505050611072565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561033857600080fd5b506103856004803603604081101561034f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061110d565b005b34801561039357600080fd5b5061039c611251565b6040518082815260200191505060405180910390f35b3480156103be57600080fd5b506103eb600480360360208110156103d557600080fd5b8101908080359060200190929190505050611262565b6040518082815260200191505060405180910390f35b34801561040d57600080fd5b5061047a6004803603606081101561042457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061127a565b005b34801561048857600080fd5b506105ed6004803603608081101561049f57600080fd5b81019080803590602001906401000000008111156104bc57600080fd5b8201836020820111156104ce57600080fd5b803590602001918460018302840111640100000000831117156104f057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291908035906020019064010000000081111561056757600080fd5b82018360208201111561057957600080fd5b8035906020019184600183028401116401000000008311171561059b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506112f0565b005b3480156105fb57600080fd5b506106486004803603604081101561061257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061145e565b6040518082815260200191505060405180910390f35b6106946004803603604081101561067457600080fd5b8101908080359060200190929190803590602001909291905050506114b9565b005b3480156106a257600080fd5b506106ab611615565b005b3480156106b957600080fd5b5061077d600480360360408110156106d057600080fd5b8101908080359060200190929190803590602001906401000000008111156106f757600080fd5b82018360208201111561070957600080fd5b8035906020019184600183028401116401000000008311171561072b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611713565b005b34801561078b57600080fd5b506107f8600480360360608110156107a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117f1565b005b34801561080657600080fd5b506108336004803603602081101561081d57600080fd5b8101908080359060200190929190505050611811565b6040518082815260200191505060405180910390f35b34801561085557600080fd5b506108826004803603602081101561086c57600080fd5b8101908080359060200190929190505050611834565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156108ba57600080fd5b506108c361186b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109035780820151818401526020810190506108e8565b50505050905090810190601f1680156109305780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561094a57600080fd5b5061098d6004803603602081101561096157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061190d565b6040518082815260200191505060405180910390f35b3480156109af57600080fd5b506109b86119e2565b005b3480156109c657600080fd5b506109fd600480360360408110156109dd57600080fd5b810190808035906020019092919080359060200190929190505050611b52565b005b348015610a0b57600080fd5b50610a14611c8e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a4c57600080fd5b50610a7960048036036020811015610a6357600080fd5b8101908080359060200190929190505050611cb8565b604051808060200185815260200184815260200180602001838103835287818151815260200191508051906020019080838360005b83811015610ac9578082015181840152602081019050610aae565b50505050905090810190601f168015610af65780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015610b2f578082015181840152602081019050610b14565b50505050905090810190601f168015610b5c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b348015610b7a57600080fd5b50610b83611e5a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc3578082015181840152602081019050610ba8565b50505050905090810190601f168015610bf05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c0a57600080fd5b50610c4160048036036040811015610c2157600080fd5b810190808035906020019092919080359060200190929190505050611efc565b005b348015610c4f57600080fd5b50610c9e60048036036040811015610c6657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611fca565b005b348015610cac57600080fd5b50610db060048036036080811015610cc357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610d2a57600080fd5b820183602082011115610d3c57600080fd5b80359060200191846001830284011164010000000083111715610d5e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612180565b005b348015610dbe57600080fd5b50610deb60048036036020811015610dd557600080fd5b81019080803590602001909291905050506121f8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e2b578082015181840152602081019050610e10565b50505050905090810190601f168015610e585780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e7257600080fd5b50610e7b6122d4565b6040518082815260200191505060405180910390f35b348015610e9d57600080fd5b50610f0060048036036040811015610eb457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122da565b60405180821515815260200191505060405180910390f35b348015610f2457600080fd5b50610f6760048036036020811015610f3b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061236e565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110685780601f1061103d57610100808354040283529160200191611068565b820191906000526020600020905b81548152906001019060200180831161104b57829003601f168201915b5050505050905090565b600061107d82612563565b6110d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613ff7602c913960400191505060405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061111882611834565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561119f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061404c6021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166111be612580565b73ffffffffffffffffffffffffffffffffffffffff1614806111ed57506111ec816111e7612580565b6122da565b5b611242576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180613eec6038913960400191505060405180910390fd5b61124c8383612588565b505050565b600061125d6002612641565b905090565b600d6020528060005260406000206000915090505481565b61128b611285612580565b82612656565b6112e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061406d6031913960400191505060405180910390fd5b6112eb83838361274a565b505050565b6112f8612580565b73ffffffffffffffffffffffffffffffffffffffff16611316611c8e565b73ffffffffffffffffffffffffffffffffffffffff161461139f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600b54905084600c600083815260200190815260200160002060000190805190602001906113d0929190613d34565b5083600c60008381526020019081526020016000206001018190555082600c60008381526020019081526020016000206005018190555081600c60008381526020019081526020016000206002019080519060200190611431929190613d34565b5061143b8261298d565b6114516001600b546129a790919063ffffffff16565b600b819055505050505050565b60006114b182600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a2f90919063ffffffff16565b905092915050565b600c6000838152602001908152602001600020600501546114f982600c6000868152602001908152602001600020600401546129a790919063ffffffff16565b1115611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613e4c602a913960400191505060405180910390fd5b3461157a82600c600086815260200190815260200160002060010154612a4990919063ffffffff16565b11156115ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45746865722076616c75652073656e74206973206e6f7420636f72726563740081525060200191505060405180910390fd5b60005b81811015611610576116033384612acf565b80806001019150506115f1565b505050565b61161d612580565b73ffffffffffffffffffffffffffffffffffffffff1661163b611c8e565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561170f573d6000803e3d6000fd5b5050565b61171b612580565b73ffffffffffffffffffffffffffffffffffffffff16611739611c8e565b73ffffffffffffffffffffffffffffffffffffffff16146117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600c600084815260200190815260200160002060020190805190602001906117ec929190613d34565b505050565b61180c83838360405180602001604052806000815250612180565b505050565b600080611828836002612b9690919063ffffffff16565b50905080915050919050565b600061186482604051806060016040528060298152602001613f4e602991396002612bc29092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119035780601f106118d857610100808354040283529160200191611903565b820191906000526020600020905b8154815290600101906020018083116118e657829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613f24602a913960400191505060405180910390fd5b6119db600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612be1565b9050919050565b6119ea612580565b73ffffffffffffffffffffffffffffffffffffffff16611a08611c8e565b73ffffffffffffffffffffffffffffffffffffffff1614611a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611b5a612580565b73ffffffffffffffffffffffffffffffffffffffff16611b78611c8e565b73ffffffffffffffffffffffffffffffffffffffff1614611c01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600c6000838152602001908152602001600020600401548111611c6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613f99603d913960400191505060405180910390fd5b80600c6000848152602001908152602001600020600501819055505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606000806060600c60008681526020019081526020016000206000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d695780601f10611d3e57610100808354040283529160200191611d69565b820191906000526020600020905b815481529060010190602001808311611d4c57829003601f168201915b50505050509350600c6000868152602001908152602001600020600101549250600c6000868152602001908152602001600020600501549150600c60008681526020019081526020016000206002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e4c5780601f10611e2157610100808354040283529160200191611e4c565b820191906000526020600020905b815481529060010190602001808311611e2f57829003601f168201915b505050505090509193509193565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ef25780601f10611ec757610100808354040283529160200191611ef2565b820191906000526020600020905b815481529060010190602001808311611ed557829003601f168201915b5050505050905090565b611f04612580565b73ffffffffffffffffffffffffffffffffffffffff16611f22611c8e565b73ffffffffffffffffffffffffffffffffffffffff1614611fab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600c6000848152602001908152602001600020600101819055505050565b611fd2612580565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612073576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060056000612080612580565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661212d612580565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b61219161218b612580565b83612656565b6121e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061406d6031913960400191505060405180910390fd5b6121f284848484612bf6565b50505050565b60606122cd600c6000600d60008681526020019081526020016000205481526020019081526020016000206002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122ba5780601f1061228f576101008083540402835291602001916122ba565b820191906000526020600020905b81548152906001019060200180831161229d57829003601f168201915b50505050506122c884612c68565b612dac565b9050919050565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612376612580565b73ffffffffffffffffffffffffffffffffffffffff16612394611c8e565b73ffffffffffffffffffffffffffffffffffffffff161461241d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124a3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613e266026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612579826002612df090919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125fb83611834565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061264f82600001612e0a565b9050919050565b600061266182612563565b6126b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613ec0602c913960400191505060405180910390fd5b60006126c183611834565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061273057508373ffffffffffffffffffffffffffffffffffffffff1661271884611072565b73ffffffffffffffffffffffffffffffffffffffff16145b80612741575061274081856122da565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661276a82611834565b73ffffffffffffffffffffffffffffffffffffffff16146127d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806140236029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561285c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613e766024913960400191505060405180910390fd5b612867838383612e1b565b612872600082612588565b6128c381600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e2090919063ffffffff16565b5061291581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e3a90919063ffffffff16565b5061292c81836002612e549092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80600990805190602001906129a3929190613d34565b5050565b600080828401905083811015612a25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000612a3e8360000183612e89565b60001c905092915050565b600080831415612a5c5760009050612ac9565b6000828402905082848281612a6d57fe5b0414612ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613fd66021913960400191505060405180910390fd5b809150505b92915050565b6000600c600083815260200190815260200160002060040154620f42408302019050612afb8382612f0c565b612b256001600c6000858152602001908152602001600020600401546129a790919063ffffffff16565b600c60008481526020019081526020016000206004018190555081600d600083815260200190815260200160002081905550600e6000838152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055505050565b600080600080612ba98660000186612f2a565b915091508160001c8160001c9350935050509250929050565b6000612bd5846000018460001b84612fc3565b60001c90509392505050565b6000612bef826000016130b9565b9050919050565b612c0184848461274a565b612c0d848484846130ca565b612c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613df46032913960400191505060405180910390fd5b50505050565b60606000821415612cb0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612da7565b600082905060005b60008214612cda578080600101915050600a8281612cd257fe5b049150612cb8565b60608167ffffffffffffffff81118015612cf357600080fd5b506040519080825280601f01601f191660200182016040528015612d265781602001600182028036833780820191505090505b50905060006001830390505b60008614612d9f57600a8681612d4457fe5b0660300160f81b82828060019003935081518110612d5e57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681612d9757fe5b049550612d32565b819450505050505b919050565b6060612de883836040518060200160405280600081525060405180602001604052806000815250604051806020016040528060008152506132e3565b905092915050565b6000612e02836000018360001b6135b5565b905092915050565b600081600001805490509050919050565b505050565b6000612e32836000018360001b6135d8565b905092915050565b6000612e4c836000018360001b6136c0565b905092915050565b6000612e80846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613730565b90509392505050565b600081836000018054905011612eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613dd26022913960400191505060405180910390fd5b826000018281548110612ef957fe5b9060005260206000200154905092915050565b612f2682826040518060200160405280600081525061380c565b5050565b60008082846000018054905011612f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613f776022913960400191505060405180910390fd5b6000846000018481548110612f9d57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061308a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561304f578082015181840152602081019050613034565b50505050905090810190601f16801561307c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061309d57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006130eb8473ffffffffffffffffffffffffffffffffffffffff1661387d565b6130f857600190506132db565b606061326263150b7a0260e01b61310d612580565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613191578082015181840152602081019050613176565b50505050905090810190601f1680156131be5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001613df4603291398773ffffffffffffffffffffffffffffffffffffffff166138909092919063ffffffff16565b9050600081806020019051602081101561327b57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b60608086905060608690506060869050606086905060608690506060815183518551875189510101010167ffffffffffffffff8111801561332357600080fd5b506040519080825280601f01601f1916602001820160405280156133565781602001600182028036833780820191505090505b5090506060819050600080600090505b88518110156133d45788818151811061337b57fe5b602001015160f81c60f81b83838060010194508151811061339857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613366565b600090505b8751811015613447578781815181106133ee57fe5b602001015160f81c60f81b83838060010194508151811061340b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506133d9565b600090505b86518110156134ba5786818151811061346157fe5b602001015160f81c60f81b83838060010194508151811061347e57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061344c565b600090505b855181101561352d578581815181106134d457fe5b602001015160f81c60f81b8383806001019450815181106134f157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506134bf565b600090505b84518110156135a05784818151811061354757fe5b602001015160f81c60f81b83838060010194508151811061356457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613532565b82995050505050505050505095945050505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146136b4576000600182039050600060018660000180549050039050600086600001828154811061362357fe5b906000526020600020015490508087600001848154811061364057fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061367857fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506136ba565b60009150505b92915050565b60006136cc83836138a8565b61372557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061372a565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156137d757846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613805565b828560000160018303815481106137ea57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b61381683836138cb565b61382360008484846130ca565b613878576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613df46032913960400191505060405180910390fd5b505050565b600080823b905060008111915050919050565b606061389f8484600085613abf565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561396e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b61397781612563565b156139ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b6139f660008383612e1b565b613a4781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e3a90919063ffffffff16565b50613a5e81836002612e549092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606082471015613b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613e9a6026913960400191505060405180910390fd5b613b238561387d565b613b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613be55780518252602082019150602081019050602083039250613bc2565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c47576040519150601f19603f3d011682016040523d82523d6000602084013e613c4c565b606091505b5091509150613c5c828286613c68565b92505050949350505050565b60608315613c7857829050613d2d565b600083511115613c8b5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613cf2578082015181840152602081019050613cd7565b50505050905090810190601f168015613d1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613d7557805160ff1916838001178555613da3565b82800160010185558215613da3579182015b82811115613da2578251825591602001919060010190613d87565b5b509050613db09190613db4565b5090565b5b80821115613dcd576000816000905550600101613db5565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373507572636861736520776f756c6420657863656564206d617820737570706c79206f6620546f6b656e734552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473596f75206d75737420736574206d617820696e766f636174696f6e732067726561746572207468616e2063757272656e7420696e766f636174696f6e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220ede39eb44360161aeec0b81e4944cfa6c7d974e8102c2e2478ce6dcdd712696464736f6c63430007000033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80636352211e116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd14610db2578063e935b7b114610e66578063e985e9c514610e91578063f2fde38b14610f18576101c2565b806395d89b4114610b6e57806397dc86cf14610bfe578063a22cb46514610c43578063b88d4fde14610ca0576101c2565b8063715018a6116100d1578063715018a6146109a3578063826fc391146109ba5780638da5cb5b146109ff5780638dd91a5614610a40576101c2565b80636352211e146108495780636c0360eb146108ae57806370a082311461093e576101c2565b80632cc238d5116101645780633ccfd60b1161013e5780633ccfd60b146106965780633e48e848146106ad57806342842e0e1461077f5780634f6ccce7146107fa576101c2565b80632cc238d51461047c5780632f745c59146105ef578063301c5b901461065e576101c2565b8063095ea7b3116101a0578063095ea7b31461032c57806318160ddd146103875780631b689c0b146103b257806323b872dd14610401576101c2565b806301ffc9a7146101c757806306fdde0314610237578063081812fc146102c7575b600080fd5b3480156101d357600080fd5b5061021f600480360360208110156101ea57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610f69565b60405180821515815260200191505060405180910390f35b34801561024357600080fd5b5061024c610fd0565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561028c578082015181840152602081019050610271565b50505050905090810190601f1680156102b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102d357600080fd5b50610300600480360360208110156102ea57600080fd5b8101908080359060200190929190505050611072565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561033857600080fd5b506103856004803603604081101561034f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061110d565b005b34801561039357600080fd5b5061039c611251565b6040518082815260200191505060405180910390f35b3480156103be57600080fd5b506103eb600480360360208110156103d557600080fd5b8101908080359060200190929190505050611262565b6040518082815260200191505060405180910390f35b34801561040d57600080fd5b5061047a6004803603606081101561042457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061127a565b005b34801561048857600080fd5b506105ed6004803603608081101561049f57600080fd5b81019080803590602001906401000000008111156104bc57600080fd5b8201836020820111156104ce57600080fd5b803590602001918460018302840111640100000000831117156104f057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291908035906020019064010000000081111561056757600080fd5b82018360208201111561057957600080fd5b8035906020019184600183028401116401000000008311171561059b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506112f0565b005b3480156105fb57600080fd5b506106486004803603604081101561061257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061145e565b6040518082815260200191505060405180910390f35b6106946004803603604081101561067457600080fd5b8101908080359060200190929190803590602001909291905050506114b9565b005b3480156106a257600080fd5b506106ab611615565b005b3480156106b957600080fd5b5061077d600480360360408110156106d057600080fd5b8101908080359060200190929190803590602001906401000000008111156106f757600080fd5b82018360208201111561070957600080fd5b8035906020019184600183028401116401000000008311171561072b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611713565b005b34801561078b57600080fd5b506107f8600480360360608110156107a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117f1565b005b34801561080657600080fd5b506108336004803603602081101561081d57600080fd5b8101908080359060200190929190505050611811565b6040518082815260200191505060405180910390f35b34801561085557600080fd5b506108826004803603602081101561086c57600080fd5b8101908080359060200190929190505050611834565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156108ba57600080fd5b506108c361186b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109035780820151818401526020810190506108e8565b50505050905090810190601f1680156109305780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561094a57600080fd5b5061098d6004803603602081101561096157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061190d565b6040518082815260200191505060405180910390f35b3480156109af57600080fd5b506109b86119e2565b005b3480156109c657600080fd5b506109fd600480360360408110156109dd57600080fd5b810190808035906020019092919080359060200190929190505050611b52565b005b348015610a0b57600080fd5b50610a14611c8e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a4c57600080fd5b50610a7960048036036020811015610a6357600080fd5b8101908080359060200190929190505050611cb8565b604051808060200185815260200184815260200180602001838103835287818151815260200191508051906020019080838360005b83811015610ac9578082015181840152602081019050610aae565b50505050905090810190601f168015610af65780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015610b2f578082015181840152602081019050610b14565b50505050905090810190601f168015610b5c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b348015610b7a57600080fd5b50610b83611e5a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc3578082015181840152602081019050610ba8565b50505050905090810190601f168015610bf05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c0a57600080fd5b50610c4160048036036040811015610c2157600080fd5b810190808035906020019092919080359060200190929190505050611efc565b005b348015610c4f57600080fd5b50610c9e60048036036040811015610c6657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611fca565b005b348015610cac57600080fd5b50610db060048036036080811015610cc357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610d2a57600080fd5b820183602082011115610d3c57600080fd5b80359060200191846001830284011164010000000083111715610d5e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612180565b005b348015610dbe57600080fd5b50610deb60048036036020811015610dd557600080fd5b81019080803590602001909291905050506121f8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e2b578082015181840152602081019050610e10565b50505050905090810190601f168015610e585780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e7257600080fd5b50610e7b6122d4565b6040518082815260200191505060405180910390f35b348015610e9d57600080fd5b50610f0060048036036040811015610eb457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122da565b60405180821515815260200191505060405180910390f35b348015610f2457600080fd5b50610f6760048036036020811015610f3b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061236e565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110685780601f1061103d57610100808354040283529160200191611068565b820191906000526020600020905b81548152906001019060200180831161104b57829003601f168201915b5050505050905090565b600061107d82612563565b6110d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613ff7602c913960400191505060405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061111882611834565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561119f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061404c6021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166111be612580565b73ffffffffffffffffffffffffffffffffffffffff1614806111ed57506111ec816111e7612580565b6122da565b5b611242576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180613eec6038913960400191505060405180910390fd5b61124c8383612588565b505050565b600061125d6002612641565b905090565b600d6020528060005260406000206000915090505481565b61128b611285612580565b82612656565b6112e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061406d6031913960400191505060405180910390fd5b6112eb83838361274a565b505050565b6112f8612580565b73ffffffffffffffffffffffffffffffffffffffff16611316611c8e565b73ffffffffffffffffffffffffffffffffffffffff161461139f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600b54905084600c600083815260200190815260200160002060000190805190602001906113d0929190613d34565b5083600c60008381526020019081526020016000206001018190555082600c60008381526020019081526020016000206005018190555081600c60008381526020019081526020016000206002019080519060200190611431929190613d34565b5061143b8261298d565b6114516001600b546129a790919063ffffffff16565b600b819055505050505050565b60006114b182600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a2f90919063ffffffff16565b905092915050565b600c6000838152602001908152602001600020600501546114f982600c6000868152602001908152602001600020600401546129a790919063ffffffff16565b1115611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613e4c602a913960400191505060405180910390fd5b3461157a82600c600086815260200190815260200160002060010154612a4990919063ffffffff16565b11156115ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45746865722076616c75652073656e74206973206e6f7420636f72726563740081525060200191505060405180910390fd5b60005b81811015611610576116033384612acf565b80806001019150506115f1565b505050565b61161d612580565b73ffffffffffffffffffffffffffffffffffffffff1661163b611c8e565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561170f573d6000803e3d6000fd5b5050565b61171b612580565b73ffffffffffffffffffffffffffffffffffffffff16611739611c8e565b73ffffffffffffffffffffffffffffffffffffffff16146117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600c600084815260200190815260200160002060020190805190602001906117ec929190613d34565b505050565b61180c83838360405180602001604052806000815250612180565b505050565b600080611828836002612b9690919063ffffffff16565b50905080915050919050565b600061186482604051806060016040528060298152602001613f4e602991396002612bc29092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119035780601f106118d857610100808354040283529160200191611903565b820191906000526020600020905b8154815290600101906020018083116118e657829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613f24602a913960400191505060405180910390fd5b6119db600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612be1565b9050919050565b6119ea612580565b73ffffffffffffffffffffffffffffffffffffffff16611a08611c8e565b73ffffffffffffffffffffffffffffffffffffffff1614611a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611b5a612580565b73ffffffffffffffffffffffffffffffffffffffff16611b78611c8e565b73ffffffffffffffffffffffffffffffffffffffff1614611c01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600c6000838152602001908152602001600020600401548111611c6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613f99603d913960400191505060405180910390fd5b80600c6000848152602001908152602001600020600501819055505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606000806060600c60008681526020019081526020016000206000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d695780601f10611d3e57610100808354040283529160200191611d69565b820191906000526020600020905b815481529060010190602001808311611d4c57829003601f168201915b50505050509350600c6000868152602001908152602001600020600101549250600c6000868152602001908152602001600020600501549150600c60008681526020019081526020016000206002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e4c5780601f10611e2157610100808354040283529160200191611e4c565b820191906000526020600020905b815481529060010190602001808311611e2f57829003601f168201915b505050505090509193509193565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ef25780601f10611ec757610100808354040283529160200191611ef2565b820191906000526020600020905b815481529060010190602001808311611ed557829003601f168201915b5050505050905090565b611f04612580565b73ffffffffffffffffffffffffffffffffffffffff16611f22611c8e565b73ffffffffffffffffffffffffffffffffffffffff1614611fab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600c6000848152602001908152602001600020600101819055505050565b611fd2612580565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612073576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060056000612080612580565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661212d612580565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b61219161218b612580565b83612656565b6121e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061406d6031913960400191505060405180910390fd5b6121f284848484612bf6565b50505050565b60606122cd600c6000600d60008681526020019081526020016000205481526020019081526020016000206002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122ba5780601f1061228f576101008083540402835291602001916122ba565b820191906000526020600020905b81548152906001019060200180831161229d57829003601f168201915b50505050506122c884612c68565b612dac565b9050919050565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612376612580565b73ffffffffffffffffffffffffffffffffffffffff16612394611c8e565b73ffffffffffffffffffffffffffffffffffffffff161461241d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124a3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613e266026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612579826002612df090919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125fb83611834565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061264f82600001612e0a565b9050919050565b600061266182612563565b6126b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613ec0602c913960400191505060405180910390fd5b60006126c183611834565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061273057508373ffffffffffffffffffffffffffffffffffffffff1661271884611072565b73ffffffffffffffffffffffffffffffffffffffff16145b80612741575061274081856122da565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661276a82611834565b73ffffffffffffffffffffffffffffffffffffffff16146127d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806140236029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561285c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613e766024913960400191505060405180910390fd5b612867838383612e1b565b612872600082612588565b6128c381600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e2090919063ffffffff16565b5061291581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e3a90919063ffffffff16565b5061292c81836002612e549092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80600990805190602001906129a3929190613d34565b5050565b600080828401905083811015612a25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000612a3e8360000183612e89565b60001c905092915050565b600080831415612a5c5760009050612ac9565b6000828402905082848281612a6d57fe5b0414612ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613fd66021913960400191505060405180910390fd5b809150505b92915050565b6000600c600083815260200190815260200160002060040154620f42408302019050612afb8382612f0c565b612b256001600c6000858152602001908152602001600020600401546129a790919063ffffffff16565b600c60008481526020019081526020016000206004018190555081600d600083815260200190815260200160002081905550600e6000838152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055505050565b600080600080612ba98660000186612f2a565b915091508160001c8160001c9350935050509250929050565b6000612bd5846000018460001b84612fc3565b60001c90509392505050565b6000612bef826000016130b9565b9050919050565b612c0184848461274a565b612c0d848484846130ca565b612c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613df46032913960400191505060405180910390fd5b50505050565b60606000821415612cb0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612da7565b600082905060005b60008214612cda578080600101915050600a8281612cd257fe5b049150612cb8565b60608167ffffffffffffffff81118015612cf357600080fd5b506040519080825280601f01601f191660200182016040528015612d265781602001600182028036833780820191505090505b50905060006001830390505b60008614612d9f57600a8681612d4457fe5b0660300160f81b82828060019003935081518110612d5e57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681612d9757fe5b049550612d32565b819450505050505b919050565b6060612de883836040518060200160405280600081525060405180602001604052806000815250604051806020016040528060008152506132e3565b905092915050565b6000612e02836000018360001b6135b5565b905092915050565b600081600001805490509050919050565b505050565b6000612e32836000018360001b6135d8565b905092915050565b6000612e4c836000018360001b6136c0565b905092915050565b6000612e80846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613730565b90509392505050565b600081836000018054905011612eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613dd26022913960400191505060405180910390fd5b826000018281548110612ef957fe5b9060005260206000200154905092915050565b612f2682826040518060200160405280600081525061380c565b5050565b60008082846000018054905011612f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613f776022913960400191505060405180910390fd5b6000846000018481548110612f9d57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061308a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561304f578082015181840152602081019050613034565b50505050905090810190601f16801561307c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061309d57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006130eb8473ffffffffffffffffffffffffffffffffffffffff1661387d565b6130f857600190506132db565b606061326263150b7a0260e01b61310d612580565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613191578082015181840152602081019050613176565b50505050905090810190601f1680156131be5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001613df4603291398773ffffffffffffffffffffffffffffffffffffffff166138909092919063ffffffff16565b9050600081806020019051602081101561327b57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b60608086905060608690506060869050606086905060608690506060815183518551875189510101010167ffffffffffffffff8111801561332357600080fd5b506040519080825280601f01601f1916602001820160405280156133565781602001600182028036833780820191505090505b5090506060819050600080600090505b88518110156133d45788818151811061337b57fe5b602001015160f81c60f81b83838060010194508151811061339857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613366565b600090505b8751811015613447578781815181106133ee57fe5b602001015160f81c60f81b83838060010194508151811061340b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506133d9565b600090505b86518110156134ba5786818151811061346157fe5b602001015160f81c60f81b83838060010194508151811061347e57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061344c565b600090505b855181101561352d578581815181106134d457fe5b602001015160f81c60f81b8383806001019450815181106134f157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506134bf565b600090505b84518110156135a05784818151811061354757fe5b602001015160f81c60f81b83838060010194508151811061356457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613532565b82995050505050505050505095945050505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146136b4576000600182039050600060018660000180549050039050600086600001828154811061362357fe5b906000526020600020015490508087600001848154811061364057fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061367857fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506136ba565b60009150505b92915050565b60006136cc83836138a8565b61372557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061372a565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156137d757846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613805565b828560000160018303815481106137ea57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b61381683836138cb565b61382360008484846130ca565b613878576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613df46032913960400191505060405180910390fd5b505050565b600080823b905060008111915050919050565b606061389f8484600085613abf565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561396e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b61397781612563565b156139ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b6139f660008383612e1b565b613a4781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e3a90919063ffffffff16565b50613a5e81836002612e549092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606082471015613b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613e9a6026913960400191505060405180910390fd5b613b238561387d565b613b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613be55780518252602082019150602081019050602083039250613bc2565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c47576040519150601f19603f3d011682016040523d82523d6000602084013e613c4c565b606091505b5091509150613c5c828286613c68565b92505050949350505050565b60608315613c7857829050613d2d565b600083511115613c8b5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613cf2578082015181840152602081019050613cd7565b50505050905090810190601f168015613d1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613d7557805160ff1916838001178555613da3565b82800160010185558215613da3579182015b82811115613da2578251825591602001919060010190613d87565b5b509050613db09190613db4565b5090565b5b80821115613dcd576000816000905550600101613db5565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373507572636861736520776f756c6420657863656564206d617820737570706c79206f6620546f6b656e734552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473596f75206d75737420736574206d617820696e766f636174696f6e732067726561746572207468616e2063757272656e7420696e766f636174696f6e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220ede39eb44360161aeec0b81e4944cfa6c7d974e8102c2e2478ce6dcdd712696464736f6c63430007000033

Deployed Bytecode Sourcemap

30173:3578:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2685:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21956:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23822:221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23410:404;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23011:211;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30664:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24526:305;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30799:537;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22841:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31344:484;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33609:131;;;;;;;;;;;;;:::i;:::-;;33212:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24839:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23230:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21771:177;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22736:97;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21542:221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29740:148;;;;;;;;;;;;;:::i;:::-;;32894:306;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29517:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32253:430;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22064:104;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32695:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24051:295;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24998:285;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33386:215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30586:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24354:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29896:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2685:150;2770:4;2794:20;:33;2815:11;2794:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2787:40;;2685:150;;;:::o;21956:100::-;22010:13;22043:5;22036:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21956:100;:::o;23822:221::-;23898:7;23926:16;23934:7;23926;:16::i;:::-;23918:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24011:15;:24;24027:7;24011:24;;;;;;;;;;;;;;;;;;;;;24004:31;;23822:221;;;:::o;23410:404::-;23491:13;23507:23;23522:7;23507:14;:23::i;:::-;23491:39;;23555:5;23549:11;;:2;:11;;;;23541:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23635:5;23619:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;23644:44;23668:5;23675:12;:10;:12::i;:::-;23644:23;:44::i;:::-;23619:69;23611:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23785:21;23794:2;23798:7;23785:8;:21::i;:::-;23410:404;;;:::o;23011:211::-;23072:7;23193:21;:12;:19;:21::i;:::-;23186:28;;23011:211;:::o;30664:53::-;;;;;;;;;;;;;;;;;:::o;24526:305::-;24687:41;24706:12;:10;:12::i;:::-;24720:7;24687:18;:41::i;:::-;24679:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24795:28;24805:4;24811:2;24815:7;24795:9;:28::i;:::-;24526:305;;;:::o;30799:537::-;29663:12;:10;:12::i;:::-;29652:23;;:7;:5;:7::i;:::-;:23;;;29644:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30962:17:::1;30982:13;;30962:33;;31033:12;31006:8;:19;31015:9;31006:19;;;;;;;;;;;:24;;:39;;;;;;;;;;;;:::i;:::-;;31097:19;31056:8;:19;31065:9;31056:19;;;;;;;;;;;:38;;:60;;;;31164:15;31127:8;:19;31136:9;31127:19;;;;;;;;;;;:34;;:52;;;;31227:15;31190:8;:19;31199:9;31190:19;;;;;;;;;;;:34;;:52;;;;;;;;;;;;:::i;:::-;;31253:28;31265:15;31253:11;:28::i;:::-;31308:20;31326:1;31308:13;;:17;;:20;;;;:::i;:::-;31292:13;:36;;;;29723:1;30799:537:::0;;;;:::o;22841:162::-;22938:7;22965:30;22989:5;22965:13;:20;22979:5;22965:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;22958:37;;22841:162;;;;:::o;31344:484::-;31498:8;:20;31507:10;31498:20;;;;;;;;;;;:35;;;31442:52;31479:14;31442:8;:20;31451:10;31442:20;;;;;;;;;;;:32;;;:36;;:52;;;;:::i;:::-;:91;;31434:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31662:9;31599:59;31643:14;31599:8;:20;31608:10;31599:20;;;;;;;;;;;:39;;;:43;;:59;;;;:::i;:::-;:72;;31591:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31722:6;31718:103;31738:14;31734:1;:18;31718:103;;;31774:35;31786:10;31798;31774:11;:35::i;:::-;31754:3;;;;;;;31718:103;;;;31344:484;;:::o;33609:131::-;29663:12;:10;:12::i;:::-;29652:23;;:7;:5;:7::i;:::-;:23;;;29644:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33657:12:::1;33672:21;33657:36;;33704:10;:19;;:28;33724:7;33704:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;29723:1;33609:131::o:0;33212:162::-;29663:12;:10;:12::i;:::-;29652:23;;:7;:5;:7::i;:::-;:23;;;29644:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33355:11:::1;33317:8;:20;33326:10;33317:20;;;;;;;;;;;:35;;:49;;;;;;;;;;;;:::i;:::-;;33212:162:::0;;:::o;24839:151::-;24943:39;24960:4;24966:2;24970:7;24943:39;;;;;;;;;;;;:16;:39::i;:::-;24839:151;;;:::o;23230:172::-;23305:7;23326:15;23347:22;23363:5;23347:12;:15;;:22;;;;:::i;:::-;23325:44;;;23387:7;23380:14;;;23230:172;;;:::o;21771:177::-;21843:7;21870:70;21887:7;21870:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;21863:77;;21771:177;;;:::o;22736:97::-;22784:13;22817:8;22810:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22736:97;:::o;21542:221::-;21614:7;21659:1;21642:19;;:5;:19;;;;21634:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21726:29;:13;:20;21740:5;21726:20;;;;;;;;;;;;;;;:27;:29::i;:::-;21719:36;;21542:221;;;:::o;29740:148::-;29663:12;:10;:12::i;:::-;29652:23;;:7;:5;:7::i;:::-;:23;;;29644:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29847:1:::1;29810:40;;29831:6;;;;;;;;;;;29810:40;;;;;;;;;;;;29878:1;29861:6;;:19;;;;;;;;;;;;;;;;;;29740:148::o:0;32894:306::-;29663:12;:10;:12::i;:::-;29652:23;;:7;:5;:7::i;:::-;:23;;;29644:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33030:8:::1;:20;33039:10;33030:20;;;;;;;;;;;:32;;;33012:15;:50;33004:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33177:15;33139:8;:20;33148:10;33139:20;;;;;;;;;;;:35;;:53;;;;32894:306:::0;;:::o;29517:87::-;29563:7;29590:6;;;;;;;;;;;29583:13;;29517:87;:::o;32253:430::-;32318:25;32346:26;32374:22;32398:28;32453:8;:20;32462:10;32453:20;;;;;;;;;;;:25;;32439:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32510:8;:20;32519:10;32510:20;;;;;;;;;;;:39;;;32489:60;;32577:8;:20;32586:10;32577:20;;;;;;;;;;;:35;;;32560:52;;32640:8;:20;32649:10;32640:20;;;;;;;;;;;:35;;32623:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32253:430;;;;;:::o;22064:104::-;22120:13;22153:7;22146:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22064:104;:::o;32695:187::-;29663:12;:10;:12::i;:::-;29652:23;;:7;:5;:7::i;:::-;:23;;;29644:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32855:19:::1;32813:8;:20;32822:10;32813:20;;;;;;;;;;;:39;;:61;;;;32695:187:::0;;:::o;24051:295::-;24166:12;:10;:12::i;:::-;24154:24;;:8;:24;;;;24146:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24266:8;24221:18;:32;24240:12;:10;:12::i;:::-;24221:32;;;;;;;;;;;;;;;:42;24254:8;24221:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24319:8;24290:48;;24305:12;:10;:12::i;:::-;24290:48;;;24329:8;24290:48;;;;;;;;;;;;;;;;;;;;24051:295;;:::o;24998:285::-;25130:41;25149:12;:10;:12::i;:::-;25163:7;25130:18;:41::i;:::-;25122:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25236:39;25250:4;25256:2;25260:7;25269:5;25236:13;:39::i;:::-;24998:285;;;;:::o;33386:215::-;33460:13;33493:100;33511:8;:38;33520:18;:28;33539:8;33520:28;;;;;;;;;;;;33511:38;;;;;;;;;;;:53;;33493:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33566:26;33583:8;33566:16;:26::i;:::-;33493:17;:100::i;:::-;33486:107;;33386:215;;;:::o;30586:28::-;;;;:::o;24354:164::-;24451:4;24475:18;:25;24494:5;24475:25;;;;;;;;;;;;;;;:35;24501:8;24475:35;;;;;;;;;;;;;;;;;;;;;;;;;24468:42;;24354:164;;;;:::o;29896:244::-;29663:12;:10;:12::i;:::-;29652:23;;:7;:5;:7::i;:::-;:23;;;29644:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30005:1:::1;29985:22;;:8;:22;;;;29977:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30095:8;30066:38;;30087:6;;;;;;;;;;;30066:38;;;;;;;;;;;;30124:8;30115:6;;:17;;;;;;;;;;;;;;;;;;29896:244:::0;:::o;25571:127::-;25636:4;25660:30;25682:7;25660:12;:21;;:30;;;;:::i;:::-;25653:37;;25571:127;;;:::o;70:106::-;123:15;158:10;151:17;;70:106;:::o;28844:192::-;28946:2;28919:15;:24;28935:7;28919:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29002:7;28998:2;28964:46;;28973:23;28988:7;28973:14;:23::i;:::-;28964:46;;;;;;;;;;;;28844:192;;:::o;16425:123::-;16494:7;16521:19;16529:3;:10;;16521:7;:19::i;:::-;16514:26;;16425:123;;;:::o;25706:355::-;25799:4;25824:16;25832:7;25824;:16::i;:::-;25816:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25900:13;25916:23;25931:7;25916:14;:23::i;:::-;25900:39;;25969:5;25958:16;;:7;:16;;;:51;;;;26002:7;25978:31;;:20;25990:7;25978:11;:20::i;:::-;:31;;;25958:51;:94;;;;26013:39;26037:5;26044:7;26013:23;:39::i;:::-;25958:94;25950:103;;;25706:355;;;;:::o;27346:547::-;27471:4;27444:31;;:23;27459:7;27444:14;:23::i;:::-;:31;;;27436:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27572:1;27558:16;;:2;:16;;;;27550:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27628:39;27649:4;27655:2;27659:7;27628:20;:39::i;:::-;27680:29;27697:1;27701:7;27680:8;:29::i;:::-;27722:35;27749:7;27722:13;:19;27736:4;27722:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;27768:30;27790:7;27768:13;:17;27782:2;27768:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;27811:29;27828:7;27837:2;27811:12;:16;;:29;;;;;:::i;:::-;;27877:7;27873:2;27858:27;;27867:4;27858:27;;;;;;;;;;;;27346:547;;;:::o;28124:100::-;28208:8;28197;:19;;;;;;;;;;;;:::i;:::-;;28124:100;:::o;4019:179::-;4077:7;4097:9;4113:1;4109;:5;4097:17;;4138:1;4133;:6;;4125:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4189:1;4182:8;;;4019:179;;;;:::o;12821:137::-;12892:7;12927:22;12931:3;:10;;12943:5;12927:3;:22::i;:::-;12919:31;;12912:38;;12821:137;;;;:::o;4372:220::-;4430:7;4459:1;4454;:6;4450:20;;;4469:1;4462:8;;;;4450:20;4481:9;4497:1;4493;:5;4481:17;;4526:1;4521;4517;:5;;;;;;:10;4509:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4583:1;4576:8;;;4372:220;;;;;:::o;31836:405::-;31912:19;31963:8;:20;31972:10;31963:20;;;;;;;;;;;:32;;;30572:7;31935:10;:24;31934:61;31912:83;;32006:27;32016:3;32021:11;32006:9;:27::i;:::-;32079:39;32116:1;32079:8;:20;32088:10;32079:20;;;;;;;;;;;:32;;;:36;;:39;;;;:::i;:::-;32044:8;:20;32053:10;32044:20;;;;;;;;;;;:32;;:74;;;;32163:10;32129:18;:31;32148:11;32129:31;;;;;;;;;;;:44;;;;32184:19;:31;32204:10;32184:31;;;;;;;;;;;32221:11;32184:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31836:405;;;:::o;16556:236::-;16636:7;16645;16666:11;16679:13;16696:22;16700:3;:10;;16712:5;16696:3;:22::i;:::-;16665:53;;;;16745:3;16737:12;;16775:5;16767:14;;16729:55;;;;;;16556:236;;;;;:::o;17229:213::-;17336:7;17387:44;17392:3;:10;;17412:3;17404:12;;17418;17387:4;:44::i;:::-;17379:53;;17356:78;;17229:213;;;;;:::o;12699:114::-;12759:7;12786:19;12794:3;:10;;12786:7;:19::i;:::-;12779:26;;12699:114;;;:::o;25291:272::-;25405:28;25415:4;25421:2;25425:7;25405:9;:28::i;:::-;25452:48;25475:4;25481:2;25485:7;25494:5;25452:22;:48::i;:::-;25444:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25291:272;;;;:::o;19709:482::-;19759:27;19809:1;19803:2;:7;19799:50;;;19827:10;;;;;;;;;;;;;;;;;;;;;19799:50;19859:6;19868:2;19859:11;;19881:8;19900:69;19912:1;19907;:6;19900:69;;19930:5;;;;;;;19955:2;19950:7;;;;;;;;;19900:69;;;19979:17;20009:3;19999:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19979:34;;20024:6;20039:1;20033:3;:7;20024:16;;20051:103;20064:1;20058:2;:7;20051:103;;20115:2;20110;:7;;;;;;20105:2;:12;20094:25;;20082:4;20087:3;;;;;;;20082:9;;;;;;;;;;;:37;;;;;;;;;;;20140:2;20134:8;;;;;;;;;20051:103;;;20178:4;20164:19;;;;;;19709:482;;;;:::o;18073:168::-;18151:33;18204:29;18214:2;18218;18204:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;:::-;18197:36;;18073:168;;;;:::o;16266:151::-;16350:4;16374:35;16384:3;:10;;16404:3;16396:12;;16374:9;:35::i;:::-;16367:42;;16266:151;;;;:::o;14495:110::-;14551:7;14578:3;:12;;:19;;;;14571:26;;14495:110;;;:::o;29044:93::-;;;;:::o;12400:137::-;12470:4;12494:35;12502:3;:10;;12522:5;12514:14;;12494:7;:35::i;:::-;12487:42;;12400:137;;;;:::o;12261:131::-;12328:4;12352:32;12357:3;:10;;12377:5;12369:14;;12352:4;:32::i;:::-;12345:39;;12261:131;;;;:::o;15923:185::-;16012:4;16036:64;16041:3;:10;;16061:3;16053:12;;16091:5;16075:23;;16067:32;;16036:4;:64::i;:::-;16029:71;;15923:185;;;;;:::o;10392:204::-;10459:7;10508:5;10487:3;:11;;:18;;;;:26;10479:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10570:3;:11;;10582:5;10570:18;;;;;;;;;;;;;;;;10563:25;;10392:204;;;;:::o;26069:110::-;26145:26;26155:2;26159:7;26145:26;;;;;;;;;;;;:9;:26::i;:::-;26069:110;;:::o;14613:279::-;14680:7;14689;14739:5;14717:3;:12;;:19;;;;:27;14709:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14796:22;14821:3;:12;;14834:5;14821:19;;;;;;;;;;;;;;;;;;14796:44;;14859:5;:10;;;14871:5;:12;;;14851:33;;;;;14613:279;;;;;:::o;15535:319::-;15629:7;15649:16;15668:3;:12;;:17;15681:3;15668:17;;;;;;;;;;;;15649:36;;15716:1;15704:8;:13;;15719:12;15696:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15786:3;:12;;15810:1;15799:8;:12;15786:26;;;;;;;;;;;;;;;;;;:33;;;15779:40;;;15535:319;;;;;:::o;10275:109::-;10331:7;10358:3;:11;;:18;;;;10351:25;;10275:109;;;:::o;28232:604::-;28353:4;28380:15;:2;:13;;;:15::i;:::-;28375:60;;28419:4;28412:11;;;;28375:60;28445:23;28471:252;28524:45;;;28584:12;:10;:12::i;:::-;28611:4;28630:7;28652:5;28487:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28471:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;28445:278;;28734:13;28761:10;28750:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28734:48;;20575:10;28811:16;;28801:26;;;:6;:26;;;;28793:35;;;;28232:604;;;;;;;:::o;18655:1046::-;18787:33;18833:16;18858:2;18833:28;;18872:16;18897:2;18872:28;;18911:16;18936:2;18911:28;;18950:16;18975:2;18950:28;;18989:16;19014:2;18989:28;;19028:19;19113:3;:10;19100:3;:10;19087:3;:10;19074:3;:10;19061:3;:10;:23;:36;:49;:62;19050:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19028:96;;19135:19;19163:5;19135:34;;19180:6;19201;19231:1;19227:5;;19222:80;19238:3;:10;19234:1;:14;19222:80;;;19284:3;19288:1;19284:6;;;;;;;;;;;;;;;;19270;19277:3;;;;;;19270:11;;;;;;;;;;;:20;;;;;;;;;;;19250:3;;;;;;;19222:80;;;19321:1;19317:5;;19312:80;19328:3;:10;19324:1;:14;19312:80;;;19374:3;19378:1;19374:6;;;;;;;;;;;;;;;;19360;19367:3;;;;;;19360:11;;;;;;;;;;;:20;;;;;;;;;;;19340:3;;;;;;;19312:80;;;19411:1;19407:5;;19402:80;19418:3;:10;19414:1;:14;19402:80;;;19464:3;19468:1;19464:6;;;;;;;;;;;;;;;;19450;19457:3;;;;;;19450:11;;;;;;;;;;;:20;;;;;;;;;;;19430:3;;;;;;;19402:80;;;19501:1;19497:5;;19492:80;19508:3;:10;19504:1;:14;19492:80;;;19554:3;19558:1;19554:6;;;;;;;;;;;;;;;;19540;19547:3;;;;;;19540:11;;;;;;;;;;;:20;;;;;;;;;;;19520:3;;;;;;;19492:80;;;19591:1;19587:5;;19582:80;19598:3;:10;19594:1;:14;19582:80;;;19644:3;19648:1;19644:6;;;;;;;;;;;;;;;;19630;19637:3;;;;;;19630:11;;;;;;;;;;;:20;;;;;;;;;;;19610:3;;;;;;;19582:80;;;19686:6;19672:21;;;;;;;;;;;18655:1046;;;;;;;:::o;14362:125::-;14433:4;14478:1;14457:3;:12;;:17;14470:3;14457:17;;;;;;;;;;;;:22;;14450:29;;14362:125;;;;:::o;9476:654::-;9542:4;9559:18;9580:3;:12;;:19;9593:5;9580:19;;;;;;;;;;;;9559:40;;9628:1;9614:10;:15;9610:513;;9695:21;9732:1;9719:10;:14;9695:38;;9748:17;9789:1;9768:3;:11;;:18;;;;:22;9748:42;;9807:17;9827:3;:11;;9839:9;9827:22;;;;;;;;;;;;;;;;9807:42;;9895:9;9866:3;:11;;9878:13;9866:26;;;;;;;;;;;;;;;:38;;;;9961:1;9945:13;:17;9919:3;:12;;:23;9932:9;9919:23;;;;;;;;;;;:43;;;;9978:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;10019:3;:12;;:19;10032:5;10019:19;;;;;;;;;;;10012:26;;;10062:4;10055:11;;;;;;;;9610:513;10106:5;10099:12;;;9476:654;;;;;:::o;9177:291::-;9240:4;9262:21;9272:3;9277:5;9262:9;:21::i;:::-;9257:204;;9300:3;:11;;9317:5;9300:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9360:3;:11;;:18;;;;9338:3;:12;;:19;9351:5;9338:19;;;;;;;;;;;:40;;;;9400:4;9393:11;;;;9257:204;9444:5;9437:12;;9177:291;;;;;:::o;13222:470::-;13298:4;13315:16;13334:3;:12;;:17;13347:3;13334:17;;;;;;;;;;;;13315:36;;13380:1;13368:8;:13;13364:321;;;13435:3;:12;;13453:38;;;;;;;;13470:3;13453:38;;;;13483:5;13453:38;;;13435:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13527:3;:12;;:19;;;;13507:3;:12;;:17;13520:3;13507:17;;;;;;;;;;;:39;;;;13568:4;13561:11;;;;;13364:321;13641:5;13605:3;:12;;13629:1;13618:8;:12;13605:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;13668:5;13661:12;;;13222:470;;;;;;:::o;26187:250::-;26283:18;26289:2;26293:7;26283:5;:18::i;:::-;26320:54;26351:1;26355:2;26359:7;26368:5;26320:22;:54::i;:::-;26312:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26187:250;;;:::o;5499:175::-;5559:4;5577:12;5631:7;5619:20;5611:28;;5665:1;5658:4;:8;5651:15;;;5499:175;;;:::o;6188:195::-;6291:12;6323:52;6345:6;6353:4;6359:1;6362:12;6323:21;:52::i;:::-;6316:59;;6188:195;;;;;:::o;10138:129::-;10211:4;10258:1;10235:3;:12;;:19;10248:5;10235:19;;;;;;;;;;;;:24;;10228:31;;10138:129;;;;:::o;26445:404::-;26539:1;26525:16;;:2;:16;;;;26517:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26598:16;26606:7;26598;:16::i;:::-;26597:17;26589:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26660:45;26689:1;26693:2;26697:7;26660:20;:45::i;:::-;26718:30;26740:7;26718:13;:17;26732:2;26718:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;26761:29;26778:7;26787:2;26761:12;:16;;:29;;;;;:::i;:::-;;26833:7;26829:2;26808:33;;26825:1;26808:33;;;;;;;;;;;;26445:404;;:::o;6625:470::-;6752:12;6810:5;6785:21;:30;;6777:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6877:18;6888:6;6877:10;:18::i;:::-;6869:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6943:12;6957:23;6984:6;:11;;7004:5;7012:4;6984:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6942:75;;;;7035:52;7053:7;7062:10;7074:12;7035:17;:52::i;:::-;7028:59;;;;6625:470;;;;;;:::o;8259:517::-;8374:12;8403:7;8399:370;;;8434:10;8427:17;;;;8399:370;8501:1;8481:10;:17;:21;8477:281;;;8586:10;8580:17;8647:15;8634:10;8630:2;8626:19;8619:44;8534:148;8729:12;8722:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8259:517;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

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