Contract Overview
Balance:
0 AVAX
AVAX Value:
$0.00
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xae05775e6113172457f72b2e5699b502657947ce42729088ba5339a7ec46fb66 | Set Vesting Sche... | 20917505 | 161 days 10 hrs ago | 0x55e66f5b3cf90cc707e8945428a7f675224042bb | IN | 0x9c0c0e21a8a4787e3304f93767695101217de113 | 0 AVAX | 0.004111406 | |
0x6b6180b23918ecf9b4938a3a421e9f71f7a9465ccf0375d15c4e6f57387b211f | Update Dex Route... | 20917483 | 161 days 10 hrs ago | 0x55e66f5b3cf90cc707e8945428a7f675224042bb | IN | 0x9c0c0e21a8a4787e3304f93767695101217de113 | 0 AVAX | 0.056770376 | |
0x46d5450164d12d5a9a842049d961257c93b32ee8840478d89b1e6594501f68f9 | 0x60806040 | 20917295 | 161 days 10 hrs ago | 0x55e66f5b3cf90cc707e8945428a7f675224042bb | IN | Create: LASM | 0 AVAX | 0.196581825 |
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x46d5450164d12d5a9a842049d961257c93b32ee8840478d89b1e6594501f68f9 | 20917295 | 161 days 10 hrs ago | 0x9c0c0e21a8a4787e3304f93767695101217de113 | Contract Creation | 0 AVAX |
[ Download CSV Export ]
This contract contains unverified libraries: IterableMapping
Contract Name:
LASM
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-10-11 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/IterableMapping.sol pragma solidity ^0.8.0; library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) public view returns (uint) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) public view returns (int) { if(!map.inserted[key]) { return -1; } return int(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint) { return map.keys.length; } function set(Map storage map, address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: contracts/DividendPayingToken.sol pragma solidity ^0.8.0; /** * @title SafeMathUint * @dev Math operations with safety checks that revert on error */ library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } /** * @title SafeMathInt * @dev Math operations for int256 with overflow safety checks. */ library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } /// @title Dividend-Paying Token Interface /// @dev An interface for a dividend-paying token contract. interface DividendPayingTokenInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) external view returns(uint256); /// @notice Withdraws the ether distributed to the sender. /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer. /// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0. function withdrawDividend() external; /// @dev This event MUST emit when ether is distributed to token holders. /// @param from The address which sends ether to this contract. /// @param weiAmount The amount of distributed ether in wei. event DividendsDistributed( address indexed from, uint256 weiAmount ); /// @dev This event MUST emit when an address withdraws their dividend. /// @param to The address which withdraws ether from this contract. /// @param weiAmount The amount of withdrawn ether in wei. event DividendWithdrawn( address indexed to, uint256 weiAmount ); } /// @title Dividend-Paying Token Optional Interface /// @dev OPTIONAL functions for a dividend-paying token contract. interface DividendPayingTokenOptionalInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) external view returns(uint256); /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) external view returns(uint256); } /// @title Dividend-Paying Token /// @dev A mintable ERC20 token that allows anyone to pay and distribute ether /// to token holders as dividends and allows token holders to withdraw their dividends. contract DividendPayingToken is ERC20, Ownable, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; address public CAKE; //CAKE // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small. // For more discussion about choosing the value of `magnitude`, // see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728 uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; uint256 public totalDividendsDistributed; constructor(string memory _name, string memory _symbol, address _cake) ERC20(_name, _symbol) { CAKE = _cake; } function distributeCAKEDividends(uint256 amount) public onlyOwner{ require(totalSupply() > 0); if (amount > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amount).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, amount); totalDividendsDistributed = totalDividendsDistributed.add(amount); } } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function withdrawDividend() public virtual override { _withdrawDividendOfUser(payable(msg.sender)); } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); bool success = IERC20(CAKE).transfer(user, _withdrawableDividend); if(!success) { withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend); return 0; } return _withdrawableDividend; } return 0; } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) public view override returns(uint256) { return withdrawableDividendOf(_owner); } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) public view override returns(uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) public view override returns(uint256) { return withdrawnDividends[_owner]; } /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) public view override returns(uint256) { return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } /// @dev Internal function that transfer tokens from one address to another. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param from The address to transfer from. /// @param to The address to transfer to. /// @param value The amount to be transferred. function _transfer(address from, address to, uint256 value) internal virtual override { require(false); int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe(); magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection); magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection); } /// @dev Internal function that mints tokens to an account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account that will receive the created tokens. /// @param value The amount that will be created. function _mint(address account, uint256 value) internal override { super._mint(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } /// @dev Internal function that burns an amount of the token of a given account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account whose tokens will be burnt. /// @param value The amount that will be burnt. function _burn(address account, uint256 value) internal override { super._burn(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if(newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if(newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } } // File: contracts/Lasm_Token_avax.sol /** * The smart contracts that run LASM implement the latest trend in ETH tokens, * AUTO DIVIDEND YIELDING with an AUTO-DEPOSIT feature. * By simply buying and holding LASM you are rewarded! * * 4% Auto Reflections Rewarded in LASM * 4% Auto Liquidity * 2% Team Development * */ pragma solidity ^0.8.0; interface IJoeFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function migrator() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; function setMigrator(address) external; } interface IJoeRouter01 { function factory() external pure returns (address); function WAVAX() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityAVAX( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountAVAX, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityAVAX( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountAVAX); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityAVAXWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountAVAX); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactAVAXForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactAVAX( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForAVAX( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapAVAXForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IJoeRouter02 is IJoeRouter01 { function removeLiquidityAVAXSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline ) external returns (uint256 amountAVAX); function removeLiquidityAVAXWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountAVAXMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountAVAX); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactAVAXForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForAVAXSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } contract LASM is ERC20, ERC20Burnable, Ownable { using SafeMath for uint256; // The operator address private _operator; IJoeRouter02 public dexRouter; address public lpPair; bool private swapping; LasmDividendTracker public dividendTracker; mapping(address => bool) public _isBlacklisted; // total supply of token uint256 public constant E18 = 10 ** 18; uint256 private constant initSupply = 800_000_000 * E18; uint256 public swapTokensAtAmount = 80_000 * E18; // 0.01% of initSupply bool public swapAndLiquifyEnabled = true; // transaction fee allocation uint256 public rewardsFee = 4; uint256 public liquidityFee = 4; uint256 public teamFee = 2; uint256 public totalFees = rewardsFee.add(liquidityFee).add(teamFee); uint256 public constant MAXIMUM_TRANSFER_TAX_RATE = 10; // dead wallet address public constant burnAddress = address(0x000000000000000000000000000000000000dEaD); // manager, team dev wallets address public constant manager = address(0x5e81892779c28617B066553d25499B9aD2630a47); address public teamDevWalletAddress = address(0x7446F1c8dE6B48D96D91bdb7a58A09c86dDa9Eac); address public buyBackWalletAddress = address(0x54E67697f90b6E4591def23EefcedD8289E18c8B); // vesting wallets address public constant locked = address(0x0102aEa1a3D3F100bAd80feF23a2883a0C980833); address public constant team = address(0xef08430d3e53198160D0cd33b0f84358291640bD); address public constant partners = address(0xe5917b2686f9FA32cC88CF360bF03cCa1a223563); address public constant marketing = address(0xB2f33Cb375E21314A991f14c2d93570013E5a0a4); address public constant development = address(0x939Ad272c00efE7e4398b21b6Aa52A3a6B7BADbF); address public constant stakingRewards = address(0x2Ad0ee5E02c7Be7701416925B72808df99D549ED); address public constant airdrop = address(0xFA39969e9083e6Ddf1F18464573B9B5c002B6310); address public constant nftAirdropWallet = address(0x18758Ea1A29e43A840DcB7EB3D9468294F7967dA); // vesting contract address public vesting; // use by default 300,000 gas to process auto-claiming dividends uint256 public gasForProcessing = 300_000; // exlcude from fees and max transaction amount mapping (address => bool) private _isExcludedFromFees; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping (address => bool) public automatedMarketMakerPairs; event OperatorTransferred(address indexed previousOperator, address indexed newOperator); event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress); event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue); event SwapAndLiquifyEnabledUpdated(bool enabled); event SetSwapTokensAtAmount(uint256 value); event SetRewardsFee(uint256 value); event SetLiquiditFee(uint256 value); event SetTeamDevFee(uint256 value); event SetTeamDevWallet(address wallet); event SetBuyBackWallet(address wallet); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SendDividends( uint256 tokensamount ); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); modifier onlyOperatorOrOwner() { require(_operator == msg.sender || owner() == msg.sender, "operator: caller is not the operator or owner"); _; } constructor() ERC20("LasMeta", "LASM") { dividendTracker = new LasmDividendTracker(address(this)); // exclude from receiving dividends dividendTracker.excludeFromDividends(address(dividendTracker)); dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends(owner()); dividendTracker.excludeFromDividends(burnAddress); dividendTracker.excludeFromDividends(manager); dividendTracker.excludeFromDividends(teamDevWalletAddress); dividendTracker.excludeFromDividends(buyBackWalletAddress); dividendTracker.excludeFromDividends(locked); dividendTracker.excludeFromDividends(team); dividendTracker.excludeFromDividends(partners); dividendTracker.excludeFromDividends(marketing); dividendTracker.excludeFromDividends(development); dividendTracker.excludeFromDividends(stakingRewards); dividendTracker.excludeFromDividends(airdrop); // exclude from paying fees or having max transaction amount excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromFees(burnAddress, true); excludeFromFees(address(dividendTracker), true); excludeFromFees(manager, true); excludeFromFees(teamDevWalletAddress, true); excludeFromFees(buyBackWalletAddress, true); excludeFromFees(locked, true); excludeFromFees(team, true); excludeFromFees(partners, true); excludeFromFees(marketing, true); excludeFromFees(development, true); excludeFromFees(stakingRewards, true); excludeFromFees(airdrop, true); } receive() external payable { } function burn(uint256 amount) public override { _burn(_msgSender(), amount); } /** * @dev Returns the address of the current operator. */ function operator() public view returns (address) { return _operator; } /** * @dev Transfers operator of the contract to a new account (`newOperator`). * Can only be called by the current operator. */ function transferOperator(address newOperator) public onlyOwner { require(newOperator != address(0), "transferOperator: new operator is the zero address"); require(newOperator != _operator, "transferOperator: new operator is the zero address"); emit OperatorTransferred(_operator, newOperator); _operator = newOperator; } function setVestingSchedule(address _vesting) external onlyOwner { require(_vesting != address(0), "Wrong address!"); require(vesting == address(0), "vesting schedule already started!"); vesting = _vesting; _mint(vesting, initSupply); dividendTracker.excludeFromDividends(vesting); excludeFromFees(vesting, true); } /** * @notice Update the dividend trancer and exclude from receiving dividends */ function updateDividendTracker(address newAddress) external onlyOwner { require(newAddress != address(dividendTracker), "Lasm: The dividend tracker already has that address"); LasmDividendTracker newDividendTracker = LasmDividendTracker(payable(newAddress)); require(newDividendTracker.owner() == address(this), "Lasm: The new dividend tracker must be owned by the LASM token contract"); newDividendTracker.excludeFromDividends(address(newDividendTracker)); newDividendTracker.excludeFromDividends(address(this)); newDividendTracker.excludeFromDividends(owner()); newDividendTracker.excludeFromDividends(burnAddress); newDividendTracker.excludeFromDividends(address(dexRouter)); newDividendTracker.excludeFromDividends(vesting); newDividendTracker.excludeFromDividends(manager); newDividendTracker.excludeFromDividends(teamDevWalletAddress); newDividendTracker.excludeFromDividends(buyBackWalletAddress); newDividendTracker.excludeFromDividends(locked); newDividendTracker.excludeFromDividends(team); newDividendTracker.excludeFromDividends(partners); newDividendTracker.excludeFromDividends(marketing); newDividendTracker.excludeFromDividends(development); newDividendTracker.excludeFromDividends(stakingRewards); newDividendTracker.excludeFromDividends(airdrop); emit UpdateDividendTracker(newAddress, address(dividendTracker)); dividendTracker = newDividendTracker; } /** * @notice Update the uniswap router */ function updateDexRouter(address newAddress) external onlyOwner { require(newAddress != address(dexRouter), "Lasm: The router already has that address"); emit UpdateUniswapV2Router(newAddress, address(dexRouter)); dexRouter = IJoeRouter02(newAddress); address _lpPair = IJoeFactory(dexRouter.factory()) .createPair(address(this), dexRouter.WAVAX()); lpPair = _lpPair; _setAutomatedMarketMakerPair(lpPair, true); dividendTracker.excludeFromDividends(address(dexRouter)); } /** * @notice Exclude or include from paying fees */ function excludeFromFees(address account, bool excluded) public onlyOperatorOrOwner { require(_isExcludedFromFees[account] != excluded, "Lasm: Account is already the value of 'excluded'"); _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } /** * @notice Exclude or include multi accounts from paying fees */ function excludeMultipleAccountsFromFees(address[] memory accounts, bool excluded) external onlyOwner { for(uint256 i = 0; i < accounts.length; i++) { _isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } /** * @notice Set the limit value to make enable swapping token, adding liquidity, * sending token to dividendtracker and game developer in transfer */ function setSwapTokensAtAmount(uint256 value) external onlyOwner{ swapTokensAtAmount = value; emit SetSwapTokensAtAmount(value); } /** * @notice Set the wallet address for team developer */ function setTeamDevWallet(address payable wallet) external onlyOwner{ teamDevWalletAddress = wallet; emit SetTeamDevWallet(wallet); } /** * @notice Set the wallet address for buyback */ function setBuyBackWallet(address payable wallet) external onlyOwner{ buyBackWalletAddress = wallet; emit SetBuyBackWallet(wallet); } /** * @notice Set the rewards fee for token holders */ function setRewardsFee(uint256 value) external onlyOwner{ require(value <= MAXIMUM_TRANSFER_TAX_RATE, "Invalid percentage"); rewardsFee = value; totalFees = rewardsFee.add(liquidityFee).add(teamFee); emit SetRewardsFee(value); } /** * @notice Set the liquidity fee */ function setLiquiditFee(uint256 value) external onlyOwner{ require(value <= MAXIMUM_TRANSFER_TAX_RATE, "Invalid percentage"); liquidityFee = value; totalFees = rewardsFee.add(liquidityFee).add(teamFee); emit SetLiquiditFee(value); } /** * @notice Set the transaction fee for game developer */ function setTeamDevFee(uint256 value) external onlyOwner{ require(value <= MAXIMUM_TRANSFER_TAX_RATE, "Invalid percentage"); teamFee = value; totalFees = rewardsFee.add(liquidityFee).add(teamFee); emit SetTeamDevFee(value); } /** * @notice Set the automated MarketMakerPair */ function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner { require(pair != lpPair, "Lasm: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"); _setAutomatedMarketMakerPair(pair, value); } /** * @notice Check whether address is in blacklist */ function blacklistAddress(address account, bool value) external onlyOwner{ _isBlacklisted[account] = value; } /** * @notice Internal function to set the automated MarketMakerPair */ function _setAutomatedMarketMakerPair(address pair, bool value) private { require(automatedMarketMakerPairs[pair] != value, "Lasm: Automated market maker pair is already set to that value"); automatedMarketMakerPairs[pair] = value; if(value) { dividendTracker.excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } /** * @notice Update the gas limit for processing the dividend tracker */ function updateGasForProcessing(uint256 newValue) external onlyOwner { require(newValue >= 200000 && newValue <= 500000, "Lasm: gasForProcessing must be between 200,000 and 500,000"); require(newValue != gasForProcessing, "Lasm: Cannot update gasForProcessing to same value"); emit GasForProcessingUpdated(newValue, gasForProcessing); gasForProcessing = newValue; } /** * @notice Update the claim wait time in dividendtracker */ function updateClaimWait(uint256 claimWait) external onlyOwner { dividendTracker.updateClaimWait(claimWait); } /** * @notice Get the claim wait time in dividendtracker */ function getClaimWait() external view returns(uint256) { return dividendTracker.claimWait(); } /** * @notice Update the claim wait time in dividendtracker */ function updateMinimumTokenBalanceForDividends(uint256 _amount) external onlyOwner { dividendTracker.updateMinimumTokenBalanceForDividends(_amount); } /** * @notice Get the total amount of dividend distributed */ function getTotalDividendsDistributed() external view returns (uint256) { return dividendTracker.totalDividendsDistributed(); } /** * @notice Check whether account in exclude from receiving dividends */ function isExcludedFromFees(address account) external view returns(bool) { return _isExcludedFromFees[account]; } /** * @notice View the amount of dividend in wei that an address has earned in total. */ function withdrawableDividendOf(address account) external view returns(uint256) { return dividendTracker.withdrawableDividendOf(account); } /** * @notice Getthe dividend token balancer in account */ function dividendTokenBalanceOf(address account) external view returns (uint256) { return dividendTracker.balanceOf(account); } /** * @notice Exclude from receiving dividends */ function excludeFromDividends(address account) external onlyOperatorOrOwner{ dividendTracker.excludeFromDividends(account); } /** * @notice Get the dividend infor for account */ function getAccountDividendsInfo(address account) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccount(account); } /** * @notice Get the indexed dividend infor */ function getAccountDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { return dividendTracker.getAccountAtIndex(index); } /** * @notice Withdraws the token distributed to all token holders */ function processDividendTracker(uint256 gas) external { (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas); emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin); } /** * @notice Withdraws the token distributed to the sender. */ function claim() external { dividendTracker.processAccount(payable(msg.sender), false); } /** * @notice Get the last processed info in dividend tracker */ function getLastProcessedIndex() external view returns(uint256) { return dividendTracker.getLastProcessedIndex(); } /** * @notice Get the number of dividend token holders */ function getNumberOfDividendTokenHolders() external view returns(uint256) { return dividendTracker.getNumberOfTokenHolders(); } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * */ function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(!_isBlacklisted[from] && !_isBlacklisted[to], 'Blacklisted address'); if(amount == 0) { super._transfer(from, to, 0); return; } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if( canSwap && !swapping && !automatedMarketMakerPairs[from] && from != owner() && to != owner() && swapAndLiquifyEnabled ) { swapping = true; uint256 teamDevTokens = contractTokenBalance.mul(teamFee).div(totalFees); sendToTeamDevAndBuyBackFee(teamDevTokens); uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees); swapAndLiquify(swapTokens); uint256 sellTokens = balanceOf(address(this)); sendDividends(sellTokens); swapping = false; } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } if (!(from == lpPair || to == lpPair)) { takeFee = false; } if(takeFee) { uint256 fees = amount.mul(totalFees).div(100); amount = amount.sub(fees); super._transfer(from, address(this), fees); } super._transfer(from, to, amount); try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {} try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {} if(!swapping) { uint256 gas = gasForProcessing; try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin); } catch { } } } /** * @notice Send Team developer and buyBack fee */ function sendToTeamDevAndBuyBackFee(uint256 tokens) private { uint amount = tokens.div(2); super._transfer(address(this), teamDevWalletAddress, amount); amount = tokens.sub(amount); super._transfer(address(this), buyBackWalletAddress, amount); } function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } /** * @notice Swap tokens for ETH and add liquidity */ function swapAndLiquify(uint256 tokens) private { // split the contract balance into halves uint256 half = tokens.div(2); uint256 otherHalf = tokens.sub(half); // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity to uniswap addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } /** * @notice Swap tokens for ETH */ function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = dexRouter.WAVAX(); _approve(address(this), address(dexRouter), tokenAmount); // make the swap dexRouter.swapExactTokensForAVAXSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } /** * @notice Add liquidity to uniswap */ function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(dexRouter), tokenAmount); // add the liquidity dexRouter.addLiquidityAVAX{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable burnAddress, block.timestamp ); } /** * @notice Send transaction fee to dividend trancer. */ function sendDividends(uint256 tokens) private { super._transfer(address(this), address(dividendTracker), tokens); dividendTracker.distributeCAKEDividends(tokens); } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol /// @dev A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "delegateBySig: invalid nonce"); require(block.timestamp <= expiry, "delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying BQBs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } } contract LasmDividendTracker is Ownable, DividendPayingToken { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping (address => bool) public excludedFromDividends; mapping (address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor(address _cake) DividendPayingToken("Lasm_Dividend_Tracker", "LDT", _cake) { claimWait = 3600; minimumTokenBalanceForDividends = 100 * (10**18); //must hold 100 + tokens } function _transfer(address, address, uint256) internal pure override { require(false, "Lasm_Dividend_Tracker: No transfers allowed"); } function withdrawDividend() public pure override { require(false, "Lasm_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main LASM contract."); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 3600 && newClaimWait <= 86400, "Lasm_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "Lasm_Dividend_Tracker: Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function updateMinimumTokenBalanceForDividends(uint256 amount) external onlyOwner { minimumTokenBalanceForDividends = amount; } function getLastProcessedIndex() external view returns(uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns(uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if(index >= 0) { if(uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if(index >= tokenHoldersMap.size()) { return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if(lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if(excludedFromDividends[account]) { return; } if(newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } processAccount(account, true); } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if(numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while(gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if(_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if(canAutoClaim(lastClaimTimes[account])) { if(processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if(gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensamount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"SetBuyBackWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetLiquiditFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetRewardsFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetSwapTokensAtAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetTeamDevFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"SetTeamDevWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"E18","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TRANSFER_TAX_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdrop","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"development","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IJoeRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract LasmDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketing","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftAirdropWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setBuyBackWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setLiquiditFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setTeamDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setTeamDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vesting","type":"address"}],"name":"setVestingSchedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingRewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"team","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamDevWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDexRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vesting","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526200001b670de0b6b3a76400006201388062000bf5565b600b55600c8054600160ff199091161790556004600d819055600e8190556002600f81905562000071916200005d90806200092c602090811b6200312f17901c565b6200092c60201b6200312f1790919060201c565b601055601180546001600160a01b0319908116737446f1c8de6b48d96d91bdb7a58a09c86dda9eac17909155601280549091167354e67697f90b6e4591def23eefcedd8289e18c8b179055620493e0601455348015620000d057600080fd5b5060408051808201825260078152664c61734d65746160c81b6020808301918252835180850190945260048452634c41534d60e01b9084015281519192916200011c9160039162000b2b565b5080516200013290600490602084019062000b2b565b5050506200014f620001496200094160201b60201c565b62000945565b306040516200015e9062000bba565b6001600160a01b039091168152602001604051809103906000f0801580156200018b573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b0392909216918217905560405163031e79db60e41b8152600481018290526331e79db090602401600060405180830381600087803b158015620001e357600080fd5b505af1158015620001f8573d6000803e3d6000fd5b505060095460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200024257600080fd5b505af115801562000257573d6000803e3d6000fd5b50506009546001600160a01b031691506331e79db09050620002816005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620002c357600080fd5b505af1158015620002d8573d6000803e3d6000fd5b505060095460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200032457600080fd5b505af115801562000339573d6000803e3d6000fd5b505060095460405163031e79db60e41b8152735e81892779c28617b066553d25499b9ad2630a4760048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200039757600080fd5b505af1158015620003ac573d6000803e3d6000fd5b505060095460115460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620003fa57600080fd5b505af11580156200040f573d6000803e3d6000fd5b505060095460125460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200045d57600080fd5b505af115801562000472573d6000803e3d6000fd5b505060095460405163031e79db60e41b8152730102aea1a3d3f100bad80fef23a2883a0c98083360048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620004d057600080fd5b505af1158015620004e5573d6000803e3d6000fd5b505060095460405163031e79db60e41b815273ef08430d3e53198160d0cd33b0f84358291640bd60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200054357600080fd5b505af115801562000558573d6000803e3d6000fd5b505060095460405163031e79db60e41b815273e5917b2686f9fa32cc88cf360bf03cca1a22356360048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620005b657600080fd5b505af1158015620005cb573d6000803e3d6000fd5b505060095460405163031e79db60e41b815273b2f33cb375e21314a991f14c2d93570013e5a0a460048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200062957600080fd5b505af11580156200063e573d6000803e3d6000fd5b505060095460405163031e79db60e41b815273939ad272c00efe7e4398b21b6aa52a3a6b7badbf60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200069c57600080fd5b505af1158015620006b1573d6000803e3d6000fd5b505060095460405163031e79db60e41b8152732ad0ee5e02c7be7701416925b72808df99d549ed60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200070f57600080fd5b505af115801562000724573d6000803e3d6000fd5b505060095460405163031e79db60e41b815273fa39969e9083e6ddf1f18464573b9b5c002b631060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200078257600080fd5b505af115801562000797573d6000803e3d6000fd5b50505050620007b7620007af6200099760201b60201c565b6001620009a6565b620007c4306001620009a6565b620007d361dead6001620009a6565b600954620007ec906001600160a01b03166001620009a6565b6200080d735e81892779c28617b066553d25499b9ad2630a476001620009a6565b60115462000826906001600160a01b03166001620009a6565b6012546200083f906001600160a01b03166001620009a6565b62000860730102aea1a3d3f100bad80fef23a2883a0c9808336001620009a6565b6200088173ef08430d3e53198160d0cd33b0f84358291640bd6001620009a6565b620008a273e5917b2686f9fa32cc88cf360bf03cca1a2235636001620009a6565b620008c373b2f33cb375e21314a991f14c2d93570013e5a0a46001620009a6565b620008e473939ad272c00efe7e4398b21b6aa52a3a6b7badbf6001620009a6565b62000905732ad0ee5e02c7be7701416925b72808df99d549ed6001620009a6565b6200092673fa39969e9083e6ddf1f18464573b9b5c002b63106001620009a6565b62000c6f565b60006200093a828462000c17565b9392505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b031690565b6006546001600160a01b0316331480620009da575033620009cf6005546001600160a01b031690565b6001600160a01b0316145b62000a425760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201526c30ba37b91037b91037bbb732b960991b60648201526084015b60405180910390fd5b6001600160a01b03821660009081526015602052604090205460ff161515811515141562000acc5760405162461bcd60e51b815260206004820152603060248201527f4c61736d3a204163636f756e7420697320616c7265616479207468652076616c60448201526f7565206f6620276578636c756465642760801b606482015260840162000a39565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b82805462000b399062000c32565b90600052602060002090601f01602090048101928262000b5d576000855562000ba8565b82601f1062000b7857805160ff191683800117855562000ba8565b8280016001018555821562000ba8579182015b8281111562000ba857825182559160200191906001019062000b8b565b5062000bb692915062000bc8565b5090565b611fe5806200585e83390190565b5b8082111562000bb6576000815560010162000bc9565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000c125762000c1262000bdf565b500290565b6000821982111562000c2d5762000c2d62000bdf565b500190565b600181811c9082168062000c4757607f821691505b6020821081141562000c6957634e487b7160e01b600052602260045260246000fd5b50919050565b614bdf8062000c7f6000396000f3fe6080604052600436106104a35760003560e01c80637b929c2711610260578063af2480c911610144578063cf309012116100c1578063e7841ec011610085578063e7841ec014610f40578063e7a324dc14610f55578063e98030c714610f89578063f1127ed814610fa9578063f27fd2541461100d578063f2fde38b1461102d57600080fd5b8063cf30901214610eac578063d7c94efd14610ed4578063dd62ed3e14610eea578063e2f4560514610f0a578063e5bab64914610f2057600080fd5b8063c024666811610108578063c024666814610e0c578063c3cda52014610e2c578063c492f04614610e4c578063c49b9a8014610e6c578063ca86bab614610e8c57600080fd5b8063af2480c914610d54578063afa4f3b214610d7c578063b4b5ea5714610d9c578063b62496f514610dbc578063bba7a1c414610dec57600080fd5b806398118cb4116101dd578063a457c2d7116101a1578063a457c2d714610c4f578063a4640b8214610c6f578063a8b9d24014610c8f578063a9059cbb14610caf578063ad56c13c14610ccf578063adefd90c14610d3457600080fd5b806398118cb414610bce5780639a7a23d614610be45780639c1b8af514610c045780639c60202e14610c1a578063a26579ad14610c3a57600080fd5b806386d662161161022457806386d6621614610b3b578063871c128d14610b5b57806388bdd9be14610b7b5780638da5cb5b14610b9b57806395d89b4114610bb957600080fd5b80637b929c2714610a765780637ecebe0014610a9e57806381add55914610acb57806385aa5e5a14610af357806385f2aef214610b1357600080fd5b8063452ed4f11161038757806364b87a701161030457806370a08231116102c857806370a08231146109b557806370d5ae05146109eb578063714f75e014610a01578063715018a614610a21578063782d6fe114610a3657806379cc679014610a5657600080fd5b806364b87a70146108e957806366d598f0146109115780636843cd841461092d5780636fcfff451461094d578063700bb1911461099557600080fd5b80634fbee1931161034b5780634fbee19314610824578063570ca7351461085d578063587cde1e1461087b5780635c19a95c146108b457806364b0f653146108d457600080fd5b8063452ed4f11461078d578063455a4396146107ad578063481c6a75146107cd5780634a74bb02146107f55780634e71d92d1461080f57600080fd5b806329605e7711610420578063313ce567116103e4578063313ce567146106c957806331e79db0146106e55780633884d63514610705578063395093511461072d57806342966c681461074d57806344c63eec1461076d57600080fd5b806329605e77146106365780632bb14e1d146106565780632c1f52161461066c5780632d3e474a1461068c57806330bb4cff146106b457600080fd5b806318160ddd1161046757806318160ddd146105885780631ad9339a1461059d5780631cdd3be3146105b257806320606b70146105e257806323b872dd1461061657600080fd5b806306fdde03146104af5780630758d924146104da578063095ea7b3146105125780630dcb2e891461054257806313114a9d1461056457600080fd5b366104aa57005b600080fd5b3480156104bb57600080fd5b506104c461104d565b6040516104d191906143ef565b60405180910390f35b3480156104e657600080fd5b506007546104fa906001600160a01b031681565b6040516001600160a01b0390911681526020016104d1565b34801561051e57600080fd5b5061053261052d366004614469565b6110df565b60405190151581526020016104d1565b34801561054e57600080fd5b5061056261055d366004614495565b6110f9565b005b34801561057057600080fd5b5061057a60105481565b6040519081526020016104d1565b34801561059457600080fd5b5060025461057a565b3480156105a957600080fd5b5061057a600a81565b3480156105be57600080fd5b506105326105cd3660046144ae565b600a6020526000908152604090205460ff1681565b3480156105ee57600080fd5b5061057a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561062257600080fd5b506105326106313660046144cb565b611163565b34801561064257600080fd5b506105626106513660046144ae565b611187565b34801561066257600080fd5b5061057a600d5481565b34801561067857600080fd5b506009546104fa906001600160a01b031681565b34801561069857600080fd5b506104fa73b2f33cb375e21314a991f14c2d93570013e5a0a481565b3480156106c057600080fd5b5061057a611248565b3480156106d557600080fd5b50604051601281526020016104d1565b3480156106f157600080fd5b506105626107003660046144ae565b6112bb565b34801561071157600080fd5b506104fa73fa39969e9083e6ddf1f18464573b9b5c002b631081565b34801561073957600080fd5b50610532610748366004614469565b61133b565b34801561075957600080fd5b50610562610768366004614495565b61135d565b34801561077957600080fd5b506013546104fa906001600160a01b031681565b34801561079957600080fd5b506008546104fa906001600160a01b031681565b3480156107b957600080fd5b506105626107c8366004614525565b61136a565b3480156107d957600080fd5b506104fa735e81892779c28617b066553d25499b9ad2630a4781565b34801561080157600080fd5b50600c546105329060ff1681565b34801561081b57600080fd5b5061056261139d565b34801561083057600080fd5b5061053261083f3660046144ae565b6001600160a01b031660009081526015602052604090205460ff1690565b34801561086957600080fd5b506006546001600160a01b03166104fa565b34801561088757600080fd5b506104fa6108963660046144ae565b6001600160a01b039081166000908152601760205260409020541690565b3480156108c057600080fd5b506105626108cf3660046144ae565b611412565b3480156108e057600080fd5b5061057a61141c565b3480156108f557600080fd5b506104fa732ad0ee5e02c7be7701416925b72808df99d549ed81565b34801561091d57600080fd5b5061057a670de0b6b3a764000081565b34801561093957600080fd5b5061057a6109483660046144ae565b611466565b34801561095957600080fd5b506109806109683660046144ae565b60196020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016104d1565b3480156109a157600080fd5b506105626109b0366004614495565b6114d6565b3480156109c157600080fd5b5061057a6109d03660046144ae565b6001600160a01b031660009081526020819052604090205490565b3480156109f757600080fd5b506104fa61dead81565b348015610a0d57600080fd5b50610562610a1c3660046144ae565b6115a8565b348015610a2d57600080fd5b50610562611864565b348015610a4257600080fd5b5061057a610a51366004614469565b611878565b348015610a6257600080fd5b50610562610a71366004614469565b611ad7565b348015610a8257600080fd5b506104fa73939ad272c00efe7e4398b21b6aa52a3a6b7badbf81565b348015610aaa57600080fd5b5061057a610ab93660046144ae565b601a6020526000908152604090205481565b348015610ad757600080fd5b506104fa73e5917b2686f9fa32cc88cf360bf03cca1a22356381565b348015610aff57600080fd5b50610562610b0e366004614495565b611af0565b348015610b1f57600080fd5b506104fa73ef08430d3e53198160d0cd33b0f84358291640bd81565b348015610b4757600080fd5b506012546104fa906001600160a01b031681565b348015610b6757600080fd5b50610562610b76366004614495565b611b74565b348015610b8757600080fd5b50610562610b963660046144ae565b611ca4565b348015610ba757600080fd5b506005546001600160a01b03166104fa565b348015610bc557600080fd5b506104c46124ee565b348015610bda57600080fd5b5061057a600e5481565b348015610bf057600080fd5b50610562610bff366004614525565b6124fd565b348015610c1057600080fd5b5061057a60145481565b348015610c2657600080fd5b50610562610c353660046144ae565b6125a7565b348015610c4657600080fd5b5061057a61270f565b348015610c5b57600080fd5b50610532610c6a366004614469565b612759565b348015610c7b57600080fd5b50610562610c8a3660046144ae565b6127d4565b348015610c9b57600080fd5b5061057a610caa3660046144ae565b61282a565b348015610cbb57600080fd5b50610532610cca366004614469565b61285d565b348015610cdb57600080fd5b50610cef610cea3660046144ae565b61286b565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016104d1565b348015610d4057600080fd5b50610562610d4f366004614495565b612906565b348015610d6057600080fd5b506104fa7318758ea1a29e43a840dcb7eb3d9468294f7967da81565b348015610d8857600080fd5b50610562610d97366004614495565b61297c565b348015610da857600080fd5b5061057a610db73660046144ae565b6129b9565b348015610dc857600080fd5b50610532610dd73660046144ae565b60166020526000908152604090205460ff1681565b348015610df857600080fd5b506011546104fa906001600160a01b031681565b348015610e1857600080fd5b50610562610e27366004614525565b612a2e565b348015610e3857600080fd5b50610562610e4736600461455e565b612b63565b348015610e5857600080fd5b50610562610e673660046145d6565b612e07565b348015610e7857600080fd5b50610562610e873660046146ad565b612eb4565b348015610e9857600080fd5b50610562610ea73660046144ae565b612efd565b348015610eb857600080fd5b506104fa730102aea1a3d3f100bad80fef23a2883a0c98083381565b348015610ee057600080fd5b5061057a600f5481565b348015610ef657600080fd5b5061057a610f053660046146ca565b612f53565b348015610f1657600080fd5b5061057a600b5481565b348015610f2c57600080fd5b50610562610f3b366004614495565b612f7e565b348015610f4c57600080fd5b5061057a612ff4565b348015610f6157600080fd5b5061057a7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b348015610f9557600080fd5b50610562610fa4366004614495565b61303e565b348015610fb557600080fd5b50610ff1610fc43660046146f8565b60186020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff90931683526020830191909152016104d1565b34801561101957600080fd5b50610cef611028366004614495565b613077565b34801561103957600080fd5b506105626110483660046144ae565b6130b9565b60606003805461105c9061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546110889061472f565b80156110d55780601f106110aa576101008083540402835291602001916110d5565b820191906000526020600020905b8154815290600101906020018083116110b857829003601f168201915b5050505050905090565b6000336110ed81858561313b565b60019150505b92915050565b61110161325f565b600954604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e89906024015b600060405180830381600087803b15801561114857600080fd5b505af115801561115c573d6000803e3d6000fd5b5050505050565b6000336111718582856132b9565b61117c858585613333565b506001949350505050565b61118f61325f565b6001600160a01b0381166111be5760405162461bcd60e51b81526004016111b59061476a565b60405180910390fd5b6006546001600160a01b03828116911614156111ec5760405162461bcd60e51b81526004016111b59061476a565b6006546040516001600160a01b038084169216907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b691906147bc565b905090565b6006546001600160a01b03163314806112ed5750336112e26005546001600160a01b031690565b6001600160a01b0316145b6113095760405162461bcd60e51b81526004016111b5906147d5565b60095460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db09060240161112e565b6000336110ed81858561134e8383612f53565b6113589190614838565b61313b565b6113673382613804565b50565b61137261325f565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156113ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113679190614850565b6113673382613952565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611292573d6000803e3d6000fd5b6009546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa1580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f391906147bc565b6009546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611529573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154d919061486d565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6115b061325f565b6007546001600160a01b03828116911614156116205760405162461bcd60e51b815260206004820152602960248201527f4c61736d3a2054686520726f7574657220616c7265616479206861732074686160448201526874206164647265737360b81b60648201526084016111b5565b6007546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600780546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a01559160048083019260209291908290030181865afa1580156116b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116db919061489b565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b03166373b295c26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561173d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611761919061489b565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156117ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d2919061489b565b600880546001600160a01b0319166001600160a01b0383169081179091559091506117fe9060016139cb565b60095460075460405163031e79db60e41b81526001600160a01b0391821660048201529116906331e79db0906024015b600060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b505050505050565b61186c61325f565b6118766000613b29565b565b60004382106118d35760405162461bcd60e51b815260206004820152602160248201527f6765745072696f72566f7465733a206e6f74207965742064657465726d696e656044820152601960fa1b60648201526084016111b5565b6001600160a01b03831660009081526019602052604090205463ffffffff16806119015760009150506110f3565b6001600160a01b038416600090815260186020526040812084916119266001856148b8565b63ffffffff9081168252602082019290925260400160002054161161198f576001600160a01b0384166000908152601860205260408120906119696001846148b8565b63ffffffff1663ffffffff168152602001908152602001600020600101549150506110f3565b6001600160a01b038416600090815260186020908152604080832083805290915290205463ffffffff168310156119ca5760009150506110f3565b6000806119d86001846148b8565b90505b8163ffffffff168163ffffffff161115611aa057600060026119fd84846148b8565b611a0791906148f3565b611a1190836148b8565b6001600160a01b038816600090815260186020908152604080832063ffffffff8086168552908352928190208151808301909252805490931680825260019093015491810191909152919250871415611a74576020015194506110f39350505050565b805163ffffffff16871115611a8b57819350611a99565b611a966001836148b8565b92505b50506119db565b506001600160a01b038516600090815260186020908152604080832063ffffffff9094168352929052206001015491505092915050565b611ae28233836132b9565b611aec8282613804565b5050565b611af861325f565b600a811115611b195760405162461bcd60e51b81526004016111b590614916565b600d819055600f54600e54611b3a9190611b3490849061312f565b9061312f565b6010556040518181527f33aa474750274306ebeefd9a3f29a0d39261cf166d5e876aab4263268bef4ff8906020015b60405180910390a150565b611b7c61325f565b62030d408110158015611b9257506207a1208111155b611c045760405162461bcd60e51b815260206004820152603a60248201527f4c61736d3a20676173466f7250726f63657373696e67206d757374206265206260448201527f65747765656e203230302c30303020616e64203530302c30303000000000000060648201526084016111b5565b601454811415611c715760405162461bcd60e51b815260206004820152603260248201527f4c61736d3a2043616e6e6f742075706461746520676173466f7250726f63657360448201527173696e6720746f2073616d652076616c756560701b60648201526084016111b5565b60145460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601455565b611cac61325f565b6009546001600160a01b0382811691161415611d265760405162461bcd60e51b815260206004820152603360248201527f4c61736d3a20546865206469766964656e6420747261636b657220616c7265616044820152726479206861732074686174206164647265737360681b60648201526084016111b5565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d97919061489b565b6001600160a01b031614611e235760405162461bcd60e51b815260206004820152604760248201527f4c61736d3a20546865206e6577206469766964656e6420747261636b6572206d60448201527f757374206265206f776e656420627920746865204c41534d20746f6b656e20636064820152661bdb9d1c9858dd60ca1b608482015260a4016111b5565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611e6557600080fd5b505af1158015611e79573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611ebe57600080fd5b505af1158015611ed2573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611ef76005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611f3857600080fd5b505af1158015611f4c573d6000803e3d6000fd5b505060405163031e79db60e41b815261dead60048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611f9357600080fd5b505af1158015611fa7573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611ff257600080fd5b505af1158015612006573d6000803e3d6000fd5b505060135460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561205157600080fd5b505af1158015612065573d6000803e3d6000fd5b505060405163031e79db60e41b8152735e81892779c28617b066553d25499b9ad2630a4760048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b1580156120be57600080fd5b505af11580156120d2573d6000803e3d6000fd5b505060115460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561211d57600080fd5b505af1158015612131573d6000803e3d6000fd5b505060125460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561217c57600080fd5b505af1158015612190573d6000803e3d6000fd5b505060405163031e79db60e41b8152730102aea1a3d3f100bad80fef23a2883a0c98083360048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b1580156121e957600080fd5b505af11580156121fd573d6000803e3d6000fd5b505060405163031e79db60e41b815273ef08430d3e53198160d0cd33b0f84358291640bd60048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561225657600080fd5b505af115801561226a573d6000803e3d6000fd5b505060405163031e79db60e41b815273e5917b2686f9fa32cc88cf360bf03cca1a22356360048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b1580156122c357600080fd5b505af11580156122d7573d6000803e3d6000fd5b505060405163031e79db60e41b815273b2f33cb375e21314a991f14c2d93570013e5a0a460048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561233057600080fd5b505af1158015612344573d6000803e3d6000fd5b505060405163031e79db60e41b815273939ad272c00efe7e4398b21b6aa52a3a6b7badbf60048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561239d57600080fd5b505af11580156123b1573d6000803e3d6000fd5b505060405163031e79db60e41b8152732ad0ee5e02c7be7701416925b72808df99d549ed60048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561240a57600080fd5b505af115801561241e573d6000803e3d6000fd5b505060405163031e79db60e41b815273fa39969e9083e6ddf1f18464573b9b5c002b631060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b15801561247757600080fd5b505af115801561248b573d6000803e3d6000fd5b50506009546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600980546001600160a01b0319166001600160a01b039290921691909117905550565b60606004805461105c9061472f565b61250561325f565b6008546001600160a01b038381169116141561259d5760405162461bcd60e51b815260206004820152604b60248201527f4c61736d3a205468652050616e63616b655377617020706169722063616e6e6f60448201527f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b6560648201526a744d616b6572506169727360a81b608482015260a4016111b5565b611aec82826139cb565b6125af61325f565b6001600160a01b0381166125f65760405162461bcd60e51b815260206004820152600e60248201526d57726f6e6720616464726573732160901b60448201526064016111b5565b6013546001600160a01b0316156126595760405162461bcd60e51b815260206004820152602160248201527f76657374696e67207363686564756c6520616c726561647920737461727465646044820152602160f81b60648201526084016111b5565b601380546001600160a01b0319166001600160a01b03831690811790915561269690612691670de0b6b3a7640000632faf0800614942565b613b7b565b60095460135460405163031e79db60e41b81526001600160a01b0391821660048201529116906331e79db090602401600060405180830381600087803b1580156126df57600080fd5b505af11580156126f3573d6000803e3d6000fd5b505060135461136792506001600160a01b031690506001612a2e565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611292573d6000803e3d6000fd5b600033816127678286612f53565b9050838110156127c75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016111b5565b61117c828686840361313b565b6127dc61325f565b601280546001600160a01b0319166001600160a01b0383169081179091556040519081527f464b21d4f8d37def140f2fd646da2d96b1973957bdaf7ba80c1a107dd77f02bb90602001611b69565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611495565b6000336110ed818585613333565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156128c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128eb9190614961565b97509750975097509750975097509750919395975091939597565b61290e61325f565b600a81111561292f5760405162461bcd60e51b81526004016111b590614916565b600e819055600f54600d546129499190611b34908461312f565b6010556040518181527f92b797342961e6d54073ceb70fc200ced278fbea5e4e3868966661db54a4771990602001611b69565b61298461325f565b600b8190556040518181527f09e89af7cbd8410d0ad2a74ab3cc8d9ddeef8ab1177f0f8a1984d355bb9d78f190602001611b69565b6001600160a01b03811660009081526019602052604081205463ffffffff16806129e4576000612a27565b6001600160a01b038316600090815260186020526040812090612a086001846148b8565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b6006546001600160a01b0316331480612a60575033612a556005546001600160a01b031690565b6001600160a01b0316145b612a7c5760405162461bcd60e51b81526004016111b5906147d5565b6001600160a01b03821660009081526015602052604090205460ff1615158115151415612b045760405162461bcd60e51b815260206004820152603060248201527f4c61736d3a204163636f756e7420697320616c7265616479207468652076616c60448201526f7565206f6620276578636c756465642760801b60648201526084016111b5565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866612b8e61104d565b80519060200120612b9c4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015612cc8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d2b5760405162461bcd60e51b815260206004820181905260248201527f64656c656761746542795369673a20696e76616c6964207369676e617475726560448201526064016111b5565b6001600160a01b0381166000908152601a60205260408120805491612d4f836149cb565b919050558914612da15760405162461bcd60e51b815260206004820152601c60248201527f64656c656761746542795369673a20696e76616c6964206e6f6e63650000000060448201526064016111b5565b87421115612df15760405162461bcd60e51b815260206004820181905260248201527f64656c656761746542795369673a207369676e6174757265206578706972656460448201526064016111b5565b612dfb818b613952565b50505050505050505050565b612e0f61325f565b60005b8251811015612e76578160156000858481518110612e3257612e326149e6565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580612e6e816149cb565b915050612e12565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358282604051612ea8929190614a40565b60405180910390a15050565b612ebc61325f565b600c805460ff19168215159081179091556040519081527f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990602001611b69565b612f0561325f565b601180546001600160a01b0319166001600160a01b0383169081179091556040519081527f85838c54066e17399c1792fb48e488ed4dfcb824ea13fdede56dc2fd88d57d1290602001611b69565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612f8661325f565b600a811115612fa75760405162461bcd60e51b81526004016111b590614916565b600f819055600e54600d54612fc1918391611b349161312f565b6010556040518181527f0359d58f374f7f2d4346bb0846527399f990e8d2054df7a5b1fde6b633f4bdd690602001611b69565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611292573d6000803e3d6000fd5b61304661325f565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c79060240161112e565b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016128a9565b6130c161325f565b6001600160a01b0381166131265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016111b5565b61136781613b29565b6000612a278284614838565b6001600160a01b03831661319d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016111b5565b6001600160a01b0382166131fe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016111b5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146118765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111b5565b60006132c58484612f53565b9050600019811461332d57818110156133205760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016111b5565b61332d848484840361313b565b50505050565b6001600160a01b0383166133595760405162461bcd60e51b81526004016111b590614a64565b6001600160a01b03821661337f5760405162461bcd60e51b81526004016111b590614aa9565b6001600160a01b0383166000908152600a602052604090205460ff161580156133c157506001600160a01b0382166000908152600a602052604090205460ff16155b6134035760405162461bcd60e51b8152602060048201526013602482015272426c61636b6c6973746564206164647265737360681b60448201526064016111b5565b806134195761341483836000613c5a565b505050565b30600090815260208190526040902054600b54811080159081906134475750600854600160a01b900460ff16155b801561346c57506001600160a01b03851660009081526016602052604090205460ff16155b801561348657506005546001600160a01b03868116911614155b80156134a057506005546001600160a01b03858116911614155b80156134ae5750600c5460ff165b15613541576008805460ff60a01b1916600160a01b179055601054600f546000916134e4916134de908690613dae565b90613dba565b90506134ef81613dc6565b600061350c6010546134de600e5487613dae90919063ffffffff16565b905061351781613e13565b3060009081526020819052604090205461353081613e9a565b50506008805460ff60a01b19169055505b6008546001600160a01b03861660009081526015602052604090205460ff600160a01b90920482161591168061358f57506001600160a01b03851660009081526015602052604090205460ff165b15613598575060005b6008546001600160a01b03878116911614806135c157506008546001600160a01b038681169116145b6135c9575060005b80156136065760006135eb60646134de60105488613dae90919063ffffffff16565b90506135f78582613ee3565b9450613604873083613c5a565b505b613611868686613c5a565b6009546001600160a01b031663e30443bc87613642816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561368857600080fd5b505af1925050508015613699575060015b506009546001600160a01b031663e30443bc866136cb816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561371157600080fd5b505af1925050508015613722575060015b50600854600160a01b900460ff1661185c576014546009546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156137a1575060408051601f3d908101601f1916820190925261379e9181019061486d565b60015b6137aa576137fb565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050565b6001600160a01b0382166138645760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016111b5565b6001600160a01b038216600090815260208190526040902054818110156138d85760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016111b5565b6001600160a01b0383166000908152602081905260408120838303905560028054849290613907908490614aec565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6001600160a01b038281166000818152601760208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461332d828483613eef565b6001600160a01b03821660009081526016602052604090205460ff1615158115151415613a605760405162461bcd60e51b815260206004820152603e60248201527f4c61736d3a204175746f6d61746564206d61726b6574206d616b65722070616960448201527f7220697320616c72656164792073657420746f20746861742076616c7565000060648201526084016111b5565b6001600160a01b0382166000908152601660205260409020805460ff19168215801591909117909155613aed5760095460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613ad457600080fd5b505af1158015613ae8573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216613bd15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016111b5565b8060026000828254613be39190614838565b90915550506001600160a01b03821660009081526020819052604081208054839290613c10908490614838565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038316613c805760405162461bcd60e51b81526004016111b590614a64565b6001600160a01b038216613ca65760405162461bcd60e51b81526004016111b590614aa9565b6001600160a01b03831660009081526020819052604090205481811015613d1e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016111b5565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290613d55908490614838565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613da191815260200190565b60405180910390a361332d565b6000612a278284614942565b6000612a278284614b03565b6000613dd3826002613dba565b601154909150613dee9030906001600160a01b031683613c5a565b613df88282613ee3565b601254909150611aec9030906001600160a01b031683613c5a565b6000613e20826002613dba565b90506000613e2e8383613ee3565b905047613e3a8361404e565b6000613e464783613ee3565b9050613e528382614172565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b600954613eb29030906001600160a01b031683613c5a565b60095460405163ba72a95560e01b8152600481018390526001600160a01b039091169063ba72a9559060240161112e565b6000612a278284614aec565b816001600160a01b0316836001600160a01b031614158015613f115750600081115b15613414576001600160a01b03831615613fb4576001600160a01b03831660009081526019602052604081205463ffffffff169081613f51576000613f94565b6001600160a01b038516600090815260186020526040812090613f756001856148b8565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000613fa28285613ee3565b9050613fb08684848461421d565b5050505b6001600160a01b03821615613414576001600160a01b03821660009081526019602052604081205463ffffffff169081613fef576000614032565b6001600160a01b0384166000908152601860205260408120906140136001856148b8565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000614040828561312f565b905061185c8584848461421d565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614083576140836149e6565b6001600160a01b03928316602091820292909201810191909152600754604080516339d94ae160e11b8152905191909316926373b295c29260048083019391928290030181865afa1580156140dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614100919061489b565b81600181518110614113576141136149e6565b6001600160a01b039283166020918202929092010152600754614139913091168461313b565b600754604051633b158ab160e11b81526001600160a01b039091169063762b15629061182e908590600090869030904290600401614b17565b60075461418a9030906001600160a01b03168461313b565b600754604051637c8d9fb960e11b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f91b3f7290839060c40160606040518083038185885af11580156141f8573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061115c919061486d565b6000614241436040518060600160405280602e8152602001614b7c602e91396143bf565b905060008463ffffffff1611801561429b57506001600160a01b038516600090815260186020526040812063ffffffff83169161427f6001886148b8565b63ffffffff908116825260208201929092526040016000205416145b156142e4576001600160a01b038516600090815260186020526040812083916142c56001886148b8565b63ffffffff168152602081019190915260400160002060010155614374565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152601883528581208a851682529092529390209151825463ffffffff191691161781559051600191820155614343908590614b53565b6001600160a01b0386166000908152601960205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b60008164010000000084106143e75760405162461bcd60e51b81526004016111b591906143ef565b509192915050565b600060208083528351808285015260005b8181101561441c57858101830151858201604001528201614400565b8181111561442e576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461136757600080fd5b803561446481614444565b919050565b6000806040838503121561447c57600080fd5b823561448781614444565b946020939093013593505050565b6000602082840312156144a757600080fd5b5035919050565b6000602082840312156144c057600080fd5b8135612a2781614444565b6000806000606084860312156144e057600080fd5b83356144eb81614444565b925060208401356144fb81614444565b929592945050506040919091013590565b801515811461136757600080fd5b80356144648161450c565b6000806040838503121561453857600080fd5b823561454381614444565b915060208301356145538161450c565b809150509250929050565b60008060008060008060c0878903121561457757600080fd5b863561458281614444565b95506020870135945060408701359350606087013560ff811681146145a657600080fd5b9598949750929560808101359460a0909101359350915050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156145e957600080fd5b823567ffffffffffffffff8082111561460157600080fd5b818501915085601f83011261461557600080fd5b8135602082821115614629576146296145c0565b8160051b604051601f19603f8301168101818110868211171561464e5761464e6145c0565b60405292835281830193508481018201928984111561466c57600080fd5b948201945b838610156146915761468286614459565b85529482019493820193614671565b96506146a0905087820161451a565b9450505050509250929050565b6000602082840312156146bf57600080fd5b8135612a278161450c565b600080604083850312156146dd57600080fd5b82356146e881614444565b9150602083013561455381614444565b6000806040838503121561470b57600080fd5b823561471681614444565b9150602083013563ffffffff8116811461455357600080fd5b600181811c9082168061474357607f821691505b6020821081141561476457634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526032908201527f7472616e736665724f70657261746f723a206e6577206f70657261746f7220696040820152717320746865207a65726f206164647265737360701b606082015260800190565b6000602082840312156147ce57600080fd5b5051919050565b6020808252602d908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526c30ba37b91037b91037bbb732b960991b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561484b5761484b614822565b500190565b60006020828403121561486257600080fd5b8151612a278161450c565b60008060006060848603121561488257600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156148ad57600080fd5b8151612a2781614444565b600063ffffffff838116908316818110156148d5576148d5614822565b039392505050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061490a5761490a6148dd565b92169190910492915050565b602080825260129082015271496e76616c69642070657263656e7461676560701b604082015260600190565b600081600019048311821515161561495c5761495c614822565b500290565b600080600080600080600080610100898b03121561497e57600080fd5b885161498981614444565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60006000198214156149df576149df614822565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015614a355781516001600160a01b031687529582019590820190600101614a10565b509495945050505050565b604081526000614a5360408301856149fc565b905082151560208301529392505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015614afe57614afe614822565b500390565b600082614b1257614b126148dd565b500490565b85815284602082015260a060408201526000614b3660a08301866149fc565b6001600160a01b0394909416606083015250608001529392505050565b600063ffffffff808316818516808303821115614b7257614b72614822565b0194935050505056fe5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220238f38fee6fd67b03a00443f68ce79d224d6de1f3aed44480af82bfbf079a81964736f6c634300080b003360806040523480156200001157600080fd5b5060405162001fe538038062001fe583398101604081905262000034916200020c565b6040518060400160405280601581526020017f4c61736d5f4469766964656e645f547261636b657200000000000000000000008152506040518060400160405280600381526020016213111560ea1b8152508282828160039080519060200190620000a192919062000166565b508051620000b790600490602084019062000166565b505050620000d4620000ce6200011060201b60201c565b62000114565b600680546001600160a01b0319166001600160a01b03929092169190911790555050610e106012555068056bc75e2d631000006013556200027b565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000174906200023e565b90600052602060002090601f016020900481019282620001985760008555620001e3565b82601f10620001b357805160ff1916838001178555620001e3565b82800160010185558215620001e3579182015b82811115620001e3578251825591602001919060010190620001c6565b50620001f1929150620001f5565b5090565b5b80821115620001f15760008155600101620001f6565b6000602082840312156200021f57600080fd5b81516001600160a01b03811681146200023757600080fd5b9392505050565b600181811c908216806200025357607f821691505b602082108114156200027557634e487b7160e01b600052602260045260246000fd5b50919050565b611d5a806200028b6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c8063715018a611610130578063ba72a955116100b8578063e7841ec01161007c578063e7841ec0146104f4578063e98030c7146104fc578063f2fde38b1461050f578063fbcbc0f114610522578063ffb2c4791461053557600080fd5b8063ba72a9551461049f578063bc4c4b37146104b2578063be10b614146104c5578063dd62ed3e146104ce578063e30443bc146104e157600080fd5b806395d89b41116100ff57806395d89b4114610435578063a457c2d71461043d578063a8b9d24014610450578063a9059cbb14610463578063aafd847a1461047657600080fd5b8063715018a61461040057806385a6b3ae146104085780638da5cb5b1461041157806391b89fba1461042257600080fd5b8063313ce567116101b35780634e7b827f116101825780634e7b827f1461034b5780635183d6fd1461036e5780636a474002146103c65780636f2789ec146103ce57806370a08231146103d757600080fd5b8063313ce567146102eb57806331e79db0146102fa578063395093511461030d5780634ca6ef281461032057600080fd5b806318160ddd116101fa57806318160ddd14610294578063226cfa3d1461029c57806323b872dd146102bc57806327ce0147146102cf5780633009a609146102e257600080fd5b806306fdde031461022c578063095ea7b31461024a57806309bbedde1461026d5780630dcb2e891461027f575b600080fd5b610234610563565b60405161024191906119dd565b60405180910390f35b61025d610258366004611a47565b6105f5565b6040519015158152602001610241565b600b545b604051908152602001610241565b61029261028d366004611a73565b61060f565b005b600254610271565b6102716102aa366004611a8c565b60116020526000908152604090205481565b61025d6102ca366004611aa9565b61061c565b6102716102dd366004611a8c565b610640565b610271600f5481565b60405160128152602001610241565b610292610308366004611a8c565b61069c565b61025d61031b366004611a47565b6107a1565b600654610333906001600160a01b031681565b6040516001600160a01b039091168152602001610241565b61025d610359366004611a8c565b60106020526000908152604090205460ff1681565b61038161037c366004611a73565b6107c3565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610241565b610292610917565b61027160125481565b6102716103e5366004611a8c565b6001600160a01b031660009081526020819052604090205490565b6102926109c0565b610271600a5481565b6005546001600160a01b0316610333565b610271610430366004611a8c565b6109d2565b6102346109dd565b61025d61044b366004611a47565b6109ec565b61027161045e366004611a8c565b610a67565b61025d610471366004611a47565b610a93565b610271610484366004611a8c565b6001600160a01b031660009081526009602052604090205490565b6102926104ad366004611a73565b610aa1565b61025d6104c0366004611af8565b610b3d565b61027160135481565b6102716104dc366004611b31565b610bc8565b6102926104ef366004611a47565b610bf3565b600f54610271565b61029261050a366004611a73565b610d40565b61029261051d366004611a8c565b610e8d565b610381610530366004611a8c565b610f03565b610548610543366004611a73565b61106c565b60408051938452602084019290925290820152606001610241565b60606003805461057290611b5f565b80601f016020809104026020016040519081016040528092919081815260200182805461059e90611b5f565b80156105eb5780601f106105c0576101008083540402835291602001916105eb565b820191906000526020600020905b8154815290600101906020018083116105ce57829003601f168201915b5050505050905090565b600033610603818585611187565b60019150505b92915050565b6106176112ab565b601355565b60003361062a858285611305565b61063585858561137f565b506001949350505050565b6001600160a01b03811660009081526008602090815260408083205491839052822054600754600160801b926106929261068d926106879161068291906113db565b6113ee565b906113fe565b61143c565b6106099190611bb0565b6106a46112ab565b6001600160a01b03811660009081526010602052604090205460ff16156106ca57600080fd5b6001600160a01b0381166000908152601060205260408120805460ff191660011790556106f890829061144f565b60405163131836e760e21b8152600b60048201526001600160a01b038216602482015273d547746236bf51615ba7d45a7efc406ff579941890634c60db9c9060440160006040518083038186803b15801561075257600080fd5b505af4158015610766573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6000336106038185856107b48383610bc8565b6107be9190611bd2565b611187565b600080600080600080600080600b73d547746236bf51615ba7d45a7efc406ff579941863deb3d89690916040518263ffffffff1660e01b815260040161080b91815260200190565b602060405180830381865af4158015610828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084c9190611bea565b891061087157506000965060001995508594508693508392508291508190508061090c565b6040516368d54f3f60e11b8152600b6004820152602481018a905260009073d547746236bf51615ba7d45a7efc406ff57994189063d1aa9e7e90604401602060405180830381865af41580156108cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ef9190611c03565b90506108fa81610f03565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152606560248201527f4c61736d5f4469766964656e645f547261636b65723a2077697468647261774460448201527f69766964656e642064697361626c65642e20557365207468652027636c61696d60648201527f272066756e6374696f6e206f6e20746865206d61696e204c41534d20636f6e746084820152643930b1ba1760d91b60a482015260c4015b60405180910390fd5b565b6109c86112ab565b6109be60006114ae565b600061060982610a67565b60606004805461057290611b5f565b600033816109fa8286610bc8565b905083811015610a5a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109b5565b6106358286868403611187565b6001600160a01b03811660009081526009602052604081205461060990610a8d84610640565b90611500565b60003361060381858561137f565b610aa96112ab565b6000610ab460025490565b11610abe57600080fd5b8015610b3a57610af1610ad060025490565b610ade83600160801b6113db565b610ae89190611bb0565b6007549061150c565b60075560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600a54610b36908261150c565b600a555b50565b6000610b476112ab565b6000610b5284611518565b90508015610bbe576001600160a01b038416600081815260116020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610bac9085815260200190565b60405180910390a36001915050610609565b5060009392505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610bfb6112ab565b6001600160a01b03821660009081526010602052604090205460ff1615610c20575050565b6013548110610cb157610c33828261144f565b604051632f0ad01760e21b8152600b60048201526001600160a01b03831660248201526044810182905273d547746236bf51615ba7d45a7efc406ff57994189063bc2b405c9060640160006040518083038186803b158015610c9457600080fd5b505af4158015610ca8573d6000803e3d6000fd5b50505050610d2f565b610cbc82600061144f565b60405163131836e760e21b8152600b60048201526001600160a01b038316602482015273d547746236bf51615ba7d45a7efc406ff579941890634c60db9c9060440160006040518083038186803b158015610d1657600080fd5b505af4158015610d2a573d6000803e3d6000fd5b505050505b610d3a826001610b3d565b505b5050565b610d486112ab565b610e108110158015610d5d5750620151808111155b610de25760405162461bcd60e51b815260206004820152604a60248201527f4c61736d5f4469766964656e645f547261636b65723a20636c61696d5761697460448201527f206d757374206265207570646174656420746f206265747765656e203120616e6064820152696420323420686f75727360b01b608482015260a4016109b5565b601254811415610e5a5760405162461bcd60e51b815260206004820152603c60248201527f4c61736d5f4469766964656e645f547261636b65723a2043616e6e6f7420757060448201527f6461746520636c61696d5761697420746f2073616d652076616c75650000000060648201526084016109b5565b60125460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601255565b610e956112ab565b6001600160a01b038116610efa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b5565b610b3a816114ae565b6040516317e142d160e01b8152600b60048201526001600160a01b0382166024820152819060009081908190819081908190819073d547746236bf51615ba7d45a7efc406ff5799418906317e142d190604401602060405180830381865af4158015610f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f979190611bea565b9650600019955060008712610ff957600f54871115610fc557600f54610fbe90889061167d565b9550610ff9565b600f54600b5460009110610fda576000610fe9565b600f54600b54610fe991611500565b9050610ff588826113fe565b9650505b61100288610a67565b945061100d88610640565b6001600160a01b038916600090815260116020526040902054909450925082611037576000611045565b60125461104590849061150c565b915042821161105557600061105f565b61105f8242611500565b9050919395975091939597565b600b54600090819081908061108c575050600f5460009250829150611180565b600f546000805a90506000805b89841080156110a757508582105b1561116f57846110b681611c20565b600b54909650861090506110c957600094505b6000600b60000186815481106110e1576110e1611c3b565b60009182526020808320909101546001600160a01b03168083526011909152604090912054909150611112906116ba565b1561113557611122816001610b3d565b15611135578161113181611c20565b9250505b8261113f81611c20565b93505060005a9050808511156111665761116361115c8683611500565b879061150c565b95505b93506110999050565b600f85905590975095509193505050505b9193909250565b6001600160a01b0383166111e95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109b5565b6001600160a01b03821661124a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109b5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146109be5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b5565b60006113118484610bc8565b90506000198114611379578181101561136c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016109b5565b6113798484848403611187565b50505050565b60405162461bcd60e51b815260206004820152602b60248201527f4c61736d5f4469766964656e645f547261636b65723a204e6f207472616e736660448201526a195c9cc8185b1b1bddd95960aa1b60648201526084016109b5565b60006113e78284611c51565b9392505050565b6000818181121561060957600080fd5b60008061140b8385611c70565b90506000831215801561141e5750838112155b80611433575060008312801561143357508381125b6113e757600080fd5b60008082121561144b57600080fd5b5090565b6001600160a01b0382166000908152602081905260409020548082111561148e57600061147c8383611500565b905061148884826116e1565b50610d3a565b80821015610d3a5760006114a28284611500565b90506113798482611745565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006113e78284611cb1565b60006113e78284611bd2565b60008061152483610a67565b90508015611674576001600160a01b03831660009081526009602052604090205461154f908261150c565b6001600160a01b038416600081815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9061159e9084815260200190565b60405180910390a260065460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af11580156115fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161e9190611cc8565b90508061166d576001600160a01b0384166000908152600960205260409020546116489083611500565b6001600160a01b03909416600090815260096020526040812094909455509192915050565b5092915050565b50600092915050565b60008061168a8385611ce5565b90506000831215801561169d5750838113155b80611433575060008312801561143357508381136113e757600080fd5b6000428211156116cc57506000919050565b6012546116d94284611500565b101592915050565b6116eb8282611789565b611725611706610682836007546113db90919063ffffffff16565b6001600160a01b0384166000908152600860205260409020549061167d565b6001600160a01b0390921660009081526008602052604090209190915550565b61174f828261187c565b61172561176a610682836007546113db90919063ffffffff16565b6001600160a01b038416600090815260086020526040902054906113fe565b6001600160a01b0382166117df5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016109b5565b6117eb60008383610d3a565b80600260008282546117fd9190611bd2565b90915550506001600160a01b0382166000908152602081905260408120805483929061182a908490611bd2565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610d3c60008383610d3a565b6001600160a01b0382166118dc5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016109b5565b6118e882600083610d3a565b6001600160a01b0382166000908152602081905260409020548181101561195c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016109b5565b6001600160a01b038316600090815260208190526040812083830390556002805484929061198b908490611cb1565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610d3a83600084610d3a565b600060208083528351808285015260005b81811015611a0a578581018301518582016040015282016119ee565b81811115611a1c576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610b3a57600080fd5b60008060408385031215611a5a57600080fd5b8235611a6581611a32565b946020939093013593505050565b600060208284031215611a8557600080fd5b5035919050565b600060208284031215611a9e57600080fd5b81356113e781611a32565b600080600060608486031215611abe57600080fd5b8335611ac981611a32565b92506020840135611ad981611a32565b929592945050506040919091013590565b8015158114610b3a57600080fd5b60008060408385031215611b0b57600080fd5b8235611b1681611a32565b91506020830135611b2681611aea565b809150509250929050565b60008060408385031215611b4457600080fd5b8235611b4f81611a32565b91506020830135611b2681611a32565b600181811c90821680611b7357607f821691505b60208210811415611b9457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082611bcd57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115611be557611be5611b9a565b500190565b600060208284031215611bfc57600080fd5b5051919050565b600060208284031215611c1557600080fd5b81516113e781611a32565b6000600019821415611c3457611c34611b9a565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000816000190483118215151615611c6b57611c6b611b9a565b500290565b600080821280156001600160ff1b0384900385131615611c9257611c92611b9a565b600160ff1b8390038412811615611cab57611cab611b9a565b50500190565b600082821015611cc357611cc3611b9a565b500390565b600060208284031215611cda57600080fd5b81516113e781611aea565b60008083128015600160ff1b850184121615611d0357611d03611b9a565b6001600160ff1b0384018313811615611d1e57611d1e611b9a565b5050039056fea26469706673582212206d0b41c13c9b2033d93e4c7ebec464a8f8e605442e0db07a3b16182a6d706aa064736f6c634300080b0033
Deployed ByteCode Sourcemap
48174:31618:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18137:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48318:29;;;;;;;;;;-1:-1:-1;48318:29:0;;;;-1:-1:-1;;;;;48318:29:0;;;;;;-1:-1:-1;;;;;801:32:1;;;783:51;;771:2;756:18;48318:29:0;616:224:1;20488:201:0;;;;;;;;;;-1:-1:-1;20488:201:0;;;;;:::i;:::-;;:::i;:::-;;;1605:14:1;;1598:22;1580:41;;1568:2;1553:18;20488:201:0;1440:187:1;62408:164:0;;;;;;;;;;-1:-1:-1;62408:164:0;;;;;:::i;:::-;;:::i;:::-;;48938:68;;;;;;;;;;;;;;;;;;;1963:25:1;;;1951:2;1936:18;48938:68:0;1817:177:1;19257:108:0;;;;;;;;;;-1:-1:-1;19345:12:0;;19257:108;;49013:54;;;;;;;;;;;;49065:2;49013:54;;48470:46;;;;;;;;;;-1:-1:-1;48470:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;72231:122;;;;;;;;;;;;72273:80;72231:122;;21269:295;;;;;;;;;;-1:-1:-1;21269:295:0;;;;;:::i;:::-;;:::i;54646:366::-;;;;;;;;;;-1:-1:-1;54646:366:0;;;;;:::i;:::-;;:::i;48831:29::-;;;;;;;;;;;;;;;;48415:42;;;;;;;;;;-1:-1:-1;48415:42:0;;;;-1:-1:-1;;;;;48415:42:0;;;49878:97;;;;;;;;;;;;49932:42;49878:97;;62660:141;;;;;;;;;;;;;:::i;19099:93::-;;;;;;;;;;-1:-1:-1;19099:93:0;;19182:2;3480:36:1;;3468:2;3453:18;19099:93:0;3338:184:1;63599:139:0;;;;;;;;;;-1:-1:-1;63599:139:0;;;;;:::i;:::-;;:::i;50190:97::-;;;;;;;;;;;;50244:42;50190:97;;21973:238;;;;;;;;;;-1:-1:-1;21973:238:0;;;;;:::i;:::-;;:::i;54223:92::-;;;;;;;;;;-1:-1:-1;54223:92:0;;;;;:::i;:::-;;:::i;50425:22::-;;;;;;;;;;-1:-1:-1;50425:22:0;;;;-1:-1:-1;;;;;50425:22:0;;;48354;;;;;;;;;;-1:-1:-1;48354:22:0;;;;-1:-1:-1;;;;;48354:22:0;;;60780:123;;;;;;;;;;-1:-1:-1;60780:123:0;;;;;:::i;:::-;;:::i;49228:97::-;;;;;;;;;;;;49282:42;49228:97;;48747:40;;;;;;;;;;-1:-1:-1;48747:40:0;;;;;;;;64991:103;;;;;;;;;;;;;:::i;62902:127::-;;;;;;;;;;-1:-1:-1;62902:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;62993:28:0;62969:4;62993:28;;;:19;:28;;;;;;;;;62902:127;54399:85;;;;;;;;;;-1:-1:-1;54467:9:0;;-1:-1:-1;;;;;54467:9:0;54399:85;;73214:149;;;;;;;;;;-1:-1:-1;73214:149:0;;;;;:::i;:::-;-1:-1:-1;;;;;73334:21:0;;;73302:7;73334:21;;;:10;:21;;;;;;;;73214:149;73507:104;;;;;;;;;;-1:-1:-1;73507:104:0;;;;;:::i;:::-;;:::i;65396:141::-;;;;;;;;;;;;;:::i;50086:97::-;;;;;;;;;;;;50140:42;50086:97;;48555:38;;;;;;;;;;;;48585:8;48555:38;;63382:141;;;;;;;;;;-1:-1:-1;63382:141:0;;;;;:::i;:::-;;:::i;72109:49::-;;;;;;;;;;-1:-1:-1;72109:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4344:10:1;4332:23;;;4314:42;;4302:2;4287:18;72109:49:0;4170:192:1;64631:271:0;;;;;;;;;;-1:-1:-1;64631:271:0;;;;;:::i;:::-;;:::i;19428:127::-;;;;;;;;;;-1:-1:-1;19428:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;19529:18:0;19502:7;19529:18;;;;;;;;;;;;19428:127;49096:89;;;;;;;;;;;;49142:42;49096:89;;57152:560;;;;;;;;;;-1:-1:-1;57152:560:0;;;;;:::i;:::-;;:::i;11560:103::-;;;;;;;;;;;;;:::i;76106:1247::-;;;;;;;;;;-1:-1:-1;76106:1247:0;;;;;:::i;:::-;;:::i;29916:164::-;;;;;;;;;;-1:-1:-1;29916:164:0;;;;;:::i;:::-;;:::i;49982:97::-;;;;;;;;;;;;50036:42;49982:97;;72645:39;;;;;;;;;;-1:-1:-1;72645:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;49774:97;;;;;;;;;;;;49828:42;49774:97;;59396:271;;;;;;;;;;-1:-1:-1;59396:271:0;;;;;:::i;:::-;;:::i;49670:97::-;;;;;;;;;;;;49724:42;49670:97;;49436;;;;;;;;;;-1:-1:-1;49436:97:0;;;;-1:-1:-1;;;;;49436:97:0;;;61506:406;;;;;;;;;;-1:-1:-1;61506:406:0;;;;;:::i;:::-;;:::i;55506:1578::-;;;;;;;;;;-1:-1:-1;55506:1578:0;;;;;:::i;:::-;;:::i;10912:87::-;;;;;;;;;;-1:-1:-1;10985:6:0;;-1:-1:-1;;;;;10985:6:0;10912:87;;18356:104;;;;;;;;;;;;;:::i;48867:31::-;;;;;;;;;;;;;;;;60438:257;;;;;;;;;;-1:-1:-1;60438:257:0;;;;;:::i;:::-;;:::i;50526:41::-;;;;;;;;;;;;;;;;55020:378;;;;;;;;;;-1:-1:-1;55020:378:0;;;;;:::i;:::-;;:::i;62211:108::-;;;;;;;;;;;;;:::i;22714:436::-;;;;;;;;;;-1:-1:-1;22714:436:0;;;;;:::i;:::-;;:::i;59157:158::-;;;;;;;;;;-1:-1:-1;59157:158:0;;;;;:::i;:::-;;:::i;63144:153::-;;;;;;;;;;-1:-1:-1;63144:153:0;;;;;:::i;:::-;;:::i;19761:193::-;;;;;;;;;;-1:-1:-1;19761:193:0;;;;;:::i;:::-;;:::i;63816:318::-;;;;;;;;;;-1:-1:-1;63816:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4984:32:1;;;4966:51;;5048:2;5033:18;;5026:34;;;;5076:18;;;5069:34;;;;5134:2;5119:18;;5112:34;;;;5177:3;5162:19;;5155:35;5004:3;5206:19;;5199:35;5265:3;5250:19;;5243:35;5309:3;5294:19;;5287:35;4953:3;4938:19;63816:318:0;4627:701:1;59732:275:0;;;;;;;;;;-1:-1:-1;59732:275:0;;;;;:::i;:::-;;:::i;50294:97::-;;;;;;;;;;;;50348:42;50294:97;;58679:155;;;;;;;;;;-1:-1:-1;58679:155:0;;;;;:::i;:::-;;:::i;75420:255::-;;;;;;;;;;-1:-1:-1;75420:255:0;;;;;:::i;:::-;;:::i;50841:58::-;;;;;;;;;;-1:-1:-1;50841:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49332:97;;;;;;;;;;-1:-1:-1;49332:97:0;;;;-1:-1:-1;;;;;49332:97:0;;;57790:306;;;;;;;;;;-1:-1:-1;57790:306:0;;;;;:::i;:::-;;:::i;74047:1172::-;;;;;;;;;;-1:-1:-1;74047:1172:0;;;;;:::i;:::-;;:::i;58189:304::-;;;;;;;;;;-1:-1:-1;58189:304:0;;;;;:::i;:::-;;:::i;68544:173::-;;;;;;;;;;-1:-1:-1;68544:173:0;;;;;:::i;:::-;;:::i;58919:162::-;;;;;;;;;;-1:-1:-1;58919:162:0;;;;;:::i;:::-;;:::i;49566:97::-;;;;;;;;;;;;49620:42;49566:97;;48905:26;;;;;;;;;;;;;;;;20017:151;;;;;;;;;;-1:-1:-1;20017:151:0;;;;;:::i;:::-;;:::i;48664:48::-;;;;;;;;;;;;;;;;60093:268;;;;;;;;;;-1:-1:-1;60093:268:0;;;;;:::i;:::-;;:::i;65184:129::-;;;;;;;;;;;;;:::i;72447:117::-;;;;;;;;;;;;72493:71;72447:117;;62001:124;;;;;;;;;;-1:-1:-1;62001:124:0;;;;;:::i;:::-;;:::i;71970:70::-;;;;;;;;;;-1:-1:-1;71970:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8618:10:1;8606:23;;;8588:42;;8661:2;8646:18;;8639:34;;;;8561:18;71970:70:0;8416:263:1;64208:328:0;;;;;;;;;;-1:-1:-1;64208:328:0;;;;;:::i;:::-;;:::i;11818:201::-;;;;;;;;;;-1:-1:-1;11818:201:0;;;;;:::i;:::-;;:::i;18137:100::-;18191:13;18224:5;18217:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18137:100;:::o;20488:201::-;20571:4;9543:10;20627:32;9543:10;20643:7;20652:6;20627:8;:32::i;:::-;20677:4;20670:11;;;20488:201;;;;;:::o;62408:164::-;10798:13;:11;:13::i;:::-;62502:15:::1;::::0;:62:::1;::::0;-1:-1:-1;;;62502:62:0;;::::1;::::0;::::1;1963:25:1::0;;;-1:-1:-1;;;;;62502:15:0;;::::1;::::0;:53:::1;::::0;1936:18:1;;62502:62:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;62408:164:::0;:::o;21269:295::-;21400:4;9543:10;21458:38;21474:4;9543:10;21489:6;21458:15;:38::i;:::-;21507:27;21517:4;21523:2;21527:6;21507:9;:27::i;:::-;-1:-1:-1;21552:4:0;;21269:295;-1:-1:-1;;;;21269:295:0:o;54646:366::-;10798:13;:11;:13::i;:::-;-1:-1:-1;;;;;54729:25:0;::::1;54721:88;;;;-1:-1:-1::0;;;54721:88:0::1;;;;;;;:::i;:::-;;;;;;;;;54843:9;::::0;-1:-1:-1;;;;;54828:24:0;;::::1;54843:9:::0;::::1;54828:24;;54820:87;;;;-1:-1:-1::0;;;54820:87:0::1;;;;;;;:::i;:::-;54945:9;::::0;54925:43:::1;::::0;-1:-1:-1;;;;;54925:43:0;;::::1;::::0;54945:9:::1;::::0;54925:43:::1;::::0;54945:9:::1;::::0;54925:43:::1;54981:9;:23:::0;;-1:-1:-1;;;;;;54981:23:0::1;-1:-1:-1::0;;;;;54981:23:0;;;::::1;::::0;;;::::1;::::0;;54646:366::o;62660:141::-;62750:15;;:43;;;-1:-1:-1;;;62750:43:0;;;;62723:7;;-1:-1:-1;;;;;62750:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62743:50;;62660:141;:::o;63599:139::-;52313:9;;-1:-1:-1;;;;;52313:9:0;52326:10;52313:23;;:48;;-1:-1:-1;52351:10:0;52340:7;10985:6;;-1:-1:-1;;;;;10985:6:0;;10912:87;52340:7;-1:-1:-1;;;;;52340:21:0;;52313:48;52305:106;;;;-1:-1:-1;;;52305:106:0;;;;;;;:::i;:::-;63685:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;63685:45:0;;-1:-1:-1;;;;;801:32:1;;;63685:45:0::1;::::0;::::1;783:51:1::0;63685:15:0;;::::1;::::0;:36:::1;::::0;756:18:1;;63685:45:0::1;616:224:1::0;21973:238:0;22061:4;9543:10;22117:64;9543:10;22133:7;22170:10;22142:25;9543:10;22133:7;22142:9;:25::i;:::-;:38;;;;:::i;:::-;22117:8;:64::i;54223:92::-;54280:27;9543:10;54300:6;54280:5;:27::i;:::-;54223:92;:::o;60780:123::-;10798:13;:11;:13::i;:::-;-1:-1:-1;;;;;60864:23:0;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;60864:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;60780:123::o;64991:103::-;65028:15;;:58;;-1:-1:-1;;;65028:58:0;;65067:10;65028:58;;;10540:51:1;65028:15:0;10607:18:1;;;10600:50;-1:-1:-1;;;;;65028:15:0;;;;:30;;10513:18:1;;65028:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;73507:104::-;73571:32;73581:10;73593:9;73571;:32::i;65396:141::-;65488:15;;:41;;;-1:-1:-1;;;65488:41:0;;;;65461:7;;-1:-1:-1;;;;;65488:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;63382:141;63481:15;;:34;;-1:-1:-1;;;63481:34:0;;-1:-1:-1;;;;;801:32:1;;;63481:34:0;;;783:51:1;63454:7:0;;63481:15;;:25;;756:18:1;;63481:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;64631:271::-;64763:15;;:28;;-1:-1:-1;;;;;;64763:28:0;;;;;1963:25:1;;;64697:18:0;;;;;;-1:-1:-1;;;;;64763:15:0;;:23;;1936:18:1;;64763:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64807:87;;;11453:25:1;;;11509:2;11494:18;;11487:34;;;11537:18;;;11530:34;;;11595:2;11580:18;;11573:34;;;64696:95:0;;-1:-1:-1;64696:95:0;;-1:-1:-1;64696:95:0;-1:-1:-1;64884:9:0;;64872:5;;64807:87;;11440:3:1;11425:19;64807:87:0;;;;;;;64685:217;;;64631:271;:::o;57152:560::-;10798:13;:11;:13::i;:::-;57257:9:::1;::::0;-1:-1:-1;;;;;57235:32:0;;::::1;57257:9:::0;::::1;57235:32;;57227:86;;;::::0;-1:-1:-1;;;57227:86:0;;11820:2:1;57227:86:0::1;::::0;::::1;11802:21:1::0;11859:2;11839:18;;;11832:30;11898:34;11878:18;;;11871:62;-1:-1:-1;;;11949:18:1;;;11942:39;11998:19;;57227:86:0::1;11618:405:1::0;57227:86:0::1;57371:9;::::0;57329:53:::1;::::0;-1:-1:-1;;;;;57371:9:0;;::::1;::::0;57329:53;::::1;::::0;::::1;::::0;57371:9:::1;::::0;57329:53:::1;57395:9;:36:::0;;-1:-1:-1;;;;;;57395:36:0::1;-1:-1:-1::0;;;;;57395:36:0;::::1;::::0;;::::1;::::0;;;57474:19:::1;::::0;;-1:-1:-1;;;57474:19:0;;;;-1:-1:-1;;57395:36:0;57474:17:::1;::::0;:19:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;57395:36;57474:19:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57462:57:0::1;;57528:4;57535:9;;;;;;;;;-1:-1:-1::0;;;;;57535:9:0::1;-1:-1:-1::0;;;;;57535:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57462:91;::::0;-1:-1:-1;;;;;;57462:91:0::1;::::0;;;;;;-1:-1:-1;;;;;12514:15:1;;;57462:91:0::1;::::0;::::1;12496:34:1::0;12566:15;;12546:18;;;12539:43;12431:18;;57462:91:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57566:6;:16:::0;;-1:-1:-1;;;;;;57566:16:0::1;-1:-1:-1::0;;;;;57566:16:0;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;57595:42:0::1;::::0;-1:-1:-1;57595:28:0::1;:42::i;:::-;57648:15;::::0;57693:9:::1;::::0;57648:56:::1;::::0;-1:-1:-1;;;57648:56:0;;-1:-1:-1;;;;;57693:9:0;;::::1;57648:56;::::0;::::1;783:51:1::0;57648:15:0;::::1;::::0;:36:::1;::::0;756:18:1;;57648:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57216:496;57152:560:::0;:::o;11560:103::-;10798:13;:11;:13::i;:::-;11625:30:::1;11652:1;11625:18;:30::i;:::-;11560:103::o:0;76106:1247::-;76214:7;76261:12;76247:11;:26;76239:72;;;;-1:-1:-1;;;76239:72:0;;12795:2:1;76239:72:0;;;12777:21:1;12834:2;12814:18;;;12807:30;12873:34;12853:18;;;12846:62;-1:-1:-1;;;12924:18:1;;;12917:31;12965:19;;76239:72:0;12593:397:1;76239:72:0;-1:-1:-1;;;;;76346:23:0;;76324:19;76346:23;;;:14;:23;;;;;;;;76384:17;76380:58;;76425:1;76418:8;;;;;76380:58;-1:-1:-1;;;;;76498:20:0;;;;;;:11;:20;;;;;76550:11;;76519:16;76534:1;76519:12;:16;:::i;:::-;76498:38;;;;;;;;;;;;;;;-1:-1:-1;76498:38:0;:48;;:63;76494:147;;-1:-1:-1;;;;;76585:20:0;;;;;;:11;:20;;;;;;76606:16;76621:1;76606:12;:16;:::i;:::-;76585:38;;;;;;;;;;;;;;;:44;;;76578:51;;;;;76494:147;-1:-1:-1;;;;;76702:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;76698:88:0;;;76773:1;76766:8;;;;;76698:88;76798:12;;76840:16;76855:1;76840:12;:16;:::i;:::-;76825:31;;76867:428;76882:5;76874:13;;:5;:13;;;76867:428;;;76904:13;76946:1;76929:13;76937:5;76929;:13;:::i;:::-;76928:19;;;;:::i;:::-;76920:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;77012:20:0;;76989;77012;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;76989:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;76904:43;;-1:-1:-1;77059:27:0;;77055:229;;;77114:8;;;;-1:-1:-1;77107:15:0;;-1:-1:-1;;;;77107:15:0;77055:229;77148:12;;:26;;;-1:-1:-1;77144:140:0;;;77203:6;77195:14;;77144:140;;;77258:10;77267:1;77258:6;:10;:::i;:::-;77250:18;;77144:140;76889:406;;76867:428;;;-1:-1:-1;;;;;;77312:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;76106:1247:0;;;;:::o;29916:164::-;29993:46;30009:7;9543:10;30032:6;29993:15;:46::i;:::-;30050:22;30056:7;30065:6;30050:5;:22::i;:::-;29916:164;;:::o;59396:271::-;10798:13;:11;:13::i;:::-;49065:2:::1;59471:5;:34;;59463:65;;;;-1:-1:-1::0;;;59463:65:0::1;;;;;;;:::i;:::-;59539:10;:18:::0;;;59613:7:::1;::::0;59595:12:::1;::::0;59580:41:::1;::::0;59613:7;59580:28:::1;::::0;59552:5;;59580:14:::1;:28::i;:::-;:32:::0;::::1;:41::i;:::-;59568:9;:53:::0;59639:20:::1;::::0;1963:25:1;;;59639:20:0::1;::::0;1951:2:1;1936:18;59639:20:0::1;;;;;;;;59396:271:::0;:::o;61506:406::-;10798:13;:11;:13::i;:::-;61606:6:::1;61594:8;:18;;:40;;;;;61628:6;61616:8;:18;;61594:40;61586:111;;;::::0;-1:-1:-1;;;61586:111:0;;14098:2:1;61586:111:0::1;::::0;::::1;14080:21:1::0;14137:2;14117:18;;;14110:30;14176:34;14156:18;;;14149:62;14247:28;14227:18;;;14220:56;14293:19;;61586:111:0::1;13896:422:1::0;61586:111:0::1;61728:16;;61716:8;:28;;61708:91;;;::::0;-1:-1:-1;;;61708:91:0;;14525:2:1;61708:91:0::1;::::0;::::1;14507:21:1::0;14564:2;14544:18;;;14537:30;14603:34;14583:18;;;14576:62;-1:-1:-1;;;14654:18:1;;;14647:48;14712:19;;61708:91:0::1;14323:414:1::0;61708:91:0::1;61849:16;::::0;61815:51:::1;::::0;61839:8;;61815:51:::1;::::0;;;::::1;61877:16;:27:::0;61506:406::o;55506:1578::-;10798:13;:11;:13::i;:::-;55617:15:::1;::::0;-1:-1:-1;;;;;55595:38:0;;::::1;55617:15:::0;::::1;55595:38;;55587:102;;;::::0;-1:-1:-1;;;55587:102:0;;14944:2:1;55587:102:0::1;::::0;::::1;14926:21:1::0;14983:2;14963:18;;;14956:30;15022:34;15002:18;;;14995:62;-1:-1:-1;;;15073:18:1;;;15066:49;15132:19;;55587:102:0::1;14742:415:1::0;55587:102:0::1;55702:38;55771:10;55702:81;;55842:4;-1:-1:-1::0;;;;;55804:43:0::1;:18;-1:-1:-1::0;;;;;55804:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55804:43:0::1;;55796:127;;;::::0;-1:-1:-1;;;55796:127:0;;15364:2:1;55796:127:0::1;::::0;::::1;15346:21:1::0;15403:2;15383:18;;;15376:30;15442:34;15422:18;;;15415:62;15513:34;15493:18;;;15486:62;-1:-1:-1;;;15564:19:1;;;15557:38;15612:19;;55796:127:0::1;15162:475:1::0;55796:127:0::1;55936:68;::::0;-1:-1:-1;;;55936:68:0;;-1:-1:-1;;;;;55936:39:0;::::1;:68;::::0;::::1;783:51:1::0;;;55936:39:0;::::1;::::0;756:18:1;;55936:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56015:54:0::1;::::0;-1:-1:-1;;;56015:54:0;;56063:4:::1;56015:54;::::0;::::1;783:51:1::0;-1:-1:-1;;;;;56015:39:0;::::1;::::0;-1:-1:-1;56015:39:0::1;::::0;-1:-1:-1;756:18:1;;56015:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56080:18;-1:-1:-1::0;;;;;56080:39:0::1;;56120:7;10985:6:::0;;-1:-1:-1;;;;;10985:6:0;;10912:87;56120:7:::1;56080:48;::::0;-1:-1:-1;;;;;;56080:48:0::1;::::0;;;;;;-1:-1:-1;;;;;801:32:1;;;56080:48:0::1;::::0;::::1;783:51:1::0;756:18;;56080:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56139:52:0::1;::::0;-1:-1:-1;;;56139:52:0;;49142:42:::1;56139:52;::::0;::::1;783:51:1::0;-1:-1:-1;;;;;56139:39:0;::::1;::::0;-1:-1:-1;56139:39:0::1;::::0;-1:-1:-1;756:18:1;;56139:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56250:9:0::1;::::0;56202:59:::1;::::0;-1:-1:-1;;;56202:59:0;;-1:-1:-1;;;;;56250:9:0;;::::1;56202:59;::::0;::::1;783:51:1::0;56202:39:0;;::::1;::::0;-1:-1:-1;56202:39:0::1;::::0;-1:-1:-1;756:18:1;;56202:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56312:7:0::1;::::0;56272:48:::1;::::0;-1:-1:-1;;;56272:48:0;;-1:-1:-1;;;;;56312:7:0;;::::1;56272:48;::::0;::::1;783:51:1::0;56272:39:0;;::::1;::::0;-1:-1:-1;56272:39:0::1;::::0;-1:-1:-1;756:18:1;;56272:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56333:48:0::1;::::0;-1:-1:-1;;;56333:48:0;;49282:42:::1;56333:48;::::0;::::1;783:51:1::0;-1:-1:-1;;;;;56333:39:0;::::1;::::0;-1:-1:-1;56333:39:0::1;::::0;-1:-1:-1;756:18:1;;56333:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56432:20:0::1;::::0;56392:61:::1;::::0;-1:-1:-1;;;56392:61:0;;-1:-1:-1;;;;;56432:20:0;;::::1;56392:61;::::0;::::1;783:51:1::0;56392:39:0;;::::1;::::0;-1:-1:-1;56392:39:0::1;::::0;-1:-1:-1;756:18:1;;56392:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56504:20:0::1;::::0;56464:61:::1;::::0;-1:-1:-1;;;56464:61:0;;-1:-1:-1;;;;;56504:20:0;;::::1;56464:61;::::0;::::1;783:51:1::0;56464:39:0;;::::1;::::0;-1:-1:-1;56464:39:0::1;::::0;-1:-1:-1;756:18:1;;56464:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56538:47:0::1;::::0;-1:-1:-1;;;56538:47:0;;49620:42:::1;56538:47;::::0;::::1;783:51:1::0;-1:-1:-1;;;;;56538:39:0;::::1;::::0;-1:-1:-1;56538:39:0::1;::::0;-1:-1:-1;756:18:1;;56538:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56596:45:0::1;::::0;-1:-1:-1;;;56596:45:0;;49724:42:::1;56596:45;::::0;::::1;783:51:1::0;-1:-1:-1;;;;;56596:39:0;::::1;::::0;-1:-1:-1;56596:39:0::1;::::0;-1:-1:-1;756:18:1;;56596:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56652:49:0::1;::::0;-1:-1:-1;;;56652:49:0;;49828:42:::1;56652:49;::::0;::::1;783:51:1::0;-1:-1:-1;;;;;56652:39:0;::::1;::::0;-1:-1:-1;56652:39:0::1;::::0;-1:-1:-1;756:18:1;;56652:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56712:50:0::1;::::0;-1:-1:-1;;;56712:50:0;;49932:42:::1;56712:50;::::0;::::1;783:51:1::0;-1:-1:-1;;;;;56712:39:0;::::1;::::0;-1:-1:-1;56712:39:0::1;::::0;-1:-1:-1;756:18:1;;56712:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56773:52:0::1;::::0;-1:-1:-1;;;56773:52:0;;50036:42:::1;56773:52;::::0;::::1;783:51:1::0;-1:-1:-1;;;;;56773:39:0;::::1;::::0;-1:-1:-1;56773:39:0::1;::::0;-1:-1:-1;756:18:1;;56773:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56836:55:0::1;::::0;-1:-1:-1;;;56836:55:0;;50140:42:::1;56836:55;::::0;::::1;783:51:1::0;-1:-1:-1;;;;;56836:39:0;::::1;::::0;-1:-1:-1;56836:39:0::1;::::0;-1:-1:-1;756:18:1;;56836:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56902:48:0::1;::::0;-1:-1:-1;;;56902:48:0;;50244:42:::1;56902:48;::::0;::::1;783:51:1::0;-1:-1:-1;;;;;56902:39:0;::::1;::::0;-1:-1:-1;56902:39:0::1;::::0;-1:-1:-1;756:18:1;;56902:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;57010:15:0::1;::::0;56968:59:::1;::::0;-1:-1:-1;;;;;57010:15:0;;::::1;::::0;-1:-1:-1;56968:59:0;;::::1;::::0;-1:-1:-1;56968:59:0::1;::::0;57010:15:::1;::::0;56968:59:::1;57040:15;:36:::0;;-1:-1:-1;;;;;;57040:36:0::1;-1:-1:-1::0;;;;;57040:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;55506:1578:0:o;18356:104::-;18412:13;18445:7;18438:14;;;;;:::i;60438:257::-;10798:13;:11;:13::i;:::-;60547:6:::1;::::0;-1:-1:-1;;;;;60539:14:0;;::::1;60547:6:::0;::::1;60539:14;;60531:102;;;::::0;-1:-1:-1;;;60531:102:0;;15844:2:1;60531:102:0::1;::::0;::::1;15826:21:1::0;15883:2;15863:18;;;15856:30;15922:34;15902:18;;;15895:62;15993:34;15973:18;;;15966:62;-1:-1:-1;;;16044:19:1;;;16037:42;16096:19;;60531:102:0::1;15642:479:1::0;60531:102:0::1;60646:41;60675:4;60681:5;60646:28;:41::i;55020:378::-:0;10798:13;:11;:13::i;:::-;-1:-1:-1;;;;;55104:22:0;::::1;55096:49;;;::::0;-1:-1:-1;;;55096:49:0;;16328:2:1;55096:49:0::1;::::0;::::1;16310:21:1::0;16367:2;16347:18;;;16340:30;-1:-1:-1;;;16386:18:1;;;16379:44;16440:18;;55096:49:0::1;16126:338:1::0;55096:49:0::1;55164:7;::::0;-1:-1:-1;;;;;55164:7:0::1;:21:::0;55156:67:::1;;;::::0;-1:-1:-1;;;55156:67:0;;16671:2:1;55156:67:0::1;::::0;::::1;16653:21:1::0;16710:2;16690:18;;;16683:30;16749:34;16729:18;;;16722:62;-1:-1:-1;;;16800:18:1;;;16793:31;16841:19;;55156:67:0::1;16469:397:1::0;55156:67:0::1;55236:7;:18:::0;;-1:-1:-1;;;;;;55236:18:0::1;-1:-1:-1::0;;;;;55236:18:0;::::1;::::0;;::::1;::::0;;;55265:26:::1;::::0;48638:17:::1;48585:8;48638:11;:17;:::i;:::-;55265:5;:26::i;:::-;55304:15;::::0;55341:7:::1;::::0;55304:45:::1;::::0;-1:-1:-1;;;55304:45:0;;-1:-1:-1;;;;;55341:7:0;;::::1;55304:45;::::0;::::1;783:51:1::0;55304:15:0;::::1;::::0;:36:::1;::::0;756:18:1;;55304:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55376:7:0::1;::::0;55360:30:::1;::::0;-1:-1:-1;;;;;;55376:7:0::1;::::0;-1:-1:-1;55376:7:0;55360:15:::1;:30::i;62211:108::-:0;62284:15;;:27;;;-1:-1:-1;;;62284:27:0;;;;62257:7;;-1:-1:-1;;;;;62284:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;22714:436;22807:4;9543:10;22807:4;22890:25;9543:10;22907:7;22890:9;:25::i;:::-;22863:52;;22954:15;22934:16;:35;;22926:85;;;;-1:-1:-1;;;22926:85:0;;17246:2:1;22926:85:0;;;17228:21:1;17285:2;17265:18;;;17258:30;17324:34;17304:18;;;17297:62;-1:-1:-1;;;17375:18:1;;;17368:35;17420:19;;22926:85:0;17044:401:1;22926:85:0;23047:60;23056:5;23063:7;23091:15;23072:16;:34;23047:8;:60::i;59157:158::-;10798:13;:11;:13::i;:::-;59236:20:::1;:29:::0;;-1:-1:-1;;;;;;59236:29:0::1;-1:-1:-1::0;;;;;59236:29:0;::::1;::::0;;::::1;::::0;;;59283:24:::1;::::0;783:51:1;;;59283:24:0::1;::::0;771:2:1;756:18;59283:24:0::1;616:224:1::0;63144:153:0;63242:15;;:47;;-1:-1:-1;;;63242:47:0;;-1:-1:-1;;;;;801:32:1;;;63242:47:0;;;783:51:1;63215:7:0;;63242:15;;:38;;756:18:1;;63242:47:0;616:224:1;19761:193:0;19840:4;9543:10;19896:28;9543:10;19913:2;19917:6;19896:9;:28::i;63816:318::-;64091:15;;:35;;-1:-1:-1;;;64091:35:0;;-1:-1:-1;;;;;801:32:1;;;64091:35:0;;;783:51:1;63912:7:0;;;;;;;;;;;;;;;;64091:15;;;:26;;756:18:1;;64091:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64084:42;;;;;;;;;;;;;;;;63816:318;;;;;;;;;:::o;59732:275::-;10798:13;:11;:13::i;:::-;49065:2:::1;59808:5;:34;;59800:65;;;;-1:-1:-1::0;;;59800:65:0::1;;;;;;;:::i;:::-;59876:12;:20:::0;;;59952:7:::1;::::0;59919:10:::1;::::0;:41:::1;::::0;59952:7;59919:28:::1;::::0;59891:5;59919:14:::1;:28::i;:41::-;59907:9;:53:::0;59978:21:::1;::::0;1963:25:1;;;59978:21:0::1;::::0;1951:2:1;1936:18;59978:21:0::1;1817:177:1::0;58679:155:0;10798:13;:11;:13::i;:::-;58754:18:::1;:26:::0;;;58798:28:::1;::::0;1963:25:1;;;58798:28:0::1;::::0;1951:2:1;1936:18;58798:28:0::1;1817:177:1::0;75420:255:0;-1:-1:-1;;;;;75559:23:0;;75512:7;75559:23;;;:14;:23;;;;;;;;75600:16;:67;;75666:1;75600:67;;;-1:-1:-1;;;;;75619:20:0;;;;;;:11;:20;;;;;;75640:16;75655:1;75640:12;:16;:::i;:::-;75619:38;;;;;;;;;;;;;;;:44;;;75600:67;75593:74;75420:255;-1:-1:-1;;;75420:255:0:o;57790:306::-;52313:9;;-1:-1:-1;;;;;52313:9:0;52326:10;52313:23;;:48;;-1:-1:-1;52351:10:0;52340:7;10985:6;;-1:-1:-1;;;;;10985:6:0;;10912:87;52340:7;-1:-1:-1;;;;;52340:21:0;;52313:48;52305:106;;;;-1:-1:-1;;;52305:106:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57893:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;57885:101;;;::::0;-1:-1:-1;;;57885:101:0;;18554:2:1;57885:101:0::1;::::0;::::1;18536:21:1::0;18593:2;18573:18;;;18566:30;18632:34;18612:18;;;18605:62;-1:-1:-1;;;18683:18:1;;;18676:46;18739:19;;57885:101:0::1;18352:412:1::0;57885:101:0::1;-1:-1:-1::0;;;;;57997:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;57997:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;58054:34;;1580:41:1;;;58054:34:0::1;::::0;1553:18:1;58054:34:0::1;;;;;;;57790:306:::0;;:::o;74047:1172::-;74240:23;72273:80;74369:6;:4;:6::i;:::-;74353:24;;;;;;74396:12;79746:9;;79636:153;74396:12;74290:165;;;;;;;19000:25:1;;;;19041:18;;;19034:34;;;;19084:18;;;19077:34;;;;74435:4:0;19127:18:1;;;;19120:60;;;;74290:165:0;;;;;;;;;;18972:19:1;;;74290:165:0;;74266:200;;;;;;72493:71;74524:140;;;19422:25:1;-1:-1:-1;;;;;19483:32:1;;19463:18;;;19456:60;19532:18;;;19525:34;;;19575:18;;;;19568:34;;;74524:140:0;;;;;;;;;;19394:19:1;;;74524:140:0;;;74500:175;;;;;;;-1:-1:-1;;;74729:123:0;;;19871:27:1;19914:11;;;19907:27;;;19950:12;;;19943:28;;;74266:200:0;;-1:-1:-1;;;19987:12:1;;74729:123:0;;;-1:-1:-1;;74729:123:0;;;;;;;;;74705:158;;74729:123;74705:158;;;;74876:17;74896:26;;;;;;;;;20237:25:1;;;20310:4;20298:17;;20278:18;;;20271:45;;;;20332:18;;;20325:34;;;20375:18;;;20368:34;;;74705:158:0;;-1:-1:-1;74876:17:0;74896:26;;20209:19:1;;74896:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74896:26:0;;-1:-1:-1;;74896:26:0;;;-1:-1:-1;;;;;;;74941:23:0;;74933:68;;;;-1:-1:-1;;;74933:68:0;;20615:2:1;74933:68:0;;;20597:21:1;;;20634:18;;;20627:30;20693:34;20673:18;;;20666:62;20745:18;;74933:68:0;20413:356:1;74933:68:0;-1:-1:-1;;;;;75029:17:0;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;75020:5;:28;75012:69;;;;-1:-1:-1;;;75012:69:0;;21116:2:1;75012:69:0;;;21098:21:1;21155:2;21135:18;;;21128:30;21194;21174:18;;;21167:58;21242:18;;75012:69:0;20914:352:1;75012:69:0;75119:6;75100:15;:25;;75092:70;;;;-1:-1:-1;;;75092:70:0;;21473:2:1;75092:70:0;;;21455:21:1;;;21492:18;;;21485:30;21551:34;21531:18;;;21524:62;21603:18;;75092:70:0;21271:356:1;75092:70:0;75180:31;75190:9;75201;75180;:31::i;:::-;75173:38;;;;74047:1172;;;;;;:::o;58189:304::-;10798:13;:11;:13::i;:::-;58306:9:::1;58302:115;58325:8;:15;58321:1;:19;58302:115;;;58397:8;58362:19;:32;58382:8;58391:1;58382:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;58362:32:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;58362:32:0;:43;;-1:-1:-1;;58362:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58342:3;::::1;::::0;::::1;:::i;:::-;;;;58302:115;;;;58434:51;58466:8;58476;58434:51;;;;;;;:::i;:::-;;;;;;;;58189:304:::0;;:::o;68544:173::-;10798:13;:11;:13::i;:::-;68623:21:::1;:32:::0;;-1:-1:-1;;68623:32:0::1;::::0;::::1;;::::0;;::::1;::::0;;;68671:38:::1;::::0;1580:41:1;;;68671:38:0::1;::::0;1568:2:1;1553:18;68671:38:0::1;1440:187:1::0;58919:162:0;10798:13;:11;:13::i;:::-;58998:20:::1;:29:::0;;-1:-1:-1;;;;;;58998:29:0::1;-1:-1:-1::0;;;;;58998:29:0;::::1;::::0;;::::1;::::0;;;59049:24:::1;::::0;783:51:1;;;59049:24:0::1;::::0;771:2:1;756:18;59049:24:0::1;616:224:1::0;20017:151:0;-1:-1:-1;;;;;20133:18:0;;;20106:7;20133:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20017:151::o;60093:268::-;10798:13;:11;:13::i;:::-;49065:2:::1;60168:5;:34;;60160:65;;;;-1:-1:-1::0;;;60160:65:0::1;;;;;;;:::i;:::-;60236:7;:15:::0;;;60289:12:::1;::::0;60274:10:::1;::::0;:41:::1;::::0;60246:5;;60274:28:::1;::::0;:14:::1;:28::i;:41::-;60262:9;:53:::0;60333:20:::1;::::0;1963:25:1;;;60333:20:0::1;::::0;1951:2:1;1936:18;60333:20:0::1;1817:177:1::0;65184:129:0;65266:15;;:39;;;-1:-1:-1;;;65266:39:0;;;;65239:7;;-1:-1:-1;;;;;65266:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;62001:124;10798:13;:11;:13::i;:::-;62075:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;62075:42:0;;::::1;::::0;::::1;1963:25:1::0;;;-1:-1:-1;;;;;62075:15:0;;::::1;::::0;:31:::1;::::0;1936:18:1;;62075:42:0::1;1817:177:1::0;64208:328:0;64488:15;;:40;;-1:-1:-1;;;64488:40:0;;;;;1963:25:1;;;64309:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64488:15:0;;;;:33;;1936:18:1;;64488:40:0;1817:177:1;11818:201:0;10798:13;:11;:13::i;:::-;-1:-1:-1;;;;;11907:22:0;::::1;11899:73;;;::::0;-1:-1:-1;;;11899:73:0;;22779:2:1;11899:73:0::1;::::0;::::1;22761:21:1::0;22818:2;22798:18;;;22791:30;22857:34;22837:18;;;22830:62;-1:-1:-1;;;22908:18:1;;;22901:36;22954:19;;11899:73:0::1;22577:402:1::0;11899:73:0::1;11983:28;12002:8;11983:18;:28::i;2911:98::-:0;2969:7;2996:5;3000:1;2996;:5;:::i;26339:380::-;-1:-1:-1;;;;;26475:19:0;;26467:68;;;;-1:-1:-1;;;26467:68:0;;23186:2:1;26467:68:0;;;23168:21:1;23225:2;23205:18;;;23198:30;23264:34;23244:18;;;23237:62;-1:-1:-1;;;23315:18:1;;;23308:34;23359:19;;26467:68:0;22984:400:1;26467:68:0;-1:-1:-1;;;;;26554:21:0;;26546:68;;;;-1:-1:-1;;;26546:68:0;;23591:2:1;26546:68:0;;;23573:21:1;23630:2;23610:18;;;23603:30;23669:34;23649:18;;;23642:62;-1:-1:-1;;;23720:18:1;;;23713:32;23762:19;;26546:68:0;23389:398:1;26546:68:0;-1:-1:-1;;;;;26627:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;26679:32;;1963:25:1;;;26679:32:0;;1936:18:1;26679:32:0;;;;;;;26339:380;;;:::o;11077:132::-;10985:6;;-1:-1:-1;;;;;10985:6:0;9543:10;11141:23;11133:68;;;;-1:-1:-1;;;11133:68:0;;23994:2:1;11133:68:0;;;23976:21:1;;;24013:18;;;24006:30;24072:34;24052:18;;;24045:62;24124:18;;11133:68:0;23792:356:1;27010:453:0;27145:24;27172:25;27182:5;27189:7;27172:9;:25::i;:::-;27145:52;;-1:-1:-1;;27212:16:0;:37;27208:248;;27294:6;27274:16;:26;;27266:68;;;;-1:-1:-1;;;27266:68:0;;24355:2:1;27266:68:0;;;24337:21:1;24394:2;24374:18;;;24367:30;24433:31;24413:18;;;24406:59;24482:18;;27266:68:0;24153:353:1;27266:68:0;27378:51;27387:5;27394:7;27422:6;27403:16;:25;27378:8;:51::i;:::-;27134:329;27010:453;;;:::o;65797:2371::-;-1:-1:-1;;;;;65929:18:0;;65921:68;;;;-1:-1:-1;;;65921:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66008:16:0;;66000:64;;;;-1:-1:-1;;;66000:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66084:20:0;;;;;;:14;:20;;;;;;;;66083:21;:44;;;;-1:-1:-1;;;;;;66109:18:0;;;;;;:14;:18;;;;;;;;66108:19;66083:44;66075:76;;;;-1:-1:-1;;;66075:76:0;;25523:2:1;66075:76:0;;;25505:21:1;25562:2;25542:18;;;25535:30;-1:-1:-1;;;25581:18:1;;;25574:49;25640:18;;66075:76:0;25321:343:1;66075:76:0;66167:11;66164:92;;66195:28;66211:4;66217:2;66221:1;66195:15;:28::i;:::-;65797:2371;;;:::o;66164:92::-;66317:4;66268:28;19529:18;;;;;;;;;;;66375;;66351:42;;;;;;;66410:33;;-1:-1:-1;66435:8:0;;-1:-1:-1;;;66435:8:0;;;;66434:9;66410:33;:82;;;;-1:-1:-1;;;;;;66461:31:0;;;;;;:25;:31;;;;;;;;66460:32;66410:82;:114;;;;-1:-1:-1;10985:6:0;;-1:-1:-1;;;;;66509:15:0;;;10985:6;;66509:15;;66410:114;:144;;;;-1:-1:-1;10985:6:0;;-1:-1:-1;;;;;66541:13:0;;;10985:6;;66541:13;;66410:144;:182;;;;-1:-1:-1;66571:21:0;;;;66410:182;66406:654;;;66619:8;:15;;-1:-1:-1;;;;66619:15:0;-1:-1:-1;;;66619:15:0;;;66713:9;;66700:7;;66619:15;;66675:48;;:33;;:20;;:24;:33::i;:::-;:37;;:48::i;:::-;66651:72;;66738:41;66765:13;66738:26;:41::i;:::-;66796:18;66817:53;66860:9;;66817:38;66842:12;;66817:20;:24;;:38;;;;:::i;:53::-;66796:74;;66885:26;66900:10;66885:14;:26::i;:::-;66967:4;66928:18;19529;;;;;;;;;;;66990:25;19529:18;66990:13;:25::i;:::-;-1:-1:-1;;67032:8:0;:16;;-1:-1:-1;;;;67032:16:0;;;-1:-1:-1;66406:654:0;67088:8;;-1:-1:-1;;;;;67197:25:0;;67072:12;67197:25;;;:19;:25;;;;;;67088:8;-1:-1:-1;;;67088:8:0;;;;;67087:9;;67197:25;;:52;;-1:-1:-1;;;;;;67226:23:0;;;;;;:19;:23;;;;;;;;67197:52;67194:99;;;-1:-1:-1;67276:5:0;67194:99;67319:6;;-1:-1:-1;;;;;67311:14:0;;;67319:6;;67311:14;;:30;;-1:-1:-1;67335:6:0;;-1:-1:-1;;;;;67329:12:0;;;67335:6;;67329:12;67311:30;67305:82;;-1:-1:-1;67370:5:0;67305:82;67402:7;67399:183;;;67426:12;67441:30;67467:3;67441:21;67452:9;;67441:6;:10;;:21;;;;:::i;:30::-;67426:45;-1:-1:-1;67495:16:0;:6;67426:45;67495:10;:16::i;:::-;67486:25;;67528:42;67544:4;67558;67565;67528:15;:42::i;:::-;67411:171;67399:183;67594:33;67610:4;67616:2;67620:6;67594:15;:33::i;:::-;67644:15;;-1:-1:-1;;;;;67644:15:0;:26;67679:4;67686:15;67679:4;-1:-1:-1;;;;;19529:18:0;19502:7;19529:18;;;;;;;;;;;;19428:127;67686:15;67644:58;;-1:-1:-1;;;;;;67644:58:0;;;;;;;-1:-1:-1;;;;;25877:32:1;;;67644:58:0;;;25859:51:1;25926:18;;;25919:34;25832:18;;67644:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67640:74;67728:15;;-1:-1:-1;;;;;67728:15:0;:26;67763:2;67768:13;67763:2;-1:-1:-1;;;;;19529:18:0;19502:7;19529:18;;;;;;;;;;;;19428:127;67768:13;67728:54;;-1:-1:-1;;;;;;67728:54:0;;;;;;;-1:-1:-1;;;;;25877:32:1;;;67728:54:0;;;25859:51:1;25926:18;;;25919:34;25832:18;;67728:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67724:70;67810:8;;-1:-1:-1;;;67810:8:0;;;;67806:355;;67849:16;;67886:15;;:28;;-1:-1:-1;;;;;;67886:28:0;;;;;1963:25:1;;;-1:-1:-1;;;;;67886:15:0;;;;:23;;1936:18:1;;67886:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;67886:28:0;;;;;;;;-1:-1:-1;;67886:28:0;;;;;;;;;;;;:::i;:::-;;;67882:268;;;;;68012:86;;;11453:25:1;;;11509:2;11494:18;;11487:34;;;11537:18;;;11530:34;;;11595:2;11580:18;;11573:34;;;68088:9:0;;68077:4;;68012:86;;11440:3:1;11425:19;68012:86:0;;;;;;;67915:199;;;67882:268;67820:341;65910:2258;;;65797:2371;;;:::o;25310:591::-;-1:-1:-1;;;;;25394:21:0;;25386:67;;;;-1:-1:-1;;;25386:67:0;;26166:2:1;25386:67:0;;;26148:21:1;26205:2;26185:18;;;26178:30;26244:34;26224:18;;;26217:62;-1:-1:-1;;;26295:18:1;;;26288:31;26336:19;;25386:67:0;25964:397:1;25386:67:0;-1:-1:-1;;;;;25553:18:0;;25528:22;25553:18;;;;;;;;;;;25590:24;;;;25582:71;;;;-1:-1:-1;;;25582:71:0;;26568:2:1;25582:71:0;;;26550:21:1;26607:2;26587:18;;;26580:30;26646:34;26626:18;;;26619:62;-1:-1:-1;;;26697:18:1;;;26690:32;26739:19;;25582:71:0;26366:398:1;25582:71:0;-1:-1:-1;;;;;25689:18:0;;:9;:18;;;;;;;;;;25710:23;;;25689:44;;25755:12;:22;;25727:6;;25689:9;25755:22;;25727:6;;25755:22;:::i;:::-;;;;-1:-1:-1;;25795:37:0;;1963:25:1;;;25821:1:0;;-1:-1:-1;;;;;25795:37:0;;;;;1951:2:1;1936:18;25795:37:0;;;;;;;65797:2371;;;:::o;77361:437::-;-1:-1:-1;;;;;77478:21:0;;;77452:23;77478:21;;;:10;:21;;;;;;;;;;19529:18;;;;;;;77612:21;;;;:33;;;-1:-1:-1;;;;;;77612:33:0;;;;;;;77663:54;;77478:21;;;;;19529:18;;77612:33;;77478:21;;;77663:54;;77452:23;77663:54;77730:60;77745:15;77762:9;77773:16;77730:14;:60::i;61001:405::-;-1:-1:-1;;;;;61092:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;61084:115;;;;-1:-1:-1;;;61084:115:0;;27101:2:1;61084:115:0;;;27083:21:1;27140:2;27120:18;;;27113:30;27179:34;27159:18;;;27152:62;27250:32;27230:18;;;27223:60;27300:19;;61084:115:0;26899:426:1;61084:115:0;-1:-1:-1;;;;;61210:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;61210:39:0;;;;;;;;;;;;61262:79;;61287:15;;:42;;-1:-1:-1;;;61287:42:0;;-1:-1:-1;;;;;801:32:1;;;61287:42:0;;;783:51:1;61287:15:0;;;;:36;;756:18:1;;61287:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61262:79;61358:40;;;;;;-1:-1:-1;;;;;61358:40:0;;;;;;;;61001:405;;:::o;12179:191::-;12272:6;;;-1:-1:-1;;;;;12289:17:0;;;-1:-1:-1;;;;;;12289:17:0;;;;;;;12322:40;;12272:6;;;12289:17;12272:6;;12322:40;;12253:16;;12322:40;12242:128;12179:191;:::o;24578:399::-;-1:-1:-1;;;;;24662:21:0;;24654:65;;;;-1:-1:-1;;;24654:65:0;;27532:2:1;24654:65:0;;;27514:21:1;27571:2;27551:18;;;27544:30;27610:33;27590:18;;;27583:61;27661:18;;24654:65:0;27330:355:1;24654:65:0;24810:6;24794:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;24827:18:0;;:9;:18;;;;;;;;;;:28;;24849:6;;24827:9;:28;;24849:6;;24827:28;:::i;:::-;;;;-1:-1:-1;;24871:37:0;;1963:25:1;;;-1:-1:-1;;;;;24871:37:0;;;24888:1;;24871:37;;1951:2:1;1936:18;24871:37:0;;;;;;;29916:164;;:::o;23620:671::-;-1:-1:-1;;;;;23751:18:0;;23743:68;;;;-1:-1:-1;;;23743:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23830:16:0;;23822:64;;;;-1:-1:-1;;;23822:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23972:15:0;;23950:19;23972:15;;;;;;;;;;;24006:21;;;;23998:72;;;;-1:-1:-1;;;23998:72:0;;27892:2:1;23998:72:0;;;27874:21:1;27931:2;27911:18;;;27904:30;27970:34;27950:18;;;27943:62;-1:-1:-1;;;28021:18:1;;;28014:36;28067:19;;23998:72:0;27690:402:1;23998:72:0;-1:-1:-1;;;;;24106:15:0;;;:9;:15;;;;;;;;;;;24124:20;;;24106:38;;24166:13;;;;;;;;:23;;24138:6;;24106:9;24166:23;;24138:6;;24166:23;:::i;:::-;;;;;;;;24222:2;-1:-1:-1;;;;;24207:26:0;24216:4;-1:-1:-1;;;;;24207:26:0;;24226:6;24207:26;;;;1963:25:1;;1951:2;1936:18;;1817:177;24207:26:0;;;;;;;;24246:37;65797:2371;3649:98;3707:7;3734:5;3738:1;3734;:5;:::i;4048:98::-;4106:7;4133:5;4137:1;4133;:5;:::i;68247:289::-;68319:11;68333:13;:6;68344:1;68333:10;:13::i;:::-;68388:20;;68319:27;;-1:-1:-1;68357:60:0;;68381:4;;-1:-1:-1;;;;;68388:20:0;68319:27;68357:15;:60::i;:::-;68439:18;:6;68450;68439:10;:18::i;:::-;68499:20;;68430:27;;-1:-1:-1;68468:60:0;;68492:4;;-1:-1:-1;;;;;68499:20:0;68430:27;68468:15;:60::i;68798:922::-;68907:12;68922:13;:6;68933:1;68922:10;:13::i;:::-;68907:28;-1:-1:-1;68946:17:0;68966:16;:6;68907:28;68966:10;:16::i;:::-;68946:36;-1:-1:-1;69285:21:0;69351:22;69368:4;69351:16;:22::i;:::-;69504:18;69525:41;:21;69551:14;69525:25;:41::i;:::-;69504:62;;69616:35;69629:9;69640:10;69616:12;:35::i;:::-;69669:43;;;28424:25:1;;;28480:2;28465:18;;28458:34;;;28508:18;;;28501:34;;;69669:43:0;;28412:2:1;28397:18;69669:43:0;;;;;;;68846:874;;;;68798:922;:::o;71024:190::-;71121:15;;71082:64;;71106:4;;-1:-1:-1;;;;;71121:15:0;71139:6;71082:15;:64::i;:::-;71159:15;;:47;;-1:-1:-1;;;71159:47:0;;;;;1963:25:1;;;-1:-1:-1;;;;;71159:15:0;;;;:39;;1936:18:1;;71159:47:0;1817:177:1;3292:98:0;3350:7;3377:5;3381:1;3377;:5;:::i;77806:947::-;77912:6;-1:-1:-1;;;;;77902:16:0;:6;-1:-1:-1;;;;;77902:16:0;;;:30;;;;;77931:1;77922:6;:10;77902:30;77898:848;;;-1:-1:-1;;;;;77953:20:0;;;77949:385;;-1:-1:-1;;;;;78061:22:0;;78042:16;78061:22;;;:14;:22;;;;;;;;;78122:13;:60;;78181:1;78122:60;;;-1:-1:-1;;;;;78138:19:0;;;;;;:11;:19;;;;;;78158:13;78170:1;78158:9;:13;:::i;:::-;78138:34;;;;;;;;;;;;;;;:40;;;78122:60;78102:80;-1:-1:-1;78201:17:0;78221:21;78102:80;78235:6;78221:13;:21::i;:::-;78201:41;;78261:57;78278:6;78286:9;78297;78308;78261:16;:57::i;:::-;77975:359;;;77949:385;-1:-1:-1;;;;;78354:20:0;;;78350:385;;-1:-1:-1;;;;;78462:22:0;;78443:16;78462:22;;;:14;:22;;;;;;;;;78523:13;:60;;78582:1;78523:60;;;-1:-1:-1;;;;;78539:19:0;;;;;;:11;:19;;;;;;78559:13;78571:1;78559:9;:13;:::i;:::-;78539:34;;;;;;;;;;;;;;;:40;;;78523:60;78503:80;-1:-1:-1;78602:17:0;78622:21;78503:80;78636:6;78622:13;:21::i;:::-;78602:41;;78662:57;78679:6;78687:9;78698;78709;78662:16;:57::i;69790:573::-;69940:16;;;69954:1;69940:16;;;;;;;;69916:21;;69940:16;;;;;;;;;;-1:-1:-1;69940:16:0;69916:40;;69985:4;69967;69972:1;69967:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;69967:23:0;;;:7;;;;;;;;;;:23;;;;70011:9;;:17;;;-1:-1:-1;;;70011:17:0;;;;:9;;;;;:15;;:17;;;;;69967:7;;70011:17;;;;;:9;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70001:4;70006:1;70001:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;70001:27:0;;;:7;;;;;;;;;:27;70073:9;;70041:56;;70058:4;;70073:9;70085:11;70041:8;:56::i;:::-;70136:9;;:219;;-1:-1:-1;;;70136:219:0;;-1:-1:-1;;;;;70136:9:0;;;;:61;;:219;;70212:11;;70136:9;;70282:4;;70309;;70329:15;;70136:219;;;:::i;70432:508::-;70614:9;;70582:56;;70599:4;;-1:-1:-1;;;;;70614:9:0;70626:11;70582:8;:56::i;:::-;70681:9;;:251;;-1:-1:-1;;;70681:251:0;;70748:4;70681:251;;;29474:34:1;29524:18;;;29517:34;;;70681:9:0;29567:18:1;;;29560:34;;;29610:18;;;29603:34;49142:42:0;29653:19:1;;;29646:44;70906:15:0;29706:19:1;;;29699:35;-1:-1:-1;;;;;70681:9:0;;;;:26;;70715:9;;29408:19:1;;70681:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;78761:698::-;78940:18;78961:70;78968:12;78961:70;;;;;;;;;;;;;;;;;:6;:70::i;:::-;78940:91;;79063:1;79048:12;:16;;;:85;;;;-1:-1:-1;;;;;;79068:22:0;;;;;;:11;:22;;;;;:65;;;;79091:16;79106:1;79091:12;:16;:::i;:::-;79068:40;;;;;;;;;;;;;;;-1:-1:-1;79068:40:0;:50;;:65;79048:85;79044:339;;;-1:-1:-1;;;;;79150:22:0;;;;;;:11;:22;;;;;79199:8;;79173:16;79188:1;79173:12;:16;:::i;:::-;79150:40;;;;;;;;;;;;;-1:-1:-1;79150:40:0;:46;;:57;79044:339;;;79279:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;79240:22:0;;-1:-1:-1;79240:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:72;;;;-1:-1:-1;;79240:72:0;;;;;;;;-1:-1:-1;79240:72:0;;;;79355:16;;79240:36;;79355:16;:::i;:::-;-1:-1:-1;;;;;79327:25:0;;;;;;:14;:25;;;;;:44;;-1:-1:-1;;79327:44:0;;;;;;;;;;;;79044:339;79400:51;;;30152:25:1;;;30208:2;30193:18;;30186:34;;;-1:-1:-1;;;;;79400:51:0;;;;;30125:18:1;79400:51:0;;;;;;;78929:530;78761:698;;;;:::o;79467:161::-;79542:6;79580:12;79573:5;79569:9;;79561:32;;;;-1:-1:-1;;;79561:32:0;;;;;;;;:::i;:::-;-1:-1:-1;79618:1:0;;79467:161;-1:-1:-1;;79467:161:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;845:131::-;-1:-1:-1;;;;;920:31:1;;910:42;;900:70;;966:1;963;956:12;981:134;1049:20;;1078:31;1049:20;1078:31;:::i;:::-;981:134;;;:::o;1120:315::-;1188:6;1196;1249:2;1237:9;1228:7;1224:23;1220:32;1217:52;;;1265:1;1262;1255:12;1217:52;1304:9;1291:23;1323:31;1348:5;1323:31;:::i;:::-;1373:5;1425:2;1410:18;;;;1397:32;;-1:-1:-1;;;1120:315:1:o;1632:180::-;1691:6;1744:2;1732:9;1723:7;1719:23;1715:32;1712:52;;;1760:1;1757;1750:12;1712:52;-1:-1:-1;1783:23:1;;1632:180;-1:-1:-1;1632:180:1:o;1999:247::-;2058:6;2111:2;2099:9;2090:7;2086:23;2082:32;2079:52;;;2127:1;2124;2117:12;2079:52;2166:9;2153:23;2185:31;2210:5;2185:31;:::i;2433:456::-;2510:6;2518;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2634:9;2621:23;2653:31;2678:5;2653:31;:::i;:::-;2703:5;-1:-1:-1;2760:2:1;2745:18;;2732:32;2773:33;2732:32;2773:33;:::i;:::-;2433:456;;2825:7;;-1:-1:-1;;;2879:2:1;2864:18;;;;2851:32;;2433:456::o;3527:118::-;3613:5;3606:13;3599:21;3592:5;3589:32;3579:60;;3635:1;3632;3625:12;3650:128;3715:20;;3744:28;3715:20;3744:28;:::i;3783:382::-;3848:6;3856;3909:2;3897:9;3888:7;3884:23;3880:32;3877:52;;;3925:1;3922;3915:12;3877:52;3964:9;3951:23;3983:31;4008:5;3983:31;:::i;:::-;4033:5;-1:-1:-1;4090:2:1;4075:18;;4062:32;4103:30;4062:32;4103:30;:::i;:::-;4152:7;4142:17;;;3783:382;;;;;:::o;5333:687::-;5435:6;5443;5451;5459;5467;5475;5528:3;5516:9;5507:7;5503:23;5499:33;5496:53;;;5545:1;5542;5535:12;5496:53;5584:9;5571:23;5603:31;5628:5;5603:31;:::i;:::-;5653:5;-1:-1:-1;5705:2:1;5690:18;;5677:32;;-1:-1:-1;5756:2:1;5741:18;;5728:32;;-1:-1:-1;5812:2:1;5797:18;;5784:32;5860:4;5847:18;;5835:31;;5825:59;;5880:1;5877;5870:12;5825:59;5333:687;;;;-1:-1:-1;5333:687:1;;5957:3;5942:19;;5929:33;;6009:3;5994:19;;;5981:33;;-1:-1:-1;5333:687:1;-1:-1:-1;;5333:687:1:o;6025:127::-;6086:10;6081:3;6077:20;6074:1;6067:31;6117:4;6114:1;6107:15;6141:4;6138:1;6131:15;6157:1191;6247:6;6255;6308:2;6296:9;6287:7;6283:23;6279:32;6276:52;;;6324:1;6321;6314:12;6276:52;6364:9;6351:23;6393:18;6434:2;6426:6;6423:14;6420:34;;;6450:1;6447;6440:12;6420:34;6488:6;6477:9;6473:22;6463:32;;6533:7;6526:4;6522:2;6518:13;6514:27;6504:55;;6555:1;6552;6545:12;6504:55;6591:2;6578:16;6613:4;6636:2;6632;6629:10;6626:36;;;6642:18;;:::i;:::-;6688:2;6685:1;6681:10;6720:2;6714:9;6783:2;6779:7;6774:2;6770;6766:11;6762:25;6754:6;6750:38;6838:6;6826:10;6823:22;6818:2;6806:10;6803:18;6800:46;6797:72;;;6849:18;;:::i;:::-;6885:2;6878:22;6935:18;;;6969:15;;;;-1:-1:-1;7011:11:1;;;7007:20;;;7039:19;;;7036:39;;;7071:1;7068;7061:12;7036:39;7095:11;;;;7115:148;7131:6;7126:3;7123:15;7115:148;;;7197:23;7216:3;7197:23;:::i;:::-;7185:36;;7148:12;;;;7241;;;;7115:148;;;7282:6;-1:-1:-1;7307:35:1;;-1:-1:-1;7323:18:1;;;7307:35;:::i;:::-;7297:45;;;;;;6157:1191;;;;;:::o;7353:241::-;7409:6;7462:2;7450:9;7441:7;7437:23;7433:32;7430:52;;;7478:1;7475;7468:12;7430:52;7517:9;7504:23;7536:28;7558:5;7536:28;:::i;7599:388::-;7667:6;7675;7728:2;7716:9;7707:7;7703:23;7699:32;7696:52;;;7744:1;7741;7734:12;7696:52;7783:9;7770:23;7802:31;7827:5;7802:31;:::i;:::-;7852:5;-1:-1:-1;7909:2:1;7894:18;;7881:32;7922:33;7881:32;7922:33;:::i;7992:419::-;8059:6;8067;8120:2;8108:9;8099:7;8095:23;8091:32;8088:52;;;8136:1;8133;8126:12;8088:52;8175:9;8162:23;8194:31;8219:5;8194:31;:::i;:::-;8244:5;-1:-1:-1;8301:2:1;8286:18;;8273:32;8349:10;8336:24;;8324:37;;8314:65;;8375:1;8372;8365:12;8684:380;8763:1;8759:12;;;;8806;;;8827:61;;8881:4;8873:6;8869:17;8859:27;;8827:61;8934:2;8926:6;8923:14;8903:18;8900:38;8897:161;;;8980:10;8975:3;8971:20;8968:1;8961:31;9015:4;9012:1;9005:15;9043:4;9040:1;9033:15;8897:161;;8684:380;;;:::o;9069:414::-;9271:2;9253:21;;;9310:2;9290:18;;;9283:30;9349:34;9344:2;9329:18;;9322:62;-1:-1:-1;;;9415:2:1;9400:18;;9393:48;9473:3;9458:19;;9069:414::o;9488:184::-;9558:6;9611:2;9599:9;9590:7;9586:23;9582:32;9579:52;;;9627:1;9624;9617:12;9579:52;-1:-1:-1;9650:16:1;;9488:184;-1:-1:-1;9488:184:1:o;9677:409::-;9879:2;9861:21;;;9918:2;9898:18;;;9891:30;9957:34;9952:2;9937:18;;9930:62;-1:-1:-1;;;10023:2:1;10008:18;;10001:43;10076:3;10061:19;;9677:409::o;10091:127::-;10152:10;10147:3;10143:20;10140:1;10133:31;10183:4;10180:1;10173:15;10207:4;10204:1;10197:15;10223:128;10263:3;10294:1;10290:6;10287:1;10284:13;10281:39;;;10300:18;;:::i;:::-;-1:-1:-1;10336:9:1;;10223:128::o;10661:245::-;10728:6;10781:2;10769:9;10760:7;10756:23;10752:32;10749:52;;;10797:1;10794;10787:12;10749:52;10829:9;10823:16;10848:28;10870:5;10848:28;:::i;10911:306::-;10999:6;11007;11015;11068:2;11056:9;11047:7;11043:23;11039:32;11036:52;;;11084:1;11081;11074:12;11036:52;11113:9;11107:16;11097:26;;11163:2;11152:9;11148:18;11142:25;11132:35;;11207:2;11196:9;11192:18;11186:25;11176:35;;10911:306;;;;;:::o;12028:251::-;12098:6;12151:2;12139:9;12130:7;12126:23;12122:32;12119:52;;;12167:1;12164;12157:12;12119:52;12199:9;12193:16;12218:31;12243:5;12218:31;:::i;12995:221::-;13034:4;13063:10;13123;;;;13093;;13145:12;;;13142:38;;;13160:18;;:::i;:::-;13197:13;;12995:221;-1:-1:-1;;;12995:221:1:o;13221:127::-;13282:10;13277:3;13273:20;13270:1;13263:31;13313:4;13310:1;13303:15;13337:4;13334:1;13327:15;13353:191;13392:1;13418:10;13455:2;13452:1;13448:10;13477:3;13467:37;;13484:18;;:::i;:::-;13522:10;;13518:20;;;;;13353:191;-1:-1:-1;;13353:191:1:o;13549:342::-;13751:2;13733:21;;;13790:2;13770:18;;;13763:30;-1:-1:-1;;;13824:2:1;13809:18;;13802:48;13882:2;13867:18;;13549:342::o;16871:168::-;16911:7;16977:1;16973;16969:6;16965:14;16962:1;16959:21;16954:1;16947:9;16940:17;16936:45;16933:71;;;16984:18;;:::i;:::-;-1:-1:-1;17024:9:1;;16871:168::o;17666:681::-;17797:6;17805;17813;17821;17829;17837;17845;17853;17906:3;17894:9;17885:7;17881:23;17877:33;17874:53;;;17923:1;17920;17913:12;17874:53;17955:9;17949:16;17974:31;17999:5;17974:31;:::i;:::-;18024:5;18014:15;;;18069:2;18058:9;18054:18;18048:25;18038:35;;18113:2;18102:9;18098:18;18092:25;18082:35;;18157:2;18146:9;18142:18;18136:25;18126:35;;18201:3;18190:9;18186:19;18180:26;18170:36;;18246:3;18235:9;18231:19;18225:26;18215:36;;18291:3;18280:9;18276:19;18270:26;18260:36;;18336:3;18325:9;18321:19;18315:26;18305:36;;17666:681;;;;;;;;;;;:::o;20774:135::-;20813:3;-1:-1:-1;;20834:17:1;;20831:43;;;20854:18;;:::i;:::-;-1:-1:-1;20901:1:1;20890:13;;20774:135::o;21632:127::-;21693:10;21688:3;21684:20;21681:1;21674:31;21724:4;21721:1;21714:15;21748:4;21745:1;21738:15;21764:461;21817:3;21855:5;21849:12;21882:6;21877:3;21870:19;21908:4;21937:2;21932:3;21928:12;21921:19;;21974:2;21967:5;21963:14;21995:1;22005:195;22019:6;22016:1;22013:13;22005:195;;;22084:13;;-1:-1:-1;;;;;22080:39:1;22068:52;;22140:12;;;;22175:15;;;;22116:1;22034:9;22005:195;;;-1:-1:-1;22216:3:1;;21764:461;-1:-1:-1;;;;;21764:461:1:o;22230:342::-;22431:2;22420:9;22413:21;22394:4;22451:56;22503:2;22492:9;22488:18;22480:6;22451:56;:::i;:::-;22443:64;;22557:6;22550:14;22543:22;22538:2;22527:9;22523:18;22516:50;22230:342;;;;;:::o;24511:401::-;24713:2;24695:21;;;24752:2;24732:18;;;24725:30;24791:34;24786:2;24771:18;;24764:62;-1:-1:-1;;;24857:2:1;24842:18;;24835:35;24902:3;24887:19;;24511:401::o;24917:399::-;25119:2;25101:21;;;25158:2;25138:18;;;25131:30;25197:34;25192:2;25177:18;;25170:62;-1:-1:-1;;;25263:2:1;25248:18;;25241:33;25306:3;25291:19;;24917:399::o;26769:125::-;26809:4;26837:1;26834;26831:8;26828:34;;;26842:18;;:::i;:::-;-1:-1:-1;26879:9:1;;26769:125::o;28097:120::-;28137:1;28163;28153:35;;28168:18;;:::i;:::-;-1:-1:-1;28202:9:1;;28097:120::o;28546:582::-;28845:6;28834:9;28827:25;28888:6;28883:2;28872:9;28868:18;28861:34;28931:3;28926:2;28915:9;28911:18;28904:31;28808:4;28952:57;29004:3;28993:9;28989:19;28981:6;28952:57;:::i;:::-;-1:-1:-1;;;;;29045:32:1;;;;29040:2;29025:18;;29018:60;-1:-1:-1;29109:3:1;29094:19;29087:35;28944:65;28546:582;-1:-1:-1;;;28546:582:1:o;29745:228::-;29784:3;29812:10;29849:2;29846:1;29842:10;29879:2;29876:1;29872:10;29910:3;29906:2;29902:12;29897:3;29894:21;29891:47;;;29918:18;;:::i;:::-;29954:13;;29745:228;-1:-1:-1;;;;29745:228:1:o
Swarm Source
ipfs://6d0b41c13c9b2033d93e4c7ebec464a8f8e605442e0db07a3b16182a6d706aa0
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.