Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 41 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 20546661 | 17 days ago | IN | 0 ETH | 0.0000886 | ||||
Approve | 20167611 | 69 days ago | IN | 0 ETH | 0.00031861 | ||||
Approve | 20146213 | 72 days ago | IN | 0 ETH | 0.00019992 | ||||
Approve | 20064277 | 84 days ago | IN | 0 ETH | 0.00027639 | ||||
Approve | 19925859 | 103 days ago | IN | 0 ETH | 0.00067285 | ||||
Approve | 19923571 | 104 days ago | IN | 0 ETH | 0.0004098 | ||||
Approve | 19372531 | 181 days ago | IN | 0 ETH | 0.00322896 | ||||
Approve | 19205252 | 204 days ago | IN | 0 ETH | 0.00125094 | ||||
Approve | 18772967 | 265 days ago | IN | 0 ETH | 0.00236795 | ||||
Approve | 18754422 | 267 days ago | IN | 0 ETH | 0.00142648 | ||||
Approve | 18729249 | 271 days ago | IN | 0 ETH | 0.00291803 | ||||
Approve | 18724224 | 272 days ago | IN | 0 ETH | 0.0028965 | ||||
Approve | 18719936 | 272 days ago | IN | 0 ETH | 0.00272642 | ||||
Approve | 18711075 | 274 days ago | IN | 0 ETH | 0.00398139 | ||||
Approve | 18708021 | 274 days ago | IN | 0 ETH | 0.00161205 | ||||
Approve | 18701585 | 275 days ago | IN | 0 ETH | 0.00179738 | ||||
Approve | 18699273 | 275 days ago | IN | 0 ETH | 0.00160986 | ||||
Transfer | 18699213 | 275 days ago | IN | 0 ETH | 0.00437519 | ||||
Claim Reward | 18699203 | 275 days ago | IN | 0 ETH | 0.00267942 | ||||
Transfer | 18698170 | 275 days ago | IN | 0 ETH | 0.00514786 | ||||
Approve | 18691909 | 276 days ago | IN | 0 ETH | 0.00167221 | ||||
Approve | 18690292 | 276 days ago | IN | 0 ETH | 0.00156235 | ||||
Approve | 18688412 | 277 days ago | IN | 0 ETH | 0.00211524 | ||||
Approve | 18688412 | 277 days ago | IN | 0 ETH | 0.00211524 | ||||
Approve | 18688260 | 277 days ago | IN | 0 ETH | 0.00167842 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18643095 | 283 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
PRINT
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-24 */ /** *Submitted for verification at Etherscan.io on 2023-10-30 */ // Sources flattened with hardhat v2.18.2 https://hardhat.org // SPDX-License-Identifier: GPL-2.0-or-later AND MIT AND UNLICENSED // https://github.com/CryptoEntertainmentLTD/ICSA-KYC-/blob/main/icsaprintkyc.png //GITBOOK //https://printfinance.gitbook.io/printfinance/ //Website //https://www.printfinance.net/ //Telegram //https://t.me/PRINTfinanceERC //Twitter //https://twitter.com/PrintFinanceERC //Presale via https://gempad.app/home //Tokenomics //- 1000000 Tokens //- How it works: ✅ //- buy tax with a dead line only in the very first beginning of launch, algorithmically decreases a few days after to 0 //- initial buy tax is the capital raise for the team operations //- sell tax is governance-less, the contract is capable of knowing the sell pressure and changes it algorithmically via a bonding curve //- sell taxes ranges from 0 to 30%, depending on the sell pressure. //- taxes are automatically swapped into wstETH, providing yield even when not claimed by the users yet //- 30% is the hard ceiling on the sell tax //simply put: //- 100% sell pressure in 1 hour window spikes the sell tax to 30% //- 30% sell pressure in 1 hour window: 9% sell tax //- 10% sell pressure in 1 hour window: 3% sell tax //- buy tax side: //- start buyTax is 5% //- linearly drops to 0% after 2 hours, then stays to 0% forever //- user can decide whether to claim wstETH or have it swapped for any other token pragma abicoder v2; // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ 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/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.20; /** * @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}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * 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. */ abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { mapping(address account => uint256) private _balances; mapping(address account => mapping(address spender => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * 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 returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual 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 default value returned by this function, unless * it's 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 returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual 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 `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` 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 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); 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 `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. _totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. _balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` 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. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * ``` * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } } // File @uniswap/v2-periphery/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File @uniswap/v2-periphery/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File @uniswap/v3-core/contracts/interfaces/callback/[email protected] // Original license: SPDX_License_Identifier: GPL-2.0-or-later pragma solidity >=0.5.0; /// @title Callback for IUniswapV3PoolActions#swap /// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface interface IUniswapV3SwapCallback { /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap. /// @dev In the implementation you must pay the pool tokens owed for the swap. /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory. /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped. /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call function uniswapV3SwapCallback( int256 amount0Delta, int256 amount1Delta, bytes calldata data ) external; } // File @uniswap/v3-periphery/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: GPL-2.0-or-later pragma solidity >=0.7.5; // Original pragma directive: pragma abicoder v2 /// @title Router token swapping functionality /// @notice Functions for swapping tokens via Uniswap V3 interface ISwapRouter is IUniswapV3SwapCallback { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata /// @return amountOut The amount of the received token function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } /// @notice Swaps as little as possible of one token for `amountOut` of another token /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata /// @return amountIn The amount of the input token function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; } /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed) /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata /// @return amountIn The amount of the input token function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); } // File @uniswap/v3-periphery/contracts/libraries/[email protected] // Original license: SPDX_License_Identifier: GPL-2.0-or-later pragma solidity >=0.6.0; library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF'); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST'); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA'); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'STE'); } } // File contracts/interfaces/IWETH.sol // Original license: SPDX_License_Identifier: GPL-2.0-or-later pragma solidity ^0.8.21; /// @title Interface for WETH9 interface IWETH is IERC20 { /// @notice Deposit ether to get wrapped ether function deposit() external payable; /// @notice Withdraw wrapped ether to get ether function withdraw(uint256) external; } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } // File @uniswap/v2-core/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File @uniswap/v2-core/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File contracts/RewardCollector.sol // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity ^0.8.21; contract RewardCollector { address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; constructor() { IERC20(WETH).approve(msg.sender, type(uint256).max); } } // File contracts/RewardsManager.sol // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity ^0.8.21; abstract contract RewardsManager { // ========================================================================= // rewards management. // ========================================================================= // numerator multiplier so wstETHR does not get rounded to 0. uint256 private constant precision = 1e18; // the amount of wstETH per share. uint256 public wstETHR; // total shares of this token. // (different from total supply because of fees and excluded wallets). uint256 public totalShares; // total amount of wstETH ever distributed. uint256 public totalwstETHRewards; // shareholders record. // (non excluded addresses are updated after they send/receive tokens). mapping(address => Share) private shareholders; // addresses not receiving rewards. // (populated with this token address in the constructor). mapping(address => bool) public isExcludedFromRewards; struct Share { uint256 amount; // recorded balance after last transfer. uint256 earned; // amount of wstETH earned but not claimed yet. uint256 wstETHRLast; // wstETHR value of the last time wstETH was earned. uint256 lastBlockUpdate; // last block share was updated. } function _updateShare(address holder, uint256 _balance) internal { if (isExcludedFromRewards[holder]) return; Share storage share = shareholders[holder]; _earn(share); totalShares = totalShares - share.amount + _balance; share.amount = _balance; share.lastBlockUpdate = block.number; } /** * Compute the pending rewards of the given share. * * The rewards earned since the last transfer are added to the already earned * rewards. */ function _pendingRewards( Share memory share ) private view returns (uint256) { uint256 RDiff = wstETHR - share.wstETHRLast; uint256 earned = (share.amount * RDiff) / precision; return share.earned + earned; } /** * Earn the rewards of the given share. */ function _earn(Share storage share) private { uint256 pending = _pendingRewards(share); share.earned = pending; share.wstETHRLast = wstETHR; } /** * Claim the wstETH rewards of user and returns the amount. */ function _claim(address addr) internal returns (uint256) { Share storage share = shareholders[addr]; _earn(share); uint256 earned = share.earned; share.earned = 0; return earned; } function pendingRewards (address addr) public view returns (uint256) { return _pendingRewards(shareholders[addr]); } } // File contracts/PRINT.sol // Original license: SPDX_License_Identifier: UNLICENSED pragma solidity ^0.8.21; /*** */ contract PRINT is ERC20, Ownable, ReentrancyGuard, RewardsManager { address public rewardToken = 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0; IUniswapV2Router02 public constant router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); ISwapRouter public constant swapRouter = ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564); address public immutable factory; address public immutable pair; address public immutable rewardCollector; bool private swapping; // sell tax starts at 0%, max 30% and fluctuates based on sell pressure // in a given sellPressureWindow (default 1 hour) uint256 public sellTaxLimit = 0.30 ether; uint256 public currentSellTax = 0; uint256 public currentSellPressure = 0; uint256 public sellPressureWindow = 1 hours; uint256 public lastSellPressureWindowUpdate = block.timestamp; // 5%, decay over 2 hours after buyTaxStart uint256 public buyTaxLimit = 0.05 ether; uint256 public buyTaxWindow = 2 hours; uint256 public buyTaxStart; mapping(address => bool) public isExcludedFromTax; modifier isSwapping() { if (swapping) return; swapping = true; _; swapping = false; } constructor() ERC20("PRINT FINANCE", "PRINT") Ownable(msg.sender) { factory = router.factory(); rewardCollector = address(new RewardCollector()); pair = IUniswapV2Factory(factory).createPair( address(this), router.WETH() ); isExcludedFromTax[msg.sender] = true; isExcludedFromRewards[address(this)] = true; isExcludedFromRewards[rewardCollector] = true; isExcludedFromRewards[pair] = true; isExcludedFromRewards[address(router)] = true; isExcludedFromRewards[address(0)] = true; _mint(msg.sender, 1000000 ether); } function _computeSellPressure( uint256 _amountSold ) private returns (uint256) { if ( block.timestamp > lastSellPressureWindowUpdate + sellPressureWindow ) { lastSellPressureWindowUpdate = block.timestamp; currentSellPressure = 0; } uint256 _sellPressure = (_amountSold * 1e18) / totalSupply(); currentSellPressure += _sellPressure; if (currentSellPressure > 1e18) { currentSellPressure = 1e18; } currentSellTax = (currentSellPressure * sellTaxLimit) / 1e18; //console.log("currentSellTax: %s", currentSellTax); //console.log("currentSellPressure: %s", currentSellPressure); //console.log("sellTaxLimit: %s", sellTaxLimit); //console.log("sellPressureWindow: %s", sellPressureWindow); //console.log("amountSold: %s", _amountSold); return currentSellTax; } function _update( address sender, address recipient, uint256 amount ) internal virtual override { uint256 tax; if (_isBuy(sender, recipient)) { tax = getBuyTax(); } else if (_isSell(sender, recipient)) { tax = _computeSellPressure(amount); uint256 _currentSellerBalance = balanceOf(sender); _updateShare(sender, (_currentSellerBalance > amount)? _currentSellerBalance - amount : 0 ); _swapTokensForEth(); } if (tax > 0) { uint256 fee = (amount * tax) / 1e18; amount -= fee; super._update(sender, address(this), fee); } super._update(sender, recipient, amount); _updateShare(sender, balanceOf(sender)); _updateShare(recipient, balanceOf(recipient)); } function getBuyTax() public view returns (uint256) { if (block.timestamp > buyTaxStart + buyTaxWindow) { return 0; } uint256 timePassed = block.timestamp - buyTaxStart; uint256 taxPercentage = ((buyTaxWindow - timePassed) * 1e18) / buyTaxWindow; return (taxPercentage * buyTaxLimit) / 1e18; } function _balanceOfRewardToken() private view returns (uint256) { return IERC20(rewardToken).balanceOf(address(this)); } function _swapEthForRewardToken() private { uint256 minOut = 0; uint160 priceLimit = 0; // Create the params that will be used to execute the swap uint256 balance = IERC20(router.WETH()).balanceOf(rewardCollector); if (balance == 0) return; IWETH weth = IWETH(router.WETH()); weth.transferFrom(rewardCollector, address(this), balance); weth.approve(address(swapRouter), balance); uint256 balanceBefore = _balanceOfRewardToken(); ISwapRouter.ExactInputSingleParams memory params = ISwapRouter .ExactInputSingleParams({ tokenIn: router.WETH(), tokenOut: rewardToken, fee: 100, recipient: address(this), deadline: block.timestamp, amountIn: balance, amountOutMinimum: minOut, sqrtPriceLimitX96: priceLimit }); swapRouter.exactInputSingle(params); uint256 balanceAfter = _balanceOfRewardToken(); uint256 amountOut = balanceAfter - balanceBefore; wstETHR += (amountOut * 1e18) / totalShares; totalwstETHRewards += amountOut; } function _sortTokens( address tokenA, address tokenB ) internal pure returns (address token0, address token1) { (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); } function claimReward() external nonReentrant { uint256 amount = _claim(msg.sender); TransferHelper.safeTransfer(rewardToken, msg.sender, amount); } function _getAmountOut( uint amountIn, uint reserveIn, uint reserveOut ) internal pure returns (uint amountOut) { uint amountInWithFee = amountIn * 997; uint numerator = amountInWithFee * (reserveOut); uint denominator = (reserveIn * 1000) + (amountInWithFee); amountOut = numerator / denominator; } function _swapTokensForEth() private isSwapping { uint256 balance = balanceOf(address(this)); if (balance == 0) return; super._update(address(this), pair, balance); (address input, address output) = (address(this), router.WETH()); (address token0, ) = _sortTokens(input, output); uint amountInput; uint amountOutput; { // scope to avoid stack too deep errors (uint reserve0, uint reserve1, ) = IUniswapV2Pair(pair) .getReserves(); (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput; amountOutput = _getAmountOut( amountInput, reserveInput, reserveOutput ); } (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); IUniswapV2Pair(pair).swap( amount0Out, amount1Out, rewardCollector, new bytes(0) ); _swapEthForRewardToken(); } function _isBuy( address sender, address recipient ) internal view returns (bool) { return !isExcludedFromTax[recipient] && sender == pair && recipient != address(pair); } function _isSell( address sender, address recipient ) internal view returns (bool) { return !isExcludedFromTax[sender] && recipient == pair; } function startTrading() external onlyOwner { buyTaxStart = block.timestamp; } function setBuyTaxLimit(uint256 _buyTaxLimit) external onlyOwner { require(_buyTaxLimit <= 0.10 ether, "buyTaxLimit too high"); buyTaxLimit = _buyTaxLimit; } function setSellTaxLimit(uint256 _sellTaxLimit) external onlyOwner { require(_sellTaxLimit <= 0.30 ether, "sellTaxLimit too high"); sellTaxLimit = _sellTaxLimit; } function setSellPressureWindow(uint256 _sellPressureWindow) external onlyOwner { require( _sellPressureWindow <= 1 days, "sellPressureWindow too high" ); require( _sellPressureWindow >= 1 hours, "sellPressureWindow too low" ); sellPressureWindow = _sellPressureWindow; } function addExcludedFromTax(address account) external onlyOwner { isExcludedFromTax[account] = true; } function removeExcludedFromTax(address account) external onlyOwner { isExcludedFromTax[account] = false; } function triggerRewards() external { _swapTokensForEth(); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxWindow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentSellPressure","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSellPressureWindowUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellPressureWindow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTaxLimit","type":"uint256"}],"name":"setBuyTaxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellPressureWindow","type":"uint256"}],"name":"setSellPressureWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellTaxLimit","type":"uint256"}],"name":"setSellTaxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalwstETHRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"triggerRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wstETHR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e0604052737f39c581f595b53c5cb19bd0b3f8da6c935e2ca0600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550670429d069189e0000600d555f600e555f600f55610e106010554260115566b1a2bc2ec50000601255611c2060135534801562000093575f80fd5b50336040518060400160405280600d81526020017f5052494e542046494e414e4345000000000000000000000000000000000000008152506040518060400160405280600581526020017f5052494e54000000000000000000000000000000000000000000000000000000815250816003908162000112919062001c6f565b50806004908162000124919062001c6f565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200019a575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000191919062001d96565b60405180910390fd5b620001ab816200063760201b60201c565b506001600681905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000212573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000238919062001de4565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250506040516200027990620019fd565b604051809103905ff08015801562000293573d5f803e3d5ffd5b5073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c9c6539630737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000344573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200036a919062001de4565b6040518363ffffffff1660e01b81526004016200038992919062001e14565b6020604051808303815f875af1158015620003a6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003cc919062001de4565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050600160155f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f60c05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f60a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f8073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620006313369d3c21bcecceda1000000620006fa60201b60201c565b62002407565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200076d575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040162000764919062001d96565b60405180910390fd5b620007805f83836200078460201b60201c565b5050565b5f620007978484620008e760201b60201c565b15620007b557620007ad620009b060201b60201c565b905062000836565b620007c7848462000a4b60201b60201c565b156200083557620007de8262000ad960201b60201c565b90505f620007f28562000bad60201b60201c565b9050620008238584831162000808575f62000817565b848362000816919062001e6c565b5b62000bf260201b60201c565b6200083362000ccf60201b60201c565b505b5b5f8111156200088a575f670de0b6b3a7640000828462000857919062001ea6565b62000863919062001f1d565b9050808362000873919062001e6c565b9250620008888530836200109e60201b60201c565b505b6200089d8484846200109e60201b60201c565b620008bf84620008b38662000bad60201b60201c565b62000bf260201b60201c565b620008e183620008d58562000bad60201b60201c565b62000bf260201b60201c565b50505050565b5f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156200096d575060a05173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8015620009a8575060a05173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b5f601354601454620009c3919062001f54565b421115620009d4575f905062000a48565b5f60145442620009e5919062001e6c565b90505f601354670de0b6b3a76400008360135462000a04919062001e6c565b62000a10919062001ea6565b62000a1c919062001f1d565b9050670de0b6b3a76400006012548262000a37919062001ea6565b62000a43919062001f1d565b925050505b90565b5f60155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801562000ad1575060a05173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905092915050565b5f60105460115462000aec919062001f54565b42111562000b0357426011819055505f600f819055505b5f62000b14620012c260201b60201c565b670de0b6b3a76400008462000b2a919062001ea6565b62000b36919062001f1d565b905080600f5f82825462000b4b919062001f54565b92505081905550670de0b6b3a7640000600f54111562000b7557670de0b6b3a7640000600f819055505b670de0b6b3a7640000600d54600f5462000b90919062001ea6565b62000b9c919062001f1d565b600e81905550600e54915050919050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1662000ccb575f600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905062000c9281620012cb60201b60201c565b81815f015460085462000ca6919062001e6c565b62000cb2919062001f54565b60088190555081815f0181905550438160030181905550505b5050565b600c60149054906101000a900460ff166200109c576001600c60146101000a81548160ff0219169083151502179055505f62000d113062000bad60201b60201c565b90505f810362000d22575062001081565b62000d373060a051836200109e60201b60201c565b5f8030737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d98573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000dbe919062001de4565b915091505f62000dd583836200132960201b60201c565b5090505f805f8060a05173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000e28573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000e4e919062002014565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691505f808673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161462000eb157828462000eb4565b83835b91509150818973ffffffffffffffffffffffffffffffffffffffff166370a0823160a0516040518263ffffffff1660e01b815260040162000ef6919062001d96565b602060405180830381865afa15801562000f12573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000f3891906200209c565b62000f44919062001e6c565b955062000f598683836200137960201b60201c565b9450505050505f808473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462000f9d57825f62000fa0565b5f835b9150915060a05173ffffffffffffffffffffffffffffffffffffffff1663022c0d9f838360c0515f67ffffffffffffffff81111562000fe45762000fe362001a15565b5b6040519080825280601f01601f191660200182016040528015620010175781602001600182028036833780820191505090505b506040518563ffffffff1660e01b815260040162001039949392919062002171565b5f604051808303815f87803b15801562001051575f80fd5b505af115801562001064573d5f803e3d5ffd5b5050505062001078620013d860201b60201c565b50505050505050505b5f600c60146101000a81548160ff0219169083151502179055505b565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620010f2578060025f828254620010e5919062001f54565b92505081905550620011c3565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156200117e578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016200117593929190620021c3565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200120c578060025f828254039250508190555062001256565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620012b59190620021fe565b60405180910390a3505050565b5f600254905090565b5f6200130f826040518060800160405290815f82015481526020016001820154815260200160028201548152602001600382015481525050620018fd60201b60201c565b905080826001018190555060075482600201819055505050565b5f808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610620013675782846200136a565b83835b80925081935050509250929050565b5f806103e5856200138b919062001ea6565b90505f83826200139c919062001ea6565b90505f826103e887620013b0919062001ea6565b620013bc919062001f54565b90508082620013cc919062001f1d565b93505050509392505050565b5f805f737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001439573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200145f919062001de4565b73ffffffffffffffffffffffffffffffffffffffff166370a0823160c0516040518263ffffffff1660e01b81526004016200149b919062001d96565b602060405180830381865afa158015620014b7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620014dd91906200209c565b90505f8103620014f057505050620018fb565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200154f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001575919062001de4565b90508073ffffffffffffffffffffffffffffffffffffffff166323b872dd60c05130856040518463ffffffff1660e01b8152600401620015b89392919062002219565b6020604051808303815f875af1158015620015d5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620015fb91906200228e565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373e592427a0aece92de3edee1f18e0157c05861564846040518363ffffffff1660e01b81526004016200164d929190620022be565b6020604051808303815f875af11580156200166a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200169091906200228e565b505f620016a26200195960201b60201c565b90505f604051806101000160405280737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200170f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001735919062001de4565b73ffffffffffffffffffffffffffffffffffffffff168152602001600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001606462ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018581526020018781526020018673ffffffffffffffffffffffffffffffffffffffff16815250905073e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b8152600401620018329190620023eb565b6020604051808303815f875af11580156200184f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200187591906200209c565b505f620018876200195960201b60201c565b90505f838262001898919062001e6c565b9050600854670de0b6b3a764000082620018b3919062001ea6565b620018bf919062001f1d565b60075f828254620018d1919062001f54565b925050819055508060095f828254620018eb919062001f54565b9250508190555050505050505050505b565b5f80826040015160075462001913919062001e6c565b90505f670de0b6b3a764000082855f015162001930919062001ea6565b6200193c919062001f1d565b905080846020015162001950919062001f54565b92505050919050565b5f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401620019b6919062001d96565b602060405180830381865afa158015620019d2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620019f891906200209c565b905090565b6101f180620059af83390190565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062001a8757607f821691505b60208210810362001a9d5762001a9c62001a42565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262001b017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001ac4565b62001b0d868362001ac4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62001b5762001b5162001b4b8462001b25565b62001b2e565b62001b25565b9050919050565b5f819050919050565b62001b728362001b37565b62001b8a62001b818262001b5e565b84845462001ad0565b825550505050565b5f90565b62001ba062001b92565b62001bad81848462001b67565b505050565b5b8181101562001bd45762001bc85f8262001b96565b60018101905062001bb3565b5050565b601f82111562001c235762001bed8162001aa3565b62001bf88462001ab5565b8101602085101562001c08578190505b62001c2062001c178562001ab5565b83018262001bb2565b50505b505050565b5f82821c905092915050565b5f62001c455f198460080262001c28565b1980831691505092915050565b5f62001c5f838362001c34565b9150826002028217905092915050565b62001c7a8262001a0b565b67ffffffffffffffff81111562001c965762001c9562001a15565b5b62001ca2825462001a6f565b62001caf82828562001bd8565b5f60209050601f83116001811462001ce5575f841562001cd0578287015190505b62001cdc858262001c52565b86555062001d4b565b601f19841662001cf58662001aa3565b5f5b8281101562001d1e5784890151825560018201915060208501945060208101905062001cf7565b8683101562001d3e578489015162001d3a601f89168262001c34565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62001d7e8262001d53565b9050919050565b62001d908162001d72565b82525050565b5f60208201905062001dab5f83018462001d85565b92915050565b5f80fd5b62001dc08162001d72565b811462001dcb575f80fd5b50565b5f8151905062001dde8162001db5565b92915050565b5f6020828403121562001dfc5762001dfb62001db1565b5b5f62001e0b8482850162001dce565b91505092915050565b5f60408201905062001e295f83018562001d85565b62001e38602083018462001d85565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62001e788262001b25565b915062001e858362001b25565b925082820390508181111562001ea05762001e9f62001e3f565b5b92915050565b5f62001eb28262001b25565b915062001ebf8362001b25565b925082820262001ecf8162001b25565b9150828204841483151762001ee95762001ee862001e3f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62001f298262001b25565b915062001f368362001b25565b92508262001f495762001f4862001ef0565b5b828204905092915050565b5f62001f608262001b25565b915062001f6d8362001b25565b925082820190508082111562001f885762001f8762001e3f565b5b92915050565b5f6dffffffffffffffffffffffffffff82169050919050565b62001fb28162001f8e565b811462001fbd575f80fd5b50565b5f8151905062001fd08162001fa7565b92915050565b5f63ffffffff82169050919050565b62001ff08162001fd6565b811462001ffb575f80fd5b50565b5f815190506200200e8162001fe5565b92915050565b5f805f606084860312156200202e576200202d62001db1565b5b5f6200203d8682870162001fc0565b9350506020620020508682870162001fc0565b9250506040620020638682870162001ffe565b9150509250925092565b620020788162001b25565b811462002083575f80fd5b50565b5f8151905062002096816200206d565b92915050565b5f60208284031215620020b457620020b362001db1565b5b5f620020c38482850162002086565b91505092915050565b620020d78162001b25565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101562002116578082015181840152602081019050620020f9565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6200213d82620020dd565b620021498185620020e7565b93506200215b818560208601620020f7565b620021668162002121565b840191505092915050565b5f608082019050620021865f830187620020cc565b620021956020830186620020cc565b620021a4604083018562001d85565b8181036060830152620021b8818462002131565b905095945050505050565b5f606082019050620021d85f83018662001d85565b620021e76020830185620020cc565b620021f66040830184620020cc565b949350505050565b5f602082019050620022135f830184620020cc565b92915050565b5f6060820190506200222e5f83018662001d85565b6200223d602083018562001d85565b6200224c6040830184620020cc565b949350505050565b5f8115159050919050565b6200226a8162002254565b811462002275575f80fd5b50565b5f8151905062002288816200225f565b92915050565b5f60208284031215620022a657620022a562001db1565b5b5f620022b58482850162002278565b91505092915050565b5f604082019050620022d35f83018562001d85565b620022e26020830184620020cc565b9392505050565b620022f48162001d72565b82525050565b5f62ffffff82169050919050565b6200231381620022fa565b82525050565b620023248162001b25565b82525050565b620023358162001d53565b82525050565b61010082015f820151620023525f850182620022e9565b506020820151620023676020850182620022e9565b5060408201516200237c604085018262002308565b506060820151620023916060850182620022e9565b506080820151620023a6608085018262002319565b5060a0820151620023bb60a085018262002319565b5060c0820151620023d060c085018262002319565b5060e0820151620023e560e08501826200232a565b50505050565b5f61010082019050620024015f8301846200233b565b92915050565b60805160a05160c051613537620024785f395f8181610dae015281816116df015281816120a501526121d201525f8181610d68015281816113f2015281816114b3015281816115c5015281816116a1015281816125d70152818161262e01526126da01525f610e4101526135375ff3fe608060405260043610610249575f3560e01c80638da5cb5b11610138578063c72510a5116100b5578063ec03369311610079578063ec0336931461084c578063f2fde38b14610874578063f600b0c91461089c578063f7c618c1146108c6578063f887ea40146108f0578063fa68bf971461091a57610250565b8063c72510a514610758578063cb4ca63114610782578063dc2e3760146107be578063dd62ed3e146107e8578063e76a112a1461082457610250565b8063b0d4d55f116100fc578063b0d4d55f1461069a578063b7f51c69146106c4578063b88a802f146106ee578063c31c9c0714610704578063c45a01551461072e57610250565b80638da5cb5b146105b657806395d89b41146105e0578063a8aa1b311461060a578063a9059cbb14610634578063afffd5b71461067057610250565b806331d7a262116101c657806370a082311161018a57806370a08231146104e8578063715018a614610524578063774378e41461053a57806382008b7b14610564578063837f39641461058e57610250565b806331d7a2621461041a5780633a98ef39146104565780634130d230146104805780636425eda214610496578063662c667b146104c057610250565b806323b872dd1161020d57806323b872dd1461034a578063252d723a14610386578063293230b8146103b05780632ebc61f0146103c6578063313ce567146103f057610250565b806306fdde0314610254578063095ea7b31461027e5780630e832273146102ba57806318160ddd146102f6578063216411f51461032057610250565b3661025057005b5f80fd5b34801561025f575f80fd5b50610268610942565b60405161027591906129e7565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f9190612a98565b6109d2565b6040516102b19190612af0565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db9190612b09565b6109f4565b6040516102ed9190612af0565b60405180910390f35b348015610301575f80fd5b5061030a610a11565b6040516103179190612b43565b60405180910390f35b34801561032b575f80fd5b50610334610a1a565b6040516103419190612b43565b60405180910390f35b348015610355575f80fd5b50610370600480360381019061036b9190612b5c565b610a20565b60405161037d9190612af0565b60405180910390f35b348015610391575f80fd5b5061039a610a4e565b6040516103a79190612b43565b60405180910390f35b3480156103bb575f80fd5b506103c4610ad9565b005b3480156103d1575f80fd5b506103da610aea565b6040516103e79190612b43565b60405180910390f35b3480156103fb575f80fd5b50610404610af0565b6040516104119190612bc7565b60405180910390f35b348015610425575f80fd5b50610440600480360381019061043b9190612b09565b610af8565b60405161044d9190612b43565b60405180910390f35b348015610461575f80fd5b5061046a610b77565b6040516104779190612b43565b60405180910390f35b34801561048b575f80fd5b50610494610b7d565b005b3480156104a1575f80fd5b506104aa610b87565b6040516104b79190612b43565b60405180910390f35b3480156104cb575f80fd5b506104e660048036038101906104e19190612be0565b610b8d565b005b3480156104f3575f80fd5b5061050e60048036038101906105099190612b09565b610bea565b60405161051b9190612b43565b60405180910390f35b34801561052f575f80fd5b50610538610c2f565b005b348015610545575f80fd5b5061054e610c42565b60405161055b9190612b43565b60405180910390f35b34801561056f575f80fd5b50610578610c48565b6040516105859190612b43565b60405180910390f35b348015610599575f80fd5b506105b460048036038101906105af9190612b09565b610c4e565b005b3480156105c1575f80fd5b506105ca610cae565b6040516105d79190612c1a565b60405180910390f35b3480156105eb575f80fd5b506105f4610cd6565b60405161060191906129e7565b60405180910390f35b348015610615575f80fd5b5061061e610d66565b60405161062b9190612c1a565b60405180910390f35b34801561063f575f80fd5b5061065a60048036038101906106559190612a98565b610d8a565b6040516106679190612af0565b60405180910390f35b34801561067b575f80fd5b50610684610dac565b6040516106919190612c1a565b60405180910390f35b3480156106a5575f80fd5b506106ae610dd0565b6040516106bb9190612b43565b60405180910390f35b3480156106cf575f80fd5b506106d8610dd6565b6040516106e59190612b43565b60405180910390f35b3480156106f9575f80fd5b50610702610ddc565b005b34801561070f575f80fd5b50610718610e27565b6040516107259190612c8e565b60405180910390f35b348015610739575f80fd5b50610742610e3f565b60405161074f9190612c1a565b60405180910390f35b348015610763575f80fd5b5061076c610e63565b6040516107799190612b43565b60405180910390f35b34801561078d575f80fd5b506107a860048036038101906107a39190612b09565b610e69565b6040516107b59190612af0565b60405180910390f35b3480156107c9575f80fd5b506107d2610e86565b6040516107df9190612b43565b60405180910390f35b3480156107f3575f80fd5b5061080e60048036038101906108099190612ca7565b610e8c565b60405161081b9190612b43565b60405180910390f35b34801561082f575f80fd5b5061084a60048036038101906108459190612b09565b610f0e565b005b348015610857575f80fd5b50610872600480360381019061086d9190612be0565b610f6d565b005b34801561087f575f80fd5b5061089a60048036038101906108959190612b09565b61100a565b005b3480156108a7575f80fd5b506108b061108e565b6040516108bd9190612b43565b60405180910390f35b3480156108d1575f80fd5b506108da611094565b6040516108e79190612c1a565b60405180910390f35b3480156108fb575f80fd5b506109046110b9565b6040516109119190612d05565b60405180910390f35b348015610925575f80fd5b50610940600480360381019061093b9190612be0565b6110d1565b005b60606003805461095190612d4b565b80601f016020809104026020016040519081016040528092919081815260200182805461097d90612d4b565b80156109c85780601f1061099f576101008083540402835291602001916109c8565b820191905f5260205f20905b8154815290600101906020018083116109ab57829003601f168201915b5050505050905090565b5f806109dc61112e565b90506109e9818585611135565b600191505092915050565b600b602052805f5260405f205f915054906101000a900460ff1681565b5f600254905090565b600f5481565b5f80610a2a61112e565b9050610a37858285611147565b610a428585856111d9565b60019150509392505050565b5f601354601454610a5f9190612da8565b421115610a6e575f9050610ad6565b5f60145442610a7d9190612ddb565b90505f601354670de0b6b3a764000083601354610a9a9190612ddb565b610aa49190612e0e565b610aae9190612e7c565b9050670de0b6b3a764000060125482610ac79190612e0e565b610ad19190612e7c565b925050505b90565b610ae16112c9565b42601481905550565b600d5481565b5f6012905090565b5f610b70600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f82015481526020016001820154815260200160028201548152602001600382015481525050611350565b9050919050565b60085481565b610b856113a4565b565b60115481565b610b956112c9565b670429d069189e0000811115610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790612ef6565b60405180910390fd5b80600d8190555050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c376112c9565b610c405f6117c5565b565b600e5481565b60135481565b610c566112c9565b600160155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ce590612d4b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1190612d4b565b8015610d5c5780601f10610d3357610100808354040283529160200191610d5c565b820191905f5260205f20905b815481529060010190602001808311610d3f57829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80610d9461112e565b9050610da18185856111d9565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60105481565b60125481565b610de4611888565b5f610dee336118ce565b9050610e1c600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff163383611933565b50610e25611a82565b565b73e592427a0aece92de3edee1f18e0157c0586156481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60145481565b6015602052805f5260405f205f915054906101000a900460ff1681565b60075481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610f166112c9565b5f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b610f756112c9565b62015180811115610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb290612f5e565b60405180910390fd5b610e10811015611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790612fc6565b60405180910390fd5b8060108190555050565b6110126112c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611082575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110799190612c1a565b60405180910390fd5b61108b816117c5565b50565b60095481565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6110d96112c9565b67016345785d8a0000811115611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b9061302e565b60405180910390fd5b8060128190555050565b5f33905090565b6111428383836001611a8c565b505050565b5f6111528484610e8c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111d357818110156111c4578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016111bb9392919061304c565b60405180910390fd5b6111d284848484035f611a8c565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611249575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016112409190612c1a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112b9575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016112b09190612c1a565b60405180910390fd5b6112c4838383611c5b565b505050565b6112d161112e565b73ffffffffffffffffffffffffffffffffffffffff166112ef610cae565b73ffffffffffffffffffffffffffffffffffffffff161461134e5761131261112e565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016113459190612c1a565b60405180910390fd5b565b5f8082604001516007546113649190612ddb565b90505f670de0b6b3a764000082855f015161137f9190612e0e565b6113899190612e7c565b905080846020015161139b9190612da8565b92505050919050565b600c60149054906101000a900460ff166117c3576001600c60146101000a81548160ff0219169083151502179055505f6113dd30610bea565b90505f81036113ec57506117a8565b611417307f000000000000000000000000000000000000000000000000000000000000000083611d48565b5f8030737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611477573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149b9190613095565b915091505f6114aa8383611f61565b5090505f805f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561151a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153e919061313c565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691505f808673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161461159f5782846115a2565b83835b91509150818973ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016116009190612c1a565b602060405180830381865afa15801561161b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163f91906131a0565b6116499190612ddb565b9550611656868383611faf565b9450505050505f808473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461169857825f61169b565b5f835b915091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663022c0d9f83837f00000000000000000000000000000000000000000000000000000000000000005f67ffffffffffffffff811115611718576117176131cb565b5b6040519080825280601f01601f19166020018201604052801561174a5781602001600182028036833780820191505090505b506040518563ffffffff1660e01b815260040161176a949392919061324a565b5f604051808303815f87803b158015611781575f80fd5b505af1158015611793573d5f803e3d5ffd5b5050505061179f612004565b50505050505050505b5f600c60146101000a81548160ff0219169083151502179055505b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6002600654036118c4576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b5f80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506119188161252c565b5f816001015490505f82600101819055508092505050919050565b5f808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401611967929190613294565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516119d191906132f5565b5f604051808303815f865af19150503d805f8114611a0a576040519150601f19603f3d011682016040523d82523d5f602084013e611a0f565b606091505b5091509150818015611a3c57505f81511480611a3b575080806020019051810190611a3a9190613335565b5b5b611a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a72906133aa565b60405180910390fd5b5050505050565b6001600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611afc575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611af39190612c1a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b6c575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611b639190612c1a565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611c55578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611c4c9190612b43565b60405180910390a35b50505050565b5f611c668484612582565b15611c7a57611c73610a4e565b9050611cce565b611c848484612685565b15611ccd57611c9282612730565b90505f611c9e85610bea565b9050611cc385848311611cb1575f611cbe565b8483611cbd9190612ddb565b5b6127ee565b611ccb6113a4565b505b5b5f811115611d13575f670de0b6b3a76400008284611cec9190612e0e565b611cf69190612e7c565b90508083611d049190612ddb565b9250611d11853083611d48565b505b611d1e848484611d48565b611d3084611d2b86610bea565b6127ee565b611d4283611d3d85610bea565b6127ee565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d98578060025f828254611d8c9190612da8565b92505081905550611e66565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611e21578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611e189392919061304c565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ead578060025f8282540392505081905550611ef7565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f549190612b43565b60405180910390a3505050565b5f808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610611f9d578284611fa0565b83835b80925081935050509250929050565b5f806103e585611fbf9190612e0e565b90505f8382611fce9190612e0e565b90505f826103e887611fe09190612e0e565b611fea9190612da8565b90508082611ff89190612e7c565b93505050509392505050565b5f805f737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612064573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120889190613095565b73ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016120e09190612c1a565b602060405180830381865afa1580156120fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061211f91906131a0565b90505f81036121305750505061252a565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561218e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b29190613095565b90508073ffffffffffffffffffffffffffffffffffffffff166323b872dd7f000000000000000000000000000000000000000000000000000000000000000030856040518463ffffffff1660e01b8152600401612211939291906133c8565b6020604051808303815f875af115801561222d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122519190613335565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373e592427a0aece92de3edee1f18e0157c05861564846040518363ffffffff1660e01b81526004016122a1929190613294565b6020604051808303815f875af11580156122bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e19190613335565b505f6122eb6128be565b90505f604051806101000160405280737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612357573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237b9190613095565b73ffffffffffffffffffffffffffffffffffffffff168152602001600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001606462ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018581526020018781526020018673ffffffffffffffffffffffffffffffffffffffff16815250905073e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b815260040161247691906134e7565b6020604051808303815f875af1158015612492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b691906131a0565b505f6124c06128be565b90505f83826124cf9190612ddb565b9050600854670de0b6b3a7640000826124e89190612e0e565b6124f29190612e7c565b60075f8282546125029190612da8565b925050819055508060095f82825461251a9190612da8565b9250508190555050505050505050505b565b5f612568826040518060800160405290815f82015481526020016001820154815260200160028201548152602001600382015481525050611350565b905080826001018190555060075482600201819055505050565b5f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561262557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b801561267d57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b5f60155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561272857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905092915050565b5f6010546011546127419190612da8565b42111561275757426011819055505f600f819055505b5f612760610a11565b670de0b6b3a7640000846127749190612e0e565b61277e9190612e7c565b905080600f5f8282546127919190612da8565b92505081905550670de0b6b3a7640000600f5411156127ba57670de0b6b3a7640000600f819055505b670de0b6b3a7640000600d54600f546127d39190612e0e565b6127dd9190612e7c565b600e81905550600e54915050919050565b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166128ba575f600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506128858161252c565b81815f01546008546128979190612ddb565b6128a19190612da8565b60088190555081815f0181905550438160030181905550505b5050565b5f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016129199190612c1a565b602060405180830381865afa158015612934573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061295891906131a0565b905090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612994578082015181840152602081019050612979565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6129b98261295d565b6129c38185612967565b93506129d3818560208601612977565b6129dc8161299f565b840191505092915050565b5f6020820190508181035f8301526129ff81846129af565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a3482612a0b565b9050919050565b612a4481612a2a565b8114612a4e575f80fd5b50565b5f81359050612a5f81612a3b565b92915050565b5f819050919050565b612a7781612a65565b8114612a81575f80fd5b50565b5f81359050612a9281612a6e565b92915050565b5f8060408385031215612aae57612aad612a07565b5b5f612abb85828601612a51565b9250506020612acc85828601612a84565b9150509250929050565b5f8115159050919050565b612aea81612ad6565b82525050565b5f602082019050612b035f830184612ae1565b92915050565b5f60208284031215612b1e57612b1d612a07565b5b5f612b2b84828501612a51565b91505092915050565b612b3d81612a65565b82525050565b5f602082019050612b565f830184612b34565b92915050565b5f805f60608486031215612b7357612b72612a07565b5b5f612b8086828701612a51565b9350506020612b9186828701612a51565b9250506040612ba286828701612a84565b9150509250925092565b5f60ff82169050919050565b612bc181612bac565b82525050565b5f602082019050612bda5f830184612bb8565b92915050565b5f60208284031215612bf557612bf4612a07565b5b5f612c0284828501612a84565b91505092915050565b612c1481612a2a565b82525050565b5f602082019050612c2d5f830184612c0b565b92915050565b5f819050919050565b5f612c56612c51612c4c84612a0b565b612c33565b612a0b565b9050919050565b5f612c6782612c3c565b9050919050565b5f612c7882612c5d565b9050919050565b612c8881612c6e565b82525050565b5f602082019050612ca15f830184612c7f565b92915050565b5f8060408385031215612cbd57612cbc612a07565b5b5f612cca85828601612a51565b9250506020612cdb85828601612a51565b9150509250929050565b5f612cef82612c5d565b9050919050565b612cff81612ce5565b82525050565b5f602082019050612d185f830184612cf6565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612d6257607f821691505b602082108103612d7557612d74612d1e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612db282612a65565b9150612dbd83612a65565b9250828201905080821115612dd557612dd4612d7b565b5b92915050565b5f612de582612a65565b9150612df083612a65565b9250828203905081811115612e0857612e07612d7b565b5b92915050565b5f612e1882612a65565b9150612e2383612a65565b9250828202612e3181612a65565b91508282048414831517612e4857612e47612d7b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612e8682612a65565b9150612e9183612a65565b925082612ea157612ea0612e4f565b5b828204905092915050565b7f73656c6c5461784c696d697420746f6f206869676800000000000000000000005f82015250565b5f612ee0601583612967565b9150612eeb82612eac565b602082019050919050565b5f6020820190508181035f830152612f0d81612ed4565b9050919050565b7f73656c6c507265737375726557696e646f7720746f6f206869676800000000005f82015250565b5f612f48601b83612967565b9150612f5382612f14565b602082019050919050565b5f6020820190508181035f830152612f7581612f3c565b9050919050565b7f73656c6c507265737375726557696e646f7720746f6f206c6f770000000000005f82015250565b5f612fb0601a83612967565b9150612fbb82612f7c565b602082019050919050565b5f6020820190508181035f830152612fdd81612fa4565b9050919050565b7f6275795461784c696d697420746f6f20686967680000000000000000000000005f82015250565b5f613018601483612967565b915061302382612fe4565b602082019050919050565b5f6020820190508181035f8301526130458161300c565b9050919050565b5f60608201905061305f5f830186612c0b565b61306c6020830185612b34565b6130796040830184612b34565b949350505050565b5f8151905061308f81612a3b565b92915050565b5f602082840312156130aa576130a9612a07565b5b5f6130b784828501613081565b91505092915050565b5f6dffffffffffffffffffffffffffff82169050919050565b6130e2816130c0565b81146130ec575f80fd5b50565b5f815190506130fd816130d9565b92915050565b5f63ffffffff82169050919050565b61311b81613103565b8114613125575f80fd5b50565b5f8151905061313681613112565b92915050565b5f805f6060848603121561315357613152612a07565b5b5f613160868287016130ef565b9350506020613171868287016130ef565b925050604061318286828701613128565b9150509250925092565b5f8151905061319a81612a6e565b92915050565b5f602082840312156131b5576131b4612a07565b5b5f6131c28482850161318c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f61321c826131f8565b6132268185613202565b9350613236818560208601612977565b61323f8161299f565b840191505092915050565b5f60808201905061325d5f830187612b34565b61326a6020830186612b34565b6132776040830185612c0b565b81810360608301526132898184613212565b905095945050505050565b5f6040820190506132a75f830185612c0b565b6132b46020830184612b34565b9392505050565b5f81905092915050565b5f6132cf826131f8565b6132d981856132bb565b93506132e9818560208601612977565b80840191505092915050565b5f61330082846132c5565b915081905092915050565b61331481612ad6565b811461331e575f80fd5b50565b5f8151905061332f8161330b565b92915050565b5f6020828403121561334a57613349612a07565b5b5f61335784828501613321565b91505092915050565b7f53540000000000000000000000000000000000000000000000000000000000005f82015250565b5f613394600283612967565b915061339f82613360565b602082019050919050565b5f6020820190508181035f8301526133c181613388565b9050919050565b5f6060820190506133db5f830186612c0b565b6133e86020830185612c0b565b6133f56040830184612b34565b949350505050565b61340681612a2a565b82525050565b5f62ffffff82169050919050565b6134238161340c565b82525050565b61343281612a65565b82525050565b61344181612a0b565b82525050565b61010082015f82015161345c5f8501826133fd565b50602082015161346f60208501826133fd565b506040820151613482604085018261341a565b50606082015161349560608501826133fd565b5060808201516134a86080850182613429565b5060a08201516134bb60a0850182613429565b5060c08201516134ce60c0850182613429565b5060e08201516134e160e0850182613438565b50505050565b5f610100820190506134fb5f830184613447565b9291505056fea26469706673582212207c91c506b79457684859e20b780c8b30c4f94712193f9c5334c392a05ef7ff8164736f6c63430008150033608060405234801561000f575f80fd5b5073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161007f92919061011c565b6020604051808303815f875af115801561009b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100bf919061017c565b506101a7565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100ee826100c5565b9050919050565b6100fe816100e4565b82525050565b5f819050919050565b61011681610104565b82525050565b5f60408201905061012f5f8301856100f5565b61013c602083018461010d565b9392505050565b5f80fd5b5f8115159050919050565b61015b81610147565b8114610165575f80fd5b50565b5f8151905061017681610152565b92915050565b5f6020828403121561019157610190610143565b5b5f61019e84828501610168565b91505092915050565b603e806101b35f395ff3fe60806040525f80fdfea26469706673582212209e288212bdad728b3b59d0b768eeedcd52a64c6a2689d424fb4fe3115ab707c764736f6c63430008150033
Deployed Bytecode
0x608060405260043610610249575f3560e01c80638da5cb5b11610138578063c72510a5116100b5578063ec03369311610079578063ec0336931461084c578063f2fde38b14610874578063f600b0c91461089c578063f7c618c1146108c6578063f887ea40146108f0578063fa68bf971461091a57610250565b8063c72510a514610758578063cb4ca63114610782578063dc2e3760146107be578063dd62ed3e146107e8578063e76a112a1461082457610250565b8063b0d4d55f116100fc578063b0d4d55f1461069a578063b7f51c69146106c4578063b88a802f146106ee578063c31c9c0714610704578063c45a01551461072e57610250565b80638da5cb5b146105b657806395d89b41146105e0578063a8aa1b311461060a578063a9059cbb14610634578063afffd5b71461067057610250565b806331d7a262116101c657806370a082311161018a57806370a08231146104e8578063715018a614610524578063774378e41461053a57806382008b7b14610564578063837f39641461058e57610250565b806331d7a2621461041a5780633a98ef39146104565780634130d230146104805780636425eda214610496578063662c667b146104c057610250565b806323b872dd1161020d57806323b872dd1461034a578063252d723a14610386578063293230b8146103b05780632ebc61f0146103c6578063313ce567146103f057610250565b806306fdde0314610254578063095ea7b31461027e5780630e832273146102ba57806318160ddd146102f6578063216411f51461032057610250565b3661025057005b5f80fd5b34801561025f575f80fd5b50610268610942565b60405161027591906129e7565b60405180910390f35b348015610289575f80fd5b506102a4600480360381019061029f9190612a98565b6109d2565b6040516102b19190612af0565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db9190612b09565b6109f4565b6040516102ed9190612af0565b60405180910390f35b348015610301575f80fd5b5061030a610a11565b6040516103179190612b43565b60405180910390f35b34801561032b575f80fd5b50610334610a1a565b6040516103419190612b43565b60405180910390f35b348015610355575f80fd5b50610370600480360381019061036b9190612b5c565b610a20565b60405161037d9190612af0565b60405180910390f35b348015610391575f80fd5b5061039a610a4e565b6040516103a79190612b43565b60405180910390f35b3480156103bb575f80fd5b506103c4610ad9565b005b3480156103d1575f80fd5b506103da610aea565b6040516103e79190612b43565b60405180910390f35b3480156103fb575f80fd5b50610404610af0565b6040516104119190612bc7565b60405180910390f35b348015610425575f80fd5b50610440600480360381019061043b9190612b09565b610af8565b60405161044d9190612b43565b60405180910390f35b348015610461575f80fd5b5061046a610b77565b6040516104779190612b43565b60405180910390f35b34801561048b575f80fd5b50610494610b7d565b005b3480156104a1575f80fd5b506104aa610b87565b6040516104b79190612b43565b60405180910390f35b3480156104cb575f80fd5b506104e660048036038101906104e19190612be0565b610b8d565b005b3480156104f3575f80fd5b5061050e60048036038101906105099190612b09565b610bea565b60405161051b9190612b43565b60405180910390f35b34801561052f575f80fd5b50610538610c2f565b005b348015610545575f80fd5b5061054e610c42565b60405161055b9190612b43565b60405180910390f35b34801561056f575f80fd5b50610578610c48565b6040516105859190612b43565b60405180910390f35b348015610599575f80fd5b506105b460048036038101906105af9190612b09565b610c4e565b005b3480156105c1575f80fd5b506105ca610cae565b6040516105d79190612c1a565b60405180910390f35b3480156105eb575f80fd5b506105f4610cd6565b60405161060191906129e7565b60405180910390f35b348015610615575f80fd5b5061061e610d66565b60405161062b9190612c1a565b60405180910390f35b34801561063f575f80fd5b5061065a60048036038101906106559190612a98565b610d8a565b6040516106679190612af0565b60405180910390f35b34801561067b575f80fd5b50610684610dac565b6040516106919190612c1a565b60405180910390f35b3480156106a5575f80fd5b506106ae610dd0565b6040516106bb9190612b43565b60405180910390f35b3480156106cf575f80fd5b506106d8610dd6565b6040516106e59190612b43565b60405180910390f35b3480156106f9575f80fd5b50610702610ddc565b005b34801561070f575f80fd5b50610718610e27565b6040516107259190612c8e565b60405180910390f35b348015610739575f80fd5b50610742610e3f565b60405161074f9190612c1a565b60405180910390f35b348015610763575f80fd5b5061076c610e63565b6040516107799190612b43565b60405180910390f35b34801561078d575f80fd5b506107a860048036038101906107a39190612b09565b610e69565b6040516107b59190612af0565b60405180910390f35b3480156107c9575f80fd5b506107d2610e86565b6040516107df9190612b43565b60405180910390f35b3480156107f3575f80fd5b5061080e60048036038101906108099190612ca7565b610e8c565b60405161081b9190612b43565b60405180910390f35b34801561082f575f80fd5b5061084a60048036038101906108459190612b09565b610f0e565b005b348015610857575f80fd5b50610872600480360381019061086d9190612be0565b610f6d565b005b34801561087f575f80fd5b5061089a60048036038101906108959190612b09565b61100a565b005b3480156108a7575f80fd5b506108b061108e565b6040516108bd9190612b43565b60405180910390f35b3480156108d1575f80fd5b506108da611094565b6040516108e79190612c1a565b60405180910390f35b3480156108fb575f80fd5b506109046110b9565b6040516109119190612d05565b60405180910390f35b348015610925575f80fd5b50610940600480360381019061093b9190612be0565b6110d1565b005b60606003805461095190612d4b565b80601f016020809104026020016040519081016040528092919081815260200182805461097d90612d4b565b80156109c85780601f1061099f576101008083540402835291602001916109c8565b820191905f5260205f20905b8154815290600101906020018083116109ab57829003601f168201915b5050505050905090565b5f806109dc61112e565b90506109e9818585611135565b600191505092915050565b600b602052805f5260405f205f915054906101000a900460ff1681565b5f600254905090565b600f5481565b5f80610a2a61112e565b9050610a37858285611147565b610a428585856111d9565b60019150509392505050565b5f601354601454610a5f9190612da8565b421115610a6e575f9050610ad6565b5f60145442610a7d9190612ddb565b90505f601354670de0b6b3a764000083601354610a9a9190612ddb565b610aa49190612e0e565b610aae9190612e7c565b9050670de0b6b3a764000060125482610ac79190612e0e565b610ad19190612e7c565b925050505b90565b610ae16112c9565b42601481905550565b600d5481565b5f6012905090565b5f610b70600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060800160405290815f82015481526020016001820154815260200160028201548152602001600382015481525050611350565b9050919050565b60085481565b610b856113a4565b565b60115481565b610b956112c9565b670429d069189e0000811115610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790612ef6565b60405180910390fd5b80600d8190555050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c376112c9565b610c405f6117c5565b565b600e5481565b60135481565b610c566112c9565b600160155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ce590612d4b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1190612d4b565b8015610d5c5780601f10610d3357610100808354040283529160200191610d5c565b820191905f5260205f20905b815481529060010190602001808311610d3f57829003601f168201915b5050505050905090565b7f0000000000000000000000005f04b08dd10e2b73aff5fda4f5b649ab5d4fb12e81565b5f80610d9461112e565b9050610da18185856111d9565b600191505092915050565b7f0000000000000000000000006d1142d83db22c228003a27231c1b336670e050e81565b60105481565b60125481565b610de4611888565b5f610dee336118ce565b9050610e1c600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff163383611933565b50610e25611a82565b565b73e592427a0aece92de3edee1f18e0157c0586156481565b7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b60145481565b6015602052805f5260405f205f915054906101000a900460ff1681565b60075481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610f166112c9565b5f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b610f756112c9565b62015180811115610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb290612f5e565b60405180910390fd5b610e10811015611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790612fc6565b60405180910390fd5b8060108190555050565b6110126112c9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611082575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110799190612c1a565b60405180910390fd5b61108b816117c5565b50565b60095481565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6110d96112c9565b67016345785d8a0000811115611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b9061302e565b60405180910390fd5b8060128190555050565b5f33905090565b6111428383836001611a8c565b505050565b5f6111528484610e8c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111d357818110156111c4578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016111bb9392919061304c565b60405180910390fd5b6111d284848484035f611a8c565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611249575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016112409190612c1a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112b9575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016112b09190612c1a565b60405180910390fd5b6112c4838383611c5b565b505050565b6112d161112e565b73ffffffffffffffffffffffffffffffffffffffff166112ef610cae565b73ffffffffffffffffffffffffffffffffffffffff161461134e5761131261112e565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016113459190612c1a565b60405180910390fd5b565b5f8082604001516007546113649190612ddb565b90505f670de0b6b3a764000082855f015161137f9190612e0e565b6113899190612e7c565b905080846020015161139b9190612da8565b92505050919050565b600c60149054906101000a900460ff166117c3576001600c60146101000a81548160ff0219169083151502179055505f6113dd30610bea565b90505f81036113ec57506117a8565b611417307f0000000000000000000000005f04b08dd10e2b73aff5fda4f5b649ab5d4fb12e83611d48565b5f8030737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611477573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149b9190613095565b915091505f6114aa8383611f61565b5090505f805f807f0000000000000000000000005f04b08dd10e2b73aff5fda4f5b649ab5d4fb12e73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561151a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153e919061313c565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691505f808673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161461159f5782846115a2565b83835b91509150818973ffffffffffffffffffffffffffffffffffffffff166370a082317f0000000000000000000000005f04b08dd10e2b73aff5fda4f5b649ab5d4fb12e6040518263ffffffff1660e01b81526004016116009190612c1a565b602060405180830381865afa15801561161b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163f91906131a0565b6116499190612ddb565b9550611656868383611faf565b9450505050505f808473ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461169857825f61169b565b5f835b915091507f0000000000000000000000005f04b08dd10e2b73aff5fda4f5b649ab5d4fb12e73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f83837f0000000000000000000000006d1142d83db22c228003a27231c1b336670e050e5f67ffffffffffffffff811115611718576117176131cb565b5b6040519080825280601f01601f19166020018201604052801561174a5781602001600182028036833780820191505090505b506040518563ffffffff1660e01b815260040161176a949392919061324a565b5f604051808303815f87803b158015611781575f80fd5b505af1158015611793573d5f803e3d5ffd5b5050505061179f612004565b50505050505050505b5f600c60146101000a81548160ff0219169083151502179055505b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6002600654036118c4576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b5f80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506119188161252c565b5f816001015490505f82600101819055508092505050919050565b5f808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401611967929190613294565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516119d191906132f5565b5f604051808303815f865af19150503d805f8114611a0a576040519150601f19603f3d011682016040523d82523d5f602084013e611a0f565b606091505b5091509150818015611a3c57505f81511480611a3b575080806020019051810190611a3a9190613335565b5b5b611a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a72906133aa565b60405180910390fd5b5050505050565b6001600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611afc575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611af39190612c1a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b6c575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611b639190612c1a565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611c55578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611c4c9190612b43565b60405180910390a35b50505050565b5f611c668484612582565b15611c7a57611c73610a4e565b9050611cce565b611c848484612685565b15611ccd57611c9282612730565b90505f611c9e85610bea565b9050611cc385848311611cb1575f611cbe565b8483611cbd9190612ddb565b5b6127ee565b611ccb6113a4565b505b5b5f811115611d13575f670de0b6b3a76400008284611cec9190612e0e565b611cf69190612e7c565b90508083611d049190612ddb565b9250611d11853083611d48565b505b611d1e848484611d48565b611d3084611d2b86610bea565b6127ee565b611d4283611d3d85610bea565b6127ee565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d98578060025f828254611d8c9190612da8565b92505081905550611e66565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611e21578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611e189392919061304c565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ead578060025f8282540392505081905550611ef7565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f549190612b43565b60405180910390a3505050565b5f808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610611f9d578284611fa0565b83835b80925081935050509250929050565b5f806103e585611fbf9190612e0e565b90505f8382611fce9190612e0e565b90505f826103e887611fe09190612e0e565b611fea9190612da8565b90508082611ff89190612e7c565b93505050509392505050565b5f805f737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612064573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120889190613095565b73ffffffffffffffffffffffffffffffffffffffff166370a082317f0000000000000000000000006d1142d83db22c228003a27231c1b336670e050e6040518263ffffffff1660e01b81526004016120e09190612c1a565b602060405180830381865afa1580156120fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061211f91906131a0565b90505f81036121305750505061252a565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561218e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b29190613095565b90508073ffffffffffffffffffffffffffffffffffffffff166323b872dd7f0000000000000000000000006d1142d83db22c228003a27231c1b336670e050e30856040518463ffffffff1660e01b8152600401612211939291906133c8565b6020604051808303815f875af115801561222d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122519190613335565b508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373e592427a0aece92de3edee1f18e0157c05861564846040518363ffffffff1660e01b81526004016122a1929190613294565b6020604051808303815f875af11580156122bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e19190613335565b505f6122eb6128be565b90505f604051806101000160405280737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612357573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237b9190613095565b73ffffffffffffffffffffffffffffffffffffffff168152602001600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001606462ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018581526020018781526020018673ffffffffffffffffffffffffffffffffffffffff16815250905073e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b815260040161247691906134e7565b6020604051808303815f875af1158015612492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b691906131a0565b505f6124c06128be565b90505f83826124cf9190612ddb565b9050600854670de0b6b3a7640000826124e89190612e0e565b6124f29190612e7c565b60075f8282546125029190612da8565b925050819055508060095f82825461251a9190612da8565b9250508190555050505050505050505b565b5f612568826040518060800160405290815f82015481526020016001820154815260200160028201548152602001600382015481525050611350565b905080826001018190555060075482600201819055505050565b5f60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561262557507f0000000000000000000000005f04b08dd10e2b73aff5fda4f5b649ab5d4fb12e73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b801561267d57507f0000000000000000000000005f04b08dd10e2b73aff5fda4f5b649ab5d4fb12e73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b5f60155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561272857507f0000000000000000000000005f04b08dd10e2b73aff5fda4f5b649ab5d4fb12e73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905092915050565b5f6010546011546127419190612da8565b42111561275757426011819055505f600f819055505b5f612760610a11565b670de0b6b3a7640000846127749190612e0e565b61277e9190612e7c565b905080600f5f8282546127919190612da8565b92505081905550670de0b6b3a7640000600f5411156127ba57670de0b6b3a7640000600f819055505b670de0b6b3a7640000600d54600f546127d39190612e0e565b6127dd9190612e7c565b600e81905550600e54915050919050565b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166128ba575f600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090506128858161252c565b81815f01546008546128979190612ddb565b6128a19190612da8565b60088190555081815f0181905550438160030181905550505b5050565b5f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016129199190612c1a565b602060405180830381865afa158015612934573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061295891906131a0565b905090565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612994578082015181840152602081019050612979565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6129b98261295d565b6129c38185612967565b93506129d3818560208601612977565b6129dc8161299f565b840191505092915050565b5f6020820190508181035f8301526129ff81846129af565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a3482612a0b565b9050919050565b612a4481612a2a565b8114612a4e575f80fd5b50565b5f81359050612a5f81612a3b565b92915050565b5f819050919050565b612a7781612a65565b8114612a81575f80fd5b50565b5f81359050612a9281612a6e565b92915050565b5f8060408385031215612aae57612aad612a07565b5b5f612abb85828601612a51565b9250506020612acc85828601612a84565b9150509250929050565b5f8115159050919050565b612aea81612ad6565b82525050565b5f602082019050612b035f830184612ae1565b92915050565b5f60208284031215612b1e57612b1d612a07565b5b5f612b2b84828501612a51565b91505092915050565b612b3d81612a65565b82525050565b5f602082019050612b565f830184612b34565b92915050565b5f805f60608486031215612b7357612b72612a07565b5b5f612b8086828701612a51565b9350506020612b9186828701612a51565b9250506040612ba286828701612a84565b9150509250925092565b5f60ff82169050919050565b612bc181612bac565b82525050565b5f602082019050612bda5f830184612bb8565b92915050565b5f60208284031215612bf557612bf4612a07565b5b5f612c0284828501612a84565b91505092915050565b612c1481612a2a565b82525050565b5f602082019050612c2d5f830184612c0b565b92915050565b5f819050919050565b5f612c56612c51612c4c84612a0b565b612c33565b612a0b565b9050919050565b5f612c6782612c3c565b9050919050565b5f612c7882612c5d565b9050919050565b612c8881612c6e565b82525050565b5f602082019050612ca15f830184612c7f565b92915050565b5f8060408385031215612cbd57612cbc612a07565b5b5f612cca85828601612a51565b9250506020612cdb85828601612a51565b9150509250929050565b5f612cef82612c5d565b9050919050565b612cff81612ce5565b82525050565b5f602082019050612d185f830184612cf6565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612d6257607f821691505b602082108103612d7557612d74612d1e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612db282612a65565b9150612dbd83612a65565b9250828201905080821115612dd557612dd4612d7b565b5b92915050565b5f612de582612a65565b9150612df083612a65565b9250828203905081811115612e0857612e07612d7b565b5b92915050565b5f612e1882612a65565b9150612e2383612a65565b9250828202612e3181612a65565b91508282048414831517612e4857612e47612d7b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612e8682612a65565b9150612e9183612a65565b925082612ea157612ea0612e4f565b5b828204905092915050565b7f73656c6c5461784c696d697420746f6f206869676800000000000000000000005f82015250565b5f612ee0601583612967565b9150612eeb82612eac565b602082019050919050565b5f6020820190508181035f830152612f0d81612ed4565b9050919050565b7f73656c6c507265737375726557696e646f7720746f6f206869676800000000005f82015250565b5f612f48601b83612967565b9150612f5382612f14565b602082019050919050565b5f6020820190508181035f830152612f7581612f3c565b9050919050565b7f73656c6c507265737375726557696e646f7720746f6f206c6f770000000000005f82015250565b5f612fb0601a83612967565b9150612fbb82612f7c565b602082019050919050565b5f6020820190508181035f830152612fdd81612fa4565b9050919050565b7f6275795461784c696d697420746f6f20686967680000000000000000000000005f82015250565b5f613018601483612967565b915061302382612fe4565b602082019050919050565b5f6020820190508181035f8301526130458161300c565b9050919050565b5f60608201905061305f5f830186612c0b565b61306c6020830185612b34565b6130796040830184612b34565b949350505050565b5f8151905061308f81612a3b565b92915050565b5f602082840312156130aa576130a9612a07565b5b5f6130b784828501613081565b91505092915050565b5f6dffffffffffffffffffffffffffff82169050919050565b6130e2816130c0565b81146130ec575f80fd5b50565b5f815190506130fd816130d9565b92915050565b5f63ffffffff82169050919050565b61311b81613103565b8114613125575f80fd5b50565b5f8151905061313681613112565b92915050565b5f805f6060848603121561315357613152612a07565b5b5f613160868287016130ef565b9350506020613171868287016130ef565b925050604061318286828701613128565b9150509250925092565b5f8151905061319a81612a6e565b92915050565b5f602082840312156131b5576131b4612a07565b5b5f6131c28482850161318c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f61321c826131f8565b6132268185613202565b9350613236818560208601612977565b61323f8161299f565b840191505092915050565b5f60808201905061325d5f830187612b34565b61326a6020830186612b34565b6132776040830185612c0b565b81810360608301526132898184613212565b905095945050505050565b5f6040820190506132a75f830185612c0b565b6132b46020830184612b34565b9392505050565b5f81905092915050565b5f6132cf826131f8565b6132d981856132bb565b93506132e9818560208601612977565b80840191505092915050565b5f61330082846132c5565b915081905092915050565b61331481612ad6565b811461331e575f80fd5b50565b5f8151905061332f8161330b565b92915050565b5f6020828403121561334a57613349612a07565b5b5f61335784828501613321565b91505092915050565b7f53540000000000000000000000000000000000000000000000000000000000005f82015250565b5f613394600283612967565b915061339f82613360565b602082019050919050565b5f6020820190508181035f8301526133c181613388565b9050919050565b5f6060820190506133db5f830186612c0b565b6133e86020830185612c0b565b6133f56040830184612b34565b949350505050565b61340681612a2a565b82525050565b5f62ffffff82169050919050565b6134238161340c565b82525050565b61343281612a65565b82525050565b61344181612a0b565b82525050565b61010082015f82015161345c5f8501826133fd565b50602082015161346f60208501826133fd565b506040820151613482604085018261341a565b50606082015161349560608501826133fd565b5060808201516134a86080850182613429565b5060a08201516134bb60a0850182613429565b5060c08201516134ce60c0850182613429565b5060e08201516134e160e0850182613438565b50505050565b5f610100820190506134fb5f830184613447565b9291505056fea26469706673582212207c91c506b79457684859e20b780c8b30c4f94712193f9c5334c392a05ef7ff8164736f6c63430008150033
Deployed Bytecode Sourcemap
50414:9414:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18260:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20553:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48353:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19362:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51183:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21321:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54283:359;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58579:91;;;;;;;;;;;;;:::i;:::-;;51096:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19213:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50124:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47961:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59715:73;;;;;;;;;;;;;:::i;:::-;;51278:61;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58866:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19524:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4919:103;;;;;;;;;;;;;:::i;:::-;;51143:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51443:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59463:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4244:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18470:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50847:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19847:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50883:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51228:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51397:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56291:170;;;;;;;;;;;;;:::i;:::-;;50694:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50808:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51487:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51522:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47818:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20092:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59587:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59060:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5177:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48045:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50492:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50572:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58678:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18260:91;18305:13;18338:5;18331:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18260:91;:::o;20553:190::-;20626:4;20643:13;20659:12;:10;:12::i;:::-;20643:28;;20682:31;20691:5;20698:7;20707:5;20682:8;:31::i;:::-;20731:4;20724:11;;;20553:190;;;;:::o;48353:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;19362:99::-;19414:7;19441:12;;19434:19;;19362:99;:::o;51183:38::-;;;;:::o;21321:249::-;21408:4;21425:15;21443:12;:10;:12::i;:::-;21425:30;;21466:37;21482:4;21488:7;21497:5;21466:15;:37::i;:::-;21514:26;21524:4;21530:2;21534:5;21514:9;:26::i;:::-;21558:4;21551:11;;;21321:249;;;;;:::o;54283:359::-;54325:7;54381:12;;54367:11;;:26;;;;:::i;:::-;54349:15;:44;54345:85;;;54417:1;54410:8;;;;54345:85;54442:18;54481:11;;54463:15;:29;;;;:::i;:::-;54442:50;;54503:21;54566:12;;54558:4;54544:10;54529:12;;:25;;;;:::i;:::-;54528:34;;;;:::i;:::-;54527:51;;;;:::i;:::-;54503:75;;54630:4;54615:11;;54599:13;:27;;;;:::i;:::-;54598:36;;;;:::i;:::-;54591:43;;;;54283:359;;:::o;58579:91::-;4130:13;:11;:13::i;:::-;58647:15:::1;58633:11;:29;;;;58579:91::o:0;51096:40::-;;;;:::o;19213:84::-;19262:5;19287:2;19280:9;;19213:84;:::o;50124:130::-;50184:7;50211:35;50227:12;:18;50240:4;50227:18;;;;;;;;;;;;;;;50211:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:35::i;:::-;50204:42;;50124:130;;;:::o;47961:26::-;;;;:::o;59715:73::-;59761:19;:17;:19::i;:::-;59715:73::o;51278:61::-;;;;:::o;58866:186::-;4130:13;:11;:13::i;:::-;58969:10:::1;58952:13;:27;;58944:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59031:13;59016:12;:28;;;;58866:186:::0;:::o;19524:118::-;19589:7;19616:9;:18;19626:7;19616:18;;;;;;;;;;;;;;;;19609:25;;19524:118;;;:::o;4919:103::-;4130:13;:11;:13::i;:::-;4984:30:::1;5011:1;4984:18;:30::i;:::-;4919:103::o:0;51143:33::-;;;;:::o;51443:37::-;;;;:::o;59463:116::-;4130:13;:11;:13::i;:::-;59567:4:::1;59538:17;:26;59556:7;59538:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;59463:116:::0;:::o;4244:87::-;4290:7;4317:6;;;;;;;;;;;4310:13;;4244:87;:::o;18470:95::-;18517:13;18550:7;18543:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18470:95;:::o;50847:29::-;;;:::o;19847:182::-;19916:4;19933:13;19949:12;:10;:12::i;:::-;19933:28;;19972:27;19982:5;19989:2;19993:5;19972:9;:27::i;:::-;20017:4;20010:11;;;19847:182;;;;:::o;50883:40::-;;;:::o;51228:43::-;;;;:::o;51397:39::-;;;;:::o;56291:170::-;42600:21;:19;:21::i;:::-;56347:14:::1;56364:18;56371:10;56364:6;:18::i;:::-;56347:35;;56393:60;56421:11;;;;;;;;;;;56434:10;56446:6;56393:27;:60::i;:::-;56336:125;42644:20:::0;:18;:20::i;:::-;56291:170::o;50694:105::-;50756:42;50694:105;:::o;50808:32::-;;;:::o;51487:26::-;;;;:::o;51522:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;47818:22::-;;;;:::o;20092:142::-;20172:7;20199:11;:18;20211:5;20199:18;;;;;;;;;;;;;;;:27;20218:7;20199:27;;;;;;;;;;;;;;;;20192:34;;20092:142;;;;:::o;59587:120::-;4130:13;:11;:13::i;:::-;59694:5:::1;59665:17;:26;59683:7;59665:26;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;59587:120:::0;:::o;59060:395::-;4130:13;:11;:13::i;:::-;59218:6:::1;59195:19;:29;;59173:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;59335:7;59312:19;:30;;59290:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;59428:19;59407:18;:40;;;;59060:395:::0;:::o;5177:220::-;4130:13;:11;:13::i;:::-;5282:1:::1;5262:22;;:8;:22;;::::0;5258:93:::1;;5336:1;5308:31;;;;;;;;;;;:::i;:::-;;;;;;;;5258:93;5361:28;5380:8;5361:18;:28::i;:::-;5177:220:::0;:::o;48045:33::-;;;;:::o;50492:71::-;;;;;;;;;;;;;:::o;50572:115::-;50644:42;50572:115;:::o;58678:180::-;4130:13;:11;:13::i;:::-;58778:10:::1;58762:12;:26;;58754:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;58838:12;58824:11;:26;;;;58678:180:::0;:::o;2305:98::-;2358:7;2385:10;2378:17;;2305:98;:::o;25380:130::-;25465:37;25474:5;25481:7;25490:5;25497:4;25465:8;:37::i;:::-;25380:130;;;:::o;27096:487::-;27196:24;27223:25;27233:5;27240:7;27223:9;:25::i;:::-;27196:52;;27283:17;27263:16;:37;27259:317;;27340:5;27321:16;:24;27317:132;;;27400:7;27409:16;27427:5;27373:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;27317:132;27492:57;27501:5;27508:7;27536:5;27517:16;:24;27543:5;27492:8;:57::i;:::-;27259:317;27185:398;27096:487;;;:::o;21955:308::-;22055:1;22039:18;;:4;:18;;;22035:88;;22108:1;22081:30;;;;;;;;;;;:::i;:::-;;;;;;;;22035:88;22151:1;22137:16;;:2;:16;;;22133:88;;22206:1;22177:32;;;;;;;;;;;:::i;:::-;;;;;;;;22133:88;22231:24;22239:4;22245:2;22249:5;22231:7;:24::i;:::-;21955:308;;;:::o;4409:166::-;4480:12;:10;:12::i;:::-;4469:23;;:7;:5;:7::i;:::-;:23;;;4465:103;;4543:12;:10;:12::i;:::-;4516:40;;;;;;;;;;;:::i;:::-;;;;;;;;4465:103;4409:166::o;49283:257::-;49366:7;49386:13;49412:5;:17;;;49402:7;;:27;;;;:::i;:::-;49386:43;;49440:14;47765:4;49473:5;49458;:12;;;:20;;;;:::i;:::-;49457:34;;;;:::i;:::-;49440:51;;49526:6;49511:5;:12;;;:21;;;;:::i;:::-;49504:28;;;;49283:257;;;:::o;56849:1280::-;51617:8;;;;;;;;;;;51627:7;51613:21;51655:4;51644:8;;:15;;;;;;;;;;;;;;;;;;56908::::1;56926:24;56944:4;56926:9;:24::i;:::-;56908:42;;56976:1;56965:7;:12:::0;56961:25:::1;;56979:7;;;56961:25;56996:43;57018:4;57025;57031:7;56996:13;:43::i;:::-;57051:13;57066:14:::0;57093:4:::1;50644:42;57100:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57050:64;;;;57126:14;57146:26;57158:5;57165:6;57146:11;:26::i;:::-;57125:47;;;57185:16;57212:17:::0;57309:13:::1;57324::::0;57358:4:::1;57343:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57308:87;;;;;;;;;57411:17;57430:18:::0;57461:6:::1;57452:15;;:5;:15;;;:95;;57528:8;57538;57452:95;;;57488:8;57498;57452:95;57410:137;;;;57617:12;57583:5;57576:23;;;57608:4;57576:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;57562:67;;57659:121;57691:11;57721:12;57752:13;57659;:121::i;:::-;57644:136;;57240:552;;;;57803:15;57820::::0;57848:6:::1;57839:15;;:5;:15;;;:93;;57910:12;57929:1;57839:93;;;57876:1;57880:12;57839:93;57802:130;;;;57958:4;57943:25;;;57983:10;58008;58033:15;58073:1;58063:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57943:143;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;58097:24;:22;:24::i;:::-;56897:1232;;;;;;;;51670:1;51693:5:::0;51682:8;;:16;;;;;;;;;;;;;;;;;;56849:1280;:::o;5557:191::-;5631:16;5650:6;;;;;;;;;;;5631:25;;5676:8;5667:6;;:17;;;;;;;;;;;;;;;;;;5731:8;5700:40;;5721:8;5700:40;;;;;;;;;;;;5620:128;5557:191;:::o;42680:315::-;41978:1;42809:7;;:18;42805:88;;42851:30;;;;;;;;;;;;;;42805:88;41978:1;42970:7;:17;;;;42680:315::o;49878:238::-;49926:7;49946:19;49968:12;:18;49981:4;49968:18;;;;;;;;;;;;;;;49946:40;;49999:12;50005:5;49999;:12::i;:::-;50024:14;50041:5;:12;;;50024:29;;50081:1;50066:5;:12;;:16;;;;50102:6;50095:13;;;;49878:238;;;:::o;38347:316::-;38466:12;38480:17;38501:5;:10;;38535:24;;;38561:2;38565:5;38512:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38501:71;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38465:107;;;;38591:7;:57;;;;;38618:1;38603:4;:11;:16;:44;;;;38634:4;38623:24;;;;;;;;;;;;:::i;:::-;38603:44;38591:57;38583:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;38454:209;;38347:316;;;:::o;43003:212::-;41935:1;43186:7;:21;;;;43003:212::o;26361:443::-;26491:1;26474:19;;:5;:19;;;26470:91;;26546:1;26517:32;;;;;;;;;;;:::i;:::-;;;;;;;;26470:91;26594:1;26575:21;;:7;:21;;;26571:92;;26648:1;26620:31;;;;;;;;;;;:::i;:::-;;;;;;;;26571:92;26703:5;26673:11;:18;26685:5;26673:18;;;;;;;;;;;;;;;:27;26692:7;26673:27;;;;;;;;;;;;;;;:35;;;;26723:9;26719:78;;;26770:7;26754:31;;26763:5;26754:31;;;26779:5;26754:31;;;;;;:::i;:::-;;;;;;;;26719:78;26361:443;;;;:::o;53346:929::-;53485:11;53513:25;53520:6;53528:9;53513:6;:25::i;:::-;53509:431;;;53561:11;:9;:11::i;:::-;53555:17;;53509:431;;;53594:26;53602:6;53610:9;53594:7;:26::i;:::-;53590:350;;;53643:28;53664:6;53643:20;:28::i;:::-;53637:34;;53686:29;53718:17;53728:6;53718:9;:17::i;:::-;53686:49;;53750:144;53763:6;53814;53790:21;:30;53789:90;;53878:1;53789:90;;;53869:6;53845:21;:30;;;;:::i;:::-;53789:90;53750:12;:144::i;:::-;53909:19;:17;:19::i;:::-;53622:318;53590:350;53509:431;53962:1;53956:3;:7;53952:159;;;53980:11;54011:4;54004:3;53995:6;:12;;;;:::i;:::-;53994:21;;;;:::i;:::-;53980:35;;54040:3;54030:13;;;;;:::i;:::-;;;54058:41;54072:6;54088:4;54095:3;54058:13;:41::i;:::-;53965:146;53952:159;54121:40;54135:6;54143:9;54154:6;54121:13;:40::i;:::-;54172:39;54185:6;54193:17;54203:6;54193:9;:17::i;:::-;54172:12;:39::i;:::-;54222:45;54235:9;54246:20;54256:9;54246;:20::i;:::-;54222:12;:45::i;:::-;53474:801;53346:929;;;:::o;22587:1135::-;22693:1;22677:18;;:4;:18;;;22673:552;;22831:5;22815:12;;:21;;;;;;;:::i;:::-;;;;;;;;22673:552;;;22869:19;22891:9;:15;22901:4;22891:15;;;;;;;;;;;;;;;;22869:37;;22939:5;22925:11;:19;22921:117;;;22997:4;23003:11;23016:5;22972:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;22921:117;23193:5;23179:11;:19;23161:9;:15;23171:4;23161:15;;;;;;;;;;;;;;;:37;;;;22854:371;22673:552;23255:1;23241:16;;:2;:16;;;23237:435;;23423:5;23407:12;;:21;;;;;;;;;;;23237:435;;;23640:5;23623:9;:13;23633:2;23623:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;23237:435;23704:2;23689:25;;23698:4;23689:25;;;23708:5;23689:25;;;;;;:::i;:::-;;;;;;;;22587:1135;;;:::o;56033:250::-;56134:14;56150;56205:6;56196:15;;:6;:15;;;:79;;56260:6;56268;56196:79;;;56228:6;56236;56196:79;56177:98;;;;;;;;56033:250;;;;;:::o;56469:372::-;56597:14;56624:20;56658:3;56647:8;:14;;;;:::i;:::-;56624:37;;56672:14;56708:10;56689:15;:30;;;;:::i;:::-;56672:47;;56730:16;56771:15;56762:4;56750:9;:16;;;;:::i;:::-;56749:38;;;;:::i;:::-;56730:57;;56822:11;56810:9;:23;;;;:::i;:::-;56798:35;;56613:228;;;56469:372;;;;;:::o;54792:1233::-;54845:14;54874:18;54975:15;50644:42;55000:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54993:31;;;55025:15;54993:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54975:66;;55067:1;55056:7;:12;55052:25;;55070:7;;;;;55052:25;55087:10;50644:42;55106:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55087:33;;55131:4;:17;;;55149:15;55174:4;55181:7;55131:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55200:4;:12;;;50756:42;55234:7;55200:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55253:21;55277:23;:21;:23::i;:::-;55253:47;;55311:48;55362:387;;;;;;;;50644:42;55439:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55362:387;;;;;;55481:11;;;;;;;;;;;55362:387;;;;;;55516:3;55362:387;;;;;;55557:4;55362:387;;;;;;55591:15;55362:387;;;;55635:7;55362:387;;;;55679:6;55362:387;;;;55723:10;55362:387;;;;;55311:438;;50756:42;55770:27;;;55798:6;55770:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55816:20;55839:23;:21;:23::i;:::-;55816:46;;55873:17;55908:13;55893:12;:28;;;;:::i;:::-;55873:48;;55964:11;;55956:4;55944:9;:16;;;;:::i;:::-;55943:32;;;;:::i;:::-;55932:7;;:43;;;;;;;:::i;:::-;;;;;;;;56008:9;55986:18;;:31;;;;;;;:::i;:::-;;;;;;;;54834:1191;;;;;;;;54792:1233;:::o;49611:176::-;49666:15;49684:22;49700:5;49684:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:22::i;:::-;49666:40;;49734:7;49719:5;:12;;:22;;;;49772:7;;49752:5;:17;;:27;;;;49655:132;49611:176;:::o;58137:247::-;58236:4;58274:17;:28;58292:9;58274:28;;;;;;;;;;;;;;;;;;;;;;;;;58273:29;:60;;;;;58329:4;58319:14;;:6;:14;;;58273:60;:103;;;;;58371:4;58350:26;;:9;:26;;;;58273:103;58253:123;;58137:247;;;;:::o;58392:179::-;58492:4;58517:17;:25;58535:6;58517:25;;;;;;;;;;;;;;;;;;;;;;;;;58516:26;:47;;;;;58559:4;58546:17;;:9;:17;;;58516:47;58509:54;;58392:179;;;;:::o;52376:962::-;52460:7;52547:18;;52516:28;;:49;;;;:::i;:::-;52498:15;:67;52480:208;;;52623:15;52592:28;:46;;;;52675:1;52653:19;:23;;;;52480:208;52700:21;52747:13;:11;:13::i;:::-;52739:4;52725:11;:18;;;;:::i;:::-;52724:36;;;;:::i;:::-;52700:60;;52794:13;52771:19;;:36;;;;;;;:::i;:::-;;;;;;;;52846:4;52824:19;;:26;52820:85;;;52889:4;52867:19;:26;;;;52820:85;52973:4;52957:12;;52935:19;;:34;;;;:::i;:::-;52934:43;;;;:::i;:::-;52917:14;:60;;;;53316:14;;53309:21;;;52376:962;;;:::o;48733:360::-;48813:21;:29;48835:6;48813:29;;;;;;;;;;;;;;;;;;;;;;;;;48844:7;48809:42;48871:19;48893:12;:20;48906:6;48893:20;;;;;;;;;;;;;;;48871:42;;48926:12;48932:5;48926;:12::i;:::-;48994:8;48979:5;:12;;;48965:11;;:26;;;;:::i;:::-;:37;;;;:::i;:::-;48951:11;:51;;;;49030:8;49015:5;:12;;:23;;;;49073:12;49049:5;:21;;:36;;;;48798:295;48733:360;;;:::o;54650:134::-;54705:7;54739:11;;;;;;;;;;;54732:29;;;54770:4;54732:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54725:51;;54650:134;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:329::-;3505:6;3554:2;3542:9;3533:7;3529:23;3525:32;3522:119;;;3560:79;;:::i;:::-;3522:119;3680:1;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3651:117;3446:329;;;;:::o;3781:118::-;3868:24;3886:5;3868:24;:::i;:::-;3863:3;3856:37;3781:118;;:::o;3905:222::-;3998:4;4036:2;4025:9;4021:18;4013:26;;4049:71;4117:1;4106:9;4102:17;4093:6;4049:71;:::i;:::-;3905:222;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:86::-;4793:7;4833:4;4826:5;4822:16;4811:27;;4758:86;;;:::o;4850:112::-;4933:22;4949:5;4933:22;:::i;:::-;4928:3;4921:35;4850:112;;:::o;4968:214::-;5057:4;5095:2;5084:9;5080:18;5072:26;;5108:67;5172:1;5161:9;5157:17;5148:6;5108:67;:::i;:::-;4968:214;;;;:::o;5188:329::-;5247:6;5296:2;5284:9;5275:7;5271:23;5267:32;5264:119;;;5302:79;;:::i;:::-;5264:119;5422:1;5447:53;5492:7;5483:6;5472:9;5468:22;5447:53;:::i;:::-;5437:63;;5393:117;5188:329;;;;:::o;5523:118::-;5610:24;5628:5;5610:24;:::i;:::-;5605:3;5598:37;5523:118;;:::o;5647:222::-;5740:4;5778:2;5767:9;5763:18;5755:26;;5791:71;5859:1;5848:9;5844:17;5835:6;5791:71;:::i;:::-;5647:222;;;;:::o;5875:60::-;5903:3;5924:5;5917:12;;5875:60;;;:::o;5941:142::-;5991:9;6024:53;6042:34;6051:24;6069:5;6051:24;:::i;:::-;6042:34;:::i;:::-;6024:53;:::i;:::-;6011:66;;5941:142;;;:::o;6089:126::-;6139:9;6172:37;6203:5;6172:37;:::i;:::-;6159:50;;6089:126;;;:::o;6221:146::-;6291:9;6324:37;6355:5;6324:37;:::i;:::-;6311:50;;6221:146;;;:::o;6373:171::-;6480:57;6531:5;6480:57;:::i;:::-;6475:3;6468:70;6373:171;;:::o;6550:262::-;6663:4;6701:2;6690:9;6686:18;6678:26;;6714:91;6802:1;6791:9;6787:17;6778:6;6714:91;:::i;:::-;6550:262;;;;:::o;6818:474::-;6886:6;6894;6943:2;6931:9;6922:7;6918:23;6914:32;6911:119;;;6949:79;;:::i;:::-;6911:119;7069:1;7094:53;7139:7;7130:6;7119:9;7115:22;7094:53;:::i;:::-;7084:63;;7040:117;7196:2;7222:53;7267:7;7258:6;7247:9;7243:22;7222:53;:::i;:::-;7212:63;;7167:118;6818:474;;;;;:::o;7298:153::-;7375:9;7408:37;7439:5;7408:37;:::i;:::-;7395:50;;7298:153;;;:::o;7457:185::-;7571:64;7629:5;7571:64;:::i;:::-;7566:3;7559:77;7457:185;;:::o;7648:276::-;7768:4;7806:2;7795:9;7791:18;7783:26;;7819:98;7914:1;7903:9;7899:17;7890:6;7819:98;:::i;:::-;7648:276;;;;:::o;7930:180::-;7978:77;7975:1;7968:88;8075:4;8072:1;8065:15;8099:4;8096:1;8089:15;8116:320;8160:6;8197:1;8191:4;8187:12;8177:22;;8244:1;8238:4;8234:12;8265:18;8255:81;;8321:4;8313:6;8309:17;8299:27;;8255:81;8383:2;8375:6;8372:14;8352:18;8349:38;8346:84;;8402:18;;:::i;:::-;8346:84;8167:269;8116:320;;;:::o;8442:180::-;8490:77;8487:1;8480:88;8587:4;8584:1;8577:15;8611:4;8608:1;8601:15;8628:191;8668:3;8687:20;8705:1;8687:20;:::i;:::-;8682:25;;8721:20;8739:1;8721:20;:::i;:::-;8716:25;;8764:1;8761;8757:9;8750:16;;8785:3;8782:1;8779:10;8776:36;;;8792:18;;:::i;:::-;8776:36;8628:191;;;;:::o;8825:194::-;8865:4;8885:20;8903:1;8885:20;:::i;:::-;8880:25;;8919:20;8937:1;8919:20;:::i;:::-;8914:25;;8963:1;8960;8956:9;8948:17;;8987:1;8981:4;8978:11;8975:37;;;8992:18;;:::i;:::-;8975:37;8825:194;;;;:::o;9025:410::-;9065:7;9088:20;9106:1;9088:20;:::i;:::-;9083:25;;9122:20;9140:1;9122:20;:::i;:::-;9117:25;;9177:1;9174;9170:9;9199:30;9217:11;9199:30;:::i;:::-;9188:41;;9378:1;9369:7;9365:15;9362:1;9359:22;9339:1;9332:9;9312:83;9289:139;;9408:18;;:::i;:::-;9289:139;9073:362;9025:410;;;;:::o;9441:180::-;9489:77;9486:1;9479:88;9586:4;9583:1;9576:15;9610:4;9607:1;9600:15;9627:185;9667:1;9684:20;9702:1;9684:20;:::i;:::-;9679:25;;9718:20;9736:1;9718:20;:::i;:::-;9713:25;;9757:1;9747:35;;9762:18;;:::i;:::-;9747:35;9804:1;9801;9797:9;9792:14;;9627:185;;;;:::o;9818:171::-;9958:23;9954:1;9946:6;9942:14;9935:47;9818:171;:::o;9995:366::-;10137:3;10158:67;10222:2;10217:3;10158:67;:::i;:::-;10151:74;;10234:93;10323:3;10234:93;:::i;:::-;10352:2;10347:3;10343:12;10336:19;;9995:366;;;:::o;10367:419::-;10533:4;10571:2;10560:9;10556:18;10548:26;;10620:9;10614:4;10610:20;10606:1;10595:9;10591:17;10584:47;10648:131;10774:4;10648:131;:::i;:::-;10640:139;;10367:419;;;:::o;10792:177::-;10932:29;10928:1;10920:6;10916:14;10909:53;10792:177;:::o;10975:366::-;11117:3;11138:67;11202:2;11197:3;11138:67;:::i;:::-;11131:74;;11214:93;11303:3;11214:93;:::i;:::-;11332:2;11327:3;11323:12;11316:19;;10975:366;;;:::o;11347:419::-;11513:4;11551:2;11540:9;11536:18;11528:26;;11600:9;11594:4;11590:20;11586:1;11575:9;11571:17;11564:47;11628:131;11754:4;11628:131;:::i;:::-;11620:139;;11347:419;;;:::o;11772:176::-;11912:28;11908:1;11900:6;11896:14;11889:52;11772:176;:::o;11954:366::-;12096:3;12117:67;12181:2;12176:3;12117:67;:::i;:::-;12110:74;;12193:93;12282:3;12193:93;:::i;:::-;12311:2;12306:3;12302:12;12295:19;;11954:366;;;:::o;12326:419::-;12492:4;12530:2;12519:9;12515:18;12507:26;;12579:9;12573:4;12569:20;12565:1;12554:9;12550:17;12543:47;12607:131;12733:4;12607:131;:::i;:::-;12599:139;;12326:419;;;:::o;12751:170::-;12891:22;12887:1;12879:6;12875:14;12868:46;12751:170;:::o;12927:366::-;13069:3;13090:67;13154:2;13149:3;13090:67;:::i;:::-;13083:74;;13166:93;13255:3;13166:93;:::i;:::-;13284:2;13279:3;13275:12;13268:19;;12927:366;;;:::o;13299:419::-;13465:4;13503:2;13492:9;13488:18;13480:26;;13552:9;13546:4;13542:20;13538:1;13527:9;13523:17;13516:47;13580:131;13706:4;13580:131;:::i;:::-;13572:139;;13299:419;;;:::o;13724:442::-;13873:4;13911:2;13900:9;13896:18;13888:26;;13924:71;13992:1;13981:9;13977:17;13968:6;13924:71;:::i;:::-;14005:72;14073:2;14062:9;14058:18;14049:6;14005:72;:::i;:::-;14087;14155:2;14144:9;14140:18;14131:6;14087:72;:::i;:::-;13724:442;;;;;;:::o;14172:143::-;14229:5;14260:6;14254:13;14245:22;;14276:33;14303:5;14276:33;:::i;:::-;14172:143;;;;:::o;14321:351::-;14391:6;14440:2;14428:9;14419:7;14415:23;14411:32;14408:119;;;14446:79;;:::i;:::-;14408:119;14566:1;14591:64;14647:7;14638:6;14627:9;14623:22;14591:64;:::i;:::-;14581:74;;14537:128;14321:351;;;;:::o;14678:114::-;14715:7;14755:30;14748:5;14744:42;14733:53;;14678:114;;;:::o;14798:122::-;14871:24;14889:5;14871:24;:::i;:::-;14864:5;14861:35;14851:63;;14910:1;14907;14900:12;14851:63;14798:122;:::o;14926:143::-;14983:5;15014:6;15008:13;14999:22;;15030:33;15057:5;15030:33;:::i;:::-;14926:143;;;;:::o;15075:93::-;15111:7;15151:10;15144:5;15140:22;15129:33;;15075:93;;;:::o;15174:120::-;15246:23;15263:5;15246:23;:::i;:::-;15239:5;15236:34;15226:62;;15284:1;15281;15274:12;15226:62;15174:120;:::o;15300:141::-;15356:5;15387:6;15381:13;15372:22;;15403:32;15429:5;15403:32;:::i;:::-;15300:141;;;;:::o;15447:661::-;15534:6;15542;15550;15599:2;15587:9;15578:7;15574:23;15570:32;15567:119;;;15605:79;;:::i;:::-;15567:119;15725:1;15750:64;15806:7;15797:6;15786:9;15782:22;15750:64;:::i;:::-;15740:74;;15696:128;15863:2;15889:64;15945:7;15936:6;15925:9;15921:22;15889:64;:::i;:::-;15879:74;;15834:129;16002:2;16028:63;16083:7;16074:6;16063:9;16059:22;16028:63;:::i;:::-;16018:73;;15973:128;15447:661;;;;;:::o;16114:143::-;16171:5;16202:6;16196:13;16187:22;;16218:33;16245:5;16218:33;:::i;:::-;16114:143;;;;:::o;16263:351::-;16333:6;16382:2;16370:9;16361:7;16357:23;16353:32;16350:119;;;16388:79;;:::i;:::-;16350:119;16508:1;16533:64;16589:7;16580:6;16569:9;16565:22;16533:64;:::i;:::-;16523:74;;16479:128;16263:351;;;;:::o;16620:180::-;16668:77;16665:1;16658:88;16765:4;16762:1;16755:15;16789:4;16786:1;16779:15;16806:98;16857:6;16891:5;16885:12;16875:22;;16806:98;;;:::o;16910:168::-;16993:11;17027:6;17022:3;17015:19;17067:4;17062:3;17058:14;17043:29;;16910:168;;;;:::o;17084:373::-;17170:3;17198:38;17230:5;17198:38;:::i;:::-;17252:70;17315:6;17310:3;17252:70;:::i;:::-;17245:77;;17331:65;17389:6;17384:3;17377:4;17370:5;17366:16;17331:65;:::i;:::-;17421:29;17443:6;17421:29;:::i;:::-;17416:3;17412:39;17405:46;;17174:283;17084:373;;;;:::o;17463:640::-;17658:4;17696:3;17685:9;17681:19;17673:27;;17710:71;17778:1;17767:9;17763:17;17754:6;17710:71;:::i;:::-;17791:72;17859:2;17848:9;17844:18;17835:6;17791:72;:::i;:::-;17873;17941:2;17930:9;17926:18;17917:6;17873:72;:::i;:::-;17992:9;17986:4;17982:20;17977:2;17966:9;17962:18;17955:48;18020:76;18091:4;18082:6;18020:76;:::i;:::-;18012:84;;17463:640;;;;;;;:::o;18109:332::-;18230:4;18268:2;18257:9;18253:18;18245:26;;18281:71;18349:1;18338:9;18334:17;18325:6;18281:71;:::i;:::-;18362:72;18430:2;18419:9;18415:18;18406:6;18362:72;:::i;:::-;18109:332;;;;;:::o;18447:147::-;18548:11;18585:3;18570:18;;18447:147;;;;:::o;18600:386::-;18704:3;18732:38;18764:5;18732:38;:::i;:::-;18786:88;18867:6;18862:3;18786:88;:::i;:::-;18779:95;;18883:65;18941:6;18936:3;18929:4;18922:5;18918:16;18883:65;:::i;:::-;18973:6;18968:3;18964:16;18957:23;;18708:278;18600:386;;;;:::o;18992:271::-;19122:3;19144:93;19233:3;19224:6;19144:93;:::i;:::-;19137:100;;19254:3;19247:10;;18992:271;;;;:::o;19269:116::-;19339:21;19354:5;19339:21;:::i;:::-;19332:5;19329:32;19319:60;;19375:1;19372;19365:12;19319:60;19269:116;:::o;19391:137::-;19445:5;19476:6;19470:13;19461:22;;19492:30;19516:5;19492:30;:::i;:::-;19391:137;;;;:::o;19534:345::-;19601:6;19650:2;19638:9;19629:7;19625:23;19621:32;19618:119;;;19656:79;;:::i;:::-;19618:119;19776:1;19801:61;19854:7;19845:6;19834:9;19830:22;19801:61;:::i;:::-;19791:71;;19747:125;19534:345;;;;:::o;19885:152::-;20025:4;20021:1;20013:6;20009:14;20002:28;19885:152;:::o;20043:365::-;20185:3;20206:66;20270:1;20265:3;20206:66;:::i;:::-;20199:73;;20281:93;20370:3;20281:93;:::i;:::-;20399:2;20394:3;20390:12;20383:19;;20043:365;;;:::o;20414:419::-;20580:4;20618:2;20607:9;20603:18;20595:26;;20667:9;20661:4;20657:20;20653:1;20642:9;20638:17;20631:47;20695:131;20821:4;20695:131;:::i;:::-;20687:139;;20414:419;;;:::o;20839:442::-;20988:4;21026:2;21015:9;21011:18;21003:26;;21039:71;21107:1;21096:9;21092:17;21083:6;21039:71;:::i;:::-;21120:72;21188:2;21177:9;21173:18;21164:6;21120:72;:::i;:::-;21202;21270:2;21259:9;21255:18;21246:6;21202:72;:::i;:::-;20839:442;;;;;;:::o;21287:108::-;21364:24;21382:5;21364:24;:::i;:::-;21359:3;21352:37;21287:108;;:::o;21401:91::-;21437:7;21477:8;21470:5;21466:20;21455:31;;21401:91;;;:::o;21498:105::-;21573:23;21590:5;21573:23;:::i;:::-;21568:3;21561:36;21498:105;;:::o;21609:108::-;21686:24;21704:5;21686:24;:::i;:::-;21681:3;21674:37;21609:108;;:::o;21723:::-;21800:24;21818:5;21800:24;:::i;:::-;21795:3;21788:37;21723:108;;:::o;21931:1625::-;22108:6;22103:3;22099:16;22200:4;22193:5;22189:16;22183:23;22219:63;22276:4;22271:3;22267:14;22253:12;22219:63;:::i;:::-;22125:167;22378:4;22371:5;22367:16;22361:23;22397:63;22454:4;22449:3;22445:14;22431:12;22397:63;:::i;:::-;22302:168;22551:4;22544:5;22540:16;22534:23;22570:61;22625:4;22620:3;22616:14;22602:12;22570:61;:::i;:::-;22480:161;22728:4;22721:5;22717:16;22711:23;22747:63;22804:4;22799:3;22795:14;22781:12;22747:63;:::i;:::-;22651:169;22906:4;22899:5;22895:16;22889:23;22925:63;22982:4;22977:3;22973:14;22959:12;22925:63;:::i;:::-;22830:168;23084:4;23077:5;23073:16;23067:23;23103:63;23160:4;23155:3;23151:14;23137:12;23103:63;:::i;:::-;23008:168;23270:4;23263:5;23259:16;23253:23;23289:63;23346:4;23341:3;23337:14;23323:12;23289:63;:::i;:::-;23186:176;23457:4;23450:5;23446:16;23440:23;23476:63;23533:4;23528:3;23524:14;23510:12;23476:63;:::i;:::-;23372:177;22077:1479;21931:1625;;:::o;23562:383::-;23735:4;23773:3;23762:9;23758:19;23750:27;;23787:151;23935:1;23924:9;23920:17;23911:6;23787:151;:::i;:::-;23562:383;;;;:::o
Swarm Source
ipfs://9e288212bdad728b3b59d0b768eeedcd52a64c6a2689d424fb4fe3115ab707c7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,965.21 | 0.0429 | $127.31 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.