Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 59 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Sendto Class | 16903475 | 489 days ago | IN | 0 ETH | 0.01001215 | ||||
Sendto Class | 16902708 | 489 days ago | IN | 0 ETH | 0.00961688 | ||||
Sendto Class | 16830909 | 499 days ago | IN | 0 ETH | 0.0096814 | ||||
Sendto Class | 16824053 | 500 days ago | IN | 0 ETH | 0.01069509 | ||||
Sendto Class | 16823577 | 500 days ago | IN | 0 ETH | 0.01150891 | ||||
Sendto Class | 16810634 | 502 days ago | IN | 0 ETH | 0.01452768 | ||||
Sendto Class | 16781550 | 506 days ago | IN | 0 ETH | 0.04737576 | ||||
Sendto Class | 16774913 | 507 days ago | IN | 0 ETH | 0.00667681 | ||||
Sendto Class | 16774703 | 507 days ago | IN | 0 ETH | 0.01277897 | ||||
Sendto Class | 16759988 | 509 days ago | IN | 0 ETH | 0.02265703 | ||||
Sendto Class | 16754728 | 510 days ago | IN | 0 ETH | 0.01140898 | ||||
Sendto Class | 16754620 | 510 days ago | IN | 0 ETH | 0.01749139 | ||||
Sendto Class | 16753706 | 510 days ago | IN | 0 ETH | 0.01108508 | ||||
Sendto Class | 16711062 | 516 days ago | IN | 0 ETH | 0.00794296 | ||||
Sendto Class | 16648362 | 525 days ago | IN | 0 ETH | 0.00640426 | ||||
Sendto Class | 16647517 | 525 days ago | IN | 0 ETH | 0.0095844 | ||||
Sendto Class | 16639768 | 526 days ago | IN | 0 ETH | 0.01551538 | ||||
Sendto Class | 16623503 | 528 days ago | IN | 0 ETH | 0.00443975 | ||||
Release Neo | 16611332 | 530 days ago | IN | 0 ETH | 0.00234162 | ||||
Sendto Class | 16610515 | 530 days ago | IN | 0 ETH | 0.004208 | ||||
Sendto Class | 16606405 | 531 days ago | IN | 0 ETH | 0.00535653 | ||||
Sendto Class | 16603906 | 531 days ago | IN | 0 ETH | 0.0115889 | ||||
Sendto Class | 16595879 | 532 days ago | IN | 0 ETH | 0.00695671 | ||||
Sendto Class | 16583858 | 534 days ago | IN | 0 ETH | 0.0079156 | ||||
Sendto Class | 16569246 | 536 days ago | IN | 0 ETH | 0.0052619 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Neophytes_Class_Attendance
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-29 */ pragma solidity ^0.8.0; interface IERC165 { function supportsInterface(bytes4 interfaceId) external view returns (bool); } //"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4,"5000000000000000000",2,"1668708000","1668967200","1672509600" pragma solidity ^0.8.0; interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); function numberTokensLocked(address owner) external view returns (uint256 number); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; function totalSupply() external view returns (uint256); /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts 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.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `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 Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } abstract contract ReentrancyGuard { // word because each write operation emits an extra SLOAD to first read the // back. This is the compiler's defense against contract upgrades and // but in exchange the refund on every call to nonReentrant will be lower in // transaction's gas, it is best to keep them low in cases like this one, to uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } modifier nonReentrant() { require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); _status = _ENTERED; _; // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } //SPDX-License-Identifier: MIT pragma solidity 0.8.7; contract Neophytes_Class_Attendance is EIP712, Ownable, ReentrancyGuard{ using SafeMath for uint256; string private constant SIGNING_DOMAIN = "sanctum"; string private constant SIGNATURE_VERSION = "1"; bool paused = false; //Erc20 Variables IERC20 public rewardToken; //Staking Variables uint256 public Total_Neo_In_Class = 0; mapping(uint => uint256) public voucherIds; uint legend_rewards=10000000000000000000; uint genesis_rewards=5000000000000000000; uint neo_rewards=3000000000000000000; //Collection Variables IERC721 public nft; IERC721 public Rooms_renting_contract; mapping(uint256 => address) public tokenIdOwners; uint[] public legendids; address private Verify = 0x1479d797B8431d0D47F2e7A18d589dD67a4b7dc4; /////////////////////////////////////////////////////////////////// struct Locking_record{ uint tokenid; uint perdaytoken; uint owntime; uint starttime; uint endtime; uint total; } //////////////////////////////////////////////////////////////////// struct user_record{ Locking_record[] nft_entries; uint totalentries; uint totalreward; uint claimedreward; uint Total_locked_Nfts; } mapping(address => user_record) private user_db; constructor() EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION){ //nft = IERC721(_nftAddress); //rewardToken = IERC20(_rewardToken); } //this function is to get estimated earing for 1 day if you lock now function Rewards_Calculator_per_entry_checker(address user,uint tokenid, uint ot, uint perday) public view returns(uint) { uint tm=0; if(ot==5) { uint totalentries=user_db[user].totalentries; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].tokenid==tokenid) { tm = user_db[user].nft_entries[i].owntime; } } } else{tm=ot;} uint owntime = tm; uint starttime = block.timestamp; uint endtime = starttime+86401; if(endtime==0){endtime=block.timestamp;} uint perdaytoken = perday; uint owningdays= (starttime-owntime)/86400; owningdays++; uint calculation=0; //Holding Factor Calculator uint Total_Days_Locked= (endtime-starttime)/86400; uint factordays=owningdays; uint looptorun=0; if(owningdays<30) { if(Total_Days_Locked<30-owningdays) { looptorun=Total_Days_Locked; } else{ looptorun=30-owningdays; } for(uint i=1;i<=looptorun;i++) { uint operand1 = factordays * 1000; uint operand2 = 30; uint operand3 = perdaytoken; // Perform the calculation using integer arithmetic uint result = (operand1/operand2)*operand3; result=result / 1000; calculation +=result; factordays++; } if(Total_Days_Locked+owningdays>30){ calculation+=(Total_Days_Locked-looptorun)*perdaytoken; } } else{ calculation=Total_Days_Locked*perdaytoken; } return calculation; } //function this function is to calculate the rewards per staking record function Rewards_Calculator_per_entry(Locking_record memory temp) public view returns(uint) { uint owntime = temp.owntime; uint starttime = temp.starttime; uint endtime = temp.endtime; if(endtime==0){endtime=block.timestamp;} uint perdaytoken = temp.perdaytoken; uint owningdays= (starttime-owntime)/86400; owningdays++; uint calculation=0; //factor calculator uint Total_Days_Locked= (endtime-starttime)/86400; uint factordays=owningdays; uint looptorun=0; if(owningdays<30) { if(Total_Days_Locked<30-owningdays) { looptorun=Total_Days_Locked; } else{ looptorun=30-owningdays; } for(uint i=1;i<=looptorun;i++) { uint operand1 = factordays * 1000; uint operand2 = 30; uint operand3 = perdaytoken; // Perform the calculation using integer arithmetic uint result = (operand1/operand2)*operand3; result=result / 1000; calculation +=result; factordays++; } if(Total_Days_Locked+owningdays>30){ calculation+=(Total_Days_Locked-looptorun)*perdaytoken; } } else{ calculation=Total_Days_Locked*perdaytoken; } return calculation; } function nft_entry(address user, uint perdaytoken, uint tokenid, uint owntime ) internal{ Locking_record memory temp; temp.tokenid=tokenid; temp.owntime=owntime; temp.starttime=block.timestamp; temp.endtime=0; temp.perdaytoken=perdaytoken; temp.total=0; user_db[user].nft_entries.push(temp); user_db[user].totalentries+=1; user_db[user].Total_locked_Nfts+=1; } function close_nft_entry(address user, uint tokenid) internal { user_db[user].Total_locked_Nfts=user_db[user].Total_locked_Nfts-1; uint totalentries=user_db[user].totalentries; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].tokenid==tokenid && user_db[user].nft_entries[i].total==0 && user_db[user].nft_entries[i].endtime==0) { user_db[user].nft_entries[i].total=Rewards_Calculator_per_entry(user_db[user].nft_entries[i]); user_db[user].nft_entries[i].endtime=block.timestamp; } } } function getlast_tms(uint tokenid, address user ) internal view returns (uint){ uint totalentries=user_db[user].totalentries; uint tm=0; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].tokenid==tokenid) { tm = user_db[user].nft_entries[i].owntime; } } return tm; } function get_total_rewards(address user) public view returns(uint){ uint totalentries=user_db[user].totalentries; uint totalcalculation=0; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].total==0 && user_db[user].nft_entries[i].endtime==0) { totalcalculation += Rewards_Calculator_per_entry(user_db[user].nft_entries[i]); } else { totalcalculation +=user_db[user].nft_entries[i].total; } } return totalcalculation; } //Setter Functions function set_Staking_Reward_In_Wei(uint256 legend,uint256 genesis,uint256 neo) public onlyOwner{ legend_rewards=legend; genesis_rewards=genesis; neo_rewards=neo; } function setRewardTokenAddress(address val) public onlyOwner{ rewardToken = IERC20(val); } function setNftAddress(address val) public onlyOwner{ nft = IERC721(val); } function setRoomsRentingAddress(address val) public onlyOwner{ Rooms_renting_contract = IERC721(val); } function withdrawTokens(address _to, uint amount_in_wei) public onlyOwner{ rewardToken.transfer(_to, amount_in_wei); } function rewardsPerDay(address user) public view returns (uint256){ uint totalentries=user_db[user].totalentries; uint totalcalculation=0; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].total==0 && user_db[user].nft_entries[i].endtime==0) { totalcalculation += Rewards_Calculator_per_entry_checker(user,user_db[user].nft_entries[i].tokenid, user_db[user].nft_entries[i].owntime, user_db[user].nft_entries[i].perdaytoken); } } return totalcalculation; } function getRewards(address user) internal view returns(uint256) { uint totalentries=user_db[user].totalentries; uint totalcalculation=0; for(uint i=0;i<totalentries;i++) { if(user_db[user].nft_entries[i].total==0) { totalcalculation += Rewards_Calculator_per_entry(user_db[user].nft_entries[i]); } else { totalcalculation +=user_db[user].nft_entries[i].total; } } return totalcalculation; } function viewRewards(address account) public view returns(uint256){ // Total Earned Rewards uint256 totalReward = getRewards(account); return totalReward - user_db[account].claimedreward; } function claimRewards() external nonReentrant{ uint256 reward = viewRewards(msg.sender); require(reward > 0, "Zero Rewards"); require(rewardToken.balanceOf(address(this)) >= reward, "Contract does not have enough reward Tokens."); user_db[msg.sender].claimedreward+=reward; rewardToken.transfer(address(msg.sender), reward); } function getNftsIdsbyAddress(address _add) public view returns (uint256[] memory){ uint256 len = nft.balanceOf(_add); uint256[] memory temp = new uint[](len); uint256 temp_count = 0; uint256 totalCollectionSize = nft.totalSupply(); for(uint i=1;i<=totalCollectionSize;i++){ if(nft.ownerOf(i) == _add){ temp[temp_count] = i; temp_count++; } } return temp; } function numberTokensLocked(address _user) public view returns (uint256){ return user_db[_user].Total_locked_Nfts; } function getUserLockedNftIds(address _user) public view returns (uint256[] memory){ uint256 len = numberTokensLocked(_user); uint256[] memory temp = new uint[](len); uint totalentries=user_db[_user].totalentries; uint counter=0; for(uint i=0;i<totalentries;i++) { if(user_db[_user].nft_entries[i].total==0 && user_db[_user].nft_entries[i].endtime==0) { temp[counter]=user_db[_user].nft_entries[i].tokenid; counter++; } } return temp; } //this function will run in staking function to calculate per day reward of a token function perday_calculator(uint tokennum) public view returns (uint){ for(uint i = 0; i < legendids.length; i++) { if(legendids[i]==tokennum) return legend_rewards; } if(tokennum<=2000) { return genesis_rewards; } else{ return neo_rewards; } } function check_ownership(address user, uint[] memory list)public view returns (bool){ for (uint256 i = 0; i < list.length; i++) { if(IERC721(nft).ownerOf(list[i]) != user) { return false; } } return true; } function check_all_tms(uint[] memory listtms) internal pure returns(bool){ for (uint256 i = 0; i < listtms.length; i++) { if(listtms[i] == 0) { return false; } } return true; } function check_Locked_ownership(address user, uint[] memory list)public view returns (bool){ for (uint256 i = 0; i < list.length; i++) { if(tokenIdOwners[list[i]] != user) { return false; } } return true; } function SendtoClass(uint256[] memory tokenIds, uint[] memory tms, uint256 id, bytes memory signature) external nonReentrant { require(!paused,"Contract is paused"); require(IERC721(nft).isApprovedForAll(msg.sender, address(this)) , "Approve Neophytes First"); require(tokenIds.length > 0, "0 Neophyte to send to class"); require(check_ownership(msg.sender,tokenIds),"You are not owner of this Neophyte."); require(check_all_tms(tms),"Something went wrong"); require(check(id,signature) == Verify, "Sorry Something is wrong with the encryption."); require(voucherIds[id] == 0, "Invalid Voucher. Try Again."); voucherIds[id] = 1; uint256 len = tokenIds.length; for (uint256 i = 0; i < len; i++) { uint256 tokenId = tokenIds[i]; if(tms[i]!=5)//if released and unsold error code { nft_entry(msg.sender,perday_calculator(tokenIds[i]),tokenIds[i],tms[i]); } else{ nft_entry(msg.sender, perday_calculator(tokenIds[i]), tokenIds[i], getlast_tms(tokenIds[i], msg.sender)); } tokenIdOwners[tokenId] = msg.sender; Total_Neo_In_Class++; nft.transferFrom(msg.sender,address(this),tokenId); } } function ReleaseNeo(uint256[] memory tokenIds) external nonReentrant{ require(!paused,"Contract is paused"); require(numberTokensLocked(msg.sender)-tokenIds.length>=Rooms_renting_contract.numberTokensLocked(msg.sender),"Please release Rooms first"); require(tokenIds.length > 0, "0 Neophyte to release"); require(check_ownership(address(this),tokenIds),"Neophyte not available in the contract"); require(check_Locked_ownership(msg.sender,tokenIds),"you don't own this Neophyte"); uint256 len = tokenIds.length; for (uint256 i = 0; i < len; i++) { uint256 tokenId = tokenIds[i]; close_nft_entry(msg.sender,tokenIds[i]); Total_Neo_In_Class--; delete tokenIdOwners[tokenId]; nft.transferFrom( address(this), msg.sender, tokenId ); } } function inputLegends(uint[] memory ids) public onlyOwner{ for(uint i=0; i<ids.length;i++) { legendids.push(ids[i]); } } function togglePause(bool value) public onlyOwner{ paused = value; } function check(uint id, bytes memory signature) public view returns(address){ return _verify(id, signature); } function _verify(uint id, bytes memory signature) internal view returns(address){ bytes32 digest = _hash(id); return ECDSA.recover(digest, signature); } function _hash(uint id) internal view returns(bytes32){ return _hashTypedDataV4(keccak256(abi.encode( keccak256("EIP712Domain(uint id)"), id ))); } function verifySignature(bytes memory signature, bytes memory message, address expectedAddress) public pure returns (bool) { // Extract the v, r, and s values from the signature (uint8 v, bytes32 r, bytes32 s) = abi.decode(signature, (uint8, bytes32, bytes32)); // Recover the signer's address address signer = ecrecover(keccak256(abi.encodePacked(message)), v, r, s); return signer == expectedAddress; } //Emergancy Exit Code function withdraw_runes() public onlyOwner{ rewardToken.transfer(address(msg.sender), rewardToken.balanceOf(address(this))); } function exit_safe(uint256[] memory tokenIds) public onlyOwner { uint256 len = tokenIds.length; for (uint256 i = 0; i < len; i++) { uint256 tokenId = tokenIds[i]; require(check_ownership(address(this),tokenIds),"nft not available in the contract"); Total_Neo_In_Class--; address own=tokenIdOwners[tokenId]; nft.transferFrom( address(this), own, tokenId ); delete tokenIdOwners[tokenId]; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"ReleaseNeo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"perdaytoken","type":"uint256"},{"internalType":"uint256","name":"owntime","type":"uint256"},{"internalType":"uint256","name":"starttime","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"}],"internalType":"struct Neophytes_Class_Attendance.Locking_record","name":"temp","type":"tuple"}],"name":"Rewards_Calculator_per_entry","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"ot","type":"uint256"},{"internalType":"uint256","name":"perday","type":"uint256"}],"name":"Rewards_Calculator_per_entry_checker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Rooms_renting_contract","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"tms","type":"uint256[]"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"SendtoClass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Total_Neo_In_Class","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"name":"check_Locked_ownership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256[]","name":"list","type":"uint256[]"}],"name":"check_ownership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"exit_safe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"getNftsIdsbyAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserLockedNftIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"get_total_rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"inputLegends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"legendids","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"numberTokensLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokennum","type":"uint256"}],"name":"perday_calculator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"rewardsPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setNftAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setRewardTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setRoomsRentingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"legend","type":"uint256"},{"internalType":"uint256","name":"genesis","type":"uint256"},{"internalType":"uint256","name":"neo","type":"uint256"}],"name":"set_Staking_Reward_In_Wei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"address","name":"expectedAddress","type":"address"}],"name":"verifySignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"viewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voucherIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amount_in_wei","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw_runes","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040526000600260006101000a81548160ff0219169083151502179055506000600355678ac7230489e80000600555674563918244f400006006556729a2241af62c0000600755731479d797b8431d0d47f2e7a18d589dd67a4b7dc4600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000ab57600080fd5b506040518060400160405280600781526020017f73616e6374756d000000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a0818152505062000181818484620001fa60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050620001ed620001e16200023660201b60201c565b6200023e60201b60201c565b60018081905550620003da565b600083838346306040516020016200021795949392919062000335565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200030d8162000392565b82525050565b6200031e81620003a6565b82525050565b6200032f81620003d0565b82525050565b600060a0820190506200034c600083018862000313565b6200035b602083018762000313565b6200036a604083018662000313565b62000379606083018562000324565b62000388608083018462000302565b9695505050505050565b60006200039f82620003b0565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60805160a05160c05160601c60e0516101005161012051615c886200042d6000396000613fbd01526000613fff01526000613fde01526000613f1301526000613f6901526000613f920152615c886000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80638d03c3b611610125578063c26f9404116100ad578063da40ef801161007c578063da40ef8014610646578063e57deb3914610676578063f191743c146106a6578063f2fde38b146106c4578063f7c618c1146106e057610211565b8063c26f9404146105c0578063c9bc0a9a146105de578063ce85b6ef1461060e578063d8834b651461062a57610211565b80639a6acf20116100f45780639a6acf201461050c578063a8d77db314610528578063ab34ee4f14610544578063b5bb2b0614610574578063b773bf5e146105a457610211565b80638d03c3b6146104725780638da5cb5b1461048e57806391a7e0a7146104ac57806393545272146104dc57610211565b806347ccca02116101a85780636fe08746116101775780636fe08746146103ce578063715018a6146103fe578063722a10ac1461040857806372a8569114610438578063786568da1461044257610211565b806347ccca02146103485780634884254a146103665780634fee928e1461039657806357d159c6146103b257610211565b80631bfff8ac116101e45780631bfff8ac146102ae5780632bf2a10a146102de578063372500ab1461030e57806342265f9a1461031857610211565b806306b091f9146102165780630b102d1a146102325780630fb979a11461024e57806317afaee71461027e575b600080fd5b610230600480360381019061022b9190614544565b6106fe565b005b61024c6004803603810190610247919061448e565b61082e565b005b610268600480360381019061026391906144e8565b6108ee565b6040516102759190614ea9565b60405180910390f35b6102986004803603810190610293919061448e565b6109a8565b6040516102a5919061525b565b60405180910390f35b6102c860048036038101906102c3919061448e565b610c30565b6040516102d5919061525b565b60405180910390f35b6102f860048036038101906102f3919061448e565b610eca565b604051610305919061525b565b60405180910390f35b610316610f16565b005b610332600480360381019061032d91906147d4565b6111b4565b60405161033f919061525b565b60405180910390f35b610350611355565b60405161035d9190614fa0565b60405180910390f35b610380600480360381019061037b9190614801565b61137b565b60405161038d9190614de3565b60405180910390f35b6103b060048036038101906103ab919061448e565b6113ae565b005b6103cc60048036038101906103c791906146ef565b61146e565b005b6103e860048036038101906103e39190614584565b611507565b6040516103f5919061525b565b60405180910390f35b6104066117ff565b005b610422600480360381019061041d9190614801565b611887565b60405161042f919061525b565b60405180910390f35b6104406118ab565b005b61045c60048036038101906104579190614749565b611a83565b6040516104699190614ea9565b60405180910390f35b61048c600480360381019061048791906145eb565b611b58565b005b610496611f20565b6040516104a39190614de3565b60405180910390f35b6104c660048036038101906104c19190614801565b611f49565b6040516104d3919061525b565b60405180910390f35b6104f660048036038101906104f1919061448e565b611fc1565b6040516105039190614e87565b60405180910390f35b6105266004803603810190610521919061448e565b612203565b005b610542600480360381019061053d9190614634565b6122c3565b005b61055e60048036038101906105599190614801565b61286d565b60405161056b919061525b565b60405180910390f35b61058e600480360381019061058991906144e8565b612885565b60405161059b9190614ea9565b60405180910390f35b6105be60048036038101906105b991906145eb565b6129b6565b005b6105c8612a98565b6040516105d59190614fa0565b60405180910390f35b6105f860048036038101906105f3919061448e565b612abe565b6040516106059190614e87565b60405180910390f35b610628600480360381019061062391906148b7565b612d9c565b005b610644600480360381019061063f91906145eb565b612e32565b005b610660600480360381019061065b919061448e565b613058565b60405161066d919061525b565b60405180910390f35b610690600480360381019061068b919061485b565b6130bc565b60405161069d9190614de3565b60405180910390f35b6106ae6130d0565b6040516106bb919061525b565b60405180910390f35b6106de60048036038101906106d9919061448e565b6130d6565b005b6106e86131ce565b6040516106f59190614f85565b60405180910390f35b6107066131f4565b73ffffffffffffffffffffffffffffffffffffffff16610724611f20565b73ffffffffffffffffffffffffffffffffffffffff161461077a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107719061515b565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016107d7929190614e5e565b602060405180830381600087803b1580156107f157600080fd5b505af1158015610805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610829919061471c565b505050565b6108366131f4565b73ffffffffffffffffffffffffffffffffffffffff16610854611f20565b73ffffffffffffffffffffffffffffffffffffffff16146108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a19061515b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600090505b825181101561099c578373ffffffffffffffffffffffffffffffffffffffff16600a600085848151811061092d5761092c61569c565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109895760009150506109a2565b8080610994906155bc565b9150506108f6565b50600190505b92915050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610c25576000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610a5257610a5161569c565b5b906000526020600020906006020160050154148015610ad657506000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610ac257610ac161569c565b5b906000526020600020906006020160040154145b15610b9e57610b8c600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610b3257610b3161569c565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506111b4565b82610b979190615363565b9150610c12565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110610bf257610bf161569c565b5b90600052602060002090600602016005015482610c0f9190615363565b91505b8080610c1d906155bc565b9150506109f4565b508092505050919050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610ebf576000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610cda57610cd961569c565b5b906000526020600020906006020160050154148015610d5e57506000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610d4a57610d4961569c565b5b906000526020600020906006020160040154145b15610eac57610e9e85600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018381548110610dbb57610dba61569c565b5b906000526020600020906006020160000154600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018481548110610e2157610e2061569c565b5b906000526020600020906006020160020154600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018581548110610e8757610e8661569c565b5b906000526020600020906006020160010154611507565b82610ea99190615363565b91505b8080610eb7906155bc565b915050610c7c565b508092505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401549050919050565b60026001541415610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061523b565b60405180910390fd5b60026001819055506000610f6f33613058565b905060008111610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab9061507b565b60405180910390fd5b80600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110109190614de3565b60206040518083038186803b15801561102857600080fd5b505afa15801561103c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611060919061482e565b10156110a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611098906151db565b60405180910390fd5b80600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008282546110f39190615363565b92505081905550600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611157929190614e5e565b602060405180830381600087803b15801561117157600080fd5b505af1158015611185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a9919061471c565b505060018081905550565b6000808260400151905060008360600151905060008460800151905060008114156111dd574290505b60008560200151905060006201518085856111f89190615444565b61120291906153b9565b9050808061120f906155bc565b9150506000806201518086866112259190615444565b61122f91906153b9565b905060008390506000601e8510156113355784601e61124e9190615444565b83101561125d5782905061126d565b84601e61126a9190615444565b90505b6000600190505b8181116112f65760006103e88461128b91906153ea565b90506000601e9050600089905060008183856112a791906153b9565b6112b191906153ea565b90506103e8816112c191906153b9565b905080896112cf9190615363565b985086806112dc906155bc565b9750505050505080806112ee906155bc565b915050611274565b50601e85846113059190615363565b1115611330578581846113189190615444565b61132291906153ea565b8461132d9190615363565b93505b611344565b858361134191906153ea565b93505b839950505050505050505050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113b66131f4565b73ffffffffffffffffffffffffffffffffffffffff166113d4611f20565b73ffffffffffffffffffffffffffffffffffffffff161461142a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114219061515b565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6114766131f4565b73ffffffffffffffffffffffffffffffffffffffff16611494611f20565b73ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e19061515b565b60405180910390fd5b80600260006101000a81548160ff02191690831515021790555050565b600080600090506005841415611659576000600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b818110156116525786600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106115be576115bd61569c565b5b906000526020600020906006020160000154141561163f57600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001818154811061162a5761162961569c565b5b90600052602060002090600602016002015492505b808061164a906155bc565b915050611561565b505061165d565b8390505b60008190506000429050600062015181826116789190615363565b90506000811415611687574290505b6000869050600062015180858561169e9190615444565b6116a891906153b9565b905080806116b5906155bc565b9150506000806201518086866116cb9190615444565b6116d591906153b9565b905060008390506000601e8510156117db5784601e6116f49190615444565b83101561170357829050611713565b84601e6117109190615444565b90505b6000600190505b81811161179c5760006103e88461173191906153ea565b90506000601e90506000899050600081838561174d91906153b9565b61175791906153ea565b90506103e88161176791906153b9565b905080896117759190615363565b98508680611782906155bc565b975050505050508080611794906155bc565b91505061171a565b50601e85846117ab9190615363565b11156117d6578581846117be9190615444565b6117c891906153ea565b846117d39190615363565b93505b6117ea565b85836117e791906153ea565b93505b839a5050505050505050505050949350505050565b6118076131f4565b73ffffffffffffffffffffffffffffffffffffffff16611825611f20565b73ffffffffffffffffffffffffffffffffffffffff161461187b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118729061515b565b60405180910390fd5b61188560006131fc565b565b600b818154811061189757600080fd5b906000526020600020016000915090505481565b6118b36131f4565b73ffffffffffffffffffffffffffffffffffffffff166118d1611f20565b73ffffffffffffffffffffffffffffffffffffffff1614611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e9061515b565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119c19190614de3565b60206040518083038186803b1580156119d957600080fd5b505afa1580156119ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a11919061482e565b6040518363ffffffff1660e01b8152600401611a2e929190614e5e565b602060405180830381600087803b158015611a4857600080fd5b505af1158015611a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a80919061471c565b50565b60008060008086806020019051810190611a9d919061490a565b9250925092506000600187604051602001611ab89190614d95565b6040516020818303038152906040528051906020012085858560405160008152602001604052604051611aee9493929190614f40565b6020604051602081039080840390855afa158015611b10573d6000803e3d6000fd5b5050506020604051035190508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149450505050509392505050565b60026001541415611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b959061523b565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615611bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bed9061521b565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632bf2a10a336040518263ffffffff1660e01b8152600401611c519190614de3565b60206040518083038186803b158015611c6957600080fd5b505afa158015611c7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca1919061482e565b8151611cac33610eca565b611cb69190615444565b1015611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee9061517b565b60405180910390fd5b6000815111611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d32906151fb565b60405180910390fd5b611d453082612885565b611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b906151bb565b60405180910390fd5b611d8e33826108ee565b611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc4906150db565b60405180910390fd5b60008151905060005b81811015611f14576000838281518110611df357611df261569c565b5b60200260200101519050611e2133858481518110611e1457611e1361569c565b5b60200260200101516132c0565b60036000815480929190611e3490615561565b9190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611ece93929190614e27565b600060405180830381600087803b158015611ee857600080fd5b505af1158015611efc573d6000803e3d6000fd5b50505050508080611f0c906155bc565b915050611dd6565b50506001808190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600090505b600b80549050811015611fa25782600b8281548110611f7357611f7261569c565b5b90600052602060002001541415611f8f57600554915050611fbc565b8080611f9a906155bc565b915050611f51565b506107d08211611fb6576006549050611fbc565b60075490505b919050565b60606000611fce83610eca565b905060008167ffffffffffffffff811115611fec57611feb6156cb565b5b60405190808252806020026020018201604052801561201a5781602001602082028036833780820191505090505b5090506000600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b828110156121f6576000600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106120c6576120c561569c565b5b90600052602060002090600602016005015414801561214a57506000600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106121365761213561569c565b5b906000526020600020906006020160040154145b156121e357600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106121a3576121a261569c565b5b9060005260206000209060060201600001548483815181106121c8576121c761569c565b5b60200260200101818152505081806121df906155bc565b9250505b80806121ee906155bc565b915050612068565b5082945050505050919050565b61220b6131f4565b73ffffffffffffffffffffffffffffffffffffffff16612229611f20565b73ffffffffffffffffffffffffffffffffffffffff161461227f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122769061515b565b60405180910390fd5b80600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60026001541415612309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123009061523b565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615612361576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123589061521b565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b81526004016123be929190614dfe565b60206040518083038186803b1580156123d657600080fd5b505afa1580156123ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240e919061471c565b61244d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612444906150fb565b60405180910390fd5b6000845111612491576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124889061501b565b60405180910390fd5b61249b3385612885565b6124da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d19061503b565b60405180910390fd5b6124e383613694565b612522576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125199061505b565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661256583836130bc565b73ffffffffffffffffffffffffffffffffffffffff16146125bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b2906150bb565b60405180910390fd5b6000600460008481526020019081526020016000205414612611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126089061519b565b60405180910390fd5b6001600460008481526020019081526020016000208190555060008451905060005b8181101561285e5760008682815181106126505761264f61569c565b5b60200260200101519050600586838151811061266f5761266e61569c565b5b6020026020010151146126e3576126de336126a38985815181106126965761269561569c565b5b6020026020010151611f49565b8985815181106126b6576126b561569c565b5b60200260200101518986815181106126d1576126d061569c565b5b60200260200101516136f0565b61274f565b61274e3361270a8985815181106126fd576126fc61569c565b5b6020026020010151611f49565b89858151811061271d5761271c61569c565b5b60200260200101516127498b878151811061273b5761273a61569c565b5b60200260200101513361389b565b6136f0565b5b33600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906127b4906155bc565b9190505550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161281893929190614e27565b600060405180830381600087803b15801561283257600080fd5b505af1158015612846573d6000803e3d6000fd5b50505050508080612856906155bc565b915050612633565b50506001808190555050505050565b60046020528060005260406000206000915090505481565b600080600090505b82518110156129aa578373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8584815181106128fe576128fd61569c565b5b60200260200101516040518263ffffffff1660e01b8152600401612922919061525b565b60206040518083038186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297291906144bb565b73ffffffffffffffffffffffffffffffffffffffff16146129975760009150506129b0565b80806129a2906155bc565b91505061288d565b50600190505b92915050565b6129be6131f4565b73ffffffffffffffffffffffffffffffffffffffff166129dc611f20565b73ffffffffffffffffffffffffffffffffffffffff1614612a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a299061515b565b60405180910390fd5b60005b8151811015612a9457600b828281518110612a5357612a5261569c565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080612a8c906155bc565b915050612a35565b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401612b1d9190614de3565b60206040518083038186803b158015612b3557600080fd5b505afa158015612b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6d919061482e565b905060008167ffffffffffffffff811115612b8b57612b8a6156cb565b5b604051908082528060200260200182016040528015612bb95781602001602082028036833780820191505090505b509050600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2757600080fd5b505afa158015612c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5f919061482e565b90506000600190505b818111612d8f578673ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612ce1919061525b565b60206040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3191906144bb565b73ffffffffffffffffffffffffffffffffffffffff161415612d7c5780848481518110612d6157612d6061569c565b5b6020026020010181815250508280612d78906155bc565b9350505b8080612d87906155bc565b915050612c68565b5082945050505050919050565b612da46131f4565b73ffffffffffffffffffffffffffffffffffffffff16612dc2611f20565b73ffffffffffffffffffffffffffffffffffffffff1614612e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0f9061515b565b60405180910390fd5b826005819055508160068190555080600781905550505050565b612e3a6131f4565b73ffffffffffffffffffffffffffffffffffffffff16612e58611f20565b73ffffffffffffffffffffffffffffffffffffffff1614612eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea59061515b565b60405180910390fd5b60008151905060005b81811015613053576000838281518110612ed457612ed361569c565b5b60200260200101519050612ee83085612885565b612f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1e9061511b565b60405180910390fd5b60036000815480929190612f3a90615561565b91905055506000600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3083856040518463ffffffff1660e01b8152600401612fd693929190614e27565b600060405180830381600087803b158015612ff057600080fd5b505af1158015613004573d6000803e3d6000fd5b50505050600a600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050808061304b906155bc565b915050612eb7565b505050565b600080613064836139e4565b9050600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154816130b49190615444565b915050919050565b60006130c88383613bfb565b905092915050565b60035481565b6130de6131f4565b73ffffffffffffffffffffffffffffffffffffffff166130fc611f20565b73ffffffffffffffffffffffffffffffffffffffff1614613152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131499061515b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b990614ffb565b60405180910390fd5b6131cb816131fc565b50565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004015461330f9190615444565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055506000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b8181101561368e5782600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106133fc576133fb61569c565b5b90600052602060002090600602016000015414801561348057506000600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061346c5761346b61569c565b5b906000526020600020906006020160050154145b80156134f157506000600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106134dd576134dc61569c565b5b906000526020600020906006020160040154145b1561367b576135a7600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061354d5761354c61569c565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506111b4565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106135fb576135fa61569c565b5b90600052602060002090600602016005018190555042600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106136655761366461569c565b5b9060005260206000209060060201600401819055505b8080613686906155bc565b91505061339f565b50505050565b600080600090505b82518110156136e55760008382815181106136ba576136b961569c565b5b602002602001015114156136d25760009150506136eb565b80806136dd906155bc565b91505061369c565b50600190505b919050565b6136f8614202565b82816000018181525050818160400181815250504281606001818152505060008160800181815250508381602001818152505060008160a0018181525050600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819080600181540180825580915050600190039060005260206000209060060201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015550506001600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546138339190615363565b925050819055506001600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401600082825461388d9190615363565b925050819055505050505050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b828110156139d85785600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106139445761394361569c565b5b90600052602060002090600602016000015414156139c557600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106139b0576139af61569c565b5b90600052602060002090600602016002015491505b80806139d0906155bc565b9150506138e7565b50809250505092915050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015613bf0576000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613a8e57613a8d61569c565b5b9060005260206000209060060201600501541415613b6957613b57600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613afd57613afc61569c565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506111b4565b82613b629190615363565b9150613bdd565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110613bbd57613bbc61569c565b5b90600052602060002090600602016005015482613bda9190615363565b91505b8080613be8906155bc565b915050613a30565b508092505050919050565b600080613c0784613c1c565b9050613c138184613c76565b91505092915050565b6000613c6f7f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad27583604051602001613c54929190614f17565b60405160208183030381529060405280519060200120613c9d565b9050919050565b6000806000613c858585613cb7565b91509150613c9281613d3a565b819250505092915050565b6000613cb0613caa613f0f565b83614029565b9050919050565b600080604183511415613cf95760008060006020860151925060408601519150606086015160001a9050613ced8782858561405c565b94509450505050613d33565b604083511415613d2a576000806020850151915060408501519050613d1f868383614169565b935093505050613d33565b60006002915091505b9250929050565b60006004811115613d4e57613d4d61566d565b5b816004811115613d6157613d6061566d565b5b1415613d6c57613f0c565b60016004811115613d8057613d7f61566d565b5b816004811115613d9357613d9261566d565b5b1415613dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dcb90614fbb565b60405180910390fd5b60026004811115613de857613de761566d565b5b816004811115613dfb57613dfa61566d565b5b1415613e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e3390614fdb565b60405180910390fd5b60036004811115613e5057613e4f61566d565b5b816004811115613e6357613e6261566d565b5b1415613ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e9b9061509b565b60405180910390fd5b600480811115613eb757613eb661566d565b5b816004811115613eca57613ec961566d565b5b1415613f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f029061513b565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015613f8b57507f000000000000000000000000000000000000000000000000000000000000000046145b15613fb8577f00000000000000000000000000000000000000000000000000000000000000009050614026565b6140237f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006141c8565b90505b90565b6000828260405160200161403e929190614dac565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614097576000600391509150614160565b601b8560ff16141580156140af5750601c8560ff1614155b156140c1576000600491509150614160565b6000600187878787604051600081526020016040526040516140e69493929190614f40565b6020604051602081039080840390855afa158015614108573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561415757600060019250925050614160565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6141ac9190615363565b90506141ba8782888561405c565b935093505050935093915050565b600083838346306040516020016141e3959493929190614ec4565b6040516020818303038152906040528051906020012090509392505050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600061424b6142468461529b565b615276565b9050808382526020820190508285602086028201111561426e5761426d615704565b5b60005b8581101561429e5781614284888261444f565b845260208401935060208301925050600181019050614271565b5050509392505050565b60006142bb6142b6846152c7565b615276565b9050828152602081018484840111156142d7576142d6615709565b5b6142e284828561551f565b509392505050565b6000813590506142f981615bdf565b92915050565b60008151905061430e81615bdf565b92915050565b600082601f830112614329576143286156fa565b5b8135614339848260208601614238565b91505092915050565b60008135905061435181615bf6565b92915050565b60008151905061436681615bf6565b92915050565b60008151905061437b81615c0d565b92915050565b600082601f830112614396576143956156fa565b5b81356143a68482602086016142a8565b91505092915050565b600060c082840312156143c5576143c46156ff565b5b6143cf60c0615276565b905060006143df8482850161444f565b60008301525060206143f38482850161444f565b60208301525060406144078482850161444f565b604083015250606061441b8482850161444f565b606083015250608061442f8482850161444f565b60808301525060a06144438482850161444f565b60a08301525092915050565b60008135905061445e81615c24565b92915050565b60008151905061447381615c24565b92915050565b60008151905061448881615c3b565b92915050565b6000602082840312156144a4576144a3615713565b5b60006144b2848285016142ea565b91505092915050565b6000602082840312156144d1576144d0615713565b5b60006144df848285016142ff565b91505092915050565b600080604083850312156144ff576144fe615713565b5b600061450d858286016142ea565b925050602083013567ffffffffffffffff81111561452e5761452d61570e565b5b61453a85828601614314565b9150509250929050565b6000806040838503121561455b5761455a615713565b5b6000614569858286016142ea565b925050602061457a8582860161444f565b9150509250929050565b6000806000806080858703121561459e5761459d615713565b5b60006145ac878288016142ea565b94505060206145bd8782880161444f565b93505060406145ce8782880161444f565b92505060606145df8782880161444f565b91505092959194509250565b60006020828403121561460157614600615713565b5b600082013567ffffffffffffffff81111561461f5761461e61570e565b5b61462b84828501614314565b91505092915050565b6000806000806080858703121561464e5761464d615713565b5b600085013567ffffffffffffffff81111561466c5761466b61570e565b5b61467887828801614314565b945050602085013567ffffffffffffffff8111156146995761469861570e565b5b6146a587828801614314565b93505060406146b68782880161444f565b925050606085013567ffffffffffffffff8111156146d7576146d661570e565b5b6146e387828801614381565b91505092959194509250565b60006020828403121561470557614704615713565b5b600061471384828501614342565b91505092915050565b60006020828403121561473257614731615713565b5b600061474084828501614357565b91505092915050565b60008060006060848603121561476257614761615713565b5b600084013567ffffffffffffffff8111156147805761477f61570e565b5b61478c86828701614381565b935050602084013567ffffffffffffffff8111156147ad576147ac61570e565b5b6147b986828701614381565b92505060406147ca868287016142ea565b9150509250925092565b600060c082840312156147ea576147e9615713565b5b60006147f8848285016143af565b91505092915050565b60006020828403121561481757614816615713565b5b60006148258482850161444f565b91505092915050565b60006020828403121561484457614843615713565b5b600061485284828501614464565b91505092915050565b6000806040838503121561487257614871615713565b5b60006148808582860161444f565b925050602083013567ffffffffffffffff8111156148a1576148a061570e565b5b6148ad85828601614381565b9150509250929050565b6000806000606084860312156148d0576148cf615713565b5b60006148de8682870161444f565b93505060206148ef8682870161444f565b92505060406149008682870161444f565b9150509250925092565b60008060006060848603121561492357614922615713565b5b600061493186828701614479565b93505060206149428682870161436c565b92505060406149538682870161436c565b9150509250925092565b60006149698383614d68565b60208301905092915050565b61497e81615478565b82525050565b600061498f82615308565b614999818561532b565b93506149a4836152f8565b8060005b838110156149d55781516149bc888261495d565b97506149c78361531e565b9250506001810190506149a8565b5085935050505092915050565b6149eb8161548a565b82525050565b6149fa81615496565b82525050565b614a11614a0c82615496565b615605565b82525050565b6000614a2282615313565b614a2c818561533c565b9350614a3c81856020860161552e565b80840191505092915050565b614a51816154d7565b82525050565b614a60816154e9565b82525050565b6000614a73601883615347565b9150614a7e82615729565b602082019050919050565b6000614a96601f83615347565b9150614aa182615752565b602082019050919050565b6000614ab9602683615347565b9150614ac48261577b565b604082019050919050565b6000614adc601b83615347565b9150614ae7826157ca565b602082019050919050565b6000614aff600283615358565b9150614b0a826157f3565b600282019050919050565b6000614b22602383615347565b9150614b2d8261581c565b604082019050919050565b6000614b45601483615347565b9150614b508261586b565b602082019050919050565b6000614b68600c83615347565b9150614b7382615894565b602082019050919050565b6000614b8b602283615347565b9150614b96826158bd565b604082019050919050565b6000614bae602d83615347565b9150614bb98261590c565b604082019050919050565b6000614bd1601b83615347565b9150614bdc8261595b565b602082019050919050565b6000614bf4601783615347565b9150614bff82615984565b602082019050919050565b6000614c17602183615347565b9150614c22826159ad565b604082019050919050565b6000614c3a602283615347565b9150614c45826159fc565b604082019050919050565b6000614c5d602083615347565b9150614c6882615a4b565b602082019050919050565b6000614c80601a83615347565b9150614c8b82615a74565b602082019050919050565b6000614ca3601b83615347565b9150614cae82615a9d565b602082019050919050565b6000614cc6602683615347565b9150614cd182615ac6565b604082019050919050565b6000614ce9602c83615347565b9150614cf482615b15565b604082019050919050565b6000614d0c601583615347565b9150614d1782615b64565b602082019050919050565b6000614d2f601283615347565b9150614d3a82615b8d565b602082019050919050565b6000614d52601f83615347565b9150614d5d82615bb6565b602082019050919050565b614d71816154c0565b82525050565b614d80816154c0565b82525050565b614d8f816154ca565b82525050565b6000614da18284614a17565b915081905092915050565b6000614db782614af2565b9150614dc38285614a00565b602082019150614dd38284614a00565b6020820191508190509392505050565b6000602082019050614df86000830184614975565b92915050565b6000604082019050614e136000830185614975565b614e206020830184614975565b9392505050565b6000606082019050614e3c6000830186614975565b614e496020830185614975565b614e566040830184614d77565b949350505050565b6000604082019050614e736000830185614975565b614e806020830184614d77565b9392505050565b60006020820190508181036000830152614ea18184614984565b905092915050565b6000602082019050614ebe60008301846149e2565b92915050565b600060a082019050614ed960008301886149f1565b614ee660208301876149f1565b614ef360408301866149f1565b614f006060830185614d77565b614f0d6080830184614975565b9695505050505050565b6000604082019050614f2c60008301856149f1565b614f396020830184614d77565b9392505050565b6000608082019050614f5560008301876149f1565b614f626020830186614d86565b614f6f60408301856149f1565b614f7c60608301846149f1565b95945050505050565b6000602082019050614f9a6000830184614a48565b92915050565b6000602082019050614fb56000830184614a57565b92915050565b60006020820190508181036000830152614fd481614a66565b9050919050565b60006020820190508181036000830152614ff481614a89565b9050919050565b6000602082019050818103600083015261501481614aac565b9050919050565b6000602082019050818103600083015261503481614acf565b9050919050565b6000602082019050818103600083015261505481614b15565b9050919050565b6000602082019050818103600083015261507481614b38565b9050919050565b6000602082019050818103600083015261509481614b5b565b9050919050565b600060208201905081810360008301526150b481614b7e565b9050919050565b600060208201905081810360008301526150d481614ba1565b9050919050565b600060208201905081810360008301526150f481614bc4565b9050919050565b6000602082019050818103600083015261511481614be7565b9050919050565b6000602082019050818103600083015261513481614c0a565b9050919050565b6000602082019050818103600083015261515481614c2d565b9050919050565b6000602082019050818103600083015261517481614c50565b9050919050565b6000602082019050818103600083015261519481614c73565b9050919050565b600060208201905081810360008301526151b481614c96565b9050919050565b600060208201905081810360008301526151d481614cb9565b9050919050565b600060208201905081810360008301526151f481614cdc565b9050919050565b6000602082019050818103600083015261521481614cff565b9050919050565b6000602082019050818103600083015261523481614d22565b9050919050565b6000602082019050818103600083015261525481614d45565b9050919050565b60006020820190506152706000830184614d77565b92915050565b6000615280615291565b905061528c828261558b565b919050565b6000604051905090565b600067ffffffffffffffff8211156152b6576152b56156cb565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152e2576152e16156cb565b5b6152eb82615718565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061536e826154c0565b9150615379836154c0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153ae576153ad61560f565b5b828201905092915050565b60006153c4826154c0565b91506153cf836154c0565b9250826153df576153de61563e565b5b828204905092915050565b60006153f5826154c0565b9150615400836154c0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154395761543861560f565b5b828202905092915050565b600061544f826154c0565b915061545a836154c0565b92508282101561546d5761546c61560f565b5b828203905092915050565b6000615483826154a0565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006154e2826154fb565b9050919050565b60006154f4826154fb565b9050919050565b60006155068261550d565b9050919050565b6000615518826154a0565b9050919050565b82818337600083830152505050565b60005b8381101561554c578082015181840152602081019050615531565b8381111561555b576000848401525b50505050565b600061556c826154c0565b915060008214156155805761557f61560f565b5b600182039050919050565b61559482615718565b810181811067ffffffffffffffff821117156155b3576155b26156cb565b5b80604052505050565b60006155c7826154c0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155fa576155f961560f565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f30204e656f706879746520746f2073656e6420746f20636c6173730000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f596f7520617265206e6f74206f776e6572206f662074686973204e656f70687960008201527f74652e0000000000000000000000000000000000000000000000000000000000602082015250565b7f536f6d657468696e672077656e742077726f6e67000000000000000000000000600082015250565b7f5a65726f20526577617264730000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f536f72727920536f6d657468696e672069732077726f6e67207769746820746860008201527f6520656e6372797074696f6e2e00000000000000000000000000000000000000602082015250565b7f796f7520646f6e2774206f776e2074686973204e656f70687974650000000000600082015250565b7f417070726f7665204e656f706879746573204669727374000000000000000000600082015250565b7f6e6674206e6f7420617661696c61626c6520696e2074686520636f6e7472616360008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f506c656173652072656c6561736520526f6f6d73206669727374000000000000600082015250565b7f496e76616c696420566f75636865722e2054727920416761696e2e0000000000600082015250565b7f4e656f7068797465206e6f7420617661696c61626c6520696e2074686520636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820726560008201527f7761726420546f6b656e732e0000000000000000000000000000000000000000602082015250565b7f30204e656f706879746520746f2072656c656173650000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615be881615478565b8114615bf357600080fd5b50565b615bff8161548a565b8114615c0a57600080fd5b50565b615c1681615496565b8114615c2157600080fd5b50565b615c2d816154c0565b8114615c3857600080fd5b50565b615c44816154ca565b8114615c4f57600080fd5b5056fea26469706673582212207406b874d8bec7ae0fb6c263ca07c002ff05f7d66fb641f130825e9f65aede1f64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c80638d03c3b611610125578063c26f9404116100ad578063da40ef801161007c578063da40ef8014610646578063e57deb3914610676578063f191743c146106a6578063f2fde38b146106c4578063f7c618c1146106e057610211565b8063c26f9404146105c0578063c9bc0a9a146105de578063ce85b6ef1461060e578063d8834b651461062a57610211565b80639a6acf20116100f45780639a6acf201461050c578063a8d77db314610528578063ab34ee4f14610544578063b5bb2b0614610574578063b773bf5e146105a457610211565b80638d03c3b6146104725780638da5cb5b1461048e57806391a7e0a7146104ac57806393545272146104dc57610211565b806347ccca02116101a85780636fe08746116101775780636fe08746146103ce578063715018a6146103fe578063722a10ac1461040857806372a8569114610438578063786568da1461044257610211565b806347ccca02146103485780634884254a146103665780634fee928e1461039657806357d159c6146103b257610211565b80631bfff8ac116101e45780631bfff8ac146102ae5780632bf2a10a146102de578063372500ab1461030e57806342265f9a1461031857610211565b806306b091f9146102165780630b102d1a146102325780630fb979a11461024e57806317afaee71461027e575b600080fd5b610230600480360381019061022b9190614544565b6106fe565b005b61024c6004803603810190610247919061448e565b61082e565b005b610268600480360381019061026391906144e8565b6108ee565b6040516102759190614ea9565b60405180910390f35b6102986004803603810190610293919061448e565b6109a8565b6040516102a5919061525b565b60405180910390f35b6102c860048036038101906102c3919061448e565b610c30565b6040516102d5919061525b565b60405180910390f35b6102f860048036038101906102f3919061448e565b610eca565b604051610305919061525b565b60405180910390f35b610316610f16565b005b610332600480360381019061032d91906147d4565b6111b4565b60405161033f919061525b565b60405180910390f35b610350611355565b60405161035d9190614fa0565b60405180910390f35b610380600480360381019061037b9190614801565b61137b565b60405161038d9190614de3565b60405180910390f35b6103b060048036038101906103ab919061448e565b6113ae565b005b6103cc60048036038101906103c791906146ef565b61146e565b005b6103e860048036038101906103e39190614584565b611507565b6040516103f5919061525b565b60405180910390f35b6104066117ff565b005b610422600480360381019061041d9190614801565b611887565b60405161042f919061525b565b60405180910390f35b6104406118ab565b005b61045c60048036038101906104579190614749565b611a83565b6040516104699190614ea9565b60405180910390f35b61048c600480360381019061048791906145eb565b611b58565b005b610496611f20565b6040516104a39190614de3565b60405180910390f35b6104c660048036038101906104c19190614801565b611f49565b6040516104d3919061525b565b60405180910390f35b6104f660048036038101906104f1919061448e565b611fc1565b6040516105039190614e87565b60405180910390f35b6105266004803603810190610521919061448e565b612203565b005b610542600480360381019061053d9190614634565b6122c3565b005b61055e60048036038101906105599190614801565b61286d565b60405161056b919061525b565b60405180910390f35b61058e600480360381019061058991906144e8565b612885565b60405161059b9190614ea9565b60405180910390f35b6105be60048036038101906105b991906145eb565b6129b6565b005b6105c8612a98565b6040516105d59190614fa0565b60405180910390f35b6105f860048036038101906105f3919061448e565b612abe565b6040516106059190614e87565b60405180910390f35b610628600480360381019061062391906148b7565b612d9c565b005b610644600480360381019061063f91906145eb565b612e32565b005b610660600480360381019061065b919061448e565b613058565b60405161066d919061525b565b60405180910390f35b610690600480360381019061068b919061485b565b6130bc565b60405161069d9190614de3565b60405180910390f35b6106ae6130d0565b6040516106bb919061525b565b60405180910390f35b6106de60048036038101906106d9919061448e565b6130d6565b005b6106e86131ce565b6040516106f59190614f85565b60405180910390f35b6107066131f4565b73ffffffffffffffffffffffffffffffffffffffff16610724611f20565b73ffffffffffffffffffffffffffffffffffffffff161461077a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107719061515b565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016107d7929190614e5e565b602060405180830381600087803b1580156107f157600080fd5b505af1158015610805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610829919061471c565b505050565b6108366131f4565b73ffffffffffffffffffffffffffffffffffffffff16610854611f20565b73ffffffffffffffffffffffffffffffffffffffff16146108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a19061515b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600090505b825181101561099c578373ffffffffffffffffffffffffffffffffffffffff16600a600085848151811061092d5761092c61569c565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109895760009150506109a2565b8080610994906155bc565b9150506108f6565b50600190505b92915050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610c25576000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610a5257610a5161569c565b5b906000526020600020906006020160050154148015610ad657506000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610ac257610ac161569c565b5b906000526020600020906006020160040154145b15610b9e57610b8c600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610b3257610b3161569c565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506111b4565b82610b979190615363565b9150610c12565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110610bf257610bf161569c565b5b90600052602060002090600602016005015482610c0f9190615363565b91505b8080610c1d906155bc565b9150506109f4565b508092505050919050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015610ebf576000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610cda57610cd961569c565b5b906000526020600020906006020160050154148015610d5e57506000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110610d4a57610d4961569c565b5b906000526020600020906006020160040154145b15610eac57610e9e85600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018381548110610dbb57610dba61569c565b5b906000526020600020906006020160000154600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018481548110610e2157610e2061569c565b5b906000526020600020906006020160020154600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018581548110610e8757610e8661569c565b5b906000526020600020906006020160010154611507565b82610ea99190615363565b91505b8080610eb7906155bc565b915050610c7c565b508092505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401549050919050565b60026001541415610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061523b565b60405180910390fd5b60026001819055506000610f6f33613058565b905060008111610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab9061507b565b60405180910390fd5b80600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110109190614de3565b60206040518083038186803b15801561102857600080fd5b505afa15801561103c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611060919061482e565b10156110a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611098906151db565b60405180910390fd5b80600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008282546110f39190615363565b92505081905550600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611157929190614e5e565b602060405180830381600087803b15801561117157600080fd5b505af1158015611185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a9919061471c565b505060018081905550565b6000808260400151905060008360600151905060008460800151905060008114156111dd574290505b60008560200151905060006201518085856111f89190615444565b61120291906153b9565b9050808061120f906155bc565b9150506000806201518086866112259190615444565b61122f91906153b9565b905060008390506000601e8510156113355784601e61124e9190615444565b83101561125d5782905061126d565b84601e61126a9190615444565b90505b6000600190505b8181116112f65760006103e88461128b91906153ea565b90506000601e9050600089905060008183856112a791906153b9565b6112b191906153ea565b90506103e8816112c191906153b9565b905080896112cf9190615363565b985086806112dc906155bc565b9750505050505080806112ee906155bc565b915050611274565b50601e85846113059190615363565b1115611330578581846113189190615444565b61132291906153ea565b8461132d9190615363565b93505b611344565b858361134191906153ea565b93505b839950505050505050505050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113b66131f4565b73ffffffffffffffffffffffffffffffffffffffff166113d4611f20565b73ffffffffffffffffffffffffffffffffffffffff161461142a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114219061515b565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6114766131f4565b73ffffffffffffffffffffffffffffffffffffffff16611494611f20565b73ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e19061515b565b60405180910390fd5b80600260006101000a81548160ff02191690831515021790555050565b600080600090506005841415611659576000600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b818110156116525786600d60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106115be576115bd61569c565b5b906000526020600020906006020160000154141561163f57600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001818154811061162a5761162961569c565b5b90600052602060002090600602016002015492505b808061164a906155bc565b915050611561565b505061165d565b8390505b60008190506000429050600062015181826116789190615363565b90506000811415611687574290505b6000869050600062015180858561169e9190615444565b6116a891906153b9565b905080806116b5906155bc565b9150506000806201518086866116cb9190615444565b6116d591906153b9565b905060008390506000601e8510156117db5784601e6116f49190615444565b83101561170357829050611713565b84601e6117109190615444565b90505b6000600190505b81811161179c5760006103e88461173191906153ea565b90506000601e90506000899050600081838561174d91906153b9565b61175791906153ea565b90506103e88161176791906153b9565b905080896117759190615363565b98508680611782906155bc565b975050505050508080611794906155bc565b91505061171a565b50601e85846117ab9190615363565b11156117d6578581846117be9190615444565b6117c891906153ea565b846117d39190615363565b93505b6117ea565b85836117e791906153ea565b93505b839a5050505050505050505050949350505050565b6118076131f4565b73ffffffffffffffffffffffffffffffffffffffff16611825611f20565b73ffffffffffffffffffffffffffffffffffffffff161461187b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118729061515b565b60405180910390fd5b61188560006131fc565b565b600b818154811061189757600080fd5b906000526020600020016000915090505481565b6118b36131f4565b73ffffffffffffffffffffffffffffffffffffffff166118d1611f20565b73ffffffffffffffffffffffffffffffffffffffff1614611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e9061515b565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119c19190614de3565b60206040518083038186803b1580156119d957600080fd5b505afa1580156119ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a11919061482e565b6040518363ffffffff1660e01b8152600401611a2e929190614e5e565b602060405180830381600087803b158015611a4857600080fd5b505af1158015611a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a80919061471c565b50565b60008060008086806020019051810190611a9d919061490a565b9250925092506000600187604051602001611ab89190614d95565b6040516020818303038152906040528051906020012085858560405160008152602001604052604051611aee9493929190614f40565b6020604051602081039080840390855afa158015611b10573d6000803e3d6000fd5b5050506020604051035190508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149450505050509392505050565b60026001541415611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b959061523b565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615611bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bed9061521b565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632bf2a10a336040518263ffffffff1660e01b8152600401611c519190614de3565b60206040518083038186803b158015611c6957600080fd5b505afa158015611c7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca1919061482e565b8151611cac33610eca565b611cb69190615444565b1015611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee9061517b565b60405180910390fd5b6000815111611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d32906151fb565b60405180910390fd5b611d453082612885565b611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b906151bb565b60405180910390fd5b611d8e33826108ee565b611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc4906150db565b60405180910390fd5b60008151905060005b81811015611f14576000838281518110611df357611df261569c565b5b60200260200101519050611e2133858481518110611e1457611e1361569c565b5b60200260200101516132c0565b60036000815480929190611e3490615561565b9190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401611ece93929190614e27565b600060405180830381600087803b158015611ee857600080fd5b505af1158015611efc573d6000803e3d6000fd5b50505050508080611f0c906155bc565b915050611dd6565b50506001808190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600090505b600b80549050811015611fa25782600b8281548110611f7357611f7261569c565b5b90600052602060002001541415611f8f57600554915050611fbc565b8080611f9a906155bc565b915050611f51565b506107d08211611fb6576006549050611fbc565b60075490505b919050565b60606000611fce83610eca565b905060008167ffffffffffffffff811115611fec57611feb6156cb565b5b60405190808252806020026020018201604052801561201a5781602001602082028036833780820191505090505b5090506000600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b828110156121f6576000600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106120c6576120c561569c565b5b90600052602060002090600602016005015414801561214a57506000600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106121365761213561569c565b5b906000526020600020906006020160040154145b156121e357600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106121a3576121a261569c565b5b9060005260206000209060060201600001548483815181106121c8576121c761569c565b5b60200260200101818152505081806121df906155bc565b9250505b80806121ee906155bc565b915050612068565b5082945050505050919050565b61220b6131f4565b73ffffffffffffffffffffffffffffffffffffffff16612229611f20565b73ffffffffffffffffffffffffffffffffffffffff161461227f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122769061515b565b60405180910390fd5b80600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60026001541415612309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123009061523b565b60405180910390fd5b6002600181905550600260009054906101000a900460ff1615612361576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123589061521b565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b81526004016123be929190614dfe565b60206040518083038186803b1580156123d657600080fd5b505afa1580156123ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240e919061471c565b61244d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612444906150fb565b60405180910390fd5b6000845111612491576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124889061501b565b60405180910390fd5b61249b3385612885565b6124da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d19061503b565b60405180910390fd5b6124e383613694565b612522576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125199061505b565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661256583836130bc565b73ffffffffffffffffffffffffffffffffffffffff16146125bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b2906150bb565b60405180910390fd5b6000600460008481526020019081526020016000205414612611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126089061519b565b60405180910390fd5b6001600460008481526020019081526020016000208190555060008451905060005b8181101561285e5760008682815181106126505761264f61569c565b5b60200260200101519050600586838151811061266f5761266e61569c565b5b6020026020010151146126e3576126de336126a38985815181106126965761269561569c565b5b6020026020010151611f49565b8985815181106126b6576126b561569c565b5b60200260200101518986815181106126d1576126d061569c565b5b60200260200101516136f0565b61274f565b61274e3361270a8985815181106126fd576126fc61569c565b5b6020026020010151611f49565b89858151811061271d5761271c61569c565b5b60200260200101516127498b878151811061273b5761273a61569c565b5b60200260200101513361389b565b6136f0565b5b33600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906127b4906155bc565b9190505550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161281893929190614e27565b600060405180830381600087803b15801561283257600080fd5b505af1158015612846573d6000803e3d6000fd5b50505050508080612856906155bc565b915050612633565b50506001808190555050505050565b60046020528060005260406000206000915090505481565b600080600090505b82518110156129aa578373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8584815181106128fe576128fd61569c565b5b60200260200101516040518263ffffffff1660e01b8152600401612922919061525b565b60206040518083038186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297291906144bb565b73ffffffffffffffffffffffffffffffffffffffff16146129975760009150506129b0565b80806129a2906155bc565b91505061288d565b50600190505b92915050565b6129be6131f4565b73ffffffffffffffffffffffffffffffffffffffff166129dc611f20565b73ffffffffffffffffffffffffffffffffffffffff1614612a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a299061515b565b60405180910390fd5b60005b8151811015612a9457600b828281518110612a5357612a5261569c565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080612a8c906155bc565b915050612a35565b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401612b1d9190614de3565b60206040518083038186803b158015612b3557600080fd5b505afa158015612b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6d919061482e565b905060008167ffffffffffffffff811115612b8b57612b8a6156cb565b5b604051908082528060200260200182016040528015612bb95781602001602082028036833780820191505090505b509050600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c2757600080fd5b505afa158015612c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5f919061482e565b90506000600190505b818111612d8f578673ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612ce1919061525b565b60206040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3191906144bb565b73ffffffffffffffffffffffffffffffffffffffff161415612d7c5780848481518110612d6157612d6061569c565b5b6020026020010181815250508280612d78906155bc565b9350505b8080612d87906155bc565b915050612c68565b5082945050505050919050565b612da46131f4565b73ffffffffffffffffffffffffffffffffffffffff16612dc2611f20565b73ffffffffffffffffffffffffffffffffffffffff1614612e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0f9061515b565b60405180910390fd5b826005819055508160068190555080600781905550505050565b612e3a6131f4565b73ffffffffffffffffffffffffffffffffffffffff16612e58611f20565b73ffffffffffffffffffffffffffffffffffffffff1614612eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea59061515b565b60405180910390fd5b60008151905060005b81811015613053576000838281518110612ed457612ed361569c565b5b60200260200101519050612ee83085612885565b612f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1e9061511b565b60405180910390fd5b60036000815480929190612f3a90615561565b91905055506000600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3083856040518463ffffffff1660e01b8152600401612fd693929190614e27565b600060405180830381600087803b158015612ff057600080fd5b505af1158015613004573d6000803e3d6000fd5b50505050600a600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050808061304b906155bc565b915050612eb7565b505050565b600080613064836139e4565b9050600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154816130b49190615444565b915050919050565b60006130c88383613bfb565b905092915050565b60035481565b6130de6131f4565b73ffffffffffffffffffffffffffffffffffffffff166130fc611f20565b73ffffffffffffffffffffffffffffffffffffffff1614613152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131499061515b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b990614ffb565b60405180910390fd5b6131cb816131fc565b50565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004015461330f9190615444565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055506000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060005b8181101561368e5782600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106133fc576133fb61569c565b5b90600052602060002090600602016000015414801561348057506000600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061346c5761346b61569c565b5b906000526020600020906006020160050154145b80156134f157506000600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106134dd576134dc61569c565b5b906000526020600020906006020160040154145b1561367b576135a7600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061354d5761354c61569c565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506111b4565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106135fb576135fa61569c565b5b90600052602060002090600602016005018190555042600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106136655761366461569c565b5b9060005260206000209060060201600401819055505b8080613686906155bc565b91505061339f565b50505050565b600080600090505b82518110156136e55760008382815181106136ba576136b961569c565b5b602002602001015114156136d25760009150506136eb565b80806136dd906155bc565b91505061369c565b50600190505b919050565b6136f8614202565b82816000018181525050818160400181815250504281606001818152505060008160800181815250508381602001818152505060008160a0018181525050600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819080600181540180825580915050600190039060005260206000209060060201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015550506001600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546138339190615363565b925050819055506001600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401600082825461388d9190615363565b925050819055505050505050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b828110156139d85785600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106139445761394361569c565b5b90600052602060002090600602016000015414156139c557600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181815481106139b0576139af61569c565b5b90600052602060002090600602016002015491505b80806139d0906155bc565b9150506138e7565b50809250505092915050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000805b82811015613bf0576000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613a8e57613a8d61569c565b5b9060005260206000209060060201600501541415613b6957613b57600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018281548110613afd57613afc61569c565b5b90600052602060002090600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250506111b4565b82613b629190615363565b9150613bdd565b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018181548110613bbd57613bbc61569c565b5b90600052602060002090600602016005015482613bda9190615363565b91505b8080613be8906155bc565b915050613a30565b508092505050919050565b600080613c0784613c1c565b9050613c138184613c76565b91505092915050565b6000613c6f7f092b584b565f9711d79732cb738ace6cf7a206eb6277470732d92d8cc83ad27583604051602001613c54929190614f17565b60405160208183030381529060405280519060200120613c9d565b9050919050565b6000806000613c858585613cb7565b91509150613c9281613d3a565b819250505092915050565b6000613cb0613caa613f0f565b83614029565b9050919050565b600080604183511415613cf95760008060006020860151925060408601519150606086015160001a9050613ced8782858561405c565b94509450505050613d33565b604083511415613d2a576000806020850151915060408501519050613d1f868383614169565b935093505050613d33565b60006002915091505b9250929050565b60006004811115613d4e57613d4d61566d565b5b816004811115613d6157613d6061566d565b5b1415613d6c57613f0c565b60016004811115613d8057613d7f61566d565b5b816004811115613d9357613d9261566d565b5b1415613dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dcb90614fbb565b60405180910390fd5b60026004811115613de857613de761566d565b5b816004811115613dfb57613dfa61566d565b5b1415613e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e3390614fdb565b60405180910390fd5b60036004811115613e5057613e4f61566d565b5b816004811115613e6357613e6261566d565b5b1415613ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e9b9061509b565b60405180910390fd5b600480811115613eb757613eb661566d565b5b816004811115613eca57613ec961566d565b5b1415613f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f029061513b565b60405180910390fd5b5b50565b60007f0000000000000000000000005ab7d384a3fb40a5d2b6231d973456894890c12573ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015613f8b57507f000000000000000000000000000000000000000000000000000000000000000146145b15613fb8577fcefe26d3f51200d2b4357092a8a4dcd06920322598ce00a77fcebdae3b59b8319050614026565b6140237f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fff2482e359c85257fce2d1c26524268866db6bce9ba4a51357f2523068861c027fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66141c8565b90505b90565b6000828260405160200161403e929190614dac565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614097576000600391509150614160565b601b8560ff16141580156140af5750601c8560ff1614155b156140c1576000600491509150614160565b6000600187878787604051600081526020016040526040516140e69493929190614f40565b6020604051602081039080840390855afa158015614108573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561415757600060019250925050614160565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6141ac9190615363565b90506141ba8782888561405c565b935093505050935093915050565b600083838346306040516020016141e3959493929190614ec4565b6040516020818303038152906040528051906020012090509392505050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600061424b6142468461529b565b615276565b9050808382526020820190508285602086028201111561426e5761426d615704565b5b60005b8581101561429e5781614284888261444f565b845260208401935060208301925050600181019050614271565b5050509392505050565b60006142bb6142b6846152c7565b615276565b9050828152602081018484840111156142d7576142d6615709565b5b6142e284828561551f565b509392505050565b6000813590506142f981615bdf565b92915050565b60008151905061430e81615bdf565b92915050565b600082601f830112614329576143286156fa565b5b8135614339848260208601614238565b91505092915050565b60008135905061435181615bf6565b92915050565b60008151905061436681615bf6565b92915050565b60008151905061437b81615c0d565b92915050565b600082601f830112614396576143956156fa565b5b81356143a68482602086016142a8565b91505092915050565b600060c082840312156143c5576143c46156ff565b5b6143cf60c0615276565b905060006143df8482850161444f565b60008301525060206143f38482850161444f565b60208301525060406144078482850161444f565b604083015250606061441b8482850161444f565b606083015250608061442f8482850161444f565b60808301525060a06144438482850161444f565b60a08301525092915050565b60008135905061445e81615c24565b92915050565b60008151905061447381615c24565b92915050565b60008151905061448881615c3b565b92915050565b6000602082840312156144a4576144a3615713565b5b60006144b2848285016142ea565b91505092915050565b6000602082840312156144d1576144d0615713565b5b60006144df848285016142ff565b91505092915050565b600080604083850312156144ff576144fe615713565b5b600061450d858286016142ea565b925050602083013567ffffffffffffffff81111561452e5761452d61570e565b5b61453a85828601614314565b9150509250929050565b6000806040838503121561455b5761455a615713565b5b6000614569858286016142ea565b925050602061457a8582860161444f565b9150509250929050565b6000806000806080858703121561459e5761459d615713565b5b60006145ac878288016142ea565b94505060206145bd8782880161444f565b93505060406145ce8782880161444f565b92505060606145df8782880161444f565b91505092959194509250565b60006020828403121561460157614600615713565b5b600082013567ffffffffffffffff81111561461f5761461e61570e565b5b61462b84828501614314565b91505092915050565b6000806000806080858703121561464e5761464d615713565b5b600085013567ffffffffffffffff81111561466c5761466b61570e565b5b61467887828801614314565b945050602085013567ffffffffffffffff8111156146995761469861570e565b5b6146a587828801614314565b93505060406146b68782880161444f565b925050606085013567ffffffffffffffff8111156146d7576146d661570e565b5b6146e387828801614381565b91505092959194509250565b60006020828403121561470557614704615713565b5b600061471384828501614342565b91505092915050565b60006020828403121561473257614731615713565b5b600061474084828501614357565b91505092915050565b60008060006060848603121561476257614761615713565b5b600084013567ffffffffffffffff8111156147805761477f61570e565b5b61478c86828701614381565b935050602084013567ffffffffffffffff8111156147ad576147ac61570e565b5b6147b986828701614381565b92505060406147ca868287016142ea565b9150509250925092565b600060c082840312156147ea576147e9615713565b5b60006147f8848285016143af565b91505092915050565b60006020828403121561481757614816615713565b5b60006148258482850161444f565b91505092915050565b60006020828403121561484457614843615713565b5b600061485284828501614464565b91505092915050565b6000806040838503121561487257614871615713565b5b60006148808582860161444f565b925050602083013567ffffffffffffffff8111156148a1576148a061570e565b5b6148ad85828601614381565b9150509250929050565b6000806000606084860312156148d0576148cf615713565b5b60006148de8682870161444f565b93505060206148ef8682870161444f565b92505060406149008682870161444f565b9150509250925092565b60008060006060848603121561492357614922615713565b5b600061493186828701614479565b93505060206149428682870161436c565b92505060406149538682870161436c565b9150509250925092565b60006149698383614d68565b60208301905092915050565b61497e81615478565b82525050565b600061498f82615308565b614999818561532b565b93506149a4836152f8565b8060005b838110156149d55781516149bc888261495d565b97506149c78361531e565b9250506001810190506149a8565b5085935050505092915050565b6149eb8161548a565b82525050565b6149fa81615496565b82525050565b614a11614a0c82615496565b615605565b82525050565b6000614a2282615313565b614a2c818561533c565b9350614a3c81856020860161552e565b80840191505092915050565b614a51816154d7565b82525050565b614a60816154e9565b82525050565b6000614a73601883615347565b9150614a7e82615729565b602082019050919050565b6000614a96601f83615347565b9150614aa182615752565b602082019050919050565b6000614ab9602683615347565b9150614ac48261577b565b604082019050919050565b6000614adc601b83615347565b9150614ae7826157ca565b602082019050919050565b6000614aff600283615358565b9150614b0a826157f3565b600282019050919050565b6000614b22602383615347565b9150614b2d8261581c565b604082019050919050565b6000614b45601483615347565b9150614b508261586b565b602082019050919050565b6000614b68600c83615347565b9150614b7382615894565b602082019050919050565b6000614b8b602283615347565b9150614b96826158bd565b604082019050919050565b6000614bae602d83615347565b9150614bb98261590c565b604082019050919050565b6000614bd1601b83615347565b9150614bdc8261595b565b602082019050919050565b6000614bf4601783615347565b9150614bff82615984565b602082019050919050565b6000614c17602183615347565b9150614c22826159ad565b604082019050919050565b6000614c3a602283615347565b9150614c45826159fc565b604082019050919050565b6000614c5d602083615347565b9150614c6882615a4b565b602082019050919050565b6000614c80601a83615347565b9150614c8b82615a74565b602082019050919050565b6000614ca3601b83615347565b9150614cae82615a9d565b602082019050919050565b6000614cc6602683615347565b9150614cd182615ac6565b604082019050919050565b6000614ce9602c83615347565b9150614cf482615b15565b604082019050919050565b6000614d0c601583615347565b9150614d1782615b64565b602082019050919050565b6000614d2f601283615347565b9150614d3a82615b8d565b602082019050919050565b6000614d52601f83615347565b9150614d5d82615bb6565b602082019050919050565b614d71816154c0565b82525050565b614d80816154c0565b82525050565b614d8f816154ca565b82525050565b6000614da18284614a17565b915081905092915050565b6000614db782614af2565b9150614dc38285614a00565b602082019150614dd38284614a00565b6020820191508190509392505050565b6000602082019050614df86000830184614975565b92915050565b6000604082019050614e136000830185614975565b614e206020830184614975565b9392505050565b6000606082019050614e3c6000830186614975565b614e496020830185614975565b614e566040830184614d77565b949350505050565b6000604082019050614e736000830185614975565b614e806020830184614d77565b9392505050565b60006020820190508181036000830152614ea18184614984565b905092915050565b6000602082019050614ebe60008301846149e2565b92915050565b600060a082019050614ed960008301886149f1565b614ee660208301876149f1565b614ef360408301866149f1565b614f006060830185614d77565b614f0d6080830184614975565b9695505050505050565b6000604082019050614f2c60008301856149f1565b614f396020830184614d77565b9392505050565b6000608082019050614f5560008301876149f1565b614f626020830186614d86565b614f6f60408301856149f1565b614f7c60608301846149f1565b95945050505050565b6000602082019050614f9a6000830184614a48565b92915050565b6000602082019050614fb56000830184614a57565b92915050565b60006020820190508181036000830152614fd481614a66565b9050919050565b60006020820190508181036000830152614ff481614a89565b9050919050565b6000602082019050818103600083015261501481614aac565b9050919050565b6000602082019050818103600083015261503481614acf565b9050919050565b6000602082019050818103600083015261505481614b15565b9050919050565b6000602082019050818103600083015261507481614b38565b9050919050565b6000602082019050818103600083015261509481614b5b565b9050919050565b600060208201905081810360008301526150b481614b7e565b9050919050565b600060208201905081810360008301526150d481614ba1565b9050919050565b600060208201905081810360008301526150f481614bc4565b9050919050565b6000602082019050818103600083015261511481614be7565b9050919050565b6000602082019050818103600083015261513481614c0a565b9050919050565b6000602082019050818103600083015261515481614c2d565b9050919050565b6000602082019050818103600083015261517481614c50565b9050919050565b6000602082019050818103600083015261519481614c73565b9050919050565b600060208201905081810360008301526151b481614c96565b9050919050565b600060208201905081810360008301526151d481614cb9565b9050919050565b600060208201905081810360008301526151f481614cdc565b9050919050565b6000602082019050818103600083015261521481614cff565b9050919050565b6000602082019050818103600083015261523481614d22565b9050919050565b6000602082019050818103600083015261525481614d45565b9050919050565b60006020820190506152706000830184614d77565b92915050565b6000615280615291565b905061528c828261558b565b919050565b6000604051905090565b600067ffffffffffffffff8211156152b6576152b56156cb565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152e2576152e16156cb565b5b6152eb82615718565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061536e826154c0565b9150615379836154c0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153ae576153ad61560f565b5b828201905092915050565b60006153c4826154c0565b91506153cf836154c0565b9250826153df576153de61563e565b5b828204905092915050565b60006153f5826154c0565b9150615400836154c0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154395761543861560f565b5b828202905092915050565b600061544f826154c0565b915061545a836154c0565b92508282101561546d5761546c61560f565b5b828203905092915050565b6000615483826154a0565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006154e2826154fb565b9050919050565b60006154f4826154fb565b9050919050565b60006155068261550d565b9050919050565b6000615518826154a0565b9050919050565b82818337600083830152505050565b60005b8381101561554c578082015181840152602081019050615531565b8381111561555b576000848401525b50505050565b600061556c826154c0565b915060008214156155805761557f61560f565b5b600182039050919050565b61559482615718565b810181811067ffffffffffffffff821117156155b3576155b26156cb565b5b80604052505050565b60006155c7826154c0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155fa576155f961560f565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f30204e656f706879746520746f2073656e6420746f20636c6173730000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f596f7520617265206e6f74206f776e6572206f662074686973204e656f70687960008201527f74652e0000000000000000000000000000000000000000000000000000000000602082015250565b7f536f6d657468696e672077656e742077726f6e67000000000000000000000000600082015250565b7f5a65726f20526577617264730000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f536f72727920536f6d657468696e672069732077726f6e67207769746820746860008201527f6520656e6372797074696f6e2e00000000000000000000000000000000000000602082015250565b7f796f7520646f6e2774206f776e2074686973204e656f70687974650000000000600082015250565b7f417070726f7665204e656f706879746573204669727374000000000000000000600082015250565b7f6e6674206e6f7420617661696c61626c6520696e2074686520636f6e7472616360008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f506c656173652072656c6561736520526f6f6d73206669727374000000000000600082015250565b7f496e76616c696420566f75636865722e2054727920416761696e2e0000000000600082015250565b7f4e656f7068797465206e6f7420617661696c61626c6520696e2074686520636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b7f436f6e747261637420646f6573206e6f74206861766520656e6f75676820726560008201527f7761726420546f6b656e732e0000000000000000000000000000000000000000602082015250565b7f30204e656f706879746520746f2072656c656173650000000000000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615be881615478565b8114615bf357600080fd5b50565b615bff8161548a565b8114615c0a57600080fd5b50565b615c1681615496565b8114615c2157600080fd5b50565b615c2d816154c0565b8114615c3857600080fd5b50565b615c44816154ca565b8114615c4f57600080fd5b5056fea26469706673582212207406b874d8bec7ae0fb6c263ca07c002ff05f7d66fb641f130825e9f65aede1f64736f6c63430008070033
Deployed Bytecode Sourcemap
47109:17044:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55090:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54861:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59333:302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53903:601;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55230:626;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57545:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56653:388;;;:::i;:::-;;50734:1508;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47708:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47778:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54958:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62276:82;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48754:1900;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14445:103;;;:::i;:::-;;47837:23;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63366:142;;;:::i;:::-;;62881:454;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61082:1018;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13794:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58374:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57684:597;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54751:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59643:1431;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47495:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58749:302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62106:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47734:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57050:489;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54550:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63512:635;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56433:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62366:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47443:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14703:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47384:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55090:132;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55174:11:::1;;;;;;;;;;;:20;;;55195:3;55200:13;55174:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55090:132:::0;;:::o;54861:89::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54938:3:::1;54924;;:18;;;;;;;;;;;;;;;;;;54861:89:::0;:::o;59333:302::-;59419:4;59441:9;59453:1;59441:13;;59436:168;59460:4;:11;59456:1;:15;59436:168;;;59523:4;59497:30;;:13;:22;59511:4;59516:1;59511:7;;;;;;;;:::i;:::-;;;;;;;;59497:22;;;;;;;;;;;;;;;;;;;;;:30;;;59494:98;;59570:5;59563:12;;;;;59494:98;59473:3;;;;;:::i;:::-;;;;59436:168;;;;59621:4;59614:11;;59333:302;;;;;:::o;53903:601::-;53964:4;53978:17;53996:7;:13;54004:4;53996:13;;;;;;;;;;;;;;;:26;;;53978:44;;54031:21;54069:6;54065:398;54080:12;54078:1;:14;54065:398;;;54164:1;54128:7;:13;54136:4;54128:13;;;;;;;;;;;;;;;:25;;54154:1;54128:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;:80;;;;;54207:1;54169:7;:13;54177:4;54169:13;;;;;;;;;;;;;;;:25;;54195:1;54169:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:39;54128:80;54125:327;;;54258:58;54287:7;:13;54295:4;54287:13;;;;;;;;;;;;;;;:25;;54313:1;54287:28;;;;;;;;:::i;:::-;;;;;;;;;;;;54258:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;:58::i;:::-;54238:78;;;;;:::i;:::-;;;54125:327;;;54402:7;:13;54410:4;54402:13;;;;;;;;;;;;;;;:25;;54428:1;54402:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;54383:53;;;;;:::i;:::-;;;54125:327;54093:3;;;;;:::i;:::-;;;;54065:398;;;;54480:16;54473:23;;;;53903:601;;;:::o;55230:626::-;55288:7;55308:17;55326:7;:13;55334:4;55326:13;;;;;;;;;;;;;;;:26;;;55308:44;;55364:21;55405:6;55401:410;55416:12;55414:1;:14;55401:410;;;55500:1;55464:7;:13;55472:4;55464:13;;;;;;;;;;;;;;;:25;;55490:1;55464:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;:80;;;;;55543:1;55505:7;:13;55513:4;55505:13;;;;;;;;;;;;;;;:25;;55531:1;55505:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:39;55464:80;55461:326;;;55612:159;55649:4;55654:7;:13;55662:4;55654:13;;;;;;;;;;;;;;;:25;;55680:1;55654:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;55692:7;:13;55700:4;55692:13;;;;;;;;;;;;;;;:25;;55718:1;55692:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;55730:7;:13;55738:4;55730:13;;;;;;;;;;;;;;;:25;;55756:1;55730:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:40;;;55612:36;:159::i;:::-;55592:179;;;;;:::i;:::-;;;55461:326;55429:3;;;;;:::i;:::-;;;;55401:410;;;;55832:16;55825:23;;;;55230:626;;;:::o;57545:130::-;57609:7;57635;:14;57643:5;57635:14;;;;;;;;;;;;;;;:32;;;57628:39;;57545:130;;;:::o;56653:388::-;32262:1;32408:7;;:19;;32400:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:1;32474:7;:18;;;;56709:14:::1;56726:23;56738:10;56726:11;:23::i;:::-;56709:40;;56777:1;56768:6;:10;56760:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;56854:6;56814:11;;;;;;;;;;;:21;;;56844:4;56814:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;56806:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56955:6;56920:7;:19;56928:10;56920:19;;;;;;;;;;;;;;;:33;;;:41;;;;;;;:::i;:::-;;;;;;;;56974:11;;;;;;;;;;;:20;;;57003:10;57016:6;56974:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56698:343;32218:1:::0;32570:7;:22;;;;56653:388::o;50734:1508::-;50820:4;50838:12;50853:4;:12;;;50838:27;;50877:14;50894:4;:14;;;50877:31;;50920:12;50935:4;:12;;;50920:27;;50971:1;50962:7;:10;50959:40;;;50982:15;50974:23;;50959:40;51010:16;51029:4;:16;;;51010:35;;51057:15;51094:5;51085:7;51075:9;:17;;;;:::i;:::-;51074:25;;;;:::i;:::-;51057:42;;51111:12;;;;;:::i;:::-;;;;51134:16;51202:22;51246:5;51235:9;51227:7;:17;;;;:::i;:::-;51226:25;;;;:::i;:::-;51202:49;;51262:15;51278:10;51262:26;;51299:14;51340:2;51329:10;:13;51326:872;;;51392:10;51389:2;:13;;;;:::i;:::-;51371:17;:31;51368:183;;;51446:17;51436:27;;51368:183;;;51525:10;51522:2;:13;;;;:::i;:::-;51512:23;;51368:183;51571:6;51578:1;51571:8;;51567:408;51583:9;51580:1;:12;51567:408;;51626:13;51655:4;51642:10;:17;;;;:::i;:::-;51626:33;;51674:13;51690:2;51674:18;;51707:13;51723:11;51707:27;;51812:11;51846:8;51836;51827;:17;;;;:::i;:::-;51826:28;;;;:::i;:::-;51812:42;;51885:4;51876:6;:13;;;;:::i;:::-;51869:20;;51922:6;51908:20;;;;;:::i;:::-;;;51947:12;;;;;:::i;:::-;;;;51611:364;;;;51593:3;;;;;:::i;:::-;;;;51567:408;;;;52020:2;52009:10;51991:17;:28;;;;:::i;:::-;:31;51988:117;;;52079:11;52068:9;52050:17;:27;;;;:::i;:::-;52049:41;;;;:::i;:::-;52036:54;;;;;:::i;:::-;;;51988:117;51326:872;;;52175:11;52157:17;:29;;;;:::i;:::-;52145:41;;51326:872;52221:11;52214:18;;;;;;;;;;;50734:1508;;;:::o;47708:18::-;;;;;;;;;;;;;:::o;47778:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;54958:117::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55063:3:::1;55030:22;;:37;;;;;;;;;;;;;;;;;;54958:117:::0;:::o;62276:82::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62345:5:::1;62336:6;;:14;;;;;;;;;;;;;;;;;;62276:82:::0;:::o;48754:1900::-;48869:4;48886:7;48894:1;48886:9;;48914:1;48910:2;:5;48907:347;;;48939:17;48957:7;:13;48965:4;48957:13;;;;;;;;;;;;;;;:26;;;48939:44;;49006:6;49002:217;49017:12;49015:1;:14;49002:217;;;49103:7;49065;:13;49073:4;49065:13;;;;;;;;;;;;;;;:25;;49091:1;49065:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:45;49062:135;;;49145:7;:13;49153:4;49145:13;;;;;;;;;;;;;;;:25;;49171:1;49145:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;49140:41;;49062:135;49030:3;;;;;:::i;:::-;;;;49002:217;;;;48927:304;48907:347;;;49250:2;49247:5;;48907:347;49265:12;49280:2;49265:17;;49294:14;49311:15;49294:32;;49338:12;49363:5;49353:9;:15;;;;:::i;:::-;49338:30;;49392:1;49383:7;:10;49380:40;;;49403:15;49395:23;;49380:40;49431:16;49450:6;49431:25;;49468:15;49505:5;49496:7;49486:9;:17;;;;:::i;:::-;49485:25;;;;:::i;:::-;49468:42;;49522:12;;;;;:::i;:::-;;;;49545:16;49631:22;49675:5;49664:9;49656:7;:17;;;;:::i;:::-;49655:25;;;;:::i;:::-;49631:49;;49691:15;49707:10;49691:26;;49728:14;49769:2;49758:10;:13;49755:860;;;49821:10;49818:2;:13;;;;:::i;:::-;49800:17;:31;49797:183;;;49875:17;49865:27;;49797:183;;;49954:10;49951:2;:13;;;;:::i;:::-;49941:23;;49797:183;50000:6;50007:1;50000:8;;49996:393;50012:9;50009:1;:12;49996:393;;50055:13;50084:4;50071:10;:17;;;;:::i;:::-;50055:33;;50099:13;50115:2;50099:18;;50128:13;50144:11;50128:27;;50229:11;50263:8;50253;50244;:17;;;;:::i;:::-;50243:28;;;;:::i;:::-;50229:42;;50299:4;50290:6;:13;;;;:::i;:::-;50283:20;;50336:6;50322:20;;;;;:::i;:::-;;;50361:12;;;;;:::i;:::-;;;;50040:349;;;;50022:3;;;;;:::i;:::-;;;;49996:393;;;;50435:2;50424:10;50406:17;:28;;;;:::i;:::-;:31;50403:119;;;50495:11;50484:9;50466:17;:27;;;;:::i;:::-;50465:41;;;;:::i;:::-;50452:54;;;;;:::i;:::-;;;50403:119;49755:860;;;50592:11;50574:17;:29;;;;:::i;:::-;50562:41;;49755:860;50638:11;50631:18;;;;;;;;;;;;48754:1900;;;;;;:::o;14445:103::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14510:30:::1;14537:1;14510:18;:30::i;:::-;14445:103::o:0;47837:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63366:142::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63421:11:::1;;;;;;;;;;;:20;;;63450:10;63463:11;;;;;;;;;;;:21;;;63493:4;63463:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63421:79;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63366:142::o:0;62881:454::-;62998:4;63078:7;63087:9;63098;63122;63111:48;;;;;;;;;;;;:::i;:::-;63077:82;;;;;;63211:14;63228:56;63265:7;63248:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;63238:36;;;;;;63276:1;63279;63282;63228:56;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63211:73;;63312:15;63302:25;;:6;:25;;;63295:32;;;;;;62881:454;;;;;:::o;61082:1018::-;32262:1;32408:7;;:19;;32400:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:1;32474:7;:18;;;;61170:6:::1;;;;;;;;;;;61169:7;61161:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;61265:22;;;;;;;;;;;:41;;;61307:10;61265:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61248:8;:15;61217:30;61236:10;61217:18;:30::i;:::-;:46;;;;:::i;:::-;:101;;61209:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;61385:1;61367:8;:15;:19;61359:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;61431:39;61455:4;61461:8;61431:15;:39::i;:::-;61423:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;61531:43;61554:10;61565:8;61531:22;:43::i;:::-;61523:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;61620:11;61634:8;:15;61620:29;;61671:9;61666:427;61690:3;61686:1;:7;61666:427;;;61718:15;61736:8;61745:1;61736:11;;;;;;;;:::i;:::-;;;;;;;;61718:29;;61780:39;61796:10;61807:8;61816:1;61807:11;;;;;;;;:::i;:::-;;;;;;;;61780:15;:39::i;:::-;61839:18;;:20;;;;;;;;;:::i;:::-;;;;;;61884:13;:22;61898:7;61884:22;;;;;;;;;;;;61877:29;;;;;;;;;;;61927:3;;;;;;;;;;;:16;;;61978:4;62010:10;62047:7;61927:150;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;61700:393;61695:3;;;;;:::i;:::-;;;;61666:427;;;;61150:950;32218:1:::0;32570:7;:22;;;;61082:1018;:::o;13794:87::-;13840:7;13867:6;;;;;;;;;;;13860:13;;13794:87;:::o;58374:369::-;58437:4;58467:6;58476:1;58467:10;;58463:127;58483:9;:16;;;;58479:1;:20;58463:127;;;58547:8;58533:9;58543:1;58533:12;;;;;;;;:::i;:::-;;;;;;;;;;:22;58530:48;;;58564:14;;58557:21;;;;;58530:48;58501:3;;;;;:::i;:::-;;;;58463:127;;;;58613:4;58603:8;:14;58600:136;;58650:15;;58643:22;;;;58600:136;58713:11;;58706:18;;58374:369;;;;:::o;57684:597::-;57749:16;57777:11;57791:25;57810:5;57791:18;:25::i;:::-;57777:39;;57827:21;57862:3;57851:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57827:39;;57877:17;57895:7;:14;57903:5;57895:14;;;;;;;;;;;;;;;:27;;;57877:45;;57934:12;57966:6;57962:290;57977:12;57975:1;:14;57962:290;;;58062:1;58025:7;:14;58033:5;58025:14;;;;;;;;;;;;;;;:26;;58052:1;58025:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;:38;:82;;;;;58106:1;58067:7;:14;58075:5;58067:14;;;;;;;;;;;;;;;:26;;58094:1;58067:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:37;;;:40;58025:82;58022:206;;;58151:7;:14;58159:5;58151:14;;;;;;;;;;;;;;;:26;;58178:1;58151:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:37;;;58137:4;58142:7;58137:13;;;;;;;;:::i;:::-;;;;;;;:51;;;;;58203:9;;;;;:::i;:::-;;;;58022:206;57990:3;;;;;:::i;:::-;;;;57962:290;;;;58269:4;58262:11;;;;;;57684:597;;;:::o;54751:104::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54843:3:::1;54822:11;;:25;;;;;;;;;;;;;;;;;;54751:104:::0;:::o;59643:1431::-;32262:1;32408:7;;:19;;32400:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32262:1;32474:7;:18;;;;59788:6:::1;;;;;;;;;;;59787:7;59779:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;59843:3;;;;;;;;;;;59835:29;;;59865:10;59885:4;59835:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59827:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;59957:1;59939:8;:15;:19;59931:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60009:36;60025:10;60036:8;60009:15;:36::i;:::-;60001:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;60103:18;60117:3;60103:13;:18::i;:::-;60095:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;60187:6;;;;;;;;;;;60164:29;;:19;60170:2;60173:9;60164:5;:19::i;:::-;:29;;;60156:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;60280:1;60262:10;:14;60273:2;60262:14;;;;;;;;;;;;:19;60254:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60345:1;60328:10;:14;60339:2;60328:14;;;;;;;;;;;:18;;;;60361:11;60375:8;:15;60361:29;;60410:9;60405:639;60429:3;60425:1;:7;60405:639;;;60458:15;60476:8;60485:1;60476:11;;;;;;;;:::i;:::-;;;;;;;;60458:29;;60535:1;60527:3;60531:1;60527:6;;;;;;;;:::i;:::-;;;;;;;;:9;60524:341;;60609:71;60619:10;60630:30;60648:8;60657:1;60648:11;;;;;;;;:::i;:::-;;;;;;;;60630:17;:30::i;:::-;60661:8;60670:1;60661:11;;;;;;;;:::i;:::-;;;;;;;;60673:3;60677:1;60673:6;;;;;;;;:::i;:::-;;;;;;;;60609:9;:71::i;:::-;60524:341;;;60741:104;60751:10;60763:30;60781:8;60790:1;60781:11;;;;;;;;:::i;:::-;;;;;;;;60763:17;:30::i;:::-;60795:8;60804:1;60795:11;;;;;;;;:::i;:::-;;;;;;;;60808:36;60820:8;60829:1;60820:11;;;;;;;;:::i;:::-;;;;;;;;60833:10;60808:11;:36::i;:::-;60741:9;:104::i;:::-;60524:341;60910:10;60885:13;:22;60899:7;60885:22;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;60939:18;;:20;;;;;;;;;:::i;:::-;;;;;;60978:3;;;;;;;;;;;:16;;;60995:10;61014:4;61020:7;60978:50;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60439:605;60434:3;;;;;:::i;:::-;;;;60405:639;;;;59768:1306;32218:1:::0;32570:7;:22;;;;59643:1431;;;;:::o;47495:42::-;;;;;;;;;;;;;;;;;:::o;58749:302::-;58828:4;58850:9;58862:1;58850:13;;58845:175;58869:4;:11;58865:1;:15;58845:175;;;58939:4;58906:37;;58914:3;;;;;;;;;;;58906:20;;;58927:4;58932:1;58927:7;;;;;;;;:::i;:::-;;;;;;;;58906:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;;58903:105;;58986:5;58979:12;;;;;58903:105;58882:3;;;;;:::i;:::-;;;;58845:175;;;;59037:4;59030:11;;58749:302;;;;;:::o;62106:165::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62178:6:::1;62174:90;62190:3;:10;62188:1;:12;62174:90;;;62230:9;62245:3;62249:1;62245:6;;;;;;;;:::i;:::-;;;;;;;;62230:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62201:3;;;;;:::i;:::-;;;;62174:90;;;;62106:165:::0;:::o;47734:37::-;;;;;;;;;;;;;:::o;57050:489::-;57114:16;57142:11;57156:3;;;;;;;;;;;:13;;;57170:4;57156:19;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57142:33;;57186:21;57221:3;57210:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57186:39;;57236:18;57271:27;57301:3;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57271:47;;57335:6;57342:1;57335:8;;57331:177;57347:19;57344:1;:22;57331:177;;57407:4;57389:22;;:3;;;;;;;;;;;:11;;;57401:1;57389:14;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:22;;;57386:111;;;57449:1;57430:4;57435:10;57430:16;;;;;;;;:::i;:::-;;;;;;;:20;;;;;57469:12;;;;;:::i;:::-;;;;57386:111;57367:3;;;;;:::i;:::-;;;;57331:177;;;;57527:4;57520:11;;;;;;57050:489;;;:::o;54550:195::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54671:6:::1;54656:14;:21;;;;54704:7;54688:15;:23;;;;54734:3;54722:11;:15;;;;54550:195:::0;;;:::o;63512:635::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63590:11:::1;63604:8;:15;63590:29;;63639:9;63634:506;63658:3;63654:1;:7;63634:506;;;63686:15;63704:8;63713:1;63704:11;;;;;;;;:::i;:::-;;;;;;;;63686:29;;63741:39;63765:4;63771:8;63741:15;:39::i;:::-;63733:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;63835:18;;:20;;;;;;;;;:::i;:::-;;;;;;63874:11;63886:13;:22;63900:7;63886:22;;;;;;;;;;;;;;;;;;;;;63874:34;;63929:3;;;;;;;;;;;:16;;;63980:4;64012:3;64042:7;63929:143;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64102:13;:22;64116:7;64102:22;;;;;;;;;;;;64095:29;;;;;;;;;;;63668:472;;63663:3;;;;;:::i;:::-;;;;63634:506;;;;63575:572;63512:635:::0;:::o;56433:212::-;56491:7;56534:19;56556;56567:7;56556:10;:19::i;:::-;56534:41;;56607:7;:16;56615:7;56607:16;;;;;;;;;;;;;;;:30;;;56593:11;:44;;;;:::i;:::-;56586:51;;;56433:212;;;:::o;62366:124::-;62434:7;62460:22;62468:2;62472:9;62460:7;:22::i;:::-;62453:29;;62366:124;;;;:::o;47443:37::-;;;;:::o;14703:201::-;14025:12;:10;:12::i;:::-;14014:23;;:7;:5;:7::i;:::-;:23;;;14006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14812:1:::1;14792:22;;:8;:22;;;;14784:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14868:28;14887:8;14868:18;:28::i;:::-;14703:201:::0;:::o;47384:25::-;;;;;;;;;;;;;:::o;12518:98::-;12571:7;12598:10;12591:17;;12518:98;:::o;15064:191::-;15138:16;15157:6;;;;;;;;;;;15138:25;;15183:8;15174:6;;:17;;;;;;;;;;;;;;;;;;15238:8;15207:40;;15228:8;15207:40;;;;;;;;;;;;15127:128;15064:191;:::o;52777:683::-;52931:1;52899:7;:13;52907:4;52899:13;;;;;;;;;;;;;;;:31;;;:33;;;;:::i;:::-;52867:7;:13;52875:4;52867:13;;;;;;;;;;;;;;;:31;;:65;;;;52952:17;52970:7;:13;52978:4;52970:13;;;;;;;;;;;;;;;:26;;;52952:44;;53029:6;53025:420;53040:12;53038:1;:14;53025:420;;;53126:7;53088;:13;53096:4;53088:13;;;;;;;;;;;;;;;:25;;53114:1;53088:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:45;:86;;;;;53173:1;53137:7;:13;53145:4;53137:13;;;;;;;;;;;;;;;:25;;53163:1;53137:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;53088:86;:129;;;;;53216:1;53178:7;:13;53186:4;53178:13;;;;;;;;;;;;;;;:25;;53204:1;53178:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:39;53088:129;53085:338;;;53282:58;53311:7;:13;53319:4;53311:13;;;;;;;;;;;;;;;:25;;53337:1;53311:28;;;;;;;;:::i;:::-;;;;;;;;;;;;53282:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;:58::i;:::-;53247:7;:13;53255:4;53247:13;;;;;;;;;;;;;;;:25;;53273:1;53247:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;:93;;;;53392:15;53355:7;:13;53363:4;53355:13;;;;;;;;;;;;;;;:25;;53381:1;53355:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;:52;;;;53085:338;53053:3;;;;;:::i;:::-;;;;53025:420;;;;52848:612;52777:683;;:::o;59059:270::-;59127:4;59149:9;59161:1;59149:13;;59144:156;59168:7;:14;59164:1;:18;59144:156;;;59222:1;59208:7;59216:1;59208:10;;;;;;;;:::i;:::-;;;;;;;;:15;59205:83;;;59266:5;59259:12;;;;;59205:83;59184:3;;;;;:::i;:::-;;;;59144:156;;;;59317:4;59310:11;;59059:270;;;;:::o;52249:522::-;52366:26;;:::i;:::-;52420:7;52407:4;:12;;:20;;;;;52455:7;52442:4;:12;;:20;;;;;52492:15;52477:4;:14;;:30;;;;;52535:1;52522:4;:12;;:14;;;;;52568:11;52551:4;:16;;:28;;;;;52605:1;52594:4;:10;;:12;;;;;52623:7;:13;52631:4;52623:13;;;;;;;;;;;;;;;:25;;52654:4;52623:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52703:1;52675:7;:13;52683:4;52675:13;;;;;;;;;;;;;;;:26;;;:29;;;;;;;:::i;:::-;;;;;;;;52752:1;52719:7;:13;52727:4;52719:13;;;;;;;;;;;;;;;:31;;;:34;;;;;;;:::i;:::-;;;;;;;;52355:416;52249:522;;;;:::o;53469:426::-;53551:4;53568:17;53586:7;:13;53594:4;53586:13;;;;;;;;;;;;;;;:26;;;53568:44;;53621:7;53645:6;53641:217;53656:12;53654:1;:14;53641:217;;;53742:7;53704;:13;53712:4;53704:13;;;;;;;;;;;;;;;:25;;53730:1;53704:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:45;53701:135;;;53784:7;:13;53792:4;53784:13;;;;;;;;;;;;;;;:25;;53810:1;53784:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;53779:41;;53701:135;53669:3;;;;;:::i;:::-;;;;53641:217;;;;53875:2;53868:9;;;;53469:426;;;;:::o;55862:563::-;55918:7;55942:17;55960:7;:13;55968:4;55960:13;;;;;;;;;;;;;;;:26;;;55942:44;;55995:21;56033:6;56029:355;56044:12;56042:1;:14;56029:355;;;56128:1;56092:7;:13;56100:4;56092:13;;;;;;;;;;;;;;;:25;;56118:1;56092:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;:37;56089:284;;;56179:58;56208:7;:13;56216:4;56208:13;;;;;;;;;;;;;;;:25;;56234:1;56208:28;;;;;;;;:::i;:::-;;;;;;;;;;;;56179:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;:58::i;:::-;56159:78;;;;;:::i;:::-;;;56089:284;;;56323:7;:13;56331:4;56323:13;;;;;;;;;;;;;;;:25;;56349:1;56323:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;56304:53;;;;;:::i;:::-;;;56089:284;56057:3;;;;;:::i;:::-;;;;56029:355;;;;56401:16;56394:23;;;;55862:563;;;:::o;62498:175::-;62570:7;62589:14;62606:9;62612:2;62606:5;:9::i;:::-;62589:26;;62633:32;62647:6;62655:9;62633:13;:32::i;:::-;62626:39;;;62498:175;;;;:::o;62681:196::-;62727:7;62753:116;62805:34;62854:2;62780:87;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62770:98;;;;;;62753:16;:116::i;:::-;62746:123;;62681:196;;;:::o;38644:231::-;38722:7;38743:17;38762:18;38784:27;38795:4;38801:9;38784:10;:27::i;:::-;38742:69;;;;38822:18;38834:5;38822:11;:18::i;:::-;38858:9;38851:16;;;;38644:231;;;;:::o;46877:167::-;46954:7;46981:55;47003:20;:18;:20::i;:::-;47025:10;46981:21;:55::i;:::-;46974:62;;46877:167;;;:::o;36534:1308::-;36615:7;36624:12;36869:2;36849:9;:16;:22;36845:990;;;36888:9;36912;36936:7;37145:4;37134:9;37130:20;37124:27;37119:32;;37195:4;37184:9;37180:20;37174:27;37169:32;;37253:4;37242:9;37238:20;37232:27;37229:1;37224:36;37219:41;;37296:25;37307:4;37313:1;37316;37319;37296:10;:25::i;:::-;37289:32;;;;;;;;;36845:990;37363:2;37343:9;:16;:22;37339:496;;;37382:9;37406:10;37618:4;37607:9;37603:20;37597:27;37592:32;;37669:4;37658:9;37654:20;37648:27;37642:33;;37711:23;37722:4;37728:1;37731:2;37711:10;:23::i;:::-;37704:30;;;;;;;;37339:496;37783:1;37787:35;37767:56;;;;36534:1308;;;;;;:::o;34805:643::-;34883:20;34874:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;34870:571;;;34920:7;;34870:571;34981:29;34972:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;34968:473;;;35027:34;;;;;;;;;;:::i;:::-;;;;;;;;34968:473;35092:35;35083:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;35079:362;;;35144:41;;;;;;;;;;:::i;:::-;;;;;;;;35079:362;35216:30;35207:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;35203:238;;;35263:44;;;;;;;;;;:::i;:::-;;;;;;;;35203:238;35338:30;35329:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;35325:116;;;35385:44;;;;;;;;;;:::i;:::-;;;;;;;;35325:116;34805:643;;:::o;45650:314::-;45703:7;45744:12;45727:29;;45735:4;45727:29;;;:66;;;;;45777:16;45760:13;:33;45727:66;45723:234;;;45817:24;45810:31;;;;45723:234;45881:64;45903:10;45915:12;45929:15;45881:21;:64::i;:::-;45874:71;;45650:314;;:::o;43558:196::-;43651:7;43717:15;43734:10;43688:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43678:68;;;;;;43671:75;;43558:196;;;;:::o;40096:1632::-;40227:7;40236:12;41161:66;41156:1;41148:10;;:79;41144:163;;;41260:1;41264:30;41244:51;;;;;;41144:163;41326:2;41321:1;:7;;;;:18;;;;;41337:2;41332:1;:7;;;;41321:18;41317:102;;;41372:1;41376:30;41356:51;;;;;;41317:102;41516:14;41533:24;41543:4;41549:1;41552;41555;41533:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41516:41;;41590:1;41572:20;;:6;:20;;;41568:103;;;41625:1;41629:29;41609:50;;;;;;;41568:103;41691:6;41699:20;41683:37;;;;;40096:1632;;;;;;;;:::o;39138:344::-;39252:7;39261:12;39286:9;39311:66;39303:75;;39298:2;:80;39286:92;;39389:7;39428:2;39421:3;39414:2;39406:11;;:18;;39405:25;;;;:::i;:::-;39389:42;;39449:25;39460:4;39466:1;39469;39472;39449:10;:25::i;:::-;39442:32;;;;;;39138:344;;;;;;:::o;45972:263::-;46116:7;46164:8;46174;46184:11;46197:13;46220:4;46153:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46143:84;;;;;;46136:91;;45972:263;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1313:143::-;1370:5;1401:6;1395:13;1386:22;;1417:33;1444:5;1417:33;:::i;:::-;1313:143;;;;:::o;1479:370::-;1550:5;1599:3;1592:4;1584:6;1580:17;1576:27;1566:122;;1607:79;;:::i;:::-;1566:122;1724:6;1711:20;1749:94;1839:3;1831:6;1824:4;1816:6;1812:17;1749:94;:::i;:::-;1740:103;;1556:293;1479:370;;;;:::o;1855:133::-;1898:5;1936:6;1923:20;1914:29;;1952:30;1976:5;1952:30;:::i;:::-;1855:133;;;;:::o;1994:137::-;2048:5;2079:6;2073:13;2064:22;;2095:30;2119:5;2095:30;:::i;:::-;1994:137;;;;:::o;2137:143::-;2194:5;2225:6;2219:13;2210:22;;2241:33;2268:5;2241:33;:::i;:::-;2137:143;;;;:::o;2299:338::-;2354:5;2403:3;2396:4;2388:6;2384:17;2380:27;2370:122;;2411:79;;:::i;:::-;2370:122;2528:6;2515:20;2553:78;2627:3;2619:6;2612:4;2604:6;2600:17;2553:78;:::i;:::-;2544:87;;2360:277;2299:338;;;;:::o;2699:1249::-;2780:5;2824:4;2812:9;2807:3;2803:19;2799:30;2796:117;;;2832:79;;:::i;:::-;2796:117;2931:21;2947:4;2931:21;:::i;:::-;2922:30;;3014:1;3054:49;3099:3;3090:6;3079:9;3075:22;3054:49;:::i;:::-;3047:4;3040:5;3036:16;3029:75;2962:153;3181:2;3222:49;3267:3;3258:6;3247:9;3243:22;3222:49;:::i;:::-;3215:4;3208:5;3204:16;3197:75;3125:158;3345:2;3386:49;3431:3;3422:6;3411:9;3407:22;3386:49;:::i;:::-;3379:4;3372:5;3368:16;3361:75;3293:154;3511:2;3552:49;3597:3;3588:6;3577:9;3573:22;3552:49;:::i;:::-;3545:4;3538:5;3534:16;3527:75;3457:156;3675:3;3717:49;3762:3;3753:6;3742:9;3738:22;3717:49;:::i;:::-;3710:4;3703:5;3699:16;3692:75;3623:155;3838:3;3880:49;3925:3;3916:6;3905:9;3901:22;3880:49;:::i;:::-;3873:4;3866:5;3862:16;3855:75;3788:153;2699:1249;;;;:::o;3954:139::-;4000:5;4038:6;4025:20;4016:29;;4054:33;4081:5;4054:33;:::i;:::-;3954:139;;;;:::o;4099:143::-;4156:5;4187:6;4181:13;4172:22;;4203:33;4230:5;4203:33;:::i;:::-;4099:143;;;;:::o;4248:139::-;4303:5;4334:6;4328:13;4319:22;;4350:31;4375:5;4350:31;:::i;:::-;4248:139;;;;:::o;4393:329::-;4452:6;4501:2;4489:9;4480:7;4476:23;4472:32;4469:119;;;4507:79;;:::i;:::-;4469:119;4627:1;4652:53;4697:7;4688:6;4677:9;4673:22;4652:53;:::i;:::-;4642:63;;4598:117;4393:329;;;;:::o;4728:351::-;4798:6;4847:2;4835:9;4826:7;4822:23;4818:32;4815:119;;;4853:79;;:::i;:::-;4815:119;4973:1;4998:64;5054:7;5045:6;5034:9;5030:22;4998:64;:::i;:::-;4988:74;;4944:128;4728:351;;;;:::o;5085:684::-;5178:6;5186;5235:2;5223:9;5214:7;5210:23;5206:32;5203:119;;;5241:79;;:::i;:::-;5203:119;5361:1;5386:53;5431:7;5422:6;5411:9;5407:22;5386:53;:::i;:::-;5376:63;;5332:117;5516:2;5505:9;5501:18;5488:32;5547:18;5539:6;5536:30;5533:117;;;5569:79;;:::i;:::-;5533:117;5674:78;5744:7;5735:6;5724:9;5720:22;5674:78;:::i;:::-;5664:88;;5459:303;5085:684;;;;;:::o;5775:474::-;5843:6;5851;5900:2;5888:9;5879:7;5875:23;5871:32;5868:119;;;5906:79;;:::i;:::-;5868:119;6026:1;6051:53;6096:7;6087:6;6076:9;6072:22;6051:53;:::i;:::-;6041:63;;5997:117;6153:2;6179:53;6224:7;6215:6;6204:9;6200:22;6179:53;:::i;:::-;6169:63;;6124:118;5775:474;;;;;:::o;6255:765::-;6341:6;6349;6357;6365;6414:3;6402:9;6393:7;6389:23;6385:33;6382:120;;;6421:79;;:::i;:::-;6382:120;6541:1;6566:53;6611:7;6602:6;6591:9;6587:22;6566:53;:::i;:::-;6556:63;;6512:117;6668:2;6694:53;6739:7;6730:6;6719:9;6715:22;6694:53;:::i;:::-;6684:63;;6639:118;6796:2;6822:53;6867:7;6858:6;6847:9;6843:22;6822:53;:::i;:::-;6812:63;;6767:118;6924:2;6950:53;6995:7;6986:6;6975:9;6971:22;6950:53;:::i;:::-;6940:63;;6895:118;6255:765;;;;;;;:::o;7026:539::-;7110:6;7159:2;7147:9;7138:7;7134:23;7130:32;7127:119;;;7165:79;;:::i;:::-;7127:119;7313:1;7302:9;7298:17;7285:31;7343:18;7335:6;7332:30;7329:117;;;7365:79;;:::i;:::-;7329:117;7470:78;7540:7;7531:6;7520:9;7516:22;7470:78;:::i;:::-;7460:88;;7256:302;7026:539;;;;:::o;7571:1363::-;7716:6;7724;7732;7740;7789:3;7777:9;7768:7;7764:23;7760:33;7757:120;;;7796:79;;:::i;:::-;7757:120;7944:1;7933:9;7929:17;7916:31;7974:18;7966:6;7963:30;7960:117;;;7996:79;;:::i;:::-;7960:117;8101:78;8171:7;8162:6;8151:9;8147:22;8101:78;:::i;:::-;8091:88;;7887:302;8256:2;8245:9;8241:18;8228:32;8287:18;8279:6;8276:30;8273:117;;;8309:79;;:::i;:::-;8273:117;8414:78;8484:7;8475:6;8464:9;8460:22;8414:78;:::i;:::-;8404:88;;8199:303;8541:2;8567:53;8612:7;8603:6;8592:9;8588:22;8567:53;:::i;:::-;8557:63;;8512:118;8697:2;8686:9;8682:18;8669:32;8728:18;8720:6;8717:30;8714:117;;;8750:79;;:::i;:::-;8714:117;8855:62;8909:7;8900:6;8889:9;8885:22;8855:62;:::i;:::-;8845:72;;8640:287;7571:1363;;;;;;;:::o;8940:323::-;8996:6;9045:2;9033:9;9024:7;9020:23;9016:32;9013:119;;;9051:79;;:::i;:::-;9013:119;9171:1;9196:50;9238:7;9229:6;9218:9;9214:22;9196:50;:::i;:::-;9186:60;;9142:114;8940:323;;;;:::o;9269:345::-;9336:6;9385:2;9373:9;9364:7;9360:23;9356:32;9353:119;;;9391:79;;:::i;:::-;9353:119;9511:1;9536:61;9589:7;9580:6;9569:9;9565:22;9536:61;:::i;:::-;9526:71;;9482:125;9269:345;;;;:::o;9620:975::-;9715:6;9723;9731;9780:2;9768:9;9759:7;9755:23;9751:32;9748:119;;;9786:79;;:::i;:::-;9748:119;9934:1;9923:9;9919:17;9906:31;9964:18;9956:6;9953:30;9950:117;;;9986:79;;:::i;:::-;9950:117;10091:62;10145:7;10136:6;10125:9;10121:22;10091:62;:::i;:::-;10081:72;;9877:286;10230:2;10219:9;10215:18;10202:32;10261:18;10253:6;10250:30;10247:117;;;10283:79;;:::i;:::-;10247:117;10388:62;10442:7;10433:6;10422:9;10418:22;10388:62;:::i;:::-;10378:72;;10173:287;10499:2;10525:53;10570:7;10561:6;10550:9;10546:22;10525:53;:::i;:::-;10515:63;;10470:118;9620:975;;;;;:::o;10601:394::-;10692:6;10741:3;10729:9;10720:7;10716:23;10712:33;10709:120;;;10748:79;;:::i;:::-;10709:120;10868:1;10893:85;10970:7;10961:6;10950:9;10946:22;10893:85;:::i;:::-;10883:95;;10839:149;10601:394;;;;:::o;11001:329::-;11060:6;11109:2;11097:9;11088:7;11084:23;11080:32;11077:119;;;11115:79;;:::i;:::-;11077:119;11235:1;11260:53;11305:7;11296:6;11285:9;11281:22;11260:53;:::i;:::-;11250:63;;11206:117;11001:329;;;;:::o;11336:351::-;11406:6;11455:2;11443:9;11434:7;11430:23;11426:32;11423:119;;;11461:79;;:::i;:::-;11423:119;11581:1;11606:64;11662:7;11653:6;11642:9;11638:22;11606:64;:::i;:::-;11596:74;;11552:128;11336:351;;;;:::o;11693:652::-;11770:6;11778;11827:2;11815:9;11806:7;11802:23;11798:32;11795:119;;;11833:79;;:::i;:::-;11795:119;11953:1;11978:53;12023:7;12014:6;12003:9;11999:22;11978:53;:::i;:::-;11968:63;;11924:117;12108:2;12097:9;12093:18;12080:32;12139:18;12131:6;12128:30;12125:117;;;12161:79;;:::i;:::-;12125:117;12266:62;12320:7;12311:6;12300:9;12296:22;12266:62;:::i;:::-;12256:72;;12051:287;11693:652;;;;;:::o;12351:619::-;12428:6;12436;12444;12493:2;12481:9;12472:7;12468:23;12464:32;12461:119;;;12499:79;;:::i;:::-;12461:119;12619:1;12644:53;12689:7;12680:6;12669:9;12665:22;12644:53;:::i;:::-;12634:63;;12590:117;12746:2;12772:53;12817:7;12808:6;12797:9;12793:22;12772:53;:::i;:::-;12762:63;;12717:118;12874:2;12900:53;12945:7;12936:6;12925:9;12921:22;12900:53;:::i;:::-;12890:63;;12845:118;12351:619;;;;;:::o;12976:659::-;13062:6;13070;13078;13127:2;13115:9;13106:7;13102:23;13098:32;13095:119;;;13133:79;;:::i;:::-;13095:119;13253:1;13278:62;13332:7;13323:6;13312:9;13308:22;13278:62;:::i;:::-;13268:72;;13224:126;13389:2;13415:64;13471:7;13462:6;13451:9;13447:22;13415:64;:::i;:::-;13405:74;;13360:129;13528:2;13554:64;13610:7;13601:6;13590:9;13586:22;13554:64;:::i;:::-;13544:74;;13499:129;12976:659;;;;;:::o;13641:179::-;13710:10;13731:46;13773:3;13765:6;13731:46;:::i;:::-;13809:4;13804:3;13800:14;13786:28;;13641:179;;;;:::o;13826:118::-;13913:24;13931:5;13913:24;:::i;:::-;13908:3;13901:37;13826:118;;:::o;13980:732::-;14099:3;14128:54;14176:5;14128:54;:::i;:::-;14198:86;14277:6;14272:3;14198:86;:::i;:::-;14191:93;;14308:56;14358:5;14308:56;:::i;:::-;14387:7;14418:1;14403:284;14428:6;14425:1;14422:13;14403:284;;;14504:6;14498:13;14531:63;14590:3;14575:13;14531:63;:::i;:::-;14524:70;;14617:60;14670:6;14617:60;:::i;:::-;14607:70;;14463:224;14450:1;14447;14443:9;14438:14;;14403:284;;;14407:14;14703:3;14696:10;;14104:608;;;13980:732;;;;:::o;14718:109::-;14799:21;14814:5;14799:21;:::i;:::-;14794:3;14787:34;14718:109;;:::o;14833:118::-;14920:24;14938:5;14920:24;:::i;:::-;14915:3;14908:37;14833:118;;:::o;14957:157::-;15062:45;15082:24;15100:5;15082:24;:::i;:::-;15062:45;:::i;:::-;15057:3;15050:58;14957:157;;:::o;15120:373::-;15224:3;15252:38;15284:5;15252:38;:::i;:::-;15306:88;15387:6;15382:3;15306:88;:::i;:::-;15299:95;;15403:52;15448:6;15443:3;15436:4;15429:5;15425:16;15403:52;:::i;:::-;15480:6;15475:3;15471:16;15464:23;;15228:265;15120:373;;;;:::o;15499:159::-;15600:51;15645:5;15600:51;:::i;:::-;15595:3;15588:64;15499:159;;:::o;15664:161::-;15766:52;15812:5;15766:52;:::i;:::-;15761:3;15754:65;15664:161;;:::o;15831:366::-;15973:3;15994:67;16058:2;16053:3;15994:67;:::i;:::-;15987:74;;16070:93;16159:3;16070:93;:::i;:::-;16188:2;16183:3;16179:12;16172:19;;15831:366;;;:::o;16203:::-;16345:3;16366:67;16430:2;16425:3;16366:67;:::i;:::-;16359:74;;16442:93;16531:3;16442:93;:::i;:::-;16560:2;16555:3;16551:12;16544:19;;16203:366;;;:::o;16575:::-;16717:3;16738:67;16802:2;16797:3;16738:67;:::i;:::-;16731:74;;16814:93;16903:3;16814:93;:::i;:::-;16932:2;16927:3;16923:12;16916:19;;16575:366;;;:::o;16947:::-;17089:3;17110:67;17174:2;17169:3;17110:67;:::i;:::-;17103:74;;17186:93;17275:3;17186:93;:::i;:::-;17304:2;17299:3;17295:12;17288:19;;16947:366;;;:::o;17319:400::-;17479:3;17500:84;17582:1;17577:3;17500:84;:::i;:::-;17493:91;;17593:93;17682:3;17593:93;:::i;:::-;17711:1;17706:3;17702:11;17695:18;;17319:400;;;:::o;17725:366::-;17867:3;17888:67;17952:2;17947:3;17888:67;:::i;:::-;17881:74;;17964:93;18053:3;17964:93;:::i;:::-;18082:2;18077:3;18073:12;18066:19;;17725:366;;;:::o;18097:::-;18239:3;18260:67;18324:2;18319:3;18260:67;:::i;:::-;18253:74;;18336:93;18425:3;18336:93;:::i;:::-;18454:2;18449:3;18445:12;18438:19;;18097:366;;;:::o;18469:::-;18611:3;18632:67;18696:2;18691:3;18632:67;:::i;:::-;18625:74;;18708:93;18797:3;18708:93;:::i;:::-;18826:2;18821:3;18817:12;18810:19;;18469:366;;;:::o;18841:::-;18983:3;19004:67;19068:2;19063:3;19004:67;:::i;:::-;18997:74;;19080:93;19169:3;19080:93;:::i;:::-;19198:2;19193:3;19189:12;19182:19;;18841:366;;;:::o;19213:::-;19355:3;19376:67;19440:2;19435:3;19376:67;:::i;:::-;19369:74;;19452:93;19541:3;19452:93;:::i;:::-;19570:2;19565:3;19561:12;19554:19;;19213:366;;;:::o;19585:::-;19727:3;19748:67;19812:2;19807:3;19748:67;:::i;:::-;19741:74;;19824:93;19913:3;19824:93;:::i;:::-;19942:2;19937:3;19933:12;19926:19;;19585:366;;;:::o;19957:::-;20099:3;20120:67;20184:2;20179:3;20120:67;:::i;:::-;20113:74;;20196:93;20285:3;20196:93;:::i;:::-;20314:2;20309:3;20305:12;20298:19;;19957:366;;;:::o;20329:::-;20471:3;20492:67;20556:2;20551:3;20492:67;:::i;:::-;20485:74;;20568:93;20657:3;20568:93;:::i;:::-;20686:2;20681:3;20677:12;20670:19;;20329:366;;;:::o;20701:::-;20843:3;20864:67;20928:2;20923:3;20864:67;:::i;:::-;20857:74;;20940:93;21029:3;20940:93;:::i;:::-;21058:2;21053:3;21049:12;21042:19;;20701:366;;;:::o;21073:::-;21215:3;21236:67;21300:2;21295:3;21236:67;:::i;:::-;21229:74;;21312:93;21401:3;21312:93;:::i;:::-;21430:2;21425:3;21421:12;21414:19;;21073:366;;;:::o;21445:::-;21587:3;21608:67;21672:2;21667:3;21608:67;:::i;:::-;21601:74;;21684:93;21773:3;21684:93;:::i;:::-;21802:2;21797:3;21793:12;21786:19;;21445:366;;;:::o;21817:::-;21959:3;21980:67;22044:2;22039:3;21980:67;:::i;:::-;21973:74;;22056:93;22145:3;22056:93;:::i;:::-;22174:2;22169:3;22165:12;22158:19;;21817:366;;;:::o;22189:::-;22331:3;22352:67;22416:2;22411:3;22352:67;:::i;:::-;22345:74;;22428:93;22517:3;22428:93;:::i;:::-;22546:2;22541:3;22537:12;22530:19;;22189:366;;;:::o;22561:::-;22703:3;22724:67;22788:2;22783:3;22724:67;:::i;:::-;22717:74;;22800:93;22889:3;22800:93;:::i;:::-;22918:2;22913:3;22909:12;22902:19;;22561:366;;;:::o;22933:::-;23075:3;23096:67;23160:2;23155:3;23096:67;:::i;:::-;23089:74;;23172:93;23261:3;23172:93;:::i;:::-;23290:2;23285:3;23281:12;23274:19;;22933:366;;;:::o;23305:::-;23447:3;23468:67;23532:2;23527:3;23468:67;:::i;:::-;23461:74;;23544:93;23633:3;23544:93;:::i;:::-;23662:2;23657:3;23653:12;23646:19;;23305:366;;;:::o;23677:::-;23819:3;23840:67;23904:2;23899:3;23840:67;:::i;:::-;23833:74;;23916:93;24005:3;23916:93;:::i;:::-;24034:2;24029:3;24025:12;24018:19;;23677:366;;;:::o;24049:108::-;24126:24;24144:5;24126:24;:::i;:::-;24121:3;24114:37;24049:108;;:::o;24163:118::-;24250:24;24268:5;24250:24;:::i;:::-;24245:3;24238:37;24163:118;;:::o;24287:112::-;24370:22;24386:5;24370:22;:::i;:::-;24365:3;24358:35;24287:112;;:::o;24405:271::-;24535:3;24557:93;24646:3;24637:6;24557:93;:::i;:::-;24550:100;;24667:3;24660:10;;24405:271;;;;:::o;24682:663::-;24923:3;24945:148;25089:3;24945:148;:::i;:::-;24938:155;;25103:75;25174:3;25165:6;25103:75;:::i;:::-;25203:2;25198:3;25194:12;25187:19;;25216:75;25287:3;25278:6;25216:75;:::i;:::-;25316:2;25311:3;25307:12;25300:19;;25336:3;25329:10;;24682:663;;;;;:::o;25351:222::-;25444:4;25482:2;25471:9;25467:18;25459:26;;25495:71;25563:1;25552:9;25548:17;25539:6;25495:71;:::i;:::-;25351:222;;;;:::o;25579:332::-;25700:4;25738:2;25727:9;25723:18;25715:26;;25751:71;25819:1;25808:9;25804:17;25795:6;25751:71;:::i;:::-;25832:72;25900:2;25889:9;25885:18;25876:6;25832:72;:::i;:::-;25579:332;;;;;:::o;25917:442::-;26066:4;26104:2;26093:9;26089:18;26081:26;;26117:71;26185:1;26174:9;26170:17;26161:6;26117:71;:::i;:::-;26198:72;26266:2;26255:9;26251:18;26242:6;26198:72;:::i;:::-;26280;26348:2;26337:9;26333:18;26324:6;26280:72;:::i;:::-;25917:442;;;;;;:::o;26365:332::-;26486:4;26524:2;26513:9;26509:18;26501:26;;26537:71;26605:1;26594:9;26590:17;26581:6;26537:71;:::i;:::-;26618:72;26686:2;26675:9;26671:18;26662:6;26618:72;:::i;:::-;26365:332;;;;;:::o;26703:373::-;26846:4;26884:2;26873:9;26869:18;26861:26;;26933:9;26927:4;26923:20;26919:1;26908:9;26904:17;26897:47;26961:108;27064:4;27055:6;26961:108;:::i;:::-;26953:116;;26703:373;;;;:::o;27082:210::-;27169:4;27207:2;27196:9;27192:18;27184:26;;27220:65;27282:1;27271:9;27267:17;27258:6;27220:65;:::i;:::-;27082:210;;;;:::o;27298:664::-;27503:4;27541:3;27530:9;27526:19;27518:27;;27555:71;27623:1;27612:9;27608:17;27599:6;27555:71;:::i;:::-;27636:72;27704:2;27693:9;27689:18;27680:6;27636:72;:::i;:::-;27718;27786:2;27775:9;27771:18;27762:6;27718:72;:::i;:::-;27800;27868:2;27857:9;27853:18;27844:6;27800:72;:::i;:::-;27882:73;27950:3;27939:9;27935:19;27926:6;27882:73;:::i;:::-;27298:664;;;;;;;;:::o;27968:332::-;28089:4;28127:2;28116:9;28112:18;28104:26;;28140:71;28208:1;28197:9;28193:17;28184:6;28140:71;:::i;:::-;28221:72;28289:2;28278:9;28274:18;28265:6;28221:72;:::i;:::-;27968:332;;;;;:::o;28306:545::-;28479:4;28517:3;28506:9;28502:19;28494:27;;28531:71;28599:1;28588:9;28584:17;28575:6;28531:71;:::i;:::-;28612:68;28676:2;28665:9;28661:18;28652:6;28612:68;:::i;:::-;28690:72;28758:2;28747:9;28743:18;28734:6;28690:72;:::i;:::-;28772;28840:2;28829:9;28825:18;28816:6;28772:72;:::i;:::-;28306:545;;;;;;;:::o;28857:250::-;28964:4;29002:2;28991:9;28987:18;28979:26;;29015:85;29097:1;29086:9;29082:17;29073:6;29015:85;:::i;:::-;28857:250;;;;:::o;29113:252::-;29221:4;29259:2;29248:9;29244:18;29236:26;;29272:86;29355:1;29344:9;29340:17;29331:6;29272:86;:::i;:::-;29113:252;;;;:::o;29371:419::-;29537:4;29575:2;29564:9;29560:18;29552:26;;29624:9;29618:4;29614:20;29610:1;29599:9;29595:17;29588:47;29652:131;29778:4;29652:131;:::i;:::-;29644:139;;29371:419;;;:::o;29796:::-;29962:4;30000:2;29989:9;29985:18;29977:26;;30049:9;30043:4;30039:20;30035:1;30024:9;30020:17;30013:47;30077:131;30203:4;30077:131;:::i;:::-;30069:139;;29796:419;;;:::o;30221:::-;30387:4;30425:2;30414:9;30410:18;30402:26;;30474:9;30468:4;30464:20;30460:1;30449:9;30445:17;30438:47;30502:131;30628:4;30502:131;:::i;:::-;30494:139;;30221:419;;;:::o;30646:::-;30812:4;30850:2;30839:9;30835:18;30827:26;;30899:9;30893:4;30889:20;30885:1;30874:9;30870:17;30863:47;30927:131;31053:4;30927:131;:::i;:::-;30919:139;;30646:419;;;:::o;31071:::-;31237:4;31275:2;31264:9;31260:18;31252:26;;31324:9;31318:4;31314:20;31310:1;31299:9;31295:17;31288:47;31352:131;31478:4;31352:131;:::i;:::-;31344:139;;31071:419;;;:::o;31496:::-;31662:4;31700:2;31689:9;31685:18;31677:26;;31749:9;31743:4;31739:20;31735:1;31724:9;31720:17;31713:47;31777:131;31903:4;31777:131;:::i;:::-;31769:139;;31496:419;;;:::o;31921:::-;32087:4;32125:2;32114:9;32110:18;32102:26;;32174:9;32168:4;32164:20;32160:1;32149:9;32145:17;32138:47;32202:131;32328:4;32202:131;:::i;:::-;32194:139;;31921:419;;;:::o;32346:::-;32512:4;32550:2;32539:9;32535:18;32527:26;;32599:9;32593:4;32589:20;32585:1;32574:9;32570:17;32563:47;32627:131;32753:4;32627:131;:::i;:::-;32619:139;;32346:419;;;:::o;32771:::-;32937:4;32975:2;32964:9;32960:18;32952:26;;33024:9;33018:4;33014:20;33010:1;32999:9;32995:17;32988:47;33052:131;33178:4;33052:131;:::i;:::-;33044:139;;32771:419;;;:::o;33196:::-;33362:4;33400:2;33389:9;33385:18;33377:26;;33449:9;33443:4;33439:20;33435:1;33424:9;33420:17;33413:47;33477:131;33603:4;33477:131;:::i;:::-;33469:139;;33196:419;;;:::o;33621:::-;33787:4;33825:2;33814:9;33810:18;33802:26;;33874:9;33868:4;33864:20;33860:1;33849:9;33845:17;33838:47;33902:131;34028:4;33902:131;:::i;:::-;33894:139;;33621:419;;;:::o;34046:::-;34212:4;34250:2;34239:9;34235:18;34227:26;;34299:9;34293:4;34289:20;34285:1;34274:9;34270:17;34263:47;34327:131;34453:4;34327:131;:::i;:::-;34319:139;;34046:419;;;:::o;34471:::-;34637:4;34675:2;34664:9;34660:18;34652:26;;34724:9;34718:4;34714:20;34710:1;34699:9;34695:17;34688:47;34752:131;34878:4;34752:131;:::i;:::-;34744:139;;34471:419;;;:::o;34896:::-;35062:4;35100:2;35089:9;35085:18;35077:26;;35149:9;35143:4;35139:20;35135:1;35124:9;35120:17;35113:47;35177:131;35303:4;35177:131;:::i;:::-;35169:139;;34896:419;;;:::o;35321:::-;35487:4;35525:2;35514:9;35510:18;35502:26;;35574:9;35568:4;35564:20;35560:1;35549:9;35545:17;35538:47;35602:131;35728:4;35602:131;:::i;:::-;35594:139;;35321:419;;;:::o;35746:::-;35912:4;35950:2;35939:9;35935:18;35927:26;;35999:9;35993:4;35989:20;35985:1;35974:9;35970:17;35963:47;36027:131;36153:4;36027:131;:::i;:::-;36019:139;;35746:419;;;:::o;36171:::-;36337:4;36375:2;36364:9;36360:18;36352:26;;36424:9;36418:4;36414:20;36410:1;36399:9;36395:17;36388:47;36452:131;36578:4;36452:131;:::i;:::-;36444:139;;36171:419;;;:::o;36596:::-;36762:4;36800:2;36789:9;36785:18;36777:26;;36849:9;36843:4;36839:20;36835:1;36824:9;36820:17;36813:47;36877:131;37003:4;36877:131;:::i;:::-;36869:139;;36596:419;;;:::o;37021:::-;37187:4;37225:2;37214:9;37210:18;37202:26;;37274:9;37268:4;37264:20;37260:1;37249:9;37245:17;37238:47;37302:131;37428:4;37302:131;:::i;:::-;37294:139;;37021:419;;;:::o;37446:::-;37612:4;37650:2;37639:9;37635:18;37627:26;;37699:9;37693:4;37689:20;37685:1;37674:9;37670:17;37663:47;37727:131;37853:4;37727:131;:::i;:::-;37719:139;;37446:419;;;:::o;37871:::-;38037:4;38075:2;38064:9;38060:18;38052:26;;38124:9;38118:4;38114:20;38110:1;38099:9;38095:17;38088:47;38152:131;38278:4;38152:131;:::i;:::-;38144:139;;37871:419;;;:::o;38296:222::-;38389:4;38427:2;38416:9;38412:18;38404:26;;38440:71;38508:1;38497:9;38493:17;38484:6;38440:71;:::i;:::-;38296:222;;;;:::o;38524:129::-;38558:6;38585:20;;:::i;:::-;38575:30;;38614:33;38642:4;38634:6;38614:33;:::i;:::-;38524:129;;;:::o;38659:75::-;38692:6;38725:2;38719:9;38709:19;;38659:75;:::o;38740:311::-;38817:4;38907:18;38899:6;38896:30;38893:56;;;38929:18;;:::i;:::-;38893:56;38979:4;38971:6;38967:17;38959:25;;39039:4;39033;39029:15;39021:23;;38740:311;;;:::o;39057:307::-;39118:4;39208:18;39200:6;39197:30;39194:56;;;39230:18;;:::i;:::-;39194:56;39268:29;39290:6;39268:29;:::i;:::-;39260:37;;39352:4;39346;39342:15;39334:23;;39057:307;;;:::o;39370:132::-;39437:4;39460:3;39452:11;;39490:4;39485:3;39481:14;39473:22;;39370:132;;;:::o;39508:114::-;39575:6;39609:5;39603:12;39593:22;;39508:114;;;:::o;39628:98::-;39679:6;39713:5;39707:12;39697:22;;39628:98;;;:::o;39732:113::-;39802:4;39834;39829:3;39825:14;39817:22;;39732:113;;;:::o;39851:184::-;39950:11;39984:6;39979:3;39972:19;40024:4;40019:3;40015:14;40000:29;;39851:184;;;;:::o;40041:147::-;40142:11;40179:3;40164:18;;40041:147;;;;:::o;40194:169::-;40278:11;40312:6;40307:3;40300:19;40352:4;40347:3;40343:14;40328:29;;40194:169;;;;:::o;40369:148::-;40471:11;40508:3;40493:18;;40369:148;;;;:::o;40523:305::-;40563:3;40582:20;40600:1;40582:20;:::i;:::-;40577:25;;40616:20;40634:1;40616:20;:::i;:::-;40611:25;;40770:1;40702:66;40698:74;40695:1;40692:81;40689:107;;;40776:18;;:::i;:::-;40689:107;40820:1;40817;40813:9;40806:16;;40523:305;;;;:::o;40834:185::-;40874:1;40891:20;40909:1;40891:20;:::i;:::-;40886:25;;40925:20;40943:1;40925:20;:::i;:::-;40920:25;;40964:1;40954:35;;40969:18;;:::i;:::-;40954:35;41011:1;41008;41004:9;40999:14;;40834:185;;;;:::o;41025:348::-;41065:7;41088:20;41106:1;41088:20;:::i;:::-;41083:25;;41122:20;41140:1;41122:20;:::i;:::-;41117:25;;41310:1;41242:66;41238:74;41235:1;41232:81;41227:1;41220:9;41213:17;41209:105;41206:131;;;41317:18;;:::i;:::-;41206:131;41365:1;41362;41358:9;41347:20;;41025:348;;;;:::o;41379:191::-;41419:4;41439:20;41457:1;41439:20;:::i;:::-;41434:25;;41473:20;41491:1;41473:20;:::i;:::-;41468:25;;41512:1;41509;41506:8;41503:34;;;41517:18;;:::i;:::-;41503:34;41562:1;41559;41555:9;41547:17;;41379:191;;;;:::o;41576:96::-;41613:7;41642:24;41660:5;41642:24;:::i;:::-;41631:35;;41576:96;;;:::o;41678:90::-;41712:7;41755:5;41748:13;41741:21;41730:32;;41678:90;;;:::o;41774:77::-;41811:7;41840:5;41829:16;;41774:77;;;:::o;41857:126::-;41894:7;41934:42;41927:5;41923:54;41912:65;;41857:126;;;:::o;41989:77::-;42026:7;42055:5;42044:16;;41989:77;;;:::o;42072:86::-;42107:7;42147:4;42140:5;42136:16;42125:27;;42072:86;;;:::o;42164:140::-;42228:9;42261:37;42292:5;42261:37;:::i;:::-;42248:50;;42164:140;;;:::o;42310:141::-;42375:9;42408:37;42439:5;42408:37;:::i;:::-;42395:50;;42310:141;;;:::o;42457:126::-;42507:9;42540:37;42571:5;42540:37;:::i;:::-;42527:50;;42457:126;;;:::o;42589:113::-;42639:9;42672:24;42690:5;42672:24;:::i;:::-;42659:37;;42589:113;;;:::o;42708:154::-;42792:6;42787:3;42782;42769:30;42854:1;42845:6;42840:3;42836:16;42829:27;42708:154;;;:::o;42868:307::-;42936:1;42946:113;42960:6;42957:1;42954:13;42946:113;;;43045:1;43040:3;43036:11;43030:18;43026:1;43021:3;43017:11;43010:39;42982:2;42979:1;42975:10;42970:15;;42946:113;;;43077:6;43074:1;43071:13;43068:101;;;43157:1;43148:6;43143:3;43139:16;43132:27;43068:101;42917:258;42868:307;;;:::o;43181:171::-;43220:3;43243:24;43261:5;43243:24;:::i;:::-;43234:33;;43289:4;43282:5;43279:15;43276:41;;;43297:18;;:::i;:::-;43276:41;43344:1;43337:5;43333:13;43326:20;;43181:171;;;:::o;43358:281::-;43441:27;43463:4;43441:27;:::i;:::-;43433:6;43429:40;43571:6;43559:10;43556:22;43535:18;43523:10;43520:34;43517:62;43514:88;;;43582:18;;:::i;:::-;43514:88;43622:10;43618:2;43611:22;43401:238;43358:281;;:::o;43645:233::-;43684:3;43707:24;43725:5;43707:24;:::i;:::-;43698:33;;43753:66;43746:5;43743:77;43740:103;;;43823:18;;:::i;:::-;43740:103;43870:1;43863:5;43859:13;43852:20;;43645:233;;;:::o;43884:79::-;43923:7;43952:5;43941:16;;43884:79;;;:::o;43969:180::-;44017:77;44014:1;44007:88;44114:4;44111:1;44104:15;44138:4;44135:1;44128:15;44155:180;44203:77;44200:1;44193:88;44300:4;44297:1;44290:15;44324:4;44321:1;44314:15;44341:180;44389:77;44386:1;44379:88;44486:4;44483:1;44476:15;44510:4;44507:1;44500:15;44527:180;44575:77;44572:1;44565:88;44672:4;44669:1;44662:15;44696:4;44693:1;44686:15;44713:180;44761:77;44758:1;44751:88;44858:4;44855:1;44848:15;44882:4;44879:1;44872:15;44899:117;45008:1;45005;44998:12;45022:117;45131:1;45128;45121:12;45268:117;45377:1;45374;45367:12;45391:117;45500:1;45497;45490:12;45514:117;45623:1;45620;45613:12;45637:117;45746:1;45743;45736:12;45760:102;45801:6;45852:2;45848:7;45843:2;45836:5;45832:14;45828:28;45818:38;;45760:102;;;:::o;45868:174::-;46008:26;46004:1;45996:6;45992:14;45985:50;45868:174;:::o;46048:181::-;46188:33;46184:1;46176:6;46172:14;46165:57;46048:181;:::o;46235:225::-;46375:34;46371:1;46363:6;46359:14;46352:58;46444:8;46439:2;46431:6;46427:15;46420:33;46235:225;:::o;46466:177::-;46606:29;46602:1;46594:6;46590:14;46583:53;46466:177;:::o;46649:214::-;46789:66;46785:1;46777:6;46773:14;46766:90;46649:214;:::o;46869:222::-;47009:34;47005:1;46997:6;46993:14;46986:58;47078:5;47073:2;47065:6;47061:15;47054:30;46869:222;:::o;47097:170::-;47237:22;47233:1;47225:6;47221:14;47214:46;47097:170;:::o;47273:162::-;47413:14;47409:1;47401:6;47397:14;47390:38;47273:162;:::o;47441:221::-;47581:34;47577:1;47569:6;47565:14;47558:58;47650:4;47645:2;47637:6;47633:15;47626:29;47441:221;:::o;47668:232::-;47808:34;47804:1;47796:6;47792:14;47785:58;47877:15;47872:2;47864:6;47860:15;47853:40;47668:232;:::o;47906:177::-;48046:29;48042:1;48034:6;48030:14;48023:53;47906:177;:::o;48089:173::-;48229:25;48225:1;48217:6;48213:14;48206:49;48089:173;:::o;48268:220::-;48408:34;48404:1;48396:6;48392:14;48385:58;48477:3;48472:2;48464:6;48460:15;48453:28;48268:220;:::o;48494:221::-;48634:34;48630:1;48622:6;48618:14;48611:58;48703:4;48698:2;48690:6;48686:15;48679:29;48494:221;:::o;48721:182::-;48861:34;48857:1;48849:6;48845:14;48838:58;48721:182;:::o;48909:176::-;49049:28;49045:1;49037:6;49033:14;49026:52;48909:176;:::o;49091:177::-;49231:29;49227:1;49219:6;49215:14;49208:53;49091:177;:::o;49274:225::-;49414:34;49410:1;49402:6;49398:14;49391:58;49483:8;49478:2;49470:6;49466:15;49459:33;49274:225;:::o;49505:231::-;49645:34;49641:1;49633:6;49629:14;49622:58;49714:14;49709:2;49701:6;49697:15;49690:39;49505:231;:::o;49742:171::-;49882:23;49878:1;49870:6;49866:14;49859:47;49742:171;:::o;49919:168::-;50059:20;50055:1;50047:6;50043:14;50036:44;49919:168;:::o;50093:181::-;50233:33;50229:1;50221:6;50217:14;50210:57;50093:181;:::o;50280:122::-;50353:24;50371:5;50353:24;:::i;:::-;50346:5;50343:35;50333:63;;50392:1;50389;50382:12;50333:63;50280:122;:::o;50408:116::-;50478:21;50493:5;50478:21;:::i;:::-;50471:5;50468:32;50458:60;;50514:1;50511;50504:12;50458:60;50408:116;:::o;50530:122::-;50603:24;50621:5;50603:24;:::i;:::-;50596:5;50593:35;50583:63;;50642:1;50639;50632:12;50583:63;50530:122;:::o;50658:::-;50731:24;50749:5;50731:24;:::i;:::-;50724:5;50721:35;50711:63;;50770:1;50767;50760:12;50711:63;50658:122;:::o;50786:118::-;50857:22;50873:5;50857:22;:::i;:::-;50850:5;50847:33;50837:61;;50894:1;50891;50884:12;50837:61;50786:118;:::o
Swarm Source
ipfs://7406b874d8bec7ae0fb6c263ca07c002ff05f7d66fb641f130825e9f65aede1f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.