APE Price: $1.09 (-7.06%)

Contract

0xc9b6635F760a4B0960f6c1d37825E58D89Eeb566

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo27.365000000000000031 APE

APE Value

$29.86 (@ $1.09/APE)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy Shares83700162025-01-18 12:53:014 hrs ago1737204781IN
0xc9b6635F...D89Eeb566
5 APE0.001228725.42069
Claim Winnings83214902025-01-17 14:56:2226 hrs ago1737125782IN
0xc9b6635F...D89Eeb566
0 APE0.0019577425.42069
Claim Winnings77729522025-01-08 18:49:209 days ago1736362160IN
0xc9b6635F...D89Eeb566
0 APE0.0018970625.42069
Claim Winnings77729332025-01-08 18:48:559 days ago1736362135IN
0xc9b6635F...D89Eeb566
0 APE0.0019574425.42069
Claim Winnings75531252025-01-04 17:52:3913 days ago1736013159IN
0xc9b6635F...D89Eeb566
0 APE0.0019574425.42069
Claim Winnings75530852025-01-04 17:51:4613 days ago1736013106IN
0xc9b6635F...D89Eeb566
0 APE0.0019577425.42069
Claim Winnings75530722025-01-04 17:51:2313 days ago1736013083IN
0xc9b6635F...D89Eeb566
0 APE0.0018970625.42069
Resolve Market75427532025-01-04 14:02:5414 days ago1735999374IN
0xc9b6635F...D89Eeb566
0 APE0.0027054225.42069
Resolve Market75427042025-01-04 14:00:1814 days ago1735999218IN
0xc9b6635F...D89Eeb566
0 APE0.0026456325.42069
Resolve Market75426312025-01-04 13:58:1914 days ago1735999099IN
0xc9b6635F...D89Eeb566
0 APE0.002523325.42069
Resolve Market75425792025-01-04 13:56:2014 days ago1735998980IN
0xc9b6635F...D89Eeb566
0 APE0.002583425.42069
Resolve Market75425182025-01-04 13:53:3114 days ago1735998811IN
0xc9b6635F...D89Eeb566
0 APE0.0027658225.42069
Resolve Market75424912025-01-04 13:52:3314 days ago1735998753IN
0xc9b6635F...D89Eeb566
0 APE0.0026456325.42069
Buy Shares73233402024-12-29 18:51:0619 days ago1735498266IN
0xc9b6635F...D89Eeb566
1 APE0.0020980925.42069
Buy Shares72918952024-12-28 20:46:4620 days ago1735418806IN
0xc9b6635F...D89Eeb566
2 APE0.0020977925.42069
Create Market72911452024-12-28 20:13:4220 days ago1735416822IN
0xc9b6635F...D89Eeb566
0 APE0.0056033525.42069
Buy Shares72837192024-12-28 14:55:3321 days ago1735397733IN
0xc9b6635F...D89Eeb566
5 APE0.0016630925.42069
Buy Shares72791232024-12-28 12:11:5621 days ago1735387916IN
0xc9b6635F...D89Eeb566
1 APE0.0020980925.42069
Buy Shares72791202024-12-28 12:11:5021 days ago1735387910IN
0xc9b6635F...D89Eeb566
1 APE0.0020977925.42069
Create Market72615192024-12-27 22:14:4121 days ago1735337681IN
0xc9b6635F...D89Eeb566
0 APE0.0056024125.42069
Buy Shares72532712024-12-27 16:09:0822 days ago1735315748IN
0xc9b6635F...D89Eeb566
5 APE0.0012283725.42069
Buy Shares72532342024-12-27 16:07:0822 days ago1735315628IN
0xc9b6635F...D89Eeb566
5 APE0.0016630925.42069
Buy Shares72532062024-12-27 16:05:3922 days ago1735315539IN
0xc9b6635F...D89Eeb566
1 APE0.0016630925.42069
Buy Shares72529512024-12-27 15:55:1422 days ago1735314914IN
0xc9b6635F...D89Eeb566
5 APE0.0012286825.42069
Buy Shares72529452024-12-27 15:54:5822 days ago1735314898IN
0xc9b6635F...D89Eeb566
4 APE0.0012283725.42069
View all transactions

Latest 14 internal transactions

Parent Transaction Hash Block From To
83214902025-01-17 14:56:2226 hrs ago1737125782
0xc9b6635F...D89Eeb566
7.01999999 APE
77729522025-01-08 18:49:209 days ago1736362160
0xc9b6635F...D89Eeb566
6.92999999 APE
77729332025-01-08 18:48:559 days ago1736362135
0xc9b6635F...D89Eeb566
16.19999999 APE
75531252025-01-04 17:52:3913 days ago1736013159
0xc9b6635F...D89Eeb566
1.61999999 APE
75530852025-01-04 17:51:4613 days ago1736013106
0xc9b6635F...D89Eeb566
5.84999999 APE
75530722025-01-04 17:51:2313 days ago1736013083
0xc9b6635F...D89Eeb566
5.77499999 APE
72529012024-12-27 15:51:4822 days ago1735314708
0xc9b6635F...D89Eeb566
6.92999999 APE
72527012024-12-27 15:45:0222 days ago1735314302
0xc9b6635F...D89Eeb566
1.31999999 APE
72526992024-12-27 15:44:5722 days ago1735314297
0xc9b6635F...D89Eeb566
1.98 APE
68095862024-12-18 1:26:4031 days ago1734485200
0xc9b6635F...D89Eeb566
10.72499999 APE
67902062024-12-17 14:32:5132 days ago1734445971
0xc9b6635F...D89Eeb566
2.63999999 APE
67901812024-12-17 14:32:1632 days ago1734445936
0xc9b6635F...D89Eeb566
1.07249999 APE
67755362024-12-17 4:45:3832 days ago1734410738
0xc9b6635F...D89Eeb566
1.07249999 APE
67609712024-12-16 19:11:1732 days ago1734376277
0xc9b6635F...D89Eeb566
10 APE

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PrimapePrediction

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2024-12-15
*/

// File: @thirdweb-dev/contracts/extension/interface/IOwnable.sol


pragma solidity ^0.8.0;

/// @author thirdweb

/**
 *  Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading
 *  who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses
 *  information about who the contract's owner is.
 */

interface IOwnable {
    /// @dev Returns the owner of the contract.
    function owner() external view returns (address);

    /// @dev Lets a module admin set a new owner for the contract. The new owner must be a module admin.
    function setOwner(address _newOwner) external;

    /// @dev Emitted when a new Owner is set.
    event OwnerUpdated(address indexed prevOwner, address indexed newOwner);
}

// File: @thirdweb-dev/contracts/extension/Ownable.sol


pragma solidity ^0.8.0;

/// @author thirdweb


/**
 *  @title   Ownable
 *  @notice  Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading
 *           who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses
 *           information about who the contract's owner is.
 */

abstract contract Ownable is IOwnable {
    /// @dev The sender is not authorized to perform the action
    error OwnableUnauthorized();

    /// @dev Owner of the contract (purpose: OpenSea compatibility)
    address private _owner;

    /// @dev Reverts if caller is not the owner.
    modifier onlyOwner() {
        if (msg.sender != _owner) {
            revert OwnableUnauthorized();
        }
        _;
    }

    /**
     *  @notice Returns the owner of the contract.
     */
    function owner() public view override returns (address) {
        return _owner;
    }

    /**
     *  @notice Lets an authorized wallet set a new owner for the contract.
     *  @param _newOwner The address to set as the new owner of the contract.
     */
    function setOwner(address _newOwner) external override {
        if (!_canSetOwner()) {
            revert OwnableUnauthorized();
        }
        _setupOwner(_newOwner);
    }

    /// @dev Lets a contract admin set a new owner for the contract. The new owner must be a contract admin.
    function _setupOwner(address _newOwner) internal {
        address _prevOwner = _owner;
        _owner = _newOwner;

        emit OwnerUpdated(_prevOwner, _newOwner);
    }

    /// @dev Returns whether owner can be set in the given execution context.
    function _canSetOwner() internal view virtual returns (bool);
}

// File: @thirdweb-dev/contracts/extension/interface/IPermissions.sol


pragma solidity ^0.8.0;

/// @author thirdweb

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IPermissions {
    /**
     * @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;
}

// File: @thirdweb-dev/contracts/lib/Strings.sol


pragma solidity ^0.8.0;

/// @author thirdweb

/**
 * @dev String operations.
 */
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);
    }

    /// @dev Returns the hexadecimal representation of `value`.
    /// The output is prefixed with "0x", encoded using 2 hexadecimal digits per byte,
    /// and the alphabets are capitalized conditionally according to
    /// https://eips.ethereum.org/EIPS/eip-55
    function toHexStringChecksummed(address value) internal pure returns (string memory str) {
        str = toHexString(value);
        /// @solidity memory-safe-assembly
        assembly {
            let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...`
            let o := add(str, 0x22)
            let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... `
            let t := shl(240, 136) // `0b10001000 << 240`
            for {
                let i := 0
            } 1 {

            } {
                mstore(add(i, i), mul(t, byte(i, hashed)))
                i := add(i, 1)
                if eq(i, 20) {
                    break
                }
            }
            mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask)))))
            o := add(o, 0x20)
            mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask)))))
        }
    }

    /// @dev Returns the hexadecimal representation of `value`.
    /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte.
    function toHexString(address value) internal pure returns (string memory str) {
        str = toHexStringNoPrefix(value);
        /// @solidity memory-safe-assembly
        assembly {
            let strLength := add(mload(str), 2) // Compute the length.
            mstore(str, 0x3078) // Write the "0x" prefix.
            str := sub(str, 2) // Move the pointer.
            mstore(str, strLength) // Write the length.
        }
    }

    /// @dev Returns the hexadecimal representation of `value`.
    /// The output is encoded using 2 hexadecimal digits per byte.
    function toHexStringNoPrefix(address value) internal pure returns (string memory str) {
        /// @solidity memory-safe-assembly
        assembly {
            str := mload(0x40)

            // Allocate the memory.
            // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,
            // 0x02 bytes for the prefix, and 0x28 bytes for the digits.
            // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80.
            mstore(0x40, add(str, 0x80))

            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            str := add(str, 2)
            mstore(str, 40)

            let o := add(str, 0x20)
            mstore(add(o, 40), 0)

            value := shl(96, value)

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            for {
                let i := 0
            } 1 {

            } {
                let p := add(o, add(i, i))
                let temp := byte(i, value)
                mstore8(add(p, 1), mload(and(temp, 15)))
                mstore8(p, mload(shr(4, temp)))
                i := add(i, 1)
                if eq(i, 20) {
                    break
                }
            }
        }
    }

    /// @dev Returns the hex encoded string from the raw bytes.
    /// The output is encoded using 2 hexadecimal digits per byte.
    function toHexString(bytes memory raw) internal pure returns (string memory str) {
        str = toHexStringNoPrefix(raw);
        /// @solidity memory-safe-assembly
        assembly {
            let strLength := add(mload(str), 2) // Compute the length.
            mstore(str, 0x3078) // Write the "0x" prefix.
            str := sub(str, 2) // Move the pointer.
            mstore(str, strLength) // Write the length.
        }
    }

    /// @dev Returns the hex encoded string from the raw bytes.
    /// The output is encoded using 2 hexadecimal digits per byte.
    function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory str) {
        /// @solidity memory-safe-assembly
        assembly {
            let length := mload(raw)
            str := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix.
            mstore(str, add(length, length)) // Store the length of the output.

            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            let o := add(str, 0x20)
            let end := add(raw, length)

            for {

            } iszero(eq(raw, end)) {

            } {
                raw := add(raw, 1)
                mstore8(add(o, 1), mload(and(mload(raw), 15)))
                mstore8(o, mload(and(shr(4, mload(raw)), 15)))
                o := add(o, 2)
            }
            mstore(o, 0) // Zeroize the slot after the string.
            mstore(0x40, add(o, 0x20)) // Allocate the memory.
        }
    }
}

// File: @thirdweb-dev/contracts/extension/Permissions.sol


pragma solidity ^0.8.0;

/// @author thirdweb



/**
 *  @title   Permissions
 *  @dev     This contracts provides extending-contracts with role-based access control mechanisms
 */
