Contract 0xc9b47Dcb7f55175e03483Dc626158a37e7A73516

 
 
Txn Hash
Method
Block
From
To
Value
0x4e17e2ee01642cc5423827db293838614ba2a384293e1e2ace58276398b89377Eggs Hatch160062532022-11-19 19:49:2310 days 11 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00311955 15.43492714
0xcaf06db5dd277d1d03bccd6127d7411dd4ad2a8df7097c6947c76b285d369e25Eggs Hatch160062402022-11-19 19:46:3510 days 11 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.0030224 14.95426654
0x147be4603965209f1ecd9820ed595afbeb06cd25eacc021f143d569b08e6989fEggs Hatch160062292022-11-19 19:44:2310 days 11 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00269045 13.3118475
0x9f2bc67ff8a5a58a1585da106ac8687159e75af51dda8a8f98b58a9d1b60f2d2Eggs Hatch159700012022-11-14 18:14:5915 days 13 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00420351 20.79814443
0x9ce872170442ca263aa903008ec0b3ae7d714b616006b7fadff9677ecdc55278Breed159506882022-11-12 1:35:2318 days 6 hrs ago0xa3c9de43453cdac55c1fa36f216d14041894c871 IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00534173 16.6602924
0x6ed521f3623cdb7c1da44e74bc4e41dcb944dd027c2d042b0d68d4ac525f8ea6Breed159506822022-11-12 1:34:1118 days 6 hrs ago0xa3c9de43453cdac55c1fa36f216d14041894c871 IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00574249 17.91019398
0x92c2ab0f15624161efff34506e327e2247d22f89e190e66b61f81126a00c46a0Breed159506712022-11-12 1:31:5918 days 6 hrs ago0xa3c9de43453cdac55c1fa36f216d14041894c871 IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00572197 17.84685991
0x3edc8520ff225bb76e66ec76563f2dbc935ba8f66fed2cec3bed137d8a713e6bBreed159197322022-11-07 17:46:5922 days 13 hrs ago0xa3c9de43453cdac55c1fa36f216d14041894c871 IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00594591 18.54535595
0x9423eddbb817aaaf7a0e7e52dfe93859a76eb8aee5bb1f0a1f747797b09d441fEggs Hatch158936422022-11-04 2:23:1126 days 5 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.002779 13.74997725
0x13071c7674f059874183e9b13671aa4ed971ff733cbd765fe96d130c81bcfcaeEggs Hatch158799472022-11-02 4:27:4728 days 3 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00238588 11.80489628
0x9ae4f0b495988a6f7c101f327286c7742328999c2d000e099382d9d9de4e901cBreed158473522022-10-28 15:07:1132 days 16 hrs ago0xd2e6ec7894444fa03527b3f59ca85ae8dc25e387 IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00528229 16.47593339
0x61aeaecf3bb3539838f1d1f8a07338f47a1853337bf6ce18c0ccd78a7ab7321fBreed158437102022-10-28 2:54:4733 days 4 hrs ago0x1f66a76d55d6f7bd4ae603650b8f959c1efc539e IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.0057129818.7
0xdb29c2193890a5ce52e150bdc7dcf1ee65730b30047fb552511ba9c68d2106ccEggs Hatch158374072022-10-27 5:45:4734 days 1 hr agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00208318 10.30719597
0xd3e48b2aae1e2f2b4ab5d47b63ef608a58cff77e9d1e8fba6309c381d90a5354Eggs Hatch158373912022-10-27 5:42:3534 days 2 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00216576 10.71577779
0xdb2dfca00a7370e7beb00632793cc6b103187b54044b99b3129ce06dc3a2bc10Eggs Hatch158373762022-10-27 5:39:3534 days 2 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00205018 10.14388823
0x1ad26064564f7daee5cef3b5b4bd698afc025269702b51798a3bc0a44cb269faEggs Hatch158373612022-10-27 5:36:3534 days 2 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00197267 9.76039074
0x89cc655c61f4a342d8ee60cb212bcd8067a38876f038393e9e0b40e9fa542352Eggs Hatch158350702022-10-26 21:55:2334 days 9 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00374586 18.53380687
0x28b48202ca252c8c3d789b19d06b18ad26ff2eb05e57280feb4bf0e42467370aEggs Hatch158350502022-10-26 21:51:2334 days 9 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00317046 15.68682729
0xfec7cb851c3681a0c44730ee14c885cc24b3d9047f4fa278a6768ee03470ca04Eggs Hatch158350232022-10-26 21:45:5934 days 9 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00329676 16.31173709
0xc86990606ff0b8e1da85c36bf4e83175181019bd8f9a1faee881b56a090aaa83Eggs Hatch158350032022-10-26 21:41:5934 days 10 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.0036613 18.11542657
0xbd9e2b3616e678d6b356297c010031ff131ad92c6e2ed8d82a430b5990c61944Eggs Hatch158349912022-10-26 21:39:3534 days 10 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00366394 18.1284858
0xf4fd4094f888cdbe0415e90ffcf78376d092c9d6926664dd48d24ad6c0070f31Eggs Hatch158201712022-10-24 19:56:4736 days 11 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00381911 18.89620706
0xc8252c6b057ddfbcb72642fc665dc8a35fc4b60567bd68a6d45c2604ba1946ffEggs Hatch158141142022-10-23 23:32:5937 days 8 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00249434 12.34152627
0xb8126fd0afa88bed4057fe7c734c41349f6f1cd77b3823212bbc8eeb1568731bEggs Hatch158140902022-10-23 23:28:1137 days 8 hrs agoENS Name collarquest.eth IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.00033975 11.99166402
0x700b99b3f3e8059e125a7fe2a786a31a2f678c7cd039610699b6199fd938dd61Breed157984592022-10-21 19:06:1139 days 12 hrs ago0xa3c9de43453cdac55c1fa36f216d14041894c871 IN  0xc9b47dcb7f55175e03483dc626158a37e7a735160 Ether0.01439822 50.27610406
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Breeding

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-07
*/

pragma solidity 0.8.4;
//SPDX-License-Identifier: UNLICENSED

interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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

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

interface ICollarQuest is IERC721 {
    function spawnSparce( uint256 _genes, address _owner) external returns (uint256);
}

interface IERC20 {
  function totalSupply() external view returns (uint256);

  function decimals() external view returns (uint8);

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

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

  function getOwner() external view returns (address);

  function balanceOf(address account) external view returns (uint256);

  function transfer(address recipient, uint256 amount) external returns (bool);

  function allowance(address _owner, address spender) external view returns (uint256);

  function approve(address spender, uint256 amount) external returns (bool);
 
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  
  function burn(uint256 amount) external;
  
  function burnFrom(address account, uint256 amount) external;

  event Transfer(address indexed from, address indexed to, uint256 value);

