Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FortubeDao
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-04-02
*/
pragma solidity 0.6.12;
// SPDX-License-Identifier: MIT
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// solhint-disable-next-line compiler-version
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
/// @dev Returns true if and only if the function is running in the constructor
function _isConstructor() private view returns (bool) {
return !AddressUpgradeable.isContract(address(this));
}
}
/*
* @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 GSN 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 ContextUpgradeable is Initializable {
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {
}
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
uint256[50] private __gap;
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20Upgradeable {
/**
* @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 `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMathUpgradeable {
/**
* @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) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
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) {
// 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) {
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) {
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) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @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) {
require(b <= a, "SafeMath: subtraction overflow");
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) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @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. 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) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
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) {
require(b > 0, "SafeMath: modulo by zero");
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) {
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.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* 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) {
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) {
require(b > 0, errorMessage);
return a % b;
}
}
/**
* @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 guidelines: functions revert instead
* of 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 ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {
using SafeMathUpgradeable for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
function __ERC20_init(string memory name_, string memory symbol_) internal initializer {
__Context_init_unchained();
__ERC20_init_unchained(name_, symbol_);
}
function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return _decimals;
}
/**
* @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:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, 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}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), 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}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
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) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @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.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, 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:
*
* - `to` 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 = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(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);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(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 Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal virtual {
_decimals = decimals_;
}
/**
* @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 to 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 { }
uint256[44] private __gap;
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20Upgradeable {
using SafeMathUpgradeable for uint256;
using AddressUpgradeable for address;
function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
/**
* @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 OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal initializer {
__Context_init_unchained();
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal initializer {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = 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");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
uint256[49] private __gap;
}
contract FortubeDao is ERC20Upgradeable {
using SafeMathUpgradeable for uint256;
using SafeERC20Upgradeable for IERC20Upgradeable;
address public reservedToken;
uint256 public slope;
uint256 public intercept;
uint256 public totalToken;
uint256 public sellDelay;
address public operator;
address public multiSig;
mapping(address => uint256) public lastBoughtTime;
address public treasury;
uint256 public penalty; // 300/10000 for 0.03, max % is 10%
/// @notice A record of each accounts delegate
mapping (address => address) public delegates;
/// @notice A checkpoint for marking number of votes from a given block
struct Checkpoint {
uint32 fromBlock;
uint96 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);
event Bought(address user, uint256 forAmount, uint256 daoAmount, uint256 timestamp);
event Sold(address user, uint256 userForAmount, uint256 penaltyForAmount, uint256 daoAmount, uint256 timestamp);
event SponsorIn(address sponsorFrom, uint256 totalToken, uint256 inAmount);
event SponsorOut(uint256 totalToken, address sponsorTo, uint256 outAmount);
event SellDelayChanged(uint256 oldSellDelay, uint256 newSellDelay);
event OperatorChanged(address oldOperator, address newOperator);
event MultiSigChanged(address oldMultiSig, address newMultiSig);
event TreasuryChanged(address oldTreasury, address newTreasury);
event PenaltyChanged(uint256 oldPenalty, uint256 newPenalty);
event Synced(uint256 oldSlope, uint256 newSlope);
modifier onlyOperator {
require(msg.sender == operator, "Operator required");
_;
}
modifier onlyMultiSig {
require(msg.sender == multiSig, "MultiSig required");
_;
}
function initialize(
uint256 _slope,
uint256 _intercept,
address _reservedToken,
address _multiSig,
address _treasury
) public initializer {
__ERC20_init("ForTube DAO", "FDAO");
slope = _slope;
intercept = _intercept;
reservedToken = _reservedToken;
sellDelay = 3 days;
operator = msg.sender;
multiSig = _multiSig;
penalty = 300;//0.03
treasury = _treasury;
}
function buy(uint256 amount, uint256 amountOutMin) external {
require(amount > 0, "Invalid amount");
require(
IERC20Upgradeable(reservedToken).balanceOf(msg.sender) >= amount,
"Insufficient token"
);
uint256 daoAmount = calculatePurchaseReturn(amount);
require(daoAmount >= amountOutMin, "ForTubeDAO: INSUFFICIENT_OUTPUT_FDAO_AMOUNT");
require(daoAmount > 0, "Zero DAO amount");
_mint(msg.sender, daoAmount);
totalToken = totalToken.add(amount);
// T+n limit
lastBoughtTime[msg.sender] = block.timestamp;
sync();
IERC20Upgradeable(reservedToken).safeTransferFrom(
msg.sender,
address(this),
amount
);
emit Bought(msg.sender, amount, daoAmount, block.timestamp);
}
function buyExactDAO(uint256 daoAmount, uint256 amountInMax) external {
require(daoAmount > 0, "Invalid daoAmount");
uint256 amount = calculateBuyReturn(daoAmount);
require(amount <= amountInMax, "ForTubeDAO: INPUT_FOR_AMOUNT");
require(
IERC20Upgradeable(reservedToken).balanceOf(msg.sender) >= amount,
"Insufficient token"
);
_mint(msg.sender, daoAmount);
totalToken = totalToken.add(amount);
// T+n limit
lastBoughtTime[msg.sender] = block.timestamp;
sync();
IERC20Upgradeable(reservedToken).safeTransferFrom(
msg.sender,
address(this),
amount
);
emit Bought(msg.sender, amount, daoAmount, block.timestamp);
}
function sell(uint256 daoAmount, uint256 amountOutMin) external {
require(daoAmount > 0, "Invalid daoAmount");
require(daoAmount <= balanceOf(msg.sender), "Insufficient daoAmount");
uint256 amount = calculateSaleReturn(daoAmount);
require(amount >= amountOutMin, "ForTubeDAO: INSUFFICIENT_OUTPUT_FOR_AMOUNT");
require(amount > 0, "Zero FOR amount");
uint256 _penaltyAmount = 0;
_burn(msg.sender, daoAmount);
amount = min(totalToken, amount);
totalToken = totalToken.sub(amount);
if (block.timestamp < lastBoughtTime[msg.sender] + sellDelay) {
_penaltyAmount = amount.mul(penalty).div(10000);
amount = amount.sub(_penaltyAmount);
IERC20Upgradeable(reservedToken).safeTransfer(treasury, _penaltyAmount);
}
sync();
IERC20Upgradeable(reservedToken).safeTransfer(msg.sender, amount);
emit Sold(msg.sender, amount, _penaltyAmount, daoAmount, block.timestamp);
}
function sellExactDAO(uint256 amount, uint256 amountInMax) external {
require(amount > 0, "Invalid daoAmount");
uint256 daoAmount = calculateSaleExactReturn(amount);
require(amountInMax >= daoAmount, "ForTubeDAO: INSUFFICIENT_OUTPUT_FOR_AMOUNT");
require(daoAmount > 0, "Zero FOR amount");
require(daoAmount <= balanceOf(msg.sender), "Insufficient daoAmount");
uint256 _penaltyAmount = 0;
_burn(msg.sender, daoAmount);
amount = min(totalToken, amount);
totalToken = totalToken.sub(amount);
if (block.timestamp < lastBoughtTime[msg.sender] + sellDelay) {
_penaltyAmount = amount.mul(penalty).div(10000);
amount = amount.sub(_penaltyAmount);
IERC20Upgradeable(reservedToken).safeTransfer(treasury, _penaltyAmount);
}
sync();
IERC20Upgradeable(reservedToken).safeTransfer(msg.sender, amount);
emit Sold(msg.sender, amount, _penaltyAmount, daoAmount, block.timestamp);
}
function sponsorIn(uint256 amount) external {
require(amount > 0, "Invalid amount");
require(totalSupply() > 0, "Cannot sponsor when totalSupply is 0");
totalToken = totalToken.add(amount);
sync();
IERC20Upgradeable(reservedToken).safeTransferFrom(
msg.sender,
address(this),
amount
);
emit SponsorIn(msg.sender, totalToken, amount);
}
function sponsorOut(address sponsorTo, uint256 amount)
external
onlyMultiSig
{
require(amount > 0 && amount <= calcMaxSponsorOut(), "Invalid amount");
require(sponsorTo != address(0), "Invalid address");
totalToken = totalToken.sub(amount);
sync();
require(slope > 0, "Invalid slope");
IERC20Upgradeable(reservedToken).safeTransfer(sponsorTo, amount);
emit SponsorOut(totalToken, sponsorTo, amount);
}
function sync() internal {
uint256 oldSlope = slope;
slope = calcNewSlope(totalToken, totalSupply());
emit Synced(oldSlope, slope);
}
function calculatePurchaseReturn(uint256 _amount)
public
view
returns (uint256 daoAmount)
{
uint256 supply = totalSupply();
uint256 a = slope.mul(supply).div(1e18).add(intercept);
a = a.mul(a).div(1e18);
int256 radicand = int256(a.add(slope.mul(_amount).mul(2).div(1e18)));
uint256 b =
uint256(sqrt(uint256(radicand * 1e18))).sub(
slope.mul(supply).div(1e18).add(intercept)
);
daoAmount = b.mul(1e18).div(slope);
}
function calculateSaleReturn(uint256 _sellAmount)
public
view
returns (uint256 amount)
{
uint256 a =
slope
.mul(totalSupply())
.div(1e18)
.sub(slope.mul(_sellAmount).div(2e18))
.add(intercept);
amount = a.mul(_sellAmount).div(1e18);
}
function calculateBuyReturn(uint256 _buyFdaoAmount) public view returns (uint256 amount) {
uint256 a =
slope
.mul(totalSupply())
.div(1e18)
.add(slope.mul(_buyFdaoAmount).div(2e18))
.add(intercept);
amount = a.mul(_buyFdaoAmount).div(1e18);
}
function calculateSaleExactReturn(uint256 _amount)
public
view
returns (uint256 daoAmount)
{
uint256 supply = totalSupply();
uint256 a = slope.mul(supply).div(1e18).add(intercept);
uint256 p = a.mul(a).div(1e18);
int256 radicand = int256(p.sub(slope.mul(_amount).mul(2).div(1e18)));
uint256 b = a.sub(sqrt(uint256(radicand * 1e18)));
daoAmount = b.mul(1e18).div(slope);
}
function calcNewSlope(uint256 _totalToken, uint256 supply)
public
view
returns (uint256)
{
uint256 dividend =
_totalToken.mul(2e18).div(supply).sub(intercept.mul(2));
return dividend.mul(1e18).div(supply);
}
function calcMaxSponsorOut() public view returns (uint256) {
uint256 supply = totalSupply();
return supply.mul(supply).mul(slope).div(2e36);
}
function setSellDelay(uint256 _sellDelay) external onlyOperator {
uint256 oldDelay = sellDelay;
sellDelay = _sellDelay;
emit SellDelayChanged(oldDelay, sellDelay);
}
function setPenalty(uint256 _newPenalty) external onlyMultiSig {
require(_newPenalty <= 1000, "Penalty rate exceed max 10% limit");
uint256 oldPenalty = penalty;
penalty = _newPenalty;
emit PenaltyChanged(oldPenalty, _newPenalty);
}
function setOperator(address _operator) external onlyMultiSig {
address oldOperator = operator;
operator = _operator;
emit OperatorChanged(oldOperator, operator);
}
function setMultiSig(address _multiSig) external onlyMultiSig {
address oldMultiSig = multiSig;
multiSig = _multiSig;
emit MultiSigChanged(oldMultiSig, multiSig);
}
function setTreasury(address _treasury) external onlyMultiSig {
require(_treasury != address(0), "treasury should not address(0)");
address oldTreasury = treasury;
treasury = _treasury;
emit TreasuryChanged(oldTreasury, treasury);
}
function min(uint256 a, uint256 b) public pure returns (uint256) {
return a > b ? b : a;
}
// implementation from https://github.com/Uniswap/uniswap-lib/commit/99f3f28770640ba1bb1ff460ac7c5292fb8291a0
// original implementation: https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
// https://github.com/AlphaFinanceLab/alpha-homora-v2-contract/blob/master/contracts/utils/HomoraMath.sol
function sqrt(uint x) public pure returns (uint) {
if (x == 0) return 0;
uint xx = x;
uint r = 1;
if (xx >= 0x100000000000000000000000000000000) {
xx >>= 128;
r <<= 64;
}
if (xx >= 0x10000000000000000) {
xx >>= 64;
r <<= 32;
}
if (xx >= 0x100000000) {
xx >>= 32;
r <<= 16;
}
if (xx >= 0x10000) {
xx >>= 16;
r <<= 8;
}
if (xx >= 0x100) {
xx >>= 8;
r <<= 4;
}
if (xx >= 0x10) {
xx >>= 4;
r <<= 2;
}
if (xx >= 0x8) {
r <<= 1;
}
r = (r + x / r) >> 1;
r = (r + x / r) >> 1;
r = (r + x / r) >> 1;
r = (r + x / r) >> 1;
r = (r + x / r) >> 1;
r = (r + x / r) >> 1;
r = (r + x / r) >> 1; // Seven iterations should be enough
uint r1 = x / r;
return (r < r1 ? r : r1);
}
/**
* @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), "FDAO::delegateBySig: invalid signature");
require(nonce == nonces[signatory]++, "FDAO::delegateBySig: invalid nonce");
require(now <= expiry, "FDAO::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 (uint96) {
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 (uint96) {
require(blockNumber < block.number, "FDAO::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];
uint96 delegatorBalance = safe96(balanceOf(delegator), "FDAO::balanceOf: amount exceeds 96 bits");
delegates[delegator] = delegatee;
emit DelegateChanged(delegator, currentDelegate, delegatee);
_moveDelegates(currentDelegate, delegatee, delegatorBalance);
}
function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal {
if (srcRep != dstRep && amount > 0) {
if (srcRep != address(0)) {
uint32 srcRepNum = numCheckpoints[srcRep];
uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
uint96 srcRepNew = sub96(srcRepOld, amount, "FDAO::_moveVotes: vote amount underflows");
_writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
}
if (dstRep != address(0)) {
uint32 dstRepNum = numCheckpoints[dstRep];
uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
uint96 dstRepNew = add96(dstRepOld, amount, "FDAO::_moveVotes: vote amount overflows");
_writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
}
}
}
function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal {
uint32 blockNumber = safe32(block.number, "FDAO::_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 safe96(uint n, string memory errorMessage) internal pure returns (uint96) {
require(n < 2**96, errorMessage);
return uint96(n);
}
function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
uint96 c = a + b;
require(c >= a, errorMessage);
return c;
}
function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
require(b <= a, errorMessage);
return a - b;
}
function getChainId() internal pure returns (uint) {
uint256 chainId;
assembly { chainId := chainid() }
return chainId;
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal override {
_moveDelegates(delegates[from], delegates[to], safe96(amount, "FDAO::transfer: amount exceeds 96 bits"));
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"forAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daoAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Bought","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":false,"internalType":"address","name":"oldMultiSig","type":"address"},{"indexed":false,"internalType":"address","name":"newMultiSig","type":"address"}],"name":"MultiSigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPenalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPenalty","type":"uint256"}],"name":"PenaltyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldSellDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellDelay","type":"uint256"}],"name":"SellDelayChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"userForAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penaltyForAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daoAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Sold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sponsorFrom","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"inAmount","type":"uint256"}],"name":"SponsorIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalToken","type":"uint256"},{"indexed":false,"internalType":"address","name":"sponsorTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"outAmount","type":"uint256"}],"name":"SponsorOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldSlope","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSlope","type":"uint256"}],"name":"Synced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldTreasury","type":"address"},{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryChanged","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"daoAmount","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"}],"name":"buyExactDAO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"calcMaxSponsorOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalToken","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"calcNewSlope","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFdaoAmount","type":"uint256"}],"name":"calculateBuyReturn","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculatePurchaseReturn","outputs":[{"internalType":"uint256","name":"daoAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculateSaleExactReturn","outputs":[{"internalType":"uint256","name":"daoAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellAmount","type":"uint256"}],"name":"calculateSaleReturn","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"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":"uint96","name":"votes","type":"uint96"}],"stateMutability":"view","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":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"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":"uint256","name":"_slope","type":"uint256"},{"internalType":"uint256","name":"_intercept","type":"uint256"},{"internalType":"address","name":"_reservedToken","type":"address"},{"internalType":"address","name":"_multiSig","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"intercept","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastBoughtTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"name":"min","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"multiSig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"penalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"daoAmount","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"}],"name":"sellExactDAO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_multiSig","type":"address"}],"name":"setMultiSig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPenalty","type":"uint256"}],"name":"setPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellDelay","type":"uint256"}],"name":"setSellDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slope","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sponsorIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sponsorTo","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sponsorOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"sqrt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50613eb7806100206000396000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c806370a082311161019d578063b4b5ea57116100e9578063dd62ed3e116100a2578063f0f442601161007c578063f0f4426014610938578063f1127ed81461095e578063fbce41d4146109b8578063fe0d5313146109de576102f1565b8063dd62ed3e146108e5578063e7a324dc14610913578063ec49e9211461091b576102f1565b8063b4b5ea5714610807578063c3cda5201461082d578063c6f2567014610874578063c9ccbff61461087c578063d6febde81461089f578063d79875eb146108c2576102f1565b8063828f3a9c11610156578063a457c2d711610130578063a457c2d714610781578063a9059cbb146107ad578063ae230878146107d9578063b3ab15fb146107e1576102f1565b8063828f3a9c1461075457806383caf2751461077157806395d89b4114610779576102f1565b806370a0823114610654578063782d6fe11461067a578063791a969c146106c25780637ae2b5c7146106ee5780637ecebe001461071157806380b839ef14610737576102f1565b806336e0004a1161025c578063587cde1e11610215578063626be567116101ef578063626be567146105d3578063677342ce146105db57806369fcd4ac146105f85780636fcfff4514610615576102f1565b8063587cde1e1461057f5780635c19a95c146105a557806361d027b3146105cb576102f1565b806336e0004a146104a957806339509351146104cd5780633fbfd4df146104f95780634a4b674a1461053d57806355dc11241461055a578063570ca73514610577576102f1565b806320606b70116102ae57806320606b701461040057806323b872dd1461040857806324dc3c8e1461043e578063284d30ef14610446578063313ce5671461046e578063322d21001461048c576102f1565b806302b024dc146102f657806306fdde031461032b578063095ea7b3146103a85780630edd2ffc146103e857806318160ddd146103f057806319c13767146103f8575b600080fd5b6103196004803603604081101561030c57600080fd5b5080359060200135610a01565b60408051918252519081900360200190f35b610333610a61565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036d578181015183820152602001610355565b50505050905090810190601f16801561039a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103d4600480360360408110156103be57600080fd5b506001600160a01b038135169060200135610af7565b604080519115158252519081900360200190f35b610319610b14565b610319610b1a565b610319610b20565b610319610b26565b6103d46004803603606081101561041e57600080fd5b506001600160a01b03813581169160208101359091169060400135610b4a565b610319610bd2565b61046c6004803603602081101561045c57600080fd5b50356001600160a01b0316610c18565b005b610476610ccd565b6040805160ff9092168252519081900360200190f35b610319600480360360208110156104a257600080fd5b5035610cd6565b6104b1610dc5565b604080516001600160a01b039092168252519081900360200190f35b6103d4600480360360408110156104e357600080fd5b506001600160a01b038135169060200135610dd4565b61046c600480360360a081101561050f57600080fd5b508035906020810135906001600160a01b036040820135811691606081013582169160809091013516610e22565b61046c6004803603602081101561055357600080fd5b5035610f70565b61046c6004803603602081101561057057600080fd5b503561104b565b6104b161114d565b6104b16004803603602081101561059557600080fd5b50356001600160a01b031661115c565b61046c600480360360208110156105bb57600080fd5b50356001600160a01b0316611177565b6104b1611184565b610319611193565b610319600480360360208110156105f157600080fd5b5035611199565b6103196004803603602081101561060e57600080fd5b50356112e0565b61063b6004803603602081101561062b57600080fd5b50356001600160a01b0316611345565b6040805163ffffffff9092168252519081900360200190f35b6103196004803603602081101561066a57600080fd5b50356001600160a01b031661135d565b6106a66004803603604081101561069057600080fd5b506001600160a01b038135169060200135611378565b604080516001600160601b039092168252519081900360200190f35b61046c600480360360408110156106d857600080fd5b506001600160a01b0381351690602001356115a5565b6103196004803603604081101561070457600080fd5b5080359060200135611762565b6103196004803603602081101561072757600080fd5b50356001600160a01b0316611777565b6103196004803603602081101561074d57600080fd5b5035611789565b6103196004803603602081101561076a57600080fd5b5035611855565b610319611899565b61033361189f565b6103d46004803603604081101561079757600080fd5b506001600160a01b038135169060200135611900565b6103d4600480360360408110156107c357600080fd5b506001600160a01b038135169060200135611968565b61031961197c565b61046c600480360360208110156107f757600080fd5b50356001600160a01b0316611982565b6106a66004803603602081101561081d57600080fd5b50356001600160a01b0316611a37565b61046c600480360360c081101561084357600080fd5b506001600160a01b038135169060208101359060408101359060ff6060820135169060808101359060a00135611aa9565b6104b1611d1b565b61046c6004803603604081101561089257600080fd5b5080359060200135611d2a565b61046c600480360360408110156108b557600080fd5b5080359060200135611f5b565b61046c600480360360408110156108d857600080fd5b5080359060200135612189565b610319600480360360408110156108fb57600080fd5b506001600160a01b03813581169160200135166123ba565b6103196123e5565b61046c6004803603602081101561093157600080fd5b5035612409565b61046c6004803603602081101561094e57600080fd5b50356001600160a01b03166124a3565b6109906004803603604081101561097457600080fd5b5080356001600160a01b0316906020013563ffffffff166125b3565b6040805163ffffffff90931683526001600160601b0390911660208301528051918290030190f35b610319600480360360208110156109ce57600080fd5b50356001600160a01b03166125e8565b61046c600480360360408110156109f457600080fd5b50803590602001356125fa565b600080610a3f610a1d60026067546127fa90919063ffffffff16565b610a3985610a3388671bc16d674ec800006127fa565b90612853565b906128ba565b9050610a5783610a3383670de0b6b3a76400006127fa565b9150505b92915050565b60368054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b5050505050905090565b6000610b0b610b04612917565b848461291b565b50600192915050565b606e5481565b60355490565b60675481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610b57848484612a07565b610bc784610b63612917565b610bc285604051806060016040528060288152602001613c72602891396001600160a01b038a16600090815260346020526040812090610ba1612917565b6001600160a01b031681526020810191909152604001600020549190612b64565b61291b565b5060015b9392505050565b600080610bdd610b1a565b9050610c126f01812f9cf7920e2b66973e2000000000610a33606654610c0c85866127fa90919063ffffffff16565b906127fa565b91505090565b606b546001600160a01b03163314610c6b576040805162461bcd60e51b8152602060048201526011602482015270135d5b1d1a54da59c81c995c5d5a5c9959607a1b604482015290519081900360640190fd5b606b80546001600160a01b038381166001600160a01b0319831617928390556040805192821680845293909116602083015280517f26dac502f033131241df0b0617112156d3651579e8eda0aa6297ab5fa84260fd9281900390910190a15050565b60385460ff1690565b600080610ce1610b1a565b90506000610d12606754610d0c670de0b6b3a7640000610a33866066546127fa90919063ffffffff16565b90612bfb565b9050610d2a670de0b6b3a7640000610a3383806127fa565b90506000610d5e610d57670de0b6b3a7640000610a336002610c0c8a6066546127fa90919063ffffffff16565b8390612bfb565b90506000610d9f610d8c606754610d0c670de0b6b3a7640000610a33896066546127fa90919063ffffffff16565b610a3984670de0b6b3a764000002611199565b606654909150610dbb90610a3383670de0b6b3a76400006127fa565b9695505050505050565b606b546001600160a01b031681565b6000610b0b610de1612917565b84610bc28560346000610df2612917565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612bfb565b600054610100900460ff1680610e3b5750610e3b612c55565b80610e49575060005460ff16155b610e845760405162461bcd60e51b815260040180806020018281038252602e815260200180613bd8602e913960400191505060405180910390fd5b600054610100900460ff16158015610eaf576000805460ff1961ff0019909116610100171660011790555b610ef86040518060400160405280600b81526020016a466f72547562652044414f60a81b815250604051806040016040528060048152602001634644414f60e01b815250612c66565b60668690556067859055606580546001600160a01b038087166001600160a01b0319928316179092556203f480606955606a8054821633179055606b805486841690831617905561012c606e55606d8054928516929091169190911790558015610f68576000805461ff00191690555b505050505050565b606b546001600160a01b03163314610fc3576040805162461bcd60e51b8152602060048201526011602482015270135d5b1d1a54da59c81c995c5d5a5c9959607a1b604482015290519081900360640190fd5b6103e88111156110045760405162461bcd60e51b8152600401808060200182810382526021815260200180613cc26021913960400191505060405180910390fd5b606e805490829055604080518281526020810184905281517fa70d70729f693d280f3488d620abb512226010a7e437ac3649c65f56cdc6a61b929181900390910190a15050565b60008111611091576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b600061109b610b1a565b116110d75760405162461bcd60e51b8152600401808060200182810382526024815260200180613c2d6024913960400191505060405180910390fd5b6068546110e49082612bfb565b6068556110ef612d1c565b606554611107906001600160a01b0316333084612d76565b606854604080513381526020810192909252818101839052517fad01555c5273b89b134ef27e02ab198cdf5f77a288161e5f9505cef416c269319181900360600190a150565b606a546001600160a01b031681565b606f602052600090815260409020546001600160a01b031681565b6111813382612dd6565b50565b606d546001600160a01b031681565b60685481565b6000816111a8575060006112db565b816001600160801b82106111c15760809190911c9060401b5b6801000000000000000082106111dc5760409190911c9060201b5b600160201b82106111f25760209190911c9060101b5b6201000082106112075760109190911c9060081b5b610100821061121b5760089190911c9060041b5b6010821061122e5760049190911c9060021b5b6008821061123a5760011b5b600181858161124557fe5b048201901c9050600181858161125757fe5b048201901c9050600181858161126957fe5b048201901c9050600181858161127b57fe5b048201901c9050600181858161128d57fe5b048201901c9050600181858161129f57fe5b048201901c905060018185816112b157fe5b048201901c905060008185816112c357fe5b0490508082106112d357806112d5565b815b93505050505b919050565b60008061132d606754610d0c61130d671bc16d674ec80000610a33886066546127fa90919063ffffffff16565b610a39670de0b6b3a7640000610a33611324610b1a565b606654906127fa565b9050610bcb670de0b6b3a7640000610a3383866127fa565b60716020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526033602052604090205490565b60004382106113b85760405162461bcd60e51b8152600401808060200182810382526027815260200180613c066027913960400191505060405180910390fd5b6001600160a01b03831660009081526071602052604090205463ffffffff16806113e6576000915050610a5b565b6001600160a01b038416600090815260706020908152604080832063ffffffff600019860181168552925290912054168310611462576001600160a01b03841660009081526070602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050610a5b565b6001600160a01b038416600090815260706020908152604080832083805290915290205463ffffffff1683101561149d576000915050610a5b565b600060001982015b8163ffffffff168163ffffffff16111561156057600282820363ffffffff160481036114cf6139f5565b506001600160a01b038716600090815260706020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b0316918101919091529087141561153b57602001519450610a5b9350505050565b805163ffffffff1687111561155257819350611559565b6001820392505b50506114a5565b506001600160a01b038516600090815260706020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b606b546001600160a01b031633146115f8576040805162461bcd60e51b8152602060048201526011602482015270135d5b1d1a54da59c81c995c5d5a5c9959607a1b604482015290519081900360640190fd5b60008111801561160f575061160b610bd2565b8111155b611651576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b6001600160a01b03821661169e576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6068546116ab90826128ba565b6068556116b6612d1c565b6000606654116116fd576040805162461bcd60e51b815260206004820152600d60248201526c496e76616c696420736c6f706560981b604482015290519081900360640190fd5b606554611714906001600160a01b03168383612e86565b606854604080519182526001600160a01b0384166020830152818101839052517fc3f67c8c2f6072cf4cb739c8819c60617fb5023a3a7705627de91c838acdd48c9181900360600190a15050565b60008183116117715782610bcb565b50919050565b60726020526000908152604090205481565b600080611794610b1a565b905060006117bf606754610d0c670de0b6b3a7640000610a33866066546127fa90919063ffffffff16565b905060006117d9670de0b6b3a7640000610a3384806127fa565b9050600061180d611806670de0b6b3a7640000610a336002610c0c8b6066546127fa90919063ffffffff16565b83906128ba565b9050600061182e61182783670de0b6b3a764000002611199565b85906128ba565b60665490915061184a90610a3383670de0b6b3a76400006127fa565b979650505050505050565b60008061132d606754610d0c611882671bc16d674ec80000610a33886066546127fa90919063ffffffff16565b610d0c670de0b6b3a7640000610a33611324610b1a565b60665481565b60378054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610aed5780601f10610ac257610100808354040283529160200191610aed565b6000610b0b61190d612917565b84610bc285604051806060016040528060258152602001613e5d6025913960346000611937612917565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612b64565b6000610b0b611975612917565b8484612a07565b60695481565b606b546001600160a01b031633146119d5576040805162461bcd60e51b8152602060048201526011602482015270135d5b1d1a54da59c81c995c5d5a5c9959607a1b604482015290519081900360640190fd5b606a80546001600160a01b038381166001600160a01b0319831617928390556040805192821680845293909116602083015280517fd58299b712891143e76310d5e664c4203c940a67db37cf856bdaa3c5c76a802c9281900390910190a15050565b6001600160a01b03811660009081526071602052604081205463ffffffff1680611a62576000610bcb565b6001600160a01b038316600090815260706020908152604080832063ffffffff60001986011684529091529020546001600160601b03600160201b90910416915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611ad4610a61565b80519060200120611ae3612ed8565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a9052825180850390910181526101408401835280519085012061190160f01b6101608501526101628401829052610182808501829052835180860390910181526101a285018085528151918701919091206000918290526101c2860180865281905260ff8b166101e287015261020286018a90526102228601899052935192965090949293909260019261024280840193601f198301929081900390910190855afa158015611c16573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611c685760405162461bcd60e51b8152600401808060200182810382526026815260200180613dbf6026913960400191505060405180910390fd5b6001600160a01b03811660009081526072602052604090208054600181019091558914611cc65760405162461bcd60e51b8152600401808060200182810382526022815260200180613d296022913960400191505060405180910390fd5b87421115611d055760405162461bcd60e51b8152600401808060200182810382526026815260200180613b586026913960400191505060405180910390fd5b611d0f818b612dd6565b50505050505050505050565b6065546001600160a01b031681565b60008211611d73576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a590819185bd05b5bdd5b9d607a1b604482015290519081900360640190fd5b6000611d7e83611789565b905080821015611dbf5760405162461bcd60e51b815260040180806020018281038252602a815260200180613de5602a913960400191505060405180910390fd5b60008111611e06576040805162461bcd60e51b815260206004820152600f60248201526e16995c9bc81193d488185b5bdd5b9d608a1b604482015290519081900360640190fd5b611e0f3361135d565b811115611e5c576040805162461bcd60e51b8152602060048201526016602482015275125b9cdd59999a58da595b9d0819185bd05b5bdd5b9d60521b604482015290519081900360640190fd5b6000611e683383612edc565b611e7460685485611762565b606854909450611e8490856128ba565b606855606954336000908152606c602052604090205401421015611ee957611ebd612710610a33606e54876127fa90919063ffffffff16565b9050611ec984826128ba565b606d54606554919550611ee9916001600160a01b03908116911683612e86565b611ef1612d1c565b606554611f08906001600160a01b03163386612e86565b60408051338152602081018690528082018390526060810184905242608082015290517f490fdc1c23c0f3a84bf80a0384eaadcb9188c9ef71b9430da391a0e4c4c39bf69181900360a00190a150505050565b60008211611fa1576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b606554604080516370a0823160e01b8152336004820152905184926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611feb57600080fd5b505afa158015611fff573d6000803e3d6000fd5b505050506040513d602081101561201557600080fd5b5051101561205f576040805162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015290519081900360640190fd5b600061206a83610cd6565b9050818110156120ab5760405162461bcd60e51b815260040180806020018281038252602b815260200180613ac3602b913960400191505060405180910390fd5b600081116120f2576040805162461bcd60e51b815260206004820152600f60248201526e16995c9bc8111053c8185b5bdd5b9d608a1b604482015290519081900360640190fd5b6120fc3382612fd8565b6068546121099084612bfb565b606855336000908152606c60205260409020429055612126612d1c565b60655461213e906001600160a01b0316333086612d76565b604080513381526020810185905280820183905242606082015290517fedba86fd2b22962d534e70ad9b0ff8730de46f636146f2bab6a72cbb1ebbcc539181900360800190a1505050565b600082116121d2576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a590819185bd05b5bdd5b9d607a1b604482015290519081900360640190fd5b6121db3361135d565b821115612228576040805162461bcd60e51b8152602060048201526016602482015275125b9cdd59999a58da595b9d0819185bd05b5bdd5b9d60521b604482015290519081900360640190fd5b6000612233836112e0565b9050818110156122745760405162461bcd60e51b815260040180806020018281038252602a815260200180613de5602a913960400191505060405180910390fd5b600081116122bb576040805162461bcd60e51b815260206004820152600f60248201526e16995c9bc81193d488185b5bdd5b9d608a1b604482015290519081900360640190fd5b60006122c73385612edc565b6122d360685483611762565b6068549092506122e390836128ba565b606855606954336000908152606c6020526040902054014210156123485761231c612710610a33606e54856127fa90919063ffffffff16565b905061232882826128ba565b606d54606554919350612348916001600160a01b03908116911683612e86565b612350612d1c565b606554612367906001600160a01b03163384612e86565b60408051338152602081018490528082018390526060810186905242608082015290517f490fdc1c23c0f3a84bf80a0384eaadcb9188c9ef71b9430da391a0e4c4c39bf69181900360a00190a150505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b606a546001600160a01b0316331461245c576040805162461bcd60e51b815260206004820152601160248201527013dc195c985d1bdc881c995c5d5a5c9959607a1b604482015290519081900360640190fd5b6069805490829055604080518281526020810184905281517f2961c10c4cee27c812c7179582cfb6bdefad5c746ccf008ba607e1b11b358f41929181900390910190a15050565b606b546001600160a01b031633146124f6576040805162461bcd60e51b8152602060048201526011602482015270135d5b1d1a54da59c81c995c5d5a5c9959607a1b604482015290519081900360640190fd5b6001600160a01b038116612551576040805162461bcd60e51b815260206004820152601e60248201527f74726561737572792073686f756c64206e6f7420616464726573732830290000604482015290519081900360640190fd5b606d80546001600160a01b038381166001600160a01b0319831617928390556040805192821680845293909116602083015280517f8c3aa5f43a388513435861bf27dfad7829cd248696fed367c62d441f629544969281900390910190a15050565b607060209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b606c6020526000908152604090205481565b60008211612643576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a590819185bd05b5bdd5b9d607a1b604482015290519081900360640190fd5b600061264e83611855565b9050818111156126a5576040805162461bcd60e51b815260206004820152601c60248201527f466f725475626544414f3a20494e5055545f464f525f414d4f554e5400000000604482015290519081900360640190fd5b606554604080516370a0823160e01b8152336004820152905183926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156126ef57600080fd5b505afa158015612703573d6000803e3d6000fd5b505050506040513d602081101561271957600080fd5b50511015612763576040805162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015290519081900360640190fd5b61276d3384612fd8565b60685461277a9082612bfb565b606855336000908152606c60205260409020429055612797612d1c565b6065546127af906001600160a01b0316333084612d76565b604080513381526020810183905280820185905242606082015290517fedba86fd2b22962d534e70ad9b0ff8730de46f636146f2bab6a72cbb1ebbcc539181900360800190a1505050565b60008261280957506000610a5b565b8282028284828161281657fe5b0414610bcb5760405162461bcd60e51b8152600401808060200182810382526021815260200180613c516021913960400191505060405180910390fd5b60008082116128a9576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816128b257fe5b049392505050565b600082821115612911576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3390565b6001600160a01b0383166129605760405162461bcd60e51b8152600401808060200182810382526024815260200180613d4b6024913960400191505060405180910390fd5b6001600160a01b0382166129a55760405162461bcd60e51b8152600401808060200182810382526022815260200180613b106022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316612a4c5760405162461bcd60e51b8152600401808060200182810382526025815260200180613d046025913960400191505060405180910390fd5b6001600160a01b038216612a915760405162461bcd60e51b8152600401808060200182810382526023815260200180613aa06023913960400191505060405180910390fd5b612a9c8383836130ca565b612ad981604051806060016040528060268152602001613b32602691396001600160a01b0386166000908152603360205260409020549190612b64565b6001600160a01b038085166000908152603360205260408082209390935590841681522054612b089082612bfb565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115612bf35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612bb8578181015183820152602001612ba0565b50505050905090810190601f168015612be55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610bcb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000612c6030613125565b15905090565b600054610100900460ff1680612c7f5750612c7f612c55565b80612c8d575060005460ff16155b612cc85760405162461bcd60e51b815260040180806020018281038252602e815260200180613bd8602e913960400191505060405180910390fd5b600054610100900460ff16158015612cf3576000805460ff1961ff0019909116610100171660011790555b612cfb61312b565b612d0583836131cc565b8015612d17576000805461ff00191690555b505050565b606654606854612d3390612d2e610b1a565b610a01565b606681905560408051838152602081019290925280517fac5d95a998c1445e84cf2f50e353b0c1f9294b7153691aaf9c3b64e4ded02fa39281900390910190a150565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612dd09085906132a4565b50505050565b6001600160a01b038083166000908152606f602052604081205490911690612e1e612e008561135d565b604051806060016040528060278152602001613e3660279139613355565b6001600160a01b038581166000818152606f602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612dd08284836133b2565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612d179084906132a4565b4690565b6001600160a01b038216612f215760405162461bcd60e51b8152600401808060200182810382526021815260200180613ce36021913960400191505060405180910390fd5b612f2d826000836130ca565b612f6a81604051806060016040528060228152602001613aee602291396001600160a01b0385166000908152603360205260409020549190612b64565b6001600160a01b038316600090815260336020526040902055603554612f9090826128ba565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038216613033576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61303f600083836130ca565b60355461304c9082612bfb565b6035556001600160a01b0382166000908152603360205260409020546130729082612bfb565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038084166000908152606f6020908152604080832054868516845292819020548151606081019092526026808352612d17959485169491909116926131209287929091613d6f90830139613355565b6133b2565b3b151590565b600054610100900460ff16806131445750613144612c55565b80613152575060005460ff16155b61318d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613bd8602e913960400191505060405180910390fd5b600054610100900460ff161580156131b8576000805460ff1961ff0019909116610100171660011790555b8015611181576000805461ff001916905550565b600054610100900460ff16806131e557506131e5612c55565b806131f3575060005460ff16155b61322e5760405162461bcd60e51b815260040180806020018281038252602e815260200180613bd8602e913960400191505060405180910390fd5b600054610100900460ff16158015613259576000805460ff1961ff0019909116610100171660011790555b825161326c906036906020860190613a0c565b508151613280906037906020850190613a0c565b506038805460ff191660121790558015612d17576000805461ff0019169055505050565b60606132f9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135449092919063ffffffff16565b805190915015612d175780806020019051602081101561331857600080fd5b5051612d175760405162461bcd60e51b815260040180806020018281038252602a815260200180613d95602a913960400191505060405180910390fd5b600081600160601b84106133aa5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bb8578181015183820152602001612ba0565b509192915050565b816001600160a01b0316836001600160a01b0316141580156133dd57506000816001600160601b0316115b15612d17576001600160a01b03831615613495576001600160a01b03831660009081526071602052604081205463ffffffff16908161341d57600061345c565b6001600160a01b0385166000908152607060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b905060006134838285604051806060016040528060288152602001613c9a6028913961355b565b9050613491868484846135c0565b5050505b6001600160a01b03821615612d17576001600160a01b03821660009081526071602052604081205463ffffffff1690816134d057600061350f565b6001600160a01b0384166000908152607060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b905060006135368285604051806060016040528060278152602001613e0f6027913961377f565b9050610f68858484846135c0565b606061355384846000856137e9565b949350505050565b6000836001600160601b0316836001600160601b031611158290612bf35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bb8578181015183820152602001612ba0565b60006135e443604051806060016040528060348152602001613ba46034913961393a565b905060008463ffffffff1611801561362d57506001600160a01b038516600090815260706020908152604080832063ffffffff6000198901811685529252909120548282169116145b1561368c576001600160a01b0385166000908152607060209081526040808320600019880163ffffffff168452909152902080546fffffffffffffffffffffffff000000001916600160201b6001600160601b0385160217905561372b565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152607083528781208c871682528352878120965187549451909516600160201b026fffffffffffffffffffffffff000000001995871663ffffffff19958616179590951694909417909555938252607190935292909220805460018801909316929091169190911790555b604080516001600160601b0380861682528416602082015281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b6000838301826001600160601b0380871690831610156137e05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bb8578181015183820152602001612ba0565b50949350505050565b60608247101561382a5760405162461bcd60e51b8152600401808060200182810382526026815260200180613b7e6026913960400191505060405180910390fd5b61383385613125565b613884576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106138c35780518252601f1990920191602091820191016138a4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613925576040519150601f19603f3d011682016040523d82523d6000602084013e61392a565b606091505b509150915061184a82828661398f565b600081600160201b84106133aa5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bb8578181015183820152602001612ba0565b6060831561399e575081610bcb565b8251156139ae5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315612bb8578181015183820152602001612ba0565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a4d57805160ff1916838001178555613a7a565b82800160010185558215613a7a579182015b82811115613a7a578251825591602001919060010190613a5f565b50613a86929150613a8a565b5090565b5b80821115613a865760008155600101613a8b56fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373466f725475626544414f3a20494e53554646494349454e545f4f55545055545f4644414f5f414d4f554e5445524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654644414f3a3a64656c656761746542795369673a207369676e61747572652065787069726564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4644414f3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65644644414f3a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e656443616e6e6f742073706f6e736f72207768656e20746f74616c537570706c792069732030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654644414f3a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f777350656e616c7479207261746520657863656564206d617820313025206c696d697445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734644414f3a3a64656c656761746542795369673a20696e76616c6964206e6f6e636545524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734644414f3a3a7472616e736665723a20616d6f756e74206578636565647320393620626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644644414f3a3a64656c656761746542795369673a20696e76616c6964207369676e6174757265466f725475626544414f3a20494e53554646494349454e545f4f55545055545f464f525f414d4f554e544644414f3a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f77734644414f3a3a62616c616e63654f663a20616d6f756e742065786365656473203936206269747345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220720e64e02b6d80c5b58aee03bb60487a3dec068374027535b184ab307a0f1b3564736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f15760003560e01c806370a082311161019d578063b4b5ea57116100e9578063dd62ed3e116100a2578063f0f442601161007c578063f0f4426014610938578063f1127ed81461095e578063fbce41d4146109b8578063fe0d5313146109de576102f1565b8063dd62ed3e146108e5578063e7a324dc14610913578063ec49e9211461091b576102f1565b8063b4b5ea5714610807578063c3cda5201461082d578063c6f2567014610874578063c9ccbff61461087c578063d6febde81461089f578063d79875eb146108c2576102f1565b8063828f3a9c11610156578063a457c2d711610130578063a457c2d714610781578063a9059cbb146107ad578063ae230878146107d9578063b3ab15fb146107e1576102f1565b8063828f3a9c1461075457806383caf2751461077157806395d89b4114610779576102f1565b806370a0823114610654578063782d6fe11461067a578063791a969c146106c25780637ae2b5c7146106ee5780637ecebe001461071157806380b839ef14610737576102f1565b806336e0004a1161025c578063587cde1e11610215578063626be567116101ef578063626be567146105d3578063677342ce146105db57806369fcd4ac146105f85780636fcfff4514610615576102f1565b8063587cde1e1461057f5780635c19a95c146105a557806361d027b3146105cb576102f1565b806336e0004a146104a957806339509351146104cd5780633fbfd4df146104f95780634a4b674a1461053d57806355dc11241461055a578063570ca73514610577576102f1565b806320606b70116102ae57806320606b701461040057806323b872dd1461040857806324dc3c8e1461043e578063284d30ef14610446578063313ce5671461046e578063322d21001461048c576102f1565b806302b024dc146102f657806306fdde031461032b578063095ea7b3146103a85780630edd2ffc146103e857806318160ddd146103f057806319c13767146103f8575b600080fd5b6103196004803603604081101561030c57600080fd5b5080359060200135610a01565b60408051918252519081900360200190f35b610333610a61565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036d578181015183820152602001610355565b50505050905090810190601f16801561039a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103d4600480360360408110156103be57600080fd5b506001600160a01b038135169060200135610af7565b604080519115158252519081900360200190f35b610319610b14565b610319610b1a565b610319610b20565b610319610b26565b6103d46004803603606081101561041e57600080fd5b506001600160a01b03813581169160208101359091169060400135610b4a565b610319610bd2565b61046c6004803603602081101561045c57600080fd5b50356001600160a01b0316610c18565b005b610476610ccd565b6040805160ff9092168252519081900360200190f35b610319600480360360208110156104a257600080fd5b5035610cd6565b6104b1610dc5565b604080516001600160a01b039092168252519081900360200190f35b6103d4600480360360408110156104e357600080fd5b506001600160a01b038135169060200135610dd4565b61046c600480360360a081101561050f57600080fd5b508035906020810135906001600160a01b036040820135811691606081013582169160809091013516610e22565b61046c6004803603602081101561055357600080fd5b5035610f70565b61046c6004803603602081101561057057600080fd5b503561104b565b6104b161114d565b6104b16004803603602081101561059557600080fd5b50356001600160a01b031661115c565b61046c600480360360208110156105bb57600080fd5b50356001600160a01b0316611177565b6104b1611184565b610319611193565b610319600480360360208110156105f157600080fd5b5035611199565b6103196004803603602081101561060e57600080fd5b50356112e0565b61063b6004803603602081101561062b57600080fd5b50356001600160a01b0316611345565b6040805163ffffffff9092168252519081900360200190f35b6103196004803603602081101561066a57600080fd5b50356001600160a01b031661135d565b6106a66004803603604081101561069057600080fd5b506001600160a01b038135169060200135611378565b604080516001600160601b039092168252519081900360200190f35b61046c600480360360408110156106d857600080fd5b506001600160a01b0381351690602001356115a5565b6103196004803603604081101561070457600080fd5b5080359060200135611762565b6103196004803603602081101561072757600080fd5b50356001600160a01b0316611777565b6103196004803603602081101561074d57600080fd5b5035611789565b6103196004803603602081101561076a57600080fd5b5035611855565b610319611899565b61033361189f565b6103d46004803603604081101561079757600080fd5b506001600160a01b038135169060200135611900565b6103d4600480360360408110156107c357600080fd5b506001600160a01b038135169060200135611968565b61031961197c565b61046c600480360360208110156107f757600080fd5b50356001600160a01b0316611982565b6106a66004803603602081101561081d57600080fd5b50356001600160a01b0316611a37565b61046c600480360360c081101561084357600080fd5b506001600160a01b038135169060208101359060408101359060ff6060820135169060808101359060a00135611aa9565b6104b1611d1b565b61046c6004803603604081101561089257600080fd5b5080359060200135611d2a565b61046c600480360360408110156108b557600080fd5b5080359060200135611f5b565b61046c600480360360408110156108d857600080fd5b5080359060200135612189565b610319600480360360408110156108fb57600080fd5b506001600160a01b03813581169160200135166123ba565b6103196123e5565b61046c6004803603602081101561093157600080fd5b5035612409565b61046c6004803603602081101561094e57600080fd5b50356001600160a01b03166124a3565b6109906004803603604081101561097457600080fd5b5080356001600160a01b0316906020013563ffffffff166125b3565b6040805163ffffffff90931683526001600160601b0390911660208301528051918290030190f35b610319600480360360208110156109ce57600080fd5b50356001600160a01b03166125e8565b61046c600480360360408110156109f457600080fd5b50803590602001356125fa565b600080610a3f610a1d60026067546127fa90919063ffffffff16565b610a3985610a3388671bc16d674ec800006127fa565b90612853565b906128ba565b9050610a5783610a3383670de0b6b3a76400006127fa565b9150505b92915050565b60368054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b5050505050905090565b6000610b0b610b04612917565b848461291b565b50600192915050565b606e5481565b60355490565b60675481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610b57848484612a07565b610bc784610b63612917565b610bc285604051806060016040528060288152602001613c72602891396001600160a01b038a16600090815260346020526040812090610ba1612917565b6001600160a01b031681526020810191909152604001600020549190612b64565b61291b565b5060015b9392505050565b600080610bdd610b1a565b9050610c126f01812f9cf7920e2b66973e2000000000610a33606654610c0c85866127fa90919063ffffffff16565b906127fa565b91505090565b606b546001600160a01b03163314610c6b576040805162461bcd60e51b8152602060048201526011602482015270135d5b1d1a54da59c81c995c5d5a5c9959607a1b604482015290519081900360640190fd5b606b80546001600160a01b038381166001600160a01b0319831617928390556040805192821680845293909116602083015280517f26dac502f033131241df0b0617112156d3651579e8eda0aa6297ab5fa84260fd9281900390910190a15050565b60385460ff1690565b600080610ce1610b1a565b90506000610d12606754610d0c670de0b6b3a7640000610a33866066546127fa90919063ffffffff16565b90612bfb565b9050610d2a670de0b6b3a7640000610a3383806127fa565b90506000610d5e610d57670de0b6b3a7640000610a336002610c0c8a6066546127fa90919063ffffffff16565b8390612bfb565b90506000610d9f610d8c606754610d0c670de0b6b3a7640000610a33896066546127fa90919063ffffffff16565b610a3984670de0b6b3a764000002611199565b606654909150610dbb90610a3383670de0b6b3a76400006127fa565b9695505050505050565b606b546001600160a01b031681565b6000610b0b610de1612917565b84610bc28560346000610df2612917565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612bfb565b600054610100900460ff1680610e3b5750610e3b612c55565b80610e49575060005460ff16155b610e845760405162461bcd60e51b815260040180806020018281038252602e815260200180613bd8602e913960400191505060405180910390fd5b600054610100900460ff16158015610eaf576000805460ff1961ff0019909116610100171660011790555b610ef86040518060400160405280600b81526020016a466f72547562652044414f60a81b815250604051806040016040528060048152602001634644414f60e01b815250612c66565b60668690556067859055606580546001600160a01b038087166001600160a01b0319928316179092556203f480606955606a8054821633179055606b805486841690831617905561012c606e55606d8054928516929091169190911790558015610f68576000805461ff00191690555b505050505050565b606b546001600160a01b03163314610fc3576040805162461bcd60e51b8152602060048201526011602482015270135d5b1d1a54da59c81c995c5d5a5c9959607a1b604482015290519081900360640190fd5b6103e88111156110045760405162461bcd60e51b8152600401808060200182810382526021815260200180613cc26021913960400191505060405180910390fd5b606e805490829055604080518281526020810184905281517fa70d70729f693d280f3488d620abb512226010a7e437ac3649c65f56cdc6a61b929181900390910190a15050565b60008111611091576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b600061109b610b1a565b116110d75760405162461bcd60e51b8152600401808060200182810382526024815260200180613c2d6024913960400191505060405180910390fd5b6068546110e49082612bfb565b6068556110ef612d1c565b606554611107906001600160a01b0316333084612d76565b606854604080513381526020810192909252818101839052517fad01555c5273b89b134ef27e02ab198cdf5f77a288161e5f9505cef416c269319181900360600190a150565b606a546001600160a01b031681565b606f602052600090815260409020546001600160a01b031681565b6111813382612dd6565b50565b606d546001600160a01b031681565b60685481565b6000816111a8575060006112db565b816001600160801b82106111c15760809190911c9060401b5b6801000000000000000082106111dc5760409190911c9060201b5b600160201b82106111f25760209190911c9060101b5b6201000082106112075760109190911c9060081b5b610100821061121b5760089190911c9060041b5b6010821061122e5760049190911c9060021b5b6008821061123a5760011b5b600181858161124557fe5b048201901c9050600181858161125757fe5b048201901c9050600181858161126957fe5b048201901c9050600181858161127b57fe5b048201901c9050600181858161128d57fe5b048201901c9050600181858161129f57fe5b048201901c905060018185816112b157fe5b048201901c905060008185816112c357fe5b0490508082106112d357806112d5565b815b93505050505b919050565b60008061132d606754610d0c61130d671bc16d674ec80000610a33886066546127fa90919063ffffffff16565b610a39670de0b6b3a7640000610a33611324610b1a565b606654906127fa565b9050610bcb670de0b6b3a7640000610a3383866127fa565b60716020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526033602052604090205490565b60004382106113b85760405162461bcd60e51b8152600401808060200182810382526027815260200180613c066027913960400191505060405180910390fd5b6001600160a01b03831660009081526071602052604090205463ffffffff16806113e6576000915050610a5b565b6001600160a01b038416600090815260706020908152604080832063ffffffff600019860181168552925290912054168310611462576001600160a01b03841660009081526070602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050610a5b565b6001600160a01b038416600090815260706020908152604080832083805290915290205463ffffffff1683101561149d576000915050610a5b565b600060001982015b8163ffffffff168163ffffffff16111561156057600282820363ffffffff160481036114cf6139f5565b506001600160a01b038716600090815260706020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b0316918101919091529087141561153b57602001519450610a5b9350505050565b805163ffffffff1687111561155257819350611559565b6001820392505b50506114a5565b506001600160a01b038516600090815260706020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b606b546001600160a01b031633146115f8576040805162461bcd60e51b8152602060048201526011602482015270135d5b1d1a54da59c81c995c5d5a5c9959607a1b604482015290519081900360640190fd5b60008111801561160f575061160b610bd2565b8111155b611651576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b6001600160a01b03821661169e576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6068546116ab90826128ba565b6068556116b6612d1c565b6000606654116116fd576040805162461bcd60e51b815260206004820152600d60248201526c496e76616c696420736c6f706560981b604482015290519081900360640190fd5b606554611714906001600160a01b03168383612e86565b606854604080519182526001600160a01b0384166020830152818101839052517fc3f67c8c2f6072cf4cb739c8819c60617fb5023a3a7705627de91c838acdd48c9181900360600190a15050565b60008183116117715782610bcb565b50919050565b60726020526000908152604090205481565b600080611794610b1a565b905060006117bf606754610d0c670de0b6b3a7640000610a33866066546127fa90919063ffffffff16565b905060006117d9670de0b6b3a7640000610a3384806127fa565b9050600061180d611806670de0b6b3a7640000610a336002610c0c8b6066546127fa90919063ffffffff16565b83906128ba565b9050600061182e61182783670de0b6b3a764000002611199565b85906128ba565b60665490915061184a90610a3383670de0b6b3a76400006127fa565b979650505050505050565b60008061132d606754610d0c611882671bc16d674ec80000610a33886066546127fa90919063ffffffff16565b610d0c670de0b6b3a7640000610a33611324610b1a565b60665481565b60378054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610aed5780601f10610ac257610100808354040283529160200191610aed565b6000610b0b61190d612917565b84610bc285604051806060016040528060258152602001613e5d6025913960346000611937612917565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612b64565b6000610b0b611975612917565b8484612a07565b60695481565b606b546001600160a01b031633146119d5576040805162461bcd60e51b8152602060048201526011602482015270135d5b1d1a54da59c81c995c5d5a5c9959607a1b604482015290519081900360640190fd5b606a80546001600160a01b038381166001600160a01b0319831617928390556040805192821680845293909116602083015280517fd58299b712891143e76310d5e664c4203c940a67db37cf856bdaa3c5c76a802c9281900390910190a15050565b6001600160a01b03811660009081526071602052604081205463ffffffff1680611a62576000610bcb565b6001600160a01b038316600090815260706020908152604080832063ffffffff60001986011684529091529020546001600160601b03600160201b90910416915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611ad4610a61565b80519060200120611ae3612ed8565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a9052825180850390910181526101408401835280519085012061190160f01b6101608501526101628401829052610182808501829052835180860390910181526101a285018085528151918701919091206000918290526101c2860180865281905260ff8b166101e287015261020286018a90526102228601899052935192965090949293909260019261024280840193601f198301929081900390910190855afa158015611c16573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611c685760405162461bcd60e51b8152600401808060200182810382526026815260200180613dbf6026913960400191505060405180910390fd5b6001600160a01b03811660009081526072602052604090208054600181019091558914611cc65760405162461bcd60e51b8152600401808060200182810382526022815260200180613d296022913960400191505060405180910390fd5b87421115611d055760405162461bcd60e51b8152600401808060200182810382526026815260200180613b586026913960400191505060405180910390fd5b611d0f818b612dd6565b50505050505050505050565b6065546001600160a01b031681565b60008211611d73576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a590819185bd05b5bdd5b9d607a1b604482015290519081900360640190fd5b6000611d7e83611789565b905080821015611dbf5760405162461bcd60e51b815260040180806020018281038252602a815260200180613de5602a913960400191505060405180910390fd5b60008111611e06576040805162461bcd60e51b815260206004820152600f60248201526e16995c9bc81193d488185b5bdd5b9d608a1b604482015290519081900360640190fd5b611e0f3361135d565b811115611e5c576040805162461bcd60e51b8152602060048201526016602482015275125b9cdd59999a58da595b9d0819185bd05b5bdd5b9d60521b604482015290519081900360640190fd5b6000611e683383612edc565b611e7460685485611762565b606854909450611e8490856128ba565b606855606954336000908152606c602052604090205401421015611ee957611ebd612710610a33606e54876127fa90919063ffffffff16565b9050611ec984826128ba565b606d54606554919550611ee9916001600160a01b03908116911683612e86565b611ef1612d1c565b606554611f08906001600160a01b03163386612e86565b60408051338152602081018690528082018390526060810184905242608082015290517f490fdc1c23c0f3a84bf80a0384eaadcb9188c9ef71b9430da391a0e4c4c39bf69181900360a00190a150505050565b60008211611fa1576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b606554604080516370a0823160e01b8152336004820152905184926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611feb57600080fd5b505afa158015611fff573d6000803e3d6000fd5b505050506040513d602081101561201557600080fd5b5051101561205f576040805162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015290519081900360640190fd5b600061206a83610cd6565b9050818110156120ab5760405162461bcd60e51b815260040180806020018281038252602b815260200180613ac3602b913960400191505060405180910390fd5b600081116120f2576040805162461bcd60e51b815260206004820152600f60248201526e16995c9bc8111053c8185b5bdd5b9d608a1b604482015290519081900360640190fd5b6120fc3382612fd8565b6068546121099084612bfb565b606855336000908152606c60205260409020429055612126612d1c565b60655461213e906001600160a01b0316333086612d76565b604080513381526020810185905280820183905242606082015290517fedba86fd2b22962d534e70ad9b0ff8730de46f636146f2bab6a72cbb1ebbcc539181900360800190a1505050565b600082116121d2576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a590819185bd05b5bdd5b9d607a1b604482015290519081900360640190fd5b6121db3361135d565b821115612228576040805162461bcd60e51b8152602060048201526016602482015275125b9cdd59999a58da595b9d0819185bd05b5bdd5b9d60521b604482015290519081900360640190fd5b6000612233836112e0565b9050818110156122745760405162461bcd60e51b815260040180806020018281038252602a815260200180613de5602a913960400191505060405180910390fd5b600081116122bb576040805162461bcd60e51b815260206004820152600f60248201526e16995c9bc81193d488185b5bdd5b9d608a1b604482015290519081900360640190fd5b60006122c73385612edc565b6122d360685483611762565b6068549092506122e390836128ba565b606855606954336000908152606c6020526040902054014210156123485761231c612710610a33606e54856127fa90919063ffffffff16565b905061232882826128ba565b606d54606554919350612348916001600160a01b03908116911683612e86565b612350612d1c565b606554612367906001600160a01b03163384612e86565b60408051338152602081018490528082018390526060810186905242608082015290517f490fdc1c23c0f3a84bf80a0384eaadcb9188c9ef71b9430da391a0e4c4c39bf69181900360a00190a150505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b606a546001600160a01b0316331461245c576040805162461bcd60e51b815260206004820152601160248201527013dc195c985d1bdc881c995c5d5a5c9959607a1b604482015290519081900360640190fd5b6069805490829055604080518281526020810184905281517f2961c10c4cee27c812c7179582cfb6bdefad5c746ccf008ba607e1b11b358f41929181900390910190a15050565b606b546001600160a01b031633146124f6576040805162461bcd60e51b8152602060048201526011602482015270135d5b1d1a54da59c81c995c5d5a5c9959607a1b604482015290519081900360640190fd5b6001600160a01b038116612551576040805162461bcd60e51b815260206004820152601e60248201527f74726561737572792073686f756c64206e6f7420616464726573732830290000604482015290519081900360640190fd5b606d80546001600160a01b038381166001600160a01b0319831617928390556040805192821680845293909116602083015280517f8c3aa5f43a388513435861bf27dfad7829cd248696fed367c62d441f629544969281900390910190a15050565b607060209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b606c6020526000908152604090205481565b60008211612643576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a590819185bd05b5bdd5b9d607a1b604482015290519081900360640190fd5b600061264e83611855565b9050818111156126a5576040805162461bcd60e51b815260206004820152601c60248201527f466f725475626544414f3a20494e5055545f464f525f414d4f554e5400000000604482015290519081900360640190fd5b606554604080516370a0823160e01b8152336004820152905183926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156126ef57600080fd5b505afa158015612703573d6000803e3d6000fd5b505050506040513d602081101561271957600080fd5b50511015612763576040805162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015290519081900360640190fd5b61276d3384612fd8565b60685461277a9082612bfb565b606855336000908152606c60205260409020429055612797612d1c565b6065546127af906001600160a01b0316333084612d76565b604080513381526020810183905280820185905242606082015290517fedba86fd2b22962d534e70ad9b0ff8730de46f636146f2bab6a72cbb1ebbcc539181900360800190a1505050565b60008261280957506000610a5b565b8282028284828161281657fe5b0414610bcb5760405162461bcd60e51b8152600401808060200182810382526021815260200180613c516021913960400191505060405180910390fd5b60008082116128a9576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816128b257fe5b049392505050565b600082821115612911576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3390565b6001600160a01b0383166129605760405162461bcd60e51b8152600401808060200182810382526024815260200180613d4b6024913960400191505060405180910390fd5b6001600160a01b0382166129a55760405162461bcd60e51b8152600401808060200182810382526022815260200180613b106022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316612a4c5760405162461bcd60e51b8152600401808060200182810382526025815260200180613d046025913960400191505060405180910390fd5b6001600160a01b038216612a915760405162461bcd60e51b8152600401808060200182810382526023815260200180613aa06023913960400191505060405180910390fd5b612a9c8383836130ca565b612ad981604051806060016040528060268152602001613b32602691396001600160a01b0386166000908152603360205260409020549190612b64565b6001600160a01b038085166000908152603360205260408082209390935590841681522054612b089082612bfb565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115612bf35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612bb8578181015183820152602001612ba0565b50505050905090810190601f168015612be55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610bcb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000612c6030613125565b15905090565b600054610100900460ff1680612c7f5750612c7f612c55565b80612c8d575060005460ff16155b612cc85760405162461bcd60e51b815260040180806020018281038252602e815260200180613bd8602e913960400191505060405180910390fd5b600054610100900460ff16158015612cf3576000805460ff1961ff0019909116610100171660011790555b612cfb61312b565b612d0583836131cc565b8015612d17576000805461ff00191690555b505050565b606654606854612d3390612d2e610b1a565b610a01565b606681905560408051838152602081019290925280517fac5d95a998c1445e84cf2f50e353b0c1f9294b7153691aaf9c3b64e4ded02fa39281900390910190a150565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612dd09085906132a4565b50505050565b6001600160a01b038083166000908152606f602052604081205490911690612e1e612e008561135d565b604051806060016040528060278152602001613e3660279139613355565b6001600160a01b038581166000818152606f602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612dd08284836133b2565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612d179084906132a4565b4690565b6001600160a01b038216612f215760405162461bcd60e51b8152600401808060200182810382526021815260200180613ce36021913960400191505060405180910390fd5b612f2d826000836130ca565b612f6a81604051806060016040528060228152602001613aee602291396001600160a01b0385166000908152603360205260409020549190612b64565b6001600160a01b038316600090815260336020526040902055603554612f9090826128ba565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038216613033576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61303f600083836130ca565b60355461304c9082612bfb565b6035556001600160a01b0382166000908152603360205260409020546130729082612bfb565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038084166000908152606f6020908152604080832054868516845292819020548151606081019092526026808352612d17959485169491909116926131209287929091613d6f90830139613355565b6133b2565b3b151590565b600054610100900460ff16806131445750613144612c55565b80613152575060005460ff16155b61318d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613bd8602e913960400191505060405180910390fd5b600054610100900460ff161580156131b8576000805460ff1961ff0019909116610100171660011790555b8015611181576000805461ff001916905550565b600054610100900460ff16806131e557506131e5612c55565b806131f3575060005460ff16155b61322e5760405162461bcd60e51b815260040180806020018281038252602e815260200180613bd8602e913960400191505060405180910390fd5b600054610100900460ff16158015613259576000805460ff1961ff0019909116610100171660011790555b825161326c906036906020860190613a0c565b508151613280906037906020850190613a0c565b506038805460ff191660121790558015612d17576000805461ff0019169055505050565b60606132f9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135449092919063ffffffff16565b805190915015612d175780806020019051602081101561331857600080fd5b5051612d175760405162461bcd60e51b815260040180806020018281038252602a815260200180613d95602a913960400191505060405180910390fd5b600081600160601b84106133aa5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bb8578181015183820152602001612ba0565b509192915050565b816001600160a01b0316836001600160a01b0316141580156133dd57506000816001600160601b0316115b15612d17576001600160a01b03831615613495576001600160a01b03831660009081526071602052604081205463ffffffff16908161341d57600061345c565b6001600160a01b0385166000908152607060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b905060006134838285604051806060016040528060288152602001613c9a6028913961355b565b9050613491868484846135c0565b5050505b6001600160a01b03821615612d17576001600160a01b03821660009081526071602052604081205463ffffffff1690816134d057600061350f565b6001600160a01b0384166000908152607060209081526040808320600019860163ffffffff168452909152902054600160201b90046001600160601b03165b905060006135368285604051806060016040528060278152602001613e0f6027913961377f565b9050610f68858484846135c0565b606061355384846000856137e9565b949350505050565b6000836001600160601b0316836001600160601b031611158290612bf35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bb8578181015183820152602001612ba0565b60006135e443604051806060016040528060348152602001613ba46034913961393a565b905060008463ffffffff1611801561362d57506001600160a01b038516600090815260706020908152604080832063ffffffff6000198901811685529252909120548282169116145b1561368c576001600160a01b0385166000908152607060209081526040808320600019880163ffffffff168452909152902080546fffffffffffffffffffffffff000000001916600160201b6001600160601b0385160217905561372b565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000818152607083528781208c871682528352878120965187549451909516600160201b026fffffffffffffffffffffffff000000001995871663ffffffff19958616179590951694909417909555938252607190935292909220805460018801909316929091169190911790555b604080516001600160601b0380861682528416602082015281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b6000838301826001600160601b0380871690831610156137e05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bb8578181015183820152602001612ba0565b50949350505050565b60608247101561382a5760405162461bcd60e51b8152600401808060200182810382526026815260200180613b7e6026913960400191505060405180910390fd5b61383385613125565b613884576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106138c35780518252601f1990920191602091820191016138a4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613925576040519150601f19603f3d011682016040523d82523d6000602084013e61392a565b606091505b509150915061184a82828661398f565b600081600160201b84106133aa5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bb8578181015183820152602001612ba0565b6060831561399e575081610bcb565b8251156139ae5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315612bb8578181015183820152602001612ba0565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a4d57805160ff1916838001178555613a7a565b82800160010185558215613a7a579182015b82811115613a7a578251825591602001919060010190613a5f565b50613a86929150613a8a565b5090565b5b80821115613a865760008155600101613a8b56fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373466f725475626544414f3a20494e53554646494349454e545f4f55545055545f4644414f5f414d4f554e5445524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654644414f3a3a64656c656761746542795369673a207369676e61747572652065787069726564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4644414f3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65644644414f3a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e656443616e6e6f742073706f6e736f72207768656e20746f74616c537570706c792069732030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654644414f3a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f777350656e616c7479207261746520657863656564206d617820313025206c696d697445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734644414f3a3a64656c656761746542795369673a20696e76616c6964206e6f6e636545524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734644414f3a3a7472616e736665723a20616d6f756e74206578636565647320393620626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644644414f3a3a64656c656761746542795369673a20696e76616c6964207369676e6174757265466f725475626544414f3a20494e53554646494349454e545f4f55545055545f464f525f414d4f554e544644414f3a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f77734644414f3a3a62616c616e63654f663a20616d6f756e742065786365656473203936206269747345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220720e64e02b6d80c5b58aee03bb60487a3dec068374027535b184ab307a0f1b3564736f6c634300060c0033
Deployed Bytecode Sourcemap
37721:20052:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47917:275;;;;;;;;;;;;;;;;-1:-1:-1;47917:275:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22618:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24764:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24764:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;38189:22;;;:::i;23717:108::-;;;:::i;37935:24::-;;;:::i;38858:122::-;;;:::i;25415:321::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25415:321:0;;;;;;;;;;;;;;;;;:::i;48202:165::-;;;:::i;49079:198::-;;;;;;;;;;;;;;;;-1:-1:-1;49079:198:0;-1:-1:-1;;;;;49079:198:0;;:::i;:::-;;23561:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46145:552;;;;;;;;;;;;;;;;-1:-1:-1;46145:552:0;;:::i;38067:23::-;;;:::i;:::-;;;;-1:-1:-1;;;;;38067:23:0;;;;;;;;;;;;;;26145:218;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26145:218:0;;;;;;;;:::i;40720:495::-;;;;;;;;;;;;;;;;-1:-1:-1;40720:495:0;;;;;;;;-1:-1:-1;;;;;40720:495:0;;;;;;;;;;;;;;;;;;;;;:::i;48584:277::-;;;;;;;;;;;;;;;;-1:-1:-1;48584:277:0;;:::i;45012:446::-;;;;;;;;;;;;;;;;-1:-1:-1;45012:446:0;;:::i;38035:23::-;;;:::i;38308:45::-;;;;;;;;;;;;;;;;-1:-1:-1;38308:45:0;-1:-1:-1;;;;;38308:45:0;;:::i;51257:104::-;;;;;;;;;;;;;;;;-1:-1:-1;51257:104:0;-1:-1:-1;;;;;51257:104:0;;:::i;38157:23::-;;;:::i;37968:25::-;;;:::i;50035:1074::-;;;;;;;;;;;;;;;;-1:-1:-1;50035:1074:0;;:::i;46705:370::-;;;;;;;;;;;;;;;;-1:-1:-1;46705:370:0;;:::i;38736:49::-;;;;;;;;;;;;;;;;-1:-1:-1;38736:49:0;-1:-1:-1;;;;;38736:49:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;23888:127;;;;;;;;;;;;;;;;-1:-1:-1;23888:127:0;-1:-1:-1;;;;;23888:127:0;;:::i;53442:1220::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53442:1220:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;53442:1220:0;;;;;;;;;;;;;;45466:496;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45466:496:0;;;;;;;;:::i;49570:104::-;;;;;;;;;;;;;;;;-1:-1:-1;49570:104:0;;;;;;;:::i;39272:39::-;;;;;;;;;;;;;;;;-1:-1:-1;39272:39:0;-1:-1:-1;;;;;39272:39:0;;:::i;47443:464::-;;;;;;;;;;;;;;;;-1:-1:-1;47443:464:0;;:::i;47085:346::-;;;;;;;;;;;;;;;;-1:-1:-1;47085:346:0;;:::i;37906:20::-;;;:::i;22828:95::-;;;:::i;26866:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26866:269:0;;;;;;;;:::i;24228:175::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24228:175:0;;;;;;;;:::i;38002:24::-;;;:::i;48871:198::-;;;;;;;;;;;;;;;;-1:-1:-1;48871:198:0;-1:-1:-1;;;;;48871:198:0;;:::i;52789:222::-;;;;;;;;;;;;;;;;-1:-1:-1;52789:222:0;-1:-1:-1;;;;;52789:222:0;;:::i;51795:793::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51795:793:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37869:28::-;;;:::i;43956:1046::-;;;;;;;;;;;;;;;;-1:-1:-1;43956:1046:0;;;;;;;:::i;41223:865::-;;;;;;;;;;;;;;;;-1:-1:-1;41223:865:0;;;;;;;:::i;42911:1035::-;;;;;;;;;;;;;;;;-1:-1:-1;42911:1035:0;;;;;;;:::i;24466:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24466:151:0;;;;;;;;;;:::i;39074:117::-;;;:::i;48377:199::-;;;;;;;;;;;;;;;;-1:-1:-1;48377:199:0;;:::i;49285:277::-;;;;;;;;;;;;;;;;-1:-1:-1;49285:277:0;-1:-1:-1;;;;;49285:277:0;;:::i;38597:70::-;;;;;;;;;;;;;;;;-1:-1:-1;38597:70:0;;-1:-1:-1;;;;;38597:70:0;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;38597:70:0;;;;;;;;;;;;;;;;38099:49;;;;;;;;;;;;;;;;-1:-1:-1;38099:49:0;-1:-1:-1;;;;;38099:49:0;;:::i;42096:807::-;;;;;;;;;;;;;;;;-1:-1:-1;42096:807:0;;;;;;;:::i;47917:275::-;48024:7;48049:16;48081:55;48119:16;48133:1;48119:9;;:13;;:16;;;;:::i;:::-;48081:33;48107:6;48081:21;:11;48097:4;48081:15;:21::i;:::-;:25;;:33::i;:::-;:37;;:55::i;:::-;48049:87;-1:-1:-1;48154:30:0;48177:6;48154:18;48049:87;48167:4;48154:12;:18::i;:30::-;48147:37;;;47917:275;;;;;:::o;22618:91::-;22696:5;22689:12;;;;;;;;-1:-1:-1;;22689:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22663:13;;22689:12;;22696:5;;22689:12;;22696:5;22689:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22618:91;:::o;24764:169::-;24847:4;24864:39;24873:12;:10;:12::i;:::-;24887:7;24896:6;24864:8;:39::i;:::-;-1:-1:-1;24921:4:0;24764:169;;;;:::o;38189:22::-;;;;:::o;23717:108::-;23805:12;;23717:108;:::o;37935:24::-;;;;:::o;38858:122::-;38900:80;38858:122;:::o;25415:321::-;25521:4;25538:36;25548:6;25556:9;25567:6;25538:9;:36::i;:::-;25585:121;25594:6;25602:12;:10;:12::i;:::-;25616:89;25654:6;25616:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25616:19:0;;;;;;:11;:19;;;;;;25636:12;:10;:12::i;:::-;-1:-1:-1;;;;;25616:33:0;;;;;;;;;;;;-1:-1:-1;25616:33:0;;;:89;:37;:89::i;:::-;25585:8;:121::i;:::-;-1:-1:-1;25724:4:0;25415:321;;;;;;:::o;48202:165::-;48252:7;48272:14;48289:13;:11;:13::i;:::-;48272:30;;48320:39;48354:4;48320:29;48343:5;;48320:18;48331:6;48320;:10;;:18;;;;:::i;:::-;:22;;:29::i;:39::-;48313:46;;;48202:165;:::o;49079:198::-;40662:8;;-1:-1:-1;;;;;40662:8:0;40648:10;:22;40640:52;;;;;-1:-1:-1;;;40640:52:0;;;;;;;;;;;;-1:-1:-1;;;40640:52:0;;;;;;;;;;;;;;;49174:8:::1;::::0;;-1:-1:-1;;;;;49193:20:0;;::::1;-1:-1:-1::0;;;;;;49193:20:0;::::1;;::::0;;;;49231:38:::1;::::0;;49174:8;;::::1;49231:38:::0;;;49260:8;;;::::1;49231:38;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;40703:1;49079:198:::0;:::o;23561:91::-;23635:9;;;;23561:91;:::o;46145:552::-;46243:17;46278:14;46295:13;:11;:13::i;:::-;46278:30;;46321:9;46333:42;46365:9;;46333:27;46355:4;46333:17;46343:6;46333:5;;:9;;:17;;;;:::i;:27::-;:31;;:42::i;:::-;46321:54;-1:-1:-1;46390:18:0;46403:4;46390:8;46321:54;;46390:5;:8::i;:18::-;46386:22;;46419:15;46444:42;46450:35;46480:4;46450:25;46473:1;46450:18;46460:7;46450:5;;:9;;:18;;;;:::i;:35::-;46444:1;;:5;:42::i;:::-;46419:68;;46498:9;46523:119;46585:42;46617:9;;46585:27;46607:4;46585:17;46595:6;46585:5;;:9;;:17;;;;:::i;:42::-;46531:30;46544:8;46555:4;46544:15;46531:4;:30::i;46523:119::-;46683:5;;46498:144;;-1:-1:-1;46667:22:0;;:11;46498:144;46673:4;46667:5;:11::i;:22::-;46655:34;46145:552;-1:-1:-1;;;;;;46145:552:0:o;38067:23::-;;;-1:-1:-1;;;;;38067:23:0;;:::o;26145:218::-;26233:4;26250:83;26259:12;:10;:12::i;:::-;26273:7;26282:50;26321:10;26282:11;:25;26294:12;:10;:12::i;:::-;-1:-1:-1;;;;;26282:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;26282:25:0;;;:34;;;;;;;;;;;:38;:50::i;40720:495::-;8442:13;;;;;;;;:33;;;8459:16;:14;:16::i;:::-;8442:50;;;-1:-1:-1;8480:12:0;;;;8479:13;8442:50;8434:109;;;;-1:-1:-1;;;8434:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8556:19;8579:13;;;;;;8578:14;8603:101;;;;8638:13;:20;;-1:-1:-1;;;;8638:20:0;;;;;8673:19;8654:4;8673:19;;;8603:101;40920:35:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;40920:35:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;40920:35:0::1;;::::0;:12:::1;:35::i;:::-;40966:5;:14:::0;;;40991:9:::1;:22:::0;;;41024:13:::1;:30:::0;;-1:-1:-1;;;;;41024:30:0;;::::1;-1:-1:-1::0;;;;;;41024:30:0;;::::1;;::::0;;;41077:6:::1;41065:9;:18:::0;41094:8:::1;:21:::0;;;::::1;41105:10;41094:21;::::0;;41126:8:::1;:20:::0;;;;::::1;::::0;;::::1;;::::0;;41167:3:::1;41157:7;:13:::0;41187:8:::1;:20:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;8730:68;;;;8781:5;8765:21;;-1:-1:-1;;8765:21:0;;;8730:68;40720:495;;;;;;:::o;48584:277::-;40662:8;;-1:-1:-1;;;;;40662:8:0;40648:10;:22;40640:52;;;;;-1:-1:-1;;;40640:52:0;;;;;;;;;;;;-1:-1:-1;;;40640:52:0;;;;;;;;;;;;;;;48681:4:::1;48666:11;:19;;48658:65;;;;-1:-1:-1::0;;;48658:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48757:7;::::0;;48775:21;;;;48814:39:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;40703:1;48584:277:::0;:::o;45012:446::-;45084:1;45075:6;:10;45067:37;;;;;-1:-1:-1;;;45067:37:0;;;;;;;;;;;;-1:-1:-1;;;45067:37:0;;;;;;;;;;;;;;;45139:1;45123:13;:11;:13::i;:::-;:17;45115:66;;;;-1:-1:-1;;;45115:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45207:10;;:22;;45222:6;45207:14;:22::i;:::-;45194:10;:35;45240:6;:4;:6::i;:::-;45275:13;;45257:134;;-1:-1:-1;;;;;45275:13:0;45321:10;45354:4;45374:6;45257:49;:134::i;:::-;45431:10;;45409:41;;;45419:10;45409:41;;;;;;;;;;;;;;;;;;;;;;;;;45012:446;:::o;38035:23::-;;;-1:-1:-1;;;;;38035:23:0;;:::o;38308:45::-;;;;;;;;;;;;-1:-1:-1;;;;;38308:45:0;;:::o;51257:104::-;51321:32;51331:10;51343:9;51321;:32::i;:::-;51257:104;:::o;38157:23::-;;;-1:-1:-1;;;;;38157:23:0;;:::o;37968:25::-;;;;:::o;50035:1074::-;50078:4;50099:6;50095:20;;-1:-1:-1;50114:1:0;50107:8;;50095:20;50136:1;50157;-1:-1:-1;;;50175:41:0;;50171:107;;50240:3;50233:10;;;;;50264:2;50258:8;50171:107;50300:19;50294:2;:25;50290:90;;50343:2;50336:9;;;;;50366:2;50360:8;50290:90;-1:-1:-1;;;50394:2:0;:17;50390:82;;50435:2;50428:9;;;;;50458:2;50452:8;50390:82;50492:7;50486:2;:13;50482:77;;50523:2;50516:9;;;;;50546:1;50540:7;50482:77;50579:5;50573:2;:11;50569:74;;50608:1;50601:8;;;;;50630:1;50624:7;50569:74;50663:4;50657:2;:10;50653:73;;50691:1;50684:8;;;;;50713:1;50707:7;50653:73;50746:3;50740:2;:9;50736:49;;50772:1;50766:7;50736:49;50816:1;50810;50806;:5;;;;;;50802:1;:9;50801:16;;50797:20;;50847:1;50841;50837;:5;;;;;;50833:1;:9;50832:16;;50828:20;;50878:1;50872;50868;:5;;;;;;50864:1;:9;50863:16;;50859:20;;50909:1;50903;50899;:5;;;;;;50895:1;:9;50894:16;;50890:20;;50940:1;50934;50930;:5;;;;;;50926:1;:9;50925:16;;50921:20;;50971:1;50965;50961;:5;;;;;;50957:1;:9;50956:16;;50952:20;;51002:1;50996;50992;:5;;;;;;50988:1;:9;50987:16;;50983:20;;51051:7;51065:1;51061;:5;;;;;;51051:15;;51089:2;51085:1;:6;:15;;51098:2;51085:15;;;51094:1;51085:15;51077:24;;;;;50035:1074;;;;:::o;46705:370::-;46803:14;46835:9;46860:159;47009:9;;46860:126;46953:32;46980:4;46953:22;46963:11;46953:5;;:9;;:22;;;;:::i;:32::-;46860:70;46925:4;46860:42;46888:13;:11;:13::i;:::-;46860:5;;;:27;:42::i;:159::-;46835:184;-1:-1:-1;47039:28:0;47062:4;47039:18;46835:184;47045:11;47039:5;:18::i;38736:49::-;;;;;;;;;;;;;;;:::o;23888:127::-;-1:-1:-1;;;;;23989:18:0;23962:7;23989:18;;;:9;:18;;;;;;;23888:127::o;53442:1220::-;53523:6;53564:12;53550:11;:26;53542:78;;;;-1:-1:-1;;;53542:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53655:23:0;;53633:19;53655:23;;;:14;:23;;;;;;;;53693:17;53689:58;;53734:1;53727:8;;;;;53689:58;-1:-1:-1;;;;;53807:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;53828:16:0;;53807:38;;;;;;;;;:48;;:63;-1:-1:-1;53803:147:0;;-1:-1:-1;;;;;53894:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;53915:16:0;;;;53894:38;;;;;;;;:44;-1:-1:-1;;;53894:44:0;;-1:-1:-1;;;;;53894:44:0;;-1:-1:-1;53887:51:0;;53803:147;-1:-1:-1;;;;;54011:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;54007:88:0;;;54082:1;54075:8;;;;;54007:88;54107:12;-1:-1:-1;;54149:16:0;;54176:428;54191:5;54183:13;;:5;:13;;;54176:428;;;54255:1;54238:13;;;54237:19;;;54229:27;;54298:20;;:::i;:::-;-1:-1:-1;;;;;;54321:20:0;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;54298:51;;;;;;;;;;;;;;;-1:-1:-1;;;54298:51:0;;;-1:-1:-1;;;;;54298:51:0;;;;;;;;;54368:27;;54364:229;;;54423:8;;;;-1:-1:-1;54416:15:0;;-1:-1:-1;;;;54416:15:0;54364:229;54457:12;;:26;;;-1:-1:-1;54453:140:0;;;54512:6;54504:14;;54453:140;;;54576:1;54567:6;:10;54559:18;;54453:140;54176:428;;;;;-1:-1:-1;;;;;;54621:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;-1:-1:-1;;;;;;;;54621:33:0;;;;;-1:-1:-1;;53442:1220:0;;;;:::o;45466:496::-;40662:8;;-1:-1:-1;;;;;40662:8:0;40648:10;:22;40640:52;;;;;-1:-1:-1;;;40640:52:0;;;;;;;;;;;;-1:-1:-1;;;40640:52:0;;;;;;;;;;;;;;;45594:1:::1;45585:6;:10;:43;;;;;45609:19;:17;:19::i;:::-;45599:6;:29;;45585:43;45577:70;;;::::0;;-1:-1:-1;;;45577:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45577:70:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;45666:23:0;::::1;45658:51;;;::::0;;-1:-1:-1;;;45658:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45658:51:0;;;;;;;;;;;;;::::1;;45735:10;::::0;:22:::1;::::0;45750:6;45735:14:::1;:22::i;:::-;45722:10;:35:::0;45768:6:::1;:4;:6::i;:::-;45801:1;45793:5;;:9;45785:35;;;::::0;;-1:-1:-1;;;45785:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45785:35:0;;;;;;;;;;;;;::::1;;45849:13;::::0;45831:64:::1;::::0;-1:-1:-1;;;;;45849:13:0::1;45877:9:::0;45888:6;45831:45:::1;:64::i;:::-;45924:10;::::0;45913:41:::1;::::0;;;;;-1:-1:-1;;;;;45913:41:0;::::1;;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;::::1;45466:496:::0;;:::o;49570:104::-;49626:7;49657:1;49653;:5;:13;;49665:1;49653:13;;;-1:-1:-1;49661:1:0;49646:20;-1:-1:-1;49570:104:0:o;39272:39::-;;;;;;;;;;;;;:::o;47443:464::-;47542:17;47577:14;47594:13;:11;:13::i;:::-;47577:30;;47620:9;47632:42;47664:9;;47632:27;47654:4;47632:17;47642:6;47632:5;;:9;;:17;;;;:::i;:42::-;47620:54;-1:-1:-1;47685:9:0;47697:18;47710:4;47697:8;47620:54;;47697:5;:8::i;:18::-;47685:30;;47726:15;47751:42;47757:35;47787:4;47757:25;47780:1;47757:18;47767:7;47757:5;;:9;;:18;;;;:::i;:35::-;47751:1;;:5;:42::i;:::-;47726:68;;47805:9;47817:37;47823:30;47836:8;47847:4;47836:15;47823:4;:30::i;:::-;47817:1;;:5;:37::i;:::-;47893:5;;47805:49;;-1:-1:-1;47877:22:0;;:11;47805:49;47883:4;47877:5;:11::i;:22::-;47865:34;47443:464;-1:-1:-1;;;;;;;47443:464:0:o;47085:346::-;47158:14;47185:9;47210:162;47362:9;;47210:129;47303:35;47333:4;47303:25;47313:14;47303:5;;:9;;:25;;;;:::i;:35::-;47210:70;47275:4;47210:42;47238:13;:11;:13::i;37906:20::-;;;;:::o;22828:95::-;22908:7;22901:14;;;;;;;;-1:-1:-1;;22901:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22875:13;;22901:14;;22908:7;;22901:14;;22908:7;22901:14;;;;;;;;;;;;;;;;;;;;;;;;26866:269;26959:4;26976:129;26985:12;:10;:12::i;:::-;26999:7;27008:96;27047:15;27008:96;;;;;;;;;;;;;;;;;:11;:25;27020:12;:10;:12::i;:::-;-1:-1:-1;;;;;27008:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;27008:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;24228:175::-;24314:4;24331:42;24341:12;:10;:12::i;:::-;24355:9;24366:6;24331:9;:42::i;38002:24::-;;;;:::o;48871:198::-;40662:8;;-1:-1:-1;;;;;40662:8:0;40648:10;:22;40640:52;;;;;-1:-1:-1;;;40640:52:0;;;;;;;;;;;;-1:-1:-1;;;40640:52:0;;;;;;;;;;;;;;;48966:8:::1;::::0;;-1:-1:-1;;;;;48985:20:0;;::::1;-1:-1:-1::0;;;;;;48985:20:0;::::1;;::::0;;;;49023:38:::1;::::0;;48966:8;;::::1;49023:38:::0;;;49052:8;;;::::1;49023:38;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;40703:1;48871:198:::0;:::o;52789:222::-;-1:-1:-1;;;;;52895:23:0;;52854:6;52895:23;;;:14;:23;;;;;;;;52936:16;:67;;53002:1;52936:67;;;-1:-1:-1;;;;;52955:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;52976:16:0;;52955:38;;;;;;;;:44;-1:-1:-1;;;;;;;;52955:44:0;;;;52929:74;;;52789:222;;;:::o;51795:793::-;51913:23;38900:80;51993:6;:4;:6::i;:::-;51977:24;;;;;;52003:12;:10;:12::i;:::-;51949:82;;;;;;;;;;;;;;;;;;;;;;;;;52025:4;51949:82;;;;;;;;;;;;;;;;;;;;;;;51939:93;;;;;;39120:71;52074:57;;;;-1:-1:-1;;;;;52074:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52064:68;;;;;;-1:-1:-1;;;52170:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52160:68;;;;;;;;;-1:-1:-1;52259:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51939:93;;-1:-1:-1;52064:68:0;;52160;;-1:-1:-1;;52259:26:0;;;;;;;-1:-1:-1;;52259:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52259:26:0;;-1:-1:-1;;52259:26:0;;;-1:-1:-1;;;;;;;52304:23:0;;52296:74;;;;-1:-1:-1;;;52296:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52398:17:0;;;;;;:6;:17;;;;;:19;;;;;;;;52389:28;;52381:75;;;;-1:-1:-1;;;52381:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52482:6;52475:3;:13;;52467:64;;;;-1:-1:-1;;;52467:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52549:31;52559:9;52570;52549;:31::i;:::-;52542:38;;;;51795:793;;;;;;:::o;37869:28::-;;;-1:-1:-1;;;;;37869:28:0;;:::o;43956:1046::-;44052:1;44043:6;:10;44035:40;;;;;-1:-1:-1;;;44035:40:0;;;;;;;;;;;;-1:-1:-1;;;44035:40:0;;;;;;;;;;;;;;;44088:17;44108:32;44133:6;44108:24;:32::i;:::-;44088:52;;44174:9;44159:11;:24;;44151:79;;;;-1:-1:-1;;;44151:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44261:1;44249:9;:13;44241:41;;;;;-1:-1:-1;;;44241:41:0;;;;;;;;;;;;-1:-1:-1;;;44241:41:0;;;;;;;;;;;;;;;44314:21;44324:10;44314:9;:21::i;:::-;44301:9;:34;;44293:69;;;;;-1:-1:-1;;;44293:69:0;;;;;;;;;;;;-1:-1:-1;;;44293:69:0;;;;;;;;;;;;;;;44375:22;44412:28;44418:10;44430:9;44412:5;:28::i;:::-;44462:23;44466:10;;44478:6;44462:3;:23::i;:::-;44509:10;;44453:32;;-1:-1:-1;44509:22:0;;44453:32;44509:14;:22::i;:::-;44496:10;:35;44595:9;;44581:10;44566:26;;;;:14;:26;;;;;;:38;44548:15;:56;44544:272;;;44638:30;44662:5;44638:19;44649:7;;44638:6;:10;;:19;;;;:::i;:30::-;44621:47;-1:-1:-1;44692:26:0;:6;44621:47;44692:10;:26::i;:::-;44779:8;;44751:13;;44683:35;;-1:-1:-1;44733:71:0;;-1:-1:-1;;;;;44751:13:0;;;;44779:8;44789:14;44733:45;:71::i;:::-;44828:6;:4;:6::i;:::-;44863:13;;44845:65;;-1:-1:-1;;;;;44863:13:0;44891:10;44903:6;44845:45;:65::i;:::-;44926:68;;;44931:10;44926:68;;;;;;;;;;;;;;;;;;;;44978:15;44926:68;;;;;;;;;;;;;;;43956:1046;;;;:::o;41223:865::-;41311:1;41302:6;:10;41294:37;;;;;-1:-1:-1;;;41294:37:0;;;;;;;;;;;;-1:-1:-1;;;41294:37:0;;;;;;;;;;;;;;;41382:13;;41364:54;;;-1:-1:-1;;;41364:54:0;;41407:10;41364:54;;;;;;41422:6;;-1:-1:-1;;;;;41382:13:0;;41364:42;;:54;;;;;;;;;;;;;;41382:13;41364:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41364:54:0;:64;;41342:132;;;;;-1:-1:-1;;;41342:132:0;;;;;;;;;;;;-1:-1:-1;;;41342:132:0;;;;;;;;;;;;;;;41487:17;41507:31;41531:6;41507:23;:31::i;:::-;41487:51;;41570:12;41557:9;:25;;41549:81;;;;-1:-1:-1;;;41549:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41661:1;41649:9;:13;41641:41;;;;;-1:-1:-1;;;41641:41:0;;;;;;;;;;;;-1:-1:-1;;;41641:41:0;;;;;;;;;;;;;;;41693:28;41699:10;41711:9;41693:5;:28::i;:::-;41745:10;;:22;;41760:6;41745:14;:22::i;:::-;41732:10;:35;41817:10;41802:26;;;;:14;:26;;;;;41831:15;41802:44;;41859:6;:4;:6::i;:::-;41894:13;;41876:134;;-1:-1:-1;;;;;41894:13:0;41940:10;41973:4;41993:6;41876:49;:134::i;:::-;42026:54;;;42033:10;42026:54;;;;;;;;;;;;;;42064:15;42026:54;;;;;;;;;;;;;;;41223:865;;;:::o;42911:1035::-;43006:1;42994:9;:13;42986:43;;;;;-1:-1:-1;;;42986:43:0;;;;;;;;;;;;-1:-1:-1;;;42986:43:0;;;;;;;;;;;;;;;43061:21;43071:10;43061:9;:21::i;:::-;43048:9;:34;;43040:69;;;;;-1:-1:-1;;;43040:69:0;;;;;;;;;;;;-1:-1:-1;;;43040:69:0;;;;;;;;;;;;;;;43122:14;43139:30;43159:9;43139:19;:30::i;:::-;43122:47;;43198:12;43188:6;:22;;43180:77;;;;-1:-1:-1;;;43180:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43285:1;43276:6;:10;43268:38;;;;;-1:-1:-1;;;43268:38:0;;;;;;;;;;;;-1:-1:-1;;;43268:38:0;;;;;;;;;;;;;;;43319:22;43356:28;43362:10;43374:9;43356:5;:28::i;:::-;43406:23;43410:10;;43422:6;43406:3;:23::i;:::-;43453:10;;43397:32;;-1:-1:-1;43453:22:0;;43397:32;43453:14;:22::i;:::-;43440:10;:35;43539:9;;43525:10;43510:26;;;;:14;:26;;;;;;:38;43492:15;:56;43488:272;;;43582:30;43606:5;43582:19;43593:7;;43582:6;:10;;:19;;;;:::i;:30::-;43565:47;-1:-1:-1;43636:26:0;:6;43565:47;43636:10;:26::i;:::-;43723:8;;43695:13;;43627:35;;-1:-1:-1;43677:71:0;;-1:-1:-1;;;;;43695:13:0;;;;43723:8;43733:14;43677:45;:71::i;:::-;43772:6;:4;:6::i;:::-;43807:13;;43789:65;;-1:-1:-1;;;;;43807:13:0;43835:10;43847:6;43789:45;:65::i;:::-;43870:68;;;43875:10;43870:68;;;;;;;;;;;;;;;;;;;;43922:15;43870:68;;;;;;;;;;;;;;;42911:1035;;;;:::o;24466:151::-;-1:-1:-1;;;;;24582:18:0;;;24555:7;24582:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;24466:151::o;39074:117::-;39120:71;39074:117;:::o;48377:199::-;40549:8;;-1:-1:-1;;;;;40549:8:0;40535:10;:22;40527:52;;;;;-1:-1:-1;;;40527:52:0;;;;;;;;;;;;-1:-1:-1;;;40527:52:0;;;;;;;;;;;;;;;48471:9:::1;::::0;;48491:22;;;;48531:37:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;40590:1;48377:199:::0;:::o;49285:277::-;40662:8;;-1:-1:-1;;;;;40662:8:0;40648:10;:22;40640:52;;;;;-1:-1:-1;;;40640:52:0;;;;;;;;;;;;-1:-1:-1;;;40640:52:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;49366:23:0;::::1;49358:66;;;::::0;;-1:-1:-1;;;49358:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;49459:8;::::0;;-1:-1:-1;;;;;49478:20:0;;::::1;-1:-1:-1::0;;;;;;49478:20:0;::::1;;::::0;;;;49516:38:::1;::::0;;49459:8;;::::1;49516:38:::0;;;49545:8;;;::::1;49516:38;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;40703:1;49285:277:::0;:::o;38597:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38597:70:0;;-1:-1:-1;;;;;38597:70:0;;:::o;38099:49::-;;;;;;;;;;;;;:::o;42096:807::-;42197:1;42185:9;:13;42177:43;;;;;-1:-1:-1;;;42177:43:0;;;;;;;;;;;;-1:-1:-1;;;42177:43:0;;;;;;;;;;;;;;;42233:14;42250:29;42269:9;42250:18;:29::i;:::-;42233:46;;42308:11;42298:6;:21;;42290:62;;;;;-1:-1:-1;;;42290:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42403:13;;42385:54;;;-1:-1:-1;;;42385:54:0;;42428:10;42385:54;;;;;;42443:6;;-1:-1:-1;;;;;42403:13:0;;42385:42;;:54;;;;;;;;;;;;;;42403:13;42385:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42385:54:0;:64;;42363:132;;;;;-1:-1:-1;;;42363:132:0;;;;;;;;;;;;-1:-1:-1;;;42363:132:0;;;;;;;;;;;;;;;42508:28;42514:10;42526:9;42508:5;:28::i;:::-;42560:10;;:22;;42575:6;42560:14;:22::i;:::-;42547:10;:35;42632:10;42617:26;;;;:14;:26;;;;;42646:15;42617:44;;42674:6;:4;:6::i;:::-;42709:13;;42691:134;;-1:-1:-1;;;;;42709:13:0;42755:10;42788:4;42808:6;42691:49;:134::i;:::-;42841:54;;;42848:10;42841:54;;;;;;;;;;;;;;42879:15;42841:54;;;;;;;;;;;;;;;42096:807;;;:::o;16482:220::-;16540:7;16564:6;16560:20;;-1:-1:-1;16579:1:0;16572:8;;16560:20;16603:5;;;16607:1;16603;:5;:1;16627:5;;;;;:10;16619:56;;;;-1:-1:-1;;;16619:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17180:153;17238:7;17270:1;17266;:5;17258:44;;;;;-1:-1:-1;;;17258:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17324:1;17320;:5;;;;;;;17180:153;-1:-1:-1;;;17180:153:0:o;16065:158::-;16123:7;16156:1;16151;:6;;16143:49;;;;;-1:-1:-1;;;16143:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16210:5:0;;;16065:158::o;9774:106::-;9862:10;9774:106;:::o;30013:346::-;-1:-1:-1;;;;;30115:19:0;;30107:68;;;;-1:-1:-1;;;30107:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30194:21:0;;30186:68;;;;-1:-1:-1;;;30186:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30267:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;30319:32;;;;;;;;;;;;;;;;;30013:346;;;:::o;27625:539::-;-1:-1:-1;;;;;27731:20:0;;27723:70;;;;-1:-1:-1;;;27723:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27812:23:0;;27804:71;;;;-1:-1:-1;;;27804:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27888:47;27909:6;27917:9;27928:6;27888:20;:47::i;:::-;27968:71;27990:6;27968:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27968:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;27948:17:0;;;;;;;:9;:17;;;;;;:91;;;;28073:20;;;;;;;:32;;28098:6;28073:24;:32::i;:::-;-1:-1:-1;;;;;28050:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;28121:35;;;;;;;28050:20;;28121:35;;;;;;;;;;;;;27625:539;;;:::o;18430:166::-;18516:7;18552:12;18544:6;;;;18536:29;;;;-1:-1:-1;;;18536:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18583:5:0;;;18430:166::o;15603:179::-;15661:7;15693:5;;;15717:6;;;;15709:46;;;;;-1:-1:-1;;;15709:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8898:125;8946:4;8971:44;9009:4;8971:29;:44::i;:::-;8970:45;8963:52;;8898:125;:::o;22177:181::-;8442:13;;;;;;;;:33;;;8459:16;:14;:16::i;:::-;8442:50;;;-1:-1:-1;8480:12:0;;;;8479:13;8442:50;8434:109;;;;-1:-1:-1;;;8434:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8556:19;8579:13;;;;;;8578:14;8603:101;;;;8638:13;:20;;-1:-1:-1;;;;8638:20:0;;;;;8673:19;8654:4;8673:19;;;8603:101;22275:26:::1;:24;:26::i;:::-;22312:38;22335:5;22342:7;22312:22;:38::i;:::-;8734:14:::0;8730:68;;;8781:5;8765:21;;-1:-1:-1;;8765:21:0;;;8730:68;22177:181;;;:::o;45970:167::-;46025:5;;46062:10;;46049:39;;46074:13;:11;:13::i;:::-;46049:12;:39::i;:::-;46041:5;:47;;;46106:23;;;;;;;;;;;;;;;;;;;;;;;;;45970:167;:::o;32313:216::-;32452:68;;;-1:-1:-1;;;;;32452:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32452:68:0;-1:-1:-1;;;32452:68:0;;;32425:96;;32445:5;;32425:19;:96::i;:::-;32313:216;;;;:::o;54670:427::-;-1:-1:-1;;;;;54773:20:0;;;54747:23;54773:20;;;:9;:20;;;;;;;;;;54830:71;54837:20;54783:9;54837;:20::i;:::-;54830:71;;;;;;;;;;;;;;;;;:6;:71::i;:::-;-1:-1:-1;;;;;54912:20:0;;;;;;;:9;:20;;;;;;:32;;-1:-1:-1;;;;;;54912:32:0;;;;;;;;;;54962:54;;54804:97;;-1:-1:-1;54912:32:0;54962:54;;;;;;54912:20;54962:54;55029:60;55044:15;55061:9;55072:16;55029:14;:60::i;32117:188::-;32238:58;;;-1:-1:-1;;;;;32238:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32238:58:0;-1:-1:-1;;;32238:58:0;;;32211:86;;32231:5;;32211:19;:86::i;57396:153::-;57506:9;57396:153;:::o;29157:418::-;-1:-1:-1;;;;;29241:21:0;;29233:67;;;;-1:-1:-1;;;29233:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29313:49;29334:7;29351:1;29355:6;29313:20;:49::i;:::-;29396:68;29419:6;29396:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29396:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;29375:18:0;;;;;;:9;:18;;;;;:89;29490:12;;:24;;29507:6;29490:16;:24::i;:::-;29475:12;:39;29530:37;;;;;;;;29556:1;;-1:-1:-1;;;;;29530:37:0;;;;;;;;;;;;29157:418;;:::o;28446:378::-;-1:-1:-1;;;;;28530:21:0;;28522:65;;;;;-1:-1:-1;;;28522:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28600:49;28629:1;28633:7;28642:6;28600:20;:49::i;:::-;28677:12;;:24;;28694:6;28677:16;:24::i;:::-;28662:12;:39;-1:-1:-1;;;;;28733:18:0;;;;;;:9;:18;;;;;;:30;;28756:6;28733:22;:30::i;:::-;-1:-1:-1;;;;;28712:18:0;;;;;;:9;:18;;;;;;;;:51;;;;28779:37;;;;;;;28712:18;;;;28779:37;;;;;;;;;;28446:378;;:::o;57557:213::-;-1:-1:-1;;;;;57673:15:0;;;;;;;:9;:15;;;;;;;;;57690:13;;;;;;;;;;57705:56;;;;;;;;;;;;57658:104;;57673:15;;;;57690:13;;;;;57705:56;;57712:6;;57705:56;;;;;;;:6;:56::i;:::-;57658:14;:104::i;754:422::-;1121:20;1160:8;;;754:422::o;9703:65::-;8442:13;;;;;;;;:33;;;8459:16;:14;:16::i;:::-;8442:50;;;-1:-1:-1;8480:12:0;;;;8479:13;8442:50;8434:109;;;;-1:-1:-1;;;8434:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8556:19;8579:13;;;;;;8578:14;8603:101;;;;8638:13;:20;;-1:-1:-1;;;;8638:20:0;;;;;8673:19;8654:4;8673:19;;;8603:101;8734:14;8730:68;;;8781:5;8765:21;;-1:-1:-1;;8765:21:0;;;9703:65;:::o;22366:182::-;8442:13;;;;;;;;:33;;;8459:16;:14;:16::i;:::-;8442:50;;;-1:-1:-1;8480:12:0;;;;8479:13;8442:50;8434:109;;;;-1:-1:-1;;;8434:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8556:19;8579:13;;;;;;8578:14;8603:101;;;;8638:13;:20;;-1:-1:-1;;;;8638:20:0;;;;;8673:19;8654:4;8673:19;;;8603:101;22474:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;22498:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;22526:9:0::1;:14:::0;;-1:-1:-1;;22526:14:0::1;22538:2;22526:14;::::0;;8730:68;;;;8781:5;8765:21;;-1:-1:-1;;8765:21:0;;;22366:182;;;:::o;34477:772::-;34912:23;34938:69;34966:4;34938:69;;;;;;;;;;;;;;;;;34946:5;-1:-1:-1;;;;;34938:27:0;;;:69;;;;;:::i;:::-;35022:17;;34912:95;;-1:-1:-1;35022:21:0;35018:224;;35164:10;35153:30;;;;;;;;;;;;;;;-1:-1:-1;35153:30:0;35145:85;;;;-1:-1:-1;;;35145:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56858:161;56933:6;56971:12;-1:-1:-1;;;56960:9:0;;56952:32;;;;-1:-1:-1;;;56952:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57009:1:0;;56858:161;-1:-1:-1;;56858:161:0:o;55105:939::-;55210:6;-1:-1:-1;;;;;55200:16:0;:6;-1:-1:-1;;;;;55200:16:0;;;:30;;;;;55229:1;55220:6;-1:-1:-1;;;;;55220:10:0;;55200:30;55196:841;;;-1:-1:-1;;;;;55251:20:0;;;55247:382;;-1:-1:-1;;;;;55311:22:0;;55292:16;55311:22;;;:14;:22;;;;;;;;;55371:13;:60;;55430:1;55371:60;;;-1:-1:-1;;;;;55387:19:0;;;;;;:11;:19;;;;;;;;-1:-1:-1;;55407:13:0;;55387:34;;;;;;;;;:40;-1:-1:-1;;;55387:40:0;;-1:-1:-1;;;;;55387:40:0;55371:60;55352:79;;55450:16;55469:68;55475:9;55486:6;55469:68;;;;;;;;;;;;;;;;;:5;:68::i;:::-;55450:87;;55556:57;55573:6;55581:9;55592;55603;55556:16;:57::i;:::-;55247:382;;;;-1:-1:-1;;;;;55649:20:0;;;55645:381;;-1:-1:-1;;;;;55709:22:0;;55690:16;55709:22;;;:14;:22;;;;;;;;;55769:13;:60;;55828:1;55769:60;;;-1:-1:-1;;;;;55785:19:0;;;;;;:11;:19;;;;;;;;-1:-1:-1;;55805:13:0;;55785:34;;;;;;;;;:40;-1:-1:-1;;;55785:40:0;;-1:-1:-1;;;;;55785:40:0;55769:60;55750:79;;55848:16;55867:67;55873:9;55884:6;55867:67;;;;;;;;;;;;;;;;;:5;:67::i;:::-;55848:86;;55953:57;55970:6;55978:9;55989;56000;55953:16;:57::i;3672:195::-;3775:12;3807:52;3829:6;3837:4;3843:1;3846:12;3807:21;:52::i;:::-;3800:59;3672:195;-1:-1:-1;;;;3672:195:0:o;57223:165::-;57309:6;57341:1;-1:-1:-1;;;;;57336:6:0;:1;-1:-1:-1;;;;;57336:6:0;;;57344:12;57328:29;;;;;-1:-1:-1;;;57328:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56052:629;56170:18;56191:76;56198:12;56191:76;;;;;;;;;;;;;;;;;:6;:76::i;:::-;56170:97;;56297:1;56282:12;:16;;;:85;;;;-1:-1:-1;;;;;;56302:22:0;;;;;;:11;:22;;;;;;;;:65;-1:-1:-1;;56325:16:0;;56302:40;;;;;;;;;:50;:65;;;:50;;:65;56282:85;56278:329;;;-1:-1:-1;;;;;56382:22:0;;;;;;:11;:22;;;;;;;;-1:-1:-1;;56405:16:0;;56382:40;;;;;;;;;:57;;-1:-1:-1;;56382:57:0;-1:-1:-1;;;;;;;;56382:57:0;;;;;;56278:329;;;56507:33;;;;;;;;;;;;;;-1:-1:-1;;;;;56507:33:0;;;;;;;;;;-1:-1:-1;;;;;56468:22:0;;-1:-1:-1;56468:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;;;-1:-1:-1;;;56468:72:0;-1:-1:-1;;56468:72:0;;;-1:-1:-1;;56468:72:0;;;;;;;;;;;;;;;56553:25;;;:14;:25;;;;;;;:44;;56468:72;56581:16;;56553:44;;;;;;;;;;;;;56278:329;56622:51;;;-1:-1:-1;;;;;56622:51:0;;;;;;;;;;;;;-1:-1:-1;;;;;56622:51:0;;;;;;;;;;;56052:629;;;;;:::o;57027:188::-;57113:6;57143:5;;;57175:12;-1:-1:-1;;;;;57167:6:0;;;;;;;;57159:29;;;;-1:-1:-1;;;57159:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57206:1:0;57027:188;-1:-1:-1;;;;57027:188:0:o;4724:530::-;4851:12;4909:5;4884:21;:30;;4876:81;;;;-1:-1:-1;;;4876:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4976:18;4987:6;4976:10;:18::i;:::-;4968:60;;;;;-1:-1:-1;;;4968:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5102:12;5116:23;5143:6;-1:-1:-1;;;;;5143:11:0;5163:5;5171:4;5143:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5143:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5101:75;;;;5194:52;5212:7;5221:10;5233:12;5194:17;:52::i;56689:161::-;56764:6;56802:12;-1:-1:-1;;;56791:9:0;;56783:32;;;;-1:-1:-1;;;56783:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6260:742;6375:12;6404:7;6400:595;;;-1:-1:-1;6435:10:0;6428:17;;6400:595;6549:17;;:21;6545:439;;6812:10;6806:17;6873:15;6860:10;6856:2;6852:19;6845:44;6760:148;6948:20;;-1:-1:-1;;;6948:20:0;;;;;;;;;;;;;;;;;6955:12;;6948:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://720e64e02b6d80c5b58aee03bb60487a3dec068374027535b184ab307a0f1b35
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.