Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
3,558,148.31539351851851844 MANA
Holders
14
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
432,828.153356481481481475 MANAValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BlacklistNFTFarming
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-15 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[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 = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: contracts/NFTFarming.sol //SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.7; contract BlacklistNFTFarming is ERC20, Ownable, ReentrancyGuard, Pausable{ using SafeERC20 for IERC20; using SafeMath for uint256; //Statics ERC721 public HeathensAddress; ERC721 public HeathensFreeAddress; uint256 public doubleBaseTimeStamp; mapping(address => Staker) internal stakers; mapping(address => StakerFree) internal stakersfree; struct Heathens { uint256 stakedTimestamp; uint256 tokenId; } struct HeathensFree { uint256 stakedTimestamp; uint256 tokenId; } struct Staker { Heathens[] heathens; uint256 lastClaim; } struct StakerFree { HeathensFree[] heathensfree; uint256 lastClaim; } constructor() public ERC20("Heathens", "MANA") { HeathensAddress = ERC721(0xA8cf84dD46e59428a468E5267979a3400B785F33); //0xA8cf84dD46e59428a468E5267979a3400B785F33 is Heathens Address HeathensFreeAddress = ERC721(0x7885E95DA77EA497303192E745095cFBE4a0c330); //0x7885E95DA77EA497303192E745095cFBE4a0c330 is Creatures Address } //Staking function stakeHeathen(uint256[] calldata _heathens) external nonReentrant whenNotPaused { for(uint256 i=0; i < _heathens.length; i++){ require(ERC721(HeathensAddress).ownerOf(_heathens[i]) == msg.sender, "At least one Heathen NFT is not owned by you."); ERC721(HeathensAddress).transferFrom(msg.sender, address(this), _heathens[i]); stakers[msg.sender].heathens.push(Heathens(block.timestamp, _heathens[i])); } } function stakeHeathenFree(uint256[] calldata _heathens) external nonReentrant whenNotPaused { for(uint256 i=0; i < _heathens.length; i++){ require(ERC721(HeathensFreeAddress).ownerOf(_heathens[i]) == msg.sender, "At least one Heathen NFT is not owned by you."); ERC721(HeathensFreeAddress).transferFrom(msg.sender, address(this), _heathens[i]); stakersfree[msg.sender].heathensfree.push(HeathensFree(block.timestamp, _heathens[i])); } } //Heathens Of Staker function heathensOfStaker(address _staker) public view returns(uint256[] memory){ uint256[] memory tokenIds = new uint256[](stakers[_staker].heathens.length); for(uint256 i = 0; i < stakers[_staker].heathens.length; i++){ tokenIds[i] = stakers[_staker].heathens[i].tokenId; } return tokenIds; } function heathensOfStakerFree(address _staker) public view returns(uint256[] memory){ uint256[] memory tokenIds = new uint256[](stakersfree[_staker].heathensfree.length); for(uint256 i = 0; i < stakersfree[_staker].heathensfree.length; i++){ tokenIds[i] = stakersfree[_staker].heathensfree[i].tokenId; } return tokenIds; } function getNumberOfStakedHeathens(address _staker) public view returns(uint256){ return stakers[_staker].heathens.length; } function getNumberOfStakedHeathensFree(address _staker) public view returns(uint256){ return stakersfree[_staker].heathensfree.length; } //Remove Heathens IDS from Staker function removeHeathensIdsFromStaker(address _staker, uint256[] memory _tokenIds) internal { for(uint256 i = 0; i < _tokenIds.length; i++){ for(uint256 j = 0; j < stakers[_staker].heathens.length; j++){ if(_tokenIds[i] == stakers[_staker].heathens[j].tokenId){ stakers[_staker].heathens[j] = stakers[_staker].heathens[stakers[_staker].heathens.length - 1]; stakers[_staker].heathens.pop(); } } } } function removeHeathensIdsFromStakerFree(address _staker, uint256[] memory _tokenIds) internal { for(uint256 i = 0; i < _tokenIds.length; i++){ for(uint256 j = 0; j < stakersfree[_staker].heathensfree.length; j++){ if(_tokenIds[i] == stakersfree[_staker].heathensfree[j].tokenId){ stakersfree[_staker].heathensfree[j] = stakersfree[_staker].heathensfree[stakersfree[_staker].heathensfree.length - 1]; stakersfree[_staker].heathensfree.pop(); } } } } //Claim Nectar Rewards function claimRewards() external nonReentrant whenNotPaused { uint256 nectar = calculateNectarRewards(msg.sender); if(nectar > 0){ stakers[msg.sender].lastClaim = block.timestamp; _mint(msg.sender, nectar); }else{ revert("Not enough nectar to claim."); } } function claimRewardsFree() external nonReentrant whenNotPaused { uint256 nectarfree = calculateNectarRewardsFree(msg.sender); if(nectarfree > 0){ stakersfree[msg.sender].lastClaim = block.timestamp; _mint(msg.sender, nectarfree); }else{ revert("Not enough nectar to claim."); } } //Unstaking function unstakeAllHeathen() external nonReentrant whenNotPaused { uint256 nectarRewards = calculateNectarRewards(msg.sender); uint256[] memory tokenIds = heathensOfStaker(msg.sender); for(uint256 i = 0; i < tokenIds.length; i++){ ERC721(HeathensAddress).transferFrom(address(this), msg.sender, tokenIds[i]); tokenIds[i] = stakers[msg.sender].heathens[i].tokenId; } removeHeathensIdsFromStaker(msg.sender, tokenIds); stakers[msg.sender].lastClaim = block.timestamp; _mint(msg.sender, nectarRewards); } function unstakeAllFreeHeathen() external nonReentrant whenNotPaused { uint256 nectarRewards = calculateNectarRewardsFree(msg.sender); uint256[] memory tokenIds = heathensOfStakerFree(msg.sender); for(uint256 i = 0; i < tokenIds.length; i++){ ERC721(HeathensFreeAddress).transferFrom(address(this), msg.sender, tokenIds[i]); tokenIds[i] = stakersfree[msg.sender].heathensfree[i].tokenId; } removeHeathensIdsFromStakerFree(msg.sender, tokenIds); stakersfree[msg.sender].lastClaim = block.timestamp; _mint(msg.sender, nectarRewards); } //Nectar Rewards function calculateNectarRewards(address _staker) public view returns(uint256 nectarAmount){ uint256 balanceBonus = _getBonusPct(); for(uint256 i = 0; i < stakers[_staker].heathens.length; i++){ nectarAmount = nectarAmount + calculateNectarOfStaker( stakers[_staker].lastClaim, stakers[_staker].heathens[i].stakedTimestamp, block.timestamp, balanceBonus, doubleBaseTimeStamp ); } } function calculateNectarRewardsFree(address _staker) public view returns(uint256 nectarAmount){ uint256 balanceBonus = _getBonusPctFree(); for(uint256 i = 0; i < stakersfree[_staker].heathensfree.length; i++){ nectarAmount = nectarAmount + calculateNectarOfStakerFree( stakersfree[_staker].lastClaim, stakersfree[_staker].heathensfree[i].stakedTimestamp, block.timestamp, balanceBonus, doubleBaseTimeStamp ); } } function calculateNectarOfStaker( uint256 _lastClaimedTimeStamp, uint256 _stakedTimeStamp, uint256 _currentTimeStamp, uint256 _balanceBonus, uint256 _doubleBaseTimeStamp ) internal pure returns(uint256 nectar){ uint256 bonusPercentage; uint256 baseNectarMultiplier = 1; uint256 unclaimedTime; uint256 stakedTime = _currentTimeStamp - _stakedTimeStamp; if(_lastClaimedTimeStamp < _stakedTimeStamp){ _lastClaimedTimeStamp = _stakedTimeStamp; } unclaimedTime = _currentTimeStamp - _lastClaimedTimeStamp; if(stakedTime >= 15 days || _stakedTimeStamp <= _doubleBaseTimeStamp){ baseNectarMultiplier = 2; } if(stakedTime >= 90 days){ bonusPercentage = 100; }else{ for(uint256 i= 2; i < 4; i++){ uint256 timeRequirement = 15 days * i; if(timeRequirement > 0 && timeRequirement <= stakedTime){ bonusPercentage = bonusPercentage + 15; }else{ break; } } } bonusPercentage = bonusPercentage + _balanceBonus; nectar = (unclaimedTime * 500 ether * baseNectarMultiplier) / 1 days; nectar = nectar + ((nectar * bonusPercentage) / 100); } function calculateNectarOfStakerFree( uint256 _lastClaimedTimeStamp, uint256 _stakedTimeStamp, uint256 _currentTimeStamp, uint256 _balanceBonus, uint256 _doubleBaseTimeStamp ) internal pure returns(uint256 nectar){ uint256 bonusPercentage; uint256 baseNectarMultiplier = 1; uint256 unclaimedTime; uint256 stakedTime = _currentTimeStamp - _stakedTimeStamp; if(_lastClaimedTimeStamp < _stakedTimeStamp){ _lastClaimedTimeStamp = _stakedTimeStamp; } unclaimedTime = _currentTimeStamp - _lastClaimedTimeStamp; if(stakedTime >= 15 days || _stakedTimeStamp <= _doubleBaseTimeStamp){ baseNectarMultiplier = 2; } if(stakedTime >= 90 days){ bonusPercentage = 100; }else{ for(uint256 i= 2; i < 4; i++){ uint256 timeRequirement = 15 days * i; if(timeRequirement > 0 && timeRequirement <= stakedTime){ bonusPercentage = bonusPercentage + 15; }else{ break; } } } bonusPercentage = bonusPercentage + _balanceBonus; nectar = (unclaimedTime * 500 ether * baseNectarMultiplier) / 1 days; nectar = nectar + ((nectar * bonusPercentage) / 100); } function _getBonusPct() internal view returns(uint256 bonus){ uint256 balance = stakers[msg.sender].heathens.length; if(balance < 5) return 0; if(balance < 10) return 15; if(balance < 20) return 25; return 35; } function _getBonusPctFree() internal view returns(uint256 bonus){ uint256 balance = stakersfree[msg.sender].heathensfree.length; if(balance < 5) return 0; if(balance < 10) return 15; if(balance < 20) return 25; return 35; } } interface ERC721 { function balanceOf(address holder_) external view returns (uint256); function ownerOf(uint256 id_) external view returns (address); function walletOfOwner(address _owner) external view returns (uint256[] calldata); function isApprovedForAll(address operator_, address address_) external view returns (bool); function transferFrom( address from, address to, uint256 tokenId ) external; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"HeathensAddress","outputs":[{"internalType":"contract ERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HeathensFreeAddress","outputs":[{"internalType":"contract ERC721","name":"","type":"address"}],"stateMutability":"view","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":"_staker","type":"address"}],"name":"calculateNectarRewards","outputs":[{"internalType":"uint256","name":"nectarAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"calculateNectarRewardsFree","outputs":[{"internalType":"uint256","name":"nectarAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewardsFree","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":[],"name":"doubleBaseTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"getNumberOfStakedHeathens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"getNumberOfStakedHeathensFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"heathensOfStaker","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"heathensOfStakerFree","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_heathens","type":"uint256[]"}],"name":"stakeHeathen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_heathens","type":"uint256[]"}],"name":"stakeHeathenFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAllFreeHeathen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAllHeathen","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600881526020017f4865617468656e730000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d414e410000000000000000000000000000000000000000000000000000000081525081600390805190602001906200009692919062000273565b508060049080519060200190620000af92919062000273565b505050620000d2620000c6620001a560201b60201c565b620001ad60201b60201c565b60016006819055506000600760006101000a81548160ff02191690831515021790555073a8cf84dd46e59428a468e5267979a3400b785f33600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737885e95da77ea497303192e745095cfbe4a0c330600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000388565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002819062000323565b90600052602060002090601f016020900481019282620002a55760008555620002f1565b82601f10620002c057805160ff1916838001178555620002f1565b82800160010185558215620002f1579182015b82811115620002f0578251825591602001919060010190620002d3565b5b50905062000300919062000304565b5090565b5b808211156200031f57600081600090555060010162000305565b5090565b600060028204905060018216806200033c57607f821691505b6020821081141562000353576200035262000359565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613fa880620003986000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063634de66811610104578063a457c2d7116100a2578063dd62ed3e11610071578063dd62ed3e1461054b578063e81bbbd41461057b578063f2fde38b14610597578063fd7145b6146105b3576101da565b8063a457c2d7146104c3578063a87bce88146104f3578063a9059cbb14610511578063bc499cb914610541576101da565b8063715018a6116100de578063715018a61461044d5780638da5cb5b1461045757806395d89b41146104755780639ae8965914610493576101da565b8063634de668146103cf5780636ee77ec0146103ed57806370a082311461041d576101da565b806328b70db11161017c578063395093511161014b57806339509351146103335780633dc46adf146103635780634c9a2042146103815780635c975abb146103b1576101da565b806328b70db1146102ab578063313ce567146102db578063357f59b0146102f9578063372500ab14610329576101da565b806320a57d19116101b857806320a57d191461024b57806323b872dd1461026757806325720cd714610297578063287034b7146102a1576101da565b806306fdde03146101df578063095ea7b3146101fd57806318160ddd1461022d575b600080fd5b6101e76105e3565b6040516101f491906135d7565b60405180910390f35b610217600480360381019061021291906131ad565b610675565b60405161022491906135a1565b60405180910390f35b610235610698565b60405161024291906137b9565b60405180910390f35b610265600480360381019061026091906131ed565b6106a2565b005b610281600480360381019061027c919061315a565b6109f0565b60405161028e91906135a1565b60405180910390f35b61029f610a1f565b005b6102a9610c86565b005b6102c560048036038101906102c091906130c0565b610eed565b6040516102d291906137b9565b60405180910390f35b6102e3611027565b6040516102f091906137d4565b60405180910390f35b610313600480360381019061030e91906130c0565b611030565b604051610320919061357f565b60405180910390f35b6103316111b6565b005b61034d600480360381019061034891906131ad565b6112fe565b60405161035a91906135a1565b60405180910390f35b61036b6113a8565b60405161037891906135bc565b60405180910390f35b61039b600480360381019061039691906130c0565b6113ce565b6040516103a891906137b9565b60405180910390f35b6103b9611508565b6040516103c691906135a1565b60405180910390f35b6103d761151f565b6040516103e491906137b9565b60405180910390f35b610407600480360381019061040291906130c0565b611525565b60405161041491906137b9565b60405180910390f35b610437600480360381019061043291906130c0565b611574565b60405161044491906137b9565b60405180910390f35b6104556115bc565b005b61045f611644565b60405161046c919061352d565b60405180910390f35b61047d61166e565b60405161048a91906135d7565b60405180910390f35b6104ad60048036038101906104a891906130c0565b611700565b6040516104ba919061357f565b60405180910390f35b6104dd60048036038101906104d891906131ad565b611886565b6040516104ea91906135a1565b60405180910390f35b6104fb611970565b60405161050891906135bc565b60405180910390f35b61052b600480360381019061052691906131ad565b611996565b60405161053891906135a1565b60405180910390f35b6105496119b9565b005b6105656004803603810190610560919061311a565b611b01565b60405161057291906137b9565b60405180910390f35b610595600480360381019061059091906131ed565b611b88565b005b6105b160048036038101906105ac91906130c0565b611ed6565b005b6105cd60048036038101906105c891906130c0565b611fce565b6040516105da91906137b9565b60405180910390f35b6060600380546105f290613a17565b80601f016020809104026020016040519081016040528092919081815260200182805461061e90613a17565b801561066b5780601f106106405761010080835404028352916020019161066b565b820191906000526020600020905b81548152906001019060200180831161064e57829003601f168201915b5050505050905090565b60008061068061201d565b905061068d818585612025565b600191505092915050565b6000600254905090565b600260065414156106e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106df90613759565b60405180910390fd5b60026006819055506106f8611508565b15610738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072f906136d9565b60405180910390fd5b60005b828290508110156109e3573373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8585858181106107ae576107ad613b4e565b5b905060200201356040518263ffffffff1660e01b81526004016107d191906137b9565b60206040518083038186803b1580156107e957600080fd5b505afa1580156107fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082191906130ed565b73ffffffffffffffffffffffffffffffffffffffff1614610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e906136b9565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308686868181106108ca576108c9613b4e565b5b905060200201356040518463ffffffff1660e01b81526004016108ef93929190613548565b600060405180830381600087803b15801561090957600080fd5b505af115801561091d573d6000803e3d6000fd5b50505050600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001604051806040016040528042815260200185858581811061098757610986613b4e565b5b9050602002013581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505080806109db90613a49565b91505061073b565b5060016006819055505050565b6000806109fb61201d565b9050610a088582856121f0565b610a1385858561227c565b60019150509392505050565b60026006541415610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c90613759565b60405180910390fd5b6002600681905550610a75611508565b15610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac906136d9565b60405180910390fd5b6000610ac0336113ce565b90506000610acd33611700565b905060005b8151811015610c1e57600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033858581518110610b2e57610b2d613b4e565b5b60200260200101516040518463ffffffff1660e01b8152600401610b5493929190613548565b600060405180830381600087803b158015610b6e57600080fd5b505af1158015610b82573d6000803e3d6000fd5b50505050600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110610bda57610bd9613b4e565b5b906000526020600020906002020160010154828281518110610bff57610bfe613b4e565b5b6020026020010181815250508080610c1690613a49565b915050610ad2565b50610c2933826124fd565b42600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550610c7a33836127b4565b50506001600681905550565b60026006541415610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390613759565b60405180910390fd5b6002600681905550610cdc611508565b15610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d13906136d9565b60405180910390fd5b6000610d2733610eed565b90506000610d3433611030565b905060005b8151811015610e8557600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033858581518110610d9557610d94613b4e565b5b60200260200101516040518463ffffffff1660e01b8152600401610dbb93929190613548565b600060405180830381600087803b158015610dd557600080fd5b505af1158015610de9573d6000803e3d6000fd5b50505050600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110610e4157610e40613b4e565b5b906000526020600020906002020160010154828281518110610e6657610e65613b4e565b5b6020026020010181815250508080610e7d90613a49565b915050610d39565b50610e903382612914565b42600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550610ee133836127b4565b50506001600681905550565b600080610ef8612bcb565b905060005b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905081101561102057611000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018381548110610fe457610fe3613b4e565b5b9060005260206000209060020201600001544285600954612c58565b8361100b9190613844565b9250808061101890613a49565b915050610efd565b5050919050565b60006012905090565b60606000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905067ffffffffffffffff81111561109357611092613b7d565b5b6040519080825280602002602001820160405280156110c15781602001602082028036833780820191505090505b50905060005b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490508110156111ac57600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001818154811061116857611167613b4e565b5b90600052602060002090600202016001015482828151811061118d5761118c613b4e565b5b60200260200101818152505080806111a490613a49565b9150506110c7565b5080915050919050565b600260065414156111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390613759565b60405180910390fd5b600260068190555061120c611508565b1561124c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611243906136d9565b60405180910390fd5b600061125733610eed565b905060008111156112b85742600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506112b333826127b4565b6112f3565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90613699565b60405180910390fd5b506001600681905550565b60008061130961201d565b905061139d818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113989190613844565b612025565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806113d9612d93565b905060005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050811015611501576114e1600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000183815481106114c5576114c4613b4e565b5b9060005260206000209060020201600001544285600954612e20565b836114ec9190613844565b925080806114f990613a49565b9150506113de565b5050919050565b6000600760009054906101000a900460ff16905090565b60095481565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115c461201d565b73ffffffffffffffffffffffffffffffffffffffff166115e2611644565b73ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f906136f9565b60405180910390fd5b6116426000612f5b565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461167d90613a17565b80601f01602080910402602001604051908101604052809291908181526020018280546116a990613a17565b80156116f65780601f106116cb576101008083540402835291602001916116f6565b820191906000526020600020905b8154815290600101906020018083116116d957829003601f168201915b5050505050905090565b60606000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905067ffffffffffffffff81111561176357611762613b7d565b5b6040519080825280602002602001820160405280156117915781602001602082028036833780820191505090505b50905060005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905081101561187c57600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001818154811061183857611837613b4e565b5b90600052602060002090600202016001015482828151811061185d5761185c613b4e565b5b602002602001018181525050808061187490613a49565b915050611797565b5080915050919050565b60008061189161201d565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e90613779565b60405180910390fd5b6119648286868403612025565b60019250505092915050565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806119a161201d565b90506119ae81858561227c565b600191505092915050565b600260065414156119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f690613759565b60405180910390fd5b6002600681905550611a0f611508565b15611a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a46906136d9565b60405180910390fd5b6000611a5a336113ce565b90506000811115611abb5742600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550611ab633826127b4565b611af6565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90613699565b60405180910390fd5b506001600681905550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60026006541415611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590613759565b60405180910390fd5b6002600681905550611bde611508565b15611c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c15906136d9565b60405180910390fd5b60005b82829050811015611ec9573373ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858585818110611c9457611c93613b4e565b5b905060200201356040518263ffffffff1660e01b8152600401611cb791906137b9565b60206040518083038186803b158015611ccf57600080fd5b505afa158015611ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0791906130ed565b73ffffffffffffffffffffffffffffffffffffffff1614611d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d54906136b9565b60405180910390fd5b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330868686818110611db057611daf613b4e565b5b905060200201356040518463ffffffff1660e01b8152600401611dd593929190613548565b600060405180830381600087803b158015611def57600080fd5b505af1158015611e03573d6000803e3d6000fd5b50505050600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016040518060400160405280428152602001858585818110611e6d57611e6c613b4e565b5b905060200201358152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508080611ec190613a49565b915050611c21565b5060016006819055505050565b611ede61201d565b73ffffffffffffffffffffffffffffffffffffffff16611efc611644565b73ffffffffffffffffffffffffffffffffffffffff1614611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f49906136f9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb990613619565b60405180910390fd5b611fcb81612f5b565b50565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490509050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90613739565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc90613639565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516121e391906137b9565b60405180910390a3505050565b60006121fc8484611b01565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122765781811015612268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225f90613659565b60405180910390fd5b6122758484848403612025565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e390613719565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561235c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612353906135f9565b60405180910390fd5b612367838383613021565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490613679565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124809190613844565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124e491906137b9565b60405180910390a36124f7848484613026565b50505050565b60005b81518110156127af5760005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905081101561279b57600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106125ad576125ac613b4e565b5b9060005260206000209060020201600101548383815181106125d2576125d1613b4e565b5b6020026020010151141561278857600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016001600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490506126749190613925565b8154811061268557612684613b4e565b5b9060005260206000209060020201600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106126e7576126e6613b4e565b5b90600052602060002090600202016000820154816000015560018201548160010155905050600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180548061275e5761275d613b1f565b5b60019003818190600052602060002090600202016000808201600090556001820160009055505090555b808061279390613a49565b91505061250c565b5080806127a790613a49565b915050612500565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281b90613799565b60405180910390fd5b61283060008383613021565b80600260008282546128429190613844565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128979190613844565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516128fc91906137b9565b60405180910390a361291060008383613026565b5050565b60005b8151811015612bc65760005b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050811015612bb257600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106129c4576129c3613b4e565b5b9060005260206000209060020201600101548383815181106129e9576129e8613b4e565b5b60200260200101511415612b9f57600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016001600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050612a8b9190613925565b81548110612a9c57612a9b613b4e565b5b9060005260206000209060020201600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110612afe57612afd613b4e565b5b90600052602060002090600202016000820154816000015560018201548160010155905050600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480612b7557612b74613b1f565b5b60019003818190600052602060002090600202016000808201600090556001820160009055505090555b8080612baa90613a49565b915050612923565b508080612bbe90613a49565b915050612917565b505050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506005811015612c29576000915050612c55565b600a811015612c3c57600f915050612c55565b6014811015612c4f576019915050612c55565b60239150505b90565b6000806000600190506000808888612c709190613925565b9050888a1015612c7e578899505b8988612c8a9190613925565b91506213c68081101580612c9e5750858911155b15612ca857600292505b6276a7008110612cbb5760649350612d23565b6000600290505b6004811015612d21576000816213c680612cdc91906138cb565b9050600081118015612cee5750828111155b15612d0757600f86612d009190613844565b9550612d0d565b50612d21565b508080612d1990613a49565b915050612cc2565b505b8684612d2f9190613844565b93506201518083681b1ae4d6e2ef50000084612d4b91906138cb565b612d5591906138cb565b612d5f919061389a565b945060648486612d6f91906138cb565b612d79919061389a565b85612d849190613844565b94505050505095945050505050565b600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506005811015612df1576000915050612e1d565b600a811015612e0457600f915050612e1d565b6014811015612e17576019915050612e1d565b60239150505b90565b6000806000600190506000808888612e389190613925565b9050888a1015612e46578899505b8988612e529190613925565b91506213c68081101580612e665750858911155b15612e7057600292505b6276a7008110612e835760649350612eeb565b6000600290505b6004811015612ee9576000816213c680612ea491906138cb565b9050600081118015612eb65750828111155b15612ecf57600f86612ec89190613844565b9550612ed5565b50612ee9565b508080612ee190613a49565b915050612e8a565b505b8684612ef79190613844565b93506201518083681b1ae4d6e2ef50000084612f1391906138cb565b612f1d91906138cb565b612f27919061389a565b945060648486612f3791906138cb565b612f41919061389a565b85612f4c9190613844565b94505050505095945050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b60008135905061303a81613f44565b92915050565b60008151905061304f81613f44565b92915050565b60008083601f84011261306b5761306a613bb1565b5b8235905067ffffffffffffffff81111561308857613087613bac565b5b6020830191508360208202830111156130a4576130a3613bb6565b5b9250929050565b6000813590506130ba81613f5b565b92915050565b6000602082840312156130d6576130d5613bc0565b5b60006130e48482850161302b565b91505092915050565b60006020828403121561310357613102613bc0565b5b600061311184828501613040565b91505092915050565b6000806040838503121561313157613130613bc0565b5b600061313f8582860161302b565b92505060206131508582860161302b565b9150509250929050565b60008060006060848603121561317357613172613bc0565b5b60006131818682870161302b565b93505060206131928682870161302b565b92505060406131a3868287016130ab565b9150509250925092565b600080604083850312156131c4576131c3613bc0565b5b60006131d28582860161302b565b92505060206131e3858286016130ab565b9150509250929050565b6000806020838503121561320457613203613bc0565b5b600083013567ffffffffffffffff81111561322257613221613bbb565b5b61322e85828601613055565b92509250509250929050565b60006132468383613500565b60208301905092915050565b61325b81613959565b82525050565b600061326c826137ff565b6132768185613822565b9350613281836137ef565b8060005b838110156132b2578151613299888261323a565b97506132a483613815565b925050600181019050613285565b5085935050505092915050565b6132c88161396b565b82525050565b6132d7816139ae565b82525050565b60006132e88261380a565b6132f28185613833565b93506133028185602086016139e4565b61330b81613bc5565b840191505092915050565b6000613323602383613833565b915061332e82613bd6565b604082019050919050565b6000613346602683613833565b915061335182613c25565b604082019050919050565b6000613369602283613833565b915061337482613c74565b604082019050919050565b600061338c601d83613833565b915061339782613cc3565b602082019050919050565b60006133af602683613833565b91506133ba82613cec565b604082019050919050565b60006133d2601b83613833565b91506133dd82613d3b565b602082019050919050565b60006133f5602d83613833565b915061340082613d64565b604082019050919050565b6000613418601083613833565b915061342382613db3565b602082019050919050565b600061343b602083613833565b915061344682613ddc565b602082019050919050565b600061345e602583613833565b915061346982613e05565b604082019050919050565b6000613481602483613833565b915061348c82613e54565b604082019050919050565b60006134a4601f83613833565b91506134af82613ea3565b602082019050919050565b60006134c7602583613833565b91506134d282613ecc565b604082019050919050565b60006134ea601f83613833565b91506134f582613f1b565b602082019050919050565b61350981613997565b82525050565b61351881613997565b82525050565b613527816139a1565b82525050565b60006020820190506135426000830184613252565b92915050565b600060608201905061355d6000830186613252565b61356a6020830185613252565b613577604083018461350f565b949350505050565b600060208201905081810360008301526135998184613261565b905092915050565b60006020820190506135b660008301846132bf565b92915050565b60006020820190506135d160008301846132ce565b92915050565b600060208201905081810360008301526135f181846132dd565b905092915050565b6000602082019050818103600083015261361281613316565b9050919050565b6000602082019050818103600083015261363281613339565b9050919050565b600060208201905081810360008301526136528161335c565b9050919050565b600060208201905081810360008301526136728161337f565b9050919050565b60006020820190508181036000830152613692816133a2565b9050919050565b600060208201905081810360008301526136b2816133c5565b9050919050565b600060208201905081810360008301526136d2816133e8565b9050919050565b600060208201905081810360008301526136f28161340b565b9050919050565b600060208201905081810360008301526137128161342e565b9050919050565b6000602082019050818103600083015261373281613451565b9050919050565b6000602082019050818103600083015261375281613474565b9050919050565b6000602082019050818103600083015261377281613497565b9050919050565b60006020820190508181036000830152613792816134ba565b9050919050565b600060208201905081810360008301526137b2816134dd565b9050919050565b60006020820190506137ce600083018461350f565b92915050565b60006020820190506137e9600083018461351e565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061384f82613997565b915061385a83613997565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561388f5761388e613a92565b5b828201905092915050565b60006138a582613997565b91506138b083613997565b9250826138c0576138bf613ac1565b5b828204905092915050565b60006138d682613997565b91506138e183613997565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561391a57613919613a92565b5b828202905092915050565b600061393082613997565b915061393b83613997565b92508282101561394e5761394d613a92565b5b828203905092915050565b600061396482613977565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006139b9826139c0565b9050919050565b60006139cb826139d2565b9050919050565b60006139dd82613977565b9050919050565b60005b83811015613a025780820151818401526020810190506139e7565b83811115613a11576000848401525b50505050565b60006002820490506001821680613a2f57607f821691505b60208210811415613a4357613a42613af0565b5b50919050565b6000613a5482613997565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a8757613a86613a92565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206e656374617220746f20636c61696d2e0000000000600082015250565b7f4174206c65617374206f6e65204865617468656e204e4654206973206e6f742060008201527f6f776e656420627920796f752e00000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613f4d81613959565b8114613f5857600080fd5b50565b613f6481613997565b8114613f6f57600080fd5b5056fea264697066735822122034c715f2f89ac53df42736ac798a006b26c6bda60f225644b98c0b0cbd0de7fd64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063634de66811610104578063a457c2d7116100a2578063dd62ed3e11610071578063dd62ed3e1461054b578063e81bbbd41461057b578063f2fde38b14610597578063fd7145b6146105b3576101da565b8063a457c2d7146104c3578063a87bce88146104f3578063a9059cbb14610511578063bc499cb914610541576101da565b8063715018a6116100de578063715018a61461044d5780638da5cb5b1461045757806395d89b41146104755780639ae8965914610493576101da565b8063634de668146103cf5780636ee77ec0146103ed57806370a082311461041d576101da565b806328b70db11161017c578063395093511161014b57806339509351146103335780633dc46adf146103635780634c9a2042146103815780635c975abb146103b1576101da565b806328b70db1146102ab578063313ce567146102db578063357f59b0146102f9578063372500ab14610329576101da565b806320a57d19116101b857806320a57d191461024b57806323b872dd1461026757806325720cd714610297578063287034b7146102a1576101da565b806306fdde03146101df578063095ea7b3146101fd57806318160ddd1461022d575b600080fd5b6101e76105e3565b6040516101f491906135d7565b60405180910390f35b610217600480360381019061021291906131ad565b610675565b60405161022491906135a1565b60405180910390f35b610235610698565b60405161024291906137b9565b60405180910390f35b610265600480360381019061026091906131ed565b6106a2565b005b610281600480360381019061027c919061315a565b6109f0565b60405161028e91906135a1565b60405180910390f35b61029f610a1f565b005b6102a9610c86565b005b6102c560048036038101906102c091906130c0565b610eed565b6040516102d291906137b9565b60405180910390f35b6102e3611027565b6040516102f091906137d4565b60405180910390f35b610313600480360381019061030e91906130c0565b611030565b604051610320919061357f565b60405180910390f35b6103316111b6565b005b61034d600480360381019061034891906131ad565b6112fe565b60405161035a91906135a1565b60405180910390f35b61036b6113a8565b60405161037891906135bc565b60405180910390f35b61039b600480360381019061039691906130c0565b6113ce565b6040516103a891906137b9565b60405180910390f35b6103b9611508565b6040516103c691906135a1565b60405180910390f35b6103d761151f565b6040516103e491906137b9565b60405180910390f35b610407600480360381019061040291906130c0565b611525565b60405161041491906137b9565b60405180910390f35b610437600480360381019061043291906130c0565b611574565b60405161044491906137b9565b60405180910390f35b6104556115bc565b005b61045f611644565b60405161046c919061352d565b60405180910390f35b61047d61166e565b60405161048a91906135d7565b60405180910390f35b6104ad60048036038101906104a891906130c0565b611700565b6040516104ba919061357f565b60405180910390f35b6104dd60048036038101906104d891906131ad565b611886565b6040516104ea91906135a1565b60405180910390f35b6104fb611970565b60405161050891906135bc565b60405180910390f35b61052b600480360381019061052691906131ad565b611996565b60405161053891906135a1565b60405180910390f35b6105496119b9565b005b6105656004803603810190610560919061311a565b611b01565b60405161057291906137b9565b60405180910390f35b610595600480360381019061059091906131ed565b611b88565b005b6105b160048036038101906105ac91906130c0565b611ed6565b005b6105cd60048036038101906105c891906130c0565b611fce565b6040516105da91906137b9565b60405180910390f35b6060600380546105f290613a17565b80601f016020809104026020016040519081016040528092919081815260200182805461061e90613a17565b801561066b5780601f106106405761010080835404028352916020019161066b565b820191906000526020600020905b81548152906001019060200180831161064e57829003601f168201915b5050505050905090565b60008061068061201d565b905061068d818585612025565b600191505092915050565b6000600254905090565b600260065414156106e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106df90613759565b60405180910390fd5b60026006819055506106f8611508565b15610738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072f906136d9565b60405180910390fd5b60005b828290508110156109e3573373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8585858181106107ae576107ad613b4e565b5b905060200201356040518263ffffffff1660e01b81526004016107d191906137b9565b60206040518083038186803b1580156107e957600080fd5b505afa1580156107fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082191906130ed565b73ffffffffffffffffffffffffffffffffffffffff1614610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e906136b9565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308686868181106108ca576108c9613b4e565b5b905060200201356040518463ffffffff1660e01b81526004016108ef93929190613548565b600060405180830381600087803b15801561090957600080fd5b505af115801561091d573d6000803e3d6000fd5b50505050600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001604051806040016040528042815260200185858581811061098757610986613b4e565b5b9050602002013581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505080806109db90613a49565b91505061073b565b5060016006819055505050565b6000806109fb61201d565b9050610a088582856121f0565b610a1385858561227c565b60019150509392505050565b60026006541415610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c90613759565b60405180910390fd5b6002600681905550610a75611508565b15610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac906136d9565b60405180910390fd5b6000610ac0336113ce565b90506000610acd33611700565b905060005b8151811015610c1e57600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033858581518110610b2e57610b2d613b4e565b5b60200260200101516040518463ffffffff1660e01b8152600401610b5493929190613548565b600060405180830381600087803b158015610b6e57600080fd5b505af1158015610b82573d6000803e3d6000fd5b50505050600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110610bda57610bd9613b4e565b5b906000526020600020906002020160010154828281518110610bff57610bfe613b4e565b5b6020026020010181815250508080610c1690613a49565b915050610ad2565b50610c2933826124fd565b42600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550610c7a33836127b4565b50506001600681905550565b60026006541415610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390613759565b60405180910390fd5b6002600681905550610cdc611508565b15610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d13906136d9565b60405180910390fd5b6000610d2733610eed565b90506000610d3433611030565b905060005b8151811015610e8557600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033858581518110610d9557610d94613b4e565b5b60200260200101516040518463ffffffff1660e01b8152600401610dbb93929190613548565b600060405180830381600087803b158015610dd557600080fd5b505af1158015610de9573d6000803e3d6000fd5b50505050600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110610e4157610e40613b4e565b5b906000526020600020906002020160010154828281518110610e6657610e65613b4e565b5b6020026020010181815250508080610e7d90613a49565b915050610d39565b50610e903382612914565b42600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550610ee133836127b4565b50506001600681905550565b600080610ef8612bcb565b905060005b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905081101561102057611000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018381548110610fe457610fe3613b4e565b5b9060005260206000209060020201600001544285600954612c58565b8361100b9190613844565b9250808061101890613a49565b915050610efd565b5050919050565b60006012905090565b60606000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905067ffffffffffffffff81111561109357611092613b7d565b5b6040519080825280602002602001820160405280156110c15781602001602082028036833780820191505090505b50905060005b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490508110156111ac57600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001818154811061116857611167613b4e565b5b90600052602060002090600202016001015482828151811061118d5761118c613b4e565b5b60200260200101818152505080806111a490613a49565b9150506110c7565b5080915050919050565b600260065414156111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390613759565b60405180910390fd5b600260068190555061120c611508565b1561124c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611243906136d9565b60405180910390fd5b600061125733610eed565b905060008111156112b85742600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506112b333826127b4565b6112f3565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90613699565b60405180910390fd5b506001600681905550565b60008061130961201d565b905061139d818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113989190613844565b612025565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806113d9612d93565b905060005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050811015611501576114e1600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000183815481106114c5576114c4613b4e565b5b9060005260206000209060020201600001544285600954612e20565b836114ec9190613844565b925080806114f990613a49565b9150506113de565b5050919050565b6000600760009054906101000a900460ff16905090565b60095481565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115c461201d565b73ffffffffffffffffffffffffffffffffffffffff166115e2611644565b73ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f906136f9565b60405180910390fd5b6116426000612f5b565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461167d90613a17565b80601f01602080910402602001604051908101604052809291908181526020018280546116a990613a17565b80156116f65780601f106116cb576101008083540402835291602001916116f6565b820191906000526020600020905b8154815290600101906020018083116116d957829003601f168201915b5050505050905090565b60606000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905067ffffffffffffffff81111561176357611762613b7d565b5b6040519080825280602002602001820160405280156117915781602001602082028036833780820191505090505b50905060005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905081101561187c57600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001818154811061183857611837613b4e565b5b90600052602060002090600202016001015482828151811061185d5761185c613b4e565b5b602002602001018181525050808061187490613a49565b915050611797565b5080915050919050565b60008061189161201d565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194e90613779565b60405180910390fd5b6119648286868403612025565b60019250505092915050565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806119a161201d565b90506119ae81858561227c565b600191505092915050565b600260065414156119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f690613759565b60405180910390fd5b6002600681905550611a0f611508565b15611a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a46906136d9565b60405180910390fd5b6000611a5a336113ce565b90506000811115611abb5742600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550611ab633826127b4565b611af6565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90613699565b60405180910390fd5b506001600681905550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60026006541415611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc590613759565b60405180910390fd5b6002600681905550611bde611508565b15611c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c15906136d9565b60405180910390fd5b60005b82829050811015611ec9573373ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858585818110611c9457611c93613b4e565b5b905060200201356040518263ffffffff1660e01b8152600401611cb791906137b9565b60206040518083038186803b158015611ccf57600080fd5b505afa158015611ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0791906130ed565b73ffffffffffffffffffffffffffffffffffffffff1614611d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d54906136b9565b60405180910390fd5b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330868686818110611db057611daf613b4e565b5b905060200201356040518463ffffffff1660e01b8152600401611dd593929190613548565b600060405180830381600087803b158015611def57600080fd5b505af1158015611e03573d6000803e3d6000fd5b50505050600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016040518060400160405280428152602001858585818110611e6d57611e6c613b4e565b5b905060200201358152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508080611ec190613a49565b915050611c21565b5060016006819055505050565b611ede61201d565b73ffffffffffffffffffffffffffffffffffffffff16611efc611644565b73ffffffffffffffffffffffffffffffffffffffff1614611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f49906136f9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb990613619565b60405180910390fd5b611fcb81612f5b565b50565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490509050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90613739565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc90613639565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516121e391906137b9565b60405180910390a3505050565b60006121fc8484611b01565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122765781811015612268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225f90613659565b60405180910390fd5b6122758484848403612025565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e390613719565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561235c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612353906135f9565b60405180910390fd5b612367838383613021565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490613679565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124809190613844565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124e491906137b9565b60405180910390a36124f7848484613026565b50505050565b60005b81518110156127af5760005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905081101561279b57600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106125ad576125ac613b4e565b5b9060005260206000209060020201600101548383815181106125d2576125d1613b4e565b5b6020026020010151141561278857600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016001600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490506126749190613925565b8154811061268557612684613b4e565b5b9060005260206000209060020201600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106126e7576126e6613b4e565b5b90600052602060002090600202016000820154816000015560018201548160010155905050600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180548061275e5761275d613b1f565b5b60019003818190600052602060002090600202016000808201600090556001820160009055505090555b808061279390613a49565b91505061250c565b5080806127a790613a49565b915050612500565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281b90613799565b60405180910390fd5b61283060008383613021565b80600260008282546128429190613844565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128979190613844565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516128fc91906137b9565b60405180910390a361291060008383613026565b5050565b60005b8151811015612bc65760005b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050811015612bb257600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106129c4576129c3613b4e565b5b9060005260206000209060020201600101548383815181106129e9576129e8613b4e565b5b60200260200101511415612b9f57600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016001600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050612a8b9190613925565b81548110612a9c57612a9b613b4e565b5b9060005260206000209060020201600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110612afe57612afd613b4e565b5b90600052602060002090600202016000820154816000015560018201548160010155905050600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480612b7557612b74613b1f565b5b60019003818190600052602060002090600202016000808201600090556001820160009055505090555b8080612baa90613a49565b915050612923565b508080612bbe90613a49565b915050612917565b505050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506005811015612c29576000915050612c55565b600a811015612c3c57600f915050612c55565b6014811015612c4f576019915050612c55565b60239150505b90565b6000806000600190506000808888612c709190613925565b9050888a1015612c7e578899505b8988612c8a9190613925565b91506213c68081101580612c9e5750858911155b15612ca857600292505b6276a7008110612cbb5760649350612d23565b6000600290505b6004811015612d21576000816213c680612cdc91906138cb565b9050600081118015612cee5750828111155b15612d0757600f86612d009190613844565b9550612d0d565b50612d21565b508080612d1990613a49565b915050612cc2565b505b8684612d2f9190613844565b93506201518083681b1ae4d6e2ef50000084612d4b91906138cb565b612d5591906138cb565b612d5f919061389a565b945060648486612d6f91906138cb565b612d79919061389a565b85612d849190613844565b94505050505095945050505050565b600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506005811015612df1576000915050612e1d565b600a811015612e0457600f915050612e1d565b6014811015612e17576019915050612e1d565b60239150505b90565b6000806000600190506000808888612e389190613925565b9050888a1015612e46578899505b8988612e529190613925565b91506213c68081101580612e665750858911155b15612e7057600292505b6276a7008110612e835760649350612eeb565b6000600290505b6004811015612ee9576000816213c680612ea491906138cb565b9050600081118015612eb65750828111155b15612ecf57600f86612ec89190613844565b9550612ed5565b50612ee9565b508080612ee190613a49565b915050612e8a565b505b8684612ef79190613844565b93506201518083681b1ae4d6e2ef50000084612f1391906138cb565b612f1d91906138cb565b612f27919061389a565b945060648486612f3791906138cb565b612f41919061389a565b85612f4c9190613844565b94505050505095945050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b60008135905061303a81613f44565b92915050565b60008151905061304f81613f44565b92915050565b60008083601f84011261306b5761306a613bb1565b5b8235905067ffffffffffffffff81111561308857613087613bac565b5b6020830191508360208202830111156130a4576130a3613bb6565b5b9250929050565b6000813590506130ba81613f5b565b92915050565b6000602082840312156130d6576130d5613bc0565b5b60006130e48482850161302b565b91505092915050565b60006020828403121561310357613102613bc0565b5b600061311184828501613040565b91505092915050565b6000806040838503121561313157613130613bc0565b5b600061313f8582860161302b565b92505060206131508582860161302b565b9150509250929050565b60008060006060848603121561317357613172613bc0565b5b60006131818682870161302b565b93505060206131928682870161302b565b92505060406131a3868287016130ab565b9150509250925092565b600080604083850312156131c4576131c3613bc0565b5b60006131d28582860161302b565b92505060206131e3858286016130ab565b9150509250929050565b6000806020838503121561320457613203613bc0565b5b600083013567ffffffffffffffff81111561322257613221613bbb565b5b61322e85828601613055565b92509250509250929050565b60006132468383613500565b60208301905092915050565b61325b81613959565b82525050565b600061326c826137ff565b6132768185613822565b9350613281836137ef565b8060005b838110156132b2578151613299888261323a565b97506132a483613815565b925050600181019050613285565b5085935050505092915050565b6132c88161396b565b82525050565b6132d7816139ae565b82525050565b60006132e88261380a565b6132f28185613833565b93506133028185602086016139e4565b61330b81613bc5565b840191505092915050565b6000613323602383613833565b915061332e82613bd6565b604082019050919050565b6000613346602683613833565b915061335182613c25565b604082019050919050565b6000613369602283613833565b915061337482613c74565b604082019050919050565b600061338c601d83613833565b915061339782613cc3565b602082019050919050565b60006133af602683613833565b91506133ba82613cec565b604082019050919050565b60006133d2601b83613833565b91506133dd82613d3b565b602082019050919050565b60006133f5602d83613833565b915061340082613d64565b604082019050919050565b6000613418601083613833565b915061342382613db3565b602082019050919050565b600061343b602083613833565b915061344682613ddc565b602082019050919050565b600061345e602583613833565b915061346982613e05565b604082019050919050565b6000613481602483613833565b915061348c82613e54565b604082019050919050565b60006134a4601f83613833565b91506134af82613ea3565b602082019050919050565b60006134c7602583613833565b91506134d282613ecc565b604082019050919050565b60006134ea601f83613833565b91506134f582613f1b565b602082019050919050565b61350981613997565b82525050565b61351881613997565b82525050565b613527816139a1565b82525050565b60006020820190506135426000830184613252565b92915050565b600060608201905061355d6000830186613252565b61356a6020830185613252565b613577604083018461350f565b949350505050565b600060208201905081810360008301526135998184613261565b905092915050565b60006020820190506135b660008301846132bf565b92915050565b60006020820190506135d160008301846132ce565b92915050565b600060208201905081810360008301526135f181846132dd565b905092915050565b6000602082019050818103600083015261361281613316565b9050919050565b6000602082019050818103600083015261363281613339565b9050919050565b600060208201905081810360008301526136528161335c565b9050919050565b600060208201905081810360008301526136728161337f565b9050919050565b60006020820190508181036000830152613692816133a2565b9050919050565b600060208201905081810360008301526136b2816133c5565b9050919050565b600060208201905081810360008301526136d2816133e8565b9050919050565b600060208201905081810360008301526136f28161340b565b9050919050565b600060208201905081810360008301526137128161342e565b9050919050565b6000602082019050818103600083015261373281613451565b9050919050565b6000602082019050818103600083015261375281613474565b9050919050565b6000602082019050818103600083015261377281613497565b9050919050565b60006020820190508181036000830152613792816134ba565b9050919050565b600060208201905081810360008301526137b2816134dd565b9050919050565b60006020820190506137ce600083018461350f565b92915050565b60006020820190506137e9600083018461351e565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061384f82613997565b915061385a83613997565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561388f5761388e613a92565b5b828201905092915050565b60006138a582613997565b91506138b083613997565b9250826138c0576138bf613ac1565b5b828204905092915050565b60006138d682613997565b91506138e183613997565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561391a57613919613a92565b5b828202905092915050565b600061393082613997565b915061393b83613997565b92508282101561394e5761394d613a92565b5b828203905092915050565b600061396482613977565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006139b9826139c0565b9050919050565b60006139cb826139d2565b9050919050565b60006139dd82613977565b9050919050565b60005b83811015613a025780820151818401526020810190506139e7565b83811115613a11576000848401525b50505050565b60006002820490506001821680613a2f57607f821691505b60208210811415613a4357613a42613af0565b5b50919050565b6000613a5482613997565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a8757613a86613a92565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206e656374617220746f20636c61696d2e0000000000600082015250565b7f4174206c65617374206f6e65204865617468656e204e4654206973206e6f742060008201527f6f776e656420627920796f752e00000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613f4d81613959565b8114613f5857600080fd5b50565b613f6481613997565b8114613f6f57600080fd5b5056fea264697066735822122034c715f2f89ac53df42736ac798a006b26c6bda60f225644b98c0b0cbd0de7fd64736f6c63430008070033
Deployed Bytecode Sourcemap
44681:10808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33783:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36134:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34903:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46306:498;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36915:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50393:627;;;:::i;:::-;;49790:595;;;:::i;:::-;;51050:523;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34745:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46838:348;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49061:336;;;:::i;:::-;;37619:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44882:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51581:555;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20314:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44924:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47724:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35074:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23213:103;;;:::i;:::-;;22562:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34002:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47194:376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38362:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44846:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35407:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49405:360;;;:::i;:::-;;35663:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45824:474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23471:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47578:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33783:100;33837:13;33870:5;33863:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33783:100;:::o;36134:201::-;36217:4;36234:13;36250:12;:10;:12::i;:::-;36234:28;;36273:32;36282:5;36289:7;36298:6;36273:8;:32::i;:::-;36323:4;36316:11;;;36134:201;;;;:::o;34903:108::-;34964:7;34991:12;;34984:19;;34903:108;:::o;46306:498::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;20640:8:::1;:6;:8::i;:::-;20639:9;20631:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;46413:9:::2;46409:388;46430:9;;:16;;46426:1;:20;46409:388;;;46528:10;46475:63;;46482:19;;;;;;;;;;;46475:35;;;46511:9;;46521:1;46511:12;;;;;;;:::i;:::-;;;;;;;;46475:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;;46467:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;46610:19;;;;;;;;;;;46603:40;;;46644:10;46664:4;46671:9;;46681:1;46671:12;;;;;;;:::i;:::-;;;;;;;;46603:81;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;46699:11;:23;46711:10;46699:23;;;;;;;;;;;;;;;:36;;46741:43;;;;;;;;46754:15;46741:43;;;;46771:9;;46781:1;46771:12;;;;;;;:::i;:::-;;;;;;;;46741:43;;::::0;46699:86:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46448:3;;;;;:::i;:::-;;;;46409:388;;;;1768:1:::0;2722:7;:22;;;;46306:498;;:::o;36915:295::-;37046:4;37063:15;37081:12;:10;:12::i;:::-;37063:30;;37104:38;37120:4;37126:7;37135:6;37104:15;:38::i;:::-;37153:27;37163:4;37169:2;37173:6;37153:9;:27::i;:::-;37198:4;37191:11;;;36915:295;;;;;:::o;50393:627::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;20640:8:::1;:6;:8::i;:::-;20639:9;20631:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;50473:21:::2;50497:38;50524:10;50497:26;:38::i;:::-;50473:62;;50546:25;50574:32;50595:10;50574:20;:32::i;:::-;50546:60;;50621:9;50617:227;50640:8;:15;50636:1;:19;50617:227;;;50683:19;;;;;;;;;;;50676:40;;;50725:4;50732:10;50744:8;50753:1;50744:11;;;;;;;;:::i;:::-;;;;;;;;50676:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;50785:11;:23;50797:10;50785:23;;;;;;;;;;;;;;;:36;;50822:1;50785:39;;;;;;;;:::i;:::-;;;;;;;;;;;;:47;;;50771:8;50780:1;50771:11;;;;;;;;:::i;:::-;;;;;;;:61;;;::::0;::::2;50657:3;;;;;:::i;:::-;;;;50617:227;;;;50854:53;50886:10;50898:8;50854:31;:53::i;:::-;50954:15;50918:11;:23;50930:10;50918:23;;;;;;;;;;;;;;;:33;;:51;;;;50980:32;50986:10;50998:13;50980:5;:32::i;:::-;50462:558;;1768:1:::0;2722:7;:22;;;;50393:627::o;49790:595::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;20640:8:::1;:6;:8::i;:::-;20639:9;20631:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;49866:21:::2;49890:34;49913:10;49890:22;:34::i;:::-;49866:58;;49935:25;49963:28;49980:10;49963:16;:28::i;:::-;49935:56;;50006:9;50002:215;50025:8;:15;50021:1;:19;50002:215;;;50068:15;;;;;;;;;;;50061:36;;;50106:4;50113:10;50125:8;50134:1;50125:11;;;;;;;;:::i;:::-;;;;;;;;50061:76;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;50166:7;:19;50174:10;50166:19;;;;;;;;;;;;;;;:28;;50195:1;50166:31;;;;;;;;:::i;:::-;;;;;;;;;;;;:39;;;50152:8;50161:1;50152:11;;;;;;;;:::i;:::-;;;;;;;:53;;;::::0;::::2;50042:3;;;;;:::i;:::-;;;;50002:215;;;;50227:49;50255:10;50267:8;50227:27;:49::i;:::-;50319:15;50287:7;:19;50295:10;50287:19;;;;;;;;;;;;;;;:29;;:47;;;;50345:32;50351:10;50363:13;50345:5;:32::i;:::-;49855:530;;1768:1:::0;2722:7;:22;;;;49790:595::o;51050:523::-;51119:20;51151;51174:14;:12;:14::i;:::-;51151:37;;51203:9;51199:367;51222:7;:16;51230:7;51222:16;;;;;;;;;;;;;;;:25;;:32;;;;51218:1;:36;51199:367;;;51305:249;51347:7;:16;51355:7;51347:16;;;;;;;;;;;;;;;:26;;;51392:7;:16;51400:7;51392:16;;;;;;;;;;;;;;;:25;;51418:1;51392:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:44;;;51455:15;51489:12;51520:19;;51305:23;:249::i;:::-;51290:12;:264;;;;:::i;:::-;51275:279;;51256:3;;;;;:::i;:::-;;;;51199:367;;;;51140:433;51050:523;;;:::o;34745:93::-;34803:5;34828:2;34821:9;;34745:93;:::o;46838:348::-;46901:16;46929:25;46971:7;:16;46979:7;46971:16;;;;;;;;;;;;;;;:25;;:32;;;;46957:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46929:75;;47019:9;47015:138;47038:7;:16;47046:7;47038:16;;;;;;;;;;;;;;;:25;;:32;;;;47034:1;:36;47015:138;;;47105:7;:16;47113:7;47105:16;;;;;;;;;;;;;;;:25;;47131:1;47105:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;47091:8;47100:1;47091:11;;;;;;;;:::i;:::-;;;;;;;:50;;;;;47072:3;;;;;:::i;:::-;;;;47015:138;;;;47170:8;47163:15;;;46838:348;;;:::o;49061:336::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;20640:8:::1;:6;:8::i;:::-;20639:9;20631:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;49132:14:::2;49149:34;49172:10;49149:22;:34::i;:::-;49132:51;;49206:1;49197:6;:10;49194:196;;;49255:15;49223:7;:19;49231:10;49223:19;;;;;;;;;;;;;;;:29;;:47;;;;49285:25;49291:10;49303:6;49285:5;:25::i;:::-;49194:196;;;49341:37;;;;;;;;;;:::i;:::-;;;;;;;;49194:196;49121:276;1768:1:::0;2722:7;:22;;;;49061:336::o;37619:240::-;37707:4;37724:13;37740:12;:10;:12::i;:::-;37724:28;;37763:66;37772:5;37779:7;37818:10;37788:11;:18;37800:5;37788:18;;;;;;;;;;;;;;;:27;37807:7;37788:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;37763:8;:66::i;:::-;37847:4;37840:11;;;37619:240;;;;:::o;44882:33::-;;;;;;;;;;;;;:::o;51581:555::-;51654:20;51686;51709:18;:16;:18::i;:::-;51686:41;;51742:9;51738:391;51761:11;:20;51773:7;51761:20;;;;;;;;;;;;;;;:33;;:40;;;;51757:1;:44;51738:391;;;51852:265;51898:11;:20;51910:7;51898:20;;;;;;;;;;;;;;;:30;;;51947:11;:20;51959:7;51947:20;;;;;;;;;;;;;;;:33;;51981:1;51947:36;;;;;;;;:::i;:::-;;;;;;;;;;;;:52;;;52018:15;52052:12;52083:19;;51852:27;:265::i;:::-;51837:12;:280;;;;:::i;:::-;51822:295;;51803:3;;;;;:::i;:::-;;;;51738:391;;;;51675:461;51581:555;;;:::o;20314:86::-;20361:4;20385:7;;;;;;;;;;;20378:14;;20314:86;:::o;44924:34::-;;;;:::o;47724:150::-;47800:7;47826:11;:20;47838:7;47826:20;;;;;;;;;;;;;;;:33;;:40;;;;47819:47;;47724:150;;;:::o;35074:127::-;35148:7;35175:9;:18;35185:7;35175:18;;;;;;;;;;;;;;;;35168:25;;35074:127;;;:::o;23213:103::-;22793:12;:10;:12::i;:::-;22782:23;;:7;:5;:7::i;:::-;:23;;;22774:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23278:30:::1;23305:1;23278:18;:30::i;:::-;23213:103::o:0;22562:87::-;22608:7;22635:6;;;;;;;;;;;22628:13;;22562:87;:::o;34002:104::-;34058:13;34091:7;34084:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34002:104;:::o;47194:376::-;47261:16;47289:25;47331:11;:20;47343:7;47331:20;;;;;;;;;;;;;;;:33;;:40;;;;47317:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47289:83;;47387:9;47383:154;47406:11;:20;47418:7;47406:20;;;;;;;;;;;;;;;:33;;:40;;;;47402:1;:44;47383:154;;;47481:11;:20;47493:7;47481:20;;;;;;;;;;;;;;;:33;;47515:1;47481:36;;;;;;;;:::i;:::-;;;;;;;;;;;;:44;;;47467:8;47476:1;47467:11;;;;;;;;:::i;:::-;;;;;;;:58;;;;;47448:3;;;;;:::i;:::-;;;;47383:154;;;;47554:8;47547:15;;;47194:376;;;:::o;38362:438::-;38455:4;38472:13;38488:12;:10;:12::i;:::-;38472:28;;38511:24;38538:11;:18;38550:5;38538:18;;;;;;;;;;;;;;;:27;38557:7;38538:27;;;;;;;;;;;;;;;;38511:54;;38604:15;38584:16;:35;;38576:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38697:60;38706:5;38713:7;38741:15;38722:16;:34;38697:8;:60::i;:::-;38788:4;38781:11;;;;38362:438;;;;:::o;44846:29::-;;;;;;;;;;;;;:::o;35407:193::-;35486:4;35503:13;35519:12;:10;:12::i;:::-;35503:28;;35542;35552:5;35559:2;35563:6;35542:9;:28::i;:::-;35588:4;35581:11;;;35407:193;;;;:::o;49405:360::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;20640:8:::1;:6;:8::i;:::-;20639:9;20631:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;49480:18:::2;49501:38;49528:10;49501:26;:38::i;:::-;49480:59;;49566:1;49553:10;:14;49550:208;;;49619:15;49583:11;:23;49595:10;49583:23;;;;;;;;;;;;;;;:33;;:51;;;;49649:29;49655:10;49667;49649:5;:29::i;:::-;49550:208;;;49709:37;;;;;;;;;;:::i;:::-;;;;;;;;49550:208;49469:296;1768:1:::0;2722:7;:22;;;;49405:360::o;35663:151::-;35752:7;35779:11;:18;35791:5;35779:18;;;;;;;;;;;;;;;:27;35798:7;35779:27;;;;;;;;;;;;;;;;35772:34;;35663:151;;;;:::o;45824:474::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;20640:8:::1;:6;:8::i;:::-;20639:9;20631:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45927:9:::2;45923:368;45944:9;;:16;;45940:1;:20;45923:368;;;46038:10;45989:59;;45996:15;;;;;;;;;;;45989:31;;;46021:9;;46031:1;46021:12;;;;;;;:::i;:::-;;;;;;;;45989:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;45981:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;46120:15;;;;;;;;;;;46113:36;;;46150:10;46170:4;46177:9;;46187:1;46177:12;;;;;;;:::i;:::-;;;;;;;;46113:77;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;46205:7;:19;46213:10;46205:19;;;;;;;;;;;;;;;:28;;46239:39;;;;;;;;46248:15;46239:39;;;;46265:9;;46275:1;46265:12;;;;;;;:::i;:::-;;;;;;;;46239:39;;::::0;46205:74:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45962:3;;;;;:::i;:::-;;;;45923:368;;;;1768:1:::0;2722:7;:22;;;;45824:474;;:::o;23471:201::-;22793:12;:10;:12::i;:::-;22782:23;;:7;:5;:7::i;:::-;:23;;;22774:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23580:1:::1;23560:22;;:8;:22;;;;23552:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23636:28;23655:8;23636:18;:28::i;:::-;23471:201:::0;:::o;47578:138::-;47650:7;47676;:16;47684:7;47676:16;;;;;;;;;;;;;;;:25;;:32;;;;47669:39;;47578:138;;;:::o;18968:98::-;19021:7;19048:10;19041:17;;18968:98;:::o;41998:380::-;42151:1;42134:19;;:5;:19;;;;42126:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42232:1;42213:21;;:7;:21;;;;42205:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42316:6;42286:11;:18;42298:5;42286:18;;;;;;;;;;;;;;;:27;42305:7;42286:27;;;;;;;;;;;;;;;:36;;;;42354:7;42338:32;;42347:5;42338:32;;;42363:6;42338:32;;;;;;:::i;:::-;;;;;;;;41998:380;;;:::o;42665:453::-;42800:24;42827:25;42837:5;42844:7;42827:9;:25::i;:::-;42800:52;;42887:17;42867:16;:37;42863:248;;42949:6;42929:16;:26;;42921:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43033:51;43042:5;43049:7;43077:6;43058:16;:25;43033:8;:51::i;:::-;42863:248;42789:329;42665:453;;;:::o;39279:671::-;39426:1;39410:18;;:4;:18;;;;39402:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39503:1;39489:16;;:2;:16;;;;39481:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;39558:38;39579:4;39585:2;39589:6;39558:20;:38::i;:::-;39609:19;39631:9;:15;39641:4;39631:15;;;;;;;;;;;;;;;;39609:37;;39680:6;39665:11;:21;;39657:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;39797:6;39783:11;:20;39765:9;:15;39775:4;39765:15;;;;;;;;;;;;;;;:38;;;;39842:6;39825:9;:13;39835:2;39825:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;39881:2;39866:26;;39875:4;39866:26;;;39885:6;39866:26;;;;;;:::i;:::-;;;;;;;;39905:37;39925:4;39931:2;39935:6;39905:19;:37::i;:::-;39391:559;39279:671;;;:::o;48451:574::-;48561:9;48557:461;48580:9;:16;48576:1;:20;48557:461;;;48621:9;48617:390;48640:11;:20;48652:7;48640:20;;;;;;;;;;;;;;;:33;;:40;;;;48636:1;:44;48617:390;;;48724:11;:20;48736:7;48724:20;;;;;;;;;;;;;;;:33;;48758:1;48724:36;;;;;;;;:::i;:::-;;;;;;;;;;;;:44;;;48708:9;48718:1;48708:12;;;;;;;;:::i;:::-;;;;;;;;:60;48705:287;;;48831:11;:20;48843:7;48831:20;;;;;;;;;;;;;;;:33;;48908:1;48865:11;:20;48877:7;48865:20;;;;;;;;;;;;;;;:33;;:40;;;;:44;;;;:::i;:::-;48831:79;;;;;;;;:::i;:::-;;;;;;;;;;;;48792:11;:20;48804:7;48792:20;;;;;;;;;;;;;;;:33;;48826:1;48792:36;;;;;;;;:::i;:::-;;;;;;;;;;;;:118;;;;;;;;;;;;;;;;;;;48933:11;:20;48945:7;48933:20;;;;;;;;;;;;;;;:33;;:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48705:287;48682:3;;;;;:::i;:::-;;;;48617:390;;;;48598:3;;;;;:::i;:::-;;;;48557:461;;;;48451:574;;:::o;40237:399::-;40340:1;40321:21;;:7;:21;;;;40313:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40391:49;40420:1;40424:7;40433:6;40391:20;:49::i;:::-;40469:6;40453:12;;:22;;;;;;;:::i;:::-;;;;;;;;40508:6;40486:9;:18;40496:7;40486:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;40551:7;40530:37;;40547:1;40530:37;;;40560:6;40530:37;;;;;;:::i;:::-;;;;;;;;40580:48;40608:1;40612:7;40621:6;40580:19;:48::i;:::-;40237:399;;:::o;47921:522::-;48027:9;48023:413;48046:9;:16;48042:1;:20;48023:413;;;48087:9;48083:342;48106:7;:16;48114:7;48106:16;;;;;;;;;;;;;;;:25;;:32;;;;48102:1;:36;48083:342;;;48182:7;:16;48190:7;48182:16;;;;;;;;;;;;;;;:25;;48208:1;48182:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;48166:9;48176:1;48166:12;;;;;;;;:::i;:::-;;;;;;;;:52;48163:247;;;48273:7;:16;48281:7;48273:16;;;;;;;;;;;;;;;:25;;48334:1;48299:7;:16;48307:7;48299:16;;;;;;;;;;;;;;;:25;;:32;;;;:36;;;;:::i;:::-;48273:63;;;;;;;;:::i;:::-;;;;;;;;;;;;48242:7;:16;48250:7;48242:16;;;;;;;;;;;;;;;:25;;48268:1;48242:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:94;;;;;;;;;;;;;;;;;;;48359:7;:16;48367:7;48359:16;;;;;;;;;;;;;;;:25;;:31;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48163:247;48140:3;;;;;:::i;:::-;;;;48083:342;;;;48064:3;;;;;:::i;:::-;;;;48023:413;;;;47921:522;;:::o;54944:261::-;54990:13;55015:15;55033:7;:19;55041:10;55033:19;;;;;;;;;;;;;;;:28;;:35;;;;55015:53;;55092:1;55082:7;:11;55079:24;;;55102:1;55095:8;;;;;55079:24;55127:2;55117:7;:12;55114:26;;;55138:2;55131:9;;;;;55114:26;55164:2;55154:7;:12;55151:26;;;55175:2;55168:9;;;;;55151:26;55195:2;55188:9;;;54944:261;;:::o;52144:1390::-;52388:14;52414:23;52448:28;52479:1;52448:32;;52491:21;52523:18;52564:16;52544:17;:36;;;;:::i;:::-;52523:57;;52618:16;52594:21;:40;52591:111;;;52674:16;52650:40;;52591:111;52750:21;52730:17;:41;;;;:::i;:::-;52714:57;;52799:7;52785:10;:21;;:65;;;;52830:20;52810:16;:40;;52785:65;52782:120;;;52889:1;52866:24;;52782:120;52929:7;52915:10;:21;52912:411;;52970:3;52952:21;;52912:411;;;53008:9;53019:1;53008:12;;53004:308;53026:1;53022;:5;53004:308;;;53052:23;53088:1;53078:7;:11;;;;:::i;:::-;53052:37;;53129:1;53111:15;:19;:52;;;;;53153:10;53134:15;:29;;53111:52;53108:189;;;53223:2;53205:15;:20;;;;:::i;:::-;53187:38;;53108:189;;;53272:5;;;53108:189;53033:279;53029:3;;;;;:::i;:::-;;;;53004:308;;;;52912:411;53371:13;53353:15;:31;;;;:::i;:::-;53335:49;;53457:6;53433:20;53421:9;53405:13;:25;;;;:::i;:::-;:48;;;;:::i;:::-;53404:59;;;;:::i;:::-;53395:68;;53522:3;53503:15;53494:6;:24;;;;:::i;:::-;53493:32;;;;:::i;:::-;53483:6;:43;;;;:::i;:::-;53474:52;;52403:1131;;;;52144:1390;;;;;;;:::o;55213:273::-;55263:13;55288:15;55306:11;:23;55318:10;55306:23;;;;;;;;;;;;;;;:36;;:43;;;;55288:61;;55373:1;55363:7;:11;55360:24;;;55383:1;55376:8;;;;;55360:24;55408:2;55398:7;:12;55395:26;;;55419:2;55412:9;;;;;55395:26;55445:2;55435:7;:12;55432:26;;;55456:2;55449:9;;;;;55432:26;55476:2;55469:9;;;55213:273;;:::o;53542:1394::-;53790:14;53816:23;53850:28;53881:1;53850:32;;53893:21;53925:18;53966:16;53946:17;:36;;;;:::i;:::-;53925:57;;54020:16;53996:21;:40;53993:111;;;54076:16;54052:40;;53993:111;54152:21;54132:17;:41;;;;:::i;:::-;54116:57;;54201:7;54187:10;:21;;:65;;;;54232:20;54212:16;:40;;54187:65;54184:120;;;54291:1;54268:24;;54184:120;54331:7;54317:10;:21;54314:411;;54372:3;54354:21;;54314:411;;;54410:9;54421:1;54410:12;;54406:308;54428:1;54424;:5;54406:308;;;54454:23;54490:1;54480:7;:11;;;;:::i;:::-;54454:37;;54531:1;54513:15;:19;:52;;;;;54555:10;54536:15;:29;;54513:52;54510:189;;;54625:2;54607:15;:20;;;;:::i;:::-;54589:38;;54510:189;;;54674:5;;;54510:189;54435:279;54431:3;;;;;:::i;:::-;;;;54406:308;;;;54314:411;54773:13;54755:15;:31;;;;:::i;:::-;54737:49;;54859:6;54835:20;54823:9;54807:13;:25;;;;:::i;:::-;:48;;;;:::i;:::-;54806:59;;;;:::i;:::-;54797:68;;54924:3;54905:15;54896:6;:24;;;;:::i;:::-;54895:32;;;;:::i;:::-;54885:6;:43;;;;:::i;:::-;54876:52;;53805:1131;;;;53542:1394;;;;;;;:::o;23832:191::-;23906:16;23925:6;;;;;;;;;;;23906:25;;23951:8;23942:6;;:17;;;;;;;;;;;;;;;;;;24006:8;23975:40;;23996:8;23975:40;;;;;;;;;;;;23895:128;23832:191;:::o;43718:125::-;;;;:::o;44447:124::-;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;152:143;;;;:::o;318:568::-;391:8;401:6;451:3;444:4;436:6;432:17;428:27;418:122;;459:79;;:::i;:::-;418:122;572:6;559:20;549:30;;602:18;594:6;591:30;588:117;;;624:79;;:::i;:::-;588:117;738:4;730:6;726:17;714:29;;792:3;784:4;776:6;772:17;762:8;758:32;755:41;752:128;;;799:79;;:::i;:::-;752:128;318:568;;;;;:::o;892:139::-;938:5;976:6;963:20;954:29;;992:33;1019:5;992:33;:::i;:::-;892:139;;;;:::o;1037:329::-;1096:6;1145:2;1133:9;1124:7;1120:23;1116:32;1113:119;;;1151:79;;:::i;:::-;1113:119;1271:1;1296:53;1341:7;1332:6;1321:9;1317:22;1296:53;:::i;:::-;1286:63;;1242:117;1037:329;;;;:::o;1372:351::-;1442:6;1491:2;1479:9;1470:7;1466:23;1462:32;1459:119;;;1497:79;;:::i;:::-;1459:119;1617:1;1642:64;1698:7;1689:6;1678:9;1674:22;1642:64;:::i;:::-;1632:74;;1588:128;1372:351;;;;:::o;1729:474::-;1797:6;1805;1854:2;1842:9;1833:7;1829:23;1825:32;1822:119;;;1860:79;;:::i;:::-;1822:119;1980:1;2005:53;2050:7;2041:6;2030:9;2026:22;2005:53;:::i;:::-;1995:63;;1951:117;2107:2;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2078:118;1729:474;;;;;:::o;2209:619::-;2286:6;2294;2302;2351:2;2339:9;2330:7;2326:23;2322:32;2319:119;;;2357:79;;:::i;:::-;2319:119;2477:1;2502:53;2547:7;2538:6;2527:9;2523:22;2502:53;:::i;:::-;2492:63;;2448:117;2604:2;2630:53;2675:7;2666:6;2655:9;2651:22;2630:53;:::i;:::-;2620:63;;2575:118;2732:2;2758:53;2803:7;2794:6;2783:9;2779:22;2758:53;:::i;:::-;2748:63;;2703:118;2209:619;;;;;:::o;2834:474::-;2902:6;2910;2959:2;2947:9;2938:7;2934:23;2930:32;2927:119;;;2965:79;;:::i;:::-;2927:119;3085:1;3110:53;3155:7;3146:6;3135:9;3131:22;3110:53;:::i;:::-;3100:63;;3056:117;3212:2;3238:53;3283:7;3274:6;3263:9;3259:22;3238:53;:::i;:::-;3228:63;;3183:118;2834:474;;;;;:::o;3314:559::-;3400:6;3408;3457:2;3445:9;3436:7;3432:23;3428:32;3425:119;;;3463:79;;:::i;:::-;3425:119;3611:1;3600:9;3596:17;3583:31;3641:18;3633:6;3630:30;3627:117;;;3663:79;;:::i;:::-;3627:117;3776:80;3848:7;3839:6;3828:9;3824:22;3776:80;:::i;:::-;3758:98;;;;3554:312;3314:559;;;;;:::o;3879:179::-;3948:10;3969:46;4011:3;4003:6;3969:46;:::i;:::-;4047:4;4042:3;4038:14;4024:28;;3879:179;;;;:::o;4064:118::-;4151:24;4169:5;4151:24;:::i;:::-;4146:3;4139:37;4064:118;;:::o;4218:732::-;4337:3;4366:54;4414:5;4366:54;:::i;:::-;4436:86;4515:6;4510:3;4436:86;:::i;:::-;4429:93;;4546:56;4596:5;4546:56;:::i;:::-;4625:7;4656:1;4641:284;4666:6;4663:1;4660:13;4641:284;;;4742:6;4736:13;4769:63;4828:3;4813:13;4769:63;:::i;:::-;4762:70;;4855:60;4908:6;4855:60;:::i;:::-;4845:70;;4701:224;4688:1;4685;4681:9;4676:14;;4641:284;;;4645:14;4941:3;4934:10;;4342:608;;;4218:732;;;;:::o;4956:109::-;5037:21;5052:5;5037:21;:::i;:::-;5032:3;5025:34;4956:109;;:::o;5071:161::-;5173:52;5219:5;5173:52;:::i;:::-;5168:3;5161:65;5071:161;;:::o;5238:364::-;5326:3;5354:39;5387:5;5354:39;:::i;:::-;5409:71;5473:6;5468:3;5409:71;:::i;:::-;5402:78;;5489:52;5534:6;5529:3;5522:4;5515:5;5511:16;5489:52;:::i;:::-;5566:29;5588:6;5566:29;:::i;:::-;5561:3;5557:39;5550:46;;5330:272;5238:364;;;;:::o;5608:366::-;5750:3;5771:67;5835:2;5830:3;5771:67;:::i;:::-;5764:74;;5847:93;5936:3;5847:93;:::i;:::-;5965:2;5960:3;5956:12;5949:19;;5608:366;;;:::o;5980:::-;6122:3;6143:67;6207:2;6202:3;6143:67;:::i;:::-;6136:74;;6219:93;6308:3;6219:93;:::i;:::-;6337:2;6332:3;6328:12;6321:19;;5980:366;;;:::o;6352:::-;6494:3;6515:67;6579:2;6574:3;6515:67;:::i;:::-;6508:74;;6591:93;6680:3;6591:93;:::i;:::-;6709:2;6704:3;6700:12;6693:19;;6352:366;;;:::o;6724:::-;6866:3;6887:67;6951:2;6946:3;6887:67;:::i;:::-;6880:74;;6963:93;7052:3;6963:93;:::i;:::-;7081:2;7076:3;7072:12;7065:19;;6724:366;;;:::o;7096:::-;7238:3;7259:67;7323:2;7318:3;7259:67;:::i;:::-;7252:74;;7335:93;7424:3;7335:93;:::i;:::-;7453:2;7448:3;7444:12;7437:19;;7096:366;;;:::o;7468:::-;7610:3;7631:67;7695:2;7690:3;7631:67;:::i;:::-;7624:74;;7707:93;7796:3;7707:93;:::i;:::-;7825:2;7820:3;7816:12;7809:19;;7468:366;;;:::o;7840:::-;7982:3;8003:67;8067:2;8062:3;8003:67;:::i;:::-;7996:74;;8079:93;8168:3;8079:93;:::i;:::-;8197:2;8192:3;8188:12;8181:19;;7840:366;;;:::o;8212:::-;8354:3;8375:67;8439:2;8434:3;8375:67;:::i;:::-;8368:74;;8451:93;8540:3;8451:93;:::i;:::-;8569:2;8564:3;8560:12;8553:19;;8212:366;;;:::o;8584:::-;8726:3;8747:67;8811:2;8806:3;8747:67;:::i;:::-;8740:74;;8823:93;8912:3;8823:93;:::i;:::-;8941:2;8936:3;8932:12;8925:19;;8584:366;;;:::o;8956:::-;9098:3;9119:67;9183:2;9178:3;9119:67;:::i;:::-;9112:74;;9195:93;9284:3;9195:93;:::i;:::-;9313:2;9308:3;9304:12;9297:19;;8956:366;;;:::o;9328:::-;9470:3;9491:67;9555:2;9550:3;9491:67;:::i;:::-;9484:74;;9567:93;9656:3;9567:93;:::i;:::-;9685:2;9680:3;9676:12;9669:19;;9328:366;;;:::o;9700:::-;9842:3;9863:67;9927:2;9922:3;9863:67;:::i;:::-;9856:74;;9939:93;10028:3;9939:93;:::i;:::-;10057:2;10052:3;10048:12;10041:19;;9700:366;;;:::o;10072:::-;10214:3;10235:67;10299:2;10294:3;10235:67;:::i;:::-;10228:74;;10311:93;10400:3;10311:93;:::i;:::-;10429:2;10424:3;10420:12;10413:19;;10072:366;;;:::o;10444:::-;10586:3;10607:67;10671:2;10666:3;10607:67;:::i;:::-;10600:74;;10683:93;10772:3;10683:93;:::i;:::-;10801:2;10796:3;10792:12;10785:19;;10444:366;;;:::o;10816:108::-;10893:24;10911:5;10893:24;:::i;:::-;10888:3;10881:37;10816:108;;:::o;10930:118::-;11017:24;11035:5;11017:24;:::i;:::-;11012:3;11005:37;10930:118;;:::o;11054:112::-;11137:22;11153:5;11137:22;:::i;:::-;11132:3;11125:35;11054:112;;:::o;11172:222::-;11265:4;11303:2;11292:9;11288:18;11280:26;;11316:71;11384:1;11373:9;11369:17;11360:6;11316:71;:::i;:::-;11172:222;;;;:::o;11400:442::-;11549:4;11587:2;11576:9;11572:18;11564:26;;11600:71;11668:1;11657:9;11653:17;11644:6;11600:71;:::i;:::-;11681:72;11749:2;11738:9;11734:18;11725:6;11681:72;:::i;:::-;11763;11831:2;11820:9;11816:18;11807:6;11763:72;:::i;:::-;11400:442;;;;;;:::o;11848:373::-;11991:4;12029:2;12018:9;12014:18;12006:26;;12078:9;12072:4;12068:20;12064:1;12053:9;12049:17;12042:47;12106:108;12209:4;12200:6;12106:108;:::i;:::-;12098:116;;11848:373;;;;:::o;12227:210::-;12314:4;12352:2;12341:9;12337:18;12329:26;;12365:65;12427:1;12416:9;12412:17;12403:6;12365:65;:::i;:::-;12227:210;;;;:::o;12443:252::-;12551:4;12589:2;12578:9;12574:18;12566:26;;12602:86;12685:1;12674:9;12670:17;12661:6;12602:86;:::i;:::-;12443:252;;;;:::o;12701:313::-;12814:4;12852:2;12841:9;12837:18;12829:26;;12901:9;12895:4;12891:20;12887:1;12876:9;12872:17;12865:47;12929:78;13002:4;12993:6;12929:78;:::i;:::-;12921:86;;12701:313;;;;:::o;13020:419::-;13186:4;13224:2;13213:9;13209:18;13201:26;;13273:9;13267:4;13263:20;13259:1;13248:9;13244:17;13237:47;13301:131;13427:4;13301:131;:::i;:::-;13293:139;;13020:419;;;:::o;13445:::-;13611:4;13649:2;13638:9;13634:18;13626:26;;13698:9;13692:4;13688:20;13684:1;13673:9;13669:17;13662:47;13726:131;13852:4;13726:131;:::i;:::-;13718:139;;13445:419;;;:::o;13870:::-;14036:4;14074:2;14063:9;14059:18;14051:26;;14123:9;14117:4;14113:20;14109:1;14098:9;14094:17;14087:47;14151:131;14277:4;14151:131;:::i;:::-;14143:139;;13870:419;;;:::o;14295:::-;14461:4;14499:2;14488:9;14484:18;14476:26;;14548:9;14542:4;14538:20;14534:1;14523:9;14519:17;14512:47;14576:131;14702:4;14576:131;:::i;:::-;14568:139;;14295:419;;;:::o;14720:::-;14886:4;14924:2;14913:9;14909:18;14901:26;;14973:9;14967:4;14963:20;14959:1;14948:9;14944:17;14937:47;15001:131;15127:4;15001:131;:::i;:::-;14993:139;;14720:419;;;:::o;15145:::-;15311:4;15349:2;15338:9;15334:18;15326:26;;15398:9;15392:4;15388:20;15384:1;15373:9;15369:17;15362:47;15426:131;15552:4;15426:131;:::i;:::-;15418:139;;15145:419;;;:::o;15570:::-;15736:4;15774:2;15763:9;15759:18;15751:26;;15823:9;15817:4;15813:20;15809:1;15798:9;15794:17;15787:47;15851:131;15977:4;15851:131;:::i;:::-;15843:139;;15570:419;;;:::o;15995:::-;16161:4;16199:2;16188:9;16184:18;16176:26;;16248:9;16242:4;16238:20;16234:1;16223:9;16219:17;16212:47;16276:131;16402:4;16276:131;:::i;:::-;16268:139;;15995:419;;;:::o;16420:::-;16586:4;16624:2;16613:9;16609:18;16601:26;;16673:9;16667:4;16663:20;16659:1;16648:9;16644:17;16637:47;16701:131;16827:4;16701:131;:::i;:::-;16693:139;;16420:419;;;:::o;16845:::-;17011:4;17049:2;17038:9;17034:18;17026:26;;17098:9;17092:4;17088:20;17084:1;17073:9;17069:17;17062:47;17126:131;17252:4;17126:131;:::i;:::-;17118:139;;16845:419;;;:::o;17270:::-;17436:4;17474:2;17463:9;17459:18;17451:26;;17523:9;17517:4;17513:20;17509:1;17498:9;17494:17;17487:47;17551:131;17677:4;17551:131;:::i;:::-;17543:139;;17270:419;;;:::o;17695:::-;17861:4;17899:2;17888:9;17884:18;17876:26;;17948:9;17942:4;17938:20;17934:1;17923:9;17919:17;17912:47;17976:131;18102:4;17976:131;:::i;:::-;17968:139;;17695:419;;;:::o;18120:::-;18286:4;18324:2;18313:9;18309:18;18301:26;;18373:9;18367:4;18363:20;18359:1;18348:9;18344:17;18337:47;18401:131;18527:4;18401:131;:::i;:::-;18393:139;;18120:419;;;:::o;18545:::-;18711:4;18749:2;18738:9;18734:18;18726:26;;18798:9;18792:4;18788:20;18784:1;18773:9;18769:17;18762:47;18826:131;18952:4;18826:131;:::i;:::-;18818:139;;18545:419;;;:::o;18970:222::-;19063:4;19101:2;19090:9;19086:18;19078:26;;19114:71;19182:1;19171:9;19167:17;19158:6;19114:71;:::i;:::-;18970:222;;;;:::o;19198:214::-;19287:4;19325:2;19314:9;19310:18;19302:26;;19338:67;19402:1;19391:9;19387:17;19378:6;19338:67;:::i;:::-;19198:214;;;;:::o;19499:132::-;19566:4;19589:3;19581:11;;19619:4;19614:3;19610:14;19602:22;;19499:132;;;:::o;19637:114::-;19704:6;19738:5;19732:12;19722:22;;19637:114;;;:::o;19757:99::-;19809:6;19843:5;19837:12;19827:22;;19757:99;;;:::o;19862:113::-;19932:4;19964;19959:3;19955:14;19947:22;;19862:113;;;:::o;19981:184::-;20080:11;20114:6;20109:3;20102:19;20154:4;20149:3;20145:14;20130:29;;19981:184;;;;:::o;20171:169::-;20255:11;20289:6;20284:3;20277:19;20329:4;20324:3;20320:14;20305:29;;20171:169;;;;:::o;20346:305::-;20386:3;20405:20;20423:1;20405:20;:::i;:::-;20400:25;;20439:20;20457:1;20439:20;:::i;:::-;20434:25;;20593:1;20525:66;20521:74;20518:1;20515:81;20512:107;;;20599:18;;:::i;:::-;20512:107;20643:1;20640;20636:9;20629:16;;20346:305;;;;:::o;20657:185::-;20697:1;20714:20;20732:1;20714:20;:::i;:::-;20709:25;;20748:20;20766:1;20748:20;:::i;:::-;20743:25;;20787:1;20777:35;;20792:18;;:::i;:::-;20777:35;20834:1;20831;20827:9;20822:14;;20657:185;;;;:::o;20848:348::-;20888:7;20911:20;20929:1;20911:20;:::i;:::-;20906:25;;20945:20;20963:1;20945:20;:::i;:::-;20940:25;;21133:1;21065:66;21061:74;21058:1;21055:81;21050:1;21043:9;21036:17;21032:105;21029:131;;;21140:18;;:::i;:::-;21029:131;21188:1;21185;21181:9;21170:20;;20848:348;;;;:::o;21202:191::-;21242:4;21262:20;21280:1;21262:20;:::i;:::-;21257:25;;21296:20;21314:1;21296:20;:::i;:::-;21291:25;;21335:1;21332;21329:8;21326:34;;;21340:18;;:::i;:::-;21326:34;21385:1;21382;21378:9;21370:17;;21202:191;;;;:::o;21399:96::-;21436:7;21465:24;21483:5;21465:24;:::i;:::-;21454:35;;21399:96;;;:::o;21501:90::-;21535:7;21578:5;21571:13;21564:21;21553:32;;21501:90;;;:::o;21597:126::-;21634:7;21674:42;21667:5;21663:54;21652:65;;21597:126;;;:::o;21729:77::-;21766:7;21795:5;21784:16;;21729:77;;;:::o;21812:86::-;21847:7;21887:4;21880:5;21876:16;21865:27;;21812:86;;;:::o;21904:141::-;21969:9;22002:37;22033:5;22002:37;:::i;:::-;21989:50;;21904:141;;;:::o;22051:126::-;22101:9;22134:37;22165:5;22134:37;:::i;:::-;22121:50;;22051:126;;;:::o;22183:113::-;22233:9;22266:24;22284:5;22266:24;:::i;:::-;22253:37;;22183:113;;;:::o;22302:307::-;22370:1;22380:113;22394:6;22391:1;22388:13;22380:113;;;22479:1;22474:3;22470:11;22464:18;22460:1;22455:3;22451:11;22444:39;22416:2;22413:1;22409:10;22404:15;;22380:113;;;22511:6;22508:1;22505:13;22502:101;;;22591:1;22582:6;22577:3;22573:16;22566:27;22502:101;22351:258;22302:307;;;:::o;22615:320::-;22659:6;22696:1;22690:4;22686:12;22676:22;;22743:1;22737:4;22733:12;22764:18;22754:81;;22820:4;22812:6;22808:17;22798:27;;22754:81;22882:2;22874:6;22871:14;22851:18;22848:38;22845:84;;;22901:18;;:::i;:::-;22845:84;22666:269;22615:320;;;:::o;22941:233::-;22980:3;23003:24;23021:5;23003:24;:::i;:::-;22994:33;;23049:66;23042:5;23039:77;23036:103;;;23119:18;;:::i;:::-;23036:103;23166:1;23159:5;23155:13;23148:20;;22941:233;;;:::o;23180:180::-;23228:77;23225:1;23218:88;23325:4;23322:1;23315:15;23349:4;23346:1;23339:15;23366:180;23414:77;23411:1;23404:88;23511:4;23508:1;23501:15;23535:4;23532:1;23525:15;23552:180;23600:77;23597:1;23590:88;23697:4;23694:1;23687:15;23721:4;23718:1;23711:15;23738:180;23786:77;23783:1;23776:88;23883:4;23880:1;23873:15;23907:4;23904:1;23897:15;23924:180;23972:77;23969:1;23962:88;24069:4;24066:1;24059:15;24093:4;24090:1;24083:15;24110:180;24158:77;24155:1;24148:88;24255:4;24252:1;24245:15;24279:4;24276:1;24269:15;24296:117;24405:1;24402;24395:12;24419:117;24528:1;24525;24518:12;24542:117;24651:1;24648;24641:12;24665:117;24774:1;24771;24764:12;24788:117;24897:1;24894;24887:12;24911:102;24952:6;25003:2;24999:7;24994:2;24987:5;24983:14;24979:28;24969:38;;24911:102;;;:::o;25019:222::-;25159:34;25155:1;25147:6;25143:14;25136:58;25228:5;25223:2;25215:6;25211:15;25204:30;25019:222;:::o;25247:225::-;25387:34;25383:1;25375:6;25371:14;25364:58;25456:8;25451:2;25443:6;25439:15;25432:33;25247:225;:::o;25478:221::-;25618:34;25614:1;25606:6;25602:14;25595:58;25687:4;25682:2;25674:6;25670:15;25663:29;25478:221;:::o;25705:179::-;25845:31;25841:1;25833:6;25829:14;25822:55;25705:179;:::o;25890:225::-;26030:34;26026:1;26018:6;26014:14;26007:58;26099:8;26094:2;26086:6;26082:15;26075:33;25890:225;:::o;26121:177::-;26261:29;26257:1;26249:6;26245:14;26238:53;26121:177;:::o;26304:232::-;26444:34;26440:1;26432:6;26428:14;26421:58;26513:15;26508:2;26500:6;26496:15;26489:40;26304:232;:::o;26542:166::-;26682:18;26678:1;26670:6;26666:14;26659:42;26542:166;:::o;26714:182::-;26854:34;26850:1;26842:6;26838:14;26831:58;26714:182;:::o;26902:224::-;27042:34;27038:1;27030:6;27026:14;27019:58;27111:7;27106:2;27098:6;27094:15;27087:32;26902:224;:::o;27132:223::-;27272:34;27268:1;27260:6;27256:14;27249:58;27341:6;27336:2;27328:6;27324:15;27317:31;27132:223;:::o;27361:181::-;27501:33;27497:1;27489:6;27485:14;27478:57;27361:181;:::o;27548:224::-;27688:34;27684:1;27676:6;27672:14;27665:58;27757:7;27752:2;27744:6;27740:15;27733:32;27548:224;:::o;27778:181::-;27918:33;27914:1;27906:6;27902:14;27895:57;27778:181;:::o;27965:122::-;28038:24;28056:5;28038:24;:::i;:::-;28031:5;28028:35;28018:63;;28077:1;28074;28067:12;28018:63;27965:122;:::o;28093:::-;28166:24;28184:5;28166:24;:::i;:::-;28159:5;28156:35;28146:63;;28205:1;28202;28195:12;28146:63;28093:122;:::o
Swarm Source
ipfs://34c715f2f89ac53df42736ac798a006b26c6bda60f225644b98c0b0cbd0de7fd
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.