  event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

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

abstract contract Validator {
    bytes32 public constant SIGNATURE_PERMIT_TYPEHASH = keccak256("validateSig(address _owner, uint _sireId, uint _matronId, uint _gene, uint _deadline, bytes memory signature)");
    uint public chainId;
    
    using ECDSA for bytes32;
    
    constructor() {
        uint _chainId;
        assembly {
            _chainId := chainid()
        }
        
        chainId = _chainId;
    }
    
    function validateSig(address _owner, uint _sireId, uint _matronId, uint _gene, uint _deadline, bytes memory signature) public view returns (address){
      // This recreates the message hash that was signed on the client.
      bytes32 hash = keccak256(abi.encodePacked(SIGNATURE_PERMIT_TYPEHASH, _owner, _sireId, _matronId, _gene, chainId, _deadline));
      bytes32 messageHash = hash.toSignedMessageHash();
    
      // Verify that the message's signer is the owner of the order
      return messageHash.recover(signature);
    }
}

library ECDSA {

  /**
   * @dev Recover signer address from a message by using their signature
   * @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address.
   * @param signature bytes signature, the signature is generated using web3.eth.sign()
   */
  function recover(bytes32 hash, bytes memory signature)
    internal
    pure
    returns (address)
  {
    bytes32 r;
    bytes32 s;
    uint8 v;

    // Check the signature length
    if (signature.length != 65) {
      return (address(0));
    }

    // Divide the signature in r, s and v variables with inline assembly.
    assembly {
      r := mload(add(signature, 0x20))
      s := mload(add(signature, 0x40))
      v := byte(0, mload(add(signature, 0x60)))
    }

    // Version of signature should be 27 or 28, but 0 and 1 are also possible versions
    if (v < 27) {
      v += 27;
    }

    // If the version is correct return the signer address
    if (v != 27 && v != 28) {
      return (address(0));
    } else {
      // solium-disable-next-line arg-overflow
      return ecrecover(hash, v, r, s);
    }
  }

  /**
    * toEthSignedMessageHash
    * @dev prefix a bytes32 value with "\x19Ethereum Signed Message:"
    * and hash the result
    */
  function toSignedMessageHash(bytes32 hash)
    internal
    pure
    returns (bytes32)
  {
    return keccak256(
      abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
    );
  }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "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] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

abstract contract AccessControl is Context, IAccessControl {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

contract BreedingCore is AccessControl, Validator {
    ICollarQuest public collarQuest;
    IERC20 public GeM;
    IERC20 public TAG;
    
    event Breed(uint indexed _sireId, uint indexed _matronId, uint indexed _eggID);
    event EggHatch( uint indexed _eggID, uint indexed _sparceId);
    
    struct BreedStruct {
        address receiver;
        uint sireId;
        uint matronId;
        uint eggGene;
        uint layEggOn;
        bool isHatched;
    }
    
    struct BreedInfoStruct {
        uint breedCount;
        uint eggID;
        bool isEggHatched;
    }
    
    address public treasury;
    
    uint public hatchTime = 5 days;
    uint totalBreedCount = 7;
    uint public TAGFee;
    
    bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
    bytes32 public constant BREED_MANAGER = keccak256("BREED_MANAGER");
    
    BreedStruct[] public breedInfo;
    
    mapping(uint => BreedInfoStruct) public sparceInfo; 
    mapping(uint => uint) public breedSPLFee;
    
    modifier notBreedWhen() {
       require((address(GeM) != address(0)) && (address(TAG) != address(0)));
       _;
    }
    
    function payBreedFee( address _owner, uint _matronCount, uint _sireCount) internal {
        require(TAG.balanceOf(_owner) >= TAGFee,"BreedingCore : insufficient balance to pay TAG Fee");
        require(TAG.allowance(_owner, address(this)) >= TAGFee,"BreedingCore : insufficient allowance to pay TAG");
        require(TAG.transferFrom(_owner, treasury, TAGFee),"BreedingCore : TAG transfer failed");
        
        uint _GeMFee = breedSPLFee[_matronCount] + breedSPLFee[_sireCount];
        
        require(GeM.balanceOf(_owner) >= _GeMFee,"BreedingCore : insufficient balance to pay GeM fee");
        require(GeM.allowance(_owner, address(this)) >= _GeMFee,"BreedingCore : insufficient allowance to pay GeM fee");
        GeM.burnFrom(_owner, _GeMFee);
    }
}

contract Breeding is BreedingCore {
    
    constructor( address _breedManager, ICollarQuest _collarQuest, address _treasury) {
        _setRoleAdmin(DEFAULT_ADMIN_ROLE, ADMIN_ROLE);
        _setupRole(ADMIN_ROLE, _msgSender());
        _setupRole(BREED_MANAGER, _breedManager);
        
        treasury = _treasury;
        collarQuest = _collarQuest;

        BreedStruct memory _breedStruct;
        breedInfo.push(_breedStruct);
    }

    function setCollarQuest( ICollarQuest _collarQuest) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) {
        collarQuest = _collarQuest;
    }
    
    function setTotalBreedCount( uint _totalBreedCount) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) {
        totalBreedCount = _totalBreedCount;
    }
    
    function setHatchTime( uint _hatchTime) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) {
        hatchTime = _hatchTime;
    }
    
