ERC-20
Overview
Max Total Supply
2,964,233.509363425925810932 FLWR$
Holders
170
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0 FLWR$Value
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FlowerStaking
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-19 */ // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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 Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: flowers.sol pragma solidity ^0.8.4; interface IExternalNft is IERC721 { function burnFrom(address, uint[] calldata) external payable; function resurrect(uint[] calldata, address[] calldata) external; function walletOfOwner(address) external view returns (uint[] memory tokens); } interface IRewardToken is IERC20 { function mint(address to, uint256 amount) external; } contract Flowers is ERC20, ERC20Burnable, AccessControl { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); constructor() ERC20("GG Flowers", "FLWR$") { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); _grantRole(BURNER_ROLE, msg.sender); } function mint(address to_, uint256 amount_) public onlyRole(MINTER_ROLE) { _mint(to_, amount_); } function withdrawFlowers(address to_) public onlyRole(DEFAULT_ADMIN_ROLE) { transfer(to_, balanceOf(address(this))); } function withdrawETH(address to_) public onlyRole(DEFAULT_ADMIN_ROLE) { payable(to_).transfer(address(this).balance); } } contract FlowerStaking is Ownable, Flowers { uint256 constant stakingTime = 180 seconds; uint256 constant token = 10e18; uint256 public stakingCost = 0; uint256 public stakedTotal; uint256 public stakingStartTime; uint256 public rewardPerHour = (111 * token) / 24; uint256 public passiveRewardPerHour = (22 * token) / 24; uint256 public passiveRewardCap = (22 * 222) * token; uint256[] public passiveClaimed = new uint256[](2222); modifier onlySender { require(msg.sender == tx.origin, "No smart contracts!"); _; } // Goat Gauds NFT Contract Address address contractAddr = 0x5CEbE5Cde01aB154fB46B7984D6354DA367bCBaF; struct Staker { uint256[] stakedTokens; uint256 stakeCount; } struct Stake { uint256 tokenId; uint256 since; uint256 cooldown; } struct PassiveStake { uint256 claimed; uint256 since; } mapping (uint256 => Stake) tokenIdToStake; mapping(uint256 => PassiveStake) public passiveStakes; /// @notice mapping of a staker to its wallet mapping(address => Staker) public stakers; /// @notice mapping from token ID to owner address mapping(uint256 => address) public tokenOwner; bool initialized; /// @notice event emitted when a user has staked an nft event Staked(address owner, uint256[] tokens); /// @notice event emitted when a user has unstaked an nft event Unstaked(address[] owners, uint256[] tokens); /// @notice event emitted when a user claims rewards event RewardPaid(address indexed user, uint256 reward); function getIndex(uint element, uint[] memory arr) pure internal returns(uint index) { bytes32 encodedElement = keccak256(abi.encode(element)); for (uint i = 0 ; i < arr.length; i++) { if (encodedElement == keccak256(abi.encode(element))) { return i; } } } function isInitialized() public view returns (bool init) { if (initialized) {return true;} else {return false;} } // Owner functions function setContractAddr(address contract_) public onlyOwner { contractAddr = contract_; } function setRewards(uint stakingReward_, uint passiveReward_) public onlyOwner { rewardPerHour = stakingReward_; passiveRewardPerHour = passiveReward_; } function setStakingCost(uint stakingCost_) public onlyOwner { require(stakingCost != stakingCost_, "Updated cost must be different from current cost!"); stakingCost = stakingCost_; } function initStaking() public onlyOwner { require(!initialized, "Staking already started!"); stakingStartTime = block.timestamp; initialized = true; } // Public Staking functions function getStakedTokens(address user_) public view returns (uint256[] memory tokenIds) { Staker storage _staker = stakers[user_]; uint256[] memory _tokens = _staker.stakedTokens; return _tokens; } function stakeNFT(uint[] memory tokenIds_) public payable onlySender { address _user = msg.sender; require(initialized, "The staking has not started!"); require(msg.value == stakingCost, "Invalid ETH sent!"); Staker storage _staker = stakers[_user]; claimAllStakes(_user); for (uint256 i = 0; i < tokenIds_.length; i++) { require(IExternalNft(contractAddr).ownerOf(tokenIds_[i]) == _user, "You must be the owner of the token!"); PassiveStake storage _passiveStake = passiveStakes[tokenIds_[i]]; if (_passiveStake.since == 0) {_passiveStake.since = block.timestamp;} Stake storage _stake = tokenIdToStake[tokenIds_[i]]; _stake.tokenId = tokenIds_[i]; _stake.since = block.timestamp; _stake.cooldown = block.timestamp + stakingTime; _staker.stakedTokens.push(tokenIds_[i]); _staker.stakeCount++; tokenOwner[tokenIds_[i]] = _user; stakedTotal++; } IExternalNft(contractAddr).burnFrom(_user, tokenIds_); emit Staked(_user, tokenIds_); } function withdrawAll(address user_) public onlySender { withdrawNFT(getStakedTokens(user_)); } function withdrawNFT(uint[] memory tokenIds_) public onlySender { address _user = msg.sender; for (uint256 i = 0; i < tokenIds_.length; i++) { require( tokenOwner[tokenIds_[i]] == _user, "Cannot withdraw unowned NFT!" ); Stake memory _stake = tokenIdToStake[tokenIds_[i]]; require( _stake.cooldown < block.timestamp, "Cooldown: Must wait for cooldown period before withdrawing!" ); claimStake(tokenIds_[i]); Staker storage _staker = stakers[_user]; if (--_staker.stakeCount > 0) { _staker.stakedTokens[getIndex(tokenIds_[i], _staker.stakedTokens)] = _staker.stakedTokens[_staker.stakedTokens.length - 1]; _staker.stakedTokens.pop(); delete _stake; } else { delete stakers[_user]; } delete tokenOwner[tokenIds_[i]]; stakedTotal--; PassiveStake storage _passiveStake = passiveStakes[tokenIds_[i]]; _passiveStake.claimed = (block.timestamp - _passiveStake.since) * passiveRewardPerHour / 1 hours; } address[] memory _userToArr; for (uint i = 0; i < tokenIds_.length; i++) { _userToArr[i] = _user; } IExternalNft(contractAddr).resurrect(tokenIds_, _userToArr); emit Unstaked(_userToArr, tokenIds_); } /// Passive Staking function activateNft(uint[] memory tokenIds_) public onlySender { for (uint i = 0; i < tokenIds_.length; i++) { require(IExternalNft(contractAddr).ownerOf(tokenIds_[i]) == msg.sender, "Cannot activate unowned tokens!"); } require(initialized, "Staking not yet started!"); for (uint i = 0; i < tokenIds_.length; i++) { PassiveStake storage _stake = passiveStakes[tokenIds_[i]]; require(_stake.since == 0, "Passive earning already enabled!"); _stake.since = block.timestamp; } } function claimPassiveStake(uint tokenId_) public onlySender { PassiveStake storage _stake = passiveStakes[tokenId_]; require(_stake.since != 0, "You must activate your NFT to earn passive rewards!"); uint _claimed = _stake.claimed; require(_claimed < passiveRewardCap, "Maximum passive rewards for this token have already been claimed!"); uint _totalRewards = (block.timestamp - _stake.since) * passiveRewardPerHour / 1 hours; uint _totalClaim; if (_totalRewards > passiveRewardCap) { _totalClaim = passiveRewardCap - _claimed; _stake.claimed = passiveRewardCap; } else { _totalClaim = _totalRewards - _claimed; _stake.claimed = _totalRewards; } address _user = IExternalNft(contractAddr).ownerOf(tokenId_); IRewardToken(address(this)).mint(_user, _totalClaim); emit RewardPaid(_user, _totalClaim); } function claimAllPassiveStakes(address user_) public onlySender { uint[] memory _tokens = IExternalNft(contractAddr).walletOfOwner(user_); uint _totalClaim; for (uint i = 0; i < _tokens.length; i++) { PassiveStake storage _stake = passiveStakes[_tokens[i]]; if (_stake.since == 0) {continue;} uint _claimed = _stake.claimed; uint _totalRewards = (block.timestamp - _stake.since) * passiveRewardPerHour / 1 hours; if (_totalRewards > passiveRewardCap) { _totalClaim = _totalClaim + passiveRewardCap - _claimed; _stake.claimed = passiveRewardCap; } else { _totalClaim = _totalClaim + _totalRewards - _claimed; _stake.claimed = _totalRewards; } } if (_totalClaim > 0) { IRewardToken(address(this)).mint(user_, _totalClaim); emit RewardPaid(user_, _totalClaim); } } function getPassiveStake(uint tokenId_) public view returns (uint amount) { PassiveStake memory _stake = passiveStakes[tokenId_]; if (_stake.since == 0) {return 0;} uint _claimed = _stake.claimed; uint _totalRewards = (block.timestamp - _stake.since) * passiveRewardPerHour / 1 hours; uint _totalClaim; if (_totalRewards > passiveRewardCap) { _totalClaim = passiveRewardCap - _claimed; } else { _totalClaim = _totalRewards - _claimed; } return _totalClaim; } function getPassiveStakes(address user_) public view returns (uint amount) { uint[] memory _tokens = IExternalNft(contractAddr).walletOfOwner(user_); uint _totalClaim; for (uint i = 0; i < _tokens.length; i++) { PassiveStake memory _stake = passiveStakes[_tokens[i]]; if (_stake.since == 0) {continue;} uint _claimed = _stake.claimed; uint _totalRewards = (block.timestamp - _stake.since) * passiveRewardPerHour / 1 hours; _totalClaim = _totalClaim + _totalRewards - _claimed; } return _totalClaim; } // Token Staking function getStake(uint tokenId_) public view returns (Stake memory stake) { Stake storage _stake = tokenIdToStake[tokenId_]; return _stake; } function claimStake(uint tokenId_) public onlySender { address _user = tokenOwner[tokenId_]; uint _totalClaim = getPendingStakeRewards(tokenId_); Stake storage _stake = tokenIdToStake[tokenId_]; _stake.since = block.timestamp; IRewardToken(address(this)).mint(_user, _totalClaim); emit RewardPaid(_user, getPendingStakeRewards(tokenId_)); } function claimAllStakes(address user_) public onlySender { uint[] memory _tokenIds = getStakedTokens(user_); for (uint i = 0; i < _tokenIds.length; i++) { claimStake(_tokenIds[i]); } if (IExternalNft(contractAddr).walletOfOwner(user_).length > 0) { claimAllPassiveStakes(user_); } } function stakedSince(uint tokenId_) public view returns (uint _since) { Stake storage _stake = tokenIdToStake[tokenId_]; if (_stake.since == 0) { return block.timestamp; } return _stake.since; } function stakeDuration(uint tokenId_) public view returns (uint _difference) { return block.timestamp - stakedSince(tokenId_); } function getPendingStakeRewards(uint tokenId_) public view returns (uint _pending) { return stakeDuration(tokenId_) * rewardPerHour / 1 hours; } function getPendingUserRewards(address user_) public view returns (uint256 amount_) { uint[] memory _tokenIds = getStakedTokens(user_); uint _stakingRewards; for (uint i = 0; i < _tokenIds.length; i++) { _stakingRewards = _stakingRewards + getPendingStakeRewards(_tokenIds[i]); } return getPassiveStakes(user_) + _stakingRewards; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","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":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"owners","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"activateNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"claimAllPassiveStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"claimAllStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"claimPassiveStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"claimStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getPassiveStake","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"getPassiveStakes","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getPendingStakeRewards","outputs":[{"internalType":"uint256","name":"_pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"getPendingUserRewards","outputs":[{"internalType":"uint256","name":"amount_","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":"uint256","name":"tokenId_","type":"uint256"}],"name":"getStake","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"since","type":"uint256"},{"internalType":"uint256","name":"cooldown","type":"uint256"}],"internalType":"struct FlowerStaking.Stake","name":"stake","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"getStakedTokens","outputs":[{"internalType":"uint256[]","name":"tokenIds","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":"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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"init","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"passiveClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"passiveRewardCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"passiveRewardPerHour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"passiveStakes","outputs":[{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"since","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerHour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"}],"name":"setContractAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingReward_","type":"uint256"},{"internalType":"uint256","name":"passiveReward_","type":"uint256"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingCost_","type":"uint256"}],"name":"setStakingCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"stakeDuration","outputs":[{"internalType":"uint256","name":"_difference","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"stakeNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"stakedSince","outputs":[{"internalType":"uint256","name":"_since","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"uint256","name":"stakeCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"}],"name":"withdrawFlowers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"withdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006007556018678ac7230489e80000606f620000229190620005e0565b6200002e9190620005a8565b600a556018678ac7230489e8000060166200004a9190620005e0565b620000569190620005a8565b600b55678ac7230489e80000611314620000719190620005e0565b600c556108ae67ffffffffffffffff8111156200009357620000926200070e565b5b604051908082528060200260200182016040528015620000c25781602001602082028036833780820191505090505b50600d9080519060200190620000da929190620004a6565b50735cebe5cde01ab154fb46b7984d6354da367bcbaf600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200013d57600080fd5b506040518060400160405280600a81526020017f474720466c6f77657273000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f464c575224000000000000000000000000000000000000000000000000000000815250620001ca620001be6200027d60201b60201c565b6200028560201b60201c565b8160049080519060200190620001e2929190620004f8565b508060059080519060200190620001fb929190620004f8565b505050620002136000801b336200034960201b60201c565b620002457f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200034960201b60201c565b620002777f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848336200034960201b60201c565b6200073d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200035b82826200043b60201b60201c565b620004375760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003dc6200027d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054828255906000526020600020908101928215620004e5579160200282015b82811115620004e4578251825591602001919060010190620004c7565b5b509050620004f4919062000589565b5090565b82805462000506906200064b565b90600052602060002090601f0160209004810192826200052a576000855562000576565b82601f106200054557805160ff191683800117855562000576565b8280016001018555821562000576579182015b828111156200057557825182559160200191906001019062000558565b5b50905062000585919062000589565b5090565b5b80821115620005a45760008160009055506001016200058a565b5090565b6000620005b58262000641565b9150620005c28362000641565b925082620005d557620005d4620006b0565b5b828204905092915050565b6000620005ed8262000641565b9150620005fa8362000641565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000636576200063562000681565b5b828202905092915050565b6000819050919050565b600060028204905060018216806200066457607f821691505b602082108114156200067b576200067a620006df565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b615ef9806200074d6000396000f3fe60806040526004361061038c5760003560e01c8063690d8320116101dc578063a217fddf11610102578063ceedebe9116100a0578063d66692a71161006f578063d66692a714610df0578063dd62ed3e14610e1b578063f2fde38b14610e58578063fa09e63014610e815761038c565b8063ceedebe914610d22578063d1e4368414610d5f578063d539139314610d9c578063d547741f14610dc75761038c565b8063b4efa66d116100dc578063b4efa66d14610c66578063c0cf442a14610c7d578063c0da620314610ca8578063ce325bf814610ce55761038c565b8063a217fddf14610bc1578063a457c2d714610bec578063a9059cbb14610c295761038c565b80638da5cb5b1161017a57806395d89b411161014957806395d89b4114610b19578063995d921014610b445780639ac62d2814610b6d578063a0a27b9b14610b985761038c565b80638da5cb5b14610a4b5780638f86f58e14610a765780639168ae7214610a9f57806391d1485414610adc5761038c565b806370a08231116101b657806370a08231146109a5578063715018a6146109e257806379a61b09146109f957806379cc679014610a225761038c565b8063690d8320146109145780636abfd1831461093d5780636fe5a12d146109685761038c565b8063313ce567116102c15780634b0b3dc71161025f578063614143581161022e578063614143581461085a57806363c28db11461088557806364b23150146108c2578063654e51e7146108eb5761038c565b80634b0b3dc71461078e5780634ed1556a146107b757806350c58c24146107f457806353951e051461081d5761038c565b8063395093511161029b57806339509351146106d657806340c10f191461071357806342966c681461073c57806344c7d6ef146107655761038c565b8063313ce5671461065757806336568abe14610682578063392e53cd146106ab5761038c565b80631e7bdac11161032e57806326a448961161030857806326a448961461059c578063282c51f3146105da578063286d2e3a146106055780632f2ff15d1461062e5761038c565b80631e7bdac1146104f757806323b872dd14610522578063248a9ca31461055f5761038c565b8063095ea7b31161036a578063095ea7b31461043657806318160ddd14610473578063182c57441461049e5780631caaa487146104ba5761038c565b80630190cde61461039157806301ffc9a7146103ce57806306fdde031461040b575b600080fd5b34801561039d57600080fd5b506103b860048036038101906103b391906146bb565b610eaa565b6040516103c59190615231565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f0919061468e565b610ece565b6040516104029190614e5e565b60405180910390f35b34801561041757600080fd5b50610420610f48565b60405161042d9190614e94565b60405180910390f35b34801561044257600080fd5b5061045d6004803603810190610458919061454f565b610fda565b60405161046a9190614e5e565b60405180910390f35b34801561047f57600080fd5b50610488610ffd565b6040516104959190615231565b60405180910390f35b6104b860048036038101906104b3919061458f565b611007565b005b3480156104c657600080fd5b506104e160048036038101906104dc91906146bb565b611517565b6040516104ee9190614d5a565b60405180910390f35b34801561050357600080fd5b5061050c61154a565b6040516105199190615231565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906144fc565b611550565b6040516105569190614e5e565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190614621565b61157f565b6040516105939190614e79565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be91906146bb565b61159f565b6040516105d192919061524c565b60405180910390f35b3480156105e657600080fd5b506105ef6115c3565b6040516105fc9190614e79565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190614462565b6115e7565b005b34801561063a57600080fd5b506106556004803603810190610650919061464e565b611633565b005b34801561066357600080fd5b5061066c611654565b6040516106799190615275565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a4919061464e565b61165d565b005b3480156106b757600080fd5b506106c06116e0565b6040516106cd9190614e5e565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f8919061454f565b611708565b60405161070a9190614e5e565b60405180910390f35b34801561071f57600080fd5b5061073a6004803603810190610735919061454f565b61173f565b005b34801561074857600080fd5b50610763600480360381019061075e91906146bb565b611778565b005b34801561077157600080fd5b5061078c600480360381019061078791906146bb565b61178c565b005b34801561079a57600080fd5b506107b560048036038101906107b0919061458f565b611928565b005b3480156107c357600080fd5b506107de60048036038101906107d99190614462565b611f07565b6040516107eb9190615231565b60405180910390f35b34801561080057600080fd5b5061081b600480360381019061081691906146bb565b6120a2565b005b34801561082957600080fd5b50610844600480360381019061083f91906146bb565b6123a0565b6040516108519190615231565b60405180910390f35b34801561086657600080fd5b5061086f6123bd565b60405161087c9190615231565b60405180910390f35b34801561089157600080fd5b506108ac60048036038101906108a79190614462565b6123c3565b6040516108b99190614e05565b60405180910390f35b3480156108ce57600080fd5b506108e960048036038101906108e49190614462565b612469565b005b3480156108f757600080fd5b50610912600480360381019061090d91906146e8565b612751565b005b34801561092057600080fd5b5061093b60048036038101906109369190614462565b61276b565b005b34801561094957600080fd5b506109526127c3565b60405161095f9190615231565b60405180910390f35b34801561097457600080fd5b5061098f600480360381019061098a91906146bb565b6127c9565b60405161099c9190615231565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c79190614462565b61288b565b6040516109d99190615231565b60405180910390f35b3480156109ee57600080fd5b506109f76128d4565b005b348015610a0557600080fd5b50610a206004803603810190610a1b91906146bb565b6128e8565b005b348015610a2e57600080fd5b50610a496004803603810190610a44919061454f565b61293f565b005b348015610a5757600080fd5b50610a6061295f565b604051610a6d9190614d5a565b60405180910390f35b348015610a8257600080fd5b50610a9d6004803603810190610a989190614462565b612988565b005b348015610aab57600080fd5b50610ac66004803603810190610ac19190614462565b612b0d565b604051610ad39190615231565b60405180910390f35b348015610ae857600080fd5b50610b036004803603810190610afe919061464e565b612b2b565b604051610b109190614e5e565b60405180910390f35b348015610b2557600080fd5b50610b2e612b96565b604051610b3b9190614e94565b60405180910390f35b348015610b5057600080fd5b50610b6b6004803603810190610b669190614462565b612c28565b005b348015610b7957600080fd5b50610b82612c4c565b604051610b8f9190615231565b60405180910390f35b348015610ba457600080fd5b50610bbf6004803603810190610bba919061458f565b612c52565b005b348015610bcd57600080fd5b50610bd6612f06565b604051610be39190614e79565b60405180910390f35b348015610bf857600080fd5b50610c136004803603810190610c0e919061454f565b612f0d565b604051610c209190614e5e565b60405180910390f35b348015610c3557600080fd5b50610c506004803603810190610c4b919061454f565b612f84565b604051610c5d9190614e5e565b60405180910390f35b348015610c7257600080fd5b50610c7b612fa7565b005b348015610c8957600080fd5b50610c92613023565b604051610c9f9190615231565b60405180910390f35b348015610cb457600080fd5b50610ccf6004803603810190610cca91906146bb565b613029565b604051610cdc9190615231565b60405180910390f35b348015610cf157600080fd5b50610d0c6004803603810190610d0791906146bb565b613055565b604051610d199190615216565b60405180910390f35b348015610d2e57600080fd5b50610d496004803603810190610d4491906146bb565b6130a6565b604051610d569190615231565b60405180910390f35b348015610d6b57600080fd5b50610d866004803603810190610d819190614462565b6130e2565b604051610d939190615231565b60405180910390f35b348015610da857600080fd5b50610db1613162565b604051610dbe9190614e79565b60405180910390f35b348015610dd357600080fd5b50610dee6004803603810190610de9919061464e565b613186565b005b348015610dfc57600080fd5b50610e056131a7565b604051610e129190615231565b60405180910390f35b348015610e2757600080fd5b50610e426004803603810190610e3d91906144bc565b6131ad565b604051610e4f9190615231565b60405180910390f35b348015610e6457600080fd5b50610e7f6004803603810190610e7a9190614462565b613234565b005b348015610e8d57600080fd5b50610ea86004803603810190610ea39190614462565b6132b8565b005b600d8181548110610eba57600080fd5b906000526020600020016000915090505481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f415750610f408261333a565b5b9050919050565b606060048054610f5790615577565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8390615577565b8015610fd05780601f10610fa557610100808354040283529160200191610fd0565b820191906000526020600020905b815481529060010190602001808311610fb357829003601f168201915b5050505050905090565b600080610fe56133a4565b9050610ff28185856133ac565b600191505092915050565b6000600354905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c90615036565b60405180910390fd5b6000339050601360009054906101000a900460ff166110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c0906151f6565b60405180910390fd5b600754341461110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110490615096565b60405180910390fd5b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061115982612988565b60005b8351811015611449578273ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8684815181106111cd576111cc6156df565b5b60200260200101516040518263ffffffff1660e01b81526004016111f19190615231565b60206040518083038186803b15801561120957600080fd5b505afa15801561121d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611241919061448f565b73ffffffffffffffffffffffffffffffffffffffff1614611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90614f16565b60405180910390fd5b6000601060008684815181106112b0576112af6156df565b5b6020026020010151815260200190815260200160002090506000816001015414156112df574281600101819055505b6000600f60008785815181106112f8576112f76156df565b5b602002602001015181526020019081526020016000209050858381518110611323576113226156df565b5b6020026020010151816000018190555042816001018190555060b442611349919061537a565b816002018190555083600001868481518110611368576113676156df565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558360010160008154809291906113ab906155da565b919050555084601260008886815181106113c8576113c76156df565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008600081548092919061142f906155da565b919050555050508080611441906155da565b91505061115c565b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166389af610783856040518363ffffffff1660e01b81526004016114a7929190614d75565b600060405180830381600087803b1580156114c157600080fd5b505af11580156114d5573d6000803e3d6000fd5b505050507f134b166c6094cc1ccbf1e3353ce5c3cd9fd29869051bdb999895854d77cc5ef6828460405161150a929190614d75565b60405180910390a1505050565b60126020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60008061155b6133a4565b9050611568858285613577565b611573858585613603565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b60106020528060005260406000206000915090508060000154908060010154905082565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6115ef613887565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61163c8261157f565b61164581613905565b61164f8383613919565b505050565b60006012905090565b6116656133a4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c9906151b6565b60405180910390fd5b6116dc82826139fa565b5050565b6000601360009054906101000a900460ff16156117005760019050611705565b600090505b90565b6000806117136133a4565b905061173481858561172585896131ad565b61172f919061537a565b6133ac565b600191505092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661176981613905565b6117738383613adc565b505050565b6117896117836133a4565b82613c3d565b50565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190615036565b60405180910390fd5b60006012600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061183d83613029565b90506000600f600085815260200190815260200160002090504281600101819055503073ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b815260040161189a929190614da5565b600060405180830381600087803b1580156118b457600080fd5b505af11580156118c8573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048661190d86613029565b60405161191a9190615231565b60405180910390a250505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d90615036565b60405180910390fd5b600033905060005b8251811015611dc9578173ffffffffffffffffffffffffffffffffffffffff16601260008584815181106119d5576119d46156df565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a59906150f6565b60405180910390fd5b6000600f6000858481518110611a7b57611a7a6156df565b5b602002602001015181526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905042816040015110611b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af990615016565b60405180910390fd5b611b25848381518110611b1857611b176156df565b5b602002602001015161178c565b6000601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160010160008154611b7b9061554d565b9190508190551115611c8d578060000160018260000180549050611b9f919061545b565b81548110611bb057611baf6156df565b5b906000526020600020015481600001611c35878681518110611bd557611bd46156df565b5b602002602001015184600001805480602002602001604051908101604052809291908181526020018280548015611c2b57602002820191906000526020600020905b815481526020019060010190808311611c17575b5050505050613e16565b81548110611c4657611c456156df565b5b906000526020600020018190555080600001805480611c6857611c676156b0565b5b60019003818190600052602060002001600090559055611c86614249565b9150611ce8565b601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000611cdd919061426a565b600182016000905550505b60126000868581518110611cff57611cfe6156df565b5b6020026020010151815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560086000815480929190611d4b9061554d565b9190505550600060106000878681518110611d6957611d686156df565b5b602002602001015181526020019081526020016000209050610e10600b54826001015442611d97919061545b565b611da19190615401565b611dab91906153d0565b81600001819055505050508080611dc1906155da565b91505061199e565b50606060005b8351811015611e395782828281518110611dec57611deb6156df565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611e31906155da565b915050611dcf565b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb39e02984836040518363ffffffff1660e01b8152600401611e97929190614e27565b600060405180830381600087803b158015611eb157600080fd5b505af1158015611ec5573d6000803e3d6000fd5b505050507f90f1c675be1a910733f9a62058a69e7860ab05f44dd3e7855c16172b66299fc48184604051611efa929190614dce565b60405180910390a1505050565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663438b6300846040518263ffffffff1660e01b8152600401611f659190614d5a565b60006040518083038186803b158015611f7d57600080fd5b505afa158015611f91573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611fba91906145d8565b9050600080600090505b825181101561209757600060106000858481518110611fe657611fe56156df565b5b602002602001015181526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000816020015114156120305750612084565b6000816000015190506000610e10600b54846020015142612051919061545b565b61205b9190615401565b61206591906153d0565b9050818186612074919061537a565b61207e919061545b565b94505050505b808061208f906155da565b915050611fc4565b508092505050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210790615036565b60405180910390fd5b600060106000838152602001908152602001600020905060008160010154141561216f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216690615116565b60405180910390fd5b600081600001549050600c5481106121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390615056565b60405180910390fd5b6000610e10600b548460010154426121d4919061545b565b6121de9190615401565b6121e891906153d0565b90506000600c548211156122165782600c54612204919061545b565b9050600c54846000018190555061222e565b8282612222919061545b565b90508184600001819055505b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b815260040161228b9190615231565b60206040518083038186803b1580156122a357600080fd5b505afa1580156122b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122db919061448f565b90503073ffffffffffffffffffffffffffffffffffffffff166340c10f1982846040518363ffffffff1660e01b8152600401612318929190614da5565b600060405180830381600087803b15801561233257600080fd5b505af1158015612346573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486836040516123909190615231565b60405180910390a2505050505050565b60006123ab826130a6565b426123b6919061545b565b9050919050565b600a5481565b60606000601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000180548060200260200160405190810160405280929190818152602001828054801561245857602002820191906000526020600020905b815481526020019060010190808311612444575b505050505090508092505050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ce90615036565b60405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663438b6300836040518263ffffffff1660e01b81526004016125349190614d5a565b60006040518083038186803b15801561254c57600080fd5b505afa158015612560573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061258991906145d8565b9050600080600090505b8251811015612686576000601060008584815181106125b5576125b46156df565b5b6020026020010151815260200190815260200160002090506000816001015414156125e05750612673565b6000816000015490506000610e10600b54846001015442612601919061545b565b61260b9190615401565b61261591906153d0565b9050600c5481111561264c5781600c5486612630919061537a565b61263a919061545b565b9450600c54836000018190555061266f565b818186612659919061537a565b612663919061545b565b94508083600001819055505b5050505b808061267e906155da565b915050612593565b50600081111561274c573073ffffffffffffffffffffffffffffffffffffffff166340c10f1984836040518363ffffffff1660e01b81526004016126cb929190614da5565b600060405180830381600087803b1580156126e557600080fd5b505af11580156126f9573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040516127439190615231565b60405180910390a25b505050565b612759613887565b81600a8190555080600b819055505050565b6000801b61277881613905565b8173ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156127be573d6000803e3d6000fd5b505050565b60095481565b60008060106000848152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050600081602001511415612817576000915050612886565b6000816000015190506000610e10600b54846020015142612838919061545b565b6128429190615401565b61284c91906153d0565b90506000600c5482111561286f5782600c54612868919061545b565b905061287e565b828261287b919061545b565b90505b809450505050505b919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6128dc613887565b6128e66000613ea2565b565b6128f0613887565b806007541415612935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292c90615176565b60405180910390fd5b8060078190555050565b6129518261294b6133a4565b83613577565b61295b8282613c3d565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ed90615036565b60405180910390fd5b6000612a01826123c3565b905060005b8151811015612a4557612a32828281518110612a2557612a246156df565b5b602002602001015161178c565b8080612a3d906155da565b915050612a06565b506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663438b6300846040518263ffffffff1660e01b8152600401612aa39190614d5a565b60006040518083038186803b158015612abb57600080fd5b505afa158015612acf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612af891906145d8565b511115612b0957612b0882612469565b5b5050565b60116020528060005260406000206000915090508060010154905081565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060058054612ba590615577565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd190615577565b8015612c1e5780601f10612bf357610100808354040283529160200191612c1e565b820191906000526020600020905b815481529060010190602001808311612c0157829003601f168201915b5050505050905090565b6000801b612c3581613905565b612c4782612c423061288b565b612f84565b505050565b600c5481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb790615036565b60405180910390fd5b60005b8151811015612e11573373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110612d3457612d336156df565b5b60200260200101516040518263ffffffff1660e01b8152600401612d589190615231565b60206040518083038186803b158015612d7057600080fd5b505afa158015612d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da8919061448f565b73ffffffffffffffffffffffffffffffffffffffff1614612dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df590614f36565b60405180910390fd5b8080612e09906155da565b915050612cc3565b50601360009054906101000a900460ff16612e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5890615156565b60405180910390fd5b60005b8151811015612f0257600060106000848481518110612e8657612e856156df565b5b6020026020010151815260200190815260200160002090506000816001015414612ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edc90614ff6565b60405180910390fd5b428160010181905550508080612efa906155da565b915050612e64565b5050565b6000801b81565b600080612f186133a4565b90506000612f2682866131ad565b905083811015612f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6290615196565b60405180910390fd5b612f7882868684036133ac565b60019250505092915050565b600080612f8f6133a4565b9050612f9c818585613603565b600191505092915050565b612faf613887565b601360009054906101000a900460ff1615612fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff690614eb6565b60405180910390fd5b426009819055506001601360006101000a81548160ff021916908315150217905550565b60075481565b6000610e10600a5461303a846123a0565b6130449190615401565b61304e91906153d0565b9050919050565b61305d614249565b6000600f60008481526020019081526020016000209050806040518060600160405290816000820154815260200160018201548152602001600282015481525050915050919050565b600080600f600084815260200190815260200160002090506000816001015414156130d457429150506130dd565b80600101549150505b919050565b6000806130ee836123c3565b9050600080600090505b825181101561314457613124838281518110613117576131166156df565b5b6020026020010151613029565b8261312f919061537a565b9150808061313c906155da565b9150506130f8565b508061314f85611f07565b613159919061537a565b92505050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61318f8261157f565b61319881613905565b6131a283836139fa565b505050565b60085481565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61323c613887565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156132ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a390614f76565b60405180910390fd5b6132b581613ea2565b50565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331d90615036565b60405180910390fd5b613337613332826123c3565b611928565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561341c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341390615136565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561348c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348390614f96565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161356a9190615231565b60405180910390a3505050565b600061358384846131ad565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146135fd57818110156135ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e690614fb6565b60405180910390fd5b6135fc84848484036133ac565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366a906150d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136da90614ef6565b60405180910390fd5b6136ee838383613f66565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376c90614fd6565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461380a919061537a565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161386e9190615231565b60405180910390a3613881848484613f6b565b50505050565b61388f6133a4565b73ffffffffffffffffffffffffffffffffffffffff166138ad61295f565b73ffffffffffffffffffffffffffffffffffffffff1614613903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fa90615076565b60405180910390fd5b565b613916816139116133a4565b613f70565b50565b6139238282612b2b565b6139f65760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061399b6133a4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b613a048282612b2b565b15613ad85760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613a7d6133a4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b43906151d6565b60405180910390fd5b613b5860008383613f66565b8060036000828254613b6a919061537a565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bc0919061537a565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c259190615231565b60405180910390a3613c3960008383613f6b565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ca4906150b6565b60405180910390fd5b613cb982600083613f66565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3790614f56565b60405180910390fd5b818103600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160036000828254613d98919061545b565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613dfd9190615231565b60405180910390a3613e1183600084613f6b565b505050565b60008083604051602001613e2a9190615231565b60405160208183030381529060405280519060200120905060005b8351811015613e995784604051602001613e5f9190615231565b60405160208183030381529060405280519060200120821415613e86578092505050613e9c565b8080613e91906155da565b915050613e45565b50505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b613f7a8282612b2b565b61400957613f9f8173ffffffffffffffffffffffffffffffffffffffff16601461400d565b613fad8360001c602061400d565b604051602001613fbe929190614d20565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140009190614e94565b60405180910390fd5b5050565b6060600060028360026140209190615401565b61402a919061537a565b67ffffffffffffffff8111156140435761404261570e565b5b6040519080825280601f01601f1916602001820160405280156140755781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106140ad576140ac6156df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110614111576141106156df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026141519190615401565b61415b919061537a565b90505b60018111156141fb577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061419d5761419c6156df565b5b1a60f81b8282815181106141b4576141b36156df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806141f49061554d565b905061415e565b506000841461423f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161423690614ed6565b60405180910390fd5b8091505092915050565b60405180606001604052806000815260200160008152602001600081525090565b5080546000825590600052602060002090810190614288919061428b565b50565b5b808211156142a457600081600090555060010161428c565b5090565b60006142bb6142b6846152b5565b615290565b905080838252602082019050828560208602820111156142de576142dd615742565b5b60005b8581101561430e57816142f48882614438565b8452602084019350602083019250506001810190506142e1565b5050509392505050565b600061432b614326846152b5565b615290565b9050808382526020820190508285602086028201111561434e5761434d615742565b5b60005b8581101561437e5781614364888261444d565b845260208401935060208301925050600181019050614351565b5050509392505050565b60008135905061439781615e67565b92915050565b6000815190506143ac81615e67565b92915050565b600082601f8301126143c7576143c661573d565b5b81356143d78482602086016142a8565b91505092915050565b600082601f8301126143f5576143f461573d565b5b8151614405848260208601614318565b91505092915050565b60008135905061441d81615e7e565b92915050565b60008135905061443281615e95565b92915050565b60008135905061444781615eac565b92915050565b60008151905061445c81615eac565b92915050565b6000602082840312156144785761447761574c565b5b600061448684828501614388565b91505092915050565b6000602082840312156144a5576144a461574c565b5b60006144b38482850161439d565b91505092915050565b600080604083850312156144d3576144d261574c565b5b60006144e185828601614388565b92505060206144f285828601614388565b9150509250929050565b6000806000606084860312156145155761451461574c565b5b600061452386828701614388565b935050602061453486828701614388565b925050604061454586828701614438565b9150509250925092565b600080604083850312156145665761456561574c565b5b600061457485828601614388565b925050602061458585828601614438565b9150509250929050565b6000602082840312156145a5576145a461574c565b5b600082013567ffffffffffffffff8111156145c3576145c2615747565b5b6145cf848285016143b2565b91505092915050565b6000602082840312156145ee576145ed61574c565b5b600082015167ffffffffffffffff81111561460c5761460b615747565b5b614618848285016143e0565b91505092915050565b6000602082840312156146375761463661574c565b5b60006146458482850161440e565b91505092915050565b600080604083850312156146655761466461574c565b5b60006146738582860161440e565b925050602061468485828601614388565b9150509250929050565b6000602082840312156146a4576146a361574c565b5b60006146b284828501614423565b91505092915050565b6000602082840312156146d1576146d061574c565b5b60006146df84828501614438565b91505092915050565b600080604083850312156146ff576146fe61574c565b5b600061470d85828601614438565b925050602061471e85828601614438565b9150509250929050565b60006147348383614758565b60208301905092915050565b600061474c8383614cf3565b60208301905092915050565b6147618161548f565b82525050565b6147708161548f565b82525050565b600061478182615301565b61478b818561533c565b9350614796836152e1565b8060005b838110156147c75781516147ae8882614728565b97506147b983615322565b92505060018101905061479a565b5085935050505092915050565b60006147df8261530c565b6147e9818561534d565b93506147f4836152f1565b8060005b8381101561482557815161480c8882614740565b97506148178361532f565b9250506001810190506147f8565b5085935050505092915050565b61483b816154a1565b82525050565b61484a816154ad565b82525050565b600061485b82615317565b614865818561535e565b935061487581856020860161551a565b61487e81615751565b840191505092915050565b600061489482615317565b61489e818561536f565b93506148ae81856020860161551a565b80840191505092915050565b60006148c760188361535e565b91506148d282615762565b602082019050919050565b60006148ea60208361535e565b91506148f58261578b565b602082019050919050565b600061490d60238361535e565b9150614918826157b4565b604082019050919050565b600061493060238361535e565b915061493b82615803565b604082019050919050565b6000614953601f8361535e565b915061495e82615852565b602082019050919050565b600061497660228361535e565b91506149818261587b565b604082019050919050565b600061499960268361535e565b91506149a4826158ca565b604082019050919050565b60006149bc60228361535e565b91506149c782615919565b604082019050919050565b60006149df601d8361535e565b91506149ea82615968565b602082019050919050565b6000614a0260268361535e565b9150614a0d82615991565b604082019050919050565b6000614a2560208361535e565b9150614a30826159e0565b602082019050919050565b6000614a48603b8361535e565b9150614a5382615a09565b604082019050919050565b6000614a6b60138361535e565b9150614a7682615a58565b602082019050919050565b6000614a8e60418361535e565b9150614a9982615a81565b606082019050919050565b6000614ab160208361535e565b9150614abc82615af6565b602082019050919050565b6000614ad460118361535e565b9150614adf82615b1f565b602082019050919050565b6000614af760218361535e565b9150614b0282615b48565b604082019050919050565b6000614b1a60258361535e565b9150614b2582615b97565b604082019050919050565b6000614b3d601c8361535e565b9150614b4882615be6565b602082019050919050565b6000614b6060338361535e565b9150614b6b82615c0f565b604082019050919050565b6000614b8360248361535e565b9150614b8e82615c5e565b604082019050919050565b6000614ba660188361535e565b9150614bb182615cad565b602082019050919050565b6000614bc960178361536f565b9150614bd482615cd6565b601782019050919050565b6000614bec60318361535e565b9150614bf782615cff565b604082019050919050565b6000614c0f60258361535e565b9150614c1a82615d4e565b604082019050919050565b6000614c3260118361536f565b9150614c3d82615d9d565b601182019050919050565b6000614c55602f8361535e565b9150614c6082615dc6565b604082019050919050565b6000614c78601f8361535e565b9150614c8382615e15565b602082019050919050565b6000614c9b601c8361535e565b9150614ca682615e3e565b602082019050919050565b606082016000820151614cc76000850182614cf3565b506020820151614cda6020850182614cf3565b506040820151614ced6040850182614cf3565b50505050565b614cfc81615503565b82525050565b614d0b81615503565b82525050565b614d1a8161550d565b82525050565b6000614d2b82614bbc565b9150614d378285614889565b9150614d4282614c25565b9150614d4e8284614889565b91508190509392505050565b6000602082019050614d6f6000830184614767565b92915050565b6000604082019050614d8a6000830185614767565b8181036020830152614d9c81846147d4565b90509392505050565b6000604082019050614dba6000830185614767565b614dc76020830184614d02565b9392505050565b60006040820190508181036000830152614de88185614776565b90508181036020830152614dfc81846147d4565b90509392505050565b60006020820190508181036000830152614e1f81846147d4565b905092915050565b60006040820190508181036000830152614e4181856147d4565b90508181036020830152614e558184614776565b90509392505050565b6000602082019050614e736000830184614832565b92915050565b6000602082019050614e8e6000830184614841565b92915050565b60006020820190508181036000830152614eae8184614850565b905092915050565b60006020820190508181036000830152614ecf816148ba565b9050919050565b60006020820190508181036000830152614eef816148dd565b9050919050565b60006020820190508181036000830152614f0f81614900565b9050919050565b60006020820190508181036000830152614f2f81614923565b9050919050565b60006020820190508181036000830152614f4f81614946565b9050919050565b60006020820190508181036000830152614f6f81614969565b9050919050565b60006020820190508181036000830152614f8f8161498c565b9050919050565b60006020820190508181036000830152614faf816149af565b9050919050565b60006020820190508181036000830152614fcf816149d2565b9050919050565b60006020820190508181036000830152614fef816149f5565b9050919050565b6000602082019050818103600083015261500f81614a18565b9050919050565b6000602082019050818103600083015261502f81614a3b565b9050919050565b6000602082019050818103600083015261504f81614a5e565b9050919050565b6000602082019050818103600083015261506f81614a81565b9050919050565b6000602082019050818103600083015261508f81614aa4565b9050919050565b600060208201905081810360008301526150af81614ac7565b9050919050565b600060208201905081810360008301526150cf81614aea565b9050919050565b600060208201905081810360008301526150ef81614b0d565b9050919050565b6000602082019050818103600083015261510f81614b30565b9050919050565b6000602082019050818103600083015261512f81614b53565b9050919050565b6000602082019050818103600083015261514f81614b76565b9050919050565b6000602082019050818103600083015261516f81614b99565b9050919050565b6000602082019050818103600083015261518f81614bdf565b9050919050565b600060208201905081810360008301526151af81614c02565b9050919050565b600060208201905081810360008301526151cf81614c48565b9050919050565b600060208201905081810360008301526151ef81614c6b565b9050919050565b6000602082019050818103600083015261520f81614c8e565b9050919050565b600060608201905061522b6000830184614cb1565b92915050565b60006020820190506152466000830184614d02565b92915050565b60006040820190506152616000830185614d02565b61526e6020830184614d02565b9392505050565b600060208201905061528a6000830184614d11565b92915050565b600061529a6152ab565b90506152a682826155a9565b919050565b6000604051905090565b600067ffffffffffffffff8211156152d0576152cf61570e565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061538582615503565b915061539083615503565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153c5576153c4615623565b5b828201905092915050565b60006153db82615503565b91506153e683615503565b9250826153f6576153f5615652565b5b828204905092915050565b600061540c82615503565b915061541783615503565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154505761544f615623565b5b828202905092915050565b600061546682615503565b915061547183615503565b92508282101561548457615483615623565b5b828203905092915050565b600061549a826154e3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101561553857808201518184015260208101905061551d565b83811115615547576000848401525b50505050565b600061555882615503565b9150600082141561556c5761556b615623565b5b600182039050919050565b6000600282049050600182168061558f57607f821691505b602082108114156155a3576155a2615681565b5b50919050565b6155b282615751565b810181811067ffffffffffffffff821117156155d1576155d061570e565b5b80604052505050565b60006155e582615503565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561561857615617615623565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5374616b696e6720616c72656164792073746172746564210000000000000000600082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f596f75206d75737420626520746865206f776e6572206f662074686520746f6b60008201527f656e210000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420616374697661746520756e6f776e656420746f6b656e732100600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f50617373697665206561726e696e6720616c726561647920656e61626c656421600082015250565b7f436f6f6c646f776e3a204d757374207761697420666f7220636f6f6c646f776e60008201527f20706572696f64206265666f7265207769746864726177696e67210000000000602082015250565b7f4e6f20736d61727420636f6e7472616374732100000000000000000000000000600082015250565b7f4d6178696d756d2070617373697665207265776172647320666f72207468697360008201527f20746f6b656e206861766520616c7265616479206265656e20636c61696d656460208201527f2100000000000000000000000000000000000000000000000000000000000000604082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c6964204554482073656e7421000000000000000000000000000000600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420776974686472617720756e6f776e6564204e46542100000000600082015250565b7f596f75206d75737420616374697661746520796f7572204e465420746f20656160008201527f726e207061737369766520726577617264732100000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5374616b696e67206e6f74207965742073746172746564210000000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5570646174656420636f7374206d75737420626520646966666572656e74206660008201527f726f6d2063757272656e7420636f737421000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f546865207374616b696e6720686173206e6f7420737461727465642100000000600082015250565b615e708161548f565b8114615e7b57600080fd5b50565b615e87816154ad565b8114615e9257600080fd5b50565b615e9e816154b7565b8114615ea957600080fd5b50565b615eb581615503565b8114615ec057600080fd5b5056fea2646970667358221220d23a52d5ed16a6c494aed454777bb555a4a3888c8292b85608c2b7d79958212464736f6c63430008070033
Deployed Bytecode
0x60806040526004361061038c5760003560e01c8063690d8320116101dc578063a217fddf11610102578063ceedebe9116100a0578063d66692a71161006f578063d66692a714610df0578063dd62ed3e14610e1b578063f2fde38b14610e58578063fa09e63014610e815761038c565b8063ceedebe914610d22578063d1e4368414610d5f578063d539139314610d9c578063d547741f14610dc75761038c565b8063b4efa66d116100dc578063b4efa66d14610c66578063c0cf442a14610c7d578063c0da620314610ca8578063ce325bf814610ce55761038c565b8063a217fddf14610bc1578063a457c2d714610bec578063a9059cbb14610c295761038c565b80638da5cb5b1161017a57806395d89b411161014957806395d89b4114610b19578063995d921014610b445780639ac62d2814610b6d578063a0a27b9b14610b985761038c565b80638da5cb5b14610a4b5780638f86f58e14610a765780639168ae7214610a9f57806391d1485414610adc5761038c565b806370a08231116101b657806370a08231146109a5578063715018a6146109e257806379a61b09146109f957806379cc679014610a225761038c565b8063690d8320146109145780636abfd1831461093d5780636fe5a12d146109685761038c565b8063313ce567116102c15780634b0b3dc71161025f578063614143581161022e578063614143581461085a57806363c28db11461088557806364b23150146108c2578063654e51e7146108eb5761038c565b80634b0b3dc71461078e5780634ed1556a146107b757806350c58c24146107f457806353951e051461081d5761038c565b8063395093511161029b57806339509351146106d657806340c10f191461071357806342966c681461073c57806344c7d6ef146107655761038c565b8063313ce5671461065757806336568abe14610682578063392e53cd146106ab5761038c565b80631e7bdac11161032e57806326a448961161030857806326a448961461059c578063282c51f3146105da578063286d2e3a146106055780632f2ff15d1461062e5761038c565b80631e7bdac1146104f757806323b872dd14610522578063248a9ca31461055f5761038c565b8063095ea7b31161036a578063095ea7b31461043657806318160ddd14610473578063182c57441461049e5780631caaa487146104ba5761038c565b80630190cde61461039157806301ffc9a7146103ce57806306fdde031461040b575b600080fd5b34801561039d57600080fd5b506103b860048036038101906103b391906146bb565b610eaa565b6040516103c59190615231565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f0919061468e565b610ece565b6040516104029190614e5e565b60405180910390f35b34801561041757600080fd5b50610420610f48565b60405161042d9190614e94565b60405180910390f35b34801561044257600080fd5b5061045d6004803603810190610458919061454f565b610fda565b60405161046a9190614e5e565b60405180910390f35b34801561047f57600080fd5b50610488610ffd565b6040516104959190615231565b60405180910390f35b6104b860048036038101906104b3919061458f565b611007565b005b3480156104c657600080fd5b506104e160048036038101906104dc91906146bb565b611517565b6040516104ee9190614d5a565b60405180910390f35b34801561050357600080fd5b5061050c61154a565b6040516105199190615231565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906144fc565b611550565b6040516105569190614e5e565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190614621565b61157f565b6040516105939190614e79565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be91906146bb565b61159f565b6040516105d192919061524c565b60405180910390f35b3480156105e657600080fd5b506105ef6115c3565b6040516105fc9190614e79565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190614462565b6115e7565b005b34801561063a57600080fd5b506106556004803603810190610650919061464e565b611633565b005b34801561066357600080fd5b5061066c611654565b6040516106799190615275565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a4919061464e565b61165d565b005b3480156106b757600080fd5b506106c06116e0565b6040516106cd9190614e5e565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f8919061454f565b611708565b60405161070a9190614e5e565b60405180910390f35b34801561071f57600080fd5b5061073a6004803603810190610735919061454f565b61173f565b005b34801561074857600080fd5b50610763600480360381019061075e91906146bb565b611778565b005b34801561077157600080fd5b5061078c600480360381019061078791906146bb565b61178c565b005b34801561079a57600080fd5b506107b560048036038101906107b0919061458f565b611928565b005b3480156107c357600080fd5b506107de60048036038101906107d99190614462565b611f07565b6040516107eb9190615231565b60405180910390f35b34801561080057600080fd5b5061081b600480360381019061081691906146bb565b6120a2565b005b34801561082957600080fd5b50610844600480360381019061083f91906146bb565b6123a0565b6040516108519190615231565b60405180910390f35b34801561086657600080fd5b5061086f6123bd565b60405161087c9190615231565b60405180910390f35b34801561089157600080fd5b506108ac60048036038101906108a79190614462565b6123c3565b6040516108b99190614e05565b60405180910390f35b3480156108ce57600080fd5b506108e960048036038101906108e49190614462565b612469565b005b3480156108f757600080fd5b50610912600480360381019061090d91906146e8565b612751565b005b34801561092057600080fd5b5061093b60048036038101906109369190614462565b61276b565b005b34801561094957600080fd5b506109526127c3565b60405161095f9190615231565b60405180910390f35b34801561097457600080fd5b5061098f600480360381019061098a91906146bb565b6127c9565b60405161099c9190615231565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c79190614462565b61288b565b6040516109d99190615231565b60405180910390f35b3480156109ee57600080fd5b506109f76128d4565b005b348015610a0557600080fd5b50610a206004803603810190610a1b91906146bb565b6128e8565b005b348015610a2e57600080fd5b50610a496004803603810190610a44919061454f565b61293f565b005b348015610a5757600080fd5b50610a6061295f565b604051610a6d9190614d5a565b60405180910390f35b348015610a8257600080fd5b50610a9d6004803603810190610a989190614462565b612988565b005b348015610aab57600080fd5b50610ac66004803603810190610ac19190614462565b612b0d565b604051610ad39190615231565b60405180910390f35b348015610ae857600080fd5b50610b036004803603810190610afe919061464e565b612b2b565b604051610b109190614e5e565b60405180910390f35b348015610b2557600080fd5b50610b2e612b96565b604051610b3b9190614e94565b60405180910390f35b348015610b5057600080fd5b50610b6b6004803603810190610b669190614462565b612c28565b005b348015610b7957600080fd5b50610b82612c4c565b604051610b8f9190615231565b60405180910390f35b348015610ba457600080fd5b50610bbf6004803603810190610bba919061458f565b612c52565b005b348015610bcd57600080fd5b50610bd6612f06565b604051610be39190614e79565b60405180910390f35b348015610bf857600080fd5b50610c136004803603810190610c0e919061454f565b612f0d565b604051610c209190614e5e565b60405180910390f35b348015610c3557600080fd5b50610c506004803603810190610c4b919061454f565b612f84565b604051610c5d9190614e5e565b60405180910390f35b348015610c7257600080fd5b50610c7b612fa7565b005b348015610c8957600080fd5b50610c92613023565b604051610c9f9190615231565b60405180910390f35b348015610cb457600080fd5b50610ccf6004803603810190610cca91906146bb565b613029565b604051610cdc9190615231565b60405180910390f35b348015610cf157600080fd5b50610d0c6004803603810190610d0791906146bb565b613055565b604051610d199190615216565b60405180910390f35b348015610d2e57600080fd5b50610d496004803603810190610d4491906146bb565b6130a6565b604051610d569190615231565b60405180910390f35b348015610d6b57600080fd5b50610d866004803603810190610d819190614462565b6130e2565b604051610d939190615231565b60405180910390f35b348015610da857600080fd5b50610db1613162565b604051610dbe9190614e79565b60405180910390f35b348015610dd357600080fd5b50610dee6004803603810190610de9919061464e565b613186565b005b348015610dfc57600080fd5b50610e056131a7565b604051610e129190615231565b60405180910390f35b348015610e2757600080fd5b50610e426004803603810190610e3d91906144bc565b6131ad565b604051610e4f9190615231565b60405180910390f35b348015610e6457600080fd5b50610e7f6004803603810190610e7a9190614462565b613234565b005b348015610e8d57600080fd5b50610ea86004803603810190610ea39190614462565b6132b8565b005b600d8181548110610eba57600080fd5b906000526020600020016000915090505481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f415750610f408261333a565b5b9050919050565b606060048054610f5790615577565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8390615577565b8015610fd05780601f10610fa557610100808354040283529160200191610fd0565b820191906000526020600020905b815481529060010190602001808311610fb357829003601f168201915b5050505050905090565b600080610fe56133a4565b9050610ff28185856133ac565b600191505092915050565b6000600354905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c90615036565b60405180910390fd5b6000339050601360009054906101000a900460ff166110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c0906151f6565b60405180910390fd5b600754341461110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110490615096565b60405180910390fd5b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061115982612988565b60005b8351811015611449578273ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8684815181106111cd576111cc6156df565b5b60200260200101516040518263ffffffff1660e01b81526004016111f19190615231565b60206040518083038186803b15801561120957600080fd5b505afa15801561121d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611241919061448f565b73ffffffffffffffffffffffffffffffffffffffff1614611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90614f16565b60405180910390fd5b6000601060008684815181106112b0576112af6156df565b5b6020026020010151815260200190815260200160002090506000816001015414156112df574281600101819055505b6000600f60008785815181106112f8576112f76156df565b5b602002602001015181526020019081526020016000209050858381518110611323576113226156df565b5b6020026020010151816000018190555042816001018190555060b442611349919061537a565b816002018190555083600001868481518110611368576113676156df565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558360010160008154809291906113ab906155da565b919050555084601260008886815181106113c8576113c76156df565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008600081548092919061142f906155da565b919050555050508080611441906155da565b91505061115c565b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166389af610783856040518363ffffffff1660e01b81526004016114a7929190614d75565b600060405180830381600087803b1580156114c157600080fd5b505af11580156114d5573d6000803e3d6000fd5b505050507f134b166c6094cc1ccbf1e3353ce5c3cd9fd29869051bdb999895854d77cc5ef6828460405161150a929190614d75565b60405180910390a1505050565b60126020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60008061155b6133a4565b9050611568858285613577565b611573858585613603565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b60106020528060005260406000206000915090508060000154908060010154905082565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6115ef613887565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61163c8261157f565b61164581613905565b61164f8383613919565b505050565b60006012905090565b6116656133a4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c9906151b6565b60405180910390fd5b6116dc82826139fa565b5050565b6000601360009054906101000a900460ff16156117005760019050611705565b600090505b90565b6000806117136133a4565b905061173481858561172585896131ad565b61172f919061537a565b6133ac565b600191505092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661176981613905565b6117738383613adc565b505050565b6117896117836133a4565b82613c3d565b50565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190615036565b60405180910390fd5b60006012600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061183d83613029565b90506000600f600085815260200190815260200160002090504281600101819055503073ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b815260040161189a929190614da5565b600060405180830381600087803b1580156118b457600080fd5b505af11580156118c8573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048661190d86613029565b60405161191a9190615231565b60405180910390a250505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d90615036565b60405180910390fd5b600033905060005b8251811015611dc9578173ffffffffffffffffffffffffffffffffffffffff16601260008584815181106119d5576119d46156df565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a59906150f6565b60405180910390fd5b6000600f6000858481518110611a7b57611a7a6156df565b5b602002602001015181526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905042816040015110611b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af990615016565b60405180910390fd5b611b25848381518110611b1857611b176156df565b5b602002602001015161178c565b6000601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160010160008154611b7b9061554d565b9190508190551115611c8d578060000160018260000180549050611b9f919061545b565b81548110611bb057611baf6156df565b5b906000526020600020015481600001611c35878681518110611bd557611bd46156df565b5b602002602001015184600001805480602002602001604051908101604052809291908181526020018280548015611c2b57602002820191906000526020600020905b815481526020019060010190808311611c17575b5050505050613e16565b81548110611c4657611c456156df565b5b906000526020600020018190555080600001805480611c6857611c676156b0565b5b60019003818190600052602060002001600090559055611c86614249565b9150611ce8565b601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000611cdd919061426a565b600182016000905550505b60126000868581518110611cff57611cfe6156df565b5b6020026020010151815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560086000815480929190611d4b9061554d565b9190505550600060106000878681518110611d6957611d686156df565b5b602002602001015181526020019081526020016000209050610e10600b54826001015442611d97919061545b565b611da19190615401565b611dab91906153d0565b81600001819055505050508080611dc1906155da565b91505061199e565b50606060005b8351811015611e395782828281518110611dec57611deb6156df565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611e31906155da565b915050611dcf565b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb39e02984836040518363ffffffff1660e01b8152600401611e97929190614e27565b600060405180830381600087803b158015611eb157600080fd5b505af1158015611ec5573d6000803e3d6000fd5b505050507f90f1c675be1a910733f9a62058a69e7860ab05f44dd3e7855c16172b66299fc48184604051611efa929190614dce565b60405180910390a1505050565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663438b6300846040518263ffffffff1660e01b8152600401611f659190614d5a565b60006040518083038186803b158015611f7d57600080fd5b505afa158015611f91573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611fba91906145d8565b9050600080600090505b825181101561209757600060106000858481518110611fe657611fe56156df565b5b602002602001015181526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000816020015114156120305750612084565b6000816000015190506000610e10600b54846020015142612051919061545b565b61205b9190615401565b61206591906153d0565b9050818186612074919061537a565b61207e919061545b565b94505050505b808061208f906155da565b915050611fc4565b508092505050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210790615036565b60405180910390fd5b600060106000838152602001908152602001600020905060008160010154141561216f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216690615116565b60405180910390fd5b600081600001549050600c5481106121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390615056565b60405180910390fd5b6000610e10600b548460010154426121d4919061545b565b6121de9190615401565b6121e891906153d0565b90506000600c548211156122165782600c54612204919061545b565b9050600c54846000018190555061222e565b8282612222919061545b565b90508184600001819055505b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff1660e01b815260040161228b9190615231565b60206040518083038186803b1580156122a357600080fd5b505afa1580156122b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122db919061448f565b90503073ffffffffffffffffffffffffffffffffffffffff166340c10f1982846040518363ffffffff1660e01b8152600401612318929190614da5565b600060405180830381600087803b15801561233257600080fd5b505af1158015612346573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486836040516123909190615231565b60405180910390a2505050505050565b60006123ab826130a6565b426123b6919061545b565b9050919050565b600a5481565b60606000601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000180548060200260200160405190810160405280929190818152602001828054801561245857602002820191906000526020600020905b815481526020019060010190808311612444575b505050505090508092505050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ce90615036565b60405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663438b6300836040518263ffffffff1660e01b81526004016125349190614d5a565b60006040518083038186803b15801561254c57600080fd5b505afa158015612560573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061258991906145d8565b9050600080600090505b8251811015612686576000601060008584815181106125b5576125b46156df565b5b6020026020010151815260200190815260200160002090506000816001015414156125e05750612673565b6000816000015490506000610e10600b54846001015442612601919061545b565b61260b9190615401565b61261591906153d0565b9050600c5481111561264c5781600c5486612630919061537a565b61263a919061545b565b9450600c54836000018190555061266f565b818186612659919061537a565b612663919061545b565b94508083600001819055505b5050505b808061267e906155da565b915050612593565b50600081111561274c573073ffffffffffffffffffffffffffffffffffffffff166340c10f1984836040518363ffffffff1660e01b81526004016126cb929190614da5565b600060405180830381600087803b1580156126e557600080fd5b505af11580156126f9573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040516127439190615231565b60405180910390a25b505050565b612759613887565b81600a8190555080600b819055505050565b6000801b61277881613905565b8173ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156127be573d6000803e3d6000fd5b505050565b60095481565b60008060106000848152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050600081602001511415612817576000915050612886565b6000816000015190506000610e10600b54846020015142612838919061545b565b6128429190615401565b61284c91906153d0565b90506000600c5482111561286f5782600c54612868919061545b565b905061287e565b828261287b919061545b565b90505b809450505050505b919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6128dc613887565b6128e66000613ea2565b565b6128f0613887565b806007541415612935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292c90615176565b60405180910390fd5b8060078190555050565b6129518261294b6133a4565b83613577565b61295b8282613c3d565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ed90615036565b60405180910390fd5b6000612a01826123c3565b905060005b8151811015612a4557612a32828281518110612a2557612a246156df565b5b602002602001015161178c565b8080612a3d906155da565b915050612a06565b506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663438b6300846040518263ffffffff1660e01b8152600401612aa39190614d5a565b60006040518083038186803b158015612abb57600080fd5b505afa158015612acf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612af891906145d8565b511115612b0957612b0882612469565b5b5050565b60116020528060005260406000206000915090508060010154905081565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060058054612ba590615577565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd190615577565b8015612c1e5780601f10612bf357610100808354040283529160200191612c1e565b820191906000526020600020905b815481529060010190602001808311612c0157829003601f168201915b5050505050905090565b6000801b612c3581613905565b612c4782612c423061288b565b612f84565b505050565b600c5481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb790615036565b60405180910390fd5b60005b8151811015612e11573373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110612d3457612d336156df565b5b60200260200101516040518263ffffffff1660e01b8152600401612d589190615231565b60206040518083038186803b158015612d7057600080fd5b505afa158015612d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da8919061448f565b73ffffffffffffffffffffffffffffffffffffffff1614612dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df590614f36565b60405180910390fd5b8080612e09906155da565b915050612cc3565b50601360009054906101000a900460ff16612e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5890615156565b60405180910390fd5b60005b8151811015612f0257600060106000848481518110612e8657612e856156df565b5b6020026020010151815260200190815260200160002090506000816001015414612ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edc90614ff6565b60405180910390fd5b428160010181905550508080612efa906155da565b915050612e64565b5050565b6000801b81565b600080612f186133a4565b90506000612f2682866131ad565b905083811015612f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6290615196565b60405180910390fd5b612f7882868684036133ac565b60019250505092915050565b600080612f8f6133a4565b9050612f9c818585613603565b600191505092915050565b612faf613887565b601360009054906101000a900460ff1615612fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff690614eb6565b60405180910390fd5b426009819055506001601360006101000a81548160ff021916908315150217905550565b60075481565b6000610e10600a5461303a846123a0565b6130449190615401565b61304e91906153d0565b9050919050565b61305d614249565b6000600f60008481526020019081526020016000209050806040518060600160405290816000820154815260200160018201548152602001600282015481525050915050919050565b600080600f600084815260200190815260200160002090506000816001015414156130d457429150506130dd565b80600101549150505b919050565b6000806130ee836123c3565b9050600080600090505b825181101561314457613124838281518110613117576131166156df565b5b6020026020010151613029565b8261312f919061537a565b9150808061313c906155da565b9150506130f8565b508061314f85611f07565b613159919061537a565b92505050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61318f8261157f565b61319881613905565b6131a283836139fa565b505050565b60085481565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61323c613887565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156132ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a390614f76565b60405180910390fd5b6132b581613ea2565b50565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331d90615036565b60405180910390fd5b613337613332826123c3565b611928565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561341c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341390615136565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561348c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348390614f96565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161356a9190615231565b60405180910390a3505050565b600061358384846131ad565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146135fd57818110156135ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e690614fb6565b60405180910390fd5b6135fc84848484036133ac565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366a906150d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136da90614ef6565b60405180910390fd5b6136ee838383613f66565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376c90614fd6565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461380a919061537a565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161386e9190615231565b60405180910390a3613881848484613f6b565b50505050565b61388f6133a4565b73ffffffffffffffffffffffffffffffffffffffff166138ad61295f565b73ffffffffffffffffffffffffffffffffffffffff1614613903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fa90615076565b60405180910390fd5b565b613916816139116133a4565b613f70565b50565b6139238282612b2b565b6139f65760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061399b6133a4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b613a048282612b2b565b15613ad85760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550613a7d6133a4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b43906151d6565b60405180910390fd5b613b5860008383613f66565b8060036000828254613b6a919061537a565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bc0919061537a565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c259190615231565b60405180910390a3613c3960008383613f6b565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ca4906150b6565b60405180910390fd5b613cb982600083613f66565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3790614f56565b60405180910390fd5b818103600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160036000828254613d98919061545b565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613dfd9190615231565b60405180910390a3613e1183600084613f6b565b505050565b60008083604051602001613e2a9190615231565b60405160208183030381529060405280519060200120905060005b8351811015613e995784604051602001613e5f9190615231565b60405160208183030381529060405280519060200120821415613e86578092505050613e9c565b8080613e91906155da565b915050613e45565b50505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b613f7a8282612b2b565b61400957613f9f8173ffffffffffffffffffffffffffffffffffffffff16601461400d565b613fad8360001c602061400d565b604051602001613fbe929190614d20565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140009190614e94565b60405180910390fd5b5050565b6060600060028360026140209190615401565b61402a919061537a565b67ffffffffffffffff8111156140435761404261570e565b5b6040519080825280601f01601f1916602001820160405280156140755781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106140ad576140ac6156df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110614111576141106156df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026141519190615401565b61415b919061537a565b90505b60018111156141fb577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061419d5761419c6156df565b5b1a60f81b8282815181106141b4576141b36156df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806141f49061554d565b905061415e565b506000841461423f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161423690614ed6565b60405180910390fd5b8091505092915050565b60405180606001604052806000815260200160008152602001600081525090565b5080546000825590600052602060002090810190614288919061428b565b50565b5b808211156142a457600081600090555060010161428c565b5090565b60006142bb6142b6846152b5565b615290565b905080838252602082019050828560208602820111156142de576142dd615742565b5b60005b8581101561430e57816142f48882614438565b8452602084019350602083019250506001810190506142e1565b5050509392505050565b600061432b614326846152b5565b615290565b9050808382526020820190508285602086028201111561434e5761434d615742565b5b60005b8581101561437e5781614364888261444d565b845260208401935060208301925050600181019050614351565b5050509392505050565b60008135905061439781615e67565b92915050565b6000815190506143ac81615e67565b92915050565b600082601f8301126143c7576143c661573d565b5b81356143d78482602086016142a8565b91505092915050565b600082601f8301126143f5576143f461573d565b5b8151614405848260208601614318565b91505092915050565b60008135905061441d81615e7e565b92915050565b60008135905061443281615e95565b92915050565b60008135905061444781615eac565b92915050565b60008151905061445c81615eac565b92915050565b6000602082840312156144785761447761574c565b5b600061448684828501614388565b91505092915050565b6000602082840312156144a5576144a461574c565b5b60006144b38482850161439d565b91505092915050565b600080604083850312156144d3576144d261574c565b5b60006144e185828601614388565b92505060206144f285828601614388565b9150509250929050565b6000806000606084860312156145155761451461574c565b5b600061452386828701614388565b935050602061453486828701614388565b925050604061454586828701614438565b9150509250925092565b600080604083850312156145665761456561574c565b5b600061457485828601614388565b925050602061458585828601614438565b9150509250929050565b6000602082840312156145a5576145a461574c565b5b600082013567ffffffffffffffff8111156145c3576145c2615747565b5b6145cf848285016143b2565b91505092915050565b6000602082840312156145ee576145ed61574c565b5b600082015167ffffffffffffffff81111561460c5761460b615747565b5b614618848285016143e0565b91505092915050565b6000602082840312156146375761463661574c565b5b60006146458482850161440e565b91505092915050565b600080604083850312156146655761466461574c565b5b60006146738582860161440e565b925050602061468485828601614388565b9150509250929050565b6000602082840312156146a4576146a361574c565b5b60006146b284828501614423565b91505092915050565b6000602082840312156146d1576146d061574c565b5b60006146df84828501614438565b91505092915050565b600080604083850312156146ff576146fe61574c565b5b600061470d85828601614438565b925050602061471e85828601614438565b9150509250929050565b60006147348383614758565b60208301905092915050565b600061474c8383614cf3565b60208301905092915050565b6147618161548f565b82525050565b6147708161548f565b82525050565b600061478182615301565b61478b818561533c565b9350614796836152e1565b8060005b838110156147c75781516147ae8882614728565b97506147b983615322565b92505060018101905061479a565b5085935050505092915050565b60006147df8261530c565b6147e9818561534d565b93506147f4836152f1565b8060005b8381101561482557815161480c8882614740565b97506148178361532f565b9250506001810190506147f8565b5085935050505092915050565b61483b816154a1565b82525050565b61484a816154ad565b82525050565b600061485b82615317565b614865818561535e565b935061487581856020860161551a565b61487e81615751565b840191505092915050565b600061489482615317565b61489e818561536f565b93506148ae81856020860161551a565b80840191505092915050565b60006148c760188361535e565b91506148d282615762565b602082019050919050565b60006148ea60208361535e565b91506148f58261578b565b602082019050919050565b600061490d60238361535e565b9150614918826157b4565b604082019050919050565b600061493060238361535e565b915061493b82615803565b604082019050919050565b6000614953601f8361535e565b915061495e82615852565b602082019050919050565b600061497660228361535e565b91506149818261587b565b604082019050919050565b600061499960268361535e565b91506149a4826158ca565b604082019050919050565b60006149bc60228361535e565b91506149c782615919565b604082019050919050565b60006149df601d8361535e565b91506149ea82615968565b602082019050919050565b6000614a0260268361535e565b9150614a0d82615991565b604082019050919050565b6000614a2560208361535e565b9150614a30826159e0565b602082019050919050565b6000614a48603b8361535e565b9150614a5382615a09565b604082019050919050565b6000614a6b60138361535e565b9150614a7682615a58565b602082019050919050565b6000614a8e60418361535e565b9150614a9982615a81565b606082019050919050565b6000614ab160208361535e565b9150614abc82615af6565b602082019050919050565b6000614ad460118361535e565b9150614adf82615b1f565b602082019050919050565b6000614af760218361535e565b9150614b0282615b48565b604082019050919050565b6000614b1a60258361535e565b9150614b2582615b97565b604082019050919050565b6000614b3d601c8361535e565b9150614b4882615be6565b602082019050919050565b6000614b6060338361535e565b9150614b6b82615c0f565b604082019050919050565b6000614b8360248361535e565b9150614b8e82615c5e565b604082019050919050565b6000614ba660188361535e565b9150614bb182615cad565b602082019050919050565b6000614bc960178361536f565b9150614bd482615cd6565b601782019050919050565b6000614bec60318361535e565b9150614bf782615cff565b604082019050919050565b6000614c0f60258361535e565b9150614c1a82615d4e565b604082019050919050565b6000614c3260118361536f565b9150614c3d82615d9d565b601182019050919050565b6000614c55602f8361535e565b9150614c6082615dc6565b604082019050919050565b6000614c78601f8361535e565b9150614c8382615e15565b602082019050919050565b6000614c9b601c8361535e565b9150614ca682615e3e565b602082019050919050565b606082016000820151614cc76000850182614cf3565b506020820151614cda6020850182614cf3565b506040820151614ced6040850182614cf3565b50505050565b614cfc81615503565b82525050565b614d0b81615503565b82525050565b614d1a8161550d565b82525050565b6000614d2b82614bbc565b9150614d378285614889565b9150614d4282614c25565b9150614d4e8284614889565b91508190509392505050565b6000602082019050614d6f6000830184614767565b92915050565b6000604082019050614d8a6000830185614767565b8181036020830152614d9c81846147d4565b90509392505050565b6000604082019050614dba6000830185614767565b614dc76020830184614d02565b9392505050565b60006040820190508181036000830152614de88185614776565b90508181036020830152614dfc81846147d4565b90509392505050565b60006020820190508181036000830152614e1f81846147d4565b905092915050565b60006040820190508181036000830152614e4181856147d4565b90508181036020830152614e558184614776565b90509392505050565b6000602082019050614e736000830184614832565b92915050565b6000602082019050614e8e6000830184614841565b92915050565b60006020820190508181036000830152614eae8184614850565b905092915050565b60006020820190508181036000830152614ecf816148ba565b9050919050565b60006020820190508181036000830152614eef816148dd565b9050919050565b60006020820190508181036000830152614f0f81614900565b9050919050565b60006020820190508181036000830152614f2f81614923565b9050919050565b60006020820190508181036000830152614f4f81614946565b9050919050565b60006020820190508181036000830152614f6f81614969565b9050919050565b60006020820190508181036000830152614f8f8161498c565b9050919050565b60006020820190508181036000830152614faf816149af565b9050919050565b60006020820190508181036000830152614fcf816149d2565b9050919050565b60006020820190508181036000830152614fef816149f5565b9050919050565b6000602082019050818103600083015261500f81614a18565b9050919050565b6000602082019050818103600083015261502f81614a3b565b9050919050565b6000602082019050818103600083015261504f81614a5e565b9050919050565b6000602082019050818103600083015261506f81614a81565b9050919050565b6000602082019050818103600083015261508f81614aa4565b9050919050565b600060208201905081810360008301526150af81614ac7565b9050919050565b600060208201905081810360008301526150cf81614aea565b9050919050565b600060208201905081810360008301526150ef81614b0d565b9050919050565b6000602082019050818103600083015261510f81614b30565b9050919050565b6000602082019050818103600083015261512f81614b53565b9050919050565b6000602082019050818103600083015261514f81614b76565b9050919050565b6000602082019050818103600083015261516f81614b99565b9050919050565b6000602082019050818103600083015261518f81614bdf565b9050919050565b600060208201905081810360008301526151af81614c02565b9050919050565b600060208201905081810360008301526151cf81614c48565b9050919050565b600060208201905081810360008301526151ef81614c6b565b9050919050565b6000602082019050818103600083015261520f81614c8e565b9050919050565b600060608201905061522b6000830184614cb1565b92915050565b60006020820190506152466000830184614d02565b92915050565b60006040820190506152616000830185614d02565b61526e6020830184614d02565b9392505050565b600060208201905061528a6000830184614d11565b92915050565b600061529a6152ab565b90506152a682826155a9565b919050565b6000604051905090565b600067ffffffffffffffff8211156152d0576152cf61570e565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061538582615503565b915061539083615503565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153c5576153c4615623565b5b828201905092915050565b60006153db82615503565b91506153e683615503565b9250826153f6576153f5615652565b5b828204905092915050565b600061540c82615503565b915061541783615503565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154505761544f615623565b5b828202905092915050565b600061546682615503565b915061547183615503565b92508282101561548457615483615623565b5b828203905092915050565b600061549a826154e3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101561553857808201518184015260208101905061551d565b83811115615547576000848401525b50505050565b600061555882615503565b9150600082141561556c5761556b615623565b5b600182039050919050565b6000600282049050600182168061558f57607f821691505b602082108114156155a3576155a2615681565b5b50919050565b6155b282615751565b810181811067ffffffffffffffff821117156155d1576155d061570e565b5b80604052505050565b60006155e582615503565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561561857615617615623565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5374616b696e6720616c72656164792073746172746564210000000000000000600082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f596f75206d75737420626520746865206f776e6572206f662074686520746f6b60008201527f656e210000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420616374697661746520756e6f776e656420746f6b656e732100600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f50617373697665206561726e696e6720616c726561647920656e61626c656421600082015250565b7f436f6f6c646f776e3a204d757374207761697420666f7220636f6f6c646f776e60008201527f20706572696f64206265666f7265207769746864726177696e67210000000000602082015250565b7f4e6f20736d61727420636f6e7472616374732100000000000000000000000000600082015250565b7f4d6178696d756d2070617373697665207265776172647320666f72207468697360008201527f20746f6b656e206861766520616c7265616479206265656e20636c61696d656460208201527f2100000000000000000000000000000000000000000000000000000000000000604082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c6964204554482073656e7421000000000000000000000000000000600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420776974686472617720756e6f776e6564204e46542100000000600082015250565b7f596f75206d75737420616374697661746520796f7572204e465420746f20656160008201527f726e207061737369766520726577617264732100000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5374616b696e67206e6f74207965742073746172746564210000000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5570646174656420636f7374206d75737420626520646966666572656e74206660008201527f726f6d2063757272656e7420636f737421000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f546865207374616b696e6720686173206e6f7420737461727465642100000000600082015250565b615e708161548f565b8114615e7b57600080fd5b50565b615e87816154ad565b8114615e9257600080fd5b50565b615e9e816154b7565b8114615ea957600080fd5b50565b615eb581615503565b8114615ec057600080fd5b5056fea2646970667358221220d23a52d5ed16a6c494aed454777bb555a4a3888c8292b85608c2b7d79958212464736f6c63430008070033
Deployed Bytecode Sourcemap
52083:11773:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52508:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27451:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38893:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41244:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40013:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55266:1172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53358:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52385:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42025:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29287:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53137:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;51407:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54295:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29728:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39855:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30872:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54134:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42729:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51682:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50262:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62101:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56562:1507;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61280:617;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58691:967;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63141:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52329:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55029:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59666:1028;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54407:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51941:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52291:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60702:570;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40184:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24057:103;;;;;;;;;;;;;:::i;:::-;;54591:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50672:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23409:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62515:361;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53250:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27747:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39112:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51801:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52447:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58104:579;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26852:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43470:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40517:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54804:182;;;;;;;;;;;;;:::i;:::-;;52221:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63291:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61929:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62885:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63457:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51338:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30168:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52258:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40773:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24315:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56446:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52508:53;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27451:204::-;27536:4;27575:32;27560:47;;;:11;:47;;;;:87;;;;27611:36;27635:11;27611:23;:36::i;:::-;27560:87;27553:94;;27451:204;;;:::o;38893:100::-;38947:13;38980:5;38973:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38893:100;:::o;41244:201::-;41327:4;41344:13;41360:12;:10;:12::i;:::-;41344:28;;41383:32;41392:5;41399:7;41408:6;41383:8;:32::i;:::-;41433:4;41426:11;;;41244:201;;;;:::o;40013:108::-;40074:7;40101:12;;40094:19;;40013:108;:::o;55266:1172::-;52623:9;52609:23;;:10;:23;;;52601:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;55346:13:::1;55362:10;55346:26;;55391:11;;;;;;;;;;;55383:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;55467:11;;55454:9;:24;55446:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;55511:22;55536:7;:14;55544:5;55536:14;;;;;;;;;;;;;;;55511:39;;55561:21;55576:5;55561:14;:21::i;:::-;55598:9;55593:724;55617:9;:16;55613:1;:20;55593:724;;;55715:5;55663:57;;55676:12;;;;;;;;;;;55663:34;;;55698:9;55708:1;55698:12;;;;;;;;:::i;:::-;;;;;;;;55663:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;55655:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;55775:34;55812:13;:27;55826:9;55836:1;55826:12;;;;;;;;:::i;:::-;;;;;;;;55812:27;;;;;;;;;;;55775:64;;55881:1;55858:13;:19;;;:24;55854:70;;;55907:15;55885:13;:19;;:37;;;;55854:70;55938:20;55961:14;:28;55976:9;55986:1;55976:12;;;;;;;;:::i;:::-;;;;;;;;55961:28;;;;;;;;;;;55938:51;;56021:9;56031:1;56021:12;;;;;;;;:::i;:::-;;;;;;;;56004:6;:14;;:29;;;;56063:15;56048:6;:12;;:30;;;;52166:11;56111:15;:29;;;;:::i;:::-;56093:6;:15;;:47;;;;56156:7;:20;;56182:9;56192:1;56182:12;;;;;;;;:::i;:::-;;;;;;;;56156:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56210:7;:18;;;:20;;;;;;;;;:::i;:::-;;;;;;56272:5;56245:10;:24;56256:9;56266:1;56256:12;;;;;;;;:::i;:::-;;;;;;;;56245:24;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;56292:11;;:13;;;;;;;;;:::i;:::-;;;;;;55640:677;;55635:3;;;;;:::i;:::-;;;;55593:724;;;;56340:12;;;;;;;;;;;56327:35;;;56363:5;56370:9;56327:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56396:24;56403:5;56410:9;56396:24;;;;;;;:::i;:::-;;;;;;;;55335:1103;;55266:1172:::0;:::o;53358:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;52385:55::-;;;;:::o;42025:295::-;42156:4;42173:15;42191:12;:10;:12::i;:::-;42173:30;;42214:38;42230:4;42236:7;42245:6;42214:15;:38::i;:::-;42263:27;42273:4;42279:2;42283:6;42263:9;:27::i;:::-;42308:4;42301:11;;;42025:295;;;;;:::o;29287:131::-;29361:7;29388:6;:12;29395:4;29388:12;;;;;;;;;;;:22;;;29381:29;;29287:131;;;:::o;53137:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51407:62::-;51445:24;51407:62;:::o;54295:104::-;23295:13;:11;:13::i;:::-;54382:9:::1;54367:12;;:24;;;;;;;;;;;;;;;;;;54295:104:::0;:::o;29728:147::-;29811:18;29824:4;29811:12;:18::i;:::-;27343:16;27354:4;27343:10;:16::i;:::-;29842:25:::1;29853:4;29859:7;29842:10;:25::i;:::-;29728:147:::0;;;:::o;39855:93::-;39913:5;39938:2;39931:9;;39855:93;:::o;30872:218::-;30979:12;:10;:12::i;:::-;30968:23;;:7;:23;;;30960:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;31056:26;31068:4;31074:7;31056:11;:26::i;:::-;30872:218;;:::o;54134:127::-;54180:9;54206:11;;;;;;;;;;;54202:52;;;54227:4;54220:11;;;;54202:52;54247:5;54240:12;;54134:127;;:::o;42729:238::-;42817:4;42834:13;42850:12;:10;:12::i;:::-;42834:28;;42873:64;42882:5;42889:7;42926:10;42898:25;42908:5;42915:7;42898:9;:25::i;:::-;:38;;;;:::i;:::-;42873:8;:64::i;:::-;42955:4;42948:11;;;42729:238;;;;:::o;51682:111::-;51376:24;27343:16;27354:4;27343:10;:16::i;:::-;51766:19:::1;51772:3;51777:7;51766:5;:19::i;:::-;51682:111:::0;;;:::o;50262:91::-;50318:27;50324:12;:10;:12::i;:::-;50338:6;50318:5;:27::i;:::-;50262:91;:::o;62101:406::-;52623:9;52609:23;;:10;:23;;;52601:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;62165:13:::1;62181:10;:20;62192:8;62181:20;;;;;;;;;;;;;;;;;;;;;62165:36;;62212:16;62231:32;62254:8;62231:22;:32::i;:::-;62212:51;;62281:20;62304:14;:24;62319:8;62304:24;;;;;;;;;;;62281:47;;62354:15;62339:6;:12;;:30;;;;62401:4;62380:32;;;62413:5;62420:11;62380:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;62459:5;62448:51;;;62466:32;62489:8;62466:22;:32::i;:::-;62448:51;;;;;;:::i;:::-;;;;;;;;62154:353;;;62101:406:::0;:::o;56562:1507::-;52623:9;52609:23;;:10;:23;;;52601:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56637:13:::1;56653:10;56637:26;;56679:9;56674:1130;56698:9;:16;56694:1;:20;56674:1130;;;56790:5;56762:33;;:10;:24;56773:9;56783:1;56773:12;;;;;;;;:::i;:::-;;;;;;;;56762:24;;;;;;;;;;;;;;;;;;;;;:33;;;56736:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;56874:19;56896:14;:28;56911:9;56921:1;56911:12;;;;;;;;:::i;:::-;;;;;;;;56896:28;;;;;;;;;;;56874:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;56983:15;56965:6;:15;;;:33;56939:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;57108:24;57119:9;57129:1;57119:12;;;;;;;;:::i;:::-;;;;;;;;57108:10;:24::i;:::-;57147:22;57172:7;:14;57180:5;57172:14;;;;;;;;;;;;;;;57147:39;;57229:1;57208:7;:18;;;57206:20;;;;;:::i;:::-;;;;;;;:24;57202:327;;;57321:7;:20;;57372:1;57342:7;:20;;:27;;;;:31;;;;:::i;:::-;57321:53;;;;;;;;:::i;:::-;;;;;;;;;;57252:7;:20;;57273:44;57282:9;57292:1;57282:12;;;;;;;;:::i;:::-;;;;;;;;57296:7;:20;;57273:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:44::i;:::-;57252:66;;;;;;;;:::i;:::-;;;;;;;;;:122;;;;57393:7;:20;;:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57438:13;;:::i;:::-;;;57202:327;;;57499:7;:14;57507:5;57499:14;;;;;;;;;;;;;;;;57492:21:::0;::::1;;;;;;;:::i;:::-;;;;;;;;;57202:327;57550:10;:24;57561:9;57571:1;57561:12;;;;;;;;:::i;:::-;;;;;;;;57550:24;;;;;;;;;;;;57543:31;;;;;;;;;;;57589:11;;:13;;;;;;;;;:::i;:::-;;;;;;57617:34;57654:13;:27;57668:9;57678:1;57668:12;;;;;;;;:::i;:::-;;;;;;;;57654:27;;;;;;;;;;;57617:64;;57785:7;57762:20;;57739:13;:19;;;57721:15;:37;;;;:::i;:::-;57720:62;;;;:::i;:::-;:72;;;;:::i;:::-;57696:13;:21;;:96;;;;56721:1083;;;56716:3;;;;;:::i;:::-;;;;56674:1130;;;;57814:27;57857:6;57852:92;57873:9;:16;57869:1;:20;57852:92;;;57927:5;57911:10;57922:1;57911:13;;;;;;;;:::i;:::-;;;;;;;:21;;;;;;;;;::::0;::::1;57891:3;;;;;:::i;:::-;;;;57852:92;;;;57968:12;;;;;;;;;;;57955:36;;;57992:9;58003:10;57955:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;58030:31;58039:10;58051:9;58030:31;;;;;;;:::i;:::-;;;;;;;;56626:1443;;56562:1507:::0;:::o;61280:617::-;61342:11;61366:21;61403:12;;;;;;;;;;;61390:40;;;61431:5;61390:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61366:71;;61448:16;61480:6;61489:1;61480:10;;61475:386;61496:7;:14;61492:1;:18;61475:386;;;61532:26;61561:13;:25;61575:7;61583:1;61575:10;;;;;;;;:::i;:::-;;;;;;;;61561:25;;;;;;;;;;;61532:54;;;;;;;;;;;;;;;;;;;;;;;;;;;61621:1;61605:6;:12;;;:17;61601:34;;;61625:8;;;61601:34;61650:13;61666:6;:14;;;61650:30;;61695:18;61774:7;61751:20;;61735:6;:12;;;61717:15;:30;;;;:::i;:::-;61716:55;;;;:::i;:::-;:65;;;;:::i;:::-;61695:86;;61840:8;61824:13;61810:11;:27;;;;:::i;:::-;:38;;;;:::i;:::-;61796:52;;61517:344;;;61475:386;61512:3;;;;;:::i;:::-;;;;61475:386;;;;61878:11;61871:18;;;;61280:617;;;:::o;58691:967::-;52623:9;52609:23;;:10;:23;;;52601:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;58764:27:::1;58794:13;:23;58808:8;58794:23;;;;;;;;;;;58764:53;;58852:1;58836:6;:12;;;:17;;58828:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;58920:13;58936:6;:14;;;58920:30;;58980:16;;58969:8;:27;58961:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;59077:18;59156:7;59133:20;;59117:6;:12;;;59099:15;:30;;;;:::i;:::-;59098:55;;;;:::i;:::-;:65;;;;:::i;:::-;59077:86;;59174:16;59221;;59205:13;:32;59201:270;;;59287:8;59268:16;;:27;;;;:::i;:::-;59254:41;;59327:16;;59310:6;:14;;:33;;;;59201:270;;;59406:8;59390:13;:24;;;;:::i;:::-;59376:38;;59446:13;59429:6;:14;;:30;;;;59201:270;59481:13;59510:12;;;;;;;;;;;59497:34;;;59532:8;59497:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59481:60;;59573:4;59552:32;;;59585:5;59592:11;59552:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59631:5;59620:30;;;59638:11;59620:30;;;;;;:::i;:::-;;;;;;;;58751:907;;;;;58691:967:::0;:::o;63141:142::-;63200:16;63254:21;63266:8;63254:11;:21::i;:::-;63236:15;:39;;;;:::i;:::-;63229:46;;63141:142;;;:::o;52329:49::-;;;;:::o;55029:229::-;55090:25;55128:22;55153:7;:14;55161:5;55153:14;;;;;;;;;;;;;;;55128:39;;55178:24;55205:7;:20;;55178:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55243:7;55236:14;;;;55029:229;;;:::o;59666:1028::-;52623:9;52609:23;;:10;:23;;;52601:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;59741:21:::1;59778:12;;;;;;;;;;;59765:40;;;59806:5;59765:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59741:71;;59823:16;59855:6:::0;59864:1:::1;59855:10;;59850:670;59871:7;:14;59867:1;:18;59850:670;;;59907:27;59937:13;:25;59951:7;59959:1;59951:10;;;;;;;;:::i;:::-;;;;;;;;59937:25;;;;;;;;;;;59907:55;;59997:1;59981:6;:12;;;:17;59977:34;;;60001:8;;;59977:34;60026:13;60042:6;:14;;;60026:30;;60071:18;60150:7;60127:20;;60111:6;:12;;;60093:15;:30;;;;:::i;:::-;60092:55;;;;:::i;:::-;:65;;;;:::i;:::-;60071:86;;60192:16;;60176:13;:32;60172:323;;;60276:8;60257:16;;60243:11;:30;;;;:::i;:::-;:41;;;;:::i;:::-;60229:55;;60320:16;;60303:6;:14;;:33;;;;60172:323;;;60421:8;60405:13;60391:11;:27;;;;:::i;:::-;:38;;;;:::i;:::-;60377:52;;60466:13;60449:6;:14;;:30;;;;60172:323;59892:628;;;59850:670;59887:3;;;;;:::i;:::-;;;;59850:670;;;;60548:1;60534:11;:15;60530:150;;;60587:4;60566:32;;;60599:5;60606:11;60566:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60649:5;60638:30;;;60656:11;60638:30;;;;;;:::i;:::-;;;;;;;;60530:150;59730:964;;59666:1028:::0;:::o;54407:176::-;23295:13;:11;:13::i;:::-;54513:14:::1;54497:13;:30;;;;54561:14;54538:20;:37;;;;54407:176:::0;;:::o;51941:133::-;26897:4;51991:18;;27343:16;27354:4;27343:10;:16::i;:::-;52030:3:::1;52022:21;;:44;52044:21;52022:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51941:133:::0;;:::o;52291:31::-;;;;:::o;60702:570::-;60763:11;60787:26;60816:13;:23;60830:8;60816:23;;;;;;;;;;;60787:52;;;;;;;;;;;;;;;;;;;;;;;;;;;60870:1;60854:6;:12;;;:17;60850:34;;;60881:1;60874:8;;;;;60850:34;60894:13;60910:6;:14;;;60894:30;;60935:18;61014:7;60991:20;;60975:6;:12;;;60957:15;:30;;;;:::i;:::-;60956:55;;;;:::i;:::-;:65;;;;:::i;:::-;60935:86;;61032:16;61079;;61063:13;:32;61059:177;;;61145:8;61126:16;;:27;;;;:::i;:::-;61112:41;;61059:177;;;61216:8;61200:13;:24;;;;:::i;:::-;61186:38;;61059:177;61253:11;61246:18;;;;;;60702:570;;;;:::o;40184:127::-;40258:7;40285:9;:18;40295:7;40285:18;;;;;;;;;;;;;;;;40278:25;;40184:127;;;:::o;24057:103::-;23295:13;:11;:13::i;:::-;24122:30:::1;24149:1;24122:18;:30::i;:::-;24057:103::o:0;54591:205::-;23295:13;:11;:13::i;:::-;54685:12:::1;54670:11;;:27;;54662:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;54776:12;54762:11;:26;;;;54591:205:::0;:::o;50672:164::-;50749:46;50765:7;50774:12;:10;:12::i;:::-;50788:6;50749:15;:46::i;:::-;50806:22;50812:7;50821:6;50806:5;:22::i;:::-;50672:164;;:::o;23409:87::-;23455:7;23482:6;;;;;;;;;;;23475:13;;23409:87;:::o;62515:361::-;52623:9;52609:23;;:10;:23;;;52601:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;62583:23:::1;62609:22;62625:5;62609:15;:22::i;:::-;62583:48;;62647:6;62642:95;62663:9;:16;62659:1;:20;62642:95;;;62701:24;62712:9;62722:1;62712:12;;;;;;;;:::i;:::-;;;;;;;;62701:10;:24::i;:::-;62681:3;;;;;:::i;:::-;;;;62642:95;;;;62808:1;62764:12;;;;;;;;;;;62751:40;;;62792:5;62751:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;:58;62747:119;;;62826:28;62848:5;62826:21;:28::i;:::-;62747:119;62572:304;62515:361:::0;:::o;53250:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;27747:147::-;27833:4;27857:6;:12;27864:4;27857:12;;;;;;;;;;;:20;;:29;27878:7;27857:29;;;;;;;;;;;;;;;;;;;;;;;;;27850:36;;27747:147;;;;:::o;39112:104::-;39168:13;39201:7;39194:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39112:104;:::o;51801:132::-;26897:4;51855:18;;27343:16;27354:4;27343:10;:16::i;:::-;51886:39:::1;51895:3;51900:24;51918:4;51900:9;:24::i;:::-;51886:8;:39::i;:::-;;51801:132:::0;;:::o;52447:52::-;;;;:::o;58104:579::-;52623:9;52609:23;;:10;:23;;;52601:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;58184:6:::1;58179:177;58200:9;:16;58196:1;:20;58179:177;;;58298:10;58246:62;;58259:12;;;;;;;;;;;58246:34;;;58281:9;58291:1;58281:12;;;;;;;;:::i;:::-;;;;;;;;58246:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;58238:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;58218:3;;;;;:::i;:::-;;;;58179:177;;;;58374:11;;;;;;;;;;;58366:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;58430:6;58425:251;58446:9;:16;58442:1;:20;58425:251;;;58484:27;58514:13;:27;58528:9;58538:1;58528:12;;;;;;;;:::i;:::-;;;;;;;;58514:27;;;;;;;;;;;58484:57;;58580:1;58564:6;:12;;;:17;58556:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;58649:15;58634:6;:12;;:30;;;;58469:207;58464:3;;;;;:::i;:::-;;;;58425:251;;;;58104:579:::0;:::o;26852:49::-;26897:4;26852:49;;;:::o;43470:436::-;43563:4;43580:13;43596:12;:10;:12::i;:::-;43580:28;;43619:24;43646:25;43656:5;43663:7;43646:9;:25::i;:::-;43619:52;;43710:15;43690:16;:35;;43682:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;43803:60;43812:5;43819:7;43847:15;43828:16;:34;43803:8;:60::i;:::-;43894:4;43887:11;;;;43470:436;;;;:::o;40517:193::-;40596:4;40613:13;40629:12;:10;:12::i;:::-;40613:28;;40652;40662:5;40669:2;40673:6;40652:9;:28::i;:::-;40698:4;40691:11;;;40517:193;;;;:::o;54804:182::-;23295:13;:11;:13::i;:::-;54864:11:::1;;;;;;;;;;;54863:12;54855:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;54934:15;54915:16;:34;;;;54974:4;54960:11;;:18;;;;;;;;;;;;;;;;;;54804:182::o:0;52221:30::-;;;;:::o;63291:158::-;63359:13;63434:7;63418:13;;63392:23;63406:8;63392:13;:23::i;:::-;:39;;;;:::i;:::-;:49;;;;:::i;:::-;63385:56;;63291:158;;;:::o;61929:164::-;61983:18;;:::i;:::-;62014:20;62037:14;:24;62052:8;62037:24;;;;;;;;;;;62014:47;;62079:6;62072:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61929:164;;;:::o;62885:248::-;62942:11;62966:20;62989:14;:24;63004:8;62989:24;;;;;;;;;;;62966:47;;63044:1;63028:6;:12;;;:17;63024:72;;;63069:15;63062:22;;;;;63024:72;63113:6;:12;;;63106:19;;;62885:248;;;;:::o;63457:394::-;63524:15;63552:23;63578:22;63594:5;63578:15;:22::i;:::-;63552:48;;63611:20;63647:6;63656:1;63647:10;;63642:143;63663:9;:16;63659:1;:20;63642:143;;;63737:36;63760:9;63770:1;63760:12;;;;;;;;:::i;:::-;;;;;;;;63737:22;:36::i;:::-;63719:15;:54;;;;:::i;:::-;63701:72;;63681:3;;;;;:::i;:::-;;;;63642:143;;;;63828:15;63802:23;63819:5;63802:16;:23::i;:::-;:41;;;;:::i;:::-;63795:48;;;;63457:394;;;:::o;51338:62::-;51376:24;51338:62;:::o;30168:149::-;30252:18;30265:4;30252:12;:18::i;:::-;27343:16;27354:4;27343:10;:16::i;:::-;30283:26:::1;30295:4;30301:7;30283:11;:26::i;:::-;30168:149:::0;;;:::o;52258:26::-;;;;:::o;40773:151::-;40862:7;40889:11;:18;40901:5;40889:18;;;;;;;;;;;;;;;:27;40908:7;40889:27;;;;;;;;;;;;;;;;40882:34;;40773:151;;;;:::o;24315:201::-;23295:13;:11;:13::i;:::-;24424:1:::1;24404:22;;:8;:22;;;;24396:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24480:28;24499:8;24480:18;:28::i;:::-;24315:201:::0;:::o;56446:108::-;52623:9;52609:23;;:10;:23;;;52601:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56511:35:::1;56523:22;56539:5;56523:15;:22::i;:::-;56511:11;:35::i;:::-;56446:108:::0;:::o;15579:157::-;15664:4;15703:25;15688:40;;;:11;:40;;;;15681:47;;15579:157;;;:::o;21960:98::-;22013:7;22040:10;22033:17;;21960:98;:::o;47095:380::-;47248:1;47231:19;;:5;:19;;;;47223:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47329:1;47310:21;;:7;:21;;;;47302:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47413:6;47383:11;:18;47395:5;47383:18;;;;;;;;;;;;;;;:27;47402:7;47383:27;;;;;;;;;;;;;;;:36;;;;47451:7;47435:32;;47444:5;47435:32;;;47460:6;47435:32;;;;;;:::i;:::-;;;;;;;;47095:380;;;:::o;47766:453::-;47901:24;47928:25;47938:5;47945:7;47928:9;:25::i;:::-;47901:52;;47988:17;47968:16;:37;47964:248;;48050:6;48030:16;:26;;48022:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48134:51;48143:5;48150:7;48178:6;48159:16;:25;48134:8;:51::i;:::-;47964:248;47890:329;47766:453;;;:::o;44376:671::-;44523:1;44507:18;;:4;:18;;;;44499:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44600:1;44586:16;;:2;:16;;;;44578:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44655:38;44676:4;44682:2;44686:6;44655:20;:38::i;:::-;44706:19;44728:9;:15;44738:4;44728:15;;;;;;;;;;;;;;;;44706:37;;44777:6;44762:11;:21;;44754:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;44894:6;44880:11;:20;44862:9;:15;44872:4;44862:15;;;;;;;;;;;;;;;:38;;;;44939:6;44922:9;:13;44932:2;44922:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;44978:2;44963:26;;44972:4;44963:26;;;44982:6;44963:26;;;;;;:::i;:::-;;;;;;;;45002:37;45022:4;45028:2;45032:6;45002:19;:37::i;:::-;44488:559;44376:671;;;:::o;23574:132::-;23649:12;:10;:12::i;:::-;23638:23;;:7;:5;:7::i;:::-;:23;;;23630:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23574:132::o;28198:105::-;28265:30;28276:4;28282:12;:10;:12::i;:::-;28265:10;:30::i;:::-;28198:105;:::o;32469:238::-;32553:22;32561:4;32567:7;32553;:22::i;:::-;32548:152;;32624:4;32592:6;:12;32599:4;32592:12;;;;;;;;;;;:20;;:29;32613:7;32592:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;32675:12;:10;:12::i;:::-;32648:40;;32666:7;32648:40;;32660:4;32648:40;;;;;;;;;;32548:152;32469:238;;:::o;32887:239::-;32971:22;32979:4;32985:7;32971;:22::i;:::-;32967:152;;;33042:5;33010:6;:12;33017:4;33010:12;;;;;;;;;;;:20;;:29;33031:7;33010:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;33094:12;:10;:12::i;:::-;33067:40;;33085:7;33067:40;;33079:4;33067:40;;;;;;;;;;32967:152;32887:239;;:::o;45334:399::-;45437:1;45418:21;;:7;:21;;;;45410:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45488:49;45517:1;45521:7;45530:6;45488:20;:49::i;:::-;45566:6;45550:12;;:22;;;;;;;:::i;:::-;;;;;;;;45605:6;45583:9;:18;45593:7;45583:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;45648:7;45627:37;;45644:1;45627:37;;;45657:6;45627:37;;;;;;:::i;:::-;;;;;;;;45677:48;45705:1;45709:7;45718:6;45677:19;:48::i;:::-;45334:399;;:::o;46066:591::-;46169:1;46150:21;;:7;:21;;;;46142:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;46222:49;46243:7;46260:1;46264:6;46222:20;:49::i;:::-;46284:22;46309:9;:18;46319:7;46309:18;;;;;;;;;;;;;;;;46284:43;;46364:6;46346:14;:24;;46338:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;46483:6;46466:14;:23;46445:9;:18;46455:7;46445:18;;;;;;;;;;;;;;;:44;;;;46527:6;46511:12;;:22;;;;;;;:::i;:::-;;;;;;;;46577:1;46551:37;;46560:7;46551:37;;;46581:6;46551:37;;;;;;:::i;:::-;;;;;;;;46601:48;46621:7;46638:1;46642:6;46601:19;:48::i;:::-;46131:526;46066:591;;:::o;53795:331::-;53868:10;53891:22;53937:7;53926:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;53916:30;;;;;;53891:55;;53962:6;53957:162;53979:3;:10;53975:1;:14;53957:162;;;54054:7;54043:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;54033:30;;;;;;54015:14;:48;54011:97;;;54091:1;54084:8;;;;;;54011:97;53991:3;;;;;:::i;:::-;;;;53957:162;;;;53880:246;53795:331;;;;;:::o;24676:191::-;24750:16;24769:6;;;;;;;;;;;24750:25;;24795:8;24786:6;;:17;;;;;;;;;;;;;;;;;;24850:8;24819:40;;24840:8;24819:40;;;;;;;;;;;;24739:128;24676:191;:::o;48819:125::-;;;;:::o;49548:124::-;;;;:::o;28593:505::-;28682:22;28690:4;28696:7;28682;:22::i;:::-;28677:414;;28870:41;28898:7;28870:41;;28908:2;28870:19;:41::i;:::-;28984:38;29012:4;29004:13;;29019:2;28984:19;:38::i;:::-;28775:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28721:358;;;;;;;;;;;:::i;:::-;;;;;;;;28677:414;28593:505;;:::o;17474:451::-;17549:13;17575:19;17620:1;17611:6;17607:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17597:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17575:47;;17633:15;:6;17640:1;17633:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17659;:6;17666:1;17659:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17690:9;17715:1;17706:6;17702:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17690:26;;17685:135;17722:1;17718;:5;17685:135;;;17757:12;17778:3;17770:5;:11;17757:25;;;;;;;:::i;:::-;;;;;17745:6;17752:1;17745:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;17807:1;17797:11;;;;;17725:3;;;;:::i;:::-;;;17685:135;;;;17847:1;17838:5;:10;17830:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;17910:6;17896:21;;;17474:451;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:744::-;876:5;901:81;917:64;974:6;917:64;:::i;:::-;901:81;:::i;:::-;892:90;;1002:5;1031:6;1024:5;1017:21;1065:4;1058:5;1054:16;1047:23;;1091:6;1141:3;1133:4;1125:6;1121:17;1116:3;1112:27;1109:36;1106:143;;;1160:79;;:::i;:::-;1106:143;1273:1;1258:249;1283:6;1280:1;1277:13;1258:249;;;1351:3;1380:48;1424:3;1412:10;1380:48;:::i;:::-;1375:3;1368:61;1458:4;1453:3;1449:14;1442:21;;1492:4;1487:3;1483:14;1476:21;;1318:189;1305:1;1302;1298:9;1293:14;;1258:249;;;1262:14;882:631;;769:744;;;;;:::o;1519:139::-;1565:5;1603:6;1590:20;1581:29;;1619:33;1646:5;1619:33;:::i;:::-;1519:139;;;;:::o;1664:143::-;1721:5;1752:6;1746:13;1737:22;;1768:33;1795:5;1768:33;:::i;:::-;1664:143;;;;:::o;1830:370::-;1901:5;1950:3;1943:4;1935:6;1931:17;1927:27;1917:122;;1958:79;;:::i;:::-;1917:122;2075:6;2062:20;2100:94;2190:3;2182:6;2175:4;2167:6;2163:17;2100:94;:::i;:::-;2091:103;;1907:293;1830:370;;;;:::o;2223:385::-;2305:5;2354:3;2347:4;2339:6;2335:17;2331:27;2321:122;;2362:79;;:::i;:::-;2321:122;2472:6;2466:13;2497:105;2598:3;2590:6;2583:4;2575:6;2571:17;2497:105;:::i;:::-;2488:114;;2311:297;2223:385;;;;:::o;2614:139::-;2660:5;2698:6;2685:20;2676:29;;2714:33;2741:5;2714:33;:::i;:::-;2614:139;;;;:::o;2759:137::-;2804:5;2842:6;2829:20;2820:29;;2858:32;2884:5;2858:32;:::i;:::-;2759:137;;;;:::o;2902:139::-;2948:5;2986:6;2973:20;2964:29;;3002:33;3029:5;3002:33;:::i;:::-;2902:139;;;;:::o;3047:143::-;3104:5;3135:6;3129:13;3120:22;;3151:33;3178:5;3151:33;:::i;:::-;3047:143;;;;:::o;3196:329::-;3255:6;3304:2;3292:9;3283:7;3279:23;3275:32;3272:119;;;3310:79;;:::i;:::-;3272:119;3430:1;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3401:117;3196:329;;;;:::o;3531:351::-;3601:6;3650:2;3638:9;3629:7;3625:23;3621:32;3618:119;;;3656:79;;:::i;:::-;3618:119;3776:1;3801:64;3857:7;3848:6;3837:9;3833:22;3801:64;:::i;:::-;3791:74;;3747:128;3531:351;;;;:::o;3888:474::-;3956:6;3964;4013:2;4001:9;3992:7;3988:23;3984:32;3981:119;;;4019:79;;:::i;:::-;3981:119;4139:1;4164:53;4209:7;4200:6;4189:9;4185:22;4164:53;:::i;:::-;4154:63;;4110:117;4266:2;4292:53;4337:7;4328:6;4317:9;4313:22;4292:53;:::i;:::-;4282:63;;4237:118;3888:474;;;;;:::o;4368:619::-;4445:6;4453;4461;4510:2;4498:9;4489:7;4485:23;4481:32;4478:119;;;4516:79;;:::i;:::-;4478:119;4636:1;4661:53;4706:7;4697:6;4686:9;4682:22;4661:53;:::i;:::-;4651:63;;4607:117;4763:2;4789:53;4834:7;4825:6;4814:9;4810:22;4789:53;:::i;:::-;4779:63;;4734:118;4891:2;4917:53;4962:7;4953:6;4942:9;4938:22;4917:53;:::i;:::-;4907:63;;4862:118;4368:619;;;;;:::o;4993:474::-;5061:6;5069;5118:2;5106:9;5097:7;5093:23;5089:32;5086:119;;;5124:79;;:::i;:::-;5086:119;5244:1;5269:53;5314:7;5305:6;5294:9;5290:22;5269:53;:::i;:::-;5259:63;;5215:117;5371:2;5397:53;5442:7;5433:6;5422:9;5418:22;5397:53;:::i;:::-;5387:63;;5342:118;4993:474;;;;;:::o;5473:539::-;5557:6;5606:2;5594:9;5585:7;5581:23;5577:32;5574:119;;;5612:79;;:::i;:::-;5574:119;5760:1;5749:9;5745:17;5732:31;5790:18;5782:6;5779:30;5776:117;;;5812:79;;:::i;:::-;5776:117;5917:78;5987:7;5978:6;5967:9;5963:22;5917:78;:::i;:::-;5907:88;;5703:302;5473:539;;;;:::o;6018:554::-;6113:6;6162:2;6150:9;6141:7;6137:23;6133:32;6130:119;;;6168:79;;:::i;:::-;6130:119;6309:1;6298:9;6294:17;6288:24;6339:18;6331:6;6328:30;6325:117;;;6361:79;;:::i;:::-;6325:117;6466:89;6547:7;6538:6;6527:9;6523:22;6466:89;:::i;:::-;6456:99;;6259:306;6018:554;;;;:::o;6578:329::-;6637:6;6686:2;6674:9;6665:7;6661:23;6657:32;6654:119;;;6692:79;;:::i;:::-;6654:119;6812:1;6837:53;6882:7;6873:6;6862:9;6858:22;6837:53;:::i;:::-;6827:63;;6783:117;6578:329;;;;:::o;6913:474::-;6981:6;6989;7038:2;7026:9;7017:7;7013:23;7009:32;7006:119;;;7044:79;;:::i;:::-;7006:119;7164:1;7189:53;7234:7;7225:6;7214:9;7210:22;7189:53;:::i;:::-;7179:63;;7135:117;7291:2;7317:53;7362:7;7353:6;7342:9;7338:22;7317:53;:::i;:::-;7307:63;;7262:118;6913:474;;;;;:::o;7393:327::-;7451:6;7500:2;7488:9;7479:7;7475:23;7471:32;7468:119;;;7506:79;;:::i;:::-;7468:119;7626:1;7651:52;7695:7;7686:6;7675:9;7671:22;7651:52;:::i;:::-;7641:62;;7597:116;7393:327;;;;:::o;7726:329::-;7785:6;7834:2;7822:9;7813:7;7809:23;7805:32;7802:119;;;7840:79;;:::i;:::-;7802:119;7960:1;7985:53;8030:7;8021:6;8010:9;8006:22;7985:53;:::i;:::-;7975:63;;7931:117;7726:329;;;;:::o;8061:474::-;8129:6;8137;8186:2;8174:9;8165:7;8161:23;8157:32;8154:119;;;8192:79;;:::i;:::-;8154:119;8312:1;8337:53;8382:7;8373:6;8362:9;8358:22;8337:53;:::i;:::-;8327:63;;8283:117;8439:2;8465:53;8510:7;8501:6;8490:9;8486:22;8465:53;:::i;:::-;8455:63;;8410:118;8061:474;;;;;:::o;8541:179::-;8610:10;8631:46;8673:3;8665:6;8631:46;:::i;:::-;8709:4;8704:3;8700:14;8686:28;;8541:179;;;;:::o;8726:::-;8795:10;8816:46;8858:3;8850:6;8816:46;:::i;:::-;8894:4;8889:3;8885:14;8871:28;;8726:179;;;;:::o;8911:108::-;8988:24;9006:5;8988:24;:::i;:::-;8983:3;8976:37;8911:108;;:::o;9025:118::-;9112:24;9130:5;9112:24;:::i;:::-;9107:3;9100:37;9025:118;;:::o;9179:732::-;9298:3;9327:54;9375:5;9327:54;:::i;:::-;9397:86;9476:6;9471:3;9397:86;:::i;:::-;9390:93;;9507:56;9557:5;9507:56;:::i;:::-;9586:7;9617:1;9602:284;9627:6;9624:1;9621:13;9602:284;;;9703:6;9697:13;9730:63;9789:3;9774:13;9730:63;:::i;:::-;9723:70;;9816:60;9869:6;9816:60;:::i;:::-;9806:70;;9662:224;9649:1;9646;9642:9;9637:14;;9602:284;;;9606:14;9902:3;9895:10;;9303:608;;;9179:732;;;;:::o;9947:::-;10066:3;10095:54;10143:5;10095:54;:::i;:::-;10165:86;10244:6;10239:3;10165:86;:::i;:::-;10158:93;;10275:56;10325:5;10275:56;:::i;:::-;10354:7;10385:1;10370:284;10395:6;10392:1;10389:13;10370:284;;;10471:6;10465:13;10498:63;10557:3;10542:13;10498:63;:::i;:::-;10491:70;;10584:60;10637:6;10584:60;:::i;:::-;10574:70;;10430:224;10417:1;10414;10410:9;10405:14;;10370:284;;;10374:14;10670:3;10663:10;;10071:608;;;9947:732;;;;:::o;10685:109::-;10766:21;10781:5;10766:21;:::i;:::-;10761:3;10754:34;10685:109;;:::o;10800:118::-;10887:24;10905:5;10887:24;:::i;:::-;10882:3;10875:37;10800:118;;:::o;10924:364::-;11012:3;11040:39;11073:5;11040:39;:::i;:::-;11095:71;11159:6;11154:3;11095:71;:::i;:::-;11088:78;;11175:52;11220:6;11215:3;11208:4;11201:5;11197:16;11175:52;:::i;:::-;11252:29;11274:6;11252:29;:::i;:::-;11247:3;11243:39;11236:46;;11016:272;10924:364;;;;:::o;11294:377::-;11400:3;11428:39;11461:5;11428:39;:::i;:::-;11483:89;11565:6;11560:3;11483:89;:::i;:::-;11476:96;;11581:52;11626:6;11621:3;11614:4;11607:5;11603:16;11581:52;:::i;:::-;11658:6;11653:3;11649:16;11642:23;;11404:267;11294:377;;;;:::o;11677:366::-;11819:3;11840:67;11904:2;11899:3;11840:67;:::i;:::-;11833:74;;11916:93;12005:3;11916:93;:::i;:::-;12034:2;12029:3;12025:12;12018:19;;11677:366;;;:::o;12049:::-;12191:3;12212:67;12276:2;12271:3;12212:67;:::i;:::-;12205:74;;12288:93;12377:3;12288:93;:::i;:::-;12406:2;12401:3;12397:12;12390:19;;12049:366;;;:::o;12421:::-;12563:3;12584:67;12648:2;12643:3;12584:67;:::i;:::-;12577:74;;12660:93;12749:3;12660:93;:::i;:::-;12778:2;12773:3;12769:12;12762:19;;12421:366;;;:::o;12793:::-;12935:3;12956:67;13020:2;13015:3;12956:67;:::i;:::-;12949:74;;13032:93;13121:3;13032:93;:::i;:::-;13150:2;13145:3;13141:12;13134:19;;12793:366;;;:::o;13165:::-;13307:3;13328:67;13392:2;13387:3;13328:67;:::i;:::-;13321:74;;13404:93;13493:3;13404:93;:::i;:::-;13522:2;13517:3;13513:12;13506:19;;13165:366;;;:::o;13537:::-;13679:3;13700:67;13764:2;13759:3;13700:67;:::i;:::-;13693:74;;13776:93;13865:3;13776:93;:::i;:::-;13894:2;13889:3;13885:12;13878:19;;13537:366;;;:::o;13909:::-;14051:3;14072:67;14136:2;14131:3;14072:67;:::i;:::-;14065:74;;14148:93;14237:3;14148:93;:::i;:::-;14266:2;14261:3;14257:12;14250:19;;13909:366;;;:::o;14281:::-;14423:3;14444:67;14508:2;14503:3;14444:67;:::i;:::-;14437:74;;14520:93;14609:3;14520:93;:::i;:::-;14638:2;14633:3;14629:12;14622:19;;14281:366;;;:::o;14653:::-;14795:3;14816:67;14880:2;14875:3;14816:67;:::i;:::-;14809:74;;14892:93;14981:3;14892:93;:::i;:::-;15010:2;15005:3;15001:12;14994:19;;14653:366;;;:::o;15025:::-;15167:3;15188:67;15252:2;15247:3;15188:67;:::i;:::-;15181:74;;15264:93;15353:3;15264:93;:::i;:::-;15382:2;15377:3;15373:12;15366:19;;15025:366;;;:::o;15397:::-;15539:3;15560:67;15624:2;15619:3;15560:67;:::i;:::-;15553:74;;15636:93;15725:3;15636:93;:::i;:::-;15754:2;15749:3;15745:12;15738:19;;15397:366;;;:::o;15769:::-;15911:3;15932:67;15996:2;15991:3;15932:67;:::i;:::-;15925:74;;16008:93;16097:3;16008:93;:::i;:::-;16126:2;16121:3;16117:12;16110:19;;15769:366;;;:::o;16141:::-;16283:3;16304:67;16368:2;16363:3;16304:67;:::i;:::-;16297:74;;16380:93;16469:3;16380:93;:::i;:::-;16498:2;16493:3;16489:12;16482:19;;16141:366;;;:::o;16513:::-;16655:3;16676:67;16740:2;16735:3;16676:67;:::i;:::-;16669:74;;16752:93;16841:3;16752:93;:::i;:::-;16870:2;16865:3;16861:12;16854:19;;16513:366;;;:::o;16885:::-;17027:3;17048:67;17112:2;17107:3;17048:67;:::i;:::-;17041:74;;17124:93;17213:3;17124:93;:::i;:::-;17242:2;17237:3;17233:12;17226:19;;16885:366;;;:::o;17257:::-;17399:3;17420:67;17484:2;17479:3;17420:67;:::i;:::-;17413:74;;17496:93;17585:3;17496:93;:::i;:::-;17614:2;17609:3;17605:12;17598:19;;17257:366;;;:::o;17629:::-;17771:3;17792:67;17856:2;17851:3;17792:67;:::i;:::-;17785:74;;17868:93;17957:3;17868:93;:::i;:::-;17986:2;17981:3;17977:12;17970:19;;17629:366;;;:::o;18001:::-;18143:3;18164:67;18228:2;18223:3;18164:67;:::i;:::-;18157:74;;18240:93;18329:3;18240:93;:::i;:::-;18358:2;18353:3;18349:12;18342:19;;18001:366;;;:::o;18373:::-;18515:3;18536:67;18600:2;18595:3;18536:67;:::i;:::-;18529:74;;18612:93;18701:3;18612:93;:::i;:::-;18730:2;18725:3;18721:12;18714:19;;18373:366;;;:::o;18745:::-;18887:3;18908:67;18972:2;18967:3;18908:67;:::i;:::-;18901:74;;18984:93;19073:3;18984:93;:::i;:::-;19102:2;19097:3;19093:12;19086:19;;18745:366;;;:::o;19117:::-;19259:3;19280:67;19344:2;19339:3;19280:67;:::i;:::-;19273:74;;19356:93;19445:3;19356:93;:::i;:::-;19474:2;19469:3;19465:12;19458:19;;19117:366;;;:::o;19489:::-;19631:3;19652:67;19716:2;19711:3;19652:67;:::i;:::-;19645:74;;19728:93;19817:3;19728:93;:::i;:::-;19846:2;19841:3;19837:12;19830:19;;19489:366;;;:::o;19861:402::-;20021:3;20042:85;20124:2;20119:3;20042:85;:::i;:::-;20035:92;;20136:93;20225:3;20136:93;:::i;:::-;20254:2;20249:3;20245:12;20238:19;;19861:402;;;:::o;20269:366::-;20411:3;20432:67;20496:2;20491:3;20432:67;:::i;:::-;20425:74;;20508:93;20597:3;20508:93;:::i;:::-;20626:2;20621:3;20617:12;20610:19;;20269:366;;;:::o;20641:::-;20783:3;20804:67;20868:2;20863:3;20804:67;:::i;:::-;20797:74;;20880:93;20969:3;20880:93;:::i;:::-;20998:2;20993:3;20989:12;20982:19;;20641:366;;;:::o;21013:402::-;21173:3;21194:85;21276:2;21271:3;21194:85;:::i;:::-;21187:92;;21288:93;21377:3;21288:93;:::i;:::-;21406:2;21401:3;21397:12;21390:19;;21013:402;;;:::o;21421:366::-;21563:3;21584:67;21648:2;21643:3;21584:67;:::i;:::-;21577:74;;21660:93;21749:3;21660:93;:::i;:::-;21778:2;21773:3;21769:12;21762:19;;21421:366;;;:::o;21793:::-;21935:3;21956:67;22020:2;22015:3;21956:67;:::i;:::-;21949:74;;22032:93;22121:3;22032:93;:::i;:::-;22150:2;22145:3;22141:12;22134:19;;21793:366;;;:::o;22165:::-;22307:3;22328:67;22392:2;22387:3;22328:67;:::i;:::-;22321:74;;22404:93;22493:3;22404:93;:::i;:::-;22522:2;22517:3;22513:12;22506:19;;22165:366;;;:::o;22601:685::-;22744:4;22739:3;22735:14;22834:4;22827:5;22823:16;22817:23;22853:63;22910:4;22905:3;22901:14;22887:12;22853:63;:::i;:::-;22759:167;23009:4;23002:5;22998:16;22992:23;23028:63;23085:4;23080:3;23076:14;23062:12;23028:63;:::i;:::-;22936:165;23187:4;23180:5;23176:16;23170:23;23206:63;23263:4;23258:3;23254:14;23240:12;23206:63;:::i;:::-;23111:168;22713:573;22601:685;;:::o;23292:108::-;23369:24;23387:5;23369:24;:::i;:::-;23364:3;23357:37;23292:108;;:::o;23406:118::-;23493:24;23511:5;23493:24;:::i;:::-;23488:3;23481:37;23406:118;;:::o;23530:112::-;23613:22;23629:5;23613:22;:::i;:::-;23608:3;23601:35;23530:112;;:::o;23648:967::-;24030:3;24052:148;24196:3;24052:148;:::i;:::-;24045:155;;24217:95;24308:3;24299:6;24217:95;:::i;:::-;24210:102;;24329:148;24473:3;24329:148;:::i;:::-;24322:155;;24494:95;24585:3;24576:6;24494:95;:::i;:::-;24487:102;;24606:3;24599:10;;23648:967;;;;;:::o;24621:222::-;24714:4;24752:2;24741:9;24737:18;24729:26;;24765:71;24833:1;24822:9;24818:17;24809:6;24765:71;:::i;:::-;24621:222;;;;:::o;24849:483::-;25020:4;25058:2;25047:9;25043:18;25035:26;;25071:71;25139:1;25128:9;25124:17;25115:6;25071:71;:::i;:::-;25189:9;25183:4;25179:20;25174:2;25163:9;25159:18;25152:48;25217:108;25320:4;25311:6;25217:108;:::i;:::-;25209:116;;24849:483;;;;;:::o;25338:332::-;25459:4;25497:2;25486:9;25482:18;25474:26;;25510:71;25578:1;25567:9;25563:17;25554:6;25510:71;:::i;:::-;25591:72;25659:2;25648:9;25644:18;25635:6;25591:72;:::i;:::-;25338:332;;;;;:::o;25676:634::-;25897:4;25935:2;25924:9;25920:18;25912:26;;25984:9;25978:4;25974:20;25970:1;25959:9;25955:17;25948:47;26012:108;26115:4;26106:6;26012:108;:::i;:::-;26004:116;;26167:9;26161:4;26157:20;26152:2;26141:9;26137:18;26130:48;26195:108;26298:4;26289:6;26195:108;:::i;:::-;26187:116;;25676:634;;;;;:::o;26316:373::-;26459:4;26497:2;26486:9;26482:18;26474:26;;26546:9;26540:4;26536:20;26532:1;26521:9;26517:17;26510:47;26574:108;26677:4;26668:6;26574:108;:::i;:::-;26566:116;;26316:373;;;;:::o;26695:634::-;26916:4;26954:2;26943:9;26939:18;26931:26;;27003:9;26997:4;26993:20;26989:1;26978:9;26974:17;26967:47;27031:108;27134:4;27125:6;27031:108;:::i;:::-;27023:116;;27186:9;27180:4;27176:20;27171:2;27160:9;27156:18;27149:48;27214:108;27317:4;27308:6;27214:108;:::i;:::-;27206:116;;26695:634;;;;;:::o;27335:210::-;27422:4;27460:2;27449:9;27445:18;27437:26;;27473:65;27535:1;27524:9;27520:17;27511:6;27473:65;:::i;:::-;27335:210;;;;:::o;27551:222::-;27644:4;27682:2;27671:9;27667:18;27659:26;;27695:71;27763:1;27752:9;27748:17;27739:6;27695:71;:::i;:::-;27551:222;;;;:::o;27779:313::-;27892:4;27930:2;27919:9;27915:18;27907:26;;27979:9;27973:4;27969:20;27965:1;27954:9;27950:17;27943:47;28007:78;28080:4;28071:6;28007:78;:::i;:::-;27999:86;;27779:313;;;;:::o;28098:419::-;28264:4;28302:2;28291:9;28287:18;28279:26;;28351:9;28345:4;28341:20;28337:1;28326:9;28322:17;28315:47;28379:131;28505:4;28379:131;:::i;:::-;28371:139;;28098:419;;;:::o;28523:::-;28689:4;28727:2;28716:9;28712:18;28704:26;;28776:9;28770:4;28766:20;28762:1;28751:9;28747:17;28740:47;28804:131;28930:4;28804:131;:::i;:::-;28796:139;;28523:419;;;:::o;28948:::-;29114:4;29152:2;29141:9;29137:18;29129:26;;29201:9;29195:4;29191:20;29187:1;29176:9;29172:17;29165:47;29229:131;29355:4;29229:131;:::i;:::-;29221:139;;28948:419;;;:::o;29373:::-;29539:4;29577:2;29566:9;29562:18;29554:26;;29626:9;29620:4;29616:20;29612:1;29601:9;29597:17;29590:47;29654:131;29780:4;29654:131;:::i;:::-;29646:139;;29373:419;;;:::o;29798:::-;29964:4;30002:2;29991:9;29987:18;29979:26;;30051:9;30045:4;30041:20;30037:1;30026:9;30022:17;30015:47;30079:131;30205:4;30079:131;:::i;:::-;30071:139;;29798:419;;;:::o;30223:::-;30389:4;30427:2;30416:9;30412:18;30404:26;;30476:9;30470:4;30466:20;30462:1;30451:9;30447:17;30440:47;30504:131;30630:4;30504:131;:::i;:::-;30496:139;;30223:419;;;:::o;30648:::-;30814:4;30852:2;30841:9;30837:18;30829:26;;30901:9;30895:4;30891:20;30887:1;30876:9;30872:17;30865:47;30929:131;31055:4;30929:131;:::i;:::-;30921:139;;30648:419;;;:::o;31073:::-;31239:4;31277:2;31266:9;31262:18;31254:26;;31326:9;31320:4;31316:20;31312:1;31301:9;31297:17;31290:47;31354:131;31480:4;31354:131;:::i;:::-;31346:139;;31073:419;;;:::o;31498:::-;31664:4;31702:2;31691:9;31687:18;31679:26;;31751:9;31745:4;31741:20;31737:1;31726:9;31722:17;31715:47;31779:131;31905:4;31779:131;:::i;:::-;31771:139;;31498:419;;;:::o;31923:::-;32089:4;32127:2;32116:9;32112:18;32104:26;;32176:9;32170:4;32166:20;32162:1;32151:9;32147:17;32140:47;32204:131;32330:4;32204:131;:::i;:::-;32196:139;;31923:419;;;:::o;32348:::-;32514:4;32552:2;32541:9;32537:18;32529:26;;32601:9;32595:4;32591:20;32587:1;32576:9;32572:17;32565:47;32629:131;32755:4;32629:131;:::i;:::-;32621:139;;32348:419;;;:::o;32773:::-;32939:4;32977:2;32966:9;32962:18;32954:26;;33026:9;33020:4;33016:20;33012:1;33001:9;32997:17;32990:47;33054:131;33180:4;33054:131;:::i;:::-;33046:139;;32773:419;;;:::o;33198:::-;33364:4;33402:2;33391:9;33387:18;33379:26;;33451:9;33445:4;33441:20;33437:1;33426:9;33422:17;33415:47;33479:131;33605:4;33479:131;:::i;:::-;33471:139;;33198:419;;;:::o;33623:::-;33789:4;33827:2;33816:9;33812:18;33804:26;;33876:9;33870:4;33866:20;33862:1;33851:9;33847:17;33840:47;33904:131;34030:4;33904:131;:::i;:::-;33896:139;;33623:419;;;:::o;34048:::-;34214:4;34252:2;34241:9;34237:18;34229:26;;34301:9;34295:4;34291:20;34287:1;34276:9;34272:17;34265:47;34329:131;34455:4;34329:131;:::i;:::-;34321:139;;34048:419;;;:::o;34473:::-;34639:4;34677:2;34666:9;34662:18;34654:26;;34726:9;34720:4;34716:20;34712:1;34701:9;34697:17;34690:47;34754:131;34880:4;34754:131;:::i;:::-;34746:139;;34473:419;;;:::o;34898:::-;35064:4;35102:2;35091:9;35087:18;35079:26;;35151:9;35145:4;35141:20;35137:1;35126:9;35122:17;35115:47;35179:131;35305:4;35179:131;:::i;:::-;35171:139;;34898:419;;;:::o;35323:::-;35489:4;35527:2;35516:9;35512:18;35504:26;;35576:9;35570:4;35566:20;35562:1;35551:9;35547:17;35540:47;35604:131;35730:4;35604:131;:::i;:::-;35596:139;;35323:419;;;:::o;35748:::-;35914:4;35952:2;35941:9;35937:18;35929:26;;36001:9;35995:4;35991:20;35987:1;35976:9;35972:17;35965:47;36029:131;36155:4;36029:131;:::i;:::-;36021:139;;35748:419;;;:::o;36173:::-;36339:4;36377:2;36366:9;36362:18;36354:26;;36426:9;36420:4;36416:20;36412:1;36401:9;36397:17;36390:47;36454:131;36580:4;36454:131;:::i;:::-;36446:139;;36173:419;;;:::o;36598:::-;36764:4;36802:2;36791:9;36787:18;36779:26;;36851:9;36845:4;36841:20;36837:1;36826:9;36822:17;36815:47;36879:131;37005:4;36879:131;:::i;:::-;36871:139;;36598:419;;;:::o;37023:::-;37189:4;37227:2;37216:9;37212:18;37204:26;;37276:9;37270:4;37266:20;37262:1;37251:9;37247:17;37240:47;37304:131;37430:4;37304:131;:::i;:::-;37296:139;;37023:419;;;:::o;37448:::-;37614:4;37652:2;37641:9;37637:18;37629:26;;37701:9;37695:4;37691:20;37687:1;37676:9;37672:17;37665:47;37729:131;37855:4;37729:131;:::i;:::-;37721:139;;37448:419;;;:::o;37873:::-;38039:4;38077:2;38066:9;38062:18;38054:26;;38126:9;38120:4;38116:20;38112:1;38101:9;38097:17;38090:47;38154:131;38280:4;38154:131;:::i;:::-;38146:139;;37873:419;;;:::o;38298:::-;38464:4;38502:2;38491:9;38487:18;38479:26;;38551:9;38545:4;38541:20;38537:1;38526:9;38522:17;38515:47;38579:131;38705:4;38579:131;:::i;:::-;38571:139;;38298:419;;;:::o;38723:::-;38889:4;38927:2;38916:9;38912:18;38904:26;;38976:9;38970:4;38966:20;38962:1;38951:9;38947:17;38940:47;39004:131;39130:4;39004:131;:::i;:::-;38996:139;;38723:419;;;:::o;39148:::-;39314:4;39352:2;39341:9;39337:18;39329:26;;39401:9;39395:4;39391:20;39387:1;39376:9;39372:17;39365:47;39429:131;39555:4;39429:131;:::i;:::-;39421:139;;39148:419;;;:::o;39573:314::-;39712:4;39750:2;39739:9;39735:18;39727:26;;39763:117;39877:1;39866:9;39862:17;39853:6;39763:117;:::i;:::-;39573:314;;;;:::o;39893:222::-;39986:4;40024:2;40013:9;40009:18;40001:26;;40037:71;40105:1;40094:9;40090:17;40081:6;40037:71;:::i;:::-;39893:222;;;;:::o;40121:332::-;40242:4;40280:2;40269:9;40265:18;40257:26;;40293:71;40361:1;40350:9;40346:17;40337:6;40293:71;:::i;:::-;40374:72;40442:2;40431:9;40427:18;40418:6;40374:72;:::i;:::-;40121:332;;;;;:::o;40459:214::-;40548:4;40586:2;40575:9;40571:18;40563:26;;40599:67;40663:1;40652:9;40648:17;40639:6;40599:67;:::i;:::-;40459:214;;;;:::o;40679:129::-;40713:6;40740:20;;:::i;:::-;40730:30;;40769:33;40797:4;40789:6;40769:33;:::i;:::-;40679:129;;;:::o;40814:75::-;40847:6;40880:2;40874:9;40864:19;;40814:75;:::o;40895:311::-;40972:4;41062:18;41054:6;41051:30;41048:56;;;41084:18;;:::i;:::-;41048:56;41134:4;41126:6;41122:17;41114:25;;41194:4;41188;41184:15;41176:23;;40895:311;;;:::o;41212:132::-;41279:4;41302:3;41294:11;;41332:4;41327:3;41323:14;41315:22;;41212:132;;;:::o;41350:::-;41417:4;41440:3;41432:11;;41470:4;41465:3;41461:14;41453:22;;41350:132;;;:::o;41488:114::-;41555:6;41589:5;41583:12;41573:22;;41488:114;;;:::o;41608:::-;41675:6;41709:5;41703:12;41693:22;;41608:114;;;:::o;41728:99::-;41780:6;41814:5;41808:12;41798:22;;41728:99;;;:::o;41833:113::-;41903:4;41935;41930:3;41926:14;41918:22;;41833:113;;;:::o;41952:::-;42022:4;42054;42049:3;42045:14;42037:22;;41952:113;;;:::o;42071:184::-;42170:11;42204:6;42199:3;42192:19;42244:4;42239:3;42235:14;42220:29;;42071:184;;;;:::o;42261:::-;42360:11;42394:6;42389:3;42382:19;42434:4;42429:3;42425:14;42410:29;;42261:184;;;;:::o;42451:169::-;42535:11;42569:6;42564:3;42557:19;42609:4;42604:3;42600:14;42585:29;;42451:169;;;;:::o;42626:148::-;42728:11;42765:3;42750:18;;42626:148;;;;:::o;42780:305::-;42820:3;42839:20;42857:1;42839:20;:::i;:::-;42834:25;;42873:20;42891:1;42873:20;:::i;:::-;42868:25;;43027:1;42959:66;42955:74;42952:1;42949:81;42946:107;;;43033:18;;:::i;:::-;42946:107;43077:1;43074;43070:9;43063:16;;42780:305;;;;:::o;43091:185::-;43131:1;43148:20;43166:1;43148:20;:::i;:::-;43143:25;;43182:20;43200:1;43182:20;:::i;:::-;43177:25;;43221:1;43211:35;;43226:18;;:::i;:::-;43211:35;43268:1;43265;43261:9;43256:14;;43091:185;;;;:::o;43282:348::-;43322:7;43345:20;43363:1;43345:20;:::i;:::-;43340:25;;43379:20;43397:1;43379:20;:::i;:::-;43374:25;;43567:1;43499:66;43495:74;43492:1;43489:81;43484:1;43477:9;43470:17;43466:105;43463:131;;;43574:18;;:::i;:::-;43463:131;43622:1;43619;43615:9;43604:20;;43282:348;;;;:::o;43636:191::-;43676:4;43696:20;43714:1;43696:20;:::i;:::-;43691:25;;43730:20;43748:1;43730:20;:::i;:::-;43725:25;;43769:1;43766;43763:8;43760:34;;;43774:18;;:::i;:::-;43760:34;43819:1;43816;43812:9;43804:17;;43636:191;;;;:::o;43833:96::-;43870:7;43899:24;43917:5;43899:24;:::i;:::-;43888:35;;43833:96;;;:::o;43935:90::-;43969:7;44012:5;44005:13;43998:21;43987:32;;43935:90;;;:::o;44031:77::-;44068:7;44097:5;44086:16;;44031:77;;;:::o;44114:149::-;44150:7;44190:66;44183:5;44179:78;44168:89;;44114:149;;;:::o;44269:126::-;44306:7;44346:42;44339:5;44335:54;44324:65;;44269:126;;;:::o;44401:77::-;44438:7;44467:5;44456:16;;44401:77;;;:::o;44484:86::-;44519:7;44559:4;44552:5;44548:16;44537:27;;44484:86;;;:::o;44576:307::-;44644:1;44654:113;44668:6;44665:1;44662:13;44654:113;;;44753:1;44748:3;44744:11;44738:18;44734:1;44729:3;44725:11;44718:39;44690:2;44687:1;44683:10;44678:15;;44654:113;;;44785:6;44782:1;44779:13;44776:101;;;44865:1;44856:6;44851:3;44847:16;44840:27;44776:101;44625:258;44576:307;;;:::o;44889:171::-;44928:3;44951:24;44969:5;44951:24;:::i;:::-;44942:33;;44997:4;44990:5;44987:15;44984:41;;;45005:18;;:::i;:::-;44984:41;45052:1;45045:5;45041:13;45034:20;;44889:171;;;:::o;45066:320::-;45110:6;45147:1;45141:4;45137:12;45127:22;;45194:1;45188:4;45184:12;45215:18;45205:81;;45271:4;45263:6;45259:17;45249:27;;45205:81;45333:2;45325:6;45322:14;45302:18;45299:38;45296:84;;;45352:18;;:::i;:::-;45296:84;45117:269;45066:320;;;:::o;45392:281::-;45475:27;45497:4;45475:27;:::i;:::-;45467:6;45463:40;45605:6;45593:10;45590:22;45569:18;45557:10;45554:34;45551:62;45548:88;;;45616:18;;:::i;:::-;45548:88;45656:10;45652:2;45645:22;45435:238;45392:281;;:::o;45679:233::-;45718:3;45741:24;45759:5;45741:24;:::i;:::-;45732:33;;45787:66;45780:5;45777:77;45774:103;;;45857:18;;:::i;:::-;45774:103;45904:1;45897:5;45893:13;45886:20;;45679:233;;;:::o;45918:180::-;45966:77;45963:1;45956:88;46063:4;46060:1;46053:15;46087:4;46084:1;46077:15;46104:180;46152:77;46149:1;46142:88;46249:4;46246:1;46239:15;46273:4;46270:1;46263:15;46290:180;46338:77;46335:1;46328:88;46435:4;46432:1;46425:15;46459:4;46456:1;46449:15;46476:180;46524:77;46521:1;46514:88;46621:4;46618:1;46611:15;46645:4;46642:1;46635:15;46662:180;46710:77;46707:1;46700:88;46807:4;46804:1;46797:15;46831:4;46828:1;46821:15;46848:180;46896:77;46893:1;46886:88;46993:4;46990:1;46983:15;47017:4;47014:1;47007:15;47034:117;47143:1;47140;47133:12;47157:117;47266:1;47263;47256:12;47280:117;47389:1;47386;47379:12;47403:117;47512:1;47509;47502:12;47526:102;47567:6;47618:2;47614:7;47609:2;47602:5;47598:14;47594:28;47584:38;;47526:102;;;:::o;47634:174::-;47774:26;47770:1;47762:6;47758:14;47751:50;47634:174;:::o;47814:182::-;47954:34;47950:1;47942:6;47938:14;47931:58;47814:182;:::o;48002:222::-;48142:34;48138:1;48130:6;48126:14;48119:58;48211:5;48206:2;48198:6;48194:15;48187:30;48002:222;:::o;48230:::-;48370:34;48366:1;48358:6;48354:14;48347:58;48439:5;48434:2;48426:6;48422:15;48415:30;48230:222;:::o;48458:181::-;48598:33;48594:1;48586:6;48582:14;48575:57;48458:181;:::o;48645:221::-;48785:34;48781:1;48773:6;48769:14;48762:58;48854:4;48849:2;48841:6;48837:15;48830:29;48645:221;:::o;48872:225::-;49012:34;49008:1;49000:6;48996:14;48989:58;49081:8;49076:2;49068:6;49064:15;49057:33;48872:225;:::o;49103:221::-;49243:34;49239:1;49231:6;49227:14;49220:58;49312:4;49307:2;49299:6;49295:15;49288:29;49103:221;:::o;49330:179::-;49470:31;49466:1;49458:6;49454:14;49447:55;49330:179;:::o;49515:225::-;49655:34;49651:1;49643:6;49639:14;49632:58;49724:8;49719:2;49711:6;49707:15;49700:33;49515:225;:::o;49746:182::-;49886:34;49882:1;49874:6;49870:14;49863:58;49746:182;:::o;49934:246::-;50074:34;50070:1;50062:6;50058:14;50051:58;50143:29;50138:2;50130:6;50126:15;50119:54;49934:246;:::o;50186:169::-;50326:21;50322:1;50314:6;50310:14;50303:45;50186:169;:::o;50361:289::-;50501:34;50497:1;50489:6;50485:14;50478:58;50570:34;50565:2;50557:6;50553:15;50546:59;50639:3;50634:2;50626:6;50622:15;50615:28;50361:289;:::o;50656:182::-;50796:34;50792:1;50784:6;50780:14;50773:58;50656:182;:::o;50844:167::-;50984:19;50980:1;50972:6;50968:14;50961:43;50844:167;:::o;51017:220::-;51157:34;51153:1;51145:6;51141:14;51134:58;51226:3;51221:2;51213:6;51209:15;51202:28;51017:220;:::o;51243:224::-;51383:34;51379:1;51371:6;51367:14;51360:58;51452:7;51447:2;51439:6;51435:15;51428:32;51243:224;:::o;51473:178::-;51613:30;51609:1;51601:6;51597:14;51590:54;51473:178;:::o;51657:238::-;51797:34;51793:1;51785:6;51781:14;51774:58;51866:21;51861:2;51853:6;51849:15;51842:46;51657:238;:::o;51901:223::-;52041:34;52037:1;52029:6;52025:14;52018:58;52110:6;52105:2;52097:6;52093:15;52086:31;51901:223;:::o;52130:174::-;52270:26;52266:1;52258:6;52254:14;52247:50;52130:174;:::o;52310:173::-;52450:25;52446:1;52438:6;52434:14;52427:49;52310:173;:::o;52489:236::-;52629:34;52625:1;52617:6;52613:14;52606:58;52698:19;52693:2;52685:6;52681:15;52674:44;52489:236;:::o;52731:224::-;52871:34;52867:1;52859:6;52855:14;52848:58;52940:7;52935:2;52927:6;52923:15;52916:32;52731:224;:::o;52961:167::-;53101:19;53097:1;53089:6;53085:14;53078:43;52961:167;:::o;53134:234::-;53274:34;53270:1;53262:6;53258:14;53251:58;53343:17;53338:2;53330:6;53326:15;53319:42;53134:234;:::o;53374:181::-;53514:33;53510:1;53502:6;53498:14;53491:57;53374:181;:::o;53561:178::-;53701:30;53697:1;53689:6;53685:14;53678:54;53561:178;:::o;53745:122::-;53818:24;53836:5;53818:24;:::i;:::-;53811:5;53808:35;53798:63;;53857:1;53854;53847:12;53798:63;53745:122;:::o;53873:::-;53946:24;53964:5;53946:24;:::i;:::-;53939:5;53936:35;53926:63;;53985:1;53982;53975:12;53926:63;53873:122;:::o;54001:120::-;54073:23;54090:5;54073:23;:::i;:::-;54066:5;54063:34;54053:62;;54111:1;54108;54101:12;54053:62;54001:120;:::o;54127:122::-;54200:24;54218:5;54200:24;:::i;:::-;54193:5;54190:35;54180:63;;54239:1;54236;54229:12;54180:63;54127:122;:::o
Swarm Source
ipfs://d23a52d5ed16a6c494aed454777bb555a4a3888c8292b85608c2b7d799582124
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.