Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
7,660 CMCLUB
Holders
2,324
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CMCLUBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ComedyMonstersClub
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity Multiple files format)
//Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./Ownable.sol"; import "./SafeMath.sol"; import "./EnumerableMap.sol"; import "./ERC721Enumerable.sol"; contract ComedyMonstersClub is ERC721Enumerable, Ownable { using SafeMath for uint256; // Token detail struct ComedyMonsterDetail { uint256 creation; } // Events event TokenMinted(uint256 tokenId, address owner, uint256 creation); // Token Detail mapping(uint256 => ComedyMonsterDetail) private _comedyMonsterDetails; // Provenance number string public PROVENANCE = ""; // Max amount of token to purchase per account each time uint public MAX_PURCHASE = 20; // Maximum amount of tokens to supply. uint256 public MAX_TOKENS = 10100; // Current price. uint256 public CURRENT_PRICE = 100000000000000000; // Define if sale is active bool public saleIsActive = true; // Base URI string private baseURI; address private creatorAddress1 = 0xFB76016964A33277a168c950d0010b508CbA9bAc; address private creatorAddress2 = 0xeBD0414164018B2172fb06933Be974263DBc0B83; address private creatorAddress3 = 0x0dC3EDF769F34962bbDA01eBEf4F700287f51e9d; /** * Contract constructor */ constructor(string memory name, string memory symbol, string memory _baseUri, uint256 _maxTokens) ERC721(name, symbol) { setBaseURI(_baseUri); MAX_TOKENS = _maxTokens; } /* * Set provenance once it's calculated */ function setProvenanceHash(string memory _provenanceHash) public onlyOwner { PROVENANCE = _provenanceHash; } /* * Set max tokens */ function setMaxTokens(uint256 _maxTokens) public onlyOwner { MAX_TOKENS = _maxTokens; } /* * Set max purchase */ function setMaxPurchase(uint256 _maxPurchase) public onlyOwner { MAX_PURCHASE = _maxPurchase; } /* * Pause sale if active, make active if paused */ function setSaleState(bool _newState) public onlyOwner { saleIsActive = _newState; } /** * Set the current token price */ function setCurrentPrice(uint256 _currentPrice) public onlyOwner { CURRENT_PRICE = _currentPrice; } /** * Get the token detail */ function getComedyMonsterDetail(uint256 _tokenId) public view returns(ComedyMonsterDetail memory detail) { require(_exists(_tokenId), "Token was not minted"); return _comedyMonsterDetails[_tokenId]; } /** * @dev Changes the base URI if we want to move things in the future (Callable by owner only) */ function setBaseURI(string memory BaseURI) public onlyOwner { baseURI = BaseURI; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /** * Set creatorAddress1 address */ function setCreatorAddress1(address _creatorAddress1) public onlyOwner { creatorAddress1 = _creatorAddress1; } /** * Set creatorAddress2 address */ function setCreatorAddress2(address _creatorAddress2) public onlyOwner { creatorAddress2 = _creatorAddress2; } /** * Set creatorAddress3 address */ function setCreatorAddress3(address _creatorAddress3) public onlyOwner { creatorAddress3 = _creatorAddress3; } /** * Withdraw */ function withdraw() public onlyOwner { require(address(this).balance > 0, "No balance to withdraw"); uint balance = address(this).balance; uint creatorShare1 = balance.mul(50).div(100); uint creatorShare2 = balance.mul(25).div(100); uint creatorShare3 = balance.mul(25).div(100); (bool success, ) = creatorAddress1.call{value: creatorShare1}(""); require(success, "creatorAddress1 Withdrawal failed"); (success, ) = creatorAddress2.call{value: creatorShare2}(""); require(success, "creatorAddress2 Withdrawal failed"); (success, ) = creatorAddress3.call{value: creatorShare3}(""); require(success, "creatorAddress3 Withdrawal failed"); } /** * Withdraw */ function withdrawAlt() public onlyOwner { require(address(this).balance > 0, "No balance to withdraw"); uint balance = address(this).balance; payable(msg.sender).transfer(balance); } /** * Reserve tokens */ function reserveTokens(uint256 qty) public onlyOwner { uint tokenId; uint256 creation = block.timestamp; for (uint i = 1; i <= qty; i++) { tokenId = totalSupply().add(1); if (tokenId <= MAX_TOKENS) { _safeMint(msg.sender, tokenId); _comedyMonsterDetails[tokenId] = ComedyMonsterDetail(creation); emit TokenMinted(tokenId, msg.sender, creation); } } } /** * Mint token for owners. */ function mintTokens(address[] memory _owners) public onlyOwner { require(totalSupply().add(_owners.length) <= MAX_TOKENS, "Purchase would exceed max supply"); uint256 creation = block.timestamp; uint256 tokenId; for (uint i = 0; i < _owners.length; i++) { tokenId = totalSupply().add(1); if (tokenId <= MAX_TOKENS) { _safeMint(_owners[i], tokenId); _comedyMonsterDetails[tokenId] = ComedyMonsterDetail(creation); emit TokenMinted(tokenId, _owners[i], creation); } } } /** * Mint tokens */ function mint(uint qty) public payable { require(saleIsActive, "Mint is not available right now"); require(qty <= MAX_PURCHASE, "Can only mint 20 tokens at a time"); require(totalSupply().add(qty) <= MAX_TOKENS, "Purchase would exceed max supply"); require(CURRENT_PRICE.mul(qty) <= msg.value, "Value sent is not correct"); uint256 creation = block.timestamp; uint tokenId; for(uint i = 1; i <= qty; i++) { tokenId = totalSupply().add(1); if (tokenId <= MAX_TOKENS) { _safeMint(msg.sender, tokenId); _comedyMonsterDetails[tokenId] = ComedyMonsterDetail(creation); emit TokenMinted(tokenId, msg.sender, creation); } } } /** * Get tokens owner */ function tokensOfOwner(address _owner) external view returns(uint256[] memory) { uint tokenCount = balanceOf(_owner); uint256[] memory tokensId = new uint256[](tokenCount); for(uint i = 0; i < tokenCount; i++){ tokensId[i] = tokenOfOwnerByIndex(_owner, i); } return tokensId; } }
// 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 "./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 "./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; /** * @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; 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; 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":"uint256","name":"_maxTokens","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"creation","type":"uint256"}],"name":"TokenMinted","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":"CURRENT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getComedyMonsterDetail","outputs":[{"components":[{"internalType":"uint256","name":"creation","type":"uint256"}],"internalType":"struct ComedyMonstersClub.ComedyMonsterDetail","name":"detail","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"}],"name":"mintTokens","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","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":"BaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_creatorAddress1","type":"address"}],"name":"setCreatorAddress1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_creatorAddress2","type":"address"}],"name":"setCreatorAddress2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_creatorAddress3","type":"address"}],"name":"setCreatorAddress3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_currentPrice","type":"uint256"}],"name":"setCurrentPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPurchase","type":"uint256"}],"name":"setMaxPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newState","type":"bool"}],"name":"setSaleState","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAlt","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600c90805190602001906200002b92919062000376565b506014600d55612774600e5567016345785d8a0000600f556001601060006101000a81548160ff02191690831515021790555073fb76016964a33277a168c950d0010b508cba9bac601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ebd0414164018b2172fb06933be974263dbc0b83601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730dc3edf769f34962bbda01ebef4f700287f51e9d601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200016a57600080fd5b5060405162005a6038038062005a608339818101604052810190620001909190620004af565b83838160009080519060200190620001aa92919062000376565b508060019080519060200190620001c392919062000376565b5050506000620001d86200029960201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200028882620002a160201b60201c565b80600e819055505050505062000730565b600033905090565b620002b16200029960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002d76200034c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000330576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200032790620005a8565b60405180910390fd5b80601190805190602001906200034892919062000376565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003849062000682565b90600052602060002090601f016020900481019282620003a85760008555620003f4565b82601f10620003c357805160ff1916838001178555620003f4565b82800160010185558215620003f4579182015b82811115620003f3578251825591602001919060010190620003d6565b5b50905062000403919062000407565b5090565b5b808211156200042257600081600090555060010162000408565b5090565b60006200043d6200043784620005fe565b620005ca565b9050828152602081018484840111156200045657600080fd5b620004638482856200064c565b509392505050565b600082601f8301126200047d57600080fd5b81516200048f84826020860162000426565b91505092915050565b600081519050620004a98162000716565b92915050565b60008060008060808587031215620004c657600080fd5b600085015167ffffffffffffffff811115620004e157600080fd5b620004ef878288016200046b565b945050602085015167ffffffffffffffff8111156200050d57600080fd5b6200051b878288016200046b565b935050604085015167ffffffffffffffff8111156200053957600080fd5b62000547878288016200046b565b92505060606200055a8782880162000498565b91505092959194509250565b60006200057560208362000631565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006020820190508181036000830152620005c38162000566565b9050919050565b6000604051905081810181811067ffffffffffffffff82111715620005f457620005f3620006e7565b5b8060405250919050565b600067ffffffffffffffff8211156200061c576200061b620006e7565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b838110156200066c5780820151818401526020810190506200064f565b838111156200067c576000848401525b50505050565b600060028204905060018216806200069b57607f821691505b60208210811415620006b257620006b1620006b8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620007218162000642565b81146200072d57600080fd5b50565b61532080620007406000396000f3fe60806040526004361061023b5760003560e01c806370a082311161012e578063b88d4fde116100ab578063e80893af1161006f578063e80893af1461085a578063e985e9c514610883578063eb8d2444146108c0578063f2fde38b146108eb578063f47c84c5146109145761023b565b8063b88d4fde14610779578063c4e37095146107a2578063c87b56dd146107cb578063cfafe1ef14610808578063d031370b146108315761023b565b80638462151c116100f25780638462151c146106a15780638da5cb5b146106de57806395d89b4114610709578063a0712d6814610734578063a22cb465146107505761023b565b806370a08231146105d0578063711897421461060d5780637146bd0814610636578063715018a614610661578063781b02cc146106785761023b565b80632f745c59116101bc5780634ebe2e1a116101805780634ebe2e1a146104c55780634f6ccce71461050257806355f804b31461053f5780636352211e146105685780636373a6b1146105a55761023b565b80632f745c59146103f45780633ccfd60b146104315780633fa40f941461044857806342842e0e146104715780634b369a611461049a5761023b565b806311e776fe1161020357806311e776fe1461033757806318160ddd1461036057806318b200711461038b5780631a5e2a36146103b457806323b872dd146103cb5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e5578063109695231461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613d87565b61093f565b60405161027491906149fc565b60405180910390f35b34801561028957600080fd5b506102926109b9565b60405161029f9190614a17565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613e1a565b610a4b565b6040516102dc9190614973565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613ce1565b610ad0565b005b34801561031a57600080fd5b5061033560048036038101906103309190613dd9565b610be8565b005b34801561034357600080fd5b5061035e60048036038101906103599190613e1a565b610c7e565b005b34801561036c57600080fd5b50610375610d04565b6040516103829190614db4565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad9190613e1a565b610d11565b005b3480156103c057600080fd5b506103c9610d97565b005b3480156103d757600080fd5b506103f260048036038101906103ed9190613bdb565b610ea5565b005b34801561040057600080fd5b5061041b60048036038101906104169190613ce1565b610f05565b6040516104289190614db4565b60405180910390f35b34801561043d57600080fd5b50610446610faa565b005b34801561045457600080fd5b5061046f600480360381019061046a9190613d1d565b611360565b005b34801561047d57600080fd5b5061049860048036038101906104939190613bdb565b611585565b005b3480156104a657600080fd5b506104af6115a5565b6040516104bc9190614db4565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613e1a565b6115ab565b6040516104f99190614d99565b60405180910390f35b34801561050e57600080fd5b5061052960048036038101906105249190613e1a565b61162a565b6040516105369190614db4565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613dd9565b6116c1565b005b34801561057457600080fd5b5061058f600480360381019061058a9190613e1a565b611757565b60405161059c9190614973565b60405180910390f35b3480156105b157600080fd5b506105ba611809565b6040516105c79190614a17565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190613b76565b611897565b6040516106049190614db4565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613e1a565b61194f565b005b34801561064257600080fd5b5061064b6119d5565b6040516106589190614db4565b60405180910390f35b34801561066d57600080fd5b506106766119db565b005b34801561068457600080fd5b5061069f600480360381019061069a9190613b76565b611b18565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613b76565b611bd8565b6040516106d591906149da565b60405180910390f35b3480156106ea57600080fd5b506106f3611cd2565b6040516107009190614973565b60405180910390f35b34801561071557600080fd5b5061071e611cfc565b60405161072b9190614a17565b60405180910390f35b61074e60048036038101906107499190613e1a565b611d8e565b005b34801561075c57600080fd5b5061077760048036038101906107729190613ca5565b611f9f565b005b34801561078557600080fd5b506107a0600480360381019061079b9190613c2a565b612120565b005b3480156107ae57600080fd5b506107c960048036038101906107c49190613d5e565b612182565b005b3480156107d757600080fd5b506107f260048036038101906107ed9190613e1a565b61221b565b6040516107ff9190614a17565b60405180910390f35b34801561081457600080fd5b5061082f600480360381019061082a9190613b76565b6122c2565b005b34801561083d57600080fd5b5061085860048036038101906108539190613e1a565b612382565b005b34801561086657600080fd5b50610881600480360381019061087c9190613b76565b6124c6565b005b34801561088f57600080fd5b506108aa60048036038101906108a59190613b9f565b612586565b6040516108b791906149fc565b60405180910390f35b3480156108cc57600080fd5b506108d561261a565b6040516108e291906149fc565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d9190613b76565b61262d565b005b34801561092057600080fd5b506109296127d9565b6040516109369190614db4565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b257506109b1826127df565b5b9050919050565b6060600080546109c890615115565b80601f01602080910402602001604051908101604052809291908181526020018280546109f490615115565b8015610a415780601f10610a1657610100808354040283529160200191610a41565b820191906000526020600020905b815481529060010190602001808311610a2457829003601f168201915b5050505050905090565b6000610a56826128c1565b610a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8c90614c99565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610adb82611757565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390614d39565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b6b61292d565b73ffffffffffffffffffffffffffffffffffffffff161480610b9a5750610b9981610b9461292d565b612586565b5b610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090614b99565b60405180910390fd5b610be38383612935565b505050565b610bf061292d565b73ffffffffffffffffffffffffffffffffffffffff16610c0e611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90614cb9565b60405180910390fd5b80600c9080519060200190610c7a9291906138f1565b5050565b610c8661292d565b73ffffffffffffffffffffffffffffffffffffffff16610ca4611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf190614cb9565b60405180910390fd5b80600e8190555050565b6000600880549050905090565b610d1961292d565b73ffffffffffffffffffffffffffffffffffffffff16610d37611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8490614cb9565b60405180910390fd5b80600f8190555050565b610d9f61292d565b73ffffffffffffffffffffffffffffffffffffffff16610dbd611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a90614cb9565b60405180910390fd5b60004711610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d90614d19565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ea1573d6000803e3d6000fd5b5050565b610eb6610eb061292d565b826129ee565b610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec90614d59565b60405180910390fd5b610f00838383612acc565b505050565b6000610f1083611897565b8210610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4890614a39565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fb261292d565b73ffffffffffffffffffffffffffffffffffffffff16610fd0611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90614cb9565b60405180910390fd5b60004711611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090614d19565b60405180910390fd5b600047905060006110976064611089603285612d2890919063ffffffff16565b612d3e90919063ffffffff16565b905060006110c260646110b4601986612d2890919063ffffffff16565b612d3e90919063ffffffff16565b905060006110ed60646110df601987612d2890919063ffffffff16565b612d3e90919063ffffffff16565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516111379061495e565b60006040518083038185875af1925050503d8060008114611174576040519150601f19603f3d011682016040523d82523d6000602084013e611179565b606091505b50509050806111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490614b79565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516112039061495e565b60006040518083038185875af1925050503d8060008114611240576040519150601f19603f3d011682016040523d82523d6000602084013e611245565b606091505b5050809150508061128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290614bb9565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516112d19061495e565b60006040518083038185875af1925050503d806000811461130e576040519150601f19603f3d011682016040523d82523d6000602084013e611313565b606091505b50508091505080611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135090614c19565b60405180910390fd5b5050505050565b61136861292d565b73ffffffffffffffffffffffffffffffffffffffff16611386611cd2565b73ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390614cb9565b60405180910390fd5b600e546113fa82516113ec610d04565b612d5490919063ffffffff16565b111561143b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143290614c59565b60405180910390fd5b6000429050600080600090505b835181101561157f5761146c600161145e610d04565b612d5490919063ffffffff16565b9150600e54821161156c576114c18482815181106114b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183612d6a565b604051806020016040528084815250600b6000848152602001908152602001600020600082015181600001559050507f2d03118aa776f7008445f6ca8490a6782ede2db364d741513555ba656ab1879f8285838151811061154b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518560405161156393929190614dcf565b60405180910390a15b808061157790615147565b915050611448565b50505050565b6115a083838360405180602001604052806000815250612120565b505050565b600f5481565b6115b3613977565b6115bc826128c1565b6115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290614b59565b60405180910390fd5b600b60008381526020019081526020016000206040518060200160405290816000820154815250509050919050565b6000611634610d04565b8210611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90614d79565b60405180910390fd5b600882815481106116af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6116c961292d565b73ffffffffffffffffffffffffffffffffffffffff166116e7611cd2565b73ffffffffffffffffffffffffffffffffffffffff161461173d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173490614cb9565b60405180910390fd5b80601190805190602001906117539291906138f1565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614bf9565b60405180910390fd5b80915050919050565b600c805461181690615115565b80601f016020809104026020016040519081016040528092919081815260200182805461184290615115565b801561188f5780601f106118645761010080835404028352916020019161188f565b820191906000526020600020905b81548152906001019060200180831161187257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff90614bd9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61195761292d565b73ffffffffffffffffffffffffffffffffffffffff16611975611cd2565b73ffffffffffffffffffffffffffffffffffffffff16146119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290614cb9565b60405180910390fd5b80600d8190555050565b600d5481565b6119e361292d565b73ffffffffffffffffffffffffffffffffffffffff16611a01611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614611a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4e90614cb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611b2061292d565b73ffffffffffffffffffffffffffffffffffffffff16611b3e611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614611b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8b90614cb9565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000611be583611897565b905060008167ffffffffffffffff811115611c29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611c575781602001602082028036833780820191505090505b50905060005b82811015611cc757611c6f8582610f05565b828281518110611ca8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611cbf90615147565b915050611c5d565b508092505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611d0b90615115565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3790615115565b8015611d845780601f10611d5957610100808354040283529160200191611d84565b820191906000526020600020905b815481529060010190602001808311611d6757829003601f168201915b5050505050905090565b601060009054906101000a900460ff16611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490614af9565b60405180910390fd5b600d54811115611e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1990614b39565b60405180910390fd5b600e54611e3f82611e31610d04565b612d5490919063ffffffff16565b1115611e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7790614c59565b60405180910390fd5b34611e9682600f54612d2890919063ffffffff16565b1115611ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ece90614c39565b60405180910390fd5b6000429050600080600190505b838111611f9957611f066001611ef8610d04565b612d5490919063ffffffff16565b9150600e548211611f8657611f1b3383612d6a565b604051806020016040528084815250600b6000848152602001908152602001600020600082015181600001559050507f2d03118aa776f7008445f6ca8490a6782ede2db364d741513555ba656ab1879f823385604051611f7d93929190614dcf565b60405180910390a15b8080611f9190615147565b915050611ee4565b50505050565b611fa761292d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200c90614ad9565b60405180910390fd5b806005600061202261292d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120cf61292d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161211491906149fc565b60405180910390a35050565b61213161212b61292d565b836129ee565b612170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216790614d59565b60405180910390fd5b61217c84848484612d88565b50505050565b61218a61292d565b73ffffffffffffffffffffffffffffffffffffffff166121a8611cd2565b73ffffffffffffffffffffffffffffffffffffffff16146121fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f590614cb9565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6060612226826128c1565b612265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225c90614cf9565b60405180910390fd5b600061226f612de4565b9050600081511161228f57604051806020016040528060008152506122ba565b8061229984612e76565b6040516020016122aa92919061493a565b6040516020818303038152906040525b915050919050565b6122ca61292d565b73ffffffffffffffffffffffffffffffffffffffff166122e8611cd2565b73ffffffffffffffffffffffffffffffffffffffff161461233e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233590614cb9565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61238a61292d565b73ffffffffffffffffffffffffffffffffffffffff166123a8611cd2565b73ffffffffffffffffffffffffffffffffffffffff16146123fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f590614cb9565b60405180910390fd5b6000804290506000600190505b8381116124c05761242d600161241f610d04565b612d5490919063ffffffff16565b9250600e5483116124ad576124423384612d6a565b604051806020016040528083815250600b6000858152602001908152602001600020600082015181600001559050507f2d03118aa776f7008445f6ca8490a6782ede2db364d741513555ba656ab1879f8333846040516124a493929190614dcf565b60405180910390a15b80806124b890615147565b91505061240b565b50505050565b6124ce61292d565b73ffffffffffffffffffffffffffffffffffffffff166124ec611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614612542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253990614cb9565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b61263561292d565b73ffffffffffffffffffffffffffffffffffffffff16612653611cd2565b73ffffffffffffffffffffffffffffffffffffffff16146126a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a090614cb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271090614a79565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128aa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128ba57506128b982613023565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129a883611757565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129f9826128c1565b612a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2f90614b19565b60405180910390fd5b6000612a4383611757565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ab257508373ffffffffffffffffffffffffffffffffffffffff16612a9a84610a4b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ac35750612ac28185612586565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612aec82611757565b73ffffffffffffffffffffffffffffffffffffffff1614612b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3990614cd9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba990614ab9565b60405180910390fd5b612bbd83838361308d565b612bc8600082612935565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c18919061502b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c6f9190614f4a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612d369190614fd1565b905092915050565b60008183612d4c9190614fa0565b905092915050565b60008183612d629190614f4a565b905092915050565b612d848282604051806020016040528060008152506131a1565b5050565b612d93848484612acc565b612d9f848484846131fc565b612dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd590614a59565b60405180910390fd5b50505050565b606060118054612df390615115565b80601f0160208091040260200160405190810160405280929190818152602001828054612e1f90615115565b8015612e6c5780601f10612e4157610100808354040283529160200191612e6c565b820191906000526020600020905b815481529060010190602001808311612e4f57829003601f168201915b5050505050905090565b60606000821415612ebe576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061301e565b600082905060005b60008214612ef0578080612ed990615147565b915050600a82612ee99190614fa0565b9150612ec6565b60008167ffffffffffffffff811115612f32577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f645781602001600182028036833780820191505090505b5090505b6000851461301757600182612f7d919061502b565b9150600a85612f8c9190615190565b6030612f989190614f4a565b60f81b818381518110612fd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130109190614fa0565b9450612f68565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613098838383613393565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130db576130d681613398565b61311a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131195761311883826133e1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561315d576131588161354e565b61319c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461319b5761319a8282613691565b5b5b505050565b6131ab8383613710565b6131b860008484846131fc565b6131f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ee90614a59565b60405180910390fd5b505050565b600061321d8473ffffffffffffffffffffffffffffffffffffffff166138de565b15613386578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261324661292d565b8786866040518563ffffffff1660e01b8152600401613268949392919061498e565b602060405180830381600087803b15801561328257600080fd5b505af19250505080156132b357506040513d601f19601f820116820180604052508101906132b09190613db0565b60015b613336573d80600081146132e3576040519150601f19603f3d011682016040523d82523d6000602084013e6132e8565b606091505b5060008151141561332e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332590614a59565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061338b565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016133ee84611897565b6133f8919061502b565b90506000600760008481526020019081526020016000205490508181146134dd576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613562919061502b565b90506000600960008481526020019081526020016000205490506000600883815481106135b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613600577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613675577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061369c83611897565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377790614c79565b60405180910390fd5b613789816128c1565b156137c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c090614a99565b60405180910390fd5b6137d56000838361308d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138259190614f4a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546138fd90615115565b90600052602060002090601f01602090048101928261391f5760008555613966565b82601f1061393857805160ff1916838001178555613966565b82800160010185558215613966579182015b8281111561396557825182559160200191906001019061394a565b5b509050613973919061398a565b5090565b6040518060200160405280600081525090565b5b808211156139a357600081600090555060010161398b565b5090565b60006139ba6139b584614e37565b614e06565b905080838252602082019050828560208602820111156139d957600080fd5b60005b85811015613a0957816139ef8882613a8f565b8452602084019350602083019250506001810190506139dc565b5050509392505050565b6000613a26613a2184614e63565b614e06565b905082815260208101848484011115613a3e57600080fd5b613a498482856150d3565b509392505050565b6000613a64613a5f84614e93565b614e06565b905082815260208101848484011115613a7c57600080fd5b613a878482856150d3565b509392505050565b600081359050613a9e8161528e565b92915050565b600082601f830112613ab557600080fd5b8135613ac58482602086016139a7565b91505092915050565b600081359050613add816152a5565b92915050565b600081359050613af2816152bc565b92915050565b600081519050613b07816152bc565b92915050565b600082601f830112613b1e57600080fd5b8135613b2e848260208601613a13565b91505092915050565b600082601f830112613b4857600080fd5b8135613b58848260208601613a51565b91505092915050565b600081359050613b70816152d3565b92915050565b600060208284031215613b8857600080fd5b6000613b9684828501613a8f565b91505092915050565b60008060408385031215613bb257600080fd5b6000613bc085828601613a8f565b9250506020613bd185828601613a8f565b9150509250929050565b600080600060608486031215613bf057600080fd5b6000613bfe86828701613a8f565b9350506020613c0f86828701613a8f565b9250506040613c2086828701613b61565b9150509250925092565b60008060008060808587031215613c4057600080fd5b6000613c4e87828801613a8f565b9450506020613c5f87828801613a8f565b9350506040613c7087828801613b61565b925050606085013567ffffffffffffffff811115613c8d57600080fd5b613c9987828801613b0d565b91505092959194509250565b60008060408385031215613cb857600080fd5b6000613cc685828601613a8f565b9250506020613cd785828601613ace565b9150509250929050565b60008060408385031215613cf457600080fd5b6000613d0285828601613a8f565b9250506020613d1385828601613b61565b9150509250929050565b600060208284031215613d2f57600080fd5b600082013567ffffffffffffffff811115613d4957600080fd5b613d5584828501613aa4565b91505092915050565b600060208284031215613d7057600080fd5b6000613d7e84828501613ace565b91505092915050565b600060208284031215613d9957600080fd5b6000613da784828501613ae3565b91505092915050565b600060208284031215613dc257600080fd5b6000613dd084828501613af8565b91505092915050565b600060208284031215613deb57600080fd5b600082013567ffffffffffffffff811115613e0557600080fd5b613e1184828501613b37565b91505092915050565b600060208284031215613e2c57600080fd5b6000613e3a84828501613b61565b91505092915050565b6000613e4f838361491c565b60208301905092915050565b613e648161505f565b82525050565b6000613e7582614ed3565b613e7f8185614f01565b9350613e8a83614ec3565b8060005b83811015613ebb578151613ea28882613e43565b9750613ead83614ef4565b925050600181019050613e8e565b5085935050505092915050565b613ed181615071565b82525050565b6000613ee282614ede565b613eec8185614f12565b9350613efc8185602086016150e2565b613f058161527d565b840191505092915050565b6000613f1b82614ee9565b613f258185614f2e565b9350613f358185602086016150e2565b613f3e8161527d565b840191505092915050565b6000613f5482614ee9565b613f5e8185614f3f565b9350613f6e8185602086016150e2565b80840191505092915050565b6000613f87602b83614f2e565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613fed603283614f2e565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000614053602683614f2e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140b9601c83614f2e565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006140f9602483614f2e565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061415f601983614f2e565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061419f601f83614f2e565b91507f4d696e74206973206e6f7420617661696c61626c65207269676874206e6f77006000830152602082019050919050565b60006141df602c83614f2e565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614245602183614f2e565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ab601483614f2e565b91507f546f6b656e20776173206e6f74206d696e7465640000000000000000000000006000830152602082019050919050565b60006142eb602183614f2e565b91507f63726561746f724164647265737331205769746864726177616c206661696c6560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614351603883614f2e565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006143b7602183614f2e565b91507f63726561746f724164647265737332205769746864726177616c206661696c6560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061441d602a83614f2e565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614483602983614f2e565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006144e9602183614f2e565b91507f63726561746f724164647265737333205769746864726177616c206661696c6560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061454f601983614f2e565b91507f56616c75652073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b600061458f602083614f2e565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b60006145cf602083614f2e565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061460f602c83614f2e565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614675602083614f2e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006146b5602983614f2e565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061471b602f83614f2e565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614781601683614f2e565b91507f4e6f2062616c616e636520746f207769746864726177000000000000000000006000830152602082019050919050565b60006147c1602183614f2e565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614827600083614f23565b9150600082019050919050565b6000614841603183614f2e565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006148a7602c83614f2e565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b602082016000820151614916600085018261491c565b50505050565b614925816150c9565b82525050565b614934816150c9565b82525050565b60006149468285613f49565b91506149528284613f49565b91508190509392505050565b60006149698261481a565b9150819050919050565b60006020820190506149886000830184613e5b565b92915050565b60006080820190506149a36000830187613e5b565b6149b06020830186613e5b565b6149bd604083018561492b565b81810360608301526149cf8184613ed7565b905095945050505050565b600060208201905081810360008301526149f48184613e6a565b905092915050565b6000602082019050614a116000830184613ec8565b92915050565b60006020820190508181036000830152614a318184613f10565b905092915050565b60006020820190508181036000830152614a5281613f7a565b9050919050565b60006020820190508181036000830152614a7281613fe0565b9050919050565b60006020820190508181036000830152614a9281614046565b9050919050565b60006020820190508181036000830152614ab2816140ac565b9050919050565b60006020820190508181036000830152614ad2816140ec565b9050919050565b60006020820190508181036000830152614af281614152565b9050919050565b60006020820190508181036000830152614b1281614192565b9050919050565b60006020820190508181036000830152614b32816141d2565b9050919050565b60006020820190508181036000830152614b5281614238565b9050919050565b60006020820190508181036000830152614b728161429e565b9050919050565b60006020820190508181036000830152614b92816142de565b9050919050565b60006020820190508181036000830152614bb281614344565b9050919050565b60006020820190508181036000830152614bd2816143aa565b9050919050565b60006020820190508181036000830152614bf281614410565b9050919050565b60006020820190508181036000830152614c1281614476565b9050919050565b60006020820190508181036000830152614c32816144dc565b9050919050565b60006020820190508181036000830152614c5281614542565b9050919050565b60006020820190508181036000830152614c7281614582565b9050919050565b60006020820190508181036000830152614c92816145c2565b9050919050565b60006020820190508181036000830152614cb281614602565b9050919050565b60006020820190508181036000830152614cd281614668565b9050919050565b60006020820190508181036000830152614cf2816146a8565b9050919050565b60006020820190508181036000830152614d128161470e565b9050919050565b60006020820190508181036000830152614d3281614774565b9050919050565b60006020820190508181036000830152614d52816147b4565b9050919050565b60006020820190508181036000830152614d7281614834565b9050919050565b60006020820190508181036000830152614d928161489a565b9050919050565b6000602082019050614dae6000830184614900565b92915050565b6000602082019050614dc9600083018461492b565b92915050565b6000606082019050614de4600083018661492b565b614df16020830185613e5b565b614dfe604083018461492b565b949350505050565b6000604051905081810181811067ffffffffffffffff82111715614e2d57614e2c61524e565b5b8060405250919050565b600067ffffffffffffffff821115614e5257614e5161524e565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e7e57614e7d61524e565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eae57614ead61524e565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f55826150c9565b9150614f60836150c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f9557614f946151c1565b5b828201905092915050565b6000614fab826150c9565b9150614fb6836150c9565b925082614fc657614fc56151f0565b5b828204905092915050565b6000614fdc826150c9565b9150614fe7836150c9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150205761501f6151c1565b5b828202905092915050565b6000615036826150c9565b9150615041836150c9565b925082821015615054576150536151c1565b5b828203905092915050565b600061506a826150a9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151005780820151818401526020810190506150e5565b8381111561510f576000848401525b50505050565b6000600282049050600182168061512d57607f821691505b602082108114156151415761514061521f565b5b50919050565b6000615152826150c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615185576151846151c1565b5b600182019050919050565b600061519b826150c9565b91506151a6836150c9565b9250826151b6576151b56151f0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6152978161505f565b81146152a257600080fd5b50565b6152ae81615071565b81146152b957600080fd5b50565b6152c58161507d565b81146152d057600080fd5b50565b6152dc816150c9565b81146152e757600080fd5b5056fea26469706673582212204ad8fb990b8d1813e4bed6bae310a18f5551f9aa0ff2ba935538ffba86be99fe64736f6c63430008000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000026480000000000000000000000000000000000000000000000000000000000000014436f6d656479204d6f6e737465727320436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000006434d434c55420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c68747470733a2f2f6170692e636f6d6564796d6f6e7374657273636c75622e636f6d2f6d657461646174612f0000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061023b5760003560e01c806370a082311161012e578063b88d4fde116100ab578063e80893af1161006f578063e80893af1461085a578063e985e9c514610883578063eb8d2444146108c0578063f2fde38b146108eb578063f47c84c5146109145761023b565b8063b88d4fde14610779578063c4e37095146107a2578063c87b56dd146107cb578063cfafe1ef14610808578063d031370b146108315761023b565b80638462151c116100f25780638462151c146106a15780638da5cb5b146106de57806395d89b4114610709578063a0712d6814610734578063a22cb465146107505761023b565b806370a08231146105d0578063711897421461060d5780637146bd0814610636578063715018a614610661578063781b02cc146106785761023b565b80632f745c59116101bc5780634ebe2e1a116101805780634ebe2e1a146104c55780634f6ccce71461050257806355f804b31461053f5780636352211e146105685780636373a6b1146105a55761023b565b80632f745c59146103f45780633ccfd60b146104315780633fa40f941461044857806342842e0e146104715780634b369a611461049a5761023b565b806311e776fe1161020357806311e776fe1461033757806318160ddd1461036057806318b200711461038b5780631a5e2a36146103b457806323b872dd146103cb5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e5578063109695231461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613d87565b61093f565b60405161027491906149fc565b60405180910390f35b34801561028957600080fd5b506102926109b9565b60405161029f9190614a17565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613e1a565b610a4b565b6040516102dc9190614973565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613ce1565b610ad0565b005b34801561031a57600080fd5b5061033560048036038101906103309190613dd9565b610be8565b005b34801561034357600080fd5b5061035e60048036038101906103599190613e1a565b610c7e565b005b34801561036c57600080fd5b50610375610d04565b6040516103829190614db4565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad9190613e1a565b610d11565b005b3480156103c057600080fd5b506103c9610d97565b005b3480156103d757600080fd5b506103f260048036038101906103ed9190613bdb565b610ea5565b005b34801561040057600080fd5b5061041b60048036038101906104169190613ce1565b610f05565b6040516104289190614db4565b60405180910390f35b34801561043d57600080fd5b50610446610faa565b005b34801561045457600080fd5b5061046f600480360381019061046a9190613d1d565b611360565b005b34801561047d57600080fd5b5061049860048036038101906104939190613bdb565b611585565b005b3480156104a657600080fd5b506104af6115a5565b6040516104bc9190614db4565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613e1a565b6115ab565b6040516104f99190614d99565b60405180910390f35b34801561050e57600080fd5b5061052960048036038101906105249190613e1a565b61162a565b6040516105369190614db4565b60405180910390f35b34801561054b57600080fd5b5061056660048036038101906105619190613dd9565b6116c1565b005b34801561057457600080fd5b5061058f600480360381019061058a9190613e1a565b611757565b60405161059c9190614973565b60405180910390f35b3480156105b157600080fd5b506105ba611809565b6040516105c79190614a17565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190613b76565b611897565b6040516106049190614db4565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613e1a565b61194f565b005b34801561064257600080fd5b5061064b6119d5565b6040516106589190614db4565b60405180910390f35b34801561066d57600080fd5b506106766119db565b005b34801561068457600080fd5b5061069f600480360381019061069a9190613b76565b611b18565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613b76565b611bd8565b6040516106d591906149da565b60405180910390f35b3480156106ea57600080fd5b506106f3611cd2565b6040516107009190614973565b60405180910390f35b34801561071557600080fd5b5061071e611cfc565b60405161072b9190614a17565b60405180910390f35b61074e60048036038101906107499190613e1a565b611d8e565b005b34801561075c57600080fd5b5061077760048036038101906107729190613ca5565b611f9f565b005b34801561078557600080fd5b506107a0600480360381019061079b9190613c2a565b612120565b005b3480156107ae57600080fd5b506107c960048036038101906107c49190613d5e565b612182565b005b3480156107d757600080fd5b506107f260048036038101906107ed9190613e1a565b61221b565b6040516107ff9190614a17565b60405180910390f35b34801561081457600080fd5b5061082f600480360381019061082a9190613b76565b6122c2565b005b34801561083d57600080fd5b5061085860048036038101906108539190613e1a565b612382565b005b34801561086657600080fd5b50610881600480360381019061087c9190613b76565b6124c6565b005b34801561088f57600080fd5b506108aa60048036038101906108a59190613b9f565b612586565b6040516108b791906149fc565b60405180910390f35b3480156108cc57600080fd5b506108d561261a565b6040516108e291906149fc565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d9190613b76565b61262d565b005b34801561092057600080fd5b506109296127d9565b6040516109369190614db4565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b257506109b1826127df565b5b9050919050565b6060600080546109c890615115565b80601f01602080910402602001604051908101604052809291908181526020018280546109f490615115565b8015610a415780601f10610a1657610100808354040283529160200191610a41565b820191906000526020600020905b815481529060010190602001808311610a2457829003601f168201915b5050505050905090565b6000610a56826128c1565b610a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8c90614c99565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610adb82611757565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390614d39565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b6b61292d565b73ffffffffffffffffffffffffffffffffffffffff161480610b9a5750610b9981610b9461292d565b612586565b5b610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090614b99565b60405180910390fd5b610be38383612935565b505050565b610bf061292d565b73ffffffffffffffffffffffffffffffffffffffff16610c0e611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90614cb9565b60405180910390fd5b80600c9080519060200190610c7a9291906138f1565b5050565b610c8661292d565b73ffffffffffffffffffffffffffffffffffffffff16610ca4611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf190614cb9565b60405180910390fd5b80600e8190555050565b6000600880549050905090565b610d1961292d565b73ffffffffffffffffffffffffffffffffffffffff16610d37611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8490614cb9565b60405180910390fd5b80600f8190555050565b610d9f61292d565b73ffffffffffffffffffffffffffffffffffffffff16610dbd611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a90614cb9565b60405180910390fd5b60004711610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d90614d19565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ea1573d6000803e3d6000fd5b5050565b610eb6610eb061292d565b826129ee565b610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec90614d59565b60405180910390fd5b610f00838383612acc565b505050565b6000610f1083611897565b8210610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4890614a39565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fb261292d565b73ffffffffffffffffffffffffffffffffffffffff16610fd0611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90614cb9565b60405180910390fd5b60004711611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090614d19565b60405180910390fd5b600047905060006110976064611089603285612d2890919063ffffffff16565b612d3e90919063ffffffff16565b905060006110c260646110b4601986612d2890919063ffffffff16565b612d3e90919063ffffffff16565b905060006110ed60646110df601987612d2890919063ffffffff16565b612d3e90919063ffffffff16565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516111379061495e565b60006040518083038185875af1925050503d8060008114611174576040519150601f19603f3d011682016040523d82523d6000602084013e611179565b606091505b50509050806111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490614b79565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516112039061495e565b60006040518083038185875af1925050503d8060008114611240576040519150601f19603f3d011682016040523d82523d6000602084013e611245565b606091505b5050809150508061128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290614bb9565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516112d19061495e565b60006040518083038185875af1925050503d806000811461130e576040519150601f19603f3d011682016040523d82523d6000602084013e611313565b606091505b50508091505080611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135090614c19565b60405180910390fd5b5050505050565b61136861292d565b73ffffffffffffffffffffffffffffffffffffffff16611386611cd2565b73ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390614cb9565b60405180910390fd5b600e546113fa82516113ec610d04565b612d5490919063ffffffff16565b111561143b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143290614c59565b60405180910390fd5b6000429050600080600090505b835181101561157f5761146c600161145e610d04565b612d5490919063ffffffff16565b9150600e54821161156c576114c18482815181106114b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183612d6a565b604051806020016040528084815250600b6000848152602001908152602001600020600082015181600001559050507f2d03118aa776f7008445f6ca8490a6782ede2db364d741513555ba656ab1879f8285838151811061154b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518560405161156393929190614dcf565b60405180910390a15b808061157790615147565b915050611448565b50505050565b6115a083838360405180602001604052806000815250612120565b505050565b600f5481565b6115b3613977565b6115bc826128c1565b6115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290614b59565b60405180910390fd5b600b60008381526020019081526020016000206040518060200160405290816000820154815250509050919050565b6000611634610d04565b8210611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90614d79565b60405180910390fd5b600882815481106116af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6116c961292d565b73ffffffffffffffffffffffffffffffffffffffff166116e7611cd2565b73ffffffffffffffffffffffffffffffffffffffff161461173d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173490614cb9565b60405180910390fd5b80601190805190602001906117539291906138f1565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614bf9565b60405180910390fd5b80915050919050565b600c805461181690615115565b80601f016020809104026020016040519081016040528092919081815260200182805461184290615115565b801561188f5780601f106118645761010080835404028352916020019161188f565b820191906000526020600020905b81548152906001019060200180831161187257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff90614bd9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61195761292d565b73ffffffffffffffffffffffffffffffffffffffff16611975611cd2565b73ffffffffffffffffffffffffffffffffffffffff16146119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290614cb9565b60405180910390fd5b80600d8190555050565b600d5481565b6119e361292d565b73ffffffffffffffffffffffffffffffffffffffff16611a01611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614611a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4e90614cb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611b2061292d565b73ffffffffffffffffffffffffffffffffffffffff16611b3e611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614611b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8b90614cb9565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000611be583611897565b905060008167ffffffffffffffff811115611c29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611c575781602001602082028036833780820191505090505b50905060005b82811015611cc757611c6f8582610f05565b828281518110611ca8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611cbf90615147565b915050611c5d565b508092505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611d0b90615115565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3790615115565b8015611d845780601f10611d5957610100808354040283529160200191611d84565b820191906000526020600020905b815481529060010190602001808311611d6757829003601f168201915b5050505050905090565b601060009054906101000a900460ff16611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490614af9565b60405180910390fd5b600d54811115611e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1990614b39565b60405180910390fd5b600e54611e3f82611e31610d04565b612d5490919063ffffffff16565b1115611e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7790614c59565b60405180910390fd5b34611e9682600f54612d2890919063ffffffff16565b1115611ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ece90614c39565b60405180910390fd5b6000429050600080600190505b838111611f9957611f066001611ef8610d04565b612d5490919063ffffffff16565b9150600e548211611f8657611f1b3383612d6a565b604051806020016040528084815250600b6000848152602001908152602001600020600082015181600001559050507f2d03118aa776f7008445f6ca8490a6782ede2db364d741513555ba656ab1879f823385604051611f7d93929190614dcf565b60405180910390a15b8080611f9190615147565b915050611ee4565b50505050565b611fa761292d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200c90614ad9565b60405180910390fd5b806005600061202261292d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120cf61292d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161211491906149fc565b60405180910390a35050565b61213161212b61292d565b836129ee565b612170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216790614d59565b60405180910390fd5b61217c84848484612d88565b50505050565b61218a61292d565b73ffffffffffffffffffffffffffffffffffffffff166121a8611cd2565b73ffffffffffffffffffffffffffffffffffffffff16146121fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f590614cb9565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6060612226826128c1565b612265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225c90614cf9565b60405180910390fd5b600061226f612de4565b9050600081511161228f57604051806020016040528060008152506122ba565b8061229984612e76565b6040516020016122aa92919061493a565b6040516020818303038152906040525b915050919050565b6122ca61292d565b73ffffffffffffffffffffffffffffffffffffffff166122e8611cd2565b73ffffffffffffffffffffffffffffffffffffffff161461233e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233590614cb9565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61238a61292d565b73ffffffffffffffffffffffffffffffffffffffff166123a8611cd2565b73ffffffffffffffffffffffffffffffffffffffff16146123fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f590614cb9565b60405180910390fd5b6000804290506000600190505b8381116124c05761242d600161241f610d04565b612d5490919063ffffffff16565b9250600e5483116124ad576124423384612d6a565b604051806020016040528083815250600b6000858152602001908152602001600020600082015181600001559050507f2d03118aa776f7008445f6ca8490a6782ede2db364d741513555ba656ab1879f8333846040516124a493929190614dcf565b60405180910390a15b80806124b890615147565b91505061240b565b50505050565b6124ce61292d565b73ffffffffffffffffffffffffffffffffffffffff166124ec611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614612542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253990614cb9565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b61263561292d565b73ffffffffffffffffffffffffffffffffffffffff16612653611cd2565b73ffffffffffffffffffffffffffffffffffffffff16146126a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a090614cb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271090614a79565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128aa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128ba57506128b982613023565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129a883611757565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129f9826128c1565b612a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2f90614b19565b60405180910390fd5b6000612a4383611757565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ab257508373ffffffffffffffffffffffffffffffffffffffff16612a9a84610a4b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ac35750612ac28185612586565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612aec82611757565b73ffffffffffffffffffffffffffffffffffffffff1614612b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3990614cd9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba990614ab9565b60405180910390fd5b612bbd83838361308d565b612bc8600082612935565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c18919061502b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c6f9190614f4a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612d369190614fd1565b905092915050565b60008183612d4c9190614fa0565b905092915050565b60008183612d629190614f4a565b905092915050565b612d848282604051806020016040528060008152506131a1565b5050565b612d93848484612acc565b612d9f848484846131fc565b612dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd590614a59565b60405180910390fd5b50505050565b606060118054612df390615115565b80601f0160208091040260200160405190810160405280929190818152602001828054612e1f90615115565b8015612e6c5780601f10612e4157610100808354040283529160200191612e6c565b820191906000526020600020905b815481529060010190602001808311612e4f57829003601f168201915b5050505050905090565b60606000821415612ebe576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061301e565b600082905060005b60008214612ef0578080612ed990615147565b915050600a82612ee99190614fa0565b9150612ec6565b60008167ffffffffffffffff811115612f32577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f645781602001600182028036833780820191505090505b5090505b6000851461301757600182612f7d919061502b565b9150600a85612f8c9190615190565b6030612f989190614f4a565b60f81b818381518110612fd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130109190614fa0565b9450612f68565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613098838383613393565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130db576130d681613398565b61311a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131195761311883826133e1565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561315d576131588161354e565b61319c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461319b5761319a8282613691565b5b5b505050565b6131ab8383613710565b6131b860008484846131fc565b6131f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ee90614a59565b60405180910390fd5b505050565b600061321d8473ffffffffffffffffffffffffffffffffffffffff166138de565b15613386578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261324661292d565b8786866040518563ffffffff1660e01b8152600401613268949392919061498e565b602060405180830381600087803b15801561328257600080fd5b505af19250505080156132b357506040513d601f19601f820116820180604052508101906132b09190613db0565b60015b613336573d80600081146132e3576040519150601f19603f3d011682016040523d82523d6000602084013e6132e8565b606091505b5060008151141561332e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332590614a59565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061338b565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016133ee84611897565b6133f8919061502b565b90506000600760008481526020019081526020016000205490508181146134dd576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613562919061502b565b90506000600960008481526020019081526020016000205490506000600883815481106135b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613600577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613675577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061369c83611897565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377790614c79565b60405180910390fd5b613789816128c1565b156137c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c090614a99565b60405180910390fd5b6137d56000838361308d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138259190614f4a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546138fd90615115565b90600052602060002090601f01602090048101928261391f5760008555613966565b82601f1061393857805160ff1916838001178555613966565b82800160010185558215613966579182015b8281111561396557825182559160200191906001019061394a565b5b509050613973919061398a565b5090565b6040518060200160405280600081525090565b5b808211156139a357600081600090555060010161398b565b5090565b60006139ba6139b584614e37565b614e06565b905080838252602082019050828560208602820111156139d957600080fd5b60005b85811015613a0957816139ef8882613a8f565b8452602084019350602083019250506001810190506139dc565b5050509392505050565b6000613a26613a2184614e63565b614e06565b905082815260208101848484011115613a3e57600080fd5b613a498482856150d3565b509392505050565b6000613a64613a5f84614e93565b614e06565b905082815260208101848484011115613a7c57600080fd5b613a878482856150d3565b509392505050565b600081359050613a9e8161528e565b92915050565b600082601f830112613ab557600080fd5b8135613ac58482602086016139a7565b91505092915050565b600081359050613add816152a5565b92915050565b600081359050613af2816152bc565b92915050565b600081519050613b07816152bc565b92915050565b600082601f830112613b1e57600080fd5b8135613b2e848260208601613a13565b91505092915050565b600082601f830112613b4857600080fd5b8135613b58848260208601613a51565b91505092915050565b600081359050613b70816152d3565b92915050565b600060208284031215613b8857600080fd5b6000613b9684828501613a8f565b91505092915050565b60008060408385031215613bb257600080fd5b6000613bc085828601613a8f565b9250506020613bd185828601613a8f565b9150509250929050565b600080600060608486031215613bf057600080fd5b6000613bfe86828701613a8f565b9350506020613c0f86828701613a8f565b9250506040613c2086828701613b61565b9150509250925092565b60008060008060808587031215613c4057600080fd5b6000613c4e87828801613a8f565b9450506020613c5f87828801613a8f565b9350506040613c7087828801613b61565b925050606085013567ffffffffffffffff811115613c8d57600080fd5b613c9987828801613b0d565b91505092959194509250565b60008060408385031215613cb857600080fd5b6000613cc685828601613a8f565b9250506020613cd785828601613ace565b9150509250929050565b60008060408385031215613cf457600080fd5b6000613d0285828601613a8f565b9250506020613d1385828601613b61565b9150509250929050565b600060208284031215613d2f57600080fd5b600082013567ffffffffffffffff811115613d4957600080fd5b613d5584828501613aa4565b91505092915050565b600060208284031215613d7057600080fd5b6000613d7e84828501613ace565b91505092915050565b600060208284031215613d9957600080fd5b6000613da784828501613ae3565b91505092915050565b600060208284031215613dc257600080fd5b6000613dd084828501613af8565b91505092915050565b600060208284031215613deb57600080fd5b600082013567ffffffffffffffff811115613e0557600080fd5b613e1184828501613b37565b91505092915050565b600060208284031215613e2c57600080fd5b6000613e3a84828501613b61565b91505092915050565b6000613e4f838361491c565b60208301905092915050565b613e648161505f565b82525050565b6000613e7582614ed3565b613e7f8185614f01565b9350613e8a83614ec3565b8060005b83811015613ebb578151613ea28882613e43565b9750613ead83614ef4565b925050600181019050613e8e565b5085935050505092915050565b613ed181615071565b82525050565b6000613ee282614ede565b613eec8185614f12565b9350613efc8185602086016150e2565b613f058161527d565b840191505092915050565b6000613f1b82614ee9565b613f258185614f2e565b9350613f358185602086016150e2565b613f3e8161527d565b840191505092915050565b6000613f5482614ee9565b613f5e8185614f3f565b9350613f6e8185602086016150e2565b80840191505092915050565b6000613f87602b83614f2e565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613fed603283614f2e565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000614053602683614f2e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140b9601c83614f2e565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006140f9602483614f2e565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061415f601983614f2e565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061419f601f83614f2e565b91507f4d696e74206973206e6f7420617661696c61626c65207269676874206e6f77006000830152602082019050919050565b60006141df602c83614f2e565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614245602183614f2e565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142ab601483614f2e565b91507f546f6b656e20776173206e6f74206d696e7465640000000000000000000000006000830152602082019050919050565b60006142eb602183614f2e565b91507f63726561746f724164647265737331205769746864726177616c206661696c6560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614351603883614f2e565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006143b7602183614f2e565b91507f63726561746f724164647265737332205769746864726177616c206661696c6560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061441d602a83614f2e565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614483602983614f2e565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006144e9602183614f2e565b91507f63726561746f724164647265737333205769746864726177616c206661696c6560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061454f601983614f2e565b91507f56616c75652073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b600061458f602083614f2e565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b60006145cf602083614f2e565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061460f602c83614f2e565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614675602083614f2e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006146b5602983614f2e565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061471b602f83614f2e565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614781601683614f2e565b91507f4e6f2062616c616e636520746f207769746864726177000000000000000000006000830152602082019050919050565b60006147c1602183614f2e565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614827600083614f23565b9150600082019050919050565b6000614841603183614f2e565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006148a7602c83614f2e565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b602082016000820151614916600085018261491c565b50505050565b614925816150c9565b82525050565b614934816150c9565b82525050565b60006149468285613f49565b91506149528284613f49565b91508190509392505050565b60006149698261481a565b9150819050919050565b60006020820190506149886000830184613e5b565b92915050565b60006080820190506149a36000830187613e5b565b6149b06020830186613e5b565b6149bd604083018561492b565b81810360608301526149cf8184613ed7565b905095945050505050565b600060208201905081810360008301526149f48184613e6a565b905092915050565b6000602082019050614a116000830184613ec8565b92915050565b60006020820190508181036000830152614a318184613f10565b905092915050565b60006020820190508181036000830152614a5281613f7a565b9050919050565b60006020820190508181036000830152614a7281613fe0565b9050919050565b60006020820190508181036000830152614a9281614046565b9050919050565b60006020820190508181036000830152614ab2816140ac565b9050919050565b60006020820190508181036000830152614ad2816140ec565b9050919050565b60006020820190508181036000830152614af281614152565b9050919050565b60006020820190508181036000830152614b1281614192565b9050919050565b60006020820190508181036000830152614b32816141d2565b9050919050565b60006020820190508181036000830152614b5281614238565b9050919050565b60006020820190508181036000830152614b728161429e565b9050919050565b60006020820190508181036000830152614b92816142de565b9050919050565b60006020820190508181036000830152614bb281614344565b9050919050565b60006020820190508181036000830152614bd2816143aa565b9050919050565b60006020820190508181036000830152614bf281614410565b9050919050565b60006020820190508181036000830152614c1281614476565b9050919050565b60006020820190508181036000830152614c32816144dc565b9050919050565b60006020820190508181036000830152614c5281614542565b9050919050565b60006020820190508181036000830152614c7281614582565b9050919050565b60006020820190508181036000830152614c92816145c2565b9050919050565b60006020820190508181036000830152614cb281614602565b9050919050565b60006020820190508181036000830152614cd281614668565b9050919050565b60006020820190508181036000830152614cf2816146a8565b9050919050565b60006020820190508181036000830152614d128161470e565b9050919050565b60006020820190508181036000830152614d3281614774565b9050919050565b60006020820190508181036000830152614d52816147b4565b9050919050565b60006020820190508181036000830152614d7281614834565b9050919050565b60006020820190508181036000830152614d928161489a565b9050919050565b6000602082019050614dae6000830184614900565b92915050565b6000602082019050614dc9600083018461492b565b92915050565b6000606082019050614de4600083018661492b565b614df16020830185613e5b565b614dfe604083018461492b565b949350505050565b6000604051905081810181811067ffffffffffffffff82111715614e2d57614e2c61524e565b5b8060405250919050565b600067ffffffffffffffff821115614e5257614e5161524e565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e7e57614e7d61524e565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eae57614ead61524e565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f55826150c9565b9150614f60836150c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f9557614f946151c1565b5b828201905092915050565b6000614fab826150c9565b9150614fb6836150c9565b925082614fc657614fc56151f0565b5b828204905092915050565b6000614fdc826150c9565b9150614fe7836150c9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150205761501f6151c1565b5b828202905092915050565b6000615036826150c9565b9150615041836150c9565b925082821015615054576150536151c1565b5b828203905092915050565b600061506a826150a9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151005780820151818401526020810190506150e5565b8381111561510f576000848401525b50505050565b6000600282049050600182168061512d57607f821691505b602082108114156151415761514061521f565b5b50919050565b6000615152826150c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615185576151846151c1565b5b600182019050919050565b600061519b826150c9565b91506151a6836150c9565b9250826151b6576151b56151f0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6152978161505f565b81146152a257600080fd5b50565b6152ae81615071565b81146152b957600080fd5b50565b6152c58161507d565b81146152d057600080fd5b50565b6152dc816150c9565b81146152e757600080fd5b5056fea26469706673582212204ad8fb990b8d1813e4bed6bae310a18f5551f9aa0ff2ba935538ffba86be99fe64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000026480000000000000000000000000000000000000000000000000000000000000014436f6d656479204d6f6e737465727320436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000006434d434c55420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c68747470733a2f2f6170692e636f6d6564796d6f6e7374657273636c75622e636f6d2f6d657461646174612f0000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Comedy Monsters Club
Arg [1] : symbol (string): CMCLUB
Arg [2] : _baseUri (string): https://api.comedymonstersclub.com/metadata/
Arg [3] : _maxTokens (uint256): 9800
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000002648
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [5] : 436f6d656479204d6f6e737465727320436c7562000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 434d434c55420000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000002c
Arg [9] : 68747470733a2f2f6170692e636f6d6564796d6f6e7374657273636c75622e63
Arg [10] : 6f6d2f6d657461646174612f0000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
264:6779:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;909:234:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2343:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3755:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3306:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1613:120:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1774:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1546:111:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2246::1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4443:211;;;;;;;;;;;;;:::i;:::-;;4619:300:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1222:253:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3652:753:1;;;;;;;;;;;;;:::i;:::-;;5221:604;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4985:149:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;895:49:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2407:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1729:230:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2746:93:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2046:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;657:29:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1784:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1916:107:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;754:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:13;;;;;;;;;;;;;:::i;:::-;;3492:122:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6706:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1061:85:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2505:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5864:796:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4039:290:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5200:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2093:96:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2673:353:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3134:122:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4698:471;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3313:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4395:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;983:31:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;833:33:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;909:234:5;1011:4;1049:35;1034:50;;;:11;:50;;;;:102;;;;1100:36;1124:11;1100:23;:36::i;:::-;1034:102;1027:109;;909:234;;;:::o;2343:98:4:-;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;:::-;3306:388;;;:::o;1613:120:1:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1711:15:1::1;1698:10;:28;;;;;;;;;;;;:::i;:::-;;1613:120:::0;:::o;1774:99::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1856:10:1::1;1843;:23;;;;1774:99:::0;:::o;1546:111:5:-;1607:7;1633:10;:17;;;;1626:24;;1546:111;:::o;2246::1:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2337:13:1::1;2321;:29;;;;2246:111:::0;:::o;4443:211::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4525:1:1::1;4501:21;:25;4493:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;4564:12;4579:21;4564:36;;4618:10;4610:28;;:37;4639:7;4610:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1343:1:13;4443:211:1:o:0;4619:300:4:-;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;1222:253:5:-;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;3652:753:1:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3731:1:1::1;3707:21;:25;3699:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;3774:12;3789:21;3774:36;;3820:18;3841:24;3861:3;3841:15;3853:2;3841:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;3820:45;;3875:18;3896:24;3916:3;3896:15;3908:2;3896:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;3875:45;;3930:18;3951:24;3971:3;3951:15;3963:2;3951:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;3930:45;;3987:12;4005:15;;;;;;;;;;;:20;;4033:13;4005:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3986:65;;;4069:7;4061:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;4139:15;;;;;;;;;;;:20;;4167:13;4139:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4125:60;;;;;4203:7;4195:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;4289:15;;;;;;;;;;;:20;;4317:13;4289:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4275:60;;;;;4353:7;4345:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;1343:1:13;;;;;3652:753:1:o:0;5221:604::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5339:10:1::1;;5302:33;5320:7;:14;5302:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;5294:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;5396:16;5415:15;5396:34;;5440:15;5479:6:::0;5488:1:::1;5479:10;;5474:345;5495:7;:14;5491:1;:18;5474:345;;;5540:20;5558:1;5540:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;5530:30;;5589:10;;5578:7;:21;5574:235;;5619:30;5629:7;5637:1;5629:10;;;;;;;;;;;;;;;;;;;;;;5641:7;5619:9;:30::i;:::-;5700:29;;;;;;;;5720:8;5700:29;;::::0;5667:21:::1;:30;5689:7;5667:30;;;;;;;;;;;:62;;;;;;;;;;;5752:42;5764:7;5773;5781:1;5773:10;;;;;;;;;;;;;;;;;;;;;;5785:8;5752:42;;;;;;;;:::i;:::-;;;;;;;;5574:235;5511:3;;;;;:::i;:::-;;;;5474:345;;;;1343:1:13;;5221:604:1::0;:::o;4985:149:4:-;5088:39;5105:4;5111:2;5115:7;5088:39;;;;;;;;;;;;:16;:39::i;:::-;4985:149;;;:::o;895:49:1:-;;;;:::o;2407:221::-;2477:33;;:::i;:::-;2530:17;2538:8;2530:7;:17::i;:::-;2522:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;2590:21;:31;2612:8;2590:31;;;;;;;;;;;2583:38;;;;;;;;;;;;;;;;;;;2407:221;;;:::o;1729:230:5:-;1804:7;1839:30;:28;:30::i;:::-;1831:5;:38;1823:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1935:10;1946:5;1935:17;;;;;;;;;;;;;;;;;;;;;;;;1928:24;;1729:230;;;:::o;2746:93:1:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2825:7:1::1;2815;:17;;;;;;;;;;;;:::i;:::-;;2746:93:::0;:::o;2046:235:4:-;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;657:29:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1784:205:4:-;1856:7;1900:1;1883:19;;:5;:19;;;;1875:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1966:9;:16;1976:5;1966:16;;;;;;;;;;;;;;;;1959:23;;1784:205;;;:::o;1916:107:1:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2004:12:1::1;1989;:27;;;;1916:107:::0;:::o;754:29::-;;;;:::o;1693:145:13:-;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;3492:122:1:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3591:16:1::1;3573:15;;:34;;;;;;;;;;;;;;;;;;3492:122:::0;:::o;6706:335::-;6767:16;6795:15;6813:17;6823:6;6813:9;:17::i;:::-;6795:35;;6841:25;6883:10;6869:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6841:53;;6908:6;6904:105;6924:10;6920:1;:14;6904:105;;;6968:30;6988:6;6996:1;6968:19;:30::i;:::-;6954:8;6963:1;6954:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;6936:3;;;;;:::i;:::-;;;;6904:105;;;;7026:8;7019:15;;;;6706:335;;;:::o;1061:85:13:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;2505:102:4:-;2561:13;2593:7;2586:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2505:102;:::o;5864:796:1:-;5921:12;;;;;;;;;;;5913:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;5994:12;;5987:3;:19;;5979:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;6088:10;;6062:22;6080:3;6062:13;:11;:13::i;:::-;:17;;:22;;;;:::i;:::-;:36;;6054:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6179:9;6153:22;6171:3;6153:13;;:17;;:22;;;;:::i;:::-;:35;;6145:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6228:16;6247:15;6228:34;;6272:12;6307:6;6316:1;6307:10;;6303:351;6324:3;6319:1;:8;6303:351;;6358:20;6376:1;6358:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;6348:30;;6407:10;;6396:7;:21;6392:252;;6437:30;6447:10;6459:7;6437:9;:30::i;:::-;6518:29;;;;;;;;6538:8;6518:29;;;6485:21;:30;6507:7;6485:30;;;;;;;;;;;:62;;;;;;;;;;;6587:42;6599:7;6608:10;6620:8;6587:42;;;;;;;;:::i;:::-;;;;;;;;6392:252;6329:3;;;;;:::i;:::-;;;;6303:351;;;;5864:796;;;:::o;4039:290:4:-;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;5200:282::-;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;2093:96:1:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2173:9:1::1;2158:12;;:24;;;;;;;;;;;;;;;;;;2093:96:::0;:::o;2673:353:4:-;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;3134:122:1:-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3233:16:1::1;3215:15;;:34;;;;;;;;;;;;;;;;;;3134:122:::0;:::o;4698:471::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4761:12:1::1;4783:16:::0;4802:15:::1;4783:34;;4833:6;4842:1;4833:10;;4828:335;4850:3;4845:1;:8;4828:335;;4884:20;4902:1;4884:13;:11;:13::i;:::-;:17;;:20;;;;:::i;:::-;4874:30;;4933:10;;4922:7;:21;4918:235;;4963:30;4973:10;4985:7;4963:9;:30::i;:::-;5044:29;;;;;;;;5064:8;5044:29;;::::0;5011:21:::1;:30;5033:7;5011:30;;;;;;;;;;;:62;;;;;;;;;;;5096:42;5108:7;5117:10;5129:8;5096:42;;;;;;;;:::i;:::-;;;;;;;;4918:235;4855:3;;;;;:::i;:::-;;;;4828:335;;;;1343:1:13;;4698:471:1::0;:::o;3313:122::-;1284:12:13;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3412:16:1::1;3394:15;;:34;;;;;;;;;;;;;;;;;;3313:122:::0;:::o;4395:162:4:-;4492:4;4515:18;:25;4534:5;4515:25;;;;;;;;;;;;;;;:35;4541:8;4515:35;;;;;;;;;;;;;;;;;;;;;;;;;4508:42;;4395:162;;;;:::o;983:31:1:-;;;;;;;;;;;;;:::o;1987:240:13:-;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;833:33:1:-;;;;:::o;1437:288:4:-;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;6916:125::-;6981:4;7032:1;7004:30;;:7;:16;7012:7;7004:16;;;;;;;;;;;;;;;;;;;;;:30;;;;6997:37;;6916:125;;;:::o;586:96:2:-;639:7;665:10;658:17;;586:96;:::o;10673:171:4:-;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;3382:96:14:-;3440:7;3470:1;3466;:5;;;;:::i;:::-;3459:12;;3382:96;;;;:::o;3767:::-;3825:7;3855:1;3851;:5;;;;:::i;:::-;3844:12;;3767:96;;;;:::o;2672:::-;2730:7;2760:1;2756;:5;;;;:::i;:::-;2749:12;;2672:96;;;;:::o;7873:108:4:-;7948:26;7958:2;7962:7;7948:26;;;;;;;;;;;;:9;:26::i;:::-;7873:108;;:::o;6344:269::-;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;2971:106:1:-;3031:13;3063:7;3056:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2971:106;:::o;271:703:15:-;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;924:2;915:11;;;;;:::i;:::-;;;787:150;;;960:6;946:21;;;;;271:703;;;;:::o;763:155:3:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;2555:542:5:-;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;8202:247:4:-;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;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;12817:93::-;;;;:::o;3803:161:5:-;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;;;;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;;;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;;;;;;;;;;;;;;;;;;;;;;;;6511:48;;6595:11;6570:10;6581;6570:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6705:10;6674:15;:28;6690:11;6674:28;;;;;;;;;;;:41;;;;6843:15;:24;6859:7;6843:24;;;;;;;;;;;6836:31;;;6877:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;3391:217;;;:::o;8771:372:4:-;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;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:16:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1512:303::-;;1632:3;1625:4;1617:6;1613:17;1609:27;1599:2;;1650:1;1647;1640:12;1599:2;1690:6;1677:20;1715:94;1805:3;1797:6;1790:4;1782:6;1778:17;1715:94;:::i;:::-;1706:103;;1589:226;;;;;:::o;1821:133::-;;1902:6;1889:20;1880:29;;1918:30;1942:5;1918:30;:::i;:::-;1870:84;;;;:::o;1960:137::-;;2043:6;2030:20;2021:29;;2059:32;2085:5;2059:32;:::i;:::-;2011:86;;;;:::o;2103:141::-;;2190:6;2184:13;2175:22;;2206:32;2232:5;2206:32;:::i;:::-;2165:79;;;;:::o;2263:271::-;;2367:3;2360:4;2352:6;2348:17;2344:27;2334:2;;2385:1;2382;2375:12;2334:2;2425:6;2412:20;2450:78;2524:3;2516:6;2509:4;2501:6;2497:17;2450:78;:::i;:::-;2441:87;;2324:210;;;;;:::o;2554:273::-;;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:79;2817:3;2809:6;2802:4;2794:6;2790:17;2742:79;:::i;:::-;2733:88;;2616:211;;;;;:::o;2833:139::-;;2917:6;2904:20;2895:29;;2933:33;2960:5;2933:33;:::i;:::-;2885:87;;;;:::o;2978:262::-;;3086:2;3074:9;3065:7;3061:23;3057:32;3054:2;;;3102:1;3099;3092:12;3054:2;3145:1;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3116:117;3044:196;;;;:::o;3246:407::-;;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3387:1;3384;3377:12;3339:2;3430:1;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3401:117;3557:2;3583:53;3628:7;3619:6;3608:9;3604:22;3583:53;:::i;:::-;3573:63;;3528:118;3329:324;;;;;:::o;3659:552::-;;;;3801:2;3789:9;3780:7;3776:23;3772:32;3769:2;;;3817:1;3814;3807:12;3769:2;3860:1;3885:53;3930:7;3921:6;3910:9;3906:22;3885:53;:::i;:::-;3875:63;;3831:117;3987:2;4013:53;4058:7;4049:6;4038:9;4034:22;4013:53;:::i;:::-;4003:63;;3958:118;4115:2;4141:53;4186:7;4177:6;4166:9;4162:22;4141:53;:::i;:::-;4131:63;;4086:118;3759:452;;;;;:::o;4217:809::-;;;;;4385:3;4373:9;4364:7;4360:23;4356:33;4353:2;;;4402:1;4399;4392:12;4353:2;4445:1;4470:53;4515:7;4506:6;4495:9;4491:22;4470:53;:::i;:::-;4460:63;;4416:117;4572:2;4598:53;4643:7;4634:6;4623:9;4619:22;4598:53;:::i;:::-;4588:63;;4543:118;4700:2;4726:53;4771:7;4762:6;4751:9;4747:22;4726:53;:::i;:::-;4716:63;;4671:118;4856:2;4845:9;4841:18;4828:32;4887:18;4879:6;4876:30;4873:2;;;4919:1;4916;4909:12;4873:2;4947:62;5001:7;4992:6;4981:9;4977:22;4947:62;:::i;:::-;4937:72;;4799:220;4343:683;;;;;;;:::o;5032:401::-;;;5154:2;5142:9;5133:7;5129:23;5125:32;5122:2;;;5170:1;5167;5160:12;5122:2;5213:1;5238:53;5283:7;5274:6;5263:9;5259:22;5238:53;:::i;:::-;5228:63;;5184:117;5340:2;5366:50;5408:7;5399:6;5388:9;5384:22;5366:50;:::i;:::-;5356:60;;5311:115;5112:321;;;;;:::o;5439:407::-;;;5564:2;5552:9;5543:7;5539:23;5535:32;5532:2;;;5580:1;5577;5570:12;5532:2;5623:1;5648:53;5693:7;5684:6;5673:9;5669:22;5648:53;:::i;:::-;5638:63;;5594:117;5750:2;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5721:118;5522:324;;;;;:::o;5852:405::-;;5985:2;5973:9;5964:7;5960:23;5956:32;5953:2;;;6001:1;5998;5991:12;5953:2;6072:1;6061:9;6057:17;6044:31;6102:18;6094:6;6091:30;6088:2;;;6134:1;6131;6124:12;6088:2;6162:78;6232:7;6223:6;6212:9;6208:22;6162:78;:::i;:::-;6152:88;;6015:235;5943:314;;;;:::o;6263:256::-;;6368:2;6356:9;6347:7;6343:23;6339:32;6336:2;;;6384:1;6381;6374:12;6336:2;6427:1;6452:50;6494:7;6485:6;6474:9;6470:22;6452:50;:::i;:::-;6442:60;;6398:114;6326:193;;;;:::o;6525:260::-;;6632:2;6620:9;6611:7;6607:23;6603:32;6600:2;;;6648:1;6645;6638:12;6600:2;6691:1;6716:52;6760:7;6751:6;6740:9;6736:22;6716:52;:::i;:::-;6706:62;;6662:116;6590:195;;;;:::o;6791:282::-;;6909:2;6897:9;6888:7;6884:23;6880:32;6877:2;;;6925:1;6922;6915:12;6877:2;6968:1;6993:63;7048:7;7039:6;7028:9;7024:22;6993:63;:::i;:::-;6983:73;;6939:127;6867:206;;;;:::o;7079:375::-;;7197:2;7185:9;7176:7;7172:23;7168:32;7165:2;;;7213:1;7210;7203:12;7165:2;7284:1;7273:9;7269:17;7256:31;7314:18;7306:6;7303:30;7300:2;;;7346:1;7343;7336:12;7300:2;7374:63;7429:7;7420:6;7409:9;7405:22;7374:63;:::i;:::-;7364:73;;7227:220;7155:299;;;;:::o;7460:262::-;;7568:2;7556:9;7547:7;7543:23;7539:32;7536:2;;;7584:1;7581;7574:12;7536:2;7627:1;7652:53;7697:7;7688:6;7677:9;7673:22;7652:53;:::i;:::-;7642:63;;7598:117;7526:196;;;;:::o;7728:179::-;;7818:46;7860:3;7852:6;7818:46;:::i;:::-;7896:4;7891:3;7887:14;7873:28;;7808:99;;;;:::o;7913:118::-;8000:24;8018:5;8000:24;:::i;:::-;7995:3;7988:37;7978:53;;:::o;8067:732::-;;8215:54;8263:5;8215:54;:::i;:::-;8285:86;8364:6;8359:3;8285:86;:::i;:::-;8278:93;;8395:56;8445:5;8395:56;:::i;:::-;8474:7;8505:1;8490:284;8515:6;8512:1;8509:13;8490:284;;;8591:6;8585:13;8618:63;8677:3;8662:13;8618:63;:::i;:::-;8611:70;;8704:60;8757:6;8704:60;:::i;:::-;8694:70;;8550:224;8537:1;8534;8530:9;8525:14;;8490:284;;;8494:14;8790:3;8783:10;;8191:608;;;;;;;:::o;8805:109::-;8886:21;8901:5;8886:21;:::i;:::-;8881:3;8874:34;8864:50;;:::o;8920:360::-;;9034:38;9066:5;9034:38;:::i;:::-;9088:70;9151:6;9146:3;9088:70;:::i;:::-;9081:77;;9167:52;9212:6;9207:3;9200:4;9193:5;9189:16;9167:52;:::i;:::-;9244:29;9266:6;9244:29;:::i;:::-;9239:3;9235:39;9228:46;;9010:270;;;;;:::o;9286:364::-;;9402:39;9435:5;9402:39;:::i;:::-;9457:71;9521:6;9516:3;9457:71;:::i;:::-;9450:78;;9537:52;9582:6;9577:3;9570:4;9563:5;9559:16;9537:52;:::i;:::-;9614:29;9636:6;9614:29;:::i;:::-;9609:3;9605:39;9598:46;;9378:272;;;;;:::o;9656:377::-;;9790:39;9823:5;9790:39;:::i;:::-;9845:89;9927:6;9922:3;9845:89;:::i;:::-;9838:96;;9943:52;9988:6;9983:3;9976:4;9969:5;9965:16;9943:52;:::i;:::-;10020:6;10015:3;10011:16;10004:23;;9766:267;;;;;:::o;10039:375::-;;10202:67;10266:2;10261:3;10202:67;:::i;:::-;10195:74;;10299:34;10295:1;10290:3;10286:11;10279:55;10365:13;10360:2;10355:3;10351:12;10344:35;10405:2;10400:3;10396:12;10389:19;;10185:229;;;:::o;10420:382::-;;10583:67;10647:2;10642:3;10583:67;:::i;:::-;10576:74;;10680:34;10676:1;10671:3;10667:11;10660:55;10746:20;10741:2;10736:3;10732:12;10725:42;10793:2;10788:3;10784:12;10777:19;;10566:236;;;:::o;10808:370::-;;10971:67;11035:2;11030:3;10971:67;:::i;:::-;10964:74;;11068:34;11064:1;11059:3;11055:11;11048:55;11134:8;11129:2;11124:3;11120:12;11113:30;11169:2;11164:3;11160:12;11153:19;;10954:224;;;:::o;11184:326::-;;11347:67;11411:2;11406:3;11347:67;:::i;:::-;11340:74;;11444:30;11440:1;11435:3;11431:11;11424:51;11501:2;11496:3;11492:12;11485:19;;11330:180;;;:::o;11516:368::-;;11679:67;11743:2;11738:3;11679:67;:::i;:::-;11672:74;;11776:34;11772:1;11767:3;11763:11;11756:55;11842:6;11837:2;11832:3;11828:12;11821:28;11875:2;11870:3;11866:12;11859:19;;11662:222;;;:::o;11890:323::-;;12053:67;12117:2;12112:3;12053:67;:::i;:::-;12046:74;;12150:27;12146:1;12141:3;12137:11;12130:48;12204:2;12199:3;12195:12;12188:19;;12036:177;;;:::o;12219:329::-;;12382:67;12446:2;12441:3;12382:67;:::i;:::-;12375:74;;12479:33;12475:1;12470:3;12466:11;12459:54;12539:2;12534:3;12530:12;12523:19;;12365:183;;;:::o;12554:376::-;;12717:67;12781:2;12776:3;12717:67;:::i;:::-;12710:74;;12814:34;12810:1;12805:3;12801:11;12794:55;12880:14;12875:2;12870:3;12866:12;12859:36;12921:2;12916:3;12912:12;12905:19;;12700:230;;;:::o;12936:365::-;;13099:67;13163:2;13158:3;13099:67;:::i;:::-;13092:74;;13196:34;13192:1;13187:3;13183:11;13176:55;13262:3;13257:2;13252:3;13248:12;13241:25;13292:2;13287:3;13283:12;13276:19;;13082:219;;;:::o;13307:318::-;;13470:67;13534:2;13529:3;13470:67;:::i;:::-;13463:74;;13567:22;13563:1;13558:3;13554:11;13547:43;13616:2;13611:3;13607:12;13600:19;;13453:172;;;:::o;13631:365::-;;13794:67;13858:2;13853:3;13794:67;:::i;:::-;13787:74;;13891:34;13887:1;13882:3;13878:11;13871:55;13957:3;13952:2;13947:3;13943:12;13936:25;13987:2;13982:3;13978:12;13971:19;;13777:219;;;:::o;14002:388::-;;14165:67;14229:2;14224:3;14165:67;:::i;:::-;14158:74;;14262:34;14258:1;14253:3;14249:11;14242:55;14328:26;14323:2;14318:3;14314:12;14307:48;14381:2;14376:3;14372:12;14365:19;;14148:242;;;:::o;14396:365::-;;14559:67;14623:2;14618:3;14559:67;:::i;:::-;14552:74;;14656:34;14652:1;14647:3;14643:11;14636:55;14722:3;14717:2;14712:3;14708:12;14701:25;14752:2;14747:3;14743:12;14736:19;;14542:219;;;:::o;14767:374::-;;14930:67;14994:2;14989:3;14930:67;:::i;:::-;14923:74;;15027:34;15023:1;15018:3;15014:11;15007:55;15093:12;15088:2;15083:3;15079:12;15072:34;15132:2;15127:3;15123:12;15116:19;;14913:228;;;:::o;15147:373::-;;15310:67;15374:2;15369:3;15310:67;:::i;:::-;15303:74;;15407:34;15403:1;15398:3;15394:11;15387:55;15473:11;15468:2;15463:3;15459:12;15452:33;15511:2;15506:3;15502:12;15495:19;;15293:227;;;:::o;15526:365::-;;15689:67;15753:2;15748:3;15689:67;:::i;:::-;15682:74;;15786:34;15782:1;15777:3;15773:11;15766:55;15852:3;15847:2;15842:3;15838:12;15831:25;15882:2;15877:3;15873:12;15866:19;;15672:219;;;:::o;15897:323::-;;16060:67;16124:2;16119:3;16060:67;:::i;:::-;16053:74;;16157:27;16153:1;16148:3;16144:11;16137:48;16211:2;16206:3;16202:12;16195:19;;16043:177;;;:::o;16226:330::-;;16389:67;16453:2;16448:3;16389:67;:::i;:::-;16382:74;;16486:34;16482:1;16477:3;16473:11;16466:55;16547:2;16542:3;16538:12;16531:19;;16372:184;;;:::o;16562:330::-;;16725:67;16789:2;16784:3;16725:67;:::i;:::-;16718:74;;16822:34;16818:1;16813:3;16809:11;16802:55;16883:2;16878:3;16874:12;16867:19;;16708:184;;;:::o;16898:376::-;;17061:67;17125:2;17120:3;17061:67;:::i;:::-;17054:74;;17158:34;17154:1;17149:3;17145:11;17138:55;17224:14;17219:2;17214:3;17210:12;17203:36;17265:2;17260:3;17256:12;17249:19;;17044:230;;;:::o;17280:330::-;;17443:67;17507:2;17502:3;17443:67;:::i;:::-;17436:74;;17540:34;17536:1;17531:3;17527:11;17520:55;17601:2;17596:3;17592:12;17585:19;;17426:184;;;:::o;17616:373::-;;17779:67;17843:2;17838:3;17779:67;:::i;:::-;17772:74;;17876:34;17872:1;17867:3;17863:11;17856:55;17942:11;17937:2;17932:3;17928:12;17921:33;17980:2;17975:3;17971:12;17964:19;;17762:227;;;:::o;17995:379::-;;18158:67;18222:2;18217:3;18158:67;:::i;:::-;18151:74;;18255:34;18251:1;18246:3;18242:11;18235:55;18321:17;18316:2;18311:3;18307:12;18300:39;18365:2;18360:3;18356:12;18349:19;;18141:233;;;:::o;18380:320::-;;18543:67;18607:2;18602:3;18543:67;:::i;:::-;18536:74;;18640:24;18636:1;18631:3;18627:11;18620:45;18691:2;18686:3;18682:12;18675:19;;18526:174;;;:::o;18706:365::-;;18869:67;18933:2;18928:3;18869:67;:::i;:::-;18862:74;;18966:34;18962:1;18957:3;18953:11;18946:55;19032:3;19027:2;19022:3;19018:12;19011:25;19062:2;19057:3;19053:12;19046:19;;18852:219;;;:::o;19077:297::-;;19257:83;19338:1;19333:3;19257:83;:::i;:::-;19250:90;;19366:1;19361:3;19357:11;19350:18;;19240:134;;;:::o;19380:381::-;;19543:67;19607:2;19602:3;19543:67;:::i;:::-;19536:74;;19640:34;19636:1;19631:3;19627:11;19620:55;19706:19;19701:2;19696:3;19692:12;19685:41;19752:2;19747:3;19743:12;19736:19;;19526:235;;;:::o;19767:376::-;;19930:67;19994:2;19989:3;19930:67;:::i;:::-;19923:74;;20027:34;20023:1;20018:3;20014:11;20007:55;20093:14;20088:2;20083:3;20079:12;20072:36;20134:2;20129:3;20125:12;20118:19;;19913:230;;;:::o;20251:359::-;20420:4;20415:3;20411:14;20511:4;20504:5;20500:16;20494:23;20530:63;20587:4;20582:3;20578:14;20564:12;20530:63;:::i;:::-;20435:168;20389:221;;;:::o;20616:108::-;20693:24;20711:5;20693:24;:::i;:::-;20688:3;20681:37;20671:53;;:::o;20730:118::-;20817:24;20835:5;20817:24;:::i;:::-;20812:3;20805:37;20795:53;;:::o;20854:435::-;;21056:95;21147:3;21138:6;21056:95;:::i;:::-;21049:102;;21168:95;21259:3;21250:6;21168:95;:::i;:::-;21161:102;;21280:3;21273:10;;21038:251;;;;;:::o;21295:379::-;;21501:147;21644:3;21501:147;:::i;:::-;21494:154;;21665:3;21658:10;;21483:191;;;:::o;21680:222::-;;21811:2;21800:9;21796:18;21788:26;;21824:71;21892:1;21881:9;21877:17;21868:6;21824:71;:::i;:::-;21778:124;;;;:::o;21908:640::-;;22141:3;22130:9;22126:19;22118:27;;22155:71;22223:1;22212:9;22208:17;22199:6;22155:71;:::i;:::-;22236:72;22304:2;22293:9;22289:18;22280:6;22236:72;:::i;:::-;22318;22386:2;22375:9;22371:18;22362:6;22318:72;:::i;:::-;22437:9;22431:4;22427:20;22422:2;22411:9;22407:18;22400:48;22465:76;22536:4;22527:6;22465:76;:::i;:::-;22457:84;;22108:440;;;;;;;:::o;22554:373::-;;22735:2;22724:9;22720:18;22712:26;;22784:9;22778:4;22774:20;22770:1;22759:9;22755:17;22748:47;22812:108;22915:4;22906:6;22812:108;:::i;:::-;22804:116;;22702:225;;;;:::o;22933:210::-;;23058:2;23047:9;23043:18;23035:26;;23071:65;23133:1;23122:9;23118:17;23109:6;23071:65;:::i;:::-;23025:118;;;;:::o;23149:313::-;;23300:2;23289:9;23285:18;23277:26;;23349:9;23343:4;23339:20;23335:1;23324:9;23320:17;23313:47;23377:78;23450:4;23441:6;23377:78;:::i;:::-;23369:86;;23267:195;;;;:::o;23468:419::-;;23672:2;23661:9;23657:18;23649:26;;23721:9;23715:4;23711:20;23707:1;23696:9;23692:17;23685:47;23749:131;23875:4;23749:131;:::i;:::-;23741:139;;23639:248;;;:::o;23893:419::-;;24097:2;24086:9;24082:18;24074:26;;24146:9;24140:4;24136:20;24132:1;24121:9;24117:17;24110:47;24174:131;24300:4;24174:131;:::i;:::-;24166:139;;24064:248;;;:::o;24318:419::-;;24522:2;24511:9;24507:18;24499:26;;24571:9;24565:4;24561:20;24557:1;24546:9;24542:17;24535:47;24599:131;24725:4;24599:131;:::i;:::-;24591:139;;24489:248;;;:::o;24743:419::-;;24947:2;24936:9;24932:18;24924:26;;24996:9;24990:4;24986:20;24982:1;24971:9;24967:17;24960:47;25024:131;25150:4;25024:131;:::i;:::-;25016:139;;24914:248;;;:::o;25168:419::-;;25372:2;25361:9;25357:18;25349:26;;25421:9;25415:4;25411:20;25407:1;25396:9;25392:17;25385:47;25449:131;25575:4;25449:131;:::i;:::-;25441:139;;25339:248;;;:::o;25593:419::-;;25797:2;25786:9;25782:18;25774:26;;25846:9;25840:4;25836:20;25832:1;25821:9;25817:17;25810:47;25874:131;26000:4;25874:131;:::i;:::-;25866:139;;25764:248;;;:::o;26018:419::-;;26222:2;26211:9;26207:18;26199:26;;26271:9;26265:4;26261:20;26257:1;26246:9;26242:17;26235:47;26299:131;26425:4;26299:131;:::i;:::-;26291:139;;26189:248;;;:::o;26443:419::-;;26647:2;26636:9;26632:18;26624:26;;26696:9;26690:4;26686:20;26682:1;26671:9;26667:17;26660:47;26724:131;26850:4;26724:131;:::i;:::-;26716:139;;26614:248;;;:::o;26868:419::-;;27072:2;27061:9;27057:18;27049:26;;27121:9;27115:4;27111:20;27107:1;27096:9;27092:17;27085:47;27149:131;27275:4;27149:131;:::i;:::-;27141:139;;27039:248;;;:::o;27293:419::-;;27497:2;27486:9;27482:18;27474:26;;27546:9;27540:4;27536:20;27532:1;27521:9;27517:17;27510:47;27574:131;27700:4;27574:131;:::i;:::-;27566:139;;27464:248;;;:::o;27718:419::-;;27922:2;27911:9;27907:18;27899:26;;27971:9;27965:4;27961:20;27957:1;27946:9;27942:17;27935:47;27999:131;28125:4;27999:131;:::i;:::-;27991:139;;27889:248;;;:::o;28143:419::-;;28347:2;28336:9;28332:18;28324:26;;28396:9;28390:4;28386:20;28382:1;28371:9;28367:17;28360:47;28424:131;28550:4;28424:131;:::i;:::-;28416:139;;28314:248;;;:::o;28568:419::-;;28772:2;28761:9;28757:18;28749:26;;28821:9;28815:4;28811:20;28807:1;28796:9;28792:17;28785:47;28849:131;28975:4;28849:131;:::i;:::-;28841:139;;28739:248;;;:::o;28993:419::-;;29197:2;29186:9;29182:18;29174:26;;29246:9;29240:4;29236:20;29232:1;29221:9;29217:17;29210:47;29274:131;29400:4;29274:131;:::i;:::-;29266:139;;29164:248;;;:::o;29418:419::-;;29622:2;29611:9;29607:18;29599:26;;29671:9;29665:4;29661:20;29657:1;29646:9;29642:17;29635:47;29699:131;29825:4;29699:131;:::i;:::-;29691:139;;29589:248;;;:::o;29843:419::-;;30047:2;30036:9;30032:18;30024:26;;30096:9;30090:4;30086:20;30082:1;30071:9;30067:17;30060:47;30124:131;30250:4;30124:131;:::i;:::-;30116:139;;30014:248;;;:::o;30268:419::-;;30472:2;30461:9;30457:18;30449:26;;30521:9;30515:4;30511:20;30507:1;30496:9;30492:17;30485:47;30549:131;30675:4;30549:131;:::i;:::-;30541:139;;30439:248;;;:::o;30693:419::-;;30897:2;30886:9;30882:18;30874:26;;30946:9;30940:4;30936:20;30932:1;30921:9;30917:17;30910:47;30974:131;31100:4;30974:131;:::i;:::-;30966:139;;30864:248;;;:::o;31118:419::-;;31322:2;31311:9;31307:18;31299:26;;31371:9;31365:4;31361:20;31357:1;31346:9;31342:17;31335:47;31399:131;31525:4;31399:131;:::i;:::-;31391:139;;31289:248;;;:::o;31543:419::-;;31747:2;31736:9;31732:18;31724:26;;31796:9;31790:4;31786:20;31782:1;31771:9;31767:17;31760:47;31824:131;31950:4;31824:131;:::i;:::-;31816:139;;31714:248;;;:::o;31968:419::-;;32172:2;32161:9;32157:18;32149:26;;32221:9;32215:4;32211:20;32207:1;32196:9;32192:17;32185:47;32249:131;32375:4;32249:131;:::i;:::-;32241:139;;32139:248;;;:::o;32393:419::-;;32597:2;32586:9;32582:18;32574:26;;32646:9;32640:4;32636:20;32632:1;32621:9;32617:17;32610:47;32674:131;32800:4;32674:131;:::i;:::-;32666:139;;32564:248;;;:::o;32818:419::-;;33022:2;33011:9;33007:18;32999:26;;33071:9;33065:4;33061:20;33057:1;33046:9;33042:17;33035:47;33099:131;33225:4;33099:131;:::i;:::-;33091:139;;32989:248;;;:::o;33243:419::-;;33447:2;33436:9;33432:18;33424:26;;33496:9;33490:4;33486:20;33482:1;33471:9;33467:17;33460:47;33524:131;33650:4;33524:131;:::i;:::-;33516:139;;33414:248;;;:::o;33668:419::-;;33872:2;33861:9;33857:18;33849:26;;33921:9;33915:4;33911:20;33907:1;33896:9;33892:17;33885:47;33949:131;34075:4;33949:131;:::i;:::-;33941:139;;33839:248;;;:::o;34093:419::-;;34297:2;34286:9;34282:18;34274:26;;34346:9;34340:4;34336:20;34332:1;34321:9;34317:17;34310:47;34374:131;34500:4;34374:131;:::i;:::-;34366:139;;34264:248;;;:::o;34518:419::-;;34722:2;34711:9;34707:18;34699:26;;34771:9;34765:4;34761:20;34757:1;34746:9;34742:17;34735:47;34799:131;34925:4;34799:131;:::i;:::-;34791:139;;34689:248;;;:::o;34943:366::-;;35146:2;35135:9;35131:18;35123:26;;35159:143;35299:1;35288:9;35284:17;35275:6;35159:143;:::i;:::-;35113:196;;;;:::o;35315:222::-;;35446:2;35435:9;35431:18;35423:26;;35459:71;35527:1;35516:9;35512:17;35503:6;35459:71;:::i;:::-;35413:124;;;;:::o;35543:442::-;;35730:2;35719:9;35715:18;35707:26;;35743:71;35811:1;35800:9;35796:17;35787:6;35743:71;:::i;:::-;35824:72;35892:2;35881:9;35877:18;35868:6;35824:72;:::i;:::-;35906;35974:2;35963:9;35959:18;35950:6;35906:72;:::i;:::-;35697:288;;;;;;:::o;35991:283::-;;36057:2;36051:9;36041:19;;36099:4;36091:6;36087:17;36206:6;36194:10;36191:22;36170:18;36158:10;36155:34;36152:62;36149:2;;;36217:18;;:::i;:::-;36149:2;36257:10;36253:2;36246:22;36031:243;;;;:::o;36280:311::-;;36447:18;36439:6;36436:30;36433:2;;;36469:18;;:::i;:::-;36433:2;36519:4;36511:6;36507:17;36499:25;;36579:4;36573;36569:15;36561:23;;36362:229;;;:::o;36597:331::-;;36748:18;36740:6;36737:30;36734:2;;;36770:18;;:::i;:::-;36734:2;36855:4;36851:9;36844:4;36836:6;36832:17;36828:33;36820:41;;36916:4;36910;36906:15;36898:23;;36663:265;;;:::o;36934:332::-;;37086:18;37078:6;37075:30;37072:2;;;37108:18;;:::i;:::-;37072:2;37193:4;37189:9;37182:4;37174:6;37170:17;37166:33;37158:41;;37254:4;37248;37244:15;37236:23;;37001:265;;;:::o;37272:132::-;;37362:3;37354:11;;37392:4;37387:3;37383:14;37375:22;;37344:60;;;:::o;37410:114::-;;37511:5;37505:12;37495:22;;37484:40;;;:::o;37530:98::-;;37615:5;37609:12;37599:22;;37588:40;;;:::o;37634:99::-;;37720:5;37714:12;37704:22;;37693:40;;;:::o;37739:113::-;;37841:4;37836:3;37832:14;37824:22;;37814:38;;;:::o;37858:184::-;;37991:6;37986:3;37979:19;38031:4;38026:3;38022:14;38007:29;;37969:73;;;;:::o;38048:168::-;;38165:6;38160:3;38153:19;38205:4;38200:3;38196:14;38181:29;;38143:73;;;;:::o;38222:147::-;;38360:3;38345:18;;38335:34;;;;:::o;38375:169::-;;38493:6;38488:3;38481:19;38533:4;38528:3;38524:14;38509:29;;38471:73;;;;:::o;38550:148::-;;38689:3;38674:18;;38664:34;;;;:::o;38704:305::-;;38763:20;38781:1;38763:20;:::i;:::-;38758:25;;38797:20;38815:1;38797:20;:::i;:::-;38792:25;;38951:1;38883:66;38879:74;38876:1;38873:81;38870:2;;;38957:18;;:::i;:::-;38870:2;39001:1;38998;38994:9;38987:16;;38748:261;;;;:::o;39015:185::-;;39072:20;39090:1;39072:20;:::i;:::-;39067:25;;39106:20;39124:1;39106:20;:::i;:::-;39101:25;;39145:1;39135:2;;39150:18;;:::i;:::-;39135:2;39192:1;39189;39185:9;39180:14;;39057:143;;;;:::o;39206:348::-;;39269:20;39287:1;39269:20;:::i;:::-;39264:25;;39303:20;39321:1;39303:20;:::i;:::-;39298:25;;39491:1;39423:66;39419:74;39416:1;39413:81;39408:1;39401:9;39394:17;39390:105;39387:2;;;39498:18;;:::i;:::-;39387:2;39546:1;39543;39539:9;39528:20;;39254:300;;;;:::o;39560:191::-;;39620:20;39638:1;39620:20;:::i;:::-;39615:25;;39654:20;39672:1;39654:20;:::i;:::-;39649:25;;39693:1;39690;39687:8;39684:2;;;39698:18;;:::i;:::-;39684:2;39743:1;39740;39736:9;39728:17;;39605:146;;;;:::o;39757:96::-;;39823:24;39841:5;39823:24;:::i;:::-;39812:35;;39802:51;;;:::o;39859:90::-;;39936:5;39929:13;39922:21;39911:32;;39901:48;;;:::o;39955:149::-;;40031:66;40024:5;40020:78;40009:89;;39999:105;;;:::o;40110:126::-;;40187:42;40180:5;40176:54;40165:65;;40155:81;;;:::o;40242:77::-;;40308:5;40297:16;;40287:32;;;:::o;40325:154::-;40409:6;40404:3;40399;40386:30;40471:1;40462:6;40457:3;40453:16;40446:27;40376:103;;;:::o;40485:307::-;40553:1;40563:113;40577:6;40574:1;40571:13;40563:113;;;40662:1;40657:3;40653:11;40647:18;40643:1;40638:3;40634:11;40627:39;40599:2;40596:1;40592:10;40587:15;;40563:113;;;40694:6;40691:1;40688:13;40685:2;;;40774:1;40765:6;40760:3;40756:16;40749:27;40685:2;40534:258;;;;:::o;40798:320::-;;40879:1;40873:4;40869:12;40859:22;;40926:1;40920:4;40916:12;40947:18;40937:2;;41003:4;40995:6;40991:17;40981:27;;40937:2;41065;41057:6;41054:14;41034:18;41031:38;41028:2;;;41084:18;;:::i;:::-;41028:2;40849:269;;;;:::o;41124:233::-;;41186:24;41204:5;41186:24;:::i;:::-;41177:33;;41232:66;41225:5;41222:77;41219:2;;;41302:18;;:::i;:::-;41219:2;41349:1;41342:5;41338:13;41331:20;;41167:190;;;:::o;41363:176::-;;41412:20;41430:1;41412:20;:::i;:::-;41407:25;;41446:20;41464:1;41446:20;:::i;:::-;41441:25;;41485:1;41475:2;;41490:18;;:::i;:::-;41475:2;41531:1;41528;41524:9;41519:14;;41397:142;;;;:::o;41545:180::-;41593:77;41590:1;41583:88;41690:4;41687:1;41680:15;41714:4;41711:1;41704:15;41731:180;41779:77;41776:1;41769:88;41876:4;41873:1;41866:15;41900:4;41897:1;41890:15;41917:180;41965:77;41962:1;41955:88;42062:4;42059:1;42052:15;42086:4;42083:1;42076:15;42103:180;42151:77;42148:1;42141:88;42248:4;42245:1;42238:15;42272:4;42269:1;42262:15;42289:102;;42381:2;42377:7;42372:2;42365:5;42361:14;42357:28;42347:38;;42337:54;;;:::o;42397:122::-;42470:24;42488:5;42470:24;:::i;:::-;42463:5;42460:35;42450:2;;42509:1;42506;42499:12;42450:2;42440:79;:::o;42525:116::-;42595:21;42610:5;42595:21;:::i;:::-;42588:5;42585:32;42575:2;;42631:1;42628;42621:12;42575:2;42565:76;:::o;42647:120::-;42719:23;42736:5;42719:23;:::i;:::-;42712:5;42709:34;42699:2;;42757:1;42754;42747:12;42699:2;42689:78;:::o;42773:122::-;42846:24;42864:5;42846:24;:::i;:::-;42839:5;42836:35;42826:2;;42885:1;42882;42875:12;42826:2;42816:79;:::o
Swarm Source
ipfs://4ad8fb990b8d1813e4bed6bae310a18f5551f9aa0ff2ba935538ffba86be99fe
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.