    function setTreasury( address _treasury) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) {
        require(_treasury != address(0),"BreedingCore : _treasury should not be a zero address");
        treasury = _treasury;
    }
    
    function setTag( IERC20 _tag) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) {
        require(address(_tag) != address(0), "BreedingCore : _tag should not be zero");
        TAG = _tag;
    }
    
    function setGeM( IERC20 _GeM) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) {
        require(address(_GeM) != address(0), "BreedingCore : _GeM should not be zero");
        GeM = _GeM;
    }
    
    function setTagFee( uint _tag) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) {
        require(_tag > 0,"BreedingCore : tag fee should be greater than zero");
        TAGFee = _tag;
    }
    
    function setGeMFee( uint _birthCount, uint _GeMFee) external onlyRole(getRoleAdmin(DEFAULT_ADMIN_ROLE)) {
        require((_birthCount <= totalBreedCount) && (_birthCount > 0),"BreedingCore : invalid breed count or exceed breed count");
        require(_GeMFee > 0,"BreedingCore : GeM fee should be greater than zero");
        breedSPLFee[_birthCount] = _GeMFee;
    }
    
    function breed( uint _matronId, uint _sireId, uint _gene, uint _deadLine, bytes memory _signature) external notBreedWhen {
       require(_sireId != _matronId,"BreedingCore : sireId should not be equal to matronId"); 
       require(collarQuest.ownerOf(_sireId) != address(0),"BreedingCore : invalid sireId ownership");
       require(collarQuest.ownerOf(_matronId) != address(0),"BreedingCore : invalid matronId ownership");
       require((collarQuest.ownerOf(_matronId) == _msgSender()) || (collarQuest.ownerOf(_sireId) == _msgSender()), "BreedingCore : caller is not a owner");
       require(sparceInfo[_sireId].breedCount < totalBreedCount,"BreedingCore : sireId exceed breed count");
       require(sparceInfo[_matronId].breedCount < totalBreedCount,"BreedingCore : matronId exceed breed count");
       require(!sparceInfo[_matronId].isEggHatched, "BreedingCore : matronId egg not hatched");
       require(!sparceInfo[_sireId].isEggHatched, "BreedingCore : sireId egg not hatched");
       require(_gene > 0,"BreedingCore : gene should be greater than zero");
       require(hasRole(BREED_MANAGER,validateSig(_msgSender(), _sireId, _matronId, _gene, _deadLine, _signature)),"BreedingCore : failed to verify the signature");
       
       sparceInfo[_sireId].isEggHatched = true;
       sparceInfo[_sireId].breedCount++;
       sparceInfo[_matronId].isEggHatched = true;
       sparceInfo[_matronId].breedCount++;
       
       payBreedFee(_msgSender(), sparceInfo[_sireId].breedCount, sparceInfo[_matronId].breedCount);
       
       breedInfo.push(BreedStruct({
           receiver : _msgSender(),
           sireId : _sireId,
           matronId : _matronId,
           eggGene : _gene,
           layEggOn : block.timestamp,
           isHatched : false
       }));
       
       emit Breed( _sireId,  _matronId, breedInfo.length - 1);
    }
    
    function eggsHatch( uint _eggID) external {
        BreedStruct storage _breed = breedInfo[_eggID];
        
        require((_eggID < breedInfo.length) && (_eggID > 0),"BreedingCore : invalid egg id");
        require((_breed.layEggOn+hatchTime) < block.timestamp,"BreedingCore : wait till hatch period");
        require(!_breed.isHatched,"BreedingCore : SPARC-E already assembled");
       
        sparceInfo[_breed.sireId].isEggHatched = false; 
        sparceInfo[_breed.matronId].isEggHatched = false;
        _breed.isHatched = true;
        
        uint _sparceID = collarQuest.spawnSparce(_breed.eggGene, _breed.receiver);
        sparceInfo[_sparceID].eggID = _eggID;
        
        emit EggHatch(_eggID, _sparceID);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_breedManager","type":"address"},{"internalType":"contract ICollarQuest","name":"_collarQuest","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_sireId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_matronId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_eggID","type":"uint256"}],"name":"Breed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_eggID","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_sparceId","type":"uint256"}],"name":"EggHatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BREED_MANAGER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GeM","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNATURE_PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAG","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAGFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_matronId","type":"uint256"},{"internalType":"uint256","name":"_sireId","type":"uint256"},{"internalType":"uint256","name":"_gene","type":"uint256"},{"internalType":"uint256","name":"_deadLine","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"breed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"breedInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"sireId","type":"uint256"},{"internalType":"uint256","name":"matronId","type":"uint256"},{"internalType":"uint256","name":"eggGene","type":"uint256"},{"internalType":"uint256","name":"layEggOn","type":"uint256"},{"internalType":"bool","name":"isHatched","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"breedSPLFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collarQuest","outputs":[{"internalType":"contract ICollarQuest","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eggID","type":"uint256"}],"name":"eggsHatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hatchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ICollarQuest","name":"_collarQuest","type":"address"}],"name":"setCollarQuest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_GeM","type":"address"}],"name":"setGeM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_birthCount","type":"uint256"},{"internalType":"uint256","name":"_GeMFee","type":"uint256"}],"name":"setGeMFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hatchTime","type":"uint256"}],"name":"setHatchTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_tag","type":"address"}],"name":"setTag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tag","type":"uint256"}],"name":"setTagFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalBreedCount","type":"uint256"}],"name":"setTotalBreedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sparceInfo","outputs":[{"internalType":"uint256","name":"breedCount","type":"uint256"},{"internalType":"uint256","name":"eggID","type":"uint256"},{"internalType":"bool","name":"isEggHatched","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_sireId","type":"uint256"},{"internalType":"uint256","name":"_matronId","type":"uint256"},{"internalType":"uint256","name":"_gene","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateSig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405262069780600655600780553480156200001c57600080fd5b506040516200275f3803806200275f8339810160408190526200003f916200031b565b466001556200005f60006000805160206200273f83398151915262000220565b6200007a6000805160206200273f833981519152336200026b565b620000a67f1756bad288fdd37f9fdba94d04e6aa5ebf5d5f409103fbab9ba76a42777debc8846200026b565b600580546001600160a01b039283166001600160a01b03199182161790915560028054938316938216939093179092556040805160c081018252600080825260208201818152928201818152606083018281526080840183815260a0850184815260098054600181018255955294517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af6006909502948501805490991697169690961790965592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b082015591517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b183015592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b282015590517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b382015590517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b4909101805460ff19169115159190911790555062000387565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200027782826200027b565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000277576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002d73390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008060006060848603121562000330578283fd5b83516200033d816200036e565b602085015190935062000350816200036e565b604085015190925062000363816200036e565b809150509250925092565b6001600160a01b03811681146200038457600080fd5b50565b6123a880620003976000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806391d1485411610104578063d50a64aa116100a2578063f1fc877e11610071578063f1fc877e146104a2578063f465ae49146104b5578063fc18a420146104d5578063ffbc22dc146104e857600080fd5b8063d50a64aa14610456578063d547741f14610469578063e17457cf1461047c578063f0f442601461048f57600080fd5b8063a1b3c184116100de578063a1b3c1841461040b578063a217fddf1461041e578063c71d8bad14610426578063d4009ad51461042f57600080fd5b806391d1485414610393578063922c0439146103b65780639a8a05921461040257600080fd5b806336568abe1161017c57806361d027b31161014b57806361d027b31461033d5780636fa9cc291461035057806375b238fc146103635780638c7452ce1461038a57600080fd5b806336568abe146102b5578063406d4b75146102c857806347221ac7146102db5780635deb5ad5146102ee57600080fd5b806324e357bd116101b857806324e357bd1461023d5780632b15eed6146102685780632f2ff15d1461028f57806334b40f30146102a257600080fd5b80630826a2de146101df5780630a0fa82e146101f4578063248a9ca314610207575b600080fd5b6101f26101ed366004611fe4565b6104fb565b005b6101f2610202366004611fe4565b610540565b61022a6102153660046120af565b60009081526020819052604090206001015490565b6040519081526020015b60405180910390f35b61025061024b36600461201c565b6105ef565b6040516001600160a01b039091168152602001610234565b61022a7f1756bad288fdd37f9fdba94d04e6aa5ebf5d5f409103fbab9ba76a42777debc881565b6101f261029d3660046120c7565b6106d9565b6101f26102b03660046120af565b61070a565b6101f26102c33660046120c7565b610987565b600354610250906001600160a01b031681565b600454610250906001600160a01b031681565b6103206102fc3660046120af565b600a6020526000908152604090208054600182015460029092015490919060ff1683565b604080519384526020840192909252151590820152606001610234565b600554610250906001600160a01b031681565b6101f261035e3660046120af565b610a05565b61022a7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b61022a60085481565b6103a66103a13660046120c7565b610a2d565b6040519015158152602001610234565b6103c96103c43660046120af565b610a58565b604080516001600160a01b03909716875260208701959095529385019290925260608401526080830152151560a082015260c001610234565b61022a60015481565b6101f26104193660046120af565b610aab565b61022a600081565b61022a60065481565b61022a7fb081a9d925689b107da9acc133161b75893b20ba4893b54191729cdc59bca14281565b600254610250906001600160a01b031681565b6101f26104773660046120c7565b610b3e565b6101f261048a366004611fe4565b610b6a565b6101f261049d366004611fe4565b610c14565b6101f26104b036600461212f565b610ccd565b61022a6104c33660046120af565b600b6020526000908152604090205481565b6101f26104e33660046120af565b6114d9565b6101f26104f636600461210e565b611501565b60008080526020526000805160206123538339815191525461051d8133611625565b50600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000808052602052600080516020612353833981519152546105628133611625565b6001600160a01b0382166105cc5760405162461bcd60e51b815260206004820152602660248201527f4272656564696e67436f7265203a205f47654d2073686f756c64206e6f74206260448201526565207a65726f60d01b60648201526084015b60405180910390fd5b50600380546001600160a01b0319166001600160a01b0392909216919091179055565b600154604080517fb081a9d925689b107da9acc133161b75893b20ba4893b54191729cdc59bca14260208083019190915260608a901b6bffffffffffffffffffffffff19168284015260548201899052607482018890526094820187905260b482019390935260d48082018690528251808303909101815260f4820183528051908401207f19457468657265756d205369676e6564204d6573736167653a0a333200000000610114830152610130808301829052835180840390910181526101509092019092528051920191909120600091906106cc8185611689565b9998505050505050505050565b6000808052602052600080516020612353833981519152546106fb8133611625565b6107058383611760565b505050565b60006009828154811061072d57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600602019050600980549050821080156107515750600082115b61079d5760405162461bcd60e51b815260206004820152601d60248201527f4272656564696e67436f7265203a20696e76616c69642065676720696400000060448201526064016105c3565b4260065482600401546107b09190612239565b1061080b5760405162461bcd60e51b815260206004820152602560248201527f4272656564696e67436f7265203a20776169742074696c6c2068617463682070604482015264195c9a5bd960da1b60648201526084016105c3565b600581015460ff16156108715760405162461bcd60e51b815260206004820152602860248201527f4272656564696e67436f7265203a2053504152432d4520616c726561647920616044820152671cdcd95b589b195960c21b60648201526084016105c3565b6001818101546000908152600a60205260408082206002908101805460ff1990811690915581860154845282842082018054821690556005860180549091169094179093559154600384015484549351630aa80aa360e41b815260048101919091526001600160a01b0393841660248201529192169063aa80aa3090604401602060405180830381600087803b15801561090a57600080fd5b505af115801561091e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094291906120f6565b6000818152600a602052604080822060010186905551919250829185917f4909f7453e3304d6bbd5281c3bb5b044984601aacd983db76569893233404bd891a3505050565b6001600160a01b03811633146109f75760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105c3565b610a0182826117e4565b5050565b600080805260205260008051602061235383398151915254610a278133611625565b50600655565b6000828152602081815260408083206001600160a01b038516845290915290205460ff165b92915050565b60098181548110610a6857600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909260ff1686565b600080805260205260008051602061235383398151915254610acd8133611625565b60008211610b385760405162461bcd60e51b815260206004820152603260248201527f4272656564696e67436f7265203a20746167206665652073686f756c642062656044820152712067726561746572207468616e207a65726f60701b60648201526084016105c3565b50600855565b600080805260205260008051602061235383398151915254610b608133611625565b61070583836117e4565b600080805260205260008051602061235383398151915254610b8c8133611625565b6001600160a01b038216610bf15760405162461bcd60e51b815260206004820152602660248201527f4272656564696e67436f7265203a205f7461672073686f756c64206e6f74206260448201526565207a65726f60d01b60648201526084016105c3565b50600480546001600160a01b0319166001600160a01b0392909216919091179055565b600080805260205260008051602061235383398151915254610c368133611625565b6001600160a01b038216610caa5760405162461bcd60e51b815260206004820152603560248201527f4272656564696e67436f7265203a205f74726561737572792073686f756c64206044820152746e6f742062652061207a65726f206164647265737360581b60648201526084016105c3565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031615801590610cf157506004546001600160a01b031615155b610cfa57600080fd5b84841415610d685760405162461bcd60e51b815260206004820152603560248201527f4272656564696e67436f7265203a207369726549642073686f756c64206e6f7460448201527408189948195c5d585b081d1bc81b585d1c9bdb9259605a1b60648201526084016105c3565b6002546040516331a9108f60e11b8152600481018690526000916001600160a01b031690636352211e9060240160206040518083038186803b158015610dad57600080fd5b505afa158015610dc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de59190612000565b6001600160a01b03161415610e4c5760405162461bcd60e51b815260206004820152602760248201527f4272656564696e67436f7265203a20696e76616c696420736972654964206f7760448201526606e6572736869760cc1b60648201526084016105c3565b6002546040516331a9108f60e11b8152600481018790526000916001600160a01b031690636352211e9060240160206040518083038186803b158015610e9157600080fd5b505afa158015610ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec99190612000565b6001600160a01b03161415610f325760405162461bcd60e51b815260206004820152602960248201527f4272656564696e67436f7265203a20696e76616c6964206d6174726f6e49642060448201526806f776e6572736869760bc1b60648201526084016105c3565b336002546040516331a9108f60e11b8152600481018890526001600160a01b039283169290911690636352211e9060240160206040518083038186803b158015610f7b57600080fd5b505afa158015610f8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb39190612000565b6001600160a01b0316148061104f5750336002546040516331a9108f60e11b8152600481018790526001600160a01b039283169290911690636352211e9060240160206040518083038186803b15801561100c57600080fd5b505afa158015611020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110449190612000565b6001600160a01b0316145b6110a75760405162461bcd60e51b8152602060048201526024808201527f4272656564696e67436f7265203a2063616c6c6572206973206e6f742061206f6044820152633bb732b960e11b60648201526084016105c3565b6007546000858152600a6020526040902054106111175760405162461bcd60e51b815260206004820152602860248201527f4272656564696e67436f7265203a20736972654964206578636565642062726560448201526719590818dbdd5b9d60c21b60648201526084016105c3565b6007546000868152600a6020526040902054106111895760405162461bcd60e51b815260206004820152602a60248201527f4272656564696e67436f7265203a206d6174726f6e49642065786365656420626044820152691c9959590818dbdd5b9d60b21b60648201526084016105c3565b6000858152600a602052604090206002015460ff16156111fb5760405162461bcd60e51b815260206004820152602760248201527f4272656564696e67436f7265203a206d6174726f6e496420656767206e6f74206044820152661a185d18da195960ca1b60648201526084016105c3565b6000848152600a602052604090206002015460ff161561126b5760405162461bcd60e51b815260206004820152602560248201527f4272656564696e67436f7265203a2073697265496420656767206e6f742068616044820152641d18da195960da1b60648201526084016105c3565b600083116112d35760405162461bcd60e51b815260206004820152602f60248201527f4272656564696e67436f7265203a2067656e652073686f756c6420626520677260448201526e6561746572207468616e207a65726f60881b60648201526084016105c3565b6113057f1756bad288fdd37f9fdba94d04e6aa5ebf5d5f409103fbab9ba76a42777debc86103a13387898888886105ef565b6113675760405162461bcd60e51b815260206004820152602d60248201527f4272656564696e67436f7265203a206661696c656420746f207665726966792060448201526c746865207369676e617475726560981b60648201526084016105c3565b6000848152600a6020526040812060028101805460ff19166001179055805491611390836122f3565b90915550506000858152600a6020526040812060028101805460ff191660011790558054916113be836122f3565b91905055506113e86113cd3390565b6000868152600a602052604080822054898352912054611849565b60096040518060c001604052806113fc3390565b6001600160a01b039081168252602080830189905260408084018b905260608085018a905242608080870191909152600060a0968701819052885460018082018b5599825290859020885160069092020180546001600160a01b031916919096161785559286015184880155908501516002840155840151600383015583015160048201559101516005909101805460ff19169115159190911790556009546114a59190612295565b604051869086907f9ca383290f66cf05e07fed022366cb0e56f67485387cbc0a5911e8c6fc80455390600090a45050505050565b6000808052602052600080516020612353833981519152546114fb8133611625565b50600755565b6000808052602052600080516020612353833981519152546115238133611625565b60075483111580156115355750600083115b6115a75760405162461bcd60e51b815260206004820152603860248201527f4272656564696e67436f7265203a20696e76616c696420627265656420636f7560448201527f6e74206f722065786365656420627265656420636f756e74000000000000000060648201526084016105c3565b600082116116125760405162461bcd60e51b815260206004820152603260248201527f4272656564696e67436f7265203a2047654d206665652073686f756c642062656044820152712067726561746572207468616e207a65726f60701b60648201526084016105c3565b506000918252600b602052604090912055565b61162f8282610a2d565b610a0157611647816001600160a01b03166014611d74565b611652836020611d74565b604051602001611663929190612191565b60408051601f198184030181529082905262461bcd60e51b82526105c391600401612206565b60008060008084516041146116a45760009350505050610a52565b50505060208201516040830151606084015160001a601b8110156116d0576116cd601b82612251565b90505b8060ff16601b141580156116e857508060ff16601c14155b156116f95760009350505050610a52565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa15801561174c573d6000803e3d6000fd5b505050602060405103519350505050610a52565b61176a8282610a2d565b610a01576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556117a03390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6117ee8282610a2d565b15610a01576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600854600480546040516370a0823160e01b81526001600160a01b03878116938201939093529116906370a082319060240160206040518083038186803b15801561189357600080fd5b505afa1580156118a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cb91906120f6565b10156119345760405162461bcd60e51b815260206004820152603260248201527f4272656564696e67436f7265203a20696e73756666696369656e742062616c616044820152716e636520746f20706179205441472046656560701b60648201526084016105c3565b60085460048054604051636eb1769f60e11b81526001600160a01b038781169382019390935230602482015291169063dd62ed3e9060440160206040518083038186803b15801561198457600080fd5b505afa158015611998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bc91906120f6565b1015611a235760405162461bcd60e51b815260206004820152603060248201527f4272656564696e67436f7265203a20696e73756666696369656e7420616c6c6f60448201526f77616e636520746f207061792054414760801b60648201526084016105c3565b600480546005546008546040516323b872dd60e01b81526001600160a01b0388811695820195909552918416602483015260448201529116906323b872dd90606401602060405180830381600087803b158015611a7f57600080fd5b505af1158015611a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab7919061208f565b611b0e5760405162461bcd60e51b815260206004820152602260248201527f4272656564696e67436f7265203a20544147207472616e73666572206661696c604482015261195960f21b60648201526084016105c3565b6000818152600b60205260408082205484835290822054611b2f9190612239565b6003546040516370a0823160e01b81526001600160a01b0387811660048301529293508392909116906370a082319060240160206040518083038186803b158015611b7957600080fd5b505afa158015611b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb191906120f6565b1015611c1a5760405162461bcd60e51b815260206004820152603260248201527f4272656564696e67436f7265203a20696e73756666696369656e742062616c616044820152716e636520746f207061792047654d2066656560701b60648201526084016105c3565b600354604051636eb1769f60e11b81526001600160a01b0386811660048301523060248301528392169063dd62ed3e9060440160206040518083038186803b158015611c6557600080fd5b505afa158015611c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9d91906120f6565b1015611d085760405162461bcd60e51b815260206004820152603460248201527f4272656564696e67436f7265203a20696e73756666696369656e7420616c6c6f60448201527377616e636520746f207061792047654d2066656560601b60648201526084016105c3565b60035460405163079cc67960e41b81526001600160a01b03868116600483015260248201849052909116906379cc679090604401600060405180830381600087803b158015611d5657600080fd5b505af1158015611d6a573d6000803e3d6000fd5b5050505050505050565b60606000611d83836002612276565b611d8e906002612239565b67ffffffffffffffff811115611db457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611dde576020820181803683370190505b509050600360fc1b81600081518110611e0757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611e4457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506000611e68846002612276565b611e73906001612239565b90505b6001811115611f07576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611eb557634e487b7160e01b600052603260045260246000fd5b1a60f81b828281518110611ed957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93611f00816122dc565b9050611e76565b508315611f565760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105c3565b9392505050565b600082601f830112611f6d578081fd5b813567ffffffffffffffff80821115611f8857611f88612324565b604051601f8301601f19908116603f01168101908282118183101715611fb057611fb0612324565b81604052838152866020858801011115611fc8578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215611ff5578081fd5b8135611f568161233a565b600060208284031215612011578081fd5b8151611f568161233a565b60008060008060008060c08789031215612034578182fd5b863561203f8161233a565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff811115612076578182fd5b61208289828a01611f5d565b9150509295509295509295565b6000602082840312156120a0578081fd5b81518015158114611f56578182fd5b6000602082840312156120c0578081fd5b5035919050565b600080604083850312156120d9578182fd5b8235915060208301356120eb8161233a565b809150509250929050565b600060208284031215612107578081fd5b5051919050565b60008060408385031215612120578182fd5b50508035926020909101359150565b600080600080600060a08688031215612146578081fd5b85359450602086013593506040860135925060608601359150608086013567ffffffffffffffff811115612178578182fd5b61218488828901611f5d565b9150509295509295909350565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516121c98160178501602088016122ac565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516121fa8160288401602088016122ac565b01602801949350505050565b60208152600082518060208401526122258160408501602087016122ac565b601f01601f19169190910160400192915050565b6000821982111561224c5761224c61230e565b500190565b600060ff821660ff84168060ff0382111561226e5761226e61230e565b019392505050565b60008160001904831182151516156122905761229061230e565b500290565b6000828210156122a7576122a761230e565b500390565b60005b838110156122c75781810151838201526020016122af565b838111156122d6576000848401525b50505050565b6000816122eb576122eb61230e565b506000190190565b60006000198214156123075761230761230e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461234f57600080fd5b5056fead3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb6a26469706673582212208a3286cd11e8223cbd958ae9ae06bd51d74883ef38e3d0501a277e3bad27297064736f6c63430008040033a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217750000000000000000000000007d8ece5ab6ee7be75f64d154d076d8f7080a6aca000000000000000000000000674900b8fd8ee1b487d162d04c59300222d904660000000000000000000000003a91ece2a4dabd5f9f8086c2161d7d3edd3c8eb7

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

0000000000000000000000007d8ece5ab6ee7be75f64d154d076d8f7080a6aca000000000000000000000000674900b8fd8ee1b487d162d04c59300222d904660000000000000000000000003a91ece2a4dabd5f9f8086c2161d7d3edd3c8eb7

-----Decoded View---------------
Arg [0] : _breedManager (address): 0x7d8ECe5Ab6eE7Be75f64D154d076d8F7080A6AcA
Arg [1] : _collarQuest (address): 0x674900B8fD8EE1B487d162d04C59300222D90466
Arg [2] : _treasury (address): 0x3a91Ece2a4Dabd5f9f8086c2161D7D3EDD3C8eb7

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000007d8ece5ab6ee7be75f64d154d076d8f7080a6aca
Arg [1] : 000000000000000000000000674900b8fd8ee1b487d162d04c59300222d90466
Arg [2] : 0000000000000000000000003a91ece2a4dabd5f9f8086c2161d7d3edd3c8eb7


Deployed ByteCode Sourcemap

20981:4847:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21441:149;;;;;;:::i;:::-;;:::i;:::-;;22371:200;;;;;;:::i;:::-;;:::i;15782:123::-;;;;;;:::i;:::-;15848:7;15875:12;;;;;;;;;;:22;;;;15782:123;;;;8595:25:1;;;8583:2;8568:18;15782:123:0;;;;;;;;9806:540;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6669:32:1;;;6651:51;;6639:2;6624:18;9806:540:0;6606:102:1;19832:66:0;;19872:26;19832:66;;16167:161;;;;;;:::i;:::-;;:::i;25074:751::-;;;;;;:::i;:::-;;:::i;17243:218::-;;;;;;:::i;:::-;;:::i;19116:17::-;;;;;-1:-1:-1;;;;;19116:17:0;;;19140;;;;;-1:-1:-1;;;;;19140:17:0;;;19954:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21166:25:1;;;21222:2;21207:18;;21200:34;;;;21277:14;21270:22;21250:18;;;21243:50;21154:2;21139:18;19954:50:0;21121:178:1;19630:23:0;;;;;-1:-1:-1;;;;;19630:23:0;;;21771:133;;;;;;:::i;:::-;;:::i;19765:60::-;;19802:23;19765:60;;19734:18;;;;;;14667:139;;;;;;:::i;:::-;;:::i;:::-;;;8422:14:1;;8415:22;8397:41;;8385:2;8370:18;14667:139:0;8352:92:1;19911:30:0;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7980:32:1;;;7962:51;;8044:2;8029:18;;8022:34;;;;8072:18;;;8065:34;;;;8130:2;8115:18;;8108:34;8173:3;8158:19;;8151:35;8230:14;8223:22;8000:3;8202:19;;8195:51;7949:3;7934:19;19911:30:0;7916:336:1;9575:19:0;;;;;;22583:196;;;;;;:::i;:::-;;:::i;14034:49::-;;14079:4;14034:49;;19666:30;;;;;;9394:174;;9446:122;9394:174;;19078:31;;;;;-1:-1:-1;;;;;19078:31:0;;;16573:163;;;;;;:::i;:::-;;:::i;22159:200::-;;;;;;:::i;:::-;;:::i;21916:231::-;;;;;;:::i;:::-;;:::i;23176:1886::-;;;;;;:::i;:::-;;:::i;20012:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;21602:157;;;;;;:::i;:::-;;:::i;22791:373::-;;;;;;:::i;:::-;;:::i;21441:149::-;14079:4;15875:12;;;;;-1:-1:-1;;;;;;;;;;;15875:22:0;14525:30;14536:4;9225:10;14525;:30::i;:::-;-1:-1:-1;21556:11:0::1;:26:::0;;-1:-1:-1;;;;;;21556:26:0::1;-1:-1:-1::0;;;;;21556:26:0;;;::::1;::::0;;;::::1;::::0;;21441:149::o;22371:200::-;14079:4;15875:12;;;;;-1:-1:-1;;;;;;;;;;;15875:22:0;14525:30;14536:4;9225:10;14525;:30::i;:::-;-1:-1:-1;;;;;22472:27:0;::::1;22464:78;;;::::0;-1:-1:-1;;;22464:78:0;;16635:2:1;22464:78:0::1;::::0;::::1;16617:21:1::0;16674:2;16654:18;;;16647:30;16713:34;16693:18;;;16686:62;-1:-1:-1;;;16764:18:1;;;16757:36;16810:19;;22464:78:0::1;;;;;;;;;-1:-1:-1::0;22553:3:0::1;:10:::0;;-1:-1:-1;;;;;;22553:10:0::1;-1:-1:-1::0;;;;;22553:10:0;;;::::1;::::0;;;::::1;::::0;;22371:200::o;9806:540::-;10140:7;;10061:98;;;9446:122;10061:98;;;;4998:19:1;;;;5055:2;5051:15;;;-1:-1:-1;;5047:53:1;5033:12;;;5026:75;5117:12;;;5110:28;;;5154:12;;;5147:28;;;5191:13;;;5184:29;;;5229:13;;;5222:29;;;;5267:13;;;;5260:29;;;10061:98:0;;;;;;;;;;5305:13:1;;;10061:98:0;;10051:109;;;;;;5571:66:1;11788:58:0;;;5559:79:1;5654:12;;;;5647:28;;;11788:58:0;;;;;;;;;;5691:12:1;;;;11788:58:0;;;11770:83;;;;;;;;-1:-1:-1;;10051:109:0;10308:30;10169:48;10328:9;10308:19;:30::i;:::-;10301:37;9806:540;-1:-1:-1;;;;;;;;;9806:540:0:o;16167:161::-;14079:4;15875:12;;;;;-1:-1:-1;;;;;;;;;;;15875:22:0;14525:30;14536:4;9225:10;14525;:30::i;:::-;16295:25:::1;16306:4;16312:7;16295:10;:25::i;:::-;16167:161:::0;;;:::o;25074:751::-;25127:26;25156:9;25166:6;25156:17;;;;;;-1:-1:-1;;;25156:17:0;;;;;;;;;;;;;;;;;;;25127:46;;25212:9;:16;;;;25203:6;:25;25202:43;;;;;25243:1;25234:6;:10;25202:43;25194:84;;;;-1:-1:-1;;;25194:84:0;;20353:2:1;25194:84:0;;;20335:21:1;20392:2;20372:18;;;20365:30;20431:31;20411:18;;;20404:59;20480:18;;25194:84:0;20325:179:1;25194:84:0;25327:15;25314:9;;25298:6;:15;;;:25;;;;:::i;:::-;25297:45;25289:94;;;;-1:-1:-1;;;25289:94:0;;18289:2:1;25289:94:0;;;18271:21:1;18328:2;18308:18;;;18301:30;18367:34;18347:18;;;18340:62;-1:-1:-1;;;18418:18:1;;;18411:35;18463:19;;25289:94:0;18261:227:1;25289:94:0;25403:16;;;;;;25402:17;25394:69;;;;-1:-1:-1;;;25394:69:0;;15402:2:1;25394:69:0;;;15384:21:1;15441:2;15421:18;;;15414:30;15480:34;15460:18;;;15453:62;-1:-1:-1;;;15531:18:1;;;15524:38;15579:19;;25394:69:0;15374:230:1;25394:69:0;25494:13;;;;;25524:5;25483:25;;;:10;:25;;;;;;:38;;;;:46;;-1:-1:-1;;25483:46:0;;;;;;25552:15;;;;25541:27;;;;;:40;;:48;;;;;;25600:16;;;:23;;;;;;;;;;;25661:11;;25685:14;;;;25701:15;;25661:56;;-1:-1:-1;;;25661:56:0;;;;;20865:25:1;;;;-1:-1:-1;;;;;25701:15:0;;;20906:18:1;;;20899:60;25524:5:0;;25661:11;;:23;;20838:18:1;;25661:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25728:21;;;;:10;:21;;;;;;:27;;:36;;;25790:27;25644:73;;-1:-1:-1;25644:73:0;;25758:6;;25790:27;;;25074:751;;;:::o;17243:218::-;-1:-1:-1;;;;;17339:23:0;;9225:10;17339:23;17331:83;;;;-1:-1:-1;;;17331:83:0;;19937:2:1;17331:83:0;;;19919:21:1;19976:2;19956:18;;;19949:30;20015:34;19995:18;;;19988:62;-1:-1:-1;;;20066:18:1;;;20059:45;20121:19;;17331:83:0;19909:237:1;17331:83:0;17427:26;17439:4;17445:7;17427:11;:26::i;:::-;17243:218;;:::o;21771:133::-;14079:4;15875:12;;;;;-1:-1:-1;;;;;;;;;;;15875:22:0;14525:30;14536:4;9225:10;14525;:30::i;:::-;-1:-1:-1;21874:9:0::1;:22:::0;21771:133::o;14667:139::-;14745:4;14769:12;;;;;;;;;;;-1:-1:-1;;;;;14769:29:0;;;;;;;;;;;;14667:139;;;;;:::o;19911:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19911:30:0;;;;-1:-1:-1;19911:30:0;;;;;;;:::o;22583:196::-;14079:4;15875:12;;;;;-1:-1:-1;;;;;;;;;;;15875:22:0;14525:30;14536:4;9225:10;14525;:30::i;:::-;22692:1:::1;22685:4;:8;22677:70;;;::::0;-1:-1:-1;;;22677:70:0;;11259:2:1;22677:70:0::1;::::0;::::1;11241:21:1::0;11298:2;11278:18;;;11271:30;11337:34;11317:18;;;11310:62;-1:-1:-1;;;11388:18:1;;;11381:48;11446:19;;22677:70:0::1;11231:240:1::0;22677:70:0::1;-1:-1:-1::0;22758:6:0::1;:13:::0;22583:196::o;16573:163::-;14079:4;15875:12;;;;;-1:-1:-1;;;;;;;;;;;15875:22:0;14525:30;14536:4;9225:10;14525;:30::i;:::-;16702:26:::1;16714:4;16720:7;16702:11;:26::i;22159:200::-:0;14079:4;15875:12;;;;;-1:-1:-1;;;;;;;;;;;15875:22:0;14525:30;14536:4;9225:10;14525;:30::i;:::-;-1:-1:-1;;;;;22260:27:0;::::1;22252:78;;;::::0;-1:-1:-1;;;22252:78:0;;15811:2:1;22252:78:0::1;::::0;::::1;15793:21:1::0;15850:2;15830:18;;;15823:30;15889:34;15869:18;;;15862:62;-1:-1:-1;;;15940:18:1;;;15933:36;15986:19;;22252:78:0::1;15783:228:1::0;22252:78:0::1;-1:-1:-1::0;22341:3:0::1;:10:::0;;-1:-1:-1;;;;;;22341:10:0::1;-1:-1:-1::0;;;;;22341:10:0;;;::::1;::::0;;;::::1;::::0;;22159:200::o;21916:231::-;14079:4;15875:12;;;;;-1:-1:-1;;;;;;;;;;;15875:22:0;14525:30;14536:4;9225:10;14525;:30::i;:::-;-1:-1:-1;;;;;22028:23:0;::::1;22020:88;;;::::0;-1:-1:-1;;;22020:88:0;;12912:2:1;22020:88:0::1;::::0;::::1;12894:21:1::0;12951:2;12931:18;;;12924:30;12990:34;12970:18;;;12963:62;-1:-1:-1;;;13041:18:1;;;13034:51;13102:19;;22020:88:0::1;12884:243:1::0;22020:88:0::1;-1:-1:-1::0;22119:8:0::1;:20:::0;;-1:-1:-1;;;;;;22119:20:0::1;-1:-1:-1::0;;;;;22119:20:0;;;::::1;::::0;;;::::1;::::0;;21916:231::o;23176:1886::-;20116:3;;-1:-1:-1;;;;;20116:3:0;20108:26;;;;20107:60;;-1:-1:-1;20148:3:0;;-1:-1:-1;;;;;20148:3:0;20140:26;;20107:60;20099:69;;;;;;23326:9:::1;23315:7;:20;;23307:85;;;::::0;-1:-1:-1;;;23307:85:0;;14559:2:1;23307:85:0::1;::::0;::::1;14541:21:1::0;14598:2;14578:18;;;14571:30;14637:34;14617:18;;;14610:62;-1:-1:-1;;;14688:18:1;;;14681:51;14749:19;;23307:85:0::1;14531:243:1::0;23307:85:0::1;23411:11;::::0;:28:::1;::::0;-1:-1:-1;;;23411:28:0;;::::1;::::0;::::1;8595:25:1::0;;;23451:1:0::1;::::0;-1:-1:-1;;;;;23411:11:0::1;::::0;:19:::1;::::0;8568:18:1;;23411:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23411:42:0::1;;;23403:93;;;::::0;-1:-1:-1;;;23403:93:0;;13745:2:1;23403:93:0::1;::::0;::::1;13727:21:1::0;13784:2;13764:18;;;13757:30;13823:34;13803:18;;;13796:62;-1:-1:-1;;;13874:18:1;;;13867:37;13921:19;;23403:93:0::1;13717:229:1::0;23403:93:0::1;23514:11;::::0;:30:::1;::::0;-1:-1:-1;;;23514:30:0;;::::1;::::0;::::1;8595:25:1::0;;;23556:1:0::1;::::0;-1:-1:-1;;;;;23514:11:0::1;::::0;:19:::1;::::0;8568:18:1;;23514:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23514:44:0::1;;;23506:97;;;::::0;-1:-1:-1;;;23506:97:0;;12086:2:1;23506:97:0::1;::::0;::::1;12068:21:1::0;12125:2;12105:18;;;12098:30;12164:34;12144:18;;;12137:62;-1:-1:-1;;;12215:18:1;;;12208:39;12264:19;;23506:97:0::1;12058:231:1::0;23506:97:0::1;9225:10:::0;23622:11:::1;::::0;:30:::1;::::0;-1:-1:-1;;;23622:30:0;;::::1;::::0;::::1;8595:25:1::0;;;-1:-1:-1;;;;;23622:46:0;;::::1;::::0;:11;;::::1;::::0;:19:::1;::::0;8568:18:1;;23622:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23622:46:0::1;;23621:98;;;-1:-1:-1::0;9225:10:0;23674:11:::1;::::0;:28:::1;::::0;-1:-1:-1;;;23674:28:0;;::::1;::::0;::::1;8595:25:1::0;;;-1:-1:-1;;;;;23674:44:0;;::::1;::::0;:11;;::::1;::::0;:19:::1;::::0;8568:18:1;;23674:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23674:44:0::1;;23621:98;23613:147;;;::::0;-1:-1:-1;;;23613:147:0;;10435:2:1;23613:147:0::1;::::0;::::1;10417:21:1::0;10474:2;10454:18;;;10447:30;10513:34;10493:18;;;10486:62;-1:-1:-1;;;10564:18:1;;;10557:34;10608:19;;23613:147:0::1;10407:226:1::0;23613:147:0::1;23811:15;::::0;23778:19:::1;::::0;;;:10:::1;:19;::::0;;;;:30;:48:::1;23770:100;;;::::0;-1:-1:-1;;;23770:100:0;;19109:2:1;23770:100:0::1;::::0;::::1;19091:21:1::0;19148:2;19128:18;;;19121:30;19187:34;19167:18;;;19160:62;-1:-1:-1;;;19238:18:1;;;19231:38;19286:19;;23770:100:0::1;19081:230:1::0;23770:100:0::1;23923:15;::::0;23888:21:::1;::::0;;;:10:::1;:21;::::0;;;;:32;:50:::1;23880:104;;;::::0;-1:-1:-1;;;23880:104:0;;13334:2:1;23880:104:0::1;::::0;::::1;13316:21:1::0;13373:2;13353:18;;;13346:30;13412:34;13392:18;;;13385:62;-1:-1:-1;;;13463:18:1;;;13456:40;13513:19;;23880:104:0::1;13306:232:1::0;23880:104:0::1;24003:21;::::0;;;:10:::1;:21;::::0;;;;:34:::1;;::::0;::::1;;24002:35;23994:87;;;::::0;-1:-1:-1;;;23994:87:0;;11678:2:1;23994:87:0::1;::::0;::::1;11660:21:1::0;11717:2;11697:18;;;11690:30;11756:34;11736:18;;;11729:62;-1:-1:-1;;;11807:18:1;;;11800:37;11854:19;;23994:87:0::1;11650:229:1::0;23994:87:0::1;24100:19;::::0;;;:10:::1;:19;::::0;;;;:32:::1;;::::0;::::1;;24099:33;24091:83;;;::::0;-1:-1:-1;;;24091:83:0;;14153:2:1;24091:83:0::1;::::0;::::1;14135:21:1::0;14192:2;14172:18;;;14165:30;14231:34;14211:18;;;14204:62;-1:-1:-1;;;14282:18:1;;;14275:35;14327:19;;24091:83:0::1;14125:227:1::0;24091:83:0::1;24200:1;24192:5;:9;24184:68;;;::::0;-1:-1:-1;;;24184:68:0;;12496:2:1;24184:68:0::1;::::0;::::1;12478:21:1::0;12535:2;12515:18;;;12508:30;12574:34;12554:18;;;12547:62;-1:-1:-1;;;12625:18:1;;;12618:45;12680:19;;24184:68:0::1;12468:237:1::0;24184:68:0::1;24270:98;19872:26;24292:75;9225:10:::0;24318:7:::1;24327:9;24338:5;24345:9;24356:10;24292:11;:75::i;24270:98::-;24262:155;;;::::0;-1:-1:-1;;;24262:155:0;;18695:2:1;24262:155:0::1;::::0;::::1;18677:21:1::0;18734:2;18714:18;;;18707:30;18773:34;18753:18;;;18746:62;-1:-1:-1;;;18824:18:1;;;18817:43;18877:19;;24262:155:0::1;18667:235:1::0;24262:155:0::1;24436:19;::::0;;;:10:::1;:19;::::0;;;;:32:::1;::::0;::::1;:39:::0;;-1:-1:-1;;24436:39:0::1;24471:4;24436:39;::::0;;24485:32;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;24527:21:0::1;::::0;;;:10:::1;:21;::::0;;;;:34:::1;::::0;::::1;:41:::0;;-1:-1:-1;;24527:41:0::1;24564:4;24527:41;::::0;;24578:34;;;::::1;::::0;::::1;:::i;:::-;;;;;;24631:91;24643:12;9225:10:::0;;9145:98;24643:12:::1;24657:19;::::0;;;:10:::1;:19;::::0;;;;;:30;24689:21;;;;;:32;24631:11:::1;:91::i;:::-;24741:9;24756:224;;;;;;;;24793:12;9225:10:::0;;9145:98;24793:12:::1;-1:-1:-1::0;;;;;24756:224:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;24923:15:::1;24756:224:::0;;;;;;;;-1:-1:-1;24756:224:0;;;;;;;24741:240;;24756:224;24741:240;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;24741:240:0::1;::::0;;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;24741:240:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25033:9:::1;:16:::0;:20:::1;::::0;24756:224;25033:20:::1;:::i;:::-;25005:49;::::0;25022:9;;25012:7;;25005:49:::1;::::0;;;::::1;23176:1886:::0;;;;;:::o;21602:157::-;14079:4;15875:12;;;;;-1:-1:-1;;;;;;;;;;;15875:22:0;14525:30;14536:4;9225:10;14525;:30::i;:::-;-1:-1:-1;21717:15:0::1;:34:::0;21602:157::o;22791:373::-;14079:4;15875:12;;;;;-1:-1:-1;;;;;;;;;;;15875:22:0;14525:30;14536:4;9225:10;14525;:30::i;:::-;22930:15:::1;;22915:11;:30;;22914:53;;;;;22965:1;22951:11;:15;22914:53;22906:121;;;::::0;-1:-1:-1;;;22906:121:0;;17864:2:1;22906:121:0::1;::::0;::::1;17846:21:1::0;17903:2;17883:18;;;17876:30;17942:34;17922:18;;;17915:62;18013:26;17993:18;;;17986:54;18057:19;;22906:121:0::1;17836:246:1::0;22906:121:0::1;23056:1;23046:7;:11;23038:73;;;::::0;-1:-1:-1;;;23038:73:0;;10840:2:1;23038:73:0::1;::::0;::::1;10822:21:1::0;10879:2;10859:18;;;10852:30;10918:34;10898:18;;;10891:62;-1:-1:-1;;;10969:18:1;;;10962:48;11027:19;;23038:73:0::1;10812:240:1::0;23038:73:0::1;-1:-1:-1::0;23122:24:0::1;::::0;;;:11:::1;:24;::::0;;;;;:34;22791:373::o;15096:497::-;15177:22;15185:4;15191:7;15177;:22::i;:::-;15172:414;;15365:41;15393:7;-1:-1:-1;;;;;15365:41:0;15403:2;15365:19;:41::i;:::-;15479:38;15507:4;15514:2;15479:19;:38::i;:::-;15270:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;15270:270:0;;;;;;;;;;-1:-1:-1;;;15216:358:0;;;;;;;:::i;10659:855::-;10752:7;10771:9;10787;10803:7;10858:9;:16;10878:2;10858:22;10854:64;;10907:1;10891:19;;;;;;;10854:64;-1:-1:-1;;;11045:4:0;11030:20;;11024:27;11085:4;11070:20;;11064:27;11133:4;11118:20;;11112:27;11109:1;11104:36;11251:2;11247:6;;11243:36;;;11264:7;11269:2;11264:7;;:::i;:::-;;;11243:36;11351:1;:7;;11356:2;11351:7;;:18;;;;;11362:1;:7;;11367:2;11362:7;;11351:18;11347:162;;;11396:1;11380:19;;;;;;;11347:162;11477:24;;;;;;;;;;;;8858:25:1;;;8931:4;8919:17;;8899:18;;;8892:45;;;;8953:18;;;8946:34;;;8996:18;;;8989:34;;;11477:24:0;;8830:19:1;;11477:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11470:31;;;;;;;18547:229;18622:22;18630:4;18636:7;18622;:22::i;:::-;18617:152;;18661:6;:12;;;;;;;;;;;-1:-1:-1;;;;;18661:29:0;;;;;;;;;:36;;-1:-1:-1;;18661:36:0;18693:4;18661:36;;;18744:12;9225:10;;9145:98;18744:12;-1:-1:-1;;;;;18717:40:0;18735:7;-1:-1:-1;;;;;18717:40:0;18729:4;18717:40;;;;;;;;;;18547:229;;:::o;18784:230::-;18859:22;18867:4;18873:7;18859;:22::i;:::-;18855:152;;;18930:5;18898:12;;;;;;;;;;;-1:-1:-1;;;;;18898:29:0;;;;;;;;;;:37;;-1:-1:-1;;18898:37:0;;;18955:40;9225:10;;18898:12;;18955:40;;18930:5;18955:40;18784:230;;:::o;20199:775::-;20326:6;;20301:3;;;:21;;-1:-1:-1;;;20301:21:0;;-1:-1:-1;;;;;6669:32:1;;;20301:21:0;;;6651:51:1;;;;20301:3:0;;;:13;;6624:18:1;;20301:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;;20293:93;;;;-1:-1:-1;;;20293:93:0;;17042:2:1;20293:93:0;;;17024:21:1;17081:2;17061:18;;;17054:30;17120:34;17100:18;;;17093:62;-1:-1:-1;;;17171:18:1;;;17164:48;17229:19;;20293:93:0;17014:240:1;20293:93:0;20445:6;;20405:3;;;:36;;-1:-1:-1;;;20405:36:0;;-1:-1:-1;;;;;6943:15:1;;;20405:36:0;;;6925:34:1;;;;20435:4:0;6975:18:1;;;6968:43;20405:3:0;;;:13;;6860:18:1;;20405:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;20397:106;;;;-1:-1:-1;;;20397:106:0;;16218:2:1;20397:106:0;;;16200:21:1;16257:2;16237:18;;;16230:30;16296:34;16276:18;;;16269:62;-1:-1:-1;;;16347:18:1;;;16340:46;16403:19;;20397:106:0;16190:238:1;20397:106:0;20522:3;;;20547:8;;20557:6;;20522:42;;-1:-1:-1;;;20522:42:0;;-1:-1:-1;;;;;7280:15:1;;;20522:42:0;;;7262:34:1;;;;20547:8:0;;;7312:18:1;;;7305:43;7364:18;;;7357:34;20522:3:0;;;:16;;7197:18:1;;20522:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20514:88;;;;-1:-1:-1;;;20514:88:0;;17461:2:1;20514:88:0;;;17443:21:1;17500:2;17480:18;;;17473:30;17539:34;17519:18;;;17512:62;-1:-1:-1;;;17590:18:1;;;17583:32;17632:19;;20514:88:0;17433:224:1;20514:88:0;20623:12;20666:23;;;:11;:23;;;;;;;20638:25;;;;;;;:51;;20666:23;20638:51;:::i;:::-;20718:3;;:21;;-1:-1:-1;;;20718:21:0;;-1:-1:-1;;;;;6669:32:1;;;20718:21:0;;;6651:51:1;20623:66:0;;-1:-1:-1;20623:66:0;;20718:3;;;;:13;;6624:18:1;;20718:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;;20710:94;;;;-1:-1:-1;;;20710:94:0;;19518:2:1;20710:94:0;;;19500:21:1;19557:2;19537:18;;;19530:30;19596:34;19576:18;;;19569:62;-1:-1:-1;;;19647:18:1;;;19640:48;19705:19;;20710:94:0;19490:240:1;20710:94:0;20823:3;;:36;;-1:-1:-1;;;20823:36:0;;-1:-1:-1;;;;;6943:15:1;;;20823:36:0;;;6925:34:1;20853:4:0;6975:18:1;;;6968:43;20863:7:0;;20823:3;;:13;;6860:18:1;;20823:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;20815:111;;;;-1:-1:-1;;;20815:111:0;;14981:2:1;20815:111:0;;;14963:21:1;15020:2;15000:18;;;14993:30;15059:34;15039:18;;;15032:62;-1:-1:-1;;;15110:18:1;;;15103:50;15170:19;;20815:111:0;14953:242:1;20815:111:0;20937:3;;:29;;-1:-1:-1;;;20937:29:0;;-1:-1:-1;;;;;7594:32:1;;;20937:29:0;;;7576:51:1;7643:18;;;7636:34;;;20937:3:0;;;;:12;;7549:18:1;;20937:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20199:775;;;;:::o;13355:451::-;13430:13;13456:19;13488:10;13492:6;13488:1;:10;:::i;:::-;:14;;13501:1;13488:14;:::i;:::-;13478:25;;;;;;-1:-1:-1;;;13478:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13478:25:0;;13456:47;;-1:-1:-1;;;13514:6:0;13521:1;13514:9;;;;;;-1:-1:-1;;;13514:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;13514:15:0;;;;;;;;;-1:-1:-1;;;13540:6:0;13547:1;13540:9;;;;;;-1:-1:-1;;;13540:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;13540:15:0;;;;;;;;-1:-1:-1;13571:9:0;13583:10;13587:6;13583:1;:10;:::i;:::-;:14;;13596:1;13583:14;:::i;:::-;13571:26;;13566:135;13603:1;13599;:5;13566:135;;;-1:-1:-1;;;13651:5:0;13659:3;13651:11;13638:25;;;;;-1:-1:-1;;;13638:25:0;;;;;;;;;;;;13626:6;13633:1;13626:9;;;;;;-1:-1:-1;;;13626:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;13626:37:0;;;;;;;;-1:-1:-1;13688:1:0;13678:11;;;;;13606:3;;;:::i;:::-;;;13566:135;;;-1:-1:-1;13719:10:0;;13711:55;;;;-1:-1:-1;;;13711:55:0;;10074:2:1;13711:55:0;;;10056:21:1;;;10093:18;;;10086:30;10152:34;10132:18;;;10125:62;10204:18;;13711:55:0;10046:182:1;13711:55:0;13791:6;13355:451;-1:-1:-1;;;13355:451:0:o;14:738:1:-;56:5;109:3;102:4;94:6;90:17;86:27;76:2;;131:5;124;117:20;76:2;171:6;158:20;197:18;234:2;230;227:10;224:2;;;240:18;;:::i;:::-;315:2;309:9;283:2;369:13;;-1:-1:-1;;365:22:1;;;389:2;361:31;357:40;345:53;;;413:18;;;433:22;;;410:46;407:2;;;459:18;;:::i;:::-;499:10;495:2;488:22;534:2;526:6;519:18;580:3;573:4;568:2;560:6;556:15;552:26;549:35;546:2;;;601:5;594;587:20;546:2;669;662:4;654:6;650:17;643:4;635:6;631:17;618:54;692:15;;;709:4;688:26;681:41;;;;-1:-1:-1;696:6:1;66:686;-1:-1:-1;;;66:686:1:o;757:257::-;816:6;869:2;857:9;848:7;844:23;840:32;837:2;;;890:6;882;875:22;837:2;934:9;921:23;953:31;978:5;953:31;:::i;1019:261::-;1089:6;1142:2;1130:9;1121:7;1117:23;1113:32;1110:2;;;1163:6;1155;1148:22;1110:2;1200:9;1194:16;1219:31;1244:5;1219:31;:::i;1285:750::-;1398:6;1406;1414;1422;1430;1438;1491:3;1479:9;1470:7;1466:23;1462:33;1459:2;;;1513:6;1505;1498:22;1459:2;1557:9;1544:23;1576:31;1601:5;1576:31;:::i;:::-;1626:5;-1:-1:-1;1678:2:1;1663:18;;1650:32;;-1:-1:-1;1729:2:1;1714:18;;1701:32;;-1:-1:-1;1780:2:1;1765:18;;1752:32;;-1:-1:-1;1831:3:1;1816:19;;1803:33;;-1:-1:-1;1887:3:1;1872:19;;1859:33;1915:18;1904:30;;1901:2;;;1952:6;1944;1937:22;1901:2;1980:49;2021:7;2012:6;2001:9;1997:22;1980:49;:::i;:::-;1970:59;;;1449:586;;;;;;;;:::o;2040:297::-;2107:6;2160:2;2148:9;2139:7;2135:23;2131:32;2128:2;;;2181:6;2173;2166:22;2128:2;2218:9;2212:16;2271:5;2264:13;2257:21;2250:5;2247:32;2237:2;;2298:6;2290;2283:22;2342:190;2401:6;2454:2;2442:9;2433:7;2429:23;2425:32;2422:2;;;2475:6;2467;2460:22;2422:2;-1:-1:-1;2503:23:1;;2412:120;-1:-1:-1;2412:120:1:o;2537:325::-;2605:6;2613;2666:2;2654:9;2645:7;2641:23;2637:32;2634:2;;;2687:6;2679;2672:22;2634:2;2728:9;2715:23;2705:33;;2788:2;2777:9;2773:18;2760:32;2801:31;2826:5;2801:31;:::i;:::-;2851:5;2841:15;;;2624:238;;;;;:::o;3620:194::-;3690:6;3743:2;3731:9;3722:7;3718:23;3714:32;3711:2;;;3764:6;3756;3749:22;3711:2;-1:-1:-1;3792:16:1;;3701:113;-1:-1:-1;3701:113:1:o;3819:258::-;3887:6;3895;3948:2;3936:9;3927:7;3923:23;3919:32;3916:2;;;3969:6;3961;3954:22;3916:2;-1:-1:-1;;3997:23:1;;;4067:2;4052:18;;;4039:32;;-1:-1:-1;3906:171:1:o;4082:614::-;4186:6;4194;4202;4210;4218;4271:3;4259:9;4250:7;4246:23;4242:33;4239:2;;;4293:6;4285;4278:22;4239:2;4334:9;4321:23;4311:33;;4391:2;4380:9;4376:18;4363:32;4353:42;;4442:2;4431:9;4427:18;4414:32;4404:42;;4493:2;4482:9;4478:18;4465:32;4455:42;;4548:3;4537:9;4533:19;4520:33;4576:18;4568:6;4565:30;4562:2;;;4613:6;4605;4598:22;4562:2;4641:49;4682:7;4673:6;4662:9;4658:22;4641:49;:::i;:::-;4631:59;;;4229:467;;;;;;;;:::o;5714:786::-;6125:25;6120:3;6113:38;6095:3;6180:6;6174:13;6196:62;6251:6;6246:2;6241:3;6237:12;6230:4;6222:6;6218:17;6196:62;:::i;:::-;-1:-1:-1;;;6317:2:1;6277:16;;;6309:11;;;6302:40;6367:13;;6389:63;6367:13;6438:2;6430:11;;6423:4;6411:17;;6389:63;:::i;:::-;6472:17;6491:2;6468:26;;6103:397;-1:-1:-1;;;;6103:397:1:o;9484:383::-;9633:2;9622:9;9615:21;9596:4;9665:6;9659:13;9708:6;9703:2;9692:9;9688:18;9681:34;9724:66;9783:6;9778:2;9767:9;9763:18;9758:2;9750:6;9746:15;9724:66;:::i;:::-;9851:2;9830:15;-1:-1:-1;;9826:29:1;9811:45;;;;9858:2;9807:54;;9605:262;-1:-1:-1;;9605:262:1:o;21304:128::-;21344:3;21375:1;21371:6;21368:1;21365:13;21362:2;;;21381:18;;:::i;:::-;-1:-1:-1;21417:9:1;;21352:80::o;21437:204::-;21475:3;21511:4;21508:1;21504:12;21543:4;21540:1;21536:12;21578:3;21572:4;21568:14;21563:3;21560:23;21557:2;;;21586:18;;:::i;:::-;21622:13;;21483:158;-1:-1:-1;;;21483:158:1:o;21646:168::-;21686:7;21752:1;21748;21744:6;21740:14;21737:1;21734:21;21729:1;21722:9;21715:17;21711:45;21708:2;;;21759:18;;:::i;:::-;-1:-1:-1;21799:9:1;;21698:116::o;21819:125::-;21859:4;21887:1;21884;21881:8;21878:2;;;21892:18;;:::i;:::-;-1:-1:-1;21929:9:1;;21868:76::o;21949:258::-;22021:1;22031:113;22045:6;22042:1;22039:13;22031:113;;;22121:11;;;22115:18;22102:11;;;22095:39;22067:2;22060:10;22031:113;;;22162:6;22159:1;22156:13;22153:2;;;22197:1;22188:6;22183:3;22179:16;22172:27;22153:2;;22002:205;;;:::o;22212:136::-;22251:3;22279:5;22269:2;;22288:18;;:::i;:::-;-1:-1:-1;;;22324:18:1;;22259:89::o;22353:135::-;22392:3;-1:-1:-1;;22413:17:1;;22410:2;;;22433:18;;:::i;:::-;-1:-1:-1;22480:1:1;22469:13;;22400:88::o;22493:127::-;22554:10;22549:3;22545:20;22542:1;22535:31;22585:4;22582:1;22575:15;22609:4;22606:1;22599:15;22625:127;22686:10;22681:3;22677:20;22674:1;22667:31;22717:4;22714:1;22707:15;22741:4;22738:1;22731:15;22757:131;-1:-1:-1;;;;;22832:31:1;;22822:42;;22812:2;;22878:1;22875;22868:12;22812:2;22802:86;:::o

Swarm Source

ipfs://8a3286cd11e8223cbd958ae9ae06bd51d74883ef38e3d0501a277e3bad272970
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.