contract Permissions is IPermissions {
    /// @dev The `account` is missing a role.
    error PermissionsUnauthorizedAccount(address account, bytes32 neededRole);

    /// @dev The `account` already is a holder of `role`
    error PermissionsAlreadyGranted(address account, bytes32 role);

    /// @dev Invalid priviledge to revoke
    error PermissionsInvalidPermission(address expected, address actual);

    /// @dev Map from keccak256 hash of a role => a map from address => whether address has role.
    mapping(bytes32 => mapping(address => bool)) private _hasRole;

    /// @dev Map from keccak256 hash of a role to role admin. See {getRoleAdmin}.
    mapping(bytes32 => bytes32) private _getRoleAdmin;

    /// @dev Default admin role for all roles. Only accounts with this role can grant/revoke other roles.
    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /// @dev Modifier that checks if an account has the specified role; reverts otherwise.
    modifier onlyRole(bytes32 role) {
        _checkRole(role, msg.sender);
        _;
    }

    /**
     *  @notice         Checks whether an account has a particular role.
     *  @dev            Returns `true` if `account` has been granted `role`.
     *
     *  @param role     keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE")
     *  @param account  Address of the account for which the role is being checked.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _hasRole[role][account];
    }

    /**
     *  @notice         Checks whether an account has a particular role;
     *                  role restrictions can be swtiched on and off.
     *
     *  @dev            Returns `true` if `account` has been granted `role`.
     *                  Role restrictions can be swtiched on and off:
     *                      - If address(0) has ROLE, then the ROLE restrictions
     *                        don't apply.
     *                      - If address(0) does not have ROLE, then the ROLE
     *                        restrictions will apply.
     *
     *  @param role     keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE")
     *  @param account  Address of the account for which the role is being checked.
     */
    function hasRoleWithSwitch(bytes32 role, address account) public view returns (bool) {
        if (!_hasRole[role][address(0)]) {
            return _hasRole[role][account];
        }

        return true;
    }

    /**
     *  @notice         Returns the admin role that controls the specified role.
     *  @dev            See {grantRole} and {revokeRole}.
     *                  To change a role's admin, use {_setRoleAdmin}.
     *
     *  @param role     keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE")
     */
    function getRoleAdmin(bytes32 role) external view override returns (bytes32) {
        return _getRoleAdmin[role];
    }

    /**
     *  @notice         Grants a role to an account, if not previously granted.
     *  @dev            Caller must have admin role for the `role`.
     *                  Emits {RoleGranted Event}.
     *
     *  @param role     keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE")
     *  @param account  Address of the account to which the role is being granted.
     */
    function grantRole(bytes32 role, address account) public virtual override {
        _checkRole(_getRoleAdmin[role], msg.sender);
        if (_hasRole[role][account]) {
            revert PermissionsAlreadyGranted(account, role);
        }
        _setupRole(role, account);
    }

    /**
     *  @notice         Revokes role from an account.
     *  @dev            Caller must have admin role for the `role`.
     *                  Emits {RoleRevoked Event}.
     *
     *  @param role     keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE")
     *  @param account  Address of the account from which the role is being revoked.
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        _checkRole(_getRoleAdmin[role], msg.sender);
        _revokeRole(role, account);
    }

    /**
     *  @notice         Revokes role from the account.
     *  @dev            Caller must have the `role`, with caller being the same as `account`.
     *                  Emits {RoleRevoked Event}.
     *
     *  @param role     keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE")
     *  @param account  Address of the account from which the role is being revoked.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        if (msg.sender != account) {
            revert PermissionsInvalidPermission(msg.sender, account);
        }
        _revokeRole(role, account);
    }

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

    /// @dev Sets up `role` for `account`
    function _setupRole(bytes32 role, address account) internal virtual {
        _hasRole[role][account] = true;
        emit RoleGranted(role, account, msg.sender);
    }

    /// @dev Revokes `role` from `account`
    function _revokeRole(bytes32 role, address account) internal virtual {
        _checkRole(role, account);
        delete _hasRole[role][account];
        emit RoleRevoked(role, account, msg.sender);
    }

    /// @dev Checks `role` for `account`. Reverts with a message including the required role.
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!_hasRole[role][account]) {
            revert PermissionsUnauthorizedAccount(account, role);
        }
    }

    /// @dev Checks `role` for `account`. Reverts with a message including the required role.
    function _checkRoleWithSwitch(bytes32 role, address account) internal view virtual {
        if (!hasRoleWithSwitch(role, account)) {
            revert PermissionsUnauthorizedAccount(account, role);
        }
    }
}

// File: @thirdweb-dev/contracts/extension/interface/IContractMetadata.sol


pragma solidity ^0.8.0;

/// @author thirdweb

/**
 *  Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI
 *  for you contract.
 *
 *  Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea.
 */

interface IContractMetadata {
    /// @dev Returns the metadata URI of the contract.
    function contractURI() external view returns (string memory);

    /**
     *  @dev Sets contract URI for the storefront-level metadata of the contract.
     *       Only module admin can call this function.
     */
    function setContractURI(string calldata _uri) external;

    /// @dev Emitted when the contract URI is updated.
    event ContractURIUpdated(string prevURI, string newURI);
}

// File: @thirdweb-dev/contracts/extension/ContractMetadata.sol


pragma solidity ^0.8.0;

/// @author thirdweb


/**
 *  @title   Contract Metadata
 *  @notice  Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI
 *           for you contract.
 *           Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea.
 */

abstract contract ContractMetadata is IContractMetadata {
    /// @dev The sender is not authorized to perform the action
    error ContractMetadataUnauthorized();

    /// @notice Returns the contract metadata URI.
    string public override contractURI;

    /**
     *  @notice         Lets a contract admin set the URI for contract-level metadata.
     *  @dev            Caller should be authorized to setup contractURI, e.g. contract admin.
     *                  See {_canSetContractURI}.
     *                  Emits {ContractURIUpdated Event}.
     *
     *  @param _uri     keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE")
     */
    function setContractURI(string memory _uri) external override {
        if (!_canSetContractURI()) {
            revert ContractMetadataUnauthorized();
        }

        _setupContractURI(_uri);
    }

    /// @dev Lets a contract admin set the URI for contract-level metadata.
    function _setupContractURI(string memory _uri) internal {
        string memory prevURI = contractURI;
        contractURI = _uri;

        emit ContractURIUpdated(prevURI, _uri);
    }

    /// @dev Returns whether contract metadata can be set in the given execution context.
    function _canSetContractURI() internal view virtual returns (bool);
}

// File: @thirdweb-dev/contracts/extension/interface/IPermissionsEnumerable.sol


pragma solidity ^0.8.0;

/// @author thirdweb


/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IPermissionsEnumerable is IPermissions {
    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * [forum post](https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296)
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

// File: @thirdweb-dev/contracts/extension/PermissionsEnumerable.sol


pragma solidity ^0.8.0;

/// @author thirdweb



/**
 *  @title   PermissionsEnumerable
 *  @dev     This contracts provides extending-contracts with role-based access control mechanisms.
 *           Also provides interfaces to view all members with a given role, and total count of members.
 */
contract PermissionsEnumerable is IPermissionsEnumerable, Permissions {
    /**
     *  @notice A data structure to store data of members for a given role.
     *
     *  @param index    Current index in the list of accounts that have a role.
     *  @param members  map from index => address of account that has a role
     *  @param indexOf  map from address => index which the account has.
     */
    struct RoleMembers {
        uint256 index;
        mapping(uint256 => address) members;
        mapping(address => uint256) indexOf;
    }

    /// @dev map from keccak256 hash of a role to its members' data. See {RoleMembers}.
    mapping(bytes32 => RoleMembers) private roleMembers;

    /**
     *  @notice         Returns the role-member from a list of members for a role,
     *                  at a given index.
     *  @dev            Returns `member` who has `role`, at `index` of role-members list.
     *                  See struct {RoleMembers}, and mapping {roleMembers}
     *
     *  @param role     keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE")
     *  @param index    Index in list of current members for the role.
     *
     *  @return member  Address of account that has `role`
     */
    function getRoleMember(bytes32 role, uint256 index) external view override returns (address member) {
        uint256 currentIndex = roleMembers[role].index;
        uint256 check;

        for (uint256 i = 0; i < currentIndex; i += 1) {
            if (roleMembers[role].members[i] != address(0)) {
                if (check == index) {
                    member = roleMembers[role].members[i];
                    return member;
                }
                check += 1;
            } else if (hasRole(role, address(0)) && i == roleMembers[role].indexOf[address(0)]) {
                check += 1;
            }
        }
    }

    /**
     *  @notice         Returns total number of accounts that have a role.
     *  @dev            Returns `count` of accounts that have `role`.
     *                  See struct {RoleMembers}, and mapping {roleMembers}
     *
     *  @param role     keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE")
     *
     *  @return count   Total number of accounts that have `role`
     */
    function getRoleMemberCount(bytes32 role) external view override returns (uint256 count) {
        uint256 currentIndex = roleMembers[role].index;

        for (uint256 i = 0; i < currentIndex; i += 1) {
            if (roleMembers[role].members[i] != address(0)) {
                count += 1;
            }
        }
        if (hasRole(role, address(0))) {
            count += 1;
        }
    }

    /// @dev Revokes `role` from `account`, and removes `account` from {roleMembers}
    ///      See {_removeMember}
    function _revokeRole(bytes32 role, address account) internal override {
        super._revokeRole(role, account);
        _removeMember(role, account);
    }

    /// @dev Grants `role` to `account`, and adds `account` to {roleMembers}
    ///      See {_addMember}
    function _setupRole(bytes32 role, address account) internal override {
        super._setupRole(role, account);
        _addMember(role, account);
    }

    /// @dev adds `account` to {roleMembers}, for `role`
    function _addMember(bytes32 role, address account) internal {
        uint256 idx = roleMembers[role].index;
        roleMembers[role].index += 1;

        roleMembers[role].members[idx] = account;
        roleMembers[role].indexOf[account] = idx;
    }

    /// @dev removes `account` from {roleMembers}, for `role`
    function _removeMember(bytes32 role, address account) internal {
        uint256 idx = roleMembers[role].indexOf[account];

        delete roleMembers[role].members[idx];
        delete roleMembers[role].indexOf[account];
    }
}

// File: @thirdweb-dev/contracts/external-deps/openzeppelin/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: contracts/PrimapePrediction.sol


pragma solidity ^0.8.26;






/**
 * @title PrimapePrediction
 * @dev A multi-outcome, pari-mutuel style prediction market using the chain's native token.
 *
 * Features:
 * - Multiple outcomes per market.
 * - Early resolution by the owner.
 * - Adjustable platform fees.
 * - Role-based access control (owner, market creators).
 * - A claim deadline after resolution, allowing leftover funds to be swept by the owner.
 *
 * How it Works:
 * Users buy shares for an outcome in a prediction market. After resolution, winners claim their share 
 * of the losing side’s pot. If some winners never claim, after the claim deadline, the owner can sweep 
 * unclaimed funds.
 */
contract PrimapePrediction is Ownable, ReentrancyGuard, PermissionsEnumerable, ContractMetadata {
    struct Market {
        string question;
        uint256 endTime;
        bool resolved;
        uint256 winningOptionIndex; // If unresolved, set to type(uint256).max
        uint256 claimDeadline;      // After this, unclaimed funds can be swept by the owner
        uint256 totalPool;          // Tracks total funds available for claiming at resolution
    }

    // Role for market creators
    bytes32 public constant MARKET_CREATOR_ROLE = keccak256("MARKET_CREATOR_ROLE");

    uint256 public marketCount;
    mapping(uint256 => Market) public markets;

    // Market data
    mapping(uint256 => string[]) public marketOptions;
    mapping(uint256 => mapping(uint256 => uint256)) public totalSharesPerOption; // marketId => optionIndex => total
    mapping(uint256 => mapping(address => mapping(uint256 => uint256))) public userSharesPerOption; // user balances
    mapping(uint256 => mapping(address => bool)) public hasClaimed;

    // Platform fee (in basis points)
    uint256 public feeBps = 100; // 1% default
    uint256 public platformBalance;

    // Grace period (e.g., 30 days) after which owner can sweep unclaimed funds
    uint256 public constant CLAIM_GRACE_PERIOD = 30 days;

    /// Events
    event MarketCreated(uint256 indexed marketId, string question, string[] options, uint256 endTime);
    event SharesPurchased(uint256 indexed marketId, address indexed buyer, uint256 optionIndex, uint256 amount);
    event MarketResolved(uint256 indexed marketId, uint256 winningOptionIndex);
    event Claimed(uint256 indexed marketId, address indexed user, uint256 amount);
    event FeeUpdated(uint256 newFeeBps);
    event FeesWithdrawn(uint256 amount, address indexed recipient);
    event UnclaimedFundsSwept(uint256 indexed marketId, uint256 amount);

    constructor() {
        _setupOwner(msg.sender);
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    /// @dev Ownable override
    function _canSetOwner() internal view virtual override returns (bool) {
        return msg.sender == owner();
    }

    /// @dev ContractMetadata override for setting contract URI
    function _canSetContractURI() internal view virtual override returns (bool) {
        return msg.sender == owner();
    }

    /**
     * @notice Create a new market
     */
    function createMarket(
        string memory _question,
        string[] memory _options,
        uint256 _duration
    ) external returns (uint256) {
        require(msg.sender == owner() || hasRole(MARKET_CREATOR_ROLE, msg.sender), "Not authorized");
        require(_duration > 0, "Duration must be positive");
        require(_options.length >= 2, "At least two outcomes");

        uint256 marketId = marketCount++;
        Market storage market = markets[marketId];

        market.question = _question;
        market.endTime = block.timestamp + _duration;
        market.resolved = false;
        market.winningOptionIndex = type(uint256).max;

        for (uint256 i = 0; i < _options.length; i++) {
            marketOptions[marketId].push(_options[i]);
        }

        emit MarketCreated(marketId, _question, _options, market.endTime);
        return marketId;
    }

    /**
     * @notice Buy shares in a market outcome
     */
    function buyShares(uint256 _marketId, uint256 _optionIndex) external payable {
        Market storage market = markets[_marketId];
        require(block.timestamp < market.endTime, "Market ended");
        require(!market.resolved, "Market resolved");
        require(_optionIndex < marketOptions[_marketId].length, "Invalid option");
        require(msg.value > 0, "No funds");

        uint256 feeAmount = (msg.value * feeBps) / 10000;
        uint256 netAmount = msg.value - feeAmount;

        platformBalance += feeAmount;
        userSharesPerOption[_marketId][msg.sender][_optionIndex] += netAmount;
        totalSharesPerOption[_marketId][_optionIndex] += netAmount;

        emit SharesPurchased(_marketId, msg.sender, _optionIndex, netAmount);
    }

    /**
     * @notice Resolve a market
     */
    function resolveMarket(uint256 _marketId, uint256 _winningOptionIndex) external {
        require(msg.sender == owner(), "Only owner");
        Market storage market = markets[_marketId];
        require(!market.resolved, "Already resolved");
        require(_winningOptionIndex < marketOptions[_marketId].length, "Invalid outcome");

        market.winningOptionIndex = _winningOptionIndex;
        market.resolved = true;
        market.claimDeadline = block.timestamp + CLAIM_GRACE_PERIOD;

        uint256 optionCount = marketOptions[_marketId].length;
        uint256 totalPool = 0;
        for (uint256 i = 0; i < optionCount; i++) {
            totalPool += totalSharesPerOption[_marketId][i];
        }
        market.totalPool = totalPool;

        emit MarketResolved(_marketId, _winningOptionIndex);
    }

    /**
     * @notice Claim winnings
     */
    function claimWinnings(uint256 _marketId) external nonReentrant {
        Market storage market = markets[_marketId];
        require(market.resolved, "Not resolved");
        require(block.timestamp < market.claimDeadline, "Claim expired");
        require(!hasClaimed[_marketId][msg.sender], "Already claimed");

        uint256 winningOption = market.winningOptionIndex;
        uint256 userShares = userSharesPerOption[_marketId][msg.sender][winningOption];
        require(userShares > 0, "No winnings");

        uint256 winningShares = totalSharesPerOption[_marketId][winningOption];
        uint256 losingShares = 0;
        uint256 optionCount = marketOptions[_marketId].length;
        for (uint256 i = 0; i < optionCount; i++) {
            if (i != winningOption) {
                losingShares += totalSharesPerOption[_marketId][i];
            }
        }

        uint256 rewardRatio = winningShares > 0 ? (losingShares * 1e18) / winningShares : 0;
        uint256 winnings = userShares + (userShares * rewardRatio) / 1e18;

        userSharesPerOption[_marketId][msg.sender][winningOption] = 0;
        hasClaimed[_marketId][msg.sender] = true;
        market.totalPool -= winnings;

        (bool success, ) = payable(msg.sender).call{value: winnings}("");
        require(success, "Transfer failed");

        emit Claimed(_marketId, msg.sender, winnings);
    }

    /**
     * @notice Batch claim for multiple users
     */
    function batchClaimWinnings(uint256 _marketId, address[] calldata _users) external nonReentrant {
        Market storage market = markets[_marketId];
        require(market.resolved, "Not resolved");
        require(block.timestamp < market.claimDeadline, "Claim expired");

        uint256 winningOption = market.winningOptionIndex;
        uint256 winningShares = totalSharesPerOption[_marketId][winningOption];
        uint256 losingShares = 0;
        uint256 optionCount = marketOptions[_marketId].length;
        for (uint256 i = 0; i < optionCount; i++) {
            if (i != winningOption) {
                losingShares += totalSharesPerOption[_marketId][i];
            }
        }

        uint256 rewardRatio = winningShares > 0 ? (losingShares * 1e18) / winningShares : 0;

        for (uint256 i = 0; i < _users.length; i++) {
            address user = _users[i];
            if (hasClaimed[_marketId][user]) continue;

            uint256 userShares = userSharesPerOption[_marketId][user][winningOption];
            if (userShares == 0) continue;

            uint256 winnings = userShares + (userShares * rewardRatio) / 1e18;
            hasClaimed[_marketId][user] = true;
            userSharesPerOption[_marketId][user][winningOption] = 0;

            market.totalPool -= winnings;

            (bool success, ) = payable(user).call{value: winnings}("");
            require(success, "Transfer failed");
            emit Claimed(_marketId, user, winnings);
        }
    }

    /**
     * @notice Sweep unclaimed funds after claim deadline
     */
    function sweepUnclaimedFunds(uint256 _marketId) external nonReentrant {
        Market storage market = markets[_marketId];
        require(market.resolved, "Not resolved");
        require(block.timestamp > market.claimDeadline, "Deadline not passed");

        uint256 leftover = market.totalPool;
        market.totalPool = 0;

        if (leftover > 0) {
            (bool success, ) = payable(owner()).call{value: leftover}("");
            require(success, "Transfer failed");
        }

        emit UnclaimedFundsSwept(_marketId, leftover);
    }

    /**
     * @notice Get market info
     */
    function getMarketInfo(uint256 _marketId) external view returns (
        string memory question,
        uint256 endTime,
        bool resolved,
        uint256 winningOptionIndex
    ) {
        Market storage market = markets[_marketId];
        return (market.question, market.endTime, market.resolved, market.winningOptionIndex);
    }

    /**
     * @notice Get market options
     */
    function getMarketOptions(uint256 _marketId) external view returns (string[] memory) {
        string[] memory opts = new string[](marketOptions[_marketId].length);
        for (uint256 i = 0; i < marketOptions[_marketId].length; i++) {
            opts[i] = marketOptions[_marketId][i];
        }
        return opts;
    }

    /**
     * @notice Get total shares for each option
     */
    function getMarketTotalShares(uint256 _marketId) external view returns (uint256[] memory totals) {
        uint256 optionCount = marketOptions[_marketId].length;
        totals = new uint256[](optionCount);
        for (uint256 i = 0; i < optionCount; i++) {
            totals[i] = totalSharesPerOption[_marketId][i];
        }
    }

    /**
     * @notice Get user shares
     */
    function getUserShares(uint256 _marketId, address _user) external view returns (uint256[] memory balances) {
        uint256 optionCount = marketOptions[_marketId].length;
        balances = new uint256[](optionCount);
        for (uint256 i = 0; i < optionCount; i++) {
            balances[i] = userSharesPerOption[_marketId][_user][i];
        }
    }

    /**
     * @notice Update fee BPS
     */
    function setFeeBps(uint256 _feeBps) external onlyOwner {
        require(_feeBps <= 1000, "Fee too high");
        feeBps = _feeBps;
        emit FeeUpdated(_feeBps);
    }

    /**
     * @notice Withdraw platform fees
     */
    function withdrawFees(address payable _recipient, uint256 _amount) external onlyOwner nonReentrant {
        require(_amount <= platformBalance, "Not enough fees");
        platformBalance -= _amount;

        (bool success, ) = _recipient.call{value: _amount}("");
        require(success, "Withdraw failed");

        emit FeesWithdrawn(_amount, _recipient);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ContractMetadataUnauthorized","type":"error"},{"inputs":[],"name":"OwnableUnauthorized","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"PermissionsAlreadyGranted","type":"error"},{"inputs":[{"internalType":"address","name":"expected","type":"address"},{"internalType":"address","name":"actual","type":"address"}],"name":"PermissionsInvalidPermission","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"PermissionsUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"prevURI","type":"string"},{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"ContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFeeBps","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"FeesWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"string","name":"question","type":"string"},{"indexed":false,"internalType":"string[]","name":"options","type":"string[]"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"MarketCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winningOptionIndex","type":"uint256"}],"name":"MarketResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"optionIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SharesPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnclaimedFundsSwept","type":"event"},{"inputs":[],"name":"CLAIM_GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MARKET_CREATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"batchClaimWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"uint256","name":"_optionIndex","type":"uint256"}],"name":"buyShares","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"claimWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_question","type":"string"},{"internalType":"string[]","name":"_options","type":"string[]"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"createMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"getMarketInfo","outputs":[{"internalType":"string","name":"question","type":"string"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"uint256","name":"winningOptionIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"getMarketOptions","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"getMarketTotalShares","outputs":[{"internalType":"uint256[]","name":"totals","type":"uint256[]"}],"stateMutability":"view","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":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"member","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getUserShares","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"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":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRoleWithSwitch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketOptions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"markets","outputs":[{"internalType":"string","name":"question","type":"string"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"uint256","name":"winningOptionIndex","type":"uint256"},{"internalType":"uint256","name":"claimDeadline","type":"uint256"},{"internalType":"uint256","name":"totalPool","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformBalance","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":"uint256","name":"_marketId","type":"uint256"},{"internalType":"uint256","name":"_winningOptionIndex","type":"uint256"}],"name":"resolveMarket","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":"string","name":"_uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeBps","type":"uint256"}],"name":"setFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"sweepUnclaimedFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalSharesPerOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userSharesPerOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526064600c5534801561001557600080fd5b506001805561002333610033565b61002e600033610083565b61018a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a35050565b61008d828261009b565b61009782826100f6565b5050565b60008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000828152600460205260408120805491600191906101158385610163565b9091555050600092835260046020908152604080852083865260018101835281862080546001600160a01b039096166001600160a01b03199096168617905593855260029093019052912055565b8082018082111561018457634e487b7160e01b600052601160045260246000fd5b92915050565b612a81806101996000396000f3fe6080604052600436106102045760003560e01c80638da5cb5b11610118578063ad3b1b47116100a0578063ca15c8731161006f578063ca15c8731461068a578063d547741f146106aa578063e8a3d485146106ca578063ec979082146106df578063fbc529cb146106f557600080fd5b8063ad3b1b47146105f1578063ae42820c14610611578063b1283e7714610645578063beebc5da1461067757600080fd5b80639bfc1196116100e75780639bfc11961461053e578063a217fddf1461055e578063a32fa5b314610573578063a9bcea8314610593578063ad2b69bc146105b357600080fd5b80638da5cb5b146104ac5780639010d07c146104de57806391d14854146104fe578063938e3d7b1461051e57600080fd5b80633bdfa9821161019b57806362a5dbbc1161016a57806362a5dbbc146103de578063677bd9ff146103f457806372c27b6214610414578063835dc40b14610434578063873f6f9e1461046157600080fd5b80633bdfa982146103295780633ec791931461035657806356d334041461038657806360557333146103be57600080fd5b806327536b28116101d757806327536b28146102b25780632e2106af146102d25780632f2ff15d146102e957806336568abe1461030957600080fd5b806305d45d5f1461020957806313af40351461023f578063248a9ca31461026157806324a9d8531461029c575b600080fd5b34801561021557600080fd5b5061022961022436600461228a565b610715565b6040516102369190612345565b60405180910390f35b34801561024b57600080fd5b5061025f61025a366004612374565b61086d565b005b34801561026d57600080fd5b5061028e61027c36600461228a565b60009081526003602052604090205490565b604051908152602001610236565b3480156102a857600080fd5b5061028e600c5481565b3480156102be57600080fd5b5061025f6102cd366004612391565b6108a4565b3480156102de57600080fd5b5061028e62278d0081565b3480156102f557600080fd5b5061025f610304366004612410565b610c3b565b34801561031557600080fd5b5061025f610324366004612410565b610cb8565b34801561033557600080fd5b50610349610344366004612440565b610cfc565b6040516102369190612462565b34801561036257600080fd5b5061037661037136600461228a565b610db5565b6040516102369493929190612475565b34801561039257600080fd5b5061028e6103a1366004612440565b600960209081526000928352604080842090915290825290205481565b3480156103ca57600080fd5b5061025f6103d9366004612440565b610e81565b3480156103ea57600080fd5b5061028e600d5481565b34801561040057600080fd5b5061025f61040f36600461228a565b611021565b34801561042057600080fd5b5061025f61042f36600461228a565b61134d565b34801561044057600080fd5b5061045461044f366004612410565b6113f4565b60405161023691906124a4565b34801561046d57600080fd5b5061049c61047c366004612410565b600b60209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610236565b3480156104b857600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610236565b3480156104ea57600080fd5b506104c66104f9366004612440565b6114af565b34801561050a57600080fd5b5061049c610519366004612410565b61159e565b34801561052a57600080fd5b5061025f61053936600461259c565b6115c9565b34801561054a57600080fd5b5061025f61055936600461228a565b6115fd565b34801561056a57600080fd5b5061028e600081565b34801561057f57600080fd5b5061049c61058e366004612410565b611769565b34801561059f57600080fd5b506104546105ae36600461228a565b6117bf565b3480156105bf57600080fd5b5061028e6105ce3660046125d8565b600a60209081526000938452604080852082529284528284209052825290205481565b3480156105fd57600080fd5b5061025f61060c366004612610565b611868565b34801561061d57600080fd5b5061028e7fd3065a24ad9e7725d223007135762d2902038999e3e5829146654498a58d979581565b34801561065157600080fd5b5061066561066036600461228a565b6119e3565b6040516102369695949392919061263c565b61025f610685366004612440565b611aa4565b34801561069657600080fd5b5061028e6106a536600461228a565b611cb0565b3480156106b657600080fd5b5061025f6106c5366004612410565b611d39565b3480156106d657600080fd5b50610349611d52565b3480156106eb57600080fd5b5061028e60065481565b34801561070157600080fd5b5061028e610710366004612678565b611d5f565b600081815260086020526040812054606091906001600160401b0381111561073f5761073f6124e7565b60405190808252806020026020018201604052801561077257816020015b606081526020019060019003908161075d5790505b50905060005b6000848152600860205260409020548110156108665760008481526008602052604090208054829081106107ae576107ae61277c565b9060005260206000200180546107c390612792565b80601f01602080910402602001604051908101604052809291908181526020018280546107ef90612792565b801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505050508282815181106108535761085361277c565b6020908102919091010152600101610778565b5092915050565b6000546001600160a01b03163314610898576040516316ccb9cb60e11b815260040160405180910390fd5b6108a181611f74565b50565b6002600154036108cf5760405162461bcd60e51b81526004016108c6906127c6565b60405180910390fd5b6002600181905560008481526007602052604090209081015460ff166109075760405162461bcd60e51b81526004016108c6906127fd565b8060040154421061094a5760405162461bcd60e51b815260206004820152600d60248201526c10db185a5b48195e1c1a5c9959609a1b60448201526064016108c6565b600381015460008581526009602090815260408083208484528252808320548884526008909252822054909190815b818110156109b7578481146109af5760008981526009602090815260408083208484529091529020546109ac9084612839565b92505b600101610979565b5060008084116109c85760006109e5565b836109db84670de0b6b3a764000061284c565b6109e59190612863565b905060005b87811015610c2b576000898983818110610a0657610a0661277c565b9050602002016020810190610a1b9190612374565b60008c8152600b602090815260408083206001600160a01b038516845290915290205490915060ff1615610a4f5750610c23565b60008b8152600a602090815260408083206001600160a01b038516845282528083208a845290915281205490819003610a89575050610c23565b6000670de0b6b3a7640000610a9e868461284c565b610aa89190612863565b610ab29083612839565b90506001600b60008f81526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600a60008f81526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060008b815260200190815260200160002081905550808a6005016000828254610b649190612885565b90915550506040516000906001600160a01b0385169083908381818185875af1925050503d8060008114610bb4576040519150601f19603f3d011682016040523d82523d6000602084013e610bb9565b606091505b5050905080610bda5760405162461bcd60e51b81526004016108c690612898565b836001600160a01b03168e7f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed02684604051610c1691815260200190565b60405180910390a3505050505b6001016109ea565b5050600180555050505050505050565b600082815260036020526040902054610c549033611fc4565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff1615610caa57604051636a4e0b3560e11b81526001600160a01b0382166004820152602481018390526044016108c6565b610cb48282612019565b5050565b336001600160a01b03821614610cf2576040516320b4e31160e11b81523360048201526001600160a01b03821660248201526044016108c6565b610cb4828261202d565b60086020528160005260406000208181548110610d1857600080fd5b90600052602060002001600091509150508054610d3490612792565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6090612792565b8015610dad5780601f10610d8257610100808354040283529160200191610dad565b820191906000526020600020905b815481529060010190602001808311610d9057829003601f168201915b505050505081565b60008181526007602052604081206001810154600282015460038301548354606095948594859491938493919260ff16918490610df190612792565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1d90612792565b8015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b505050505093509450945094509450509193509193565b6000546001600160a01b03163314610ec85760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b60448201526064016108c6565b6000828152600760205260409020600281015460ff1615610f1e5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c995cdbdb1d995960821b60448201526064016108c6565b6000838152600860205260409020548210610f6d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206f7574636f6d6560881b60448201526064016108c6565b6003810182905560028101805460ff19166001179055610f9062278d0042612839565b600482015560008381526008602052604081205490805b82811015610fdd576000868152600960209081526040808320848452909152902054610fd39083612839565b9150600101610fa7565b506005830181905560405184815285907f6dfc24f0f2fb42e49fb4fa3ffa8abb148cab908a1fb8335b3f128a08b2594af19060200160405180910390a25050505050565b6002600154036110435760405162461bcd60e51b81526004016108c6906127c6565b6002600181905560008281526007602052604090209081015460ff1661107b5760405162461bcd60e51b81526004016108c6906127fd565b806004015442106110be5760405162461bcd60e51b815260206004820152600d60248201526c10db185a5b48195e1c1a5c9959609a1b60448201526064016108c6565b6000828152600b6020908152604080832033845290915290205460ff161561111a5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016108c6565b60038101546000838152600a6020908152604080832033845282528083208484529091529020548061117c5760405162461bcd60e51b815260206004820152600b60248201526a4e6f2077696e6e696e677360a81b60448201526064016108c6565b60008481526009602090815260408083208584528252808320548784526008909252822054909190815b818110156111e4578581146111dc5760008881526009602090815260408083208484529091529020546111d99084612839565b92505b6001016111a6565b5060008084116111f5576000611212565b8361120884670de0b6b3a764000061284c565b6112129190612863565b90506000670de0b6b3a7640000611229838861284c565b6112339190612863565b61123d9087612839565b60008a8152600a60209081526040808320338085529083528184208c855283528184208490558d8452600b83528184209084529091528120805460ff1916600117905560058a0180549293508392909190611299908490612885565b9091555050604051600090339083908381818185875af1925050503d80600081146112e0576040519150601f19603f3d011682016040523d82523d6000602084013e6112e5565b606091505b50509050806113065760405162461bcd60e51b81526004016108c690612898565b60405182815233908b907f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0269060200160405180910390a35050600180555050505050505050565b6000546001600160a01b03163314611378576040516316ccb9cb60e11b815260040160405180910390fd5b6103e88111156113b95760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b60448201526064016108c6565b600c8190556040518181527f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c769060200160405180910390a150565b600082815260086020526040902054606090806001600160401b0381111561141e5761141e6124e7565b604051908082528060200260200182016040528015611447578160200160208202803683370190505b50915060005b818110156114a7576000858152600a602090815260408083206001600160a01b0388168452825280832084845290915290205483518490839081106114945761149461277c565b602090810291909101015260010161144d565b505092915050565b60008281526004602052604081205481805b828110156115945760008681526004602090815260408083208484526001019091529020546001600160a01b03161561153d5784820361152b5760008681526004602090815260408083209383526001909301905220546001600160a01b03169250611598915050565b611536600183612839565b9150611582565b61154886600061159e565b801561156f5750600086815260046020908152604080832083805260020190915290205481145b156115825761157f600183612839565b91505b61158d600182612839565b90506114c1565b5050505b92915050565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000546001600160a01b031633146115f457604051639f7f092560e01b815260040160405180910390fd5b6108a181612084565b60026001540361161f5760405162461bcd60e51b81526004016108c6906127c6565b6002600181905560008281526007602052604090209081015460ff166116575760405162461bcd60e51b81526004016108c6906127fd565b806004015442116116a05760405162461bcd60e51b8152602060048201526013602482015272111958591b1a5b99481b9bdd081c185cdcd959606a1b60448201526064016108c6565b6005810180546000909155801561172657600080546040516001600160a01b039091169083908381818185875af1925050503d80600081146116fe576040519150601f19603f3d011682016040523d82523d6000602084013e611703565b606091505b50509050806117245760405162461bcd60e51b81526004016108c690612898565b505b827ff4bf90035c7e096a7a037eff84fb48fb9368cad4918e30fa4b0dae33461a93578260405161175891815260200190565b60405180910390a250506001805550565b600082815260026020908152604080832083805290915281205460ff166117b6575060008281526002602090815260408083206001600160a01b038516845290915290205460ff16611598565b50600192915050565b600081815260086020526040902054606090806001600160401b038111156117e9576117e96124e7565b604051908082528060200260200182016040528015611812578160200160208202803683370190505b50915060005b81811015611861576000848152600960209081526040808320848452909152902054835184908390811061184e5761184e61277c565b6020908102919091010152600101611818565b5050919050565b6000546001600160a01b03163314611893576040516316ccb9cb60e11b815260040160405180910390fd5b6002600154036118b55760405162461bcd60e51b81526004016108c6906127c6565b6002600155600d548111156118fe5760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768206665657360881b60448201526064016108c6565b80600d60008282546119109190612885565b90915550506040516000906001600160a01b0384169083908381818185875af1925050503d8060008114611960576040519150601f19603f3d011682016040523d82523d6000602084013e611965565b606091505b50509050806119a85760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016108c6565b826001600160a01b03167f812bcf6853ebc81dc0a1d2323893eedad6cd086a4398311a699e0a7acdf187b38360405161175891815260200190565b6007602052600090815260409020805481906119fe90612792565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2a90612792565b8015611a775780601f10611a4c57610100808354040283529160200191611a77565b820191906000526020600020905b815481529060010190602001808311611a5a57829003601f168201915b50505060018401546002850154600386015460048701546005909701549596929560ff9092169450925086565b600082815260076020526040902060018101544210611af45760405162461bcd60e51b815260206004820152600c60248201526b13585c9ad95d08195b99195960a21b60448201526064016108c6565b600281015460ff1615611b3b5760405162461bcd60e51b815260206004820152600f60248201526e13585c9ad95d081c995cdbdb1d9959608a1b60448201526064016108c6565b6000838152600860205260409020548210611b895760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21037b83a34b7b760911b60448201526064016108c6565b60003411611bc45760405162461bcd60e51b81526020600482015260086024820152674e6f2066756e647360c01b60448201526064016108c6565b6000612710600c5434611bd7919061284c565b611be19190612863565b90506000611bef8234612885565b905081600d6000828254611c039190612839565b90915550506000858152600a60209081526040808320338452825280832087845290915281208054839290611c39908490612839565b9091555050600085815260096020908152604080832087845290915281208054839290611c67908490612839565b90915550506040805185815260208101839052339187917fce81571c08c76465bdf390ad1abe80af8c51c6c4566e3485f9395f13d5ad6328910160405180910390a35050505050565b600081815260046020526040812054815b81811015611d145760008481526004602090815260408083208484526001019091529020546001600160a01b031615611d0257611cff600184612839565b92505b611d0d600182612839565b9050611cc1565b50611d2083600061159e565b15611d3357611d30600183612839565b91505b50919050565b600082815260036020526040902054610cf29033611fc4565b60058054610d3490612792565b600080546001600160a01b0316331480611d9e5750611d9e7fd3065a24ad9e7725d223007135762d2902038999e3e5829146654498a58d97953361159e565b611ddb5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b60448201526064016108c6565b60008211611e2b5760405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d75737420626520706f7369746976650000000000000060448201526064016108c6565b600283511015611e755760405162461bcd60e51b81526020600482015260156024820152744174206c656173742074776f206f7574636f6d657360581b60448201526064016108c6565b6006805460009182611e86836128c1565b90915550600081815260076020526040902090915080611ea68782612929565b50611eb18442612839565b600182015560028101805460ff19169055600019600382015560005b8551811015611f2a5760008381526008602052604090208651879083908110611ef857611ef861277c565b60209081029190910181015182546001810184556000938452919092200190611f219082612929565b50600101611ecd565b50817fdb6ae5c511cd814e8b6d7dd1f64d32f3bd488e4361486cdcfa2e2debaeddca8787878460010154604051611f63939291906129e7565b60405180910390a250949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a35050565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff16610cb45760405163043c588360e11b81526001600160a01b0382166004820152602481018390526044016108c6565b6120238282612160565b610cb482826121bb565b6120378282612228565b60008281526004602090815260408083206001600160a01b03851680855260028201808552838620805487526001909301855292852080546001600160a01b031916905584529152555050565b60006005805461209390612792565b80601f01602080910402602001604051908101604052809291908181526020018280546120bf90612792565b801561210c5780601f106120e15761010080835404028352916020019161210c565b820191906000526020600020905b8154815290600101906020018083116120ef57829003601f168201915b5050505050905081600590816121229190612929565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051612154929190612a1d565b60405180910390a15050565b60008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000828152600460205260408120805491600191906121da8385612839565b9091555050600092835260046020908152604080852083865260018101835281862080546001600160a01b039096166001600160a01b03199096168617905593855260029093019052912055565b6122328282611fc4565b60008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006020828403121561229c57600080fd5b5035919050565b6000815180845260005b818110156122c9576020818501810151868301820152016122ad565b506000602082860101526020601f19601f83011685010191505092915050565b600082825180855260208501945060208160051b8301016020850160005b8381101561233957601f198584030188526123238383516122a3565b6020988901989093509190910190600101612307565b50909695505050505050565b60208152600061235860208301846122e9565b9392505050565b6001600160a01b03811681146108a157600080fd5b60006020828403121561238657600080fd5b81356123588161235f565b6000806000604084860312156123a657600080fd5b8335925060208401356001600160401b038111156123c357600080fd5b8401601f810186136123d457600080fd5b80356001600160401b038111156123ea57600080fd5b8660208260051b84010111156123ff57600080fd5b939660209190910195509293505050565b6000806040838503121561242357600080fd5b8235915060208301356124358161235f565b809150509250929050565b6000806040838503121561245357600080fd5b50508035926020909101359150565b60208152600061235860208301846122a3565b60808152600061248860808301876122a3565b6020830195909552509115156040830152606090910152919050565b602080825282518282018190526000918401906040840190835b818110156124dc5783518352602093840193909201916001016124be565b509095945050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612525576125256124e7565b604052919050565b600082601f83011261253e57600080fd5b81356001600160401b03811115612557576125576124e7565b61256a601f8201601f19166020016124fd565b81815284602083860101111561257f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156125ae57600080fd5b81356001600160401b038111156125c457600080fd5b6125d08482850161252d565b949350505050565b6000806000606084860312156125ed57600080fd5b8335925060208401356125ff8161235f565b929592945050506040919091013590565b6000806040838503121561262357600080fd5b823561262e8161235f565b946020939093013593505050565b60c08152600061264f60c08301896122a3565b60208301979097525093151560408501526060840192909252608083015260a090910152919050565b60008060006060848603121561268d57600080fd5b83356001600160401b038111156126a357600080fd5b6126af8682870161252d565b93505060208401356001600160401b038111156126cb57600080fd5b8401601f810186136126dc57600080fd5b80356001600160401b038111156126f5576126f56124e7565b8060051b612705602082016124fd565b9182526020818401810192908101908984111561272157600080fd5b6020850192505b838310156127675782356001600160401b0381111561274657600080fd5b6127558b60208389010161252d565b83525060209283019290910190612728565b96999698505050506040949094013593505050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806127a657607f821691505b602082108103611d3357634e487b7160e01b600052602260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600c908201526b139bdd081c995cdbdb1d995960a21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561159857611598612823565b808202811582820484141761159857611598612823565b60008261288057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561159857611598612823565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b6000600182016128d3576128d3612823565b5060010190565b601f82111561292457806000526020600020601f840160051c810160208510156129015750805b601f840160051c820191505b81811015612921576000815560010161290d565b50505b505050565b81516001600160401b03811115612942576129426124e7565b612956816129508454612792565b846128da565b6020601f82116001811461298a57600083156129725750848201515b600019600385901b1c1916600184901b178455612921565b600084815260208120601f198516915b828110156129ba578785015182556020948501946001909201910161299a565b50848210156129d85786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6060815260006129fa60608301866122a3565b8281036020840152612a0c81866122e9565b915050826040830152949350505050565b604081526000612a3060408301856122a3565b8281036020840152612a4281856122a3565b9594505050505056fea264697066735822122062168fffb4b3c93877e968c36b4d650e7ea8d0c1577ff5bfb9a1cac66ddcfa4664736f6c634300081a0033

Deployed Bytecode

0x6080604052600436106102045760003560e01c80638da5cb5b11610118578063ad3b1b47116100a0578063ca15c8731161006f578063ca15c8731461068a578063d547741f146106aa578063e8a3d485146106ca578063ec979082146106df578063fbc529cb146106f557600080fd5b8063ad3b1b47146105f1578063ae42820c14610611578063b1283e7714610645578063beebc5da1461067757600080fd5b80639bfc1196116100e75780639bfc11961461053e578063a217fddf1461055e578063a32fa5b314610573578063a9bcea8314610593578063ad2b69bc146105b357600080fd5b80638da5cb5b146104ac5780639010d07c146104de57806391d14854146104fe578063938e3d7b1461051e57600080fd5b80633bdfa9821161019b57806362a5dbbc1161016a57806362a5dbbc146103de578063677bd9ff146103f457806372c27b6214610414578063835dc40b14610434578063873f6f9e1461046157600080fd5b80633bdfa982146103295780633ec791931461035657806356d334041461038657806360557333146103be57600080fd5b806327536b28116101d757806327536b28146102b25780632e2106af146102d25780632f2ff15d146102e957806336568abe1461030957600080fd5b806305d45d5f1461020957806313af40351461023f578063248a9ca31461026157806324a9d8531461029c575b600080fd5b34801561021557600080fd5b5061022961022436600461228a565b610715565b6040516102369190612345565b60405180910390f35b34801561024b57600080fd5b5061025f61025a366004612374565b61086d565b005b34801561026d57600080fd5b5061028e61027c36600461228a565b60009081526003602052604090205490565b604051908152602001610236565b3480156102a857600080fd5b5061028e600c5481565b3480156102be57600080fd5b5061025f6102cd366004612391565b6108a4565b3480156102de57600080fd5b5061028e62278d0081565b3480156102f557600080fd5b5061025f610304366004612410565b610c3b565b34801561031557600080fd5b5061025f610324366004612410565b610cb8565b34801561033557600080fd5b50610349610344366004612440565b610cfc565b6040516102369190612462565b34801561036257600080fd5b5061037661037136600461228a565b610db5565b6040516102369493929190612475565b34801561039257600080fd5b5061028e6103a1366004612440565b600960209081526000928352604080842090915290825290205481565b3480156103ca57600080fd5b5061025f6103d9366004612440565b610e81565b3480156103ea57600080fd5b5061028e600d5481565b34801561040057600080fd5b5061025f61040f36600461228a565b611021565b34801561042057600080fd5b5061025f61042f36600461228a565b61134d565b34801561044057600080fd5b5061045461044f366004612410565b6113f4565b60405161023691906124a4565b34801561046d57600080fd5b5061049c61047c366004612410565b600b60209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610236565b3480156104b857600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610236565b3480156104ea57600080fd5b506104c66104f9366004612440565b6114af565b34801561050a57600080fd5b5061049c610519366004612410565b61159e565b34801561052a57600080fd5b5061025f61053936600461259c565b6115c9565b34801561054a57600080fd5b5061025f61055936600461228a565b6115fd565b34801561056a57600080fd5b5061028e600081565b34801561057f57600080fd5b5061049c61058e366004612410565b611769565b34801561059f57600080fd5b506104546105ae36600461228a565b6117bf565b3480156105bf57600080fd5b5061028e6105ce3660046125d8565b600a60209081526000938452604080852082529284528284209052825290205481565b3480156105fd57600080fd5b5061025f61060c366004612610565b611868565b34801561061d57600080fd5b5061028e7fd3065a24ad9e7725d223007135762d2902038999e3e5829146654498a58d979581565b34801561065157600080fd5b5061066561066036600461228a565b6119e3565b6040516102369695949392919061263c565b61025f610685366004612440565b611aa4565b34801561069657600080fd5b5061028e6106a536600461228a565b611cb0565b3480156106b657600080fd5b5061025f6106c5366004612410565b611d39565b3480156106d657600080fd5b50610349611d52565b3480156106eb57600080fd5b5061028e60065481565b34801561070157600080fd5b5061028e610710366004612678565b611d5f565b600081815260086020526040812054606091906001600160401b0381111561073f5761073f6124e7565b60405190808252806020026020018201604052801561077257816020015b606081526020019060019003908161075d5790505b50905060005b6000848152600860205260409020548110156108665760008481526008602052604090208054829081106107ae576107ae61277c565b9060005260206000200180546107c390612792565b80601f01602080910402602001604051908101604052809291908181526020018280546107ef90612792565b801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505050508282815181106108535761085361277c565b6020908102919091010152600101610778565b5092915050565b6000546001600160a01b03163314610898576040516316ccb9cb60e11b815260040160405180910390fd5b6108a181611f74565b50565b6002600154036108cf5760405162461bcd60e51b81526004016108c6906127c6565b60405180910390fd5b6002600181905560008481526007602052604090209081015460ff166109075760405162461bcd60e51b81526004016108c6906127fd565b8060040154421061094a5760405162461bcd60e51b815260206004820152600d60248201526c10db185a5b48195e1c1a5c9959609a1b60448201526064016108c6565b600381015460008581526009602090815260408083208484528252808320548884526008909252822054909190815b818110156109b7578481146109af5760008981526009602090815260408083208484529091529020546109ac9084612839565b92505b600101610979565b5060008084116109c85760006109e5565b836109db84670de0b6b3a764000061284c565b6109e59190612863565b905060005b87811015610c2b576000898983818110610a0657610a0661277c565b9050602002016020810190610a1b9190612374565b60008c8152600b602090815260408083206001600160a01b038516845290915290205490915060ff1615610a4f5750610c23565b60008b8152600a602090815260408083206001600160a01b038516845282528083208a845290915281205490819003610a89575050610c23565b6000670de0b6b3a7640000610a9e868461284c565b610aa89190612863565b610ab29083612839565b90506001600b60008f81526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600a60008f81526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060008b815260200190815260200160002081905550808a6005016000828254610b649190612885565b90915550506040516000906001600160a01b0385169083908381818185875af1925050503d8060008114610bb4576040519150601f19603f3d011682016040523d82523d6000602084013e610bb9565b606091505b5050905080610bda5760405162461bcd60e51b81526004016108c690612898565b836001600160a01b03168e7f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed02684604051610c1691815260200190565b60405180910390a3505050505b6001016109ea565b5050600180555050505050505050565b600082815260036020526040902054610c549033611fc4565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff1615610caa57604051636a4e0b3560e11b81526001600160a01b0382166004820152602481018390526044016108c6565b610cb48282612019565b5050565b336001600160a01b03821614610cf2576040516320b4e31160e11b81523360048201526001600160a01b03821660248201526044016108c6565b610cb4828261202d565b60086020528160005260406000208181548110610d1857600080fd5b90600052602060002001600091509150508054610d3490612792565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6090612792565b8015610dad5780601f10610d8257610100808354040283529160200191610dad565b820191906000526020600020905b815481529060010190602001808311610d9057829003601f168201915b505050505081565b60008181526007602052604081206001810154600282015460038301548354606095948594859491938493919260ff16918490610df190612792565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1d90612792565b8015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b505050505093509450945094509450509193509193565b6000546001600160a01b03163314610ec85760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b60448201526064016108c6565b6000828152600760205260409020600281015460ff1615610f1e5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c995cdbdb1d995960821b60448201526064016108c6565b6000838152600860205260409020548210610f6d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206f7574636f6d6560881b60448201526064016108c6565b6003810182905560028101805460ff19166001179055610f9062278d0042612839565b600482015560008381526008602052604081205490805b82811015610fdd576000868152600960209081526040808320848452909152902054610fd39083612839565b9150600101610fa7565b506005830181905560405184815285907f6dfc24f0f2fb42e49fb4fa3ffa8abb148cab908a1fb8335b3f128a08b2594af19060200160405180910390a25050505050565b6002600154036110435760405162461bcd60e51b81526004016108c6906127c6565b6002600181905560008281526007602052604090209081015460ff1661107b5760405162461bcd60e51b81526004016108c6906127fd565b806004015442106110be5760405162461bcd60e51b815260206004820152600d60248201526c10db185a5b48195e1c1a5c9959609a1b60448201526064016108c6565b6000828152600b6020908152604080832033845290915290205460ff161561111a5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016108c6565b60038101546000838152600a6020908152604080832033845282528083208484529091529020548061117c5760405162461bcd60e51b815260206004820152600b60248201526a4e6f2077696e6e696e677360a81b60448201526064016108c6565b60008481526009602090815260408083208584528252808320548784526008909252822054909190815b818110156111e4578581146111dc5760008881526009602090815260408083208484529091529020546111d99084612839565b92505b6001016111a6565b5060008084116111f5576000611212565b8361120884670de0b6b3a764000061284c565b6112129190612863565b90506000670de0b6b3a7640000611229838861284c565b6112339190612863565b61123d9087612839565b60008a8152600a60209081526040808320338085529083528184208c855283528184208490558d8452600b83528184209084529091528120805460ff1916600117905560058a0180549293508392909190611299908490612885565b9091555050604051600090339083908381818185875af1925050503d80600081146112e0576040519150601f19603f3d011682016040523d82523d6000602084013e6112e5565b606091505b50509050806113065760405162461bcd60e51b81526004016108c690612898565b60405182815233908b907f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0269060200160405180910390a35050600180555050505050505050565b6000546001600160a01b03163314611378576040516316ccb9cb60e11b815260040160405180910390fd5b6103e88111156113b95760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b60448201526064016108c6565b600c8190556040518181527f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c769060200160405180910390a150565b600082815260086020526040902054606090806001600160401b0381111561141e5761141e6124e7565b604051908082528060200260200182016040528015611447578160200160208202803683370190505b50915060005b818110156114a7576000858152600a602090815260408083206001600160a01b0388168452825280832084845290915290205483518490839081106114945761149461277c565b602090810291909101015260010161144d565b505092915050565b60008281526004602052604081205481805b828110156115945760008681526004602090815260408083208484526001019091529020546001600160a01b03161561153d5784820361152b5760008681526004602090815260408083209383526001909301905220546001600160a01b03169250611598915050565b611536600183612839565b9150611582565b61154886600061159e565b801561156f5750600086815260046020908152604080832083805260020190915290205481145b156115825761157f600183612839565b91505b61158d600182612839565b90506114c1565b5050505b92915050565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000546001600160a01b031633146115f457604051639f7f092560e01b815260040160405180910390fd5b6108a181612084565b60026001540361161f5760405162461bcd60e51b81526004016108c6906127c6565b6002600181905560008281526007602052604090209081015460ff166116575760405162461bcd60e51b81526004016108c6906127fd565b806004015442116116a05760405162461bcd60e51b8152602060048201526013602482015272111958591b1a5b99481b9bdd081c185cdcd959606a1b60448201526064016108c6565b6005810180546000909155801561172657600080546040516001600160a01b039091169083908381818185875af1925050503d80600081146116fe576040519150601f19603f3d011682016040523d82523d6000602084013e611703565b606091505b50509050806117245760405162461bcd60e51b81526004016108c690612898565b505b827ff4bf90035c7e096a7a037eff84fb48fb9368cad4918e30fa4b0dae33461a93578260405161175891815260200190565b60405180910390a250506001805550565b600082815260026020908152604080832083805290915281205460ff166117b6575060008281526002602090815260408083206001600160a01b038516845290915290205460ff16611598565b50600192915050565b600081815260086020526040902054606090806001600160401b038111156117e9576117e96124e7565b604051908082528060200260200182016040528015611812578160200160208202803683370190505b50915060005b81811015611861576000848152600960209081526040808320848452909152902054835184908390811061184e5761184e61277c565b6020908102919091010152600101611818565b5050919050565b6000546001600160a01b03163314611893576040516316ccb9cb60e11b815260040160405180910390fd5b6002600154036118b55760405162461bcd60e51b81526004016108c6906127c6565b6002600155600d548111156118fe5760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768206665657360881b60448201526064016108c6565b80600d60008282546119109190612885565b90915550506040516000906001600160a01b0384169083908381818185875af1925050503d8060008114611960576040519150601f19603f3d011682016040523d82523d6000602084013e611965565b606091505b50509050806119a85760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016108c6565b826001600160a01b03167f812bcf6853ebc81dc0a1d2323893eedad6cd086a4398311a699e0a7acdf187b38360405161175891815260200190565b6007602052600090815260409020805481906119fe90612792565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2a90612792565b8015611a775780601f10611a4c57610100808354040283529160200191611a77565b820191906000526020600020905b815481529060010190602001808311611a5a57829003601f168201915b50505060018401546002850154600386015460048701546005909701549596929560ff9092169450925086565b600082815260076020526040902060018101544210611af45760405162461bcd60e51b815260206004820152600c60248201526b13585c9ad95d08195b99195960a21b60448201526064016108c6565b600281015460ff1615611b3b5760405162461bcd60e51b815260206004820152600f60248201526e13585c9ad95d081c995cdbdb1d9959608a1b60448201526064016108c6565b6000838152600860205260409020548210611b895760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21037b83a34b7b760911b60448201526064016108c6565b60003411611bc45760405162461bcd60e51b81526020600482015260086024820152674e6f2066756e647360c01b60448201526064016108c6565b6000612710600c5434611bd7919061284c565b611be19190612863565b90506000611bef8234612885565b905081600d6000828254611c039190612839565b90915550506000858152600a60209081526040808320338452825280832087845290915281208054839290611c39908490612839565b9091555050600085815260096020908152604080832087845290915281208054839290611c67908490612839565b90915550506040805185815260208101839052339187917fce81571c08c76465bdf390ad1abe80af8c51c6c4566e3485f9395f13d5ad6328910160405180910390a35050505050565b600081815260046020526040812054815b81811015611d145760008481526004602090815260408083208484526001019091529020546001600160a01b031615611d0257611cff600184612839565b92505b611d0d600182612839565b9050611cc1565b50611d2083600061159e565b15611d3357611d30600183612839565b91505b50919050565b600082815260036020526040902054610cf29033611fc4565b60058054610d3490612792565b600080546001600160a01b0316331480611d9e5750611d9e7fd3065a24ad9e7725d223007135762d2902038999e3e5829146654498a58d97953361159e565b611ddb5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b60448201526064016108c6565b60008211611e2b5760405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d75737420626520706f7369746976650000000000000060448201526064016108c6565b600283511015611e755760405162461bcd60e51b81526020600482015260156024820152744174206c656173742074776f206f7574636f6d657360581b60448201526064016108c6565b6006805460009182611e86836128c1565b90915550600081815260076020526040902090915080611ea68782612929565b50611eb18442612839565b600182015560028101805460ff19169055600019600382015560005b8551811015611f2a5760008381526008602052604090208651879083908110611ef857611ef861277c565b60209081029190910181015182546001810184556000938452919092200190611f219082612929565b50600101611ecd565b50817fdb6ae5c511cd814e8b6d7dd1f64d32f3bd488e4361486cdcfa2e2debaeddca8787878460010154604051611f63939291906129e7565b60405180910390a250949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a35050565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff16610cb45760405163043c588360e11b81526001600160a01b0382166004820152602481018390526044016108c6565b6120238282612160565b610cb482826121bb565b6120378282612228565b60008281526004602090815260408083206001600160a01b03851680855260028201808552838620805487526001909301855292852080546001600160a01b031916905584529152555050565b60006005805461209390612792565b80601f01602080910402602001604051908101604052809291908181526020018280546120bf90612792565b801561210c5780601f106120e15761010080835404028352916020019161210c565b820191906000526020600020905b8154815290600101906020018083116120ef57829003601f168201915b5050505050905081600590816121229190612929565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051612154929190612a1d565b60405180910390a15050565b60008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000828152600460205260408120805491600191906121da8385612839565b9091555050600092835260046020908152604080852083865260018101835281862080546001600160a01b039096166001600160a01b03199096168617905593855260029093019052912055565b6122328282611fc4565b60008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006020828403121561229c57600080fd5b5035919050565b6000815180845260005b818110156122c9576020818501810151868301820152016122ad565b506000602082860101526020601f19601f83011685010191505092915050565b600082825180855260208501945060208160051b8301016020850160005b8381101561233957601f198584030188526123238383516122a3565b6020988901989093509190910190600101612307565b50909695505050505050565b60208152600061235860208301846122e9565b9392505050565b6001600160a01b03811681146108a157600080fd5b60006020828403121561238657600080fd5b81356123588161235f565b6000806000604084860312156123a657600080fd5b8335925060208401356001600160401b038111156123c357600080fd5b8401601f810186136123d457600080fd5b80356001600160401b038111156123ea57600080fd5b8660208260051b84010111156123ff57600080fd5b939660209190910195509293505050565b6000806040838503121561242357600080fd5b8235915060208301356124358161235f565b809150509250929050565b6000806040838503121561245357600080fd5b50508035926020909101359150565b60208152600061235860208301846122a3565b60808152600061248860808301876122a3565b6020830195909552509115156040830152606090910152919050565b602080825282518282018190526000918401906040840190835b818110156124dc5783518352602093840193909201916001016124be565b509095945050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612525576125256124e7565b604052919050565b600082601f83011261253e57600080fd5b81356001600160401b03811115612557576125576124e7565b61256a601f8201601f19166020016124fd565b81815284602083860101111561257f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156125ae57600080fd5b81356001600160401b038111156125c457600080fd5b6125d08482850161252d565b949350505050565b6000806000606084860312156125ed57600080fd5b8335925060208401356125ff8161235f565b929592945050506040919091013590565b6000806040838503121561262357600080fd5b823561262e8161235f565b946020939093013593505050565b60c08152600061264f60c08301896122a3565b60208301979097525093151560408501526060840192909252608083015260a090910152919050565b60008060006060848603121561268d57600080fd5b83356001600160401b038111156126a357600080fd5b6126af8682870161252d565b93505060208401356001600160401b038111156126cb57600080fd5b8401601f810186136126dc57600080fd5b80356001600160401b038111156126f5576126f56124e7565b8060051b612705602082016124fd565b9182526020818401810192908101908984111561272157600080fd5b6020850192505b838310156127675782356001600160401b0381111561274657600080fd5b6127558b60208389010161252d565b83525060209283019290910190612728565b96999698505050506040949094013593505050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806127a657607f821691505b602082108103611d3357634e487b7160e01b600052602260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600c908201526b139bdd081c995cdbdb1d995960a21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561159857611598612823565b808202811582820484141761159857611598612823565b60008261288057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561159857611598612823565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b6000600182016128d3576128d3612823565b5060010190565b601f82111561292457806000526020600020601f840160051c810160208510156129015750805b601f840160051c820191505b81811015612921576000815560010161290d565b50505b505050565b81516001600160401b03811115612942576129426124e7565b612956816129508454612792565b846128da565b6020601f82116001811461298a57600083156129725750848201515b600019600385901b1c1916600184901b178455612921565b600084815260208120601f198516915b828110156129ba578785015182556020948501946001909201910161299a565b50848210156129d85786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6060815260006129fa60608301866122a3565b8281036020840152612a0c81866122e9565b915050826040830152949350505050565b604081526000612a3060408301856122a3565b8281036020840152612a4281856122a3565b9594505050505056fea264697066735822122062168fffb4b3c93877e968c36b4d650e7ea8d0c1577ff5bfb9a1cac66ddcfa4664736f6c634300081a0033

Deployed Bytecode Sourcemap

29479:11112:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38753:330;;;;;;;;;;-1:-1:-1;38753:330:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2120:182;;;;;;;;;;-1:-1:-1;2120:182:0;;;;;:::i;:::-;;:::i;:::-;;16092:122;;;;;;;;;;-1:-1:-1;16092:122:0;;;;;:::i;:::-;16160:7;16187:19;;;:13;:19;;;;;;;16092:122;;;;2284:25:1;;;2272:2;2257:18;16092:122:0;2138:177:1;30583:27:0;;;;;;;;;;;;;;;;36104:1529;;;;;;;;;;-1:-1:-1;36104:1529:0;;;;;:::i;:::-;;:::i;30751:52::-;;;;;;;;;;;;30796:7;30751:52;;16619:285;;;;;;;;;;-1:-1:-1;16619:285:0;;;;;:::i;:::-;;:::i;17867:242::-;;;;;;;;;;-1:-1:-1;17867:242:0;;;;;:::i;:::-;;:::i;30181:49::-;;;;;;;;;;-1:-1:-1;30181:49:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38344:348::-;;;;;;;;;;-1:-1:-1;38344:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;30237:75::-;;;;;;;;;;-1:-1:-1;30237:75:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;33730:834;;;;;;;;;;-1:-1:-1;33730:834:0;;;;;:::i;:::-;;:::i;30631:30::-;;;;;;;;;;;;;;;;34621:1410;;;;;;;;;;-1:-1:-1;34621:1410:0;;;;;:::i;:::-;;:::i;39973:176::-;;;;;;;;;;-1:-1:-1;39973:176:0;;;;;:::i;:::-;;:::i;39556:360::-;;;;;;;;;;-1:-1:-1;39556:360:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30473:62::-;;;;;;;;;;-1:-1:-1;30473:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5782:14:1;;5775:22;5757:41;;5745:2;5730:18;30473:62:0;5617:187:1;1850:88:0;;;;;;;;;;-1:-1:-1;1897:7:0;1924:6;-1:-1:-1;;;;;1924:6:0;1850:88;;;-1:-1:-1;;;;;5973:32:1;;;5955:51;;5943:2;5928:18;1850:88:0;5809:203:1;25086:648:0;;;;;;;;;;-1:-1:-1;25086:648:0;;;;;:::i;:::-;;:::i;14643:133::-;;;;;;;;;;-1:-1:-1;14643:133:0;;;;;:::i;:::-;;:::i;21561:207::-;;;;;;;;;;-1:-1:-1;21561:207:0;;;;;:::i;:::-;;:::i;37718:568::-;;;;;;;;;;-1:-1:-1;37718:568:0;;;;;:::i;:::-;;:::i;14046:49::-;;;;;;;;;;-1:-1:-1;14046:49:0;14091:4;14046:49;;15543:217;;;;;;;;;;-1:-1:-1;15543:217:0;;;;;:::i;:::-;;:::i;39158:340::-;;;;;;;;;;-1:-1:-1;39158:340:0;;;;;:::i;:::-;;:::i;30355:94::-;;;;;;;;;;-1:-1:-1;30355:94:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40214:374;;;;;;;;;;-1:-1:-1;40214:374:0;;;;;:::i;:::-;;:::i;29991:78::-;;;;;;;;;;;;30037:32;29991:78;;30111:41;;;;;;;;;;-1:-1:-1;30111:41:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;32897:774::-;;;;;;:::i;:::-;;:::i;26152:409::-;;;;;;;;;;-1:-1:-1;26152:409:0;;;;;:::i;:::-;;:::i;17285:174::-;;;;;;;;;;-1:-1:-1;17285:174:0;;;;;:::i;:::-;;:::i;21113:34::-;;;;;;;;;;;;;:::i;30078:26::-;;;;;;;;;;;;;;;;31921:903;;;;;;;;;;-1:-1:-1;31921:903:0;;;;;:::i;:::-;;:::i;38753:330::-;38849:20;38885:24;;;:13;:24;;;;;:31;38821:15;;38849:20;-1:-1:-1;;;;;38872:45:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38849:68;;38933:9;38928:126;38952:24;;;;:13;:24;;;;;:31;38948:35;;38928:126;;;39015:24;;;;:13;:24;;;;;:27;;39040:1;;39015:27;;;;;;:::i;:::-;;;;;;;;39005:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;39010:1;39005:7;;;;;;;;:::i;:::-;;;;;;;;;;:37;38985:3;;38928:126;;;-1:-1:-1;39071:4:0;38753:330;-1:-1:-1;;38753:330:0:o;2120:182::-;31610:4;1924:6;-1:-1:-1;;;;;1924:6:0;31634:10;:21;2186:76;;2229:21;;-1:-1:-1;;;2229:21:0;;;;;;;;;;;2186:76;2272:22;2284:9;2272:11;:22::i;:::-;2120:182;:::o;36104:1529::-;28069:1;28385:7;;:19;28377:63;;;;-1:-1:-1;;;28377:63:0;;;;;;;:::i;:::-;;;;;;;;;28069:1;28518:7;:18;;;36211:21:::1;36235:18:::0;;;:7:::1;:18;::::0;;;;36272:15;;::::1;::::0;::::1;;36264:40;;;;-1:-1:-1::0;;;36264:40:0::1;;;;;;;:::i;:::-;36341:6;:20;;;36323:15;:38;36315:64;;;::::0;-1:-1:-1;;;36315:64:0;;11995:2:1;36315:64:0::1;::::0;::::1;11977:21:1::0;12034:2;12014:18;;;12007:30;-1:-1:-1;;;12053:18:1;;;12046:43;12106:18;;36315:64:0::1;11793:337:1::0;36315:64:0::1;36416:25;::::0;::::1;::::0;36392:21:::1;36476:31:::0;;;:20:::1;:31;::::0;;;;;;;:46;;;;;;;;;36590:24;;;:13:::1;:24:::0;;;;;:31;36476:46;;36392:21;;36632:177:::1;36656:11;36652:1;:15;36632:177;;;36698:13;36693:1;:18;36689:109;;36748:31;::::0;;;:20:::1;:31;::::0;;;;;;;:34;;;;;;;;;36732:50:::1;::::0;;::::1;:::i;:::-;;;36689:109;36669:3;;36632:177;;;;36821:19;36859:1:::0;36843:13:::1;:17;:61;;36903:1;36843:61;;;36887:13:::0;36864:19:::1;:12:::0;36879:4:::1;36864:19;:::i;:::-;36863:37;;;;:::i;:::-;36821:83;;36922:9;36917:709;36937:17:::0;;::::1;36917:709;;;36976:12;36991:6;;36998:1;36991:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;37019:21;::::0;;;:10:::1;:21;::::0;;;;;;;-1:-1:-1;;;;;37019:27:0;::::1;::::0;;;;;;;;36976:24;;-1:-1:-1;37019:27:0::1;;37015:41;;;37048:8;;;37015:41;37073:18;37094:30:::0;;;:19:::1;:30;::::0;;;;;;;-1:-1:-1;;;;;37094:36:0;::::1;::::0;;;;;;;:51;;;;;;;;;;37164:15;;;37160:29:::1;;37181:8;;;;37160:29;37206:16;37267:4;37239:24;37252:11:::0;37239:10;:24:::1;:::i;:::-;37238:33;;;;:::i;:::-;37225:46;::::0;:10;:46:::1;:::i;:::-;37206:65;;37316:4;37286:10;:21;37297:9;37286:21;;;;;;;;;;;:27;37308:4;-1:-1:-1::0;;;;;37286:27:0::1;-1:-1:-1::0;;;;;37286:27:0::1;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;37389:1;37335:19;:30;37355:9;37335:30;;;;;;;;;;;:36;37366:4;-1:-1:-1::0;;;;;37335:36:0::1;-1:-1:-1::0;;;;;37335:36:0::1;;;;;;;;;;;;:51;37372:13;37335:51;;;;;;;;;;;:55;;;;37427:8;37407:6;:16;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37471:39:0::1;::::0;37453:12:::1;::::0;-1:-1:-1;;;;;37471:18:0;::::1;::::0;37497:8;;37453:12;37471:39;37453:12;37471:39;37497:8;37471:18;:39:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37452:58;;;37533:7;37525:35;;;;-1:-1:-1::0;;;37525:35:0::1;;;;;;;:::i;:::-;37599:4;-1:-1:-1::0;;;;;37580:34:0::1;37588:9;37580:34;37605:8;37580:34;;;;2284:25:1::0;;2272:2;2257:18;;2138:177;37580:34:0::1;;;;;;;;36961:665;;;;36917:709;36956:3;;36917:709;;;-1:-1:-1::0;;28025:1:0;28697:22;;-1:-1:-1;;;;;;;;36104:1529:0:o;16619:285::-;16715:19;;;;:13;:19;;;;;;16704:43;;16736:10;16704;:43::i;:::-;16762:14;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;16762:23:0;;;;;;;;;;;;16758:103;;;16809:40;;-1:-1:-1;;;16809:40:0;;-1:-1:-1;;;;;13671:32:1;;16809:40:0;;;13653:51:1;13720:18;;;13713:34;;;13626:18;;16809:40:0;13479:274:1;16758:103:0;16871:25;16882:4;16888:7;16871:10;:25::i;:::-;16619:285;;:::o;17867:242::-;17959:10;-1:-1:-1;;;;;17959:21:0;;;17955:110;;18004:49;;-1:-1:-1;;;18004:49:0;;18033:10;18004:49;;;13932:51:1;-1:-1:-1;;;;;14019:32:1;;13999:18;;;13992:60;13905:18;;18004:49:0;13758:300:1;17955:110:0;18075:26;18087:4;18093:7;18075:11;:26::i;30181:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38344:348::-;38452:15;38571:18;;;:7;:18;;;;;38625:14;;;;38641:15;;;;38658:25;;;;38600:84;;38419:22;;38452:15;;;;;38571:18;;;;38625:14;;38641:15;;;38571:18;;38600:84;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38344:348;;;;;:::o;33730:834::-;1897:7;1924:6;-1:-1:-1;;;;;1924:6:0;33829:10;:21;33821:44;;;;-1:-1:-1;;;33821:44:0;;14265:2:1;33821:44:0;;;14247:21:1;14304:2;14284:18;;;14277:30;-1:-1:-1;;;14323:18:1;;;14316:40;14373:18;;33821:44:0;14063:334:1;33821:44:0;33876:21;33900:18;;;:7;:18;;;;;33938:15;;;;;;33937:16;33929:45;;;;-1:-1:-1;;;33929:45:0;;14604:2:1;33929:45:0;;;14586:21:1;14643:2;14623:18;;;14616:30;-1:-1:-1;;;14662:18:1;;;14655:46;14718:18;;33929:45:0;14402:340:1;33929:45:0;34015:24;;;;:13;:24;;;;;:31;33993:53;;33985:81;;;;-1:-1:-1;;;33985:81:0;;14949:2:1;33985:81:0;;;14931:21:1;14988:2;14968:18;;;14961:30;-1:-1:-1;;;15007:18:1;;;15000:45;15062:18;;33985:81:0;14747:339:1;33985:81:0;34079:25;;;:47;;;34137:15;;;:22;;-1:-1:-1;;34137:22:0;34155:4;34137:22;;;34193:36;30796:7;34193:15;:36;:::i;:::-;34170:20;;;:59;34242:19;34264:24;;;:13;:24;;;;;:31;;34242:19;34338:116;34362:11;34358:1;:15;34338:116;;;34408:31;;;;:20;:31;;;;;;;;:34;;;;;;;;;34395:47;;;;:::i;:::-;;-1:-1:-1;34375:3:0;;34338:116;;;-1:-1:-1;34464:16:0;;;:28;;;34510:46;;2284:25:1;;;34525:9:0;;34510:46;;2272:2:1;2257:18;34510:46:0;;;;;;;33810:754;;;33730:834;;:::o;34621:1410::-;28069:1;28385:7;;:19;28377:63;;;;-1:-1:-1;;;28377:63:0;;;;;;;:::i;:::-;28069:1;28518:7;:18;;;34696:21:::1;34720:18:::0;;;:7:::1;:18;::::0;;;;34757:15;;::::1;::::0;::::1;;34749:40;;;;-1:-1:-1::0;;;34749:40:0::1;;;;;;;:::i;:::-;34826:6;:20;;;34808:15;:38;34800:64;;;::::0;-1:-1:-1;;;34800:64:0;;11995:2:1;34800:64:0::1;::::0;::::1;11977:21:1::0;12034:2;12014:18;;;12007:30;-1:-1:-1;;;12053:18:1;;;12046:43;12106:18;;34800:64:0::1;11793:337:1::0;34800:64:0::1;34884:21;::::0;;;:10:::1;:21;::::0;;;;;;;34906:10:::1;34884:33:::0;;;;;;;;::::1;;34883:34;34875:62;;;::::0;-1:-1:-1;;;34875:62:0;;15293:2:1;34875:62:0::1;::::0;::::1;15275:21:1::0;15332:2;15312:18;;;15305:30;-1:-1:-1;;;15351:18:1;;;15344:45;15406:18;;34875:62:0::1;15091:339:1::0;34875:62:0::1;34974:25;::::0;::::1;::::0;34950:21:::1;35031:30:::0;;;:19:::1;:30;::::0;;;;;;;35062:10:::1;35031:42:::0;;;;;;;:57;;;;;;;;;35107:14;35099:38:::1;;;::::0;-1:-1:-1;;;35099:38:0;;15637:2:1;35099:38:0::1;::::0;::::1;15619:21:1::0;15676:2;15656:18;;;15649:30;-1:-1:-1;;;15695:18:1;;;15688:41;15746:18;;35099:38:0::1;15435:335:1::0;35099:38:0::1;35150:21;35174:31:::0;;;:20:::1;:31;::::0;;;;;;;:46;;;;;;;;;35288:24;;;:13:::1;:24:::0;;;;;:31;35174:46;;35150:21;;35330:177:::1;35354:11;35350:1;:15;35330:177;;;35396:13;35391:1;:18;35387:109;;35446:31;::::0;;;:20:::1;:31;::::0;;;;;;;:34;;;;;;;;;35430:50:::1;::::0;;::::1;:::i;:::-;;;35387:109;35367:3;;35330:177;;;;35519:19;35557:1:::0;35541:13:::1;:17;:61;;35601:1;35541:61;;;35585:13:::0;35562:19:::1;:12:::0;35577:4:::1;35562:19;:::i;:::-;35561:37;;;;:::i;:::-;35519:83:::0;-1:-1:-1;35613:16:0::1;35674:4;35646:24;35519:83:::0;35646:10;:24:::1;:::i;:::-;35645:33;;;;:::i;:::-;35632:46;::::0;:10;:46:::1;:::i;:::-;35751:1;35691:30:::0;;;:19:::1;:30;::::0;;;;;;;35722:10:::1;35691:42:::0;;;;;;;;;:57;;;;;;;;:61;;;35763:21;;;:10:::1;:21:::0;;;;;:33;;;;;;;;:40;;-1:-1:-1;;35763:40:0::1;35799:4;35763:40;::::0;;35814:16:::1;::::0;::::1;:28:::0;;35613:65;;-1:-1:-1;35613:65:0;;35814:16;;35751:1;35814:28:::1;::::0;35613:65;;35814:28:::1;:::i;:::-;::::0;;;-1:-1:-1;;35874:45:0::1;::::0;35856:12:::1;::::0;35882:10:::1;::::0;35906:8;;35856:12;35874:45;35856:12;35874:45;35906:8;35882:10;35874:45:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35855:64;;;35938:7;35930:35;;;;-1:-1:-1::0;;;35930:35:0::1;;;;;;;:::i;:::-;35983:40;::::0;2284:25:1;;;36002:10:0::1;::::0;35991:9;;35983:40:::1;::::0;2272:2:1;2257:18;35983:40:0::1;;;;;;;-1:-1:-1::0;;28025:1:0;28697:22;;-1:-1:-1;;;;;;;;34621:1410:0:o;39973:176::-;1690:6;;-1:-1:-1;;;;;1690:6:0;1676:10;:20;1672:81;;1720:21;;-1:-1:-1;;;1720:21:0;;;;;;;;;;;1672:81;40058:4:::1;40047:7;:15;;40039:40;;;::::0;-1:-1:-1;;;40039:40:0;;15977:2:1;40039:40:0::1;::::0;::::1;15959:21:1::0;16016:2;15996:18;;;15989:30;-1:-1:-1;;;16035:18:1;;;16028:42;16087:18;;40039:40:0::1;15775:336:1::0;40039:40:0::1;40090:6;:16:::0;;;40122:19:::1;::::0;2284:25:1;;;40122:19:0::1;::::0;2272:2:1;2257:18;40122:19:0::1;;;;;;;39973:176:::0;:::o;39556:360::-;39674:19;39696:24;;;:13;:24;;;;;:31;39636:25;;39696:31;-1:-1:-1;;;;;39749:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39749:26:0;;39738:37;;39791:9;39786:123;39810:11;39806:1;:15;39786:123;;;39857:30;;;;:19;:30;;;;;;;;-1:-1:-1;;;;;39857:37:0;;;;;;;;;:40;;;;;;;;;39843:11;;:8;;39895:1;;39843:11;;;;;;:::i;:::-;;;;;;;;;;:54;39823:3;;39786:123;;;;39663:253;39556:360;;;;:::o;25086:648::-;25170:14;25220:17;;;:11;:17;;;;;:23;25170:14;;25280:447;25304:12;25300:1;:16;25280:447;;;25385:1;25345:17;;;:11;:17;;;;;;;;:28;;;:25;;:28;;;;;;-1:-1:-1;;;;;25345:28:0;:42;25341:375;;25421:5;25412;:14;25408:136;;25460:17;;;;:11;:17;;;;;;;;:28;;;:25;;;;:28;;;;-1:-1:-1;;;;;25460:28:0;;-1:-1:-1;25511:13:0;;-1:-1:-1;;25511:13:0;25408:136;25562:10;25571:1;25562:10;;:::i;:::-;;;25341:375;;;25598:25;25606:4;25620:1;25598:7;:25::i;:::-;:71;;;;-1:-1:-1;25632:17:0;;;;:11;:17;;;;;;;;:37;;;:25;;:37;;;;;;25627:42;;25598:71;25594:122;;;25690:10;25699:1;25690:10;;:::i;:::-;;;25594:122;25318:6;25323:1;25318:6;;:::i;:::-;;;25280:447;;;;25186:548;;25086:648;;;;;:::o;14643:133::-;14721:4;14745:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;14745:23:0;;;;;;;;;;;;;;;14643:133::o;21561:207::-;31610:4;1924:6;-1:-1:-1;;;;;1924:6:0;31634:10;:21;21634:91;;21683:30;;-1:-1:-1;;;21683:30:0;;;;;;;;;;;21634:91;21737:23;21755:4;21737:17;:23::i;37718:568::-;28069:1;28385:7;;:19;28377:63;;;;-1:-1:-1;;;28377:63:0;;;;;;;:::i;:::-;28069:1;28518:7;:18;;;37799:21:::1;37823:18:::0;;;:7:::1;:18;::::0;;;;37860:15;;::::1;::::0;::::1;;37852:40;;;;-1:-1:-1::0;;;37852:40:0::1;;;;;;;:::i;:::-;37929:6;:20;;;37911:15;:38;37903:70;;;::::0;-1:-1:-1;;;37903:70:0;;16318:2:1;37903:70:0::1;::::0;::::1;16300:21:1::0;16357:2;16337:18;;;16330:30;-1:-1:-1;;;16376:18:1;;;16369:49;16435:18;;37903:70:0::1;16116:343:1::0;37903:70:0::1;38005:16;::::0;::::1;::::0;;37986::::1;38032:20:::0;;;38069:12;;38065:156:::1;;38099:12;1924:6:::0;;38117:42:::1;::::0;-1:-1:-1;;;;;1924:6:0;;;;38146:8;;38099:12;38117:42;38099:12;38117:42;38146:8;1924:6;38117:42:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38098:61;;;38182:7;38174:35;;;;-1:-1:-1::0;;;38174:35:0::1;;;;;;;:::i;:::-;38083:138;38065:156;38258:9;38238:40;38269:8;38238:40;;;;2284:25:1::0;;2272:2;2257:18;;2138:177;38238:40:0::1;;;;;;;;-1:-1:-1::0;;28025:1:0;28697:22;;-1:-1:-1;37718:568:0:o;15543:217::-;15622:4;15644:14;;;:8;:14;;;;;;;;:26;;;;;;;;;;;15639:90;;-1:-1:-1;15694:14:0;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;15694:23:0;;;;;;;;;;;;15687:30;;15639:90;-1:-1:-1;15748:4:0;15543:217;;;;:::o;39158:340::-;39266:19;39288:24;;;:13;:24;;;;;:31;39230:23;;39288:31;-1:-1:-1;;;;;39339:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39339:26:0;;39330:35;;39381:9;39376:115;39400:11;39396:1;:15;39376:115;;;39445:31;;;;:20;:31;;;;;;;;:34;;;;;;;;;39433:9;;:6;;39477:1;;39433:9;;;;;;:::i;:::-;;;;;;;;;;:46;39413:3;;39376:115;;;;39255:243;39158:340;;;:::o;40214:374::-;1690:6;;-1:-1:-1;;;;;1690:6:0;1676:10;:20;1672:81;;1720:21;;-1:-1:-1;;;1720:21:0;;;;;;;;;;;1672:81;28069:1:::1;28385:7;;:19:::0;28377:63:::1;;;;-1:-1:-1::0;;;28377:63:0::1;;;;;;;:::i;:::-;28069:1;28518:7;:18:::0;40343:15:::2;::::0;40332:26;::::2;;40324:54;;;::::0;-1:-1:-1;;;40324:54:0;;16666:2:1;40324:54:0::2;::::0;::::2;16648:21:1::0;16705:2;16685:18;;;16678:30;-1:-1:-1;;;16724:18:1;;;16717:45;16779:18;;40324:54:0::2;16464:339:1::0;40324:54:0::2;40408:7;40389:15;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40447:35:0::2;::::0;40429:12:::2;::::0;-1:-1:-1;;;;;40447:15:0;::::2;::::0;40470:7;;40429:12;40447:35;40429:12;40447:35;40470:7;40447:15;:35:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40428:54;;;40501:7;40493:35;;;::::0;-1:-1:-1;;;40493:35:0;;17010:2:1;40493:35:0::2;::::0;::::2;16992:21:1::0;17049:2;17029:18;;;17022:30;-1:-1:-1;;;17068:18:1;;;17061:45;17123:18;;40493:35:0::2;16808:339:1::0;40493:35:0::2;40569:10;-1:-1:-1::0;;;;;40546:34:0::2;;40560:7;40546:34;;;;2284:25:1::0;;2272:2;2257:18;;2138:177;30111:41:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30111:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30111:41:0;-1:-1:-1;30111:41:0;:::o;32897:774::-;32985:21;33009:18;;;:7;:18;;;;;33064:14;;;;33046:15;:32;33038:57;;;;-1:-1:-1;;;33038:57:0;;17354:2:1;33038:57:0;;;17336:21:1;17393:2;17373:18;;;17366:30;-1:-1:-1;;;17412:18:1;;;17405:42;17464:18;;33038:57:0;17152:336:1;33038:57:0;33115:15;;;;;;33114:16;33106:44;;;;-1:-1:-1;;;33106:44:0;;17695:2:1;33106:44:0;;;17677:21:1;17734:2;17714:18;;;17707:30;-1:-1:-1;;;17753:18:1;;;17746:45;17808:18;;33106:44:0;17493:339:1;33106:44:0;33184:24;;;;:13;:24;;;;;:31;33169:46;;33161:73;;;;-1:-1:-1;;;33161:73:0;;18039:2:1;33161:73:0;;;18021:21:1;18078:2;18058:18;;;18051:30;-1:-1:-1;;;18097:18:1;;;18090:44;18151:18;;33161:73:0;17837:338:1;33161:73:0;33265:1;33253:9;:13;33245:34;;;;-1:-1:-1;;;33245:34:0;;18382:2:1;33245:34:0;;;18364:21:1;18421:1;18401:18;;;18394:29;-1:-1:-1;;;18439:18:1;;;18432:38;18487:18;;33245:34:0;18180:331:1;33245:34:0;33292:17;33335:5;33325:6;;33313:9;:18;;;;:::i;:::-;33312:28;;;;:::i;:::-;33292:48;-1:-1:-1;33351:17:0;33371:21;33292:48;33371:9;:21;:::i;:::-;33351:41;;33424:9;33405:15;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;33444:30:0;;;;:19;:30;;;;;;;;33475:10;33444:42;;;;;;;:56;;;;;;;;:69;;33504:9;;33444:30;:69;;33504:9;;33444:69;:::i;:::-;;;;-1:-1:-1;;33524:31:0;;;;:20;:31;;;;;;;;:45;;;;;;;;:58;;33573:9;;33524:31;:58;;33573:9;;33524:58;:::i;:::-;;;;-1:-1:-1;;33600:63:0;;;18690:25:1;;;18746:2;18731:18;;18724:34;;;33627:10:0;;33616:9;;33600:63;;18663:18:1;33600:63:0;;;;;;;32974:697;;;32897:774;;:::o;26152:409::-;26226:13;26275:17;;;:11;:17;;;;;:23;26226:13;26311:165;26335:12;26331:1;:16;26311:165;;;26416:1;26376:17;;;:11;:17;;;;;;;;:28;;;:25;;:28;;;;;;-1:-1:-1;;;;;26376:28:0;:42;26372:93;;26439:10;26448:1;26439:10;;:::i;:::-;;;26372:93;26349:6;26354:1;26349:6;;:::i;:::-;;;26311:165;;;;26490:25;26498:4;26512:1;26490:7;:25::i;:::-;26486:68;;;26532:10;26541:1;26532:10;;:::i;:::-;;;26486:68;26241:320;26152:409;;;:::o;17285:174::-;17382:19;;;;:13;:19;;;;;;17371:43;;17403:10;17371;:43::i;21113:34::-;;;;;;;:::i;31921:903::-;32065:7;1924:6;;-1:-1:-1;;;;;1924:6:0;32093:10;:21;;:65;;;32118:40;30037:32;32147:10;32118:7;:40::i;:::-;32085:92;;;;-1:-1:-1;;;32085:92:0;;18971:2:1;32085:92:0;;;18953:21:1;19010:2;18990:18;;;18983:30;-1:-1:-1;;;19029:18:1;;;19022:44;19083:18;;32085:92:0;18769:338:1;32085:92:0;32208:1;32196:9;:13;32188:51;;;;-1:-1:-1;;;32188:51:0;;19314:2:1;32188:51:0;;;19296:21:1;19353:2;19333:18;;;19326:30;19392:27;19372:18;;;19365:55;19437:18;;32188:51:0;19112:349:1;32188:51:0;32277:1;32258:8;:15;:20;;32250:54;;;;-1:-1:-1;;;32250:54:0;;19668:2:1;32250:54:0;;;19650:21:1;19707:2;19687:18;;;19680:30;-1:-1:-1;;;19726:18:1;;;19719:51;19787:18;;32250:54:0;19466:345:1;32250:54:0;32336:11;:13;;32317:16;;;32336:13;;;:::i;:::-;;;;-1:-1:-1;32360:21:0;32384:17;;;:7;:17;;;;;32317:32;;-1:-1:-1;32384:17:0;32414:27;32432:9;32384:17;32414:27;:::i;:::-;-1:-1:-1;32469:27:0;32487:9;32469:15;:27;:::i;:::-;32452:14;;;:44;32507:15;;;:23;;-1:-1:-1;;32507:23:0;;;-1:-1:-1;;32541:25:0;;;:45;32525:5;32599:114;32623:8;:15;32619:1;:19;32599:114;;;32660:23;;;;:13;:23;;;;;32689:11;;:8;;32698:1;;32689:11;;;;;;:::i;:::-;;;;;;;;;;;;32660:41;;;;;;;-1:-1:-1;32660:41:0;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32640:3:0;;32599:114;;;;32744:8;32730:60;32754:9;32765:8;32775:6;:14;;;32730:60;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;32808:8:0;31921:903;-1:-1:-1;;;;31921:903:0:o;2420:177::-;2480:18;2501:6;;-1:-1:-1;;;;;2518:18:0;;;-1:-1:-1;;;;;;2518:18:0;;;;;;2554:35;;2501:6;;;;;;;2554:35;;2480:18;2554:35;2469:128;2420:177;:::o;19006:200::-;19095:14;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;19095:23:0;;;;;;;;;;;;19090:109;;19142:45;;-1:-1:-1;;;19142:45:0;;-1:-1:-1;;;;;13671:32:1;;19142:45:0;;;13653:51:1;13720:18;;;13713:34;;;13626:18;;19142:45:0;13479:274:1;26966:155:0;27046:31;27063:4;27069:7;27046:16;:31::i;:::-;27088:25;27099:4;27105:7;27088:10;:25::i;26689:160::-;26770:32;26788:4;26794:7;26770:17;:32::i;:::-;27591:11;27605:17;;;:11;:17;;;;;;;;-1:-1:-1;;;;;27605:34:0;;;;;:25;;;:34;;;;;;;;27659:30;;:25;;;;:30;;;;;27652:37;;-1:-1:-1;;;;;;27652:37:0;;;27707:34;;;;27700:41;16619:285;;:::o;21853:190::-;21920:21;21944:11;21920:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21980:4;21966:11;:18;;;;;;:::i;:::-;;22002:33;22021:7;22030:4;22002:33;;;;;;;:::i;:::-;;;;;;;;21909:134;21853:190;:::o;18472:171::-;18551:14;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;18551:23:0;;;;;;;;;;:30;;-1:-1:-1;;18551:30:0;18577:4;18551:30;;;18597:38;18624:10;;18560:4;;18597:38;;18551:14;18597:38;18472:171;;:::o;27187:259::-;27258:11;27272:17;;;:11;:17;;;;;:23;;;27333:1;;27272:17;27306:28;27333:1;27272:23;27306:28;:::i;:::-;;;;-1:-1:-1;;27347:17:0;;;;:11;:17;;;;;;;;:30;;;:25;;;:30;;;;;:40;;-1:-1:-1;;;;;27347:40:0;;;-1:-1:-1;;;;;;27347:40:0;;;;;;;27398:34;;;:25;;;;:34;;;;:40;27187:259::o;18695:208::-;18775:25;18786:4;18792:7;18775:10;:25::i;:::-;18818:14;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;18818:23:0;;;;;;;;;;18811:30;;-1:-1:-1;;18811:30:0;;;18857:38;18884:10;;18827:4;;18857:38;;18818:14;18857:38;18695:208;;:::o;14:226:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;187:23:1;;14:226;-1:-1:-1;14:226:1:o;245:400::-;287:3;325:5;319:12;352:6;347:3;340:19;377:1;387:139;401:6;398:1;395:13;387:139;;;509:4;494:13;;;490:24;;484:31;464:11;;;460:22;;453:63;416:12;387:139;;;391:3;571:1;564:4;555:6;550:3;546:16;542:27;535:38;634:4;627:2;623:7;618:2;610:6;606:15;602:29;597:3;593:39;589:50;582:57;;;245:400;;;;:::o;650:579::-;702:3;733;765:5;759:12;792:6;787:3;780:19;824:4;819:3;815:14;808:21;;882:4;872:6;869:1;865:14;858:5;854:26;850:37;921:4;914:5;910:16;944:1;954:249;968:6;965:1;962:13;954:249;;;1055:2;1051:7;1043:5;1037:4;1033:16;1029:30;1024:3;1017:43;1081:38;1114:4;1105:6;1099:13;1081:38;:::i;:::-;1154:4;1179:14;;;;1073:46;;-1:-1:-1;1142:17:1;;;;;990:1;983:9;954:249;;;-1:-1:-1;1219:4:1;;650:579;-1:-1:-1;;;;;;650:579:1:o;1234:280::-;1433:2;1422:9;1415:21;1396:4;1453:55;1504:2;1493:9;1489:18;1481:6;1453:55;:::i;:::-;1445:63;1234:280;-1:-1:-1;;;1234:280:1:o;1519:131::-;-1:-1:-1;;;;;1594:31:1;;1584:42;;1574:70;;1640:1;1637;1630:12;1655:247;1714:6;1767:2;1755:9;1746:7;1742:23;1738:32;1735:52;;;1783:1;1780;1773:12;1735:52;1822:9;1809:23;1841:31;1866:5;1841:31;:::i;2502:724::-;2597:6;2605;2613;2666:2;2654:9;2645:7;2641:23;2637:32;2634:52;;;2682:1;2679;2672:12;2634:52;2727:23;;;-1:-1:-1;2825:2:1;2810:18;;2797:32;-1:-1:-1;;;;;2841:30:1;;2838:50;;;2884:1;2881;2874:12;2838:50;2907:22;;2960:4;2952:13;;2948:27;-1:-1:-1;2938:55:1;;2989:1;2986;2979:12;2938:55;3029:2;3016:16;-1:-1:-1;;;;;3047:6:1;3044:30;3041:50;;;3087:1;3084;3077:12;3041:50;3140:7;3135:2;3125:6;3122:1;3118:14;3114:2;3110:23;3106:32;3103:45;3100:65;;;3161:1;3158;3151:12;3100:65;2502:724;;3192:2;3184:11;;;;;-1:-1:-1;3214:6:1;;-1:-1:-1;;;2502:724:1:o;3231:367::-;3299:6;3307;3360:2;3348:9;3339:7;3335:23;3331:32;3328:52;;;3376:1;3373;3366:12;3328:52;3421:23;;;-1:-1:-1;3520:2:1;3505:18;;3492:32;3533:33;3492:32;3533:33;:::i;:::-;3585:7;3575:17;;;3231:367;;;;;:::o;3603:346::-;3671:6;3679;3732:2;3720:9;3711:7;3707:23;3703:32;3700:52;;;3748:1;3745;3738:12;3700:52;-1:-1:-1;;3793:23:1;;;3913:2;3898:18;;;3885:32;;-1:-1:-1;3603:346:1:o;3954:220::-;4103:2;4092:9;4085:21;4066:4;4123:45;4164:2;4153:9;4149:18;4141:6;4123:45;:::i;4179:445::-;4406:3;4395:9;4388:22;4369:4;4427:46;4468:3;4457:9;4453:19;4445:6;4427:46;:::i;:::-;4504:2;4489:18;;4482:34;;;;-1:-1:-1;4559:14:1;;4552:22;4547:2;4532:18;;4525:50;4606:2;4591:18;;;4584:34;4419:54;4179:445;-1:-1:-1;4179:445:1:o;5001:611::-;5191:2;5203:21;;;5273:13;;5176:18;;;5295:22;;;5143:4;;5374:15;;;5348:2;5333:18;;;5143:4;5417:169;5431:6;5428:1;5425:13;5417:169;;;5492:13;;5480:26;;5535:2;5561:15;;;;5526:12;;;;5453:1;5446:9;5417:169;;;-1:-1:-1;5603:3:1;;5001:611;-1:-1:-1;;;;;5001:611:1:o;6368:127::-;6429:10;6424:3;6420:20;6417:1;6410:31;6460:4;6457:1;6450:15;6484:4;6481:1;6474:15;6500:275;6571:2;6565:9;6636:2;6617:13;;-1:-1:-1;;6613:27:1;6601:40;;-1:-1:-1;;;;;6656:34:1;;6692:22;;;6653:62;6650:88;;;6718:18;;:::i;:::-;6754:2;6747:22;6500:275;;-1:-1:-1;6500:275:1:o;6780:559::-;6823:5;6876:3;6869:4;6861:6;6857:17;6853:27;6843:55;;6894:1;6891;6884:12;6843:55;6934:6;6921:20;-1:-1:-1;;;;;6956:6:1;6953:30;6950:56;;;6986:18;;:::i;:::-;7030:59;7077:2;7054:17;;-1:-1:-1;;7050:31:1;7083:4;7046:42;7030:59;:::i;:::-;7114:6;7105:7;7098:23;7168:3;7161:4;7152:6;7144;7140:19;7136:30;7133:39;7130:59;;;7185:1;7182;7175:12;7130:59;7250:6;7243:4;7235:6;7231:17;7224:4;7215:7;7211:18;7198:59;7306:1;7277:20;;;7299:4;7273:31;7266:42;;;;7281:7;6780:559;-1:-1:-1;;;6780:559:1:o;7344:322::-;7413:6;7466:2;7454:9;7445:7;7441:23;7437:32;7434:52;;;7482:1;7479;7472:12;7434:52;7522:9;7509:23;-1:-1:-1;;;;;7547:6:1;7544:30;7541:50;;;7587:1;7584;7577:12;7541:50;7610;7652:7;7643:6;7632:9;7628:22;7610:50;:::i;:::-;7600:60;7344:322;-1:-1:-1;;;;7344:322:1:o;7671:487::-;7748:6;7756;7764;7817:2;7805:9;7796:7;7792:23;7788:32;7785:52;;;7833:1;7830;7823:12;7785:52;7878:23;;;-1:-1:-1;7977:2:1;7962:18;;7949:32;7990:33;7949:32;7990:33;:::i;:::-;7671:487;;8042:7;;-1:-1:-1;;;8122:2:1;8107:18;;;;8094:32;;7671:487::o;8163:375::-;8239:6;8247;8300:2;8288:9;8279:7;8275:23;8271:32;8268:52;;;8316:1;8313;8306:12;8268:52;8355:9;8342:23;8374:31;8399:5;8374:31;:::i;:::-;8424:5;8502:2;8487:18;;;;8474:32;;-1:-1:-1;;;8163:375:1:o;8543:589::-;8826:3;8815:9;8808:22;8789:4;8847:46;8888:3;8877:9;8873:19;8865:6;8847:46;:::i;:::-;8924:2;8909:18;;8902:34;;;;-1:-1:-1;8979:14:1;;8972:22;8967:2;8952:18;;8945:50;9026:2;9011:18;;9004:34;;;;9069:3;9054:19;;9047:35;9113:3;9098:19;;;9091:35;8839:54;8543:589;-1:-1:-1;8543:589:1:o;9137:1433::-;9259:6;9267;9275;9328:2;9316:9;9307:7;9303:23;9299:32;9296:52;;;9344:1;9341;9334:12;9296:52;9384:9;9371:23;-1:-1:-1;;;;;9409:6:1;9406:30;9403:50;;;9449:1;9446;9439:12;9403:50;9472;9514:7;9505:6;9494:9;9490:22;9472:50;:::i;:::-;9462:60;;;9575:2;9564:9;9560:18;9547:32;-1:-1:-1;;;;;9594:8:1;9591:32;9588:52;;;9636:1;9633;9626:12;9588:52;9659:24;;9714:4;9706:13;;9702:27;-1:-1:-1;9692:55:1;;9743:1;9740;9733:12;9692:55;9783:2;9770:16;-1:-1:-1;;;;;9801:6:1;9798:30;9795:56;;;9831:18;;:::i;:::-;9877:6;9874:1;9870:14;9904:28;9928:2;9924;9920:11;9904:28;:::i;:::-;9966:19;;;10010:2;10040:11;;;10036:20;;;10001:12;;;;10068:19;;;10065:39;;;10100:1;10097;10090:12;10065:39;10132:2;10128;10124:11;10113:22;;10144:299;10160:6;10155:3;10152:15;10144:299;;;10246:3;10233:17;-1:-1:-1;;;;;10269:11:1;10266:35;10263:55;;;10314:1;10311;10304:12;10263:55;10343:57;10392:7;10387:2;10373:11;10369:2;10365:20;10361:29;10343:57;:::i;:::-;10331:70;;-1:-1:-1;10430:2:1;10177:12;;;;10421;;;;10144:299;;;9137:1433;;10462:5;;-1:-1:-1;;;;10536:2:1;10521:18;;;;10508:32;;-1:-1:-1;;;9137:1433:1:o;10575:127::-;10636:10;10631:3;10627:20;10624:1;10617:31;10667:4;10664:1;10657:15;10691:4;10688:1;10681:15;10707:380;10786:1;10782:12;;;;10829;;;10850:61;;10904:4;10896:6;10892:17;10882:27;;10850:61;10957:2;10949:6;10946:14;10926:18;10923:38;10920:161;;11003:10;10998:3;10994:20;10991:1;10984:31;11038:4;11035:1;11028:15;11066:4;11063:1;11056:15;11092:355;11294:2;11276:21;;;11333:2;11313:18;;;11306:30;11372:33;11367:2;11352:18;;11345:61;11438:2;11423:18;;11092:355::o;11452:336::-;11654:2;11636:21;;;11693:2;11673:18;;;11666:30;-1:-1:-1;;;11727:2:1;11712:18;;11705:42;11779:2;11764:18;;11452:336::o;12135:127::-;12196:10;12191:3;12187:20;12184:1;12177:31;12227:4;12224:1;12217:15;12251:4;12248:1;12241:15;12267:125;12332:9;;;12353:10;;;12350:36;;;12366:18;;:::i;12397:168::-;12470:9;;;12501;;12518:15;;;12512:22;;12498:37;12488:71;;12539:18;;:::i;12570:217::-;12610:1;12636;12626:132;;12680:10;12675:3;12671:20;12668:1;12661:31;12715:4;12712:1;12705:15;12743:4;12740:1;12733:15;12626:132;-1:-1:-1;12772:9:1;;12570:217::o;12792:128::-;12859:9;;;12880:11;;;12877:37;;;12894:18;;:::i;13135:339::-;13337:2;13319:21;;;13376:2;13356:18;;;13349:30;-1:-1:-1;;;13410:2:1;13395:18;;13388:45;13465:2;13450:18;;13135:339::o;19816:135::-;19855:3;19876:17;;;19873:43;;19896:18;;:::i;:::-;-1:-1:-1;19943:1:1;19932:13;;19816:135::o;20082:518::-;20184:2;20179:3;20176:11;20173:421;;;20220:5;20217:1;20210:16;20264:4;20261:1;20251:18;20334:2;20322:10;20318:19;20315:1;20311:27;20305:4;20301:38;20370:4;20358:10;20355:20;20352:47;;;-1:-1:-1;20393:4:1;20352:47;20448:2;20443:3;20439:12;20436:1;20432:20;20426:4;20422:31;20412:41;;20503:81;20521:2;20514:5;20511:13;20503:81;;;20580:1;20566:16;;20547:1;20536:13;20503:81;;;20507:3;;20173:421;20082:518;;;:::o;20776:1299::-;20902:3;20896:10;-1:-1:-1;;;;;20921:6:1;20918:30;20915:56;;;20951:18;;:::i;:::-;20980:97;21070:6;21030:38;21062:4;21056:11;21030:38;:::i;:::-;21024:4;20980:97;:::i;:::-;21126:4;21157:2;21146:14;;21174:1;21169:649;;;;21862:1;21879:6;21876:89;;;-1:-1:-1;21931:19:1;;;21925:26;21876:89;-1:-1:-1;;20733:1:1;20729:11;;;20725:24;20721:29;20711:40;20757:1;20753:11;;;20708:57;21978:81;;21139:930;;21169:649;20029:1;20022:14;;;20066:4;20053:18;;-1:-1:-1;;21205:20:1;;;21323:222;21337:7;21334:1;21331:14;21323:222;;;21419:19;;;21413:26;21398:42;;21526:4;21511:20;;;;21479:1;21467:14;;;;21353:12;21323:222;;;21327:3;21573:6;21564:7;21561:19;21558:201;;;21634:19;;;21628:26;-1:-1:-1;;21717:1:1;21713:14;;;21729:3;21709:24;21705:37;21701:42;21686:58;21671:74;;21558:201;-1:-1:-1;;;;21805:1:1;21789:14;;;21785:22;21772:36;;-1:-1:-1;20776:1299:1:o;22080:514::-;22355:2;22344:9;22337:21;22318:4;22381:45;22422:2;22411:9;22407:18;22399:6;22381:45;:::i;:::-;22474:9;22466:6;22462:22;22457:2;22446:9;22442:18;22435:50;22502:43;22538:6;22530;22502:43;:::i;:::-;22494:51;;;22581:6;22576:2;22565:9;22561:18;22554:34;22080:514;;;;;;:::o;22599:383::-;22796:2;22785:9;22778:21;22759:4;22822:45;22863:2;22852:9;22848:18;22840:6;22822:45;:::i;:::-;22915:9;22907:6;22903:22;22898:2;22887:9;22883:18;22876:50;22943:33;22969:6;22961;22943:33;:::i;:::-;22935:41;22599:383;-1:-1:-1;;;;;22599:383:1:o

Swarm Source

ipfs://62168fffb4b3c93877e968c36b4d650e7ea8d0c1577ff5bfb9a1cac66ddcfa46

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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.