Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
289 FDG
Holders
80
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
9 FDGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FrenzyDucksGenesis
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT import "./SafeMath.sol"; import "./ERC721Enumerable.sol"; import "./Ownable.sol"; import "./ERC2981Royalties.sol"; interface FrenzyDucksContract { function burn(uint) external; function ownerOf(uint) external view returns(address); } contract FrenzyDucksGenesis is ERC721Enumerable, Ownable, ERC2981Royalties { using SafeMath for uint; string baseURI; uint public MAX_FRENZYDUCKS = 333; uint public MAX_SALE = 5; uint public MAX_PER_WALET = 5; FrenzyDucksContract private oldContract; address communityAddress = 0x6EEa57e0D7Bf99571af3DD7a1D861bA62D7665B2; address frenzyducksAddress = 0x30564f2D0896B00186450B0F7989D7Ae7af51975; address devAddress = 0xA7b5Cf34dDb26A5e8efb8a652c9C7f5aEfB160b8; address marketingAddress = 0x279e5f77b3b6d6e17df1749B42426c1a1c2143dA; uint public price = 60000000000000000; mapping(uint => bool) private burnedFrenzyDucks; mapping(uint => address) private ownersFenzyDucks; bool public saleStarted = false; event FrenzyDucksMinted(uint indexed tokenId, address indexed owner); constructor(string memory name, string memory symbol, string memory baseURI_, address _oldContract) ERC721(name, symbol) { baseURI = baseURI_; _setRoyalties(frenzyducksAddress, 875); _setRoyalties(devAddress, 75); _setRoyalties(marketingAddress, 50); oldContract = FrenzyDucksContract(_oldContract); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, ERC2981Base) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } function mintTo(address _to) internal { uint mintIndex = totalSupply().add(1); _safeMint(_to, mintIndex); emit FrenzyDucksMinted(mintIndex, _to); } function mint(uint _quantity) external payable { require(saleStarted, "Sale hasn't started."); require(_quantity > 0, "Quantity cannot be zero."); require(_quantity <= MAX_SALE, "Quantity cannot be bigger than MAX_BUYING."); require(_quantity + balanceOf(msg.sender) <= MAX_PER_WALET, "Quantity cannot be bigger than MAX_PER_WALET."); require(totalSupply().add(_quantity) <= MAX_FRENZYDUCKS, "Sold out."); require(msg.value >= price.mul(_quantity) || msg.sender == owner(), "Ether value sent is below the price."); for (uint i = 0; i < _quantity; i++) { mintTo(msg.sender); } } function validate(uint256[] memory _frenzyDucks) external payable { for (uint i = 0; i < 6; i++) { require (oldContract.ownerOf(_frenzyDucks[i]) == msg.sender, "Only the owner of NFT can burn"); require (!burnedFrenzyDucks[_frenzyDucks[i]], "NFT already burned"); } for (uint i = 0; i < 6; i++) { ownersFenzyDucks[_frenzyDucks[i]] = msg.sender; } } function claim(uint256[] memory _frenzyDucks) external payable { for (uint i = 0; i < 6; i++) { require (ownersFenzyDucks[_frenzyDucks[i]] == msg.sender, "Only the owner of NFT can burn"); require (!burnedFrenzyDucks[_frenzyDucks[i]], "NFT already burned"); } bool[] memory valid = new bool[](6); for (uint i = 0; i < 6; i++) { burnedFrenzyDucks[_frenzyDucks[i]] = true; try oldContract.ownerOf(_frenzyDucks[i]) returns (address ) { valid[i] = false; } catch (bytes memory /*lowLevelData*/) { valid[i] = true; } } for (uint i = 0; i < 6; i++) { require (valid[i], "NFT's not burned"); } for (uint i = 0; i < 6; i++) { burnedFrenzyDucks[_frenzyDucks[i]] = true; } mintTo(msg.sender); } function mintByOwner(address _to, uint256 _quantity) public onlyOwner { require(_quantity > 0, "Quantity cannot be zero."); require(totalSupply().add(_quantity) <= MAX_FRENZYDUCKS, "Sold out."); for (uint i = 0; i < _quantity; i++) { mintTo(_to); } } function multiMintByOwner(address[] memory _mintAddressList, uint256[] memory _quantityList) external onlyOwner { require (_mintAddressList.length == _quantityList.length, "The length should be same"); for (uint256 i = 0; i < _mintAddressList.length; i += 1) { mintByOwner(_mintAddressList[i], _quantityList[i]); } } function tokensOfOwner(address _owner) public view returns(uint[] memory ) { uint tokenCount = balanceOf(_owner); if (tokenCount == 0) { return new uint[](0); } else { uint[] memory result = new uint[](tokenCount); for (uint i = 0; i < tokenCount; i++) { result[i] = tokenOfOwnerByIndex(_owner, i); } return result; } } function isBurned(uint tokenId) public view returns (bool) { return burnedFrenzyDucks[tokenId] ? true: false; } function setBaseURI(string memory _URI) external onlyOwner { baseURI = _URI; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setPrice(uint _price) external onlyOwner { price = _price; } function setMaxFrenzyDucks(uint _maxFrenzyDucks) external onlyOwner { MAX_FRENZYDUCKS = _maxFrenzyDucks; } function setMaxSale(uint _maxSale, uint _maxFrenzyDucksPerWallet) external onlyOwner { MAX_SALE = _maxSale; MAX_PER_WALET = _maxFrenzyDucksPerWallet; } function startSale() external onlyOwner { require(!saleStarted, "Sale already active."); saleStarted = true; } function pauseSale() external onlyOwner { require(saleStarted, "Sale is not active."); saleStarted = false; } function withdraw() public onlyOwner { uint256 balance = address(this).balance; payable(communityAddress).transfer( (balance * 5) / 100 ); payable(marketingAddress).transfer( (balance * 5) / 100 ); payable(devAddress).transfer( (balance * 75) / 1000 ); payable(frenzyducksAddress).transfer( (balance * 825) / 1000 ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./EnumerableSet.sol"; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { using EnumerableSet for EnumerableSet.Bytes32Set; // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct Map { // Storage of keys EnumerableSet.Bytes32Set _keys; mapping (bytes32 => bytes32) _values; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { map._values[key] = value; return map._keys.add(key); } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { delete map._values[key]; return map._keys.remove(key); } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._keys.contains(key); } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._keys.length(); } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { bytes32 key = map._keys.at(index); return (key, map._values[key]); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { bytes32 value = map._values[key]; if (value == bytes32(0)) { return (_contains(map, key), bytes32(0)); } else { return (true, value); } } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { bytes32 value = map._values[key]; require(value != 0 || _contains(map, key), "EnumerableMap: nonexistent key"); return value; } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { bytes32 value = map._values[key]; require(value != 0 || _contains(map, key), errorMessage); return value; } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./IERC1155MetadataURI.sol"; import "./Address.sol"; import "./Context.sol"; import "./ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping (uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping (address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor (string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] memory accounts, uint256[] memory ids ) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn(address account, uint256 id, uint256 amount) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { } function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver(to).onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) { if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC165.sol"; import "./IERC2981Royalties.sol"; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981Base is ERC165, IERC2981Royalties { struct RoyaltyInfo { address recipient; uint24 amount; } function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC2981Royalties).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import './ERC2981Base.sol'; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 /// @dev This implementation has the same royalties for each and every tokens abstract contract ERC2981Royalties is ERC2981Base { RoyaltyInfo private _royalties; /// @dev Sets token royalties /// @param recipient recipient of the royalties /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0) function _setRoyalties(address recipient, uint256 value) internal { require(value <= 10000, 'ERC2981Royalties: Too high'); _royalties = RoyaltyInfo(recipient, uint24(value)); } /// @inheritdoc IERC2981Royalties function royaltyInfo(uint256, uint256 value) external view override returns (address receiver, uint256 royaltyAmount) { RoyaltyInfo memory royalties = _royalties; receiver = royalties.recipient; royaltyAmount = (value * royalties.amount) / 10000; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, 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); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ 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"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ 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 || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ 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"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ 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); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @title IERC2981Royalties /// @dev Interface for the ERC2981 - Token Royalty standard interface IERC2981Royalties { /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _value - the sale price of the NFT asset specified by _tokenId /// @return _receiver - address of who should be sent the royalty payment /// @return _royaltyAmount - the royalty payment amount for value sale price function royaltyInfo(uint256 _tokenId, uint256 _value) external view returns (address _receiver, uint256 _royaltyAmount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute. return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2); } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"_oldContract","type":"address"}],"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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"FrenzyDucksMinted","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":[],"name":"MAX_FRENZYDUCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_frenzyDucks","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isBurned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_mintAddressList","type":"address[]"},{"internalType":"uint256[]","name":"_quantityList","type":"uint256[]"}],"name":"multiMintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFrenzyDucks","type":"uint256"}],"name":"setMaxFrenzyDucks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSale","type":"uint256"},{"internalType":"uint256","name":"_maxFrenzyDucksPerWallet","type":"uint256"}],"name":"setMaxSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"_frenzyDucks","type":"uint256[]"}],"name":"validate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405261014d600d556005600e556005600f55736eea57e0d7bf99571af3dd7a1d861ba62d7665b2601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507330564f2d0896b00186450b0f7989d7ae7af51975601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a7b5cf34ddb26a5e8efb8a652c9c7f5aefb160b8601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073279e5f77b3b6d6e17df1749b42426c1a1c2143da601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555066d529ae9e8600006015556000601860006101000a81548160ff0219169083151502179055503480156200019b57600080fd5b50604051620062c0380380620062c08339818101604052810190620001c19190620005e6565b83838160009080519060200190620001db929190620004a1565b508060019080519060200190620001f4929190620004a1565b505050600062000209620003ac60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600c9080519060200190620002c0929190620004a1565b50620002f7601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661036b620003b460201b60201c565b6200032c601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604b620003b460201b60201c565b62000361601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166032620003b460201b60201c565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506200090a565b600033905090565b612710811115620003fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003f390620006dc565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff16815250600b60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff1602179055509050505050565b828054620004af90620007d8565b90600052602060002090601f016020900481019282620004d357600085556200051f565b82601f10620004ee57805160ff19168380011785556200051f565b828001600101855582156200051f579182015b828111156200051e57825182559160200191906001019062000501565b5b5090506200052e919062000532565b5090565b5b808211156200054d57600081600090555060010162000533565b5090565b600062000568620005628462000727565b620006fe565b905082815260208101848484011115620005875762000586620008a7565b5b62000594848285620007a2565b509392505050565b600081519050620005ad81620008f0565b92915050565b600082601f830112620005cb57620005ca620008a2565b5b8151620005dd84826020860162000551565b91505092915050565b60008060008060808587031215620006035762000602620008b1565b5b600085015167ffffffffffffffff811115620006245762000623620008ac565b5b6200063287828801620005b3565b945050602085015167ffffffffffffffff811115620006565762000655620008ac565b5b6200066487828801620005b3565b935050604085015167ffffffffffffffff811115620006885762000687620008ac565b5b6200069687828801620005b3565b9250506060620006a9878288016200059c565b91505092959194509250565b6000620006c4601a836200075d565b9150620006d182620008c7565b602082019050919050565b60006020820190508181036000830152620006f781620006b5565b9050919050565b60006200070a6200071d565b90506200071882826200080e565b919050565b6000604051905090565b600067ffffffffffffffff82111562000745576200074462000873565b5b6200075082620008b6565b9050602081019050919050565b600082825260208201905092915050565b60006200077b8262000782565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620007c2578082015181840152602081019050620007a5565b83811115620007d2576000848401525b50505050565b60006002820490506001821680620007f157607f821691505b6020821081141562000808576200080762000844565b5b50919050565b6200081982620008b6565b810181811067ffffffffffffffff821117156200083b576200083a62000873565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b620008fb816200076e565b81146200090757600080fd5b50565b6159a6806200091a6000396000f3fe6080604052600436106102305760003560e01c8063637e53331161012e578063a0712d68116100ab578063c4ac9ea21161006f578063c4ac9ea2146107e9578063c87b56dd14610814578063db44fe0714610851578063e985e9c51461088e578063f2fde38b146108cb57610230565b8063a0712d6814610739578063a22cb46514610755578063a9dc9d251461077e578063b66a0e5d146107a9578063b88d4fde146107c057610230565b80638da5cb5b116100f25780638da5cb5b14610666578063914053e71461069157806391b7f5ed146106ba57806395d89b41146106e3578063a035b1fe1461070e57610230565b8063637e5333146105905780636ba4c138146105b957806370a08231146105d5578063715018a6146106125780638462151c1461062957610230565b80632f745c59116101bc5780634f6ccce7116101805780634f6ccce7146104ab57806355367ba9146104e857806355f804b3146104ff5780635c474f9e146105285780636352211e1461055357610230565b80632f745c59146103dc5780633542aee2146104195780633bdf4bda146104425780633ccfd60b1461046b57806342842e0e1461048257610230565b8063136f3cfc11610203578063136f3cfc1461030357806318160ddd1461032e57806323b872dd1461035957806325b90494146103825780632a55205a1461039e57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061410c565b6108f4565b6040516102699190614861565b60405180910390f35b34801561027e57600080fd5b5061028761096e565b604051610294919061487c565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906141af565b610a00565b6040516102d191906147af565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061400b565b610a85565b005b34801561030f57600080fd5b50610318610b9d565b6040516103259190614c5e565b60405180910390f35b34801561033a57600080fd5b50610343610ba3565b6040516103509190614c5e565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190613ef5565b610bb0565b005b61039c600480360381019061039791906140c3565b610c10565b005b3480156103aa57600080fd5b506103c560048036038101906103c091906141dc565b610e6c565b6040516103d3929190614816565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe919061400b565b610f2c565b6040516104109190614c5e565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b919061400b565b610fd1565b005b34801561044e57600080fd5b50610469600480360381019061046491906141af565b61111a565b005b34801561047757600080fd5b506104806111a0565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613ef5565b61142b565b005b3480156104b757600080fd5b506104d260048036038101906104cd91906141af565b61144b565b6040516104df9190614c5e565b60405180910390f35b3480156104f457600080fd5b506104fd6114bc565b005b34801561050b57600080fd5b5061052660048036038101906105219190614166565b6115a4565b005b34801561053457600080fd5b5061053d61163a565b60405161054a9190614861565b60405180910390f35b34801561055f57600080fd5b5061057a600480360381019061057591906141af565b61164d565b60405161058791906147af565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b291906141dc565b6116ff565b005b6105d360048036038101906105ce91906140c3565b61178d565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613e5b565b611bce565b6040516106099190614c5e565b60405180910390f35b34801561061e57600080fd5b50610627611c86565b005b34801561063557600080fd5b50610650600480360381019061064b9190613e5b565b611dc3565b60405161065d919061483f565b60405180910390f35b34801561067257600080fd5b5061067b611ecd565b60405161068891906147af565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b3919061404b565b611ef7565b005b3480156106c657600080fd5b506106e160048036038101906106dc91906141af565b61201a565b005b3480156106ef57600080fd5b506106f86120a0565b604051610705919061487c565b60405180910390f35b34801561071a57600080fd5b50610723612132565b6040516107309190614c5e565b60405180910390f35b610753600480360381019061074e91906141af565b612138565b005b34801561076157600080fd5b5061077c60048036038101906107779190613fcb565b612384565b005b34801561078a57600080fd5b50610793612505565b6040516107a09190614c5e565b60405180910390f35b3480156107b557600080fd5b506107be61250b565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613f48565b6125f4565b005b3480156107f557600080fd5b506107fe612656565b60405161080b9190614c5e565b60405180910390f35b34801561082057600080fd5b5061083b600480360381019061083691906141af565b61265c565b604051610848919061487c565b60405180910390f35b34801561085d57600080fd5b50610878600480360381019061087391906141af565b612703565b6040516108859190614861565b60405180910390f35b34801561089a57600080fd5b506108b560048036038101906108b09190613eb5565b61273b565b6040516108c29190614861565b60405180910390f35b3480156108d757600080fd5b506108f260048036038101906108ed9190613e5b565b6127cf565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096757506109668261297b565b5b9050919050565b60606000805461097d90614f9f565b80601f01602080910402602001604051908101604052809291908181526020018280546109a990614f9f565b80156109f65780601f106109cb576101008083540402835291602001916109f6565b820191906000526020600020905b8154815290600101906020018083116109d957829003601f168201915b5050505050905090565b6000610a0b826129f5565b610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4190614abe565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a908261164d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af890614b5e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b20612a61565b73ffffffffffffffffffffffffffffffffffffffff161480610b4f5750610b4e81610b49612a61565b61273b565b5b610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906149fe565b60405180910390fd5b610b988383612a69565b505050565b600e5481565b6000600880549050905090565b610bc1610bbb612a61565b82612b22565b610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf790614bbe565b60405180910390fd5b610c0b838383612c00565b505050565b60005b6006811015610ddc573373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110610c8457610c83615138565b5b60200260200101516040518263ffffffff1660e01b8152600401610ca89190614c5e565b60206040518083038186803b158015610cc057600080fd5b505afa158015610cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf89190613e88565b73ffffffffffffffffffffffffffffffffffffffff1614610d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4590614c3e565b60405180910390fd5b60166000838381518110610d6557610d64615138565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff1615610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc0906148de565b60405180910390fd5b8080610dd490615002565b915050610c13565b5060005b6006811015610e68573360176000848481518110610e0157610e00615138565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080610e6090615002565b915050610de0565b5050565b6000806000600b6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff1685610f189190614e5b565b610f229190614e2a565b9150509250929050565b6000610f3783611bce565b8210610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f906148fe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fd9612a61565b73ffffffffffffffffffffffffffffffffffffffff16610ff7611ecd565b73ffffffffffffffffffffffffffffffffffffffff161461104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490614ade565b60405180910390fd5b60008111611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108790614b7e565b60405180910390fd5b600d546110ad8261109f610ba3565b612e5c90919063ffffffff16565b11156110ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e590614bde565b60405180910390fd5b60005b818110156111155761110283612e72565b808061110d90615002565b9150506110f1565b505050565b611122612a61565b73ffffffffffffffffffffffffffffffffffffffff16611140611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90614ade565b60405180910390fd5b80600d8190555050565b6111a8612a61565b73ffffffffffffffffffffffffffffffffffffffff166111c6611ecd565b73ffffffffffffffffffffffffffffffffffffffff161461121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390614ade565b60405180910390fd5b6000479050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc606460058461126c9190614e5b565b6112769190614e2a565b9081150290604051600060405180830381858888f193505050501580156112a1573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60646005846112ed9190614e5b565b6112f79190614e2a565b9081150290604051600060405180830381858888f19350505050158015611322573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e8604b8461136f9190614e5b565b6113799190614e2a565b9081150290604051600060405180830381858888f193505050501580156113a4573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e8610339846113f29190614e5b565b6113fc9190614e2a565b9081150290604051600060405180830381858888f19350505050158015611427573d6000803e3d6000fd5b5050565b611446838383604051806020016040528060008152506125f4565b505050565b6000611455610ba3565b8210611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d90614bfe565b60405180910390fd5b600882815481106114aa576114a9615138565b5b90600052602060002001549050919050565b6114c4612a61565b73ffffffffffffffffffffffffffffffffffffffff166114e2611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f90614ade565b60405180910390fd5b601860009054906101000a900460ff16611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90614b3e565b60405180910390fd5b6000601860006101000a81548160ff021916908315150217905550565b6115ac612a61565b73ffffffffffffffffffffffffffffffffffffffff166115ca611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161790614ade565b60405180910390fd5b80600c9080519060200190611636929190613b1e565b5050565b601860009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90614a3e565b60405180910390fd5b80915050919050565b611707612a61565b73ffffffffffffffffffffffffffffffffffffffff16611725611ecd565b73ffffffffffffffffffffffffffffffffffffffff161461177b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177290614ade565b60405180910390fd5b81600e8190555080600f819055505050565b60005b60068110156118e2573373ffffffffffffffffffffffffffffffffffffffff16601760008484815181106117c7576117c6615138565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90614c3e565b60405180910390fd5b6016600083838151811061186b5761186a615138565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff16156118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c6906148de565b60405180910390fd5b80806118da90615002565b915050611790565b506000600667ffffffffffffffff811115611900576118ff615167565b5b60405190808252806020026020018201604052801561192e5781602001602082028036833780820191505090505b50905060005b6006811015611ae05760016016600085848151811061195657611955615138565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8483815181106119d4576119d3615138565b5b60200260200101516040518263ffffffff1660e01b81526004016119f89190614c5e565b60206040518083038186803b158015611a1057600080fd5b505afa925050508015611a4157506040513d601f19601f82011682018060405250810190611a3e9190613e88565b60015b611aa4573d8060008114611a71576040519150601f19603f3d011682016040523d82523d6000602084013e611a76565b606091505b506001838381518110611a8c57611a8b615138565b5b60200260200101901515908115158152505050611acd565b6000838381518110611ab957611ab8615138565b5b602002602001019015159081151581525050505b8080611ad890615002565b915050611934565b5060005b6006811015611b5a57818181518110611b0057611aff615138565b5b6020026020010151611b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3e90614a5e565b60405180910390fd5b8080611b5290615002565b915050611ae4565b5060005b6006811015611bc057600160166000858481518110611b8057611b7f615138565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611bb890615002565b915050611b5e565b50611bca33612e72565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3690614a1e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c8e612a61565b73ffffffffffffffffffffffffffffffffffffffff16611cac611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf990614ade565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60606000611dd083611bce565b90506000811415611e2d57600067ffffffffffffffff811115611df657611df5615167565b5b604051908082528060200260200182016040528015611e245781602001602082028036833780820191505090505b50915050611ec8565b60008167ffffffffffffffff811115611e4957611e48615167565b5b604051908082528060200260200182016040528015611e775781602001602082028036833780820191505090505b50905060005b82811015611ec157611e8f8582610f2c565b828281518110611ea257611ea1615138565b5b6020026020010181815250508080611eb990615002565b915050611e7d565b5080925050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611eff612a61565b73ffffffffffffffffffffffffffffffffffffffff16611f1d611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614611f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6a90614ade565b60405180910390fd5b8051825114611fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fae90614a7e565b60405180910390fd5b60005b825181101561201557612001838281518110611fd957611fd8615138565b5b6020026020010151838381518110611ff457611ff3615138565b5b6020026020010151610fd1565b60018161200e9190614dd4565b9050611fba565b505050565b612022612a61565b73ffffffffffffffffffffffffffffffffffffffff16612040611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208d90614ade565b60405180910390fd5b8060158190555050565b6060600180546120af90614f9f565b80601f01602080910402602001604051908101604052809291908181526020018280546120db90614f9f565b80156121285780601f106120fd57610100808354040283529160200191612128565b820191906000526020600020905b81548152906001019060200180831161210b57829003601f168201915b5050505050905090565b60155481565b601860009054906101000a900460ff16612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e906148be565b60405180910390fd5b600081116121ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c190614b7e565b60405180910390fd5b600e5481111561220f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122069061497e565b60405180910390fd5b600f5461221b33611bce565b826122269190614dd4565b1115612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e90614c1e565b60405180910390fd5b600d5461228482612276610ba3565b612e5c90919063ffffffff16565b11156122c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bc90614bde565b60405180910390fd5b6122da81601554612ee390919063ffffffff16565b3410158061231a57506122eb611ecd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235090614b9e565b60405180910390fd5b60005b818110156123805761236d33612e72565b808061237890615002565b91505061235c565b5050565b61238c612a61565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f1906149be565b60405180910390fd5b8060056000612407612a61565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166124b4612a61565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124f99190614861565b60405180910390a35050565b600d5481565b612513612a61565b73ffffffffffffffffffffffffffffffffffffffff16612531611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614612587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257e90614ade565b60405180910390fd5b601860009054906101000a900460ff16156125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce9061489e565b60405180910390fd5b6001601860006101000a81548160ff021916908315150217905550565b6126056125ff612a61565b83612b22565b612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90614bbe565b60405180910390fd5b61265084848484612ef9565b50505050565b600f5481565b6060612667826129f5565b6126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90614b1e565b60405180910390fd5b60006126b0612f55565b905060008151116126d057604051806020016040528060008152506126fb565b806126da84612fe7565b6040516020016126eb92919061478b565b6040516020818303038152906040525b915050919050565b60006016600083815260200190815260200160002060009054906101000a900460ff16612731576000612734565b60015b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6127d7612a61565b73ffffffffffffffffffffffffffffffffffffffff166127f5611ecd565b73ffffffffffffffffffffffffffffffffffffffff161461284b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284290614ade565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b29061493e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129ee57506129ed82613148565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612adc8361164d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b2d826129f5565b612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b63906149de565b60405180910390fd5b6000612b778361164d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612be657508373ffffffffffffffffffffffffffffffffffffffff16612bce84610a00565b73ffffffffffffffffffffffffffffffffffffffff16145b80612bf75750612bf6818561273b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c208261164d565b73ffffffffffffffffffffffffffffffffffffffff1614612c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6d90614afe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdd9061499e565b60405180910390fd5b612cf18383836131c2565b612cfc600082612a69565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4c9190614eb5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612da39190614dd4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612e6a9190614dd4565b905092915050565b6000612e8f6001612e81610ba3565b612e5c90919063ffffffff16565b9050612e9b82826132d6565b8173ffffffffffffffffffffffffffffffffffffffff16817fade44088f434e3d43dc50ac93f56697611c5b05f5791bafbbb76daf5dcda1d6760405160405180910390a35050565b60008183612ef19190614e5b565b905092915050565b612f04848484612c00565b612f10848484846132f4565b612f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f469061491e565b60405180910390fd5b50505050565b6060600c8054612f6490614f9f565b80601f0160208091040260200160405190810160405280929190818152602001828054612f9090614f9f565b8015612fdd5780601f10612fb257610100808354040283529160200191612fdd565b820191906000526020600020905b815481529060010190602001808311612fc057829003601f168201915b5050505050905090565b6060600082141561302f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613143565b600082905060005b6000821461306157808061304a90615002565b915050600a8261305a9190614e2a565b9150613037565b60008167ffffffffffffffff81111561307d5761307c615167565b5b6040519080825280601f01601f1916602001820160405280156130af5781602001600182028036833780820191505090505b5090505b6000851461313c576001826130c89190614eb5565b9150600a856130d7919061504b565b60306130e39190614dd4565b60f81b8183815181106130f9576130f8615138565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131359190614e2a565b94506130b3565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131bb57506131ba8261348b565b5b9050919050565b6131cd83838361356d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132105761320b81613572565b61324f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461324e5761324d83826135bb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132925761328d81613728565b6132d1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132d0576132cf82826137f9565b5b5b505050565b6132f0828260405180602001604052806000815250613878565b5050565b60006133158473ffffffffffffffffffffffffffffffffffffffff166138d3565b1561347e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261333e612a61565b8786866040518563ffffffff1660e01b815260040161336094939291906147ca565b602060405180830381600087803b15801561337a57600080fd5b505af19250505080156133ab57506040513d601f19601f820116820180604052508101906133a89190614139565b60015b61342e573d80600081146133db576040519150601f19603f3d011682016040523d82523d6000602084013e6133e0565b606091505b50600081511415613426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341d9061491e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613483565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061355657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806135665750613565826138e6565b5b9050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135c884611bce565b6135d29190614eb5565b90506000600760008481526020019081526020016000205490508181146136b7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061373c9190614eb5565b905060006009600084815260200190815260200160002054905060006008838154811061376c5761376b615138565b5b90600052602060002001549050806008838154811061378e5761378d615138565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137dd576137dc615109565b5b6001900381819060005260206000200160009055905550505050565b600061380483611bce565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6138828383613950565b61388f60008484846132f4565b6138ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c59061491e565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b790614a9e565b60405180910390fd5b6139c9816129f5565b15613a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a009061495e565b60405180910390fd5b613a15600083836131c2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a659190614dd4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613b2a90614f9f565b90600052602060002090601f016020900481019282613b4c5760008555613b93565b82601f10613b6557805160ff1916838001178555613b93565b82800160010185558215613b93579182015b82811115613b92578251825591602001919060010190613b77565b5b509050613ba09190613ba4565b5090565b5b80821115613bbd576000816000905550600101613ba5565b5090565b6000613bd4613bcf84614c9e565b614c79565b90508083825260208201905082856020860282011115613bf757613bf661519b565b5b60005b85811015613c275781613c0d8882613d25565b845260208401935060208301925050600181019050613bfa565b5050509392505050565b6000613c44613c3f84614cca565b614c79565b90508083825260208201905082856020860282011115613c6757613c6661519b565b5b60005b85811015613c975781613c7d8882613e46565b845260208401935060208301925050600181019050613c6a565b5050509392505050565b6000613cb4613caf84614cf6565b614c79565b905082815260208101848484011115613cd057613ccf6151a0565b5b613cdb848285614f5d565b509392505050565b6000613cf6613cf184614d27565b614c79565b905082815260208101848484011115613d1257613d116151a0565b5b613d1d848285614f5d565b509392505050565b600081359050613d3481615914565b92915050565b600081519050613d4981615914565b92915050565b600082601f830112613d6457613d63615196565b5b8135613d74848260208601613bc1565b91505092915050565b600082601f830112613d9257613d91615196565b5b8135613da2848260208601613c31565b91505092915050565b600081359050613dba8161592b565b92915050565b600081359050613dcf81615942565b92915050565b600081519050613de481615942565b92915050565b600082601f830112613dff57613dfe615196565b5b8135613e0f848260208601613ca1565b91505092915050565b600082601f830112613e2d57613e2c615196565b5b8135613e3d848260208601613ce3565b91505092915050565b600081359050613e5581615959565b92915050565b600060208284031215613e7157613e706151aa565b5b6000613e7f84828501613d25565b91505092915050565b600060208284031215613e9e57613e9d6151aa565b5b6000613eac84828501613d3a565b91505092915050565b60008060408385031215613ecc57613ecb6151aa565b5b6000613eda85828601613d25565b9250506020613eeb85828601613d25565b9150509250929050565b600080600060608486031215613f0e57613f0d6151aa565b5b6000613f1c86828701613d25565b9350506020613f2d86828701613d25565b9250506040613f3e86828701613e46565b9150509250925092565b60008060008060808587031215613f6257613f616151aa565b5b6000613f7087828801613d25565b9450506020613f8187828801613d25565b9350506040613f9287828801613e46565b925050606085013567ffffffffffffffff811115613fb357613fb26151a5565b5b613fbf87828801613dea565b91505092959194509250565b60008060408385031215613fe257613fe16151aa565b5b6000613ff085828601613d25565b925050602061400185828601613dab565b9150509250929050565b60008060408385031215614022576140216151aa565b5b600061403085828601613d25565b925050602061404185828601613e46565b9150509250929050565b60008060408385031215614062576140616151aa565b5b600083013567ffffffffffffffff8111156140805761407f6151a5565b5b61408c85828601613d4f565b925050602083013567ffffffffffffffff8111156140ad576140ac6151a5565b5b6140b985828601613d7d565b9150509250929050565b6000602082840312156140d9576140d86151aa565b5b600082013567ffffffffffffffff8111156140f7576140f66151a5565b5b61410384828501613d7d565b91505092915050565b600060208284031215614122576141216151aa565b5b600061413084828501613dc0565b91505092915050565b60006020828403121561414f5761414e6151aa565b5b600061415d84828501613dd5565b91505092915050565b60006020828403121561417c5761417b6151aa565b5b600082013567ffffffffffffffff81111561419a576141996151a5565b5b6141a684828501613e18565b91505092915050565b6000602082840312156141c5576141c46151aa565b5b60006141d384828501613e46565b91505092915050565b600080604083850312156141f3576141f26151aa565b5b600061420185828601613e46565b925050602061421285828601613e46565b9150509250929050565b6000614228838361476d565b60208301905092915050565b61423d81614ee9565b82525050565b600061424e82614d68565b6142588185614d96565b935061426383614d58565b8060005b8381101561429457815161427b888261421c565b975061428683614d89565b925050600181019050614267565b5085935050505092915050565b6142aa81614efb565b82525050565b60006142bb82614d73565b6142c58185614da7565b93506142d5818560208601614f6c565b6142de816151af565b840191505092915050565b60006142f482614d7e565b6142fe8185614db8565b935061430e818560208601614f6c565b614317816151af565b840191505092915050565b600061432d82614d7e565b6143378185614dc9565b9350614347818560208601614f6c565b80840191505092915050565b6000614360601483614db8565b915061436b826151c0565b602082019050919050565b6000614383601483614db8565b915061438e826151e9565b602082019050919050565b60006143a6601283614db8565b91506143b182615212565b602082019050919050565b60006143c9602b83614db8565b91506143d48261523b565b604082019050919050565b60006143ec603283614db8565b91506143f78261528a565b604082019050919050565b600061440f602683614db8565b915061441a826152d9565b604082019050919050565b6000614432601c83614db8565b915061443d82615328565b602082019050919050565b6000614455602a83614db8565b915061446082615351565b604082019050919050565b6000614478602483614db8565b9150614483826153a0565b604082019050919050565b600061449b601983614db8565b91506144a6826153ef565b602082019050919050565b60006144be602c83614db8565b91506144c982615418565b604082019050919050565b60006144e1603883614db8565b91506144ec82615467565b604082019050919050565b6000614504602a83614db8565b915061450f826154b6565b604082019050919050565b6000614527602983614db8565b915061453282615505565b604082019050919050565b600061454a601083614db8565b915061455582615554565b602082019050919050565b600061456d601983614db8565b91506145788261557d565b602082019050919050565b6000614590602083614db8565b915061459b826155a6565b602082019050919050565b60006145b3602c83614db8565b91506145be826155cf565b604082019050919050565b60006145d6602083614db8565b91506145e18261561e565b602082019050919050565b60006145f9602983614db8565b915061460482615647565b604082019050919050565b600061461c602f83614db8565b915061462782615696565b604082019050919050565b600061463f601383614db8565b915061464a826156e5565b602082019050919050565b6000614662602183614db8565b915061466d8261570e565b604082019050919050565b6000614685601883614db8565b91506146908261575d565b602082019050919050565b60006146a8602483614db8565b91506146b382615786565b604082019050919050565b60006146cb603183614db8565b91506146d6826157d5565b604082019050919050565b60006146ee600983614db8565b91506146f982615824565b602082019050919050565b6000614711602c83614db8565b915061471c8261584d565b604082019050919050565b6000614734602d83614db8565b915061473f8261589c565b604082019050919050565b6000614757601e83614db8565b9150614762826158eb565b602082019050919050565b61477681614f53565b82525050565b61478581614f53565b82525050565b60006147978285614322565b91506147a38284614322565b91508190509392505050565b60006020820190506147c46000830184614234565b92915050565b60006080820190506147df6000830187614234565b6147ec6020830186614234565b6147f9604083018561477c565b818103606083015261480b81846142b0565b905095945050505050565b600060408201905061482b6000830185614234565b614838602083018461477c565b9392505050565b600060208201905081810360008301526148598184614243565b905092915050565b600060208201905061487660008301846142a1565b92915050565b6000602082019050818103600083015261489681846142e9565b905092915050565b600060208201905081810360008301526148b781614353565b9050919050565b600060208201905081810360008301526148d781614376565b9050919050565b600060208201905081810360008301526148f781614399565b9050919050565b60006020820190508181036000830152614917816143bc565b9050919050565b60006020820190508181036000830152614937816143df565b9050919050565b6000602082019050818103600083015261495781614402565b9050919050565b6000602082019050818103600083015261497781614425565b9050919050565b6000602082019050818103600083015261499781614448565b9050919050565b600060208201905081810360008301526149b78161446b565b9050919050565b600060208201905081810360008301526149d78161448e565b9050919050565b600060208201905081810360008301526149f7816144b1565b9050919050565b60006020820190508181036000830152614a17816144d4565b9050919050565b60006020820190508181036000830152614a37816144f7565b9050919050565b60006020820190508181036000830152614a578161451a565b9050919050565b60006020820190508181036000830152614a778161453d565b9050919050565b60006020820190508181036000830152614a9781614560565b9050919050565b60006020820190508181036000830152614ab781614583565b9050919050565b60006020820190508181036000830152614ad7816145a6565b9050919050565b60006020820190508181036000830152614af7816145c9565b9050919050565b60006020820190508181036000830152614b17816145ec565b9050919050565b60006020820190508181036000830152614b378161460f565b9050919050565b60006020820190508181036000830152614b5781614632565b9050919050565b60006020820190508181036000830152614b7781614655565b9050919050565b60006020820190508181036000830152614b9781614678565b9050919050565b60006020820190508181036000830152614bb78161469b565b9050919050565b60006020820190508181036000830152614bd7816146be565b9050919050565b60006020820190508181036000830152614bf7816146e1565b9050919050565b60006020820190508181036000830152614c1781614704565b9050919050565b60006020820190508181036000830152614c3781614727565b9050919050565b60006020820190508181036000830152614c578161474a565b9050919050565b6000602082019050614c73600083018461477c565b92915050565b6000614c83614c94565b9050614c8f8282614fd1565b919050565b6000604051905090565b600067ffffffffffffffff821115614cb957614cb8615167565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ce557614ce4615167565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d1157614d10615167565b5b614d1a826151af565b9050602081019050919050565b600067ffffffffffffffff821115614d4257614d41615167565b5b614d4b826151af565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ddf82614f53565b9150614dea83614f53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e1f57614e1e61507c565b5b828201905092915050565b6000614e3582614f53565b9150614e4083614f53565b925082614e5057614e4f6150ab565b5b828204905092915050565b6000614e6682614f53565b9150614e7183614f53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614eaa57614ea961507c565b5b828202905092915050565b6000614ec082614f53565b9150614ecb83614f53565b925082821015614ede57614edd61507c565b5b828203905092915050565b6000614ef482614f33565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f8a578082015181840152602081019050614f6f565b83811115614f99576000848401525b50505050565b60006002820490506001821680614fb757607f821691505b60208210811415614fcb57614fca6150da565b5b50919050565b614fda826151af565b810181811067ffffffffffffffff82111715614ff957614ff8615167565b5b80604052505050565b600061500d82614f53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150405761503f61507c565b5b600182019050919050565b600061505682614f53565b915061506183614f53565b925082615071576150706150ab565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f53616c6520616c7265616479206163746976652e000000000000000000000000600082015250565b7f53616c65206861736e277420737461727465642e000000000000000000000000600082015250565b7f4e465420616c7265616479206275726e65640000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5175616e746974792063616e6e6f7420626520626967676572207468616e204d60008201527f41585f425559494e472e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e46542773206e6f74206275726e656400000000000000000000000000000000600082015250565b7f546865206c656e6774682073686f756c642062652073616d6500000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652e00000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5175616e746974792063616e6e6f74206265207a65726f2e0000000000000000600082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963652e00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5175616e746974792063616e6e6f7420626520626967676572207468616e204d60008201527f41585f5045525f57414c45542e00000000000000000000000000000000000000602082015250565b7f4f6e6c7920746865206f776e6572206f66204e46542063616e206275726e0000600082015250565b61591d81614ee9565b811461592857600080fd5b50565b61593481614efb565b811461593f57600080fd5b50565b61594b81614f07565b811461595657600080fd5b50565b61596281614f53565b811461596d57600080fd5b5056fea264697066735822122000d383e4272b9ddd21ff6d84f09a59f18a69899f3cdd6300eb8c7d6de6f1f20464736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000457aeea56669fdcdb9dc6eca6fe770744087e34000000000000000000000000000000000000000000000000000000000000000144672656e7a79204475636b732047656e6573697300000000000000000000000000000000000000000000000000000000000000000000000000000000000000034644470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d524768335171363579564766466f46433238416444574d777a7343596551356d586f34566f444533597556642f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102305760003560e01c8063637e53331161012e578063a0712d68116100ab578063c4ac9ea21161006f578063c4ac9ea2146107e9578063c87b56dd14610814578063db44fe0714610851578063e985e9c51461088e578063f2fde38b146108cb57610230565b8063a0712d6814610739578063a22cb46514610755578063a9dc9d251461077e578063b66a0e5d146107a9578063b88d4fde146107c057610230565b80638da5cb5b116100f25780638da5cb5b14610666578063914053e71461069157806391b7f5ed146106ba57806395d89b41146106e3578063a035b1fe1461070e57610230565b8063637e5333146105905780636ba4c138146105b957806370a08231146105d5578063715018a6146106125780638462151c1461062957610230565b80632f745c59116101bc5780634f6ccce7116101805780634f6ccce7146104ab57806355367ba9146104e857806355f804b3146104ff5780635c474f9e146105285780636352211e1461055357610230565b80632f745c59146103dc5780633542aee2146104195780633bdf4bda146104425780633ccfd60b1461046b57806342842e0e1461048257610230565b8063136f3cfc11610203578063136f3cfc1461030357806318160ddd1461032e57806323b872dd1461035957806325b90494146103825780632a55205a1461039e57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061410c565b6108f4565b6040516102699190614861565b60405180910390f35b34801561027e57600080fd5b5061028761096e565b604051610294919061487c565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906141af565b610a00565b6040516102d191906147af565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061400b565b610a85565b005b34801561030f57600080fd5b50610318610b9d565b6040516103259190614c5e565b60405180910390f35b34801561033a57600080fd5b50610343610ba3565b6040516103509190614c5e565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190613ef5565b610bb0565b005b61039c600480360381019061039791906140c3565b610c10565b005b3480156103aa57600080fd5b506103c560048036038101906103c091906141dc565b610e6c565b6040516103d3929190614816565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe919061400b565b610f2c565b6040516104109190614c5e565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b919061400b565b610fd1565b005b34801561044e57600080fd5b50610469600480360381019061046491906141af565b61111a565b005b34801561047757600080fd5b506104806111a0565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613ef5565b61142b565b005b3480156104b757600080fd5b506104d260048036038101906104cd91906141af565b61144b565b6040516104df9190614c5e565b60405180910390f35b3480156104f457600080fd5b506104fd6114bc565b005b34801561050b57600080fd5b5061052660048036038101906105219190614166565b6115a4565b005b34801561053457600080fd5b5061053d61163a565b60405161054a9190614861565b60405180910390f35b34801561055f57600080fd5b5061057a600480360381019061057591906141af565b61164d565b60405161058791906147af565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b291906141dc565b6116ff565b005b6105d360048036038101906105ce91906140c3565b61178d565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613e5b565b611bce565b6040516106099190614c5e565b60405180910390f35b34801561061e57600080fd5b50610627611c86565b005b34801561063557600080fd5b50610650600480360381019061064b9190613e5b565b611dc3565b60405161065d919061483f565b60405180910390f35b34801561067257600080fd5b5061067b611ecd565b60405161068891906147af565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b3919061404b565b611ef7565b005b3480156106c657600080fd5b506106e160048036038101906106dc91906141af565b61201a565b005b3480156106ef57600080fd5b506106f86120a0565b604051610705919061487c565b60405180910390f35b34801561071a57600080fd5b50610723612132565b6040516107309190614c5e565b60405180910390f35b610753600480360381019061074e91906141af565b612138565b005b34801561076157600080fd5b5061077c60048036038101906107779190613fcb565b612384565b005b34801561078a57600080fd5b50610793612505565b6040516107a09190614c5e565b60405180910390f35b3480156107b557600080fd5b506107be61250b565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613f48565b6125f4565b005b3480156107f557600080fd5b506107fe612656565b60405161080b9190614c5e565b60405180910390f35b34801561082057600080fd5b5061083b600480360381019061083691906141af565b61265c565b604051610848919061487c565b60405180910390f35b34801561085d57600080fd5b50610878600480360381019061087391906141af565b612703565b6040516108859190614861565b60405180910390f35b34801561089a57600080fd5b506108b560048036038101906108b09190613eb5565b61273b565b6040516108c29190614861565b60405180910390f35b3480156108d757600080fd5b506108f260048036038101906108ed9190613e5b565b6127cf565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096757506109668261297b565b5b9050919050565b60606000805461097d90614f9f565b80601f01602080910402602001604051908101604052809291908181526020018280546109a990614f9f565b80156109f65780601f106109cb576101008083540402835291602001916109f6565b820191906000526020600020905b8154815290600101906020018083116109d957829003601f168201915b5050505050905090565b6000610a0b826129f5565b610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4190614abe565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a908261164d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af890614b5e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b20612a61565b73ffffffffffffffffffffffffffffffffffffffff161480610b4f5750610b4e81610b49612a61565b61273b565b5b610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906149fe565b60405180910390fd5b610b988383612a69565b505050565b600e5481565b6000600880549050905090565b610bc1610bbb612a61565b82612b22565b610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf790614bbe565b60405180910390fd5b610c0b838383612c00565b505050565b60005b6006811015610ddc573373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110610c8457610c83615138565b5b60200260200101516040518263ffffffff1660e01b8152600401610ca89190614c5e565b60206040518083038186803b158015610cc057600080fd5b505afa158015610cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf89190613e88565b73ffffffffffffffffffffffffffffffffffffffff1614610d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4590614c3e565b60405180910390fd5b60166000838381518110610d6557610d64615138565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff1615610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc0906148de565b60405180910390fd5b8080610dd490615002565b915050610c13565b5060005b6006811015610e68573360176000848481518110610e0157610e00615138565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080610e6090615002565b915050610de0565b5050565b6000806000600b6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff1685610f189190614e5b565b610f229190614e2a565b9150509250929050565b6000610f3783611bce565b8210610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f906148fe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fd9612a61565b73ffffffffffffffffffffffffffffffffffffffff16610ff7611ecd565b73ffffffffffffffffffffffffffffffffffffffff161461104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490614ade565b60405180910390fd5b60008111611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108790614b7e565b60405180910390fd5b600d546110ad8261109f610ba3565b612e5c90919063ffffffff16565b11156110ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e590614bde565b60405180910390fd5b60005b818110156111155761110283612e72565b808061110d90615002565b9150506110f1565b505050565b611122612a61565b73ffffffffffffffffffffffffffffffffffffffff16611140611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90614ade565b60405180910390fd5b80600d8190555050565b6111a8612a61565b73ffffffffffffffffffffffffffffffffffffffff166111c6611ecd565b73ffffffffffffffffffffffffffffffffffffffff161461121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390614ade565b60405180910390fd5b6000479050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc606460058461126c9190614e5b565b6112769190614e2a565b9081150290604051600060405180830381858888f193505050501580156112a1573d6000803e3d6000fd5b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc60646005846112ed9190614e5b565b6112f79190614e2a565b9081150290604051600060405180830381858888f19350505050158015611322573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e8604b8461136f9190614e5b565b6113799190614e2a565b9081150290604051600060405180830381858888f193505050501580156113a4573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e8610339846113f29190614e5b565b6113fc9190614e2a565b9081150290604051600060405180830381858888f19350505050158015611427573d6000803e3d6000fd5b5050565b611446838383604051806020016040528060008152506125f4565b505050565b6000611455610ba3565b8210611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d90614bfe565b60405180910390fd5b600882815481106114aa576114a9615138565b5b90600052602060002001549050919050565b6114c4612a61565b73ffffffffffffffffffffffffffffffffffffffff166114e2611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f90614ade565b60405180910390fd5b601860009054906101000a900460ff16611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90614b3e565b60405180910390fd5b6000601860006101000a81548160ff021916908315150217905550565b6115ac612a61565b73ffffffffffffffffffffffffffffffffffffffff166115ca611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161790614ade565b60405180910390fd5b80600c9080519060200190611636929190613b1e565b5050565b601860009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90614a3e565b60405180910390fd5b80915050919050565b611707612a61565b73ffffffffffffffffffffffffffffffffffffffff16611725611ecd565b73ffffffffffffffffffffffffffffffffffffffff161461177b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177290614ade565b60405180910390fd5b81600e8190555080600f819055505050565b60005b60068110156118e2573373ffffffffffffffffffffffffffffffffffffffff16601760008484815181106117c7576117c6615138565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90614c3e565b60405180910390fd5b6016600083838151811061186b5761186a615138565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff16156118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c6906148de565b60405180910390fd5b80806118da90615002565b915050611790565b506000600667ffffffffffffffff811115611900576118ff615167565b5b60405190808252806020026020018201604052801561192e5781602001602082028036833780820191505090505b50905060005b6006811015611ae05760016016600085848151811061195657611955615138565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8483815181106119d4576119d3615138565b5b60200260200101516040518263ffffffff1660e01b81526004016119f89190614c5e565b60206040518083038186803b158015611a1057600080fd5b505afa925050508015611a4157506040513d601f19601f82011682018060405250810190611a3e9190613e88565b60015b611aa4573d8060008114611a71576040519150601f19603f3d011682016040523d82523d6000602084013e611a76565b606091505b506001838381518110611a8c57611a8b615138565b5b60200260200101901515908115158152505050611acd565b6000838381518110611ab957611ab8615138565b5b602002602001019015159081151581525050505b8080611ad890615002565b915050611934565b5060005b6006811015611b5a57818181518110611b0057611aff615138565b5b6020026020010151611b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3e90614a5e565b60405180910390fd5b8080611b5290615002565b915050611ae4565b5060005b6006811015611bc057600160166000858481518110611b8057611b7f615138565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611bb890615002565b915050611b5e565b50611bca33612e72565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3690614a1e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c8e612a61565b73ffffffffffffffffffffffffffffffffffffffff16611cac611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf990614ade565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60606000611dd083611bce565b90506000811415611e2d57600067ffffffffffffffff811115611df657611df5615167565b5b604051908082528060200260200182016040528015611e245781602001602082028036833780820191505090505b50915050611ec8565b60008167ffffffffffffffff811115611e4957611e48615167565b5b604051908082528060200260200182016040528015611e775781602001602082028036833780820191505090505b50905060005b82811015611ec157611e8f8582610f2c565b828281518110611ea257611ea1615138565b5b6020026020010181815250508080611eb990615002565b915050611e7d565b5080925050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611eff612a61565b73ffffffffffffffffffffffffffffffffffffffff16611f1d611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614611f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6a90614ade565b60405180910390fd5b8051825114611fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fae90614a7e565b60405180910390fd5b60005b825181101561201557612001838281518110611fd957611fd8615138565b5b6020026020010151838381518110611ff457611ff3615138565b5b6020026020010151610fd1565b60018161200e9190614dd4565b9050611fba565b505050565b612022612a61565b73ffffffffffffffffffffffffffffffffffffffff16612040611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208d90614ade565b60405180910390fd5b8060158190555050565b6060600180546120af90614f9f565b80601f01602080910402602001604051908101604052809291908181526020018280546120db90614f9f565b80156121285780601f106120fd57610100808354040283529160200191612128565b820191906000526020600020905b81548152906001019060200180831161210b57829003601f168201915b5050505050905090565b60155481565b601860009054906101000a900460ff16612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e906148be565b60405180910390fd5b600081116121ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c190614b7e565b60405180910390fd5b600e5481111561220f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122069061497e565b60405180910390fd5b600f5461221b33611bce565b826122269190614dd4565b1115612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e90614c1e565b60405180910390fd5b600d5461228482612276610ba3565b612e5c90919063ffffffff16565b11156122c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bc90614bde565b60405180910390fd5b6122da81601554612ee390919063ffffffff16565b3410158061231a57506122eb611ecd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235090614b9e565b60405180910390fd5b60005b818110156123805761236d33612e72565b808061237890615002565b91505061235c565b5050565b61238c612a61565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f1906149be565b60405180910390fd5b8060056000612407612a61565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166124b4612a61565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124f99190614861565b60405180910390a35050565b600d5481565b612513612a61565b73ffffffffffffffffffffffffffffffffffffffff16612531611ecd565b73ffffffffffffffffffffffffffffffffffffffff1614612587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257e90614ade565b60405180910390fd5b601860009054906101000a900460ff16156125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce9061489e565b60405180910390fd5b6001601860006101000a81548160ff021916908315150217905550565b6126056125ff612a61565b83612b22565b612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90614bbe565b60405180910390fd5b61265084848484612ef9565b50505050565b600f5481565b6060612667826129f5565b6126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90614b1e565b60405180910390fd5b60006126b0612f55565b905060008151116126d057604051806020016040528060008152506126fb565b806126da84612fe7565b6040516020016126eb92919061478b565b6040516020818303038152906040525b915050919050565b60006016600083815260200190815260200160002060009054906101000a900460ff16612731576000612734565b60015b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6127d7612a61565b73ffffffffffffffffffffffffffffffffffffffff166127f5611ecd565b73ffffffffffffffffffffffffffffffffffffffff161461284b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284290614ade565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b29061493e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129ee57506129ed82613148565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612adc8361164d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b2d826129f5565b612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b63906149de565b60405180910390fd5b6000612b778361164d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612be657508373ffffffffffffffffffffffffffffffffffffffff16612bce84610a00565b73ffffffffffffffffffffffffffffffffffffffff16145b80612bf75750612bf6818561273b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c208261164d565b73ffffffffffffffffffffffffffffffffffffffff1614612c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6d90614afe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdd9061499e565b60405180910390fd5b612cf18383836131c2565b612cfc600082612a69565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d4c9190614eb5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612da39190614dd4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612e6a9190614dd4565b905092915050565b6000612e8f6001612e81610ba3565b612e5c90919063ffffffff16565b9050612e9b82826132d6565b8173ffffffffffffffffffffffffffffffffffffffff16817fade44088f434e3d43dc50ac93f56697611c5b05f5791bafbbb76daf5dcda1d6760405160405180910390a35050565b60008183612ef19190614e5b565b905092915050565b612f04848484612c00565b612f10848484846132f4565b612f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f469061491e565b60405180910390fd5b50505050565b6060600c8054612f6490614f9f565b80601f0160208091040260200160405190810160405280929190818152602001828054612f9090614f9f565b8015612fdd5780601f10612fb257610100808354040283529160200191612fdd565b820191906000526020600020905b815481529060010190602001808311612fc057829003601f168201915b5050505050905090565b6060600082141561302f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613143565b600082905060005b6000821461306157808061304a90615002565b915050600a8261305a9190614e2a565b9150613037565b60008167ffffffffffffffff81111561307d5761307c615167565b5b6040519080825280601f01601f1916602001820160405280156130af5781602001600182028036833780820191505090505b5090505b6000851461313c576001826130c89190614eb5565b9150600a856130d7919061504b565b60306130e39190614dd4565b60f81b8183815181106130f9576130f8615138565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131359190614e2a565b94506130b3565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131bb57506131ba8261348b565b5b9050919050565b6131cd83838361356d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132105761320b81613572565b61324f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461324e5761324d83826135bb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132925761328d81613728565b6132d1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132d0576132cf82826137f9565b5b5b505050565b6132f0828260405180602001604052806000815250613878565b5050565b60006133158473ffffffffffffffffffffffffffffffffffffffff166138d3565b1561347e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261333e612a61565b8786866040518563ffffffff1660e01b815260040161336094939291906147ca565b602060405180830381600087803b15801561337a57600080fd5b505af19250505080156133ab57506040513d601f19601f820116820180604052508101906133a89190614139565b60015b61342e573d80600081146133db576040519150601f19603f3d011682016040523d82523d6000602084013e6133e0565b606091505b50600081511415613426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341d9061491e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613483565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061355657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806135665750613565826138e6565b5b9050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135c884611bce565b6135d29190614eb5565b90506000600760008481526020019081526020016000205490508181146136b7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061373c9190614eb5565b905060006009600084815260200190815260200160002054905060006008838154811061376c5761376b615138565b5b90600052602060002001549050806008838154811061378e5761378d615138565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137dd576137dc615109565b5b6001900381819060005260206000200160009055905550505050565b600061380483611bce565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6138828383613950565b61388f60008484846132f4565b6138ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c59061491e565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b790614a9e565b60405180910390fd5b6139c9816129f5565b15613a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a009061495e565b60405180910390fd5b613a15600083836131c2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a659190614dd4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613b2a90614f9f565b90600052602060002090601f016020900481019282613b4c5760008555613b93565b82601f10613b6557805160ff1916838001178555613b93565b82800160010185558215613b93579182015b82811115613b92578251825591602001919060010190613b77565b5b509050613ba09190613ba4565b5090565b5b80821115613bbd576000816000905550600101613ba5565b5090565b6000613bd4613bcf84614c9e565b614c79565b90508083825260208201905082856020860282011115613bf757613bf661519b565b5b60005b85811015613c275781613c0d8882613d25565b845260208401935060208301925050600181019050613bfa565b5050509392505050565b6000613c44613c3f84614cca565b614c79565b90508083825260208201905082856020860282011115613c6757613c6661519b565b5b60005b85811015613c975781613c7d8882613e46565b845260208401935060208301925050600181019050613c6a565b5050509392505050565b6000613cb4613caf84614cf6565b614c79565b905082815260208101848484011115613cd057613ccf6151a0565b5b613cdb848285614f5d565b509392505050565b6000613cf6613cf184614d27565b614c79565b905082815260208101848484011115613d1257613d116151a0565b5b613d1d848285614f5d565b509392505050565b600081359050613d3481615914565b92915050565b600081519050613d4981615914565b92915050565b600082601f830112613d6457613d63615196565b5b8135613d74848260208601613bc1565b91505092915050565b600082601f830112613d9257613d91615196565b5b8135613da2848260208601613c31565b91505092915050565b600081359050613dba8161592b565b92915050565b600081359050613dcf81615942565b92915050565b600081519050613de481615942565b92915050565b600082601f830112613dff57613dfe615196565b5b8135613e0f848260208601613ca1565b91505092915050565b600082601f830112613e2d57613e2c615196565b5b8135613e3d848260208601613ce3565b91505092915050565b600081359050613e5581615959565b92915050565b600060208284031215613e7157613e706151aa565b5b6000613e7f84828501613d25565b91505092915050565b600060208284031215613e9e57613e9d6151aa565b5b6000613eac84828501613d3a565b91505092915050565b60008060408385031215613ecc57613ecb6151aa565b5b6000613eda85828601613d25565b9250506020613eeb85828601613d25565b9150509250929050565b600080600060608486031215613f0e57613f0d6151aa565b5b6000613f1c86828701613d25565b9350506020613f2d86828701613d25565b9250506040613f3e86828701613e46565b9150509250925092565b60008060008060808587031215613f6257613f616151aa565b5b6000613f7087828801613d25565b9450506020613f8187828801613d25565b9350506040613f9287828801613e46565b925050606085013567ffffffffffffffff811115613fb357613fb26151a5565b5b613fbf87828801613dea565b91505092959194509250565b60008060408385031215613fe257613fe16151aa565b5b6000613ff085828601613d25565b925050602061400185828601613dab565b9150509250929050565b60008060408385031215614022576140216151aa565b5b600061403085828601613d25565b925050602061404185828601613e46565b9150509250929050565b60008060408385031215614062576140616151aa565b5b600083013567ffffffffffffffff8111156140805761407f6151a5565b5b61408c85828601613d4f565b925050602083013567ffffffffffffffff8111156140ad576140ac6151a5565b5b6140b985828601613d7d565b9150509250929050565b6000602082840312156140d9576140d86151aa565b5b600082013567ffffffffffffffff8111156140f7576140f66151a5565b5b61410384828501613d7d565b91505092915050565b600060208284031215614122576141216151aa565b5b600061413084828501613dc0565b91505092915050565b60006020828403121561414f5761414e6151aa565b5b600061415d84828501613dd5565b91505092915050565b60006020828403121561417c5761417b6151aa565b5b600082013567ffffffffffffffff81111561419a576141996151a5565b5b6141a684828501613e18565b91505092915050565b6000602082840312156141c5576141c46151aa565b5b60006141d384828501613e46565b91505092915050565b600080604083850312156141f3576141f26151aa565b5b600061420185828601613e46565b925050602061421285828601613e46565b9150509250929050565b6000614228838361476d565b60208301905092915050565b61423d81614ee9565b82525050565b600061424e82614d68565b6142588185614d96565b935061426383614d58565b8060005b8381101561429457815161427b888261421c565b975061428683614d89565b925050600181019050614267565b5085935050505092915050565b6142aa81614efb565b82525050565b60006142bb82614d73565b6142c58185614da7565b93506142d5818560208601614f6c565b6142de816151af565b840191505092915050565b60006142f482614d7e565b6142fe8185614db8565b935061430e818560208601614f6c565b614317816151af565b840191505092915050565b600061432d82614d7e565b6143378185614dc9565b9350614347818560208601614f6c565b80840191505092915050565b6000614360601483614db8565b915061436b826151c0565b602082019050919050565b6000614383601483614db8565b915061438e826151e9565b602082019050919050565b60006143a6601283614db8565b91506143b182615212565b602082019050919050565b60006143c9602b83614db8565b91506143d48261523b565b604082019050919050565b60006143ec603283614db8565b91506143f78261528a565b604082019050919050565b600061440f602683614db8565b915061441a826152d9565b604082019050919050565b6000614432601c83614db8565b915061443d82615328565b602082019050919050565b6000614455602a83614db8565b915061446082615351565b604082019050919050565b6000614478602483614db8565b9150614483826153a0565b604082019050919050565b600061449b601983614db8565b91506144a6826153ef565b602082019050919050565b60006144be602c83614db8565b91506144c982615418565b604082019050919050565b60006144e1603883614db8565b91506144ec82615467565b604082019050919050565b6000614504602a83614db8565b915061450f826154b6565b604082019050919050565b6000614527602983614db8565b915061453282615505565b604082019050919050565b600061454a601083614db8565b915061455582615554565b602082019050919050565b600061456d601983614db8565b91506145788261557d565b602082019050919050565b6000614590602083614db8565b915061459b826155a6565b602082019050919050565b60006145b3602c83614db8565b91506145be826155cf565b604082019050919050565b60006145d6602083614db8565b91506145e18261561e565b602082019050919050565b60006145f9602983614db8565b915061460482615647565b604082019050919050565b600061461c602f83614db8565b915061462782615696565b604082019050919050565b600061463f601383614db8565b915061464a826156e5565b602082019050919050565b6000614662602183614db8565b915061466d8261570e565b604082019050919050565b6000614685601883614db8565b91506146908261575d565b602082019050919050565b60006146a8602483614db8565b91506146b382615786565b604082019050919050565b60006146cb603183614db8565b91506146d6826157d5565b604082019050919050565b60006146ee600983614db8565b91506146f982615824565b602082019050919050565b6000614711602c83614db8565b915061471c8261584d565b604082019050919050565b6000614734602d83614db8565b915061473f8261589c565b604082019050919050565b6000614757601e83614db8565b9150614762826158eb565b602082019050919050565b61477681614f53565b82525050565b61478581614f53565b82525050565b60006147978285614322565b91506147a38284614322565b91508190509392505050565b60006020820190506147c46000830184614234565b92915050565b60006080820190506147df6000830187614234565b6147ec6020830186614234565b6147f9604083018561477c565b818103606083015261480b81846142b0565b905095945050505050565b600060408201905061482b6000830185614234565b614838602083018461477c565b9392505050565b600060208201905081810360008301526148598184614243565b905092915050565b600060208201905061487660008301846142a1565b92915050565b6000602082019050818103600083015261489681846142e9565b905092915050565b600060208201905081810360008301526148b781614353565b9050919050565b600060208201905081810360008301526148d781614376565b9050919050565b600060208201905081810360008301526148f781614399565b9050919050565b60006020820190508181036000830152614917816143bc565b9050919050565b60006020820190508181036000830152614937816143df565b9050919050565b6000602082019050818103600083015261495781614402565b9050919050565b6000602082019050818103600083015261497781614425565b9050919050565b6000602082019050818103600083015261499781614448565b9050919050565b600060208201905081810360008301526149b78161446b565b9050919050565b600060208201905081810360008301526149d78161448e565b9050919050565b600060208201905081810360008301526149f7816144b1565b9050919050565b60006020820190508181036000830152614a17816144d4565b9050919050565b60006020820190508181036000830152614a37816144f7565b9050919050565b60006020820190508181036000830152614a578161451a565b9050919050565b60006020820190508181036000830152614a778161453d565b9050919050565b60006020820190508181036000830152614a9781614560565b9050919050565b60006020820190508181036000830152614ab781614583565b9050919050565b60006020820190508181036000830152614ad7816145a6565b9050919050565b60006020820190508181036000830152614af7816145c9565b9050919050565b60006020820190508181036000830152614b17816145ec565b9050919050565b60006020820190508181036000830152614b378161460f565b9050919050565b60006020820190508181036000830152614b5781614632565b9050919050565b60006020820190508181036000830152614b7781614655565b9050919050565b60006020820190508181036000830152614b9781614678565b9050919050565b60006020820190508181036000830152614bb78161469b565b9050919050565b60006020820190508181036000830152614bd7816146be565b9050919050565b60006020820190508181036000830152614bf7816146e1565b9050919050565b60006020820190508181036000830152614c1781614704565b9050919050565b60006020820190508181036000830152614c3781614727565b9050919050565b60006020820190508181036000830152614c578161474a565b9050919050565b6000602082019050614c73600083018461477c565b92915050565b6000614c83614c94565b9050614c8f8282614fd1565b919050565b6000604051905090565b600067ffffffffffffffff821115614cb957614cb8615167565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ce557614ce4615167565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d1157614d10615167565b5b614d1a826151af565b9050602081019050919050565b600067ffffffffffffffff821115614d4257614d41615167565b5b614d4b826151af565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ddf82614f53565b9150614dea83614f53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e1f57614e1e61507c565b5b828201905092915050565b6000614e3582614f53565b9150614e4083614f53565b925082614e5057614e4f6150ab565b5b828204905092915050565b6000614e6682614f53565b9150614e7183614f53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614eaa57614ea961507c565b5b828202905092915050565b6000614ec082614f53565b9150614ecb83614f53565b925082821015614ede57614edd61507c565b5b828203905092915050565b6000614ef482614f33565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f8a578082015181840152602081019050614f6f565b83811115614f99576000848401525b50505050565b60006002820490506001821680614fb757607f821691505b60208210811415614fcb57614fca6150da565b5b50919050565b614fda826151af565b810181811067ffffffffffffffff82111715614ff957614ff8615167565b5b80604052505050565b600061500d82614f53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150405761503f61507c565b5b600182019050919050565b600061505682614f53565b915061506183614f53565b925082615071576150706150ab565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f53616c6520616c7265616479206163746976652e000000000000000000000000600082015250565b7f53616c65206861736e277420737461727465642e000000000000000000000000600082015250565b7f4e465420616c7265616479206275726e65640000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5175616e746974792063616e6e6f7420626520626967676572207468616e204d60008201527f41585f425559494e472e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e46542773206e6f74206275726e656400000000000000000000000000000000600082015250565b7f546865206c656e6774682073686f756c642062652073616d6500000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976652e00000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5175616e746974792063616e6e6f74206265207a65726f2e0000000000000000600082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963652e00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5175616e746974792063616e6e6f7420626520626967676572207468616e204d60008201527f41585f5045525f57414c45542e00000000000000000000000000000000000000602082015250565b7f4f6e6c7920746865206f776e6572206f66204e46542063616e206275726e0000600082015250565b61591d81614ee9565b811461592857600080fd5b50565b61593481614efb565b811461593f57600080fd5b50565b61594b81614f07565b811461595657600080fd5b50565b61596281614f53565b811461596d57600080fd5b5056fea264697066735822122000d383e4272b9ddd21ff6d84f09a59f18a69899f3cdd6300eb8c7d6de6f1f20464736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000457aeea56669fdcdb9dc6eca6fe770744087e34000000000000000000000000000000000000000000000000000000000000000144672656e7a79204475636b732047656e6573697300000000000000000000000000000000000000000000000000000000000000000000000000000000000000034644470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d524768335171363579564766466f46433238416444574d777a7343596551356d586f34566f444533597556642f00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Frenzy Ducks Genesis
Arg [1] : symbol (string): FDG
Arg [2] : baseURI_ (string): https://ipfs.io/ipfs/QmRGh3Qq65yVGfFoFC28AdDWMwzsCYeQ5mXo4VoDE3YuVd/
Arg [3] : _oldContract (address): 0x457aEeA56669fdCdB9Dc6ecA6fE770744087E340
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 000000000000000000000000457aeea56669fdcdb9dc6eca6fe770744087e340
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [5] : 4672656e7a79204475636b732047656e65736973000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 4644470000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [9] : 68747470733a2f2f697066732e696f2f697066732f516d524768335171363579
Arg [10] : 564766466f46433238416444574d777a7343596551356d586f34566f44453359
Arg [11] : 7556642f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
301:6208:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1510:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2343:98:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3755:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3306:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;470:24:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1546:111:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4619:300:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2642:422:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;730:312:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1222:253:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3982:307:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5539:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6137:370;;;;;;;;;;;;;:::i;:::-;;4985:149:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1729:230:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5993:138:10;;;;;;;;;;;;;:::i;:::-;;5236:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1038:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2046:235:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5667:171:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3070:902;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1784:205:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:21;;;;;;;;;;;;;:::i;:::-;;4662:431:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1061:85:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4299:357:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5448:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2505:102:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;881:37:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1969:667;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4039:290:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;431:33:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5848:139;;;;;;;;;;;;;:::i;:::-;;5200:282:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;500:29:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2673:353:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5103:123:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4395:162:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:21;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1510:264:10;1626:4;1680:35;1665:50;;;:11;:50;;;;:102;;;;1731:36;1755:11;1731:23;:36::i;:::-;1665:102;1646:121;;1510:264;;;:::o;2343:98:6:-;2397:13;2429:5;2422:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2343:98;:::o;3755:217::-;3831:7;3858:16;3866:7;3858;:16::i;:::-;3850:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3941:15;:24;3957:7;3941:24;;;;;;;;;;;;;;;;;;;;;3934:31;;3755:217;;;:::o;3306:388::-;3386:13;3402:23;3417:7;3402:14;:23::i;:::-;3386:39;;3449:5;3443:11;;:2;:11;;;;3435:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3527:5;3511:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3536:37;3553:5;3560:12;:10;:12::i;:::-;3536:16;:37::i;:::-;3511:62;3503:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;3666:21;3675:2;3679:7;3666:8;:21::i;:::-;3376:318;3306:388;;:::o;470:24:10:-;;;;:::o;1546:111:7:-;1607:7;1633:10;:17;;;;1626:24;;1546:111;:::o;4619:300:6:-;4778:41;4797:12;:10;:12::i;:::-;4811:7;4778:18;:41::i;:::-;4770:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4884:28;4894:4;4900:2;4904:7;4884:9;:28::i;:::-;4619:300;;;:::o;2642:422:10:-;2724:6;2719:229;2740:1;2736;:5;2719:229;;;2811:10;2771:50;;:11;;;;;;;;;;;:19;;;2791:12;2804:1;2791:15;;;;;;;;:::i;:::-;;;;;;;;2771:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;2762:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;2880:17;:34;2898:12;2911:1;2898:15;;;;;;;;:::i;:::-;;;;;;;;2880:34;;;;;;;;;;;;;;;;;;;;;2879:35;2870:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2743:3;;;;;:::i;:::-;;;;2719:229;;;;2963:6;2958:100;2979:1;2975;:5;2958:100;;;3037:10;3001:16;:33;3018:12;3031:1;3018:15;;;;;;;;:::i;:::-;;;;;;;;3001:33;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;2982:3;;;;;:::i;:::-;;;;2958:100;;;;2642:422;:::o;730:312:5:-;839:16;857:21;894:28;925:10;894:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;956:9;:19;;;945:30;;1030:5;1010:9;:16;;;1002:24;;:5;:24;;;;:::i;:::-;1001:34;;;;:::i;:::-;985:50;;884:158;730:312;;;;;:::o;1222:253:7:-;1319:7;1354:23;1371:5;1354:16;:23::i;:::-;1346:5;:31;1338:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1442:12;:19;1455:5;1442:19;;;;;;;;;;;;;;;:26;1462:5;1442:26;;;;;;;;;;;;1435:33;;1222:253;;;;:::o;3982:307:10:-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4082:1:10::1;4070:9;:13;4062:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;4162:15;;4130:28;4148:9;4130:13;:11;:13::i;:::-;:17;;:28;;;;:::i;:::-;:47;;4122:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;4215:6;4210:73;4231:9;4227:1;:13;4210:73;;;4261:11;4268:3;4261:6;:11::i;:::-;4242:3;;;;;:::i;:::-;;;;4210:73;;;;3982:307:::0;;:::o;5539:118::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5635:15:10::1;5617;:33;;;;5539:118:::0;:::o;6137:370::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6192:15:10::1;6210:21;6192:39;;6249:16;;;;;;;;;;;6241:34;;:57;6293:3;6288:1;6278:7;:11;;;;:::i;:::-;6277:19;;;;:::i;:::-;6241:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6316:16;;;;;;;;;;;6308:34;;:57;6360:3;6355:1;6345:7;:11;;;;:::i;:::-;6344:19;;;;:::i;:::-;6308:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6383:10;;;;;;;;;;;6375:28;;:53;6422:4;6416:2;6406:7;:12;;;;:::i;:::-;6405:21;;;;:::i;:::-;6375:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6446:18;;;;;;;;;;;6438:36;;:62;6494:4;6487:3;6477:7;:13;;;;:::i;:::-;6476:22;;;;:::i;:::-;6438:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6174:333;6137:370::o:0;4985:149:6:-;5088:39;5105:4;5111:2;5115:7;5088:39;;;;;;;;;;;;:16;:39::i;:::-;4985:149;;;:::o;1729:230:7:-;1804:7;1839:30;:28;:30::i;:::-;1831:5;:38;1823:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1935:10;1946:5;1935:17;;;;;;;;:::i;:::-;;;;;;;;;;1928:24;;1729:230;;;:::o;5993:138:10:-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6051:11:10::1;;;;;;;;;;;6043:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;6119:5;6105:11;;:19;;;;;;;;;;;;;;;;;;5993:138::o:0;5236:90::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5315:4:10::1;5305:7;:14;;;;;;;;;;;;:::i;:::-;;5236:90:::0;:::o;1038:31::-;;;;;;;;;;;;;:::o;2046:235:6:-;2118:7;2137:13;2153:7;:16;2161:7;2153:16;;;;;;;;;;;;;;;;;;;;;2137:32;;2204:1;2187:19;;:5;:19;;;;2179:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2269:5;2262:12;;;2046:235;;;:::o;5667:171:10:-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5773:8:10::1;5762;:19;;;;5807:24;5791:13;:40;;;;5667:171:::0;;:::o;3070:902::-;3150:6;3145:226;3166:1;3162;:5;3145:226;;;3234:10;3197:47;;:16;:33;3214:12;3227:1;3214:15;;;;;;;;:::i;:::-;;;;;;;;3197:33;;;;;;;;;;;;;;;;;;;;;:47;;;3188:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;3303:17;:34;3321:12;3334:1;3321:15;;;;;;;;:::i;:::-;;;;;;;;3303:34;;;;;;;;;;;;;;;;;;;;;3302:35;3293:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3169:3;;;;;:::i;:::-;;;;3145:226;;;;3381:19;3414:1;3403:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3381:35;;3431:6;3426:304;3447:1;3443;:5;3426:304;;;3506:4;3469:17;:34;3487:12;3500:1;3487:15;;;;;;;;:::i;:::-;;;;;;;;3469:34;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;3528:11;;;;;;;;;;;:19;;;3548:12;3561:1;3548:15;;;;;;;;:::i;:::-;;;;;;;;3528:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3524:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3701:4;3690:5;3696:1;3690:8;;;;;;;;:::i;:::-;;;;;;;:15;;;;;;;;;;;3634:86;3524:196;;;3613:5;3602;3608:1;3602:8;;;;;;;;:::i;:::-;;;;;;;:16;;;;;;;;;;;3565:68;3524:196;3450:3;;;;;:::i;:::-;;;;3426:304;;;;3745:6;3740:92;3761:1;3757;:5;3740:92;;;3792:5;3798:1;3792:8;;;;;;;;:::i;:::-;;;;;;;;3783:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;3764:3;;;;;:::i;:::-;;;;3740:92;;;;3847:6;3842:95;3863:1;3859;:5;3842:95;;;3922:4;3885:17;:34;3903:12;3916:1;3903:15;;;;;;;;:::i;:::-;;;;;;;;3885:34;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;3866:3;;;;;:::i;:::-;;;;3842:95;;;;3947:18;3954:10;3947:6;:18::i;:::-;3134:838;3070:902;:::o;1784:205:6:-;1856:7;1900:1;1883:19;;:5;:19;;;;1875:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1966:9;:16;1976:5;1966:16;;;;;;;;;;;;;;;;1959:23;;1784:205;;;:::o;1693:145:21:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;;;;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6;;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;4662:431:10:-;4721:13;4747:15;4765:17;4775:6;4765:9;:17::i;:::-;4747:35;;4810:1;4796:10;:15;4792:295;;;4845:1;4834:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4827:20;;;;;4792:295;4878:20;4912:10;4901:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4878:45;;4942:6;4937:113;4958:10;4954:1;:14;4937:113;;;5005:30;5025:6;5033:1;5005:19;:30::i;:::-;4993:6;5000:1;4993:9;;;;;;;;:::i;:::-;;;;;;;:42;;;;;4970:3;;;;;:::i;:::-;;;;4937:113;;;;5070:6;5063:13;;;;4662:431;;;;:::o;1061:85:21:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;4299:357:10:-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4457:13:10::1;:20;4430:16;:23;:47;4421:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;4523:9;4518:132;4542:16;:23;4538:1;:27;4518:132;;;4589:50;4601:16;4618:1;4601:19;;;;;;;;:::i;:::-;;;;;;;;4622:13;4636:1;4622:16;;;;;;;;:::i;:::-;;;;;;;;4589:11;:50::i;:::-;4572:1;4567:6;;;;;:::i;:::-;;;4518:132;;;;4299:357:::0;;:::o;5448:81::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5516:6:10::1;5508:5;:14;;;;5448:81:::0;:::o;2505:102:6:-;2561:13;2593:7;2586:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2505:102;:::o;881:37:10:-;;;;:::o;1969:667::-;2035:11;;;;;;;;;;;2027:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;2101:1;2089:9;:13;2081:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;2162:8;;2149:9;:21;;2141:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2272:13;;2247:21;2257:10;2247:9;:21::i;:::-;2235:9;:33;;;;:::i;:::-;:50;;2227:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;2385:15;;2353:28;2371:9;2353:13;:11;:13::i;:::-;:17;;:28;;;;:::i;:::-;:47;;2345:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2445:20;2455:9;2445:5;;:9;;:20;;;;:::i;:::-;2432:9;:33;;:58;;;;2483:7;:5;:7::i;:::-;2469:21;;:10;:21;;;2432:58;2424:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2555:6;2550:80;2571:9;2567:1;:13;2550:80;;;2601:18;2608:10;2601:6;:18::i;:::-;2582:3;;;;;:::i;:::-;;;;2550:80;;;;1969:667;:::o;4039:290:6:-;4153:12;:10;:12::i;:::-;4141:24;;:8;:24;;;;4133:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4251:8;4206:18;:32;4225:12;:10;:12::i;:::-;4206:32;;;;;;;;;;;;;;;:42;4239:8;4206:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4303:8;4274:48;;4289:12;:10;:12::i;:::-;4274:48;;;4313:8;4274:48;;;;;;:::i;:::-;;;;;;;;4039:290;;:::o;431:33:10:-;;;;:::o;5848:139::-;1284:12:21;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5907:11:10::1;;;;;;;;;;;5906:12;5898:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;5976:4;5962:11;;:18;;;;;;;;;;;;;;;;;;5848:139::o:0;5200:282:6:-;5331:41;5350:12;:10;:12::i;:::-;5364:7;5331:18;:41::i;:::-;5323:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5436:39;5450:4;5456:2;5460:7;5469:5;5436:13;:39::i;:::-;5200:282;;;;:::o;500:29:10:-;;;;:::o;2673:353:6:-;2746:13;2779:16;2787:7;2779;:16::i;:::-;2771:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2858:21;2882:10;:8;:10::i;:::-;2858:34;;2933:1;2915:7;2909:21;:25;:110;;;;;;;;;;;;;;;;;2973:7;2982:18;:7;:16;:18::i;:::-;2956:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2909:110;2902:117;;;2673:353;;;:::o;5103:123:10:-;5156:4;5179:17;:26;5197:7;5179:26;;;;;;;;;;;;;;;;;;;;;:40;;5214:5;5179:40;;;5208:4;5179:40;5172:47;;5103:123;;;:::o;4395:162:6:-;4492:4;4515:18;:25;4534:5;4515:25;;;;;;;;;;;;;;;:35;4541:8;4515:35;;;;;;;;;;;;;;;;;;;;;;;;;4508:42;;4395:162;;;;:::o;1987:240:21:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2067:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;;;;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;;:17;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;341:273:4:-;466:4;520:35;505:50;;;:11;:50;;;;:102;;;;571:36;595:11;571:23;:36::i;:::-;505:102;486:121;;341:273;;;:::o;6916:125:6:-;6981:4;7032:1;7004:30;;:7;:16;7012:7;7004:16;;;;;;;;;;;;;;;;;;;;;:30;;;;6997:37;;6916:125;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;10673:171:6:-;10774:2;10747:15;:24;10763:7;10747:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;10829:7;10825:2;10791:46;;10800:23;10815:7;10800:14;:23::i;:::-;10791:46;;;;;;;;;;;;10673:171;;:::o;7199:344::-;7292:4;7316:16;7324:7;7316;:16::i;:::-;7308:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7391:13;7407:23;7422:7;7407:14;:23::i;:::-;7391:39;;7459:5;7448:16;;:7;:16;;;:51;;;;7492:7;7468:31;;:20;7480:7;7468:11;:20::i;:::-;:31;;;7448:51;:87;;;;7503:32;7520:5;7527:7;7503:16;:32::i;:::-;7448:87;7440:96;;;7199:344;;;;:::o;10032:530::-;10156:4;10129:31;;:23;10144:7;10129:14;:23::i;:::-;:31;;;10121:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10238:1;10224:16;;:2;:16;;;;10216:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10292:39;10313:4;10319:2;10323:7;10292:20;:39::i;:::-;10393:29;10410:1;10414:7;10393:8;:29::i;:::-;10452:1;10433:9;:15;10443:4;10433:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10480:1;10463:9;:13;10473:2;10463:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10510:2;10491:7;:16;10499:7;10491:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10547:7;10543:2;10528:27;;10537:4;10528:27;;;;;;;;;;;;10032:530;;;:::o;2672:96:22:-;2730:7;2760:1;2756;:5;;;;:::i;:::-;2749:12;;2672:96;;;;:::o;1784:175:10:-;1832:14;1849:20;1867:1;1849:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;1832:37;;1879:25;1889:3;1894:9;1879;:25::i;:::-;1948:3;1919:33;;1937:9;1919:33;;;;;;;;;;1822:137;1784:175;:::o;3382:96:22:-;3440:7;3470:1;3466;:5;;;;:::i;:::-;3459:12;;3382:96;;;;:::o;6344:269:6:-;6457:28;6467:4;6473:2;6477:7;6457:9;:28::i;:::-;6503:48;6526:4;6532:2;6536:7;6545:5;6503:22;:48::i;:::-;6495:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6344:269;;;;:::o;5336:106:10:-;5396:13;5428:7;5421:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5336:106;:::o;271:703:23:-;327:13;553:1;544:5;:10;540:51;;;570:10;;;;;;;;;;;;;;;;;;;;;540:51;600:12;615:5;600:20;;630:14;654:75;669:1;661:4;:9;654:75;;686:8;;;;;:::i;:::-;;;;716:2;708:10;;;;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;738:39;;787:150;803:1;794:5;:10;787:150;;830:1;820:11;;;;;:::i;:::-;;;896:2;888:5;:10;;;;:::i;:::-;875:2;:24;;;;:::i;:::-;862:39;;845:6;852;845:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;924:2;915:11;;;;;:::i;:::-;;;787:150;;;960:6;946:21;;;;;271:703;;;;:::o;909:234:7:-;1011:4;1049:35;1034:50;;;:11;:50;;;;:102;;;;1100:36;1124:11;1100:23;:36::i;:::-;1034:102;1027:109;;909:234;;;:::o;2555:542::-;2664:45;2691:4;2697:2;2701:7;2664:26;:45::i;:::-;2740:1;2724:18;;:4;:18;;;2720:183;;;2758:40;2790:7;2758:31;:40::i;:::-;2720:183;;;2827:2;2819:10;;:4;:10;;;2815:88;;2845:47;2878:4;2884:7;2845:32;:47::i;:::-;2815:88;2720:183;2930:1;2916:16;;:2;:16;;;2912:179;;;2948:45;2985:7;2948:36;:45::i;:::-;2912:179;;;3020:4;3014:10;;:2;:10;;;3010:81;;3040:40;3068:2;3072:7;3040:27;:40::i;:::-;3010:81;2912:179;2555:542;;;:::o;7873:108:6:-;7948:26;7958:2;7962:7;7948:26;;;;;;;;;;;;:9;:26::i;:::-;7873:108;;:::o;11397:824::-;11517:4;11541:15;:2;:13;;;:15::i;:::-;11537:678;;;11592:2;11576:36;;;11613:12;:10;:12::i;:::-;11627:4;11633:7;11642:5;11576:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11572:591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11836:1;11819:6;:13;:18;11815:334;;;11861:60;;;;;;;;;;:::i;:::-;;;;;;;;11815:334;12101:6;12095:13;12086:6;12082:2;12078:15;12071:38;11572:591;11708:45;;;11698:55;;;:6;:55;;;;11691:62;;;;;11537:678;12200:4;12193:11;;11397:824;;;;;;;:::o;1437:288::-;1539:4;1577:25;1562:40;;;:11;:40;;;;:104;;;;1633:33;1618:48;;;:11;:48;;;;1562:104;:156;;;;1682:36;1706:11;1682:23;:36::i;:::-;1562:156;1555:163;;1437:288;;;:::o;12817:93::-;;;;:::o;3803:161:7:-;3906:10;:17;;;;3879:15;:24;3895:7;3879:24;;;;;;;;;;;:44;;;;3933:10;3949:7;3933:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3803:161;:::o;4581:970::-;4843:22;4893:1;4868:22;4885:4;4868:16;:22::i;:::-;:26;;;;:::i;:::-;4843:51;;4904:18;4925:17;:26;4943:7;4925:26;;;;;;;;;;;;4904:47;;5069:14;5055:10;:28;5051:323;;5099:19;5121:12;:18;5134:4;5121:18;;;;;;;;;;;;;;;:34;5140:14;5121:34;;;;;;;;;;;;5099:56;;5203:11;5170:12;:18;5183:4;5170:18;;;;;;;;;;;;;;;:30;5189:10;5170:30;;;;;;;;;;;:44;;;;5319:10;5286:17;:30;5304:11;5286:30;;;;;;;;;;;:43;;;;5085:289;5051:323;5467:17;:26;5485:7;5467:26;;;;;;;;;;;5460:33;;;5510:12;:18;5523:4;5510:18;;;;;;;;;;;;;;;:34;5529:14;5510:34;;;;;;;;;;;5503:41;;;4662:889;;4581:970;;:::o;5839:1061::-;6088:22;6133:1;6113:10;:17;;;;:21;;;;:::i;:::-;6088:46;;6144:18;6165:15;:24;6181:7;6165:24;;;;;;;;;;;;6144:45;;6511:19;6533:10;6544:14;6533:26;;;;;;;;:::i;:::-;;;;;;;;;;6511:48;;6595:11;6570:10;6581;6570:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6705:10;6674:15;:28;6690:11;6674:28;;;;;;;;;;;:41;;;;6843:15;:24;6859:7;6843:24;;;;;;;;;;;6836:31;;;6877:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5910:990;;;5839:1061;:::o;3391:217::-;3475:14;3492:20;3509:2;3492:16;:20::i;:::-;3475:37;;3549:7;3522:12;:16;3535:2;3522:16;;;;;;;;;;;;;;;:24;3539:6;3522:24;;;;;;;;;;;:34;;;;3595:6;3566:17;:26;3584:7;3566:26;;;;;;;;;;;:35;;;;3465:143;3391:217;;:::o;8202:247:6:-;8297:18;8303:2;8307:7;8297:5;:18::i;:::-;8333:54;8364:1;8368:2;8372:7;8381:5;8333:22;:54::i;:::-;8325:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;8202:247;;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;763:155:3:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;8771:372:6:-;8864:1;8850:16;;:2;:16;;;;8842:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;8922:16;8930:7;8922;:16::i;:::-;8921:17;8913:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;8982:45;9011:1;9015:2;9019:7;8982:20;:45::i;:::-;9055:1;9038:9;:13;9048:2;9038:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9085:2;9066:7;:16;9074:7;9066:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9128:7;9124:2;9103:33;;9120:1;9103:33;;;;;;;;;;;;8771:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:24:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2476:143::-;2533:5;2564:6;2558:13;2549:22;;2580:33;2607:5;2580:33;:::i;:::-;2476:143;;;;:::o;2642:370::-;2713:5;2762:3;2755:4;2747:6;2743:17;2739:27;2729:122;;2770:79;;:::i;:::-;2729:122;2887:6;2874:20;2912:94;3002:3;2994:6;2987:4;2979:6;2975:17;2912:94;:::i;:::-;2903:103;;2719:293;2642:370;;;;:::o;3035:::-;3106:5;3155:3;3148:4;3140:6;3136:17;3132:27;3122:122;;3163:79;;:::i;:::-;3122:122;3280:6;3267:20;3305:94;3395:3;3387:6;3380:4;3372:6;3368:17;3305:94;:::i;:::-;3296:103;;3112:293;3035:370;;;;:::o;3411:133::-;3454:5;3492:6;3479:20;3470:29;;3508:30;3532:5;3508:30;:::i;:::-;3411:133;;;;:::o;3550:137::-;3595:5;3633:6;3620:20;3611:29;;3649:32;3675:5;3649:32;:::i;:::-;3550:137;;;;:::o;3693:141::-;3749:5;3780:6;3774:13;3765:22;;3796:32;3822:5;3796:32;:::i;:::-;3693:141;;;;:::o;3853:338::-;3908:5;3957:3;3950:4;3942:6;3938:17;3934:27;3924:122;;3965:79;;:::i;:::-;3924:122;4082:6;4069:20;4107:78;4181:3;4173:6;4166:4;4158:6;4154:17;4107:78;:::i;:::-;4098:87;;3914:277;3853:338;;;;:::o;4211:340::-;4267:5;4316:3;4309:4;4301:6;4297:17;4293:27;4283:122;;4324:79;;:::i;:::-;4283:122;4441:6;4428:20;4466:79;4541:3;4533:6;4526:4;4518:6;4514:17;4466:79;:::i;:::-;4457:88;;4273:278;4211:340;;;;:::o;4557:139::-;4603:5;4641:6;4628:20;4619:29;;4657:33;4684:5;4657:33;:::i;:::-;4557:139;;;;:::o;4702:329::-;4761:6;4810:2;4798:9;4789:7;4785:23;4781:32;4778:119;;;4816:79;;:::i;:::-;4778:119;4936:1;4961:53;5006:7;4997:6;4986:9;4982:22;4961:53;:::i;:::-;4951:63;;4907:117;4702:329;;;;:::o;5037:351::-;5107:6;5156:2;5144:9;5135:7;5131:23;5127:32;5124:119;;;5162:79;;:::i;:::-;5124:119;5282:1;5307:64;5363:7;5354:6;5343:9;5339:22;5307:64;:::i;:::-;5297:74;;5253:128;5037:351;;;;:::o;5394:474::-;5462:6;5470;5519:2;5507:9;5498:7;5494:23;5490:32;5487:119;;;5525:79;;:::i;:::-;5487:119;5645:1;5670:53;5715:7;5706:6;5695:9;5691:22;5670:53;:::i;:::-;5660:63;;5616:117;5772:2;5798:53;5843:7;5834:6;5823:9;5819:22;5798:53;:::i;:::-;5788:63;;5743:118;5394:474;;;;;:::o;5874:619::-;5951:6;5959;5967;6016:2;6004:9;5995:7;5991:23;5987:32;5984:119;;;6022:79;;:::i;:::-;5984:119;6142:1;6167:53;6212:7;6203:6;6192:9;6188:22;6167:53;:::i;:::-;6157:63;;6113:117;6269:2;6295:53;6340:7;6331:6;6320:9;6316:22;6295:53;:::i;:::-;6285:63;;6240:118;6397:2;6423:53;6468:7;6459:6;6448:9;6444:22;6423:53;:::i;:::-;6413:63;;6368:118;5874:619;;;;;:::o;6499:943::-;6594:6;6602;6610;6618;6667:3;6655:9;6646:7;6642:23;6638:33;6635:120;;;6674:79;;:::i;:::-;6635:120;6794:1;6819:53;6864:7;6855:6;6844:9;6840:22;6819:53;:::i;:::-;6809:63;;6765:117;6921:2;6947:53;6992:7;6983:6;6972:9;6968:22;6947:53;:::i;:::-;6937:63;;6892:118;7049:2;7075:53;7120:7;7111:6;7100:9;7096:22;7075:53;:::i;:::-;7065:63;;7020:118;7205:2;7194:9;7190:18;7177:32;7236:18;7228:6;7225:30;7222:117;;;7258:79;;:::i;:::-;7222:117;7363:62;7417:7;7408:6;7397:9;7393:22;7363:62;:::i;:::-;7353:72;;7148:287;6499:943;;;;;;;:::o;7448:468::-;7513:6;7521;7570:2;7558:9;7549:7;7545:23;7541:32;7538:119;;;7576:79;;:::i;:::-;7538:119;7696:1;7721:53;7766:7;7757:6;7746:9;7742:22;7721:53;:::i;:::-;7711:63;;7667:117;7823:2;7849:50;7891:7;7882:6;7871:9;7867:22;7849:50;:::i;:::-;7839:60;;7794:115;7448:468;;;;;:::o;7922:474::-;7990:6;7998;8047:2;8035:9;8026:7;8022:23;8018:32;8015:119;;;8053:79;;:::i;:::-;8015:119;8173:1;8198:53;8243:7;8234:6;8223:9;8219:22;8198:53;:::i;:::-;8188:63;;8144:117;8300:2;8326:53;8371:7;8362:6;8351:9;8347:22;8326:53;:::i;:::-;8316:63;;8271:118;7922:474;;;;;:::o;8402:894::-;8520:6;8528;8577:2;8565:9;8556:7;8552:23;8548:32;8545:119;;;8583:79;;:::i;:::-;8545:119;8731:1;8720:9;8716:17;8703:31;8761:18;8753:6;8750:30;8747:117;;;8783:79;;:::i;:::-;8747:117;8888:78;8958:7;8949:6;8938:9;8934:22;8888:78;:::i;:::-;8878:88;;8674:302;9043:2;9032:9;9028:18;9015:32;9074:18;9066:6;9063:30;9060:117;;;9096:79;;:::i;:::-;9060:117;9201:78;9271:7;9262:6;9251:9;9247:22;9201:78;:::i;:::-;9191:88;;8986:303;8402:894;;;;;:::o;9302:539::-;9386:6;9435:2;9423:9;9414:7;9410:23;9406:32;9403:119;;;9441:79;;:::i;:::-;9403:119;9589:1;9578:9;9574:17;9561:31;9619:18;9611:6;9608:30;9605:117;;;9641:79;;:::i;:::-;9605:117;9746:78;9816:7;9807:6;9796:9;9792:22;9746:78;:::i;:::-;9736:88;;9532:302;9302:539;;;;:::o;9847:327::-;9905:6;9954:2;9942:9;9933:7;9929:23;9925:32;9922:119;;;9960:79;;:::i;:::-;9922:119;10080:1;10105:52;10149:7;10140:6;10129:9;10125:22;10105:52;:::i;:::-;10095:62;;10051:116;9847:327;;;;:::o;10180:349::-;10249:6;10298:2;10286:9;10277:7;10273:23;10269:32;10266:119;;;10304:79;;:::i;:::-;10266:119;10424:1;10449:63;10504:7;10495:6;10484:9;10480:22;10449:63;:::i;:::-;10439:73;;10395:127;10180:349;;;;:::o;10535:509::-;10604:6;10653:2;10641:9;10632:7;10628:23;10624:32;10621:119;;;10659:79;;:::i;:::-;10621:119;10807:1;10796:9;10792:17;10779:31;10837:18;10829:6;10826:30;10823:117;;;10859:79;;:::i;:::-;10823:117;10964:63;11019:7;11010:6;10999:9;10995:22;10964:63;:::i;:::-;10954:73;;10750:287;10535:509;;;;:::o;11050:329::-;11109:6;11158:2;11146:9;11137:7;11133:23;11129:32;11126:119;;;11164:79;;:::i;:::-;11126:119;11284:1;11309:53;11354:7;11345:6;11334:9;11330:22;11309:53;:::i;:::-;11299:63;;11255:117;11050:329;;;;:::o;11385:474::-;11453:6;11461;11510:2;11498:9;11489:7;11485:23;11481:32;11478:119;;;11516:79;;:::i;:::-;11478:119;11636:1;11661:53;11706:7;11697:6;11686:9;11682:22;11661:53;:::i;:::-;11651:63;;11607:117;11763:2;11789:53;11834:7;11825:6;11814:9;11810:22;11789:53;:::i;:::-;11779:63;;11734:118;11385:474;;;;;:::o;11865:179::-;11934:10;11955:46;11997:3;11989:6;11955:46;:::i;:::-;12033:4;12028:3;12024:14;12010:28;;11865:179;;;;:::o;12050:118::-;12137:24;12155:5;12137:24;:::i;:::-;12132:3;12125:37;12050:118;;:::o;12204:732::-;12323:3;12352:54;12400:5;12352:54;:::i;:::-;12422:86;12501:6;12496:3;12422:86;:::i;:::-;12415:93;;12532:56;12582:5;12532:56;:::i;:::-;12611:7;12642:1;12627:284;12652:6;12649:1;12646:13;12627:284;;;12728:6;12722:13;12755:63;12814:3;12799:13;12755:63;:::i;:::-;12748:70;;12841:60;12894:6;12841:60;:::i;:::-;12831:70;;12687:224;12674:1;12671;12667:9;12662:14;;12627:284;;;12631:14;12927:3;12920:10;;12328:608;;;12204:732;;;;:::o;12942:109::-;13023:21;13038:5;13023:21;:::i;:::-;13018:3;13011:34;12942:109;;:::o;13057:360::-;13143:3;13171:38;13203:5;13171:38;:::i;:::-;13225:70;13288:6;13283:3;13225:70;:::i;:::-;13218:77;;13304:52;13349:6;13344:3;13337:4;13330:5;13326:16;13304:52;:::i;:::-;13381:29;13403:6;13381:29;:::i;:::-;13376:3;13372:39;13365:46;;13147:270;13057:360;;;;:::o;13423:364::-;13511:3;13539:39;13572:5;13539:39;:::i;:::-;13594:71;13658:6;13653:3;13594:71;:::i;:::-;13587:78;;13674:52;13719:6;13714:3;13707:4;13700:5;13696:16;13674:52;:::i;:::-;13751:29;13773:6;13751:29;:::i;:::-;13746:3;13742:39;13735:46;;13515:272;13423:364;;;;:::o;13793:377::-;13899:3;13927:39;13960:5;13927:39;:::i;:::-;13982:89;14064:6;14059:3;13982:89;:::i;:::-;13975:96;;14080:52;14125:6;14120:3;14113:4;14106:5;14102:16;14080:52;:::i;:::-;14157:6;14152:3;14148:16;14141:23;;13903:267;13793:377;;;;:::o;14176:366::-;14318:3;14339:67;14403:2;14398:3;14339:67;:::i;:::-;14332:74;;14415:93;14504:3;14415:93;:::i;:::-;14533:2;14528:3;14524:12;14517:19;;14176:366;;;:::o;14548:::-;14690:3;14711:67;14775:2;14770:3;14711:67;:::i;:::-;14704:74;;14787:93;14876:3;14787:93;:::i;:::-;14905:2;14900:3;14896:12;14889:19;;14548:366;;;:::o;14920:::-;15062:3;15083:67;15147:2;15142:3;15083:67;:::i;:::-;15076:74;;15159:93;15248:3;15159:93;:::i;:::-;15277:2;15272:3;15268:12;15261:19;;14920:366;;;:::o;15292:::-;15434:3;15455:67;15519:2;15514:3;15455:67;:::i;:::-;15448:74;;15531:93;15620:3;15531:93;:::i;:::-;15649:2;15644:3;15640:12;15633:19;;15292:366;;;:::o;15664:::-;15806:3;15827:67;15891:2;15886:3;15827:67;:::i;:::-;15820:74;;15903:93;15992:3;15903:93;:::i;:::-;16021:2;16016:3;16012:12;16005:19;;15664:366;;;:::o;16036:::-;16178:3;16199:67;16263:2;16258:3;16199:67;:::i;:::-;16192:74;;16275:93;16364:3;16275:93;:::i;:::-;16393:2;16388:3;16384:12;16377:19;;16036:366;;;:::o;16408:::-;16550:3;16571:67;16635:2;16630:3;16571:67;:::i;:::-;16564:74;;16647:93;16736:3;16647:93;:::i;:::-;16765:2;16760:3;16756:12;16749:19;;16408:366;;;:::o;16780:::-;16922:3;16943:67;17007:2;17002:3;16943:67;:::i;:::-;16936:74;;17019:93;17108:3;17019:93;:::i;:::-;17137:2;17132:3;17128:12;17121:19;;16780:366;;;:::o;17152:::-;17294:3;17315:67;17379:2;17374:3;17315:67;:::i;:::-;17308:74;;17391:93;17480:3;17391:93;:::i;:::-;17509:2;17504:3;17500:12;17493:19;;17152:366;;;:::o;17524:::-;17666:3;17687:67;17751:2;17746:3;17687:67;:::i;:::-;17680:74;;17763:93;17852:3;17763:93;:::i;:::-;17881:2;17876:3;17872:12;17865:19;;17524:366;;;:::o;17896:::-;18038:3;18059:67;18123:2;18118:3;18059:67;:::i;:::-;18052:74;;18135:93;18224:3;18135:93;:::i;:::-;18253:2;18248:3;18244:12;18237:19;;17896:366;;;:::o;18268:::-;18410:3;18431:67;18495:2;18490:3;18431:67;:::i;:::-;18424:74;;18507:93;18596:3;18507:93;:::i;:::-;18625:2;18620:3;18616:12;18609:19;;18268:366;;;:::o;18640:::-;18782:3;18803:67;18867:2;18862:3;18803:67;:::i;:::-;18796:74;;18879:93;18968:3;18879:93;:::i;:::-;18997:2;18992:3;18988:12;18981:19;;18640:366;;;:::o;19012:::-;19154:3;19175:67;19239:2;19234:3;19175:67;:::i;:::-;19168:74;;19251:93;19340:3;19251:93;:::i;:::-;19369:2;19364:3;19360:12;19353:19;;19012:366;;;:::o;19384:::-;19526:3;19547:67;19611:2;19606:3;19547:67;:::i;:::-;19540:74;;19623:93;19712:3;19623:93;:::i;:::-;19741:2;19736:3;19732:12;19725:19;;19384:366;;;:::o;19756:::-;19898:3;19919:67;19983:2;19978:3;19919:67;:::i;:::-;19912:74;;19995:93;20084:3;19995:93;:::i;:::-;20113:2;20108:3;20104:12;20097:19;;19756:366;;;:::o;20128:::-;20270:3;20291:67;20355:2;20350:3;20291:67;:::i;:::-;20284:74;;20367:93;20456:3;20367:93;:::i;:::-;20485:2;20480:3;20476:12;20469:19;;20128:366;;;:::o;20500:::-;20642:3;20663:67;20727:2;20722:3;20663:67;:::i;:::-;20656:74;;20739:93;20828:3;20739:93;:::i;:::-;20857:2;20852:3;20848:12;20841:19;;20500:366;;;:::o;20872:::-;21014:3;21035:67;21099:2;21094:3;21035:67;:::i;:::-;21028:74;;21111:93;21200:3;21111:93;:::i;:::-;21229:2;21224:3;21220:12;21213:19;;20872:366;;;:::o;21244:::-;21386:3;21407:67;21471:2;21466:3;21407:67;:::i;:::-;21400:74;;21483:93;21572:3;21483:93;:::i;:::-;21601:2;21596:3;21592:12;21585:19;;21244:366;;;:::o;21616:::-;21758:3;21779:67;21843:2;21838:3;21779:67;:::i;:::-;21772:74;;21855:93;21944:3;21855:93;:::i;:::-;21973:2;21968:3;21964:12;21957:19;;21616:366;;;:::o;21988:::-;22130:3;22151:67;22215:2;22210:3;22151:67;:::i;:::-;22144:74;;22227:93;22316:3;22227:93;:::i;:::-;22345:2;22340:3;22336:12;22329:19;;21988:366;;;:::o;22360:::-;22502:3;22523:67;22587:2;22582:3;22523:67;:::i;:::-;22516:74;;22599:93;22688:3;22599:93;:::i;:::-;22717:2;22712:3;22708:12;22701:19;;22360:366;;;:::o;22732:::-;22874:3;22895:67;22959:2;22954:3;22895:67;:::i;:::-;22888:74;;22971:93;23060:3;22971:93;:::i;:::-;23089:2;23084:3;23080:12;23073:19;;22732:366;;;:::o;23104:::-;23246:3;23267:67;23331:2;23326:3;23267:67;:::i;:::-;23260:74;;23343:93;23432:3;23343:93;:::i;:::-;23461:2;23456:3;23452:12;23445:19;;23104:366;;;:::o;23476:::-;23618:3;23639:67;23703:2;23698:3;23639:67;:::i;:::-;23632:74;;23715:93;23804:3;23715:93;:::i;:::-;23833:2;23828:3;23824:12;23817:19;;23476:366;;;:::o;23848:365::-;23990:3;24011:66;24075:1;24070:3;24011:66;:::i;:::-;24004:73;;24086:93;24175:3;24086:93;:::i;:::-;24204:2;24199:3;24195:12;24188:19;;23848:365;;;:::o;24219:366::-;24361:3;24382:67;24446:2;24441:3;24382:67;:::i;:::-;24375:74;;24458:93;24547:3;24458:93;:::i;:::-;24576:2;24571:3;24567:12;24560:19;;24219:366;;;:::o;24591:::-;24733:3;24754:67;24818:2;24813:3;24754:67;:::i;:::-;24747:74;;24830:93;24919:3;24830:93;:::i;:::-;24948:2;24943:3;24939:12;24932:19;;24591:366;;;:::o;24963:::-;25105:3;25126:67;25190:2;25185:3;25126:67;:::i;:::-;25119:74;;25202:93;25291:3;25202:93;:::i;:::-;25320:2;25315:3;25311:12;25304:19;;24963:366;;;:::o;25335:108::-;25412:24;25430:5;25412:24;:::i;:::-;25407:3;25400:37;25335:108;;:::o;25449:118::-;25536:24;25554:5;25536:24;:::i;:::-;25531:3;25524:37;25449:118;;:::o;25573:435::-;25753:3;25775:95;25866:3;25857:6;25775:95;:::i;:::-;25768:102;;25887:95;25978:3;25969:6;25887:95;:::i;:::-;25880:102;;25999:3;25992:10;;25573:435;;;;;:::o;26014:222::-;26107:4;26145:2;26134:9;26130:18;26122:26;;26158:71;26226:1;26215:9;26211:17;26202:6;26158:71;:::i;:::-;26014:222;;;;:::o;26242:640::-;26437:4;26475:3;26464:9;26460:19;26452:27;;26489:71;26557:1;26546:9;26542:17;26533:6;26489:71;:::i;:::-;26570:72;26638:2;26627:9;26623:18;26614:6;26570:72;:::i;:::-;26652;26720:2;26709:9;26705:18;26696:6;26652:72;:::i;:::-;26771:9;26765:4;26761:20;26756:2;26745:9;26741:18;26734:48;26799:76;26870:4;26861:6;26799:76;:::i;:::-;26791:84;;26242:640;;;;;;;:::o;26888:332::-;27009:4;27047:2;27036:9;27032:18;27024:26;;27060:71;27128:1;27117:9;27113:17;27104:6;27060:71;:::i;:::-;27141:72;27209:2;27198:9;27194:18;27185:6;27141:72;:::i;:::-;26888:332;;;;;:::o;27226:373::-;27369:4;27407:2;27396:9;27392:18;27384:26;;27456:9;27450:4;27446:20;27442:1;27431:9;27427:17;27420:47;27484:108;27587:4;27578:6;27484:108;:::i;:::-;27476:116;;27226:373;;;;:::o;27605:210::-;27692:4;27730:2;27719:9;27715:18;27707:26;;27743:65;27805:1;27794:9;27790:17;27781:6;27743:65;:::i;:::-;27605:210;;;;:::o;27821:313::-;27934:4;27972:2;27961:9;27957:18;27949:26;;28021:9;28015:4;28011:20;28007:1;27996:9;27992:17;27985:47;28049:78;28122:4;28113:6;28049:78;:::i;:::-;28041:86;;27821:313;;;;:::o;28140:419::-;28306:4;28344:2;28333:9;28329:18;28321:26;;28393:9;28387:4;28383:20;28379:1;28368:9;28364:17;28357:47;28421:131;28547:4;28421:131;:::i;:::-;28413:139;;28140:419;;;:::o;28565:::-;28731:4;28769:2;28758:9;28754:18;28746:26;;28818:9;28812:4;28808:20;28804:1;28793:9;28789:17;28782:47;28846:131;28972:4;28846:131;:::i;:::-;28838:139;;28565:419;;;:::o;28990:::-;29156:4;29194:2;29183:9;29179:18;29171:26;;29243:9;29237:4;29233:20;29229:1;29218:9;29214:17;29207:47;29271:131;29397:4;29271:131;:::i;:::-;29263:139;;28990:419;;;:::o;29415:::-;29581:4;29619:2;29608:9;29604:18;29596:26;;29668:9;29662:4;29658:20;29654:1;29643:9;29639:17;29632:47;29696:131;29822:4;29696:131;:::i;:::-;29688:139;;29415:419;;;:::o;29840:::-;30006:4;30044:2;30033:9;30029:18;30021:26;;30093:9;30087:4;30083:20;30079:1;30068:9;30064:17;30057:47;30121:131;30247:4;30121:131;:::i;:::-;30113:139;;29840:419;;;:::o;30265:::-;30431:4;30469:2;30458:9;30454:18;30446:26;;30518:9;30512:4;30508:20;30504:1;30493:9;30489:17;30482:47;30546:131;30672:4;30546:131;:::i;:::-;30538:139;;30265:419;;;:::o;30690:::-;30856:4;30894:2;30883:9;30879:18;30871:26;;30943:9;30937:4;30933:20;30929:1;30918:9;30914:17;30907:47;30971:131;31097:4;30971:131;:::i;:::-;30963:139;;30690:419;;;:::o;31115:::-;31281:4;31319:2;31308:9;31304:18;31296:26;;31368:9;31362:4;31358:20;31354:1;31343:9;31339:17;31332:47;31396:131;31522:4;31396:131;:::i;:::-;31388:139;;31115:419;;;:::o;31540:::-;31706:4;31744:2;31733:9;31729:18;31721:26;;31793:9;31787:4;31783:20;31779:1;31768:9;31764:17;31757:47;31821:131;31947:4;31821:131;:::i;:::-;31813:139;;31540:419;;;:::o;31965:::-;32131:4;32169:2;32158:9;32154:18;32146:26;;32218:9;32212:4;32208:20;32204:1;32193:9;32189:17;32182:47;32246:131;32372:4;32246:131;:::i;:::-;32238:139;;31965:419;;;:::o;32390:::-;32556:4;32594:2;32583:9;32579:18;32571:26;;32643:9;32637:4;32633:20;32629:1;32618:9;32614:17;32607:47;32671:131;32797:4;32671:131;:::i;:::-;32663:139;;32390:419;;;:::o;32815:::-;32981:4;33019:2;33008:9;33004:18;32996:26;;33068:9;33062:4;33058:20;33054:1;33043:9;33039:17;33032:47;33096:131;33222:4;33096:131;:::i;:::-;33088:139;;32815:419;;;:::o;33240:::-;33406:4;33444:2;33433:9;33429:18;33421:26;;33493:9;33487:4;33483:20;33479:1;33468:9;33464:17;33457:47;33521:131;33647:4;33521:131;:::i;:::-;33513:139;;33240:419;;;:::o;33665:::-;33831:4;33869:2;33858:9;33854:18;33846:26;;33918:9;33912:4;33908:20;33904:1;33893:9;33889:17;33882:47;33946:131;34072:4;33946:131;:::i;:::-;33938:139;;33665:419;;;:::o;34090:::-;34256:4;34294:2;34283:9;34279:18;34271:26;;34343:9;34337:4;34333:20;34329:1;34318:9;34314:17;34307:47;34371:131;34497:4;34371:131;:::i;:::-;34363:139;;34090:419;;;:::o;34515:::-;34681:4;34719:2;34708:9;34704:18;34696:26;;34768:9;34762:4;34758:20;34754:1;34743:9;34739:17;34732:47;34796:131;34922:4;34796:131;:::i;:::-;34788:139;;34515:419;;;:::o;34940:::-;35106:4;35144:2;35133:9;35129:18;35121:26;;35193:9;35187:4;35183:20;35179:1;35168:9;35164:17;35157:47;35221:131;35347:4;35221:131;:::i;:::-;35213:139;;34940:419;;;:::o;35365:::-;35531:4;35569:2;35558:9;35554:18;35546:26;;35618:9;35612:4;35608:20;35604:1;35593:9;35589:17;35582:47;35646:131;35772:4;35646:131;:::i;:::-;35638:139;;35365:419;;;:::o;35790:::-;35956:4;35994:2;35983:9;35979:18;35971:26;;36043:9;36037:4;36033:20;36029:1;36018:9;36014:17;36007:47;36071:131;36197:4;36071:131;:::i;:::-;36063:139;;35790:419;;;:::o;36215:::-;36381:4;36419:2;36408:9;36404:18;36396:26;;36468:9;36462:4;36458:20;36454:1;36443:9;36439:17;36432:47;36496:131;36622:4;36496:131;:::i;:::-;36488:139;;36215:419;;;:::o;36640:::-;36806:4;36844:2;36833:9;36829:18;36821:26;;36893:9;36887:4;36883:20;36879:1;36868:9;36864:17;36857:47;36921:131;37047:4;36921:131;:::i;:::-;36913:139;;36640:419;;;:::o;37065:::-;37231:4;37269:2;37258:9;37254:18;37246:26;;37318:9;37312:4;37308:20;37304:1;37293:9;37289:17;37282:47;37346:131;37472:4;37346:131;:::i;:::-;37338:139;;37065:419;;;:::o;37490:::-;37656:4;37694:2;37683:9;37679:18;37671:26;;37743:9;37737:4;37733:20;37729:1;37718:9;37714:17;37707:47;37771:131;37897:4;37771:131;:::i;:::-;37763:139;;37490:419;;;:::o;37915:::-;38081:4;38119:2;38108:9;38104:18;38096:26;;38168:9;38162:4;38158:20;38154:1;38143:9;38139:17;38132:47;38196:131;38322:4;38196:131;:::i;:::-;38188:139;;37915:419;;;:::o;38340:::-;38506:4;38544:2;38533:9;38529:18;38521:26;;38593:9;38587:4;38583:20;38579:1;38568:9;38564:17;38557:47;38621:131;38747:4;38621:131;:::i;:::-;38613:139;;38340:419;;;:::o;38765:::-;38931:4;38969:2;38958:9;38954:18;38946:26;;39018:9;39012:4;39008:20;39004:1;38993:9;38989:17;38982:47;39046:131;39172:4;39046:131;:::i;:::-;39038:139;;38765:419;;;:::o;39190:::-;39356:4;39394:2;39383:9;39379:18;39371:26;;39443:9;39437:4;39433:20;39429:1;39418:9;39414:17;39407:47;39471:131;39597:4;39471:131;:::i;:::-;39463:139;;39190:419;;;:::o;39615:::-;39781:4;39819:2;39808:9;39804:18;39796:26;;39868:9;39862:4;39858:20;39854:1;39843:9;39839:17;39832:47;39896:131;40022:4;39896:131;:::i;:::-;39888:139;;39615:419;;;:::o;40040:::-;40206:4;40244:2;40233:9;40229:18;40221:26;;40293:9;40287:4;40283:20;40279:1;40268:9;40264:17;40257:47;40321:131;40447:4;40321:131;:::i;:::-;40313:139;;40040:419;;;:::o;40465:::-;40631:4;40669:2;40658:9;40654:18;40646:26;;40718:9;40712:4;40708:20;40704:1;40693:9;40689:17;40682:47;40746:131;40872:4;40746:131;:::i;:::-;40738:139;;40465:419;;;:::o;40890:222::-;40983:4;41021:2;41010:9;41006:18;40998:26;;41034:71;41102:1;41091:9;41087:17;41078:6;41034:71;:::i;:::-;40890:222;;;;:::o;41118:129::-;41152:6;41179:20;;:::i;:::-;41169:30;;41208:33;41236:4;41228:6;41208:33;:::i;:::-;41118:129;;;:::o;41253:75::-;41286:6;41319:2;41313:9;41303:19;;41253:75;:::o;41334:311::-;41411:4;41501:18;41493:6;41490:30;41487:56;;;41523:18;;:::i;:::-;41487:56;41573:4;41565:6;41561:17;41553:25;;41633:4;41627;41623:15;41615:23;;41334:311;;;:::o;41651:::-;41728:4;41818:18;41810:6;41807:30;41804:56;;;41840:18;;:::i;:::-;41804:56;41890:4;41882:6;41878:17;41870:25;;41950:4;41944;41940:15;41932:23;;41651:311;;;:::o;41968:307::-;42029:4;42119:18;42111:6;42108:30;42105:56;;;42141:18;;:::i;:::-;42105:56;42179:29;42201:6;42179:29;:::i;:::-;42171:37;;42263:4;42257;42253:15;42245:23;;41968:307;;;:::o;42281:308::-;42343:4;42433:18;42425:6;42422:30;42419:56;;;42455:18;;:::i;:::-;42419:56;42493:29;42515:6;42493:29;:::i;:::-;42485:37;;42577:4;42571;42567:15;42559:23;;42281:308;;;:::o;42595:132::-;42662:4;42685:3;42677:11;;42715:4;42710:3;42706:14;42698:22;;42595:132;;;:::o;42733:114::-;42800:6;42834:5;42828:12;42818:22;;42733:114;;;:::o;42853:98::-;42904:6;42938:5;42932:12;42922:22;;42853:98;;;:::o;42957:99::-;43009:6;43043:5;43037:12;43027:22;;42957:99;;;:::o;43062:113::-;43132:4;43164;43159:3;43155:14;43147:22;;43062:113;;;:::o;43181:184::-;43280:11;43314:6;43309:3;43302:19;43354:4;43349:3;43345:14;43330:29;;43181:184;;;;:::o;43371:168::-;43454:11;43488:6;43483:3;43476:19;43528:4;43523:3;43519:14;43504:29;;43371:168;;;;:::o;43545:169::-;43629:11;43663:6;43658:3;43651:19;43703:4;43698:3;43694:14;43679:29;;43545:169;;;;:::o;43720:148::-;43822:11;43859:3;43844:18;;43720:148;;;;:::o;43874:305::-;43914:3;43933:20;43951:1;43933:20;:::i;:::-;43928:25;;43967:20;43985:1;43967:20;:::i;:::-;43962:25;;44121:1;44053:66;44049:74;44046:1;44043:81;44040:107;;;44127:18;;:::i;:::-;44040:107;44171:1;44168;44164:9;44157:16;;43874:305;;;;:::o;44185:185::-;44225:1;44242:20;44260:1;44242:20;:::i;:::-;44237:25;;44276:20;44294:1;44276:20;:::i;:::-;44271:25;;44315:1;44305:35;;44320:18;;:::i;:::-;44305:35;44362:1;44359;44355:9;44350:14;;44185:185;;;;:::o;44376:348::-;44416:7;44439:20;44457:1;44439:20;:::i;:::-;44434:25;;44473:20;44491:1;44473:20;:::i;:::-;44468:25;;44661:1;44593:66;44589:74;44586:1;44583:81;44578:1;44571:9;44564:17;44560:105;44557:131;;;44668:18;;:::i;:::-;44557:131;44716:1;44713;44709:9;44698:20;;44376:348;;;;:::o;44730:191::-;44770:4;44790:20;44808:1;44790:20;:::i;:::-;44785:25;;44824:20;44842:1;44824:20;:::i;:::-;44819:25;;44863:1;44860;44857:8;44854:34;;;44868:18;;:::i;:::-;44854:34;44913:1;44910;44906:9;44898:17;;44730:191;;;;:::o;44927:96::-;44964:7;44993:24;45011:5;44993:24;:::i;:::-;44982:35;;44927:96;;;:::o;45029:90::-;45063:7;45106:5;45099:13;45092:21;45081:32;;45029:90;;;:::o;45125:149::-;45161:7;45201:66;45194:5;45190:78;45179:89;;45125:149;;;:::o;45280:126::-;45317:7;45357:42;45350:5;45346:54;45335:65;;45280:126;;;:::o;45412:77::-;45449:7;45478:5;45467:16;;45412:77;;;:::o;45495:154::-;45579:6;45574:3;45569;45556:30;45641:1;45632:6;45627:3;45623:16;45616:27;45495:154;;;:::o;45655:307::-;45723:1;45733:113;45747:6;45744:1;45741:13;45733:113;;;45832:1;45827:3;45823:11;45817:18;45813:1;45808:3;45804:11;45797:39;45769:2;45766:1;45762:10;45757:15;;45733:113;;;45864:6;45861:1;45858:13;45855:101;;;45944:1;45935:6;45930:3;45926:16;45919:27;45855:101;45704:258;45655:307;;;:::o;45968:320::-;46012:6;46049:1;46043:4;46039:12;46029:22;;46096:1;46090:4;46086:12;46117:18;46107:81;;46173:4;46165:6;46161:17;46151:27;;46107:81;46235:2;46227:6;46224:14;46204:18;46201:38;46198:84;;;46254:18;;:::i;:::-;46198:84;46019:269;45968:320;;;:::o;46294:281::-;46377:27;46399:4;46377:27;:::i;:::-;46369:6;46365:40;46507:6;46495:10;46492:22;46471:18;46459:10;46456:34;46453:62;46450:88;;;46518:18;;:::i;:::-;46450:88;46558:10;46554:2;46547:22;46337:238;46294:281;;:::o;46581:233::-;46620:3;46643:24;46661:5;46643:24;:::i;:::-;46634:33;;46689:66;46682:5;46679:77;46676:103;;;46759:18;;:::i;:::-;46676:103;46806:1;46799:5;46795:13;46788:20;;46581:233;;;:::o;46820:176::-;46852:1;46869:20;46887:1;46869:20;:::i;:::-;46864:25;;46903:20;46921:1;46903:20;:::i;:::-;46898:25;;46942:1;46932:35;;46947:18;;:::i;:::-;46932:35;46988:1;46985;46981:9;46976:14;;46820:176;;;;:::o;47002:180::-;47050:77;47047:1;47040:88;47147:4;47144:1;47137:15;47171:4;47168:1;47161:15;47188:180;47236:77;47233:1;47226:88;47333:4;47330:1;47323:15;47357:4;47354:1;47347:15;47374:180;47422:77;47419:1;47412:88;47519:4;47516:1;47509:15;47543:4;47540:1;47533:15;47560:180;47608:77;47605:1;47598:88;47705:4;47702:1;47695:15;47729:4;47726:1;47719:15;47746:180;47794:77;47791:1;47784:88;47891:4;47888:1;47881:15;47915:4;47912:1;47905:15;47932:180;47980:77;47977:1;47970:88;48077:4;48074:1;48067:15;48101:4;48098:1;48091:15;48118:117;48227:1;48224;48217:12;48241:117;48350:1;48347;48340:12;48364:117;48473:1;48470;48463:12;48487:117;48596:1;48593;48586:12;48610:117;48719:1;48716;48709:12;48733:102;48774:6;48825:2;48821:7;48816:2;48809:5;48805:14;48801:28;48791:38;;48733:102;;;:::o;48841:170::-;48981:22;48977:1;48969:6;48965:14;48958:46;48841:170;:::o;49017:::-;49157:22;49153:1;49145:6;49141:14;49134:46;49017:170;:::o;49193:168::-;49333:20;49329:1;49321:6;49317:14;49310:44;49193:168;:::o;49367:230::-;49507:34;49503:1;49495:6;49491:14;49484:58;49576:13;49571:2;49563:6;49559:15;49552:38;49367:230;:::o;49603:237::-;49743:34;49739:1;49731:6;49727:14;49720:58;49812:20;49807:2;49799:6;49795:15;49788:45;49603:237;:::o;49846:225::-;49986:34;49982:1;49974:6;49970:14;49963:58;50055:8;50050:2;50042:6;50038:15;50031:33;49846:225;:::o;50077:178::-;50217:30;50213:1;50205:6;50201:14;50194:54;50077:178;:::o;50261:229::-;50401:34;50397:1;50389:6;50385:14;50378:58;50470:12;50465:2;50457:6;50453:15;50446:37;50261:229;:::o;50496:223::-;50636:34;50632:1;50624:6;50620:14;50613:58;50705:6;50700:2;50692:6;50688:15;50681:31;50496:223;:::o;50725:175::-;50865:27;50861:1;50853:6;50849:14;50842:51;50725:175;:::o;50906:231::-;51046:34;51042:1;51034:6;51030:14;51023:58;51115:14;51110:2;51102:6;51098:15;51091:39;50906:231;:::o;51143:243::-;51283:34;51279:1;51271:6;51267:14;51260:58;51352:26;51347:2;51339:6;51335:15;51328:51;51143:243;:::o;51392:229::-;51532:34;51528:1;51520:6;51516:14;51509:58;51601:12;51596:2;51588:6;51584:15;51577:37;51392:229;:::o;51627:228::-;51767:34;51763:1;51755:6;51751:14;51744:58;51836:11;51831:2;51823:6;51819:15;51812:36;51627:228;:::o;51861:166::-;52001:18;51997:1;51989:6;51985:14;51978:42;51861:166;:::o;52033:175::-;52173:27;52169:1;52161:6;52157:14;52150:51;52033:175;:::o;52214:182::-;52354:34;52350:1;52342:6;52338:14;52331:58;52214:182;:::o;52402:231::-;52542:34;52538:1;52530:6;52526:14;52519:58;52611:14;52606:2;52598:6;52594:15;52587:39;52402:231;:::o;52639:182::-;52779:34;52775:1;52767:6;52763:14;52756:58;52639:182;:::o;52827:228::-;52967:34;52963:1;52955:6;52951:14;52944:58;53036:11;53031:2;53023:6;53019:15;53012:36;52827:228;:::o;53061:234::-;53201:34;53197:1;53189:6;53185:14;53178:58;53270:17;53265:2;53257:6;53253:15;53246:42;53061:234;:::o;53301:169::-;53441:21;53437:1;53429:6;53425:14;53418:45;53301:169;:::o;53476:220::-;53616:34;53612:1;53604:6;53600:14;53593:58;53685:3;53680:2;53672:6;53668:15;53661:28;53476:220;:::o;53702:174::-;53842:26;53838:1;53830:6;53826:14;53819:50;53702:174;:::o;53882:223::-;54022:34;54018:1;54010:6;54006:14;53999:58;54091:6;54086:2;54078:6;54074:15;54067:31;53882:223;:::o;54111:236::-;54251:34;54247:1;54239:6;54235:14;54228:58;54320:19;54315:2;54307:6;54303:15;54296:44;54111:236;:::o;54353:159::-;54493:11;54489:1;54481:6;54477:14;54470:35;54353:159;:::o;54518:231::-;54658:34;54654:1;54646:6;54642:14;54635:58;54727:14;54722:2;54714:6;54710:15;54703:39;54518:231;:::o;54755:232::-;54895:34;54891:1;54883:6;54879:14;54872:58;54964:15;54959:2;54951:6;54947:15;54940:40;54755:232;:::o;54993:180::-;55133:32;55129:1;55121:6;55117:14;55110:56;54993:180;:::o;55179:122::-;55252:24;55270:5;55252:24;:::i;:::-;55245:5;55242:35;55232:63;;55291:1;55288;55281:12;55232:63;55179:122;:::o;55307:116::-;55377:21;55392:5;55377:21;:::i;:::-;55370:5;55367:32;55357:60;;55413:1;55410;55403:12;55357:60;55307:116;:::o;55429:120::-;55501:23;55518:5;55501:23;:::i;:::-;55494:5;55491:34;55481:62;;55539:1;55536;55529:12;55481:62;55429:120;:::o;55555:122::-;55628:24;55646:5;55628:24;:::i;:::-;55621:5;55618:35;55608:63;;55667:1;55664;55657:12;55608:63;55555:122;:::o
Swarm Source
ipfs://00d383e4272b9ddd21ff6d84f09a59f18a69899f3cdd6300eb8c7d6de6f1f204
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.