Token Peper
Overview ERC20
Price
$0.00 @ 0.000000 ETH (+0.16%)
Fully Diluted Market Cap
Total Supply:
420,644,936,397,609.620156 PEPER
Holders:
2,244 addresses
Transfers:
-
Contract:
Decimals:
18
Official Site:
[ Download CSV Export ]
[ Download CSV Export ]
OVERVIEW
PEPER, the spiciest meme coin clubhouse for all you degens out there! Kick back in our exclusive token haven, stack up those $PEPER coins, and soak in the chill vibes with dank rewards.Update? Click here to update the token ICO / general information
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PeperCoin
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2023-05-18 */ pragma solidity 0.8.17; // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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); } } // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) /** * @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; } // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _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) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _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); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) /** * @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(account), " 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()); } } } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) /** * @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); } // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) /** * @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.openzeppelin.com/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; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _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; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _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; // Overflow not possible: amount <= accountBalance <= totalSupply. _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 {} } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) /** * @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); } } contract PeperCoin is Ownable, AccessControl, ERC20Burnable { uint256 constant BILLION = 1_000_000_000 * 10**uint256(18); uint256 constant MAX_SUPPLY = 420_690 * BILLION; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); mapping (address => bool) public blacklist; event AddToBlacklist(address account); event RemoveFromBlacklist(address account); event TokenRescue(IERC20 token, address recipient, uint256 amount); constructor(address minter, address operator) ERC20("Peper", "PEPER") { _setupRole(MINTER_ROLE, minter); _setupRole(OPERATOR_ROLE, operator); _setupRole(DEFAULT_ADMIN_ROLE, minter); } /// @notice Allows an account with the minter role to mint new tokens. /// @dev Cannot mint more than max supply /// @param account the account that will receive the minted tokens /// @param amount the amount of tokens to be minted function mint(address account, uint256 amount) external { require(hasRole(MINTER_ROLE, msg.sender), "MINTER_ROLE"); require(totalSupply() + amount <= MAX_SUPPLY, "MAX_SUPPLY"); _mint(account, amount); } /// @notice Allows an operator to add an account to the blacklist /// @param account the account to be added to the blacklist function addToBlacklist(address account) external { require(hasRole(OPERATOR_ROLE, msg.sender), "OPERATOR_ROLE"); blacklist[account] = true; emit AddToBlacklist(account); } /// @notice Allows an operator to remove an account from the blacklist /// @param account the account to be removed from the blacklist function removeFromBlacklist(address account) external { require(hasRole(OPERATOR_ROLE, msg.sender), "OPERATOR_ROLE"); blacklist[account] = false; emit RemoveFromBlacklist(account); } /// @notice Hook that will block blacklisted accounts from sending or receiving tokens function _beforeTokenTransfer( address from, address to, uint256 amount ) internal override { require(!blacklist[from], "from account blacklisted"); require(!blacklist[to], "to account blacklisted"); super._beforeTokenTransfer(from, to, amount); } /// Allows the owner of the contract to release tokens that were erronously sent to this /// ERC20 smart contract. /// @param token the token that we want to withdraw /// @param recipient the address that will receive the tokens /// @param amount the amount of tokens function tokenRescue( IERC20 token, address recipient, uint256 amount ) onlyOwner external { token.transfer(recipient, amount); emit TokenRescue(token, recipient, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AddToBlacklist","type":"event"},{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"RemoveFromBlacklist","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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRescue","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"},{"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":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToBlacklist","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":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"internalType":"address","name":"account","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":"address","name":"account","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","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":[{"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":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"tokenRescue","outputs":[],"stateMutability":"nonpayable","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"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003b7738038062003b77833981810160405281019062000037919062000412565b6040518060400160405280600581526020017f50657065720000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f5045504552000000000000000000000000000000000000000000000000000000815250620000c3620000b76200016a60201b60201c565b6200017260201b60201c565b8160059081620000d49190620006d3565b508060069081620000e69190620006d3565b5050506200011b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6836200023660201b60201c565b6200014d7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929826200023660201b60201c565b620001626000801b836200023660201b60201c565b5050620007ba565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200024882826200024c60201b60201c565b5050565b6200025e82826200033d60201b60201c565b6200033957600180600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002de6200016a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003da82620003ad565b9050919050565b620003ec81620003cd565b8114620003f857600080fd5b50565b6000815190506200040c81620003e1565b92915050565b600080604083850312156200042c576200042b620003a8565b5b60006200043c85828601620003fb565b92505060206200044f85828601620003fb565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004db57607f821691505b602082108103620004f157620004f062000493565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200055b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200051c565b6200056786836200051c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005b4620005ae620005a8846200057f565b62000589565b6200057f565b9050919050565b6000819050919050565b620005d08362000593565b620005e8620005df82620005bb565b84845462000529565b825550505050565b600090565b620005ff620005f0565b6200060c818484620005c5565b505050565b5b81811015620006345762000628600082620005f5565b60018101905062000612565b5050565b601f82111562000683576200064d81620004f7565b62000658846200050c565b8101602085101562000668578190505b6200068062000677856200050c565b83018262000611565b50505b505050565b600082821c905092915050565b6000620006a86000198460080262000688565b1980831691505092915050565b6000620006c3838362000695565b9150826002028217905092915050565b620006de8262000459565b67ffffffffffffffff811115620006fa57620006f962000464565b5b620007068254620004c2565b6200071382828562000638565b600060209050601f8311600181146200074b576000841562000736578287015190505b620007428582620006b5565b865550620007b2565b601f1984166200075b86620004f7565b60005b8281101562000785578489015182556001820191506020850194506020810190506200075e565b86831015620007a55784890151620007a1601f89168262000695565b8355505b6001600288020188555050505b505050505050565b6133ad80620007ca6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063715018a611610104578063a457c2d7116100a2578063dd62ed3e11610071578063dd62ed3e14610567578063f2fde38b14610597578063f5b541a6146105b3578063f9f92be4146105d1576101da565b8063a457c2d7146104cd578063a9059cbb146104fd578063d53913931461052d578063d547741f1461054b576101da565b80638da5cb5b116100de5780638da5cb5b1461044357806391d148541461046157806395d89b4114610491578063a217fddf146104af576101da565b8063715018a61461040157806379cc67901461040b5780638bf8bd0b14610427576101da565b8063313ce5671161017c57806342966c681161014b57806342966c681461037d57806344337ea114610399578063537df3b6146103b557806370a08231146103d1576101da565b8063313ce567146102f757806336568abe14610315578063395093511461033157806340c10f1914610361576101da565b806318160ddd116101b857806318160ddd1461025d57806323b872dd1461027b578063248a9ca3146102ab5780632f2ff15d146102db576101da565b806301ffc9a7146101df57806306fdde031461020f578063095ea7b31461022d575b600080fd5b6101f960048036038101906101f49190612008565b610601565b6040516102069190612050565b60405180910390f35b61021761067b565b60405161022491906120fb565b60405180910390f35b610247600480360381019061024291906121b1565b61070d565b6040516102549190612050565b60405180910390f35b610265610730565b6040516102729190612200565b60405180910390f35b6102956004803603810190610290919061221b565b61073a565b6040516102a29190612050565b60405180910390f35b6102c560048036038101906102c091906122a4565b610769565b6040516102d291906122e0565b60405180910390f35b6102f560048036038101906102f091906122fb565b610789565b005b6102ff6107aa565b60405161030c9190612357565b60405180910390f35b61032f600480360381019061032a91906122fb565b6107b3565b005b61034b600480360381019061034691906121b1565b610836565b6040516103589190612050565b60405180910390f35b61037b600480360381019061037691906121b1565b61086d565b005b61039760048036038101906103929190612372565b610963565b005b6103b360048036038101906103ae919061239f565b610977565b005b6103cf60048036038101906103ca919061239f565b610a72565b005b6103eb60048036038101906103e6919061239f565b610b6d565b6040516103f89190612200565b60405180910390f35b610409610bb6565b005b610425600480360381019061042091906121b1565b610bca565b005b610441600480360381019061043c919061240a565b610bea565b005b61044b610cb1565b604051610458919061246c565b60405180910390f35b61047b600480360381019061047691906122fb565b610cda565b6040516104889190612050565b60405180910390f35b610499610d45565b6040516104a691906120fb565b60405180910390f35b6104b7610dd7565b6040516104c491906122e0565b60405180910390f35b6104e760048036038101906104e291906121b1565b610dde565b6040516104f49190612050565b60405180910390f35b610517600480360381019061051291906121b1565b610e55565b6040516105249190612050565b60405180910390f35b610535610e78565b60405161054291906122e0565b60405180910390f35b610565600480360381019061056091906122fb565b610e9c565b005b610581600480360381019061057c9190612487565b610ebd565b60405161058e9190612200565b60405180910390f35b6105b160048036038101906105ac919061239f565b610f44565b005b6105bb610fc7565b6040516105c891906122e0565b60405180910390f35b6105eb60048036038101906105e6919061239f565b610feb565b6040516105f89190612050565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067457506106738261100b565b5b9050919050565b60606005805461068a906124f6565b80601f01602080910402602001604051908101604052809291908181526020018280546106b6906124f6565b80156107035780601f106106d857610100808354040283529160200191610703565b820191906000526020600020905b8154815290600101906020018083116106e657829003601f168201915b5050505050905090565b600080610718611075565b905061072581858561107d565b600191505092915050565b6000600454905090565b600080610745611075565b9050610752858285611246565b61075d8585856112d2565b60019150509392505050565b600060016000838152602001908152602001600020600101549050919050565b61079282610769565b61079b8161154b565b6107a5838361155f565b505050565b60006012905090565b6107bb611075565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081f90612599565b60405180910390fd5b610832828261163f565b5050565b600080610841611075565b90506108628185856108538589610ebd565b61085d91906125e8565b61107d565b600191505092915050565b6108977f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610cda565b6108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd90612668565b60405180910390fd5b6012600a6108e491906127bb565b633b9aca006108f39190612806565b62066b526109019190612806565b8161090a610730565b61091491906125e8565b1115610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c90612894565b60405180910390fd5b61095f8282611721565b5050565b61097461096e611075565b82611878565b50565b6109a17f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92933610cda565b6109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d790612900565b60405180910390fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6b713f4f12b0a0860e4b6b54d27ef8de95da632b1250f5c12f8254fdedbc2ebd81604051610a67919061246c565b60405180910390a150565b610a9c7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92933610cda565b610adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad290612900565b60405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f3afada3900b4909463d8a846fbdc12d6b5c4e8030bd6bc1215822ecee62357ba81604051610b62919061246c565b60405180910390a150565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bbe611a47565b610bc86000611ac5565b565b610bdc82610bd6611075565b83611246565b610be68282611878565b5050565b610bf2611a47565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610c2d929190612920565b6020604051808303816000875af1158015610c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c709190612975565b507ffb41bf2d731a9899a9f0358e96ddc7789c1295a4e37de1b12c9c86c90bafdd28838383604051610ca493929190612a01565b60405180910390a1505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060068054610d54906124f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d80906124f6565b8015610dcd5780601f10610da257610100808354040283529160200191610dcd565b820191906000526020600020905b815481529060010190602001808311610db057829003601f168201915b5050505050905090565b6000801b81565b600080610de9611075565b90506000610df78286610ebd565b905083811015610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3390612aaa565b60405180910390fd5b610e49828686840361107d565b60019250505092915050565b600080610e60611075565b9050610e6d8185856112d2565b600191505092915050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610ea582610769565b610eae8161154b565b610eb8838361163f565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f4c611a47565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb290612b3c565b60405180910390fd5b610fc481611ac5565b50565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b60076020528060005260406000206000915054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e390612bce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361115b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115290612c60565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516112399190612200565b60405180910390a3505050565b60006112528484610ebd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112cc57818110156112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b590612ccc565b60405180910390fd5b6112cb848484840361107d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133890612d5e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a790612df0565b60405180910390fd5b6113bb838383611b89565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990612e82565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115329190612200565b60405180910390a3611545848484611cb3565b50505050565b61155c81611557611075565b611cb8565b50565b6115698282610cda565b61163b57600180600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506115e0611075565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6116498282610cda565b1561171d5760006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116c2611075565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178790612eee565b60405180910390fd5b61179c60008383611b89565b80600460008282546117ae91906125e8565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118609190612200565b60405180910390a361187460008383611cb3565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90612f80565b60405180910390fd5b6118f382600083611b89565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561197a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197190613012565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a2e9190612200565b60405180910390a3611a4283600084611cb3565b505050565b611a4f611075565b73ffffffffffffffffffffffffffffffffffffffff16611a6d610cb1565b73ffffffffffffffffffffffffffffffffffffffff1614611ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aba9061307e565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d906130ea565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9a90613156565b60405180910390fd5b611cae838383611d3d565b505050565b505050565b611cc28282610cda565b611d3957611ccf81611d42565b611cdd8360001c6020611d6f565b604051602001611cee92919061324a565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3091906120fb565b60405180910390fd5b5050565b505050565b6060611d688273ffffffffffffffffffffffffffffffffffffffff16601460ff16611d6f565b9050919050565b606060006002836002611d829190612806565b611d8c91906125e8565b67ffffffffffffffff811115611da557611da4613284565b5b6040519080825280601f01601f191660200182016040528015611dd75781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611e0f57611e0e6132b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611e7357611e726132b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611eb39190612806565b611ebd91906125e8565b90505b6001811115611f5d577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611eff57611efe6132b3565b5b1a60f81b828281518110611f1657611f156132b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611f56906132e2565b9050611ec0565b5060008414611fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9890613357565b60405180910390fd5b8091505092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fe581611fb0565b8114611ff057600080fd5b50565b60008135905061200281611fdc565b92915050565b60006020828403121561201e5761201d611fab565b5b600061202c84828501611ff3565b91505092915050565b60008115159050919050565b61204a81612035565b82525050565b60006020820190506120656000830184612041565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120a557808201518184015260208101905061208a565b60008484015250505050565b6000601f19601f8301169050919050565b60006120cd8261206b565b6120d78185612076565b93506120e7818560208601612087565b6120f0816120b1565b840191505092915050565b6000602082019050818103600083015261211581846120c2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121488261211d565b9050919050565b6121588161213d565b811461216357600080fd5b50565b6000813590506121758161214f565b92915050565b6000819050919050565b61218e8161217b565b811461219957600080fd5b50565b6000813590506121ab81612185565b92915050565b600080604083850312156121c8576121c7611fab565b5b60006121d685828601612166565b92505060206121e78582860161219c565b9150509250929050565b6121fa8161217b565b82525050565b600060208201905061221560008301846121f1565b92915050565b60008060006060848603121561223457612233611fab565b5b600061224286828701612166565b935050602061225386828701612166565b92505060406122648682870161219c565b9150509250925092565b6000819050919050565b6122818161226e565b811461228c57600080fd5b50565b60008135905061229e81612278565b92915050565b6000602082840312156122ba576122b9611fab565b5b60006122c88482850161228f565b91505092915050565b6122da8161226e565b82525050565b60006020820190506122f560008301846122d1565b92915050565b6000806040838503121561231257612311611fab565b5b60006123208582860161228f565b925050602061233185828601612166565b9150509250929050565b600060ff82169050919050565b6123518161233b565b82525050565b600060208201905061236c6000830184612348565b92915050565b60006020828403121561238857612387611fab565b5b60006123968482850161219c565b91505092915050565b6000602082840312156123b5576123b4611fab565b5b60006123c384828501612166565b91505092915050565b60006123d78261213d565b9050919050565b6123e7816123cc565b81146123f257600080fd5b50565b600081359050612404816123de565b92915050565b60008060006060848603121561242357612422611fab565b5b6000612431868287016123f5565b935050602061244286828701612166565b92505060406124538682870161219c565b9150509250925092565b6124668161213d565b82525050565b6000602082019050612481600083018461245d565b92915050565b6000806040838503121561249e5761249d611fab565b5b60006124ac85828601612166565b92505060206124bd85828601612166565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061250e57607f821691505b602082108103612521576125206124c7565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000612583602f83612076565b915061258e82612527565b604082019050919050565b600060208201905081810360008301526125b281612576565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125f38261217b565b91506125fe8361217b565b9250828201905080821115612616576126156125b9565b5b92915050565b7f4d494e5445525f524f4c45000000000000000000000000000000000000000000600082015250565b6000612652600b83612076565b915061265d8261261c565b602082019050919050565b6000602082019050818103600083015261268181612645565b9050919050565b60008160011c9050919050565b6000808291508390505b60018511156126df578086048111156126bb576126ba6125b9565b5b60018516156126ca5780820291505b80810290506126d885612688565b945061269f565b94509492505050565b6000826126f857600190506127b4565b8161270657600090506127b4565b816001811461271c576002811461272657612755565b60019150506127b4565b60ff841115612738576127376125b9565b5b8360020a91508482111561274f5761274e6125b9565b5b506127b4565b5060208310610133831016604e8410600b841016171561278a5782820a905083811115612785576127846125b9565b5b6127b4565b6127978484846001612695565b925090508184048111156127ae576127ad6125b9565b5b81810290505b9392505050565b60006127c68261217b565b91506127d18361217b565b92506127fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846126e8565b905092915050565b60006128118261217b565b915061281c8361217b565b925082820261282a8161217b565b91508282048414831517612841576128406125b9565b5b5092915050565b7f4d41585f535550504c5900000000000000000000000000000000000000000000600082015250565b600061287e600a83612076565b915061288982612848565b602082019050919050565b600060208201905081810360008301526128ad81612871565b9050919050565b7f4f50455241544f525f524f4c4500000000000000000000000000000000000000600082015250565b60006128ea600d83612076565b91506128f5826128b4565b602082019050919050565b60006020820190508181036000830152612919816128dd565b9050919050565b6000604082019050612935600083018561245d565b61294260208301846121f1565b9392505050565b61295281612035565b811461295d57600080fd5b50565b60008151905061296f81612949565b92915050565b60006020828403121561298b5761298a611fab565b5b600061299984828501612960565b91505092915050565b6000819050919050565b60006129c76129c26129bd8461211d565b6129a2565b61211d565b9050919050565b60006129d9826129ac565b9050919050565b60006129eb826129ce565b9050919050565b6129fb816129e0565b82525050565b6000606082019050612a1660008301866129f2565b612a23602083018561245d565b612a3060408301846121f1565b949350505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612a94602583612076565b9150612a9f82612a38565b604082019050919050565b60006020820190508181036000830152612ac381612a87565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612b26602683612076565b9150612b3182612aca565b604082019050919050565b60006020820190508181036000830152612b5581612b19565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612bb8602483612076565b9150612bc382612b5c565b604082019050919050565b60006020820190508181036000830152612be781612bab565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c4a602283612076565b9150612c5582612bee565b604082019050919050565b60006020820190508181036000830152612c7981612c3d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612cb6601d83612076565b9150612cc182612c80565b602082019050919050565b60006020820190508181036000830152612ce581612ca9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612d48602583612076565b9150612d5382612cec565b604082019050919050565b60006020820190508181036000830152612d7781612d3b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612dda602383612076565b9150612de582612d7e565b604082019050919050565b60006020820190508181036000830152612e0981612dcd565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612e6c602683612076565b9150612e7782612e10565b604082019050919050565b60006020820190508181036000830152612e9b81612e5f565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612ed8601f83612076565b9150612ee382612ea2565b602082019050919050565b60006020820190508181036000830152612f0781612ecb565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f6a602183612076565b9150612f7582612f0e565b604082019050919050565b60006020820190508181036000830152612f9981612f5d565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ffc602283612076565b915061300782612fa0565b604082019050919050565b6000602082019050818103600083015261302b81612fef565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613068602083612076565b915061307382613032565b602082019050919050565b600060208201905081810360008301526130978161305b565b9050919050565b7f66726f6d206163636f756e7420626c61636b6c69737465640000000000000000600082015250565b60006130d4601883612076565b91506130df8261309e565b602082019050919050565b60006020820190508181036000830152613103816130c7565b9050919050565b7f746f206163636f756e7420626c61636b6c697374656400000000000000000000600082015250565b6000613140601683612076565b915061314b8261310a565b602082019050919050565b6000602082019050818103600083015261316f81613133565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006131b7601783613176565b91506131c282613181565b601782019050919050565b60006131d88261206b565b6131e28185613176565b93506131f2818560208601612087565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613234601183613176565b915061323f826131fe565b601182019050919050565b6000613255826131aa565b915061326182856131cd565b915061326c82613227565b915061327882846131cd565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006132ed8261217b565b915060008203613300576132ff6125b9565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613341602083612076565b915061334c8261330b565b602082019050919050565b6000602082019050818103600083015261337081613334565b905091905056fea2646970667358221220492c552d953af632611e67721b2387afaf0733e8ac57dfa4653c916f7f80e4e464736f6c634300081100330000000000000000000000000cddb5176a1a92401ffe165d8a29c1bc08379025000000000000000000000000c0dda10bfb53fae5234701bc8bffd4c1626028e2
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000cddb5176a1a92401ffe165d8a29c1bc08379025000000000000000000000000c0dda10bfb53fae5234701bc8bffd4c1626028e2
-----Decoded View---------------
Arg [0] : minter (address): 0x0cDDb5176a1A92401fFE165d8A29c1bc08379025
Arg [1] : operator (address): 0xC0DdA10Bfb53FaE5234701bc8bfFD4c1626028E2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000cddb5176a1a92401ffe165d8a29c1bc08379025
Arg [1] : 000000000000000000000000c0dda10bfb53fae5234701bc8bffd4c1626028e2
Deployed ByteCode Sourcemap
49050:2767:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25679:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36810:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39161:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37930:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39942:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27502:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27943:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37772:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29087:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40646:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50030:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48469:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50390:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50731:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38101:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2665:103;;;:::i;:::-;;48879:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51608:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2017:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25975:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37029:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25080:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41387:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38434:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49230:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28383:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38690:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2923:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49297:66;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49368:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25679:204;25764:4;25803:32;25788:47;;;:11;:47;;;;:87;;;;25839:36;25863:11;25839:23;:36::i;:::-;25788:87;25781:94;;25679:204;;;:::o;36810:100::-;36864:13;36897:5;36890:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36810:100;:::o;39161:201::-;39244:4;39261:13;39277:12;:10;:12::i;:::-;39261:28;;39300:32;39309:5;39316:7;39325:6;39300:8;:32::i;:::-;39350:4;39343:11;;;39161:201;;;;:::o;37930:108::-;37991:7;38018:12;;38011:19;;37930:108;:::o;39942:295::-;40073:4;40090:15;40108:12;:10;:12::i;:::-;40090:30;;40131:38;40147:4;40153:7;40162:6;40131:15;:38::i;:::-;40180:27;40190:4;40196:2;40200:6;40180:9;:27::i;:::-;40225:4;40218:11;;;39942:295;;;;;:::o;27502:131::-;27576:7;27603:6;:12;27610:4;27603:12;;;;;;;;;;;:22;;;27596:29;;27502:131;;;:::o;27943:147::-;28026:18;28039:4;28026:12;:18::i;:::-;25571:16;25582:4;25571:10;:16::i;:::-;28057:25:::1;28068:4;28074:7;28057:10;:25::i;:::-;27943:147:::0;;;:::o;37772:93::-;37830:5;37855:2;37848:9;;37772:93;:::o;29087:218::-;29194:12;:10;:12::i;:::-;29183:23;;:7;:23;;;29175:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;29271:26;29283:4;29289:7;29271:11;:26::i;:::-;29087:218;;:::o;40646:238::-;40734:4;40751:13;40767:12;:10;:12::i;:::-;40751:28;;40790:64;40799:5;40806:7;40843:10;40815:25;40825:5;40832:7;40815:9;:25::i;:::-;:38;;;;:::i;:::-;40790:8;:64::i;:::-;40872:4;40865:11;;;40646:238;;;;:::o;50030:222::-;50101:32;49268:24;50122:10;50101:7;:32::i;:::-;50093:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49170:2;49158;:15;;;;:::i;:::-;49142:13;:31;;;;:::i;:::-;49208:7;:17;;;;:::i;:::-;50180:6;50164:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;50156:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;50224:22;50230:7;50239:6;50224:5;:22::i;:::-;50030:222;;:::o;48469:91::-;48525:27;48531:12;:10;:12::i;:::-;48545:6;48525:5;:27::i;:::-;48469:91;:::o;50390:194::-;50455:34;49337:26;50478:10;50455:7;:34::i;:::-;50447:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50537:4;50516:9;:18;50526:7;50516:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;50555:23;50570:7;50555:23;;;;;;:::i;:::-;;;;;;;;50390:194;:::o;50731:205::-;50801:34;49337:26;50824:10;50801:7;:34::i;:::-;50793:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50883:5;50862:9;:18;50872:7;50862:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;50902:28;50922:7;50902:28;;;;;;:::i;:::-;;;;;;;;50731:205;:::o;38101:127::-;38175:7;38202:9;:18;38212:7;38202:18;;;;;;;;;;;;;;;;38195:25;;38101:127;;;:::o;2665:103::-;1903:13;:11;:13::i;:::-;2730:30:::1;2757:1;2730:18;:30::i;:::-;2665:103::o:0;48879:164::-;48956:46;48972:7;48981:12;:10;:12::i;:::-;48995:6;48956:15;:46::i;:::-;49013:22;49019:7;49028:6;49013:5;:22::i;:::-;48879:164;;:::o;51608:206::-;1903:13;:11;:13::i;:::-;51724:5:::1;:14;;;51739:9;51750:6;51724:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51771:37;51783:5;51790:9;51801:6;51771:37;;;;;;;;:::i;:::-;;;;;;;;51608:206:::0;;;:::o;2017:87::-;2063:7;2090:6;;;;;;;;;;;2083:13;;2017:87;:::o;25975:147::-;26061:4;26085:6;:12;26092:4;26085:12;;;;;;;;;;;:20;;:29;26106:7;26085:29;;;;;;;;;;;;;;;;;;;;;;;;;26078:36;;25975:147;;;;:::o;37029:104::-;37085:13;37118:7;37111:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37029:104;:::o;25080:49::-;25125:4;25080:49;;;:::o;41387:436::-;41480:4;41497:13;41513:12;:10;:12::i;:::-;41497:28;;41536:24;41563:25;41573:5;41580:7;41563:9;:25::i;:::-;41536:52;;41627:15;41607:16;:35;;41599:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41720:60;41729:5;41736:7;41764:15;41745:16;:34;41720:8;:60::i;:::-;41811:4;41804:11;;;;41387:436;;;;:::o;38434:193::-;38513:4;38530:13;38546:12;:10;:12::i;:::-;38530:28;;38569;38579:5;38586:2;38590:6;38569:9;:28::i;:::-;38615:4;38608:11;;;38434:193;;;;:::o;49230:62::-;49268:24;49230:62;:::o;28383:149::-;28467:18;28480:4;28467:12;:18::i;:::-;25571:16;25582:4;25571:10;:16::i;:::-;28498:26:::1;28510:4;28516:7;28498:11;:26::i;:::-;28383:149:::0;;;:::o;38690:151::-;38779:7;38806:11;:18;38818:5;38806:18;;;;;;;;;;;;;;;:27;38825:7;38806:27;;;;;;;;;;;;;;;;38799:34;;38690:151;;;;:::o;2923:201::-;1903:13;:11;:13::i;:::-;3032:1:::1;3012:22;;:8;:22;;::::0;3004:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3088:28;3107:8;3088:18;:28::i;:::-;2923:201:::0;:::o;49297:66::-;49337:26;49297:66;:::o;49368:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;23038:157::-;23123:4;23162:25;23147:40;;;:11;:40;;;;23140:47;;23038:157;;;:::o;656:98::-;709:7;736:10;729:17;;656:98;:::o;45414:380::-;45567:1;45550:19;;:5;:19;;;45542:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45648:1;45629:21;;:7;:21;;;45621:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45732:6;45702:11;:18;45714:5;45702:18;;;;;;;;;;;;;;;:27;45721:7;45702:27;;;;;;;;;;;;;;;:36;;;;45770:7;45754:32;;45763:5;45754:32;;;45779:6;45754:32;;;;;;:::i;:::-;;;;;;;;45414:380;;;:::o;46085:453::-;46220:24;46247:25;46257:5;46264:7;46247:9;:25::i;:::-;46220:52;;46307:17;46287:16;:37;46283:248;;46369:6;46349:16;:26;;46341:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46453:51;46462:5;46469:7;46497:6;46478:16;:25;46453:8;:51::i;:::-;46283:248;46209:329;46085:453;;;:::o;42293:840::-;42440:1;42424:18;;:4;:18;;;42416:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42517:1;42503:16;;:2;:16;;;42495:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42572:38;42593:4;42599:2;42603:6;42572:20;:38::i;:::-;42623:19;42645:9;:15;42655:4;42645:15;;;;;;;;;;;;;;;;42623:37;;42694:6;42679:11;:21;;42671:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;42811:6;42797:11;:20;42779:9;:15;42789:4;42779:15;;;;;;;;;;;;;;;:38;;;;43014:6;42997:9;:13;43007:2;42997:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;43064:2;43049:26;;43058:4;43049:26;;;43068:6;43049:26;;;;;;:::i;:::-;;;;;;;;43088:37;43108:4;43114:2;43118:6;43088:19;:37::i;:::-;42405:728;42293:840;;;:::o;26426:105::-;26493:30;26504:4;26510:12;:10;:12::i;:::-;26493:10;:30::i;:::-;26426:105;:::o;30684:238::-;30768:22;30776:4;30782:7;30768;:22::i;:::-;30763:152;;30839:4;30807:6;:12;30814:4;30807:12;;;;;;;;;;;:20;;:29;30828:7;30807:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;30890:12;:10;:12::i;:::-;30863:40;;30881:7;30863:40;;30875:4;30863:40;;;;;;;;;;30763:152;30684:238;;:::o;31102:239::-;31186:22;31194:4;31200:7;31186;:22::i;:::-;31182:152;;;31257:5;31225:6;:12;31232:4;31225:12;;;;;;;;;;;:20;;:29;31246:7;31225:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;31309:12;:10;:12::i;:::-;31282:40;;31300:7;31282:40;;31294:4;31282:40;;;;;;;;;;31182:152;31102:239;;:::o;43420:548::-;43523:1;43504:21;;:7;:21;;;43496:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43574:49;43603:1;43607:7;43616:6;43574:20;:49::i;:::-;43652:6;43636:12;;:22;;;;;;;:::i;:::-;;;;;;;;43829:6;43807:9;:18;43817:7;43807:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;43883:7;43862:37;;43879:1;43862:37;;;43892:6;43862:37;;;;;;:::i;:::-;;;;;;;;43912:48;43940:1;43944:7;43953:6;43912:19;:48::i;:::-;43420:548;;:::o;44301:675::-;44404:1;44385:21;;:7;:21;;;44377:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44457:49;44478:7;44495:1;44499:6;44457:20;:49::i;:::-;44519:22;44544:9;:18;44554:7;44544:18;;;;;;;;;;;;;;;;44519:43;;44599:6;44581:14;:24;;44573:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;44718:6;44701:14;:23;44680:9;:18;44690:7;44680:18;;;;;;;;;;;;;;;:44;;;;44835:6;44819:12;;:22;;;;;;;;;;;44896:1;44870:37;;44879:7;44870:37;;;44900:6;44870:37;;;;;;:::i;:::-;;;;;;;;44920:48;44940:7;44957:1;44961:6;44920:19;:48::i;:::-;44366:610;44301:675;;:::o;2182:132::-;2257:12;:10;:12::i;:::-;2246:23;;:7;:5;:7::i;:::-;:23;;;2238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2182:132::o;3284:191::-;3358:16;3377:6;;;;;;;;;;;3358:25;;3403:8;3394:6;;:17;;;;;;;;;;;;;;;;;;3458:8;3427:40;;3448:8;3427:40;;;;;;;;;;;;3347:128;3284:191;:::o;51032:285::-;51158:9;:15;51168:4;51158:15;;;;;;;;;;;;;;;;;;;;;;;;;51157:16;51149:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51218:9;:13;51228:2;51218:13;;;;;;;;;;;;;;;;;;;;;;;;;51217:14;51209:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;51267:44;51294:4;51300:2;51304:6;51267:26;:44::i;:::-;51032:285;;;:::o;47867:124::-;;;;:::o;26821:492::-;26910:22;26918:4;26924:7;26910;:22::i;:::-;26905:401;;27098:28;27118:7;27098:19;:28::i;:::-;27199:38;27227:4;27219:13;;27234:2;27199:19;:38::i;:::-;27003:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26949:345;;;;;;;;;;;:::i;:::-;;;;;;;;26905:401;26821:492;;:::o;47138:125::-;;;;:::o;21297:151::-;21355:13;21388:52;21416:4;21400:22;;19452:2;21388:52;;:11;:52::i;:::-;21381:59;;21297:151;;;:::o;20693:447::-;20768:13;20794:19;20839:1;20830:6;20826:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;20816:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20794:47;;20852:15;:6;20859:1;20852:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;20878;:6;20885:1;20878:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;20909:9;20934:1;20925:6;20921:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;20909:26;;20904:131;20941:1;20937;:5;20904:131;;;20976:8;20993:3;20985:5;:11;20976:21;;;;;;;:::i;:::-;;;;;20964:6;20971:1;20964:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;21022:1;21012:11;;;;;20944:3;;;;:::i;:::-;;;20904:131;;;;21062:1;21053:5;:10;21045:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;21125:6;21111:21;;;20693:447;;;;:::o;88:117:1:-;197:1;194;187:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:77::-;3404:7;3433:5;3422:16;;3367:77;;;:::o;3450:122::-;3523:24;3541:5;3523:24;:::i;:::-;3516:5;3513:35;3503:63;;3562:1;3559;3552:12;3503:63;3450:122;:::o;3578:139::-;3624:5;3662:6;3649:20;3640:29;;3678:33;3705:5;3678:33;:::i;:::-;3578:139;;;;:::o;3723:474::-;3791:6;3799;3848:2;3836:9;3827:7;3823:23;3819:32;3816:119;;;3854:79;;:::i;:::-;3816:119;3974:1;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3945:117;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;3723:474;;;;;:::o;4203:118::-;4290:24;4308:5;4290:24;:::i;:::-;4285:3;4278:37;4203:118;;:::o;4327:222::-;4420:4;4458:2;4447:9;4443:18;4435:26;;4471:71;4539:1;4528:9;4524:17;4515:6;4471:71;:::i;:::-;4327:222;;;;:::o;4555:619::-;4632:6;4640;4648;4697:2;4685:9;4676:7;4672:23;4668:32;4665:119;;;4703:79;;:::i;:::-;4665:119;4823:1;4848:53;4893:7;4884:6;4873:9;4869:22;4848:53;:::i;:::-;4838:63;;4794:117;4950:2;4976:53;5021:7;5012:6;5001:9;4997:22;4976:53;:::i;:::-;4966:63;;4921:118;5078:2;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;:::i;:::-;5094:63;;5049:118;4555:619;;;;;:::o;5180:77::-;5217:7;5246:5;5235:16;;5180:77;;;:::o;5263:122::-;5336:24;5354:5;5336:24;:::i;:::-;5329:5;5326:35;5316:63;;5375:1;5372;5365:12;5316:63;5263:122;:::o;5391:139::-;5437:5;5475:6;5462:20;5453:29;;5491:33;5518:5;5491:33;:::i;:::-;5391:139;;;;:::o;5536:329::-;5595:6;5644:2;5632:9;5623:7;5619:23;5615:32;5612:119;;;5650:79;;:::i;:::-;5612:119;5770:1;5795:53;5840:7;5831:6;5820:9;5816:22;5795:53;:::i;:::-;5785:63;;5741:117;5536:329;;;;:::o;5871:118::-;5958:24;5976:5;5958:24;:::i;:::-;5953:3;5946:37;5871:118;;:::o;5995:222::-;6088:4;6126:2;6115:9;6111:18;6103:26;;6139:71;6207:1;6196:9;6192:17;6183:6;6139:71;:::i;:::-;5995:222;;;;:::o;6223:474::-;6291:6;6299;6348:2;6336:9;6327:7;6323:23;6319:32;6316:119;;;6354:79;;:::i;:::-;6316:119;6474:1;6499:53;6544:7;6535:6;6524:9;6520:22;6499:53;:::i;:::-;6489:63;;6445:117;6601:2;6627:53;6672:7;6663:6;6652:9;6648:22;6627:53;:::i;:::-;6617:63;;6572:118;6223:474;;;;;:::o;6703:86::-;6738:7;6778:4;6771:5;6767:16;6756:27;;6703:86;;;:::o;6795:112::-;6878:22;6894:5;6878:22;:::i;:::-;6873:3;6866:35;6795:112;;:::o;6913:214::-;7002:4;7040:2;7029:9;7025:18;7017:26;;7053:67;7117:1;7106:9;7102:17;7093:6;7053:67;:::i;:::-;6913:214;;;;:::o;7133:329::-;7192:6;7241:2;7229:9;7220:7;7216:23;7212:32;7209:119;;;7247:79;;:::i;:::-;7209:119;7367:1;7392:53;7437:7;7428:6;7417:9;7413:22;7392:53;:::i;:::-;7382:63;;7338:117;7133:329;;;;:::o;7468:::-;7527:6;7576:2;7564:9;7555:7;7551:23;7547:32;7544:119;;;7582:79;;:::i;:::-;7544:119;7702:1;7727:53;7772:7;7763:6;7752:9;7748:22;7727:53;:::i;:::-;7717:63;;7673:117;7468:329;;;;:::o;7803:111::-;7855:7;7884:24;7902:5;7884:24;:::i;:::-;7873:35;;7803:111;;;:::o;7920:152::-;8008:39;8041:5;8008:39;:::i;:::-;8001:5;7998:50;7988:78;;8062:1;8059;8052:12;7988:78;7920:152;:::o;8078:169::-;8139:5;8177:6;8164:20;8155:29;;8193:48;8235:5;8193:48;:::i;:::-;8078:169;;;;:::o;8253:649::-;8345:6;8353;8361;8410:2;8398:9;8389:7;8385:23;8381:32;8378:119;;;8416:79;;:::i;:::-;8378:119;8536:1;8561:68;8621:7;8612:6;8601:9;8597:22;8561:68;:::i;:::-;8551:78;;8507:132;8678:2;8704:53;8749:7;8740:6;8729:9;8725:22;8704:53;:::i;:::-;8694:63;;8649:118;8806:2;8832:53;8877:7;8868:6;8857:9;8853:22;8832:53;:::i;:::-;8822:63;;8777:118;8253:649;;;;;:::o;8908:118::-;8995:24;9013:5;8995:24;:::i;:::-;8990:3;8983:37;8908:118;;:::o;9032:222::-;9125:4;9163:2;9152:9;9148:18;9140:26;;9176:71;9244:1;9233:9;9229:17;9220:6;9176:71;:::i;:::-;9032:222;;;;:::o;9260:474::-;9328:6;9336;9385:2;9373:9;9364:7;9360:23;9356:32;9353:119;;;9391:79;;:::i;:::-;9353:119;9511:1;9536:53;9581:7;9572:6;9561:9;9557:22;9536:53;:::i;:::-;9526:63;;9482:117;9638:2;9664:53;9709:7;9700:6;9689:9;9685:22;9664:53;:::i;:::-;9654:63;;9609:118;9260:474;;;;;:::o;9740:180::-;9788:77;9785:1;9778:88;9885:4;9882:1;9875:15;9909:4;9906:1;9899:15;9926:320;9970:6;10007:1;10001:4;9997:12;9987:22;;10054:1;10048:4;10044:12;10075:18;10065:81;;10131:4;10123:6;10119:17;10109:27;;10065:81;10193:2;10185:6;10182:14;10162:18;10159:38;10156:84;;10212:18;;:::i;:::-;10156:84;9977:269;9926:320;;;:::o;10252:234::-;10392:34;10388:1;10380:6;10376:14;10369:58;10461:17;10456:2;10448:6;10444:15;10437:42;10252:234;:::o;10492:366::-;10634:3;10655:67;10719:2;10714:3;10655:67;:::i;:::-;10648:74;;10731:93;10820:3;10731:93;:::i;:::-;10849:2;10844:3;10840:12;10833:19;;10492:366;;;:::o;10864:419::-;11030:4;11068:2;11057:9;11053:18;11045:26;;11117:9;11111:4;11107:20;11103:1;11092:9;11088:17;11081:47;11145:131;11271:4;11145:131;:::i;:::-;11137:139;;10864:419;;;:::o;11289:180::-;11337:77;11334:1;11327:88;11434:4;11431:1;11424:15;11458:4;11455:1;11448:15;11475:191;11515:3;11534:20;11552:1;11534:20;:::i;:::-;11529:25;;11568:20;11586:1;11568:20;:::i;:::-;11563:25;;11611:1;11608;11604:9;11597:16;;11632:3;11629:1;11626:10;11623:36;;;11639:18;;:::i;:::-;11623:36;11475:191;;;;:::o;11672:161::-;11812:13;11808:1;11800:6;11796:14;11789:37;11672:161;:::o;11839:366::-;11981:3;12002:67;12066:2;12061:3;12002:67;:::i;:::-;11995:74;;12078:93;12167:3;12078:93;:::i;:::-;12196:2;12191:3;12187:12;12180:19;;11839:366;;;:::o;12211:419::-;12377:4;12415:2;12404:9;12400:18;12392:26;;12464:9;12458:4;12454:20;12450:1;12439:9;12435:17;12428:47;12492:131;12618:4;12492:131;:::i;:::-;12484:139;;12211:419;;;:::o;12636:102::-;12678:8;12725:5;12722:1;12718:13;12697:34;;12636:102;;;:::o;12744:848::-;12805:5;12812:4;12836:6;12827:15;;12860:5;12851:14;;12874:712;12895:1;12885:8;12882:15;12874:712;;;12990:4;12985:3;12981:14;12975:4;12972:24;12969:50;;;12999:18;;:::i;:::-;12969:50;13049:1;13039:8;13035:16;13032:451;;;13464:4;13457:5;13453:16;13444:25;;13032:451;13514:4;13508;13504:15;13496:23;;13544:32;13567:8;13544:32;:::i;:::-;13532:44;;12874:712;;;12744:848;;;;;;;:::o;13598:1073::-;13652:5;13843:8;13833:40;;13864:1;13855:10;;13866:5;;13833:40;13892:4;13882:36;;13909:1;13900:10;;13911:5;;13882:36;13978:4;14026:1;14021:27;;;;14062:1;14057:191;;;;13971:277;;14021:27;14039:1;14030:10;;14041:5;;;14057:191;14102:3;14092:8;14089:17;14086:43;;;14109:18;;:::i;:::-;14086:43;14158:8;14155:1;14151:16;14142:25;;14193:3;14186:5;14183:14;14180:40;;;14200:18;;:::i;:::-;14180:40;14233:5;;;13971:277;;14357:2;14347:8;14344:16;14338:3;14332:4;14329:13;14325:36;14307:2;14297:8;14294:16;14289:2;14283:4;14280:12;14276:35;14260:111;14257:246;;;14413:8;14407:4;14403:19;14394:28;;14448:3;14441:5;14438:14;14435:40;;;14455:18;;:::i;:::-;14435:40;14488:5;;14257:246;14528:42;14566:3;14556:8;14550:4;14547:1;14528:42;:::i;:::-;14513:57;;;;14602:4;14597:3;14593:14;14586:5;14583:25;14580:51;;;14611:18;;:::i;:::-;14580:51;14660:4;14653:5;14649:16;14640:25;;13598:1073;;;;;;:::o;14677:285::-;14737:5;14761:23;14779:4;14761:23;:::i;:::-;14753:31;;14805:27;14823:8;14805:27;:::i;:::-;14793:39;;14851:104;14888:66;14878:8;14872:4;14851:104;:::i;:::-;14842:113;;14677:285;;;;:::o;14968:410::-;15008:7;15031:20;15049:1;15031:20;:::i;:::-;15026:25;;15065:20;15083:1;15065:20;:::i;:::-;15060:25;;15120:1;15117;15113:9;15142:30;15160:11;15142:30;:::i;:::-;15131:41;;15321:1;15312:7;15308:15;15305:1;15302:22;15282:1;15275:9;15255:83;15232:139;;15351:18;;:::i;:::-;15232:139;15016:362;14968:410;;;;:::o;15384:160::-;15524:12;15520:1;15512:6;15508:14;15501:36;15384:160;:::o;15550:366::-;15692:3;15713:67;15777:2;15772:3;15713:67;:::i;:::-;15706:74;;15789:93;15878:3;15789:93;:::i;:::-;15907:2;15902:3;15898:12;15891:19;;15550:366;;;:::o;15922:419::-;16088:4;16126:2;16115:9;16111:18;16103:26;;16175:9;16169:4;16165:20;16161:1;16150:9;16146:17;16139:47;16203:131;16329:4;16203:131;:::i;:::-;16195:139;;15922:419;;;:::o;16347:163::-;16487:15;16483:1;16475:6;16471:14;16464:39;16347:163;:::o;16516:366::-;16658:3;16679:67;16743:2;16738:3;16679:67;:::i;:::-;16672:74;;16755:93;16844:3;16755:93;:::i;:::-;16873:2;16868:3;16864:12;16857:19;;16516:366;;;:::o;16888:419::-;17054:4;17092:2;17081:9;17077:18;17069:26;;17141:9;17135:4;17131:20;17127:1;17116:9;17112:17;17105:47;17169:131;17295:4;17169:131;:::i;:::-;17161:139;;16888:419;;;:::o;17313:332::-;17434:4;17472:2;17461:9;17457:18;17449:26;;17485:71;17553:1;17542:9;17538:17;17529:6;17485:71;:::i;:::-;17566:72;17634:2;17623:9;17619:18;17610:6;17566:72;:::i;:::-;17313:332;;;;;:::o;17651:116::-;17721:21;17736:5;17721:21;:::i;:::-;17714:5;17711:32;17701:60;;17757:1;17754;17747:12;17701:60;17651:116;:::o;17773:137::-;17827:5;17858:6;17852:13;17843:22;;17874:30;17898:5;17874:30;:::i;:::-;17773:137;;;;:::o;17916:345::-;17983:6;18032:2;18020:9;18011:7;18007:23;18003:32;18000:119;;;18038:79;;:::i;:::-;18000:119;18158:1;18183:61;18236:7;18227:6;18216:9;18212:22;18183:61;:::i;:::-;18173:71;;18129:125;17916:345;;;;:::o;18267:60::-;18295:3;18316:5;18309:12;;18267:60;;;:::o;18333:142::-;18383:9;18416:53;18434:34;18443:24;18461:5;18443:24;:::i;:::-;18434:34;:::i;:::-;18416:53;:::i;:::-;18403:66;;18333:142;;;:::o;18481:126::-;18531:9;18564:37;18595:5;18564:37;:::i;:::-;18551:50;;18481:126;;;:::o;18613:141::-;18678:9;18711:37;18742:5;18711:37;:::i;:::-;18698:50;;18613:141;;;:::o;18760:161::-;18862:52;18908:5;18862:52;:::i;:::-;18857:3;18850:65;18760:161;;:::o;18927:472::-;19091:4;19129:2;19118:9;19114:18;19106:26;;19142:86;19225:1;19214:9;19210:17;19201:6;19142:86;:::i;:::-;19238:72;19306:2;19295:9;19291:18;19282:6;19238:72;:::i;:::-;19320;19388:2;19377:9;19373:18;19364:6;19320:72;:::i;:::-;18927:472;;;;;;:::o;19405:224::-;19545:34;19541:1;19533:6;19529:14;19522:58;19614:7;19609:2;19601:6;19597:15;19590:32;19405:224;:::o;19635:366::-;19777:3;19798:67;19862:2;19857:3;19798:67;:::i;:::-;19791:74;;19874:93;19963:3;19874:93;:::i;:::-;19992:2;19987:3;19983:12;19976:19;;19635:366;;;:::o;20007:419::-;20173:4;20211:2;20200:9;20196:18;20188:26;;20260:9;20254:4;20250:20;20246:1;20235:9;20231:17;20224:47;20288:131;20414:4;20288:131;:::i;:::-;20280:139;;20007:419;;;:::o;20432:225::-;20572:34;20568:1;20560:6;20556:14;20549:58;20641:8;20636:2;20628:6;20624:15;20617:33;20432:225;:::o;20663:366::-;20805:3;20826:67;20890:2;20885:3;20826:67;:::i;:::-;20819:74;;20902:93;20991:3;20902:93;:::i;:::-;21020:2;21015:3;21011:12;21004:19;;20663:366;;;:::o;21035:419::-;21201:4;21239:2;21228:9;21224:18;21216:26;;21288:9;21282:4;21278:20;21274:1;21263:9;21259:17;21252:47;21316:131;21442:4;21316:131;:::i;:::-;21308:139;;21035:419;;;:::o;21460:223::-;21600:34;21596:1;21588:6;21584:14;21577:58;21669:6;21664:2;21656:6;21652:15;21645:31;21460:223;:::o;21689:366::-;21831:3;21852:67;21916:2;21911:3;21852:67;:::i;:::-;21845:74;;21928:93;22017:3;21928:93;:::i;:::-;22046:2;22041:3;22037:12;22030:19;;21689:366;;;:::o;22061:419::-;22227:4;22265:2;22254:9;22250:18;22242:26;;22314:9;22308:4;22304:20;22300:1;22289:9;22285:17;22278:47;22342:131;22468:4;22342:131;:::i;:::-;22334:139;;22061:419;;;:::o;22486:221::-;22626:34;22622:1;22614:6;22610:14;22603:58;22695:4;22690:2;22682:6;22678:15;22671:29;22486:221;:::o;22713:366::-;22855:3;22876:67;22940:2;22935:3;22876:67;:::i;:::-;22869:74;;22952:93;23041:3;22952:93;:::i;:::-;23070:2;23065:3;23061:12;23054:19;;22713:366;;;:::o;23085:419::-;23251:4;23289:2;23278:9;23274:18;23266:26;;23338:9;23332:4;23328:20;23324:1;23313:9;23309:17;23302:47;23366:131;23492:4;23366:131;:::i;:::-;23358:139;;23085:419;;;:::o;23510:179::-;23650:31;23646:1;23638:6;23634:14;23627:55;23510:179;:::o;23695:366::-;23837:3;23858:67;23922:2;23917:3;23858:67;:::i;:::-;23851:74;;23934:93;24023:3;23934:93;:::i;:::-;24052:2;24047:3;24043:12;24036:19;;23695:366;;;:::o;24067:419::-;24233:4;24271:2;24260:9;24256:18;24248:26;;24320:9;24314:4;24310:20;24306:1;24295:9;24291:17;24284:47;24348:131;24474:4;24348:131;:::i;:::-;24340:139;;24067:419;;;:::o;24492:224::-;24632:34;24628:1;24620:6;24616:14;24609:58;24701:7;24696:2;24688:6;24684:15;24677:32;24492:224;:::o;24722:366::-;24864:3;24885:67;24949:2;24944:3;24885:67;:::i;:::-;24878:74;;24961:93;25050:3;24961:93;:::i;:::-;25079:2;25074:3;25070:12;25063:19;;24722:366;;;:::o;25094:419::-;25260:4;25298:2;25287:9;25283:18;25275:26;;25347:9;25341:4;25337:20;25333:1;25322:9;25318:17;25311:47;25375:131;25501:4;25375:131;:::i;:::-;25367:139;;25094:419;;;:::o;25519:222::-;25659:34;25655:1;25647:6;25643:14;25636:58;25728:5;25723:2;25715:6;25711:15;25704:30;25519:222;:::o;25747:366::-;25889:3;25910:67;25974:2;25969:3;25910:67;:::i;:::-;25903:74;;25986:93;26075:3;25986:93;:::i;:::-;26104:2;26099:3;26095:12;26088:19;;25747:366;;;:::o;26119:419::-;26285:4;26323:2;26312:9;26308:18;26300:26;;26372:9;26366:4;26362:20;26358:1;26347:9;26343:17;26336:47;26400:131;26526:4;26400:131;:::i;:::-;26392:139;;26119:419;;;:::o;26544:225::-;26684:34;26680:1;26672:6;26668:14;26661:58;26753:8;26748:2;26740:6;26736:15;26729:33;26544:225;:::o;26775:366::-;26917:3;26938:67;27002:2;26997:3;26938:67;:::i;:::-;26931:74;;27014:93;27103:3;27014:93;:::i;:::-;27132:2;27127:3;27123:12;27116:19;;26775:366;;;:::o;27147:419::-;27313:4;27351:2;27340:9;27336:18;27328:26;;27400:9;27394:4;27390:20;27386:1;27375:9;27371:17;27364:47;27428:131;27554:4;27428:131;:::i;:::-;27420:139;;27147:419;;;:::o;27572:181::-;27712:33;27708:1;27700:6;27696:14;27689:57;27572:181;:::o;27759:366::-;27901:3;27922:67;27986:2;27981:3;27922:67;:::i;:::-;27915:74;;27998:93;28087:3;27998:93;:::i;:::-;28116:2;28111:3;28107:12;28100:19;;27759:366;;;:::o;28131:419::-;28297:4;28335:2;28324:9;28320:18;28312:26;;28384:9;28378:4;28374:20;28370:1;28359:9;28355:17;28348:47;28412:131;28538:4;28412:131;:::i;:::-;28404:139;;28131:419;;;:::o;28556:220::-;28696:34;28692:1;28684:6;28680:14;28673:58;28765:3;28760:2;28752:6;28748:15;28741:28;28556:220;:::o;28782:366::-;28924:3;28945:67;29009:2;29004:3;28945:67;:::i;:::-;28938:74;;29021:93;29110:3;29021:93;:::i;:::-;29139:2;29134:3;29130:12;29123:19;;28782:366;;;:::o;29154:419::-;29320:4;29358:2;29347:9;29343:18;29335:26;;29407:9;29401:4;29397:20;29393:1;29382:9;29378:17;29371:47;29435:131;29561:4;29435:131;:::i;:::-;29427:139;;29154:419;;;:::o;29579:221::-;29719:34;29715:1;29707:6;29703:14;29696:58;29788:4;29783:2;29775:6;29771:15;29764:29;29579:221;:::o;29806:366::-;29948:3;29969:67;30033:2;30028:3;29969:67;:::i;:::-;29962:74;;30045:93;30134:3;30045:93;:::i;:::-;30163:2;30158:3;30154:12;30147:19;;29806:366;;;:::o;30178:419::-;30344:4;30382:2;30371:9;30367:18;30359:26;;30431:9;30425:4;30421:20;30417:1;30406:9;30402:17;30395:47;30459:131;30585:4;30459:131;:::i;:::-;30451:139;;30178:419;;;:::o;30603:182::-;30743:34;30739:1;30731:6;30727:14;30720:58;30603:182;:::o;30791:366::-;30933:3;30954:67;31018:2;31013:3;30954:67;:::i;:::-;30947:74;;31030:93;31119:3;31030:93;:::i;:::-;31148:2;31143:3;31139:12;31132:19;;30791:366;;;:::o;31163:419::-;31329:4;31367:2;31356:9;31352:18;31344:26;;31416:9;31410:4;31406:20;31402:1;31391:9;31387:17;31380:47;31444:131;31570:4;31444:131;:::i;:::-;31436:139;;31163:419;;;:::o;31588:174::-;31728:26;31724:1;31716:6;31712:14;31705:50;31588:174;:::o;31768:366::-;31910:3;31931:67;31995:2;31990:3;31931:67;:::i;:::-;31924:74;;32007:93;32096:3;32007:93;:::i;:::-;32125:2;32120:3;32116:12;32109:19;;31768:366;;;:::o;32140:419::-;32306:4;32344:2;32333:9;32329:18;32321:26;;32393:9;32387:4;32383:20;32379:1;32368:9;32364:17;32357:47;32421:131;32547:4;32421:131;:::i;:::-;32413:139;;32140:419;;;:::o;32565:172::-;32705:24;32701:1;32693:6;32689:14;32682:48;32565:172;:::o;32743:366::-;32885:3;32906:67;32970:2;32965:3;32906:67;:::i;:::-;32899:74;;32982:93;33071:3;32982:93;:::i;:::-;33100:2;33095:3;33091:12;33084:19;;32743:366;;;:::o;33115:419::-;33281:4;33319:2;33308:9;33304:18;33296:26;;33368:9;33362:4;33358:20;33354:1;33343:9;33339:17;33332:47;33396:131;33522:4;33396:131;:::i;:::-;33388:139;;33115:419;;;:::o;33540:148::-;33642:11;33679:3;33664:18;;33540:148;;;;:::o;33694:173::-;33834:25;33830:1;33822:6;33818:14;33811:49;33694:173;:::o;33873:402::-;34033:3;34054:85;34136:2;34131:3;34054:85;:::i;:::-;34047:92;;34148:93;34237:3;34148:93;:::i;:::-;34266:2;34261:3;34257:12;34250:19;;33873:402;;;:::o;34281:390::-;34387:3;34415:39;34448:5;34415:39;:::i;:::-;34470:89;34552:6;34547:3;34470:89;:::i;:::-;34463:96;;34568:65;34626:6;34621:3;34614:4;34607:5;34603:16;34568:65;:::i;:::-;34658:6;34653:3;34649:16;34642:23;;34391:280;34281:390;;;;:::o;34677:167::-;34817:19;34813:1;34805:6;34801:14;34794:43;34677:167;:::o;34850:402::-;35010:3;35031:85;35113:2;35108:3;35031:85;:::i;:::-;35024:92;;35125:93;35214:3;35125:93;:::i;:::-;35243:2;35238:3;35234:12;35227:19;;34850:402;;;:::o;35258:967::-;35640:3;35662:148;35806:3;35662:148;:::i;:::-;35655:155;;35827:95;35918:3;35909:6;35827:95;:::i;:::-;35820:102;;35939:148;36083:3;35939:148;:::i;:::-;35932:155;;36104:95;36195:3;36186:6;36104:95;:::i;:::-;36097:102;;36216:3;36209:10;;35258:967;;;;;:::o;36231:180::-;36279:77;36276:1;36269:88;36376:4;36373:1;36366:15;36400:4;36397:1;36390:15;36417:180;36465:77;36462:1;36455:88;36562:4;36559:1;36552:15;36586:4;36583:1;36576:15;36603:171;36642:3;36665:24;36683:5;36665:24;:::i;:::-;36656:33;;36711:4;36704:5;36701:15;36698:41;;36719:18;;:::i;:::-;36698:41;36766:1;36759:5;36755:13;36748:20;;36603:171;;;:::o;36780:182::-;36920:34;36916:1;36908:6;36904:14;36897:58;36780:182;:::o;36968:366::-;37110:3;37131:67;37195:2;37190:3;37131:67;:::i;:::-;37124:74;;37207:93;37296:3;37207:93;:::i;:::-;37325:2;37320:3;37316:12;37309:19;;36968:366;;;:::o;37340:419::-;37506:4;37544:2;37533:9;37529:18;37521:26;;37593:9;37587:4;37583:20;37579:1;37568:9;37564:17;37557:47;37621:131;37747:4;37621:131;:::i;:::-;37613:139;;37340:419;;;:::o
Metadata Hash
ipfs://492c552d953af632611e67721b2387afaf0733e8ac57dfa4653c916f7f80e4e4