ERC-20
Overview
Max Total Supply
102,943.23620325075956625 stkGRO
Holders
427
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
11.395765756567710027 stkGROValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
stkGRO
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-24 */ // SPDX-License-Identifier: GPL-3.0-only pragma experimental ABIEncoderV2; // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @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 SafeMath { /** * @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) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * 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); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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 Context { 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; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `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); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in 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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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); } } } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin 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 ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; 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. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view 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 returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view 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 { _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 { } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.6.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/GToken.sol pragma solidity ^0.6.0; /** * @dev Minimal interface for gTokens, implemented by the GTokenBase contract. * See GTokenBase.sol for further documentation. */ interface GToken is IERC20 { // pure functions function calcDepositSharesFromCost(uint256 _cost, uint256 _totalReserve, uint256 _totalSupply, uint256 _depositFee) external pure returns (uint256 _netShares, uint256 _feeShares); function calcDepositCostFromShares(uint256 _netShares, uint256 _totalReserve, uint256 _totalSupply, uint256 _depositFee) external pure returns (uint256 _cost, uint256 _feeShares); function calcWithdrawalSharesFromCost(uint256 _cost, uint256 _totalReserve, uint256 _totalSupply, uint256 _withdrawalFee) external pure returns (uint256 _grossShares, uint256 _feeShares); function calcWithdrawalCostFromShares(uint256 _grossShares, uint256 _totalReserve, uint256 _totalSupply, uint256 _withdrawalFee) external pure returns (uint256 _cost, uint256 _feeShares); // view functions function reserveToken() external view returns (address _reserveToken); function totalReserve() external view returns (uint256 _totalReserve); function depositFee() external view returns (uint256 _depositFee); function withdrawalFee() external view returns (uint256 _withdrawalFee); // open functions function deposit(uint256 _cost) external; function withdraw(uint256 _grossShares) external; } // File: contracts/GVoting.sol pragma solidity ^0.6.0; /** * @dev An interface to extend gTokens with voting delegation capabilities. * See GTokenType3.sol for further documentation. */ interface GVoting { // view functions function votes(address _candidate) external view returns (uint256 _votes); function candidate(address _voter) external view returns (address _candidate); // open functions function setCandidate(address _newCandidate) external; // emitted events event ChangeCandidate(address indexed _voter, address indexed _oldCandidate, address indexed _newCandidate); event ChangeVotes(address indexed _candidate, uint256 _oldVotes, uint256 _newVotes); } // File: contracts/GFormulae.sol pragma solidity ^0.6.0; /** * @dev Pure implementation of deposit/minting and withdrawal/burning formulas * for gTokens. * All operations assume that, if total supply is 0, then the total * reserve is also 0, and vice-versa. * Fees are calculated percentually based on the gross amount. * See GTokenBase.sol for further documentation. */ library GFormulae { using SafeMath for uint256; /* deposit(cost): * price = reserve / supply * gross = cost / price * net = gross * 0.99 # fee is assumed to be 1% for simplicity * fee = gross - net * return net, fee */ function _calcDepositSharesFromCost(uint256 _cost, uint256 _totalReserve, uint256 _totalSupply, uint256 _depositFee) internal pure returns (uint256 _netShares, uint256 _feeShares) { uint256 _grossShares = _totalSupply == _totalReserve ? _cost : _cost.mul(_totalSupply).div(_totalReserve); _netShares = _grossShares.mul(uint256(1e18).sub(_depositFee)).div(1e18); _feeShares = _grossShares.sub(_netShares); return (_netShares, _feeShares); } /* deposit_reverse(net): * price = reserve / supply * gross = net / 0.99 # fee is assumed to be 1% for simplicity * cost = gross * price * fee = gross - net * return cost, fee */ function _calcDepositCostFromShares(uint256 _netShares, uint256 _totalReserve, uint256 _totalSupply, uint256 _depositFee) internal pure returns (uint256 _cost, uint256 _feeShares) { uint256 _grossShares = _netShares.mul(1e18).div(uint256(1e18).sub(_depositFee)); _cost = _totalReserve == _totalSupply ? _grossShares : _grossShares.mul(_totalReserve).div(_totalSupply); _feeShares = _grossShares.sub(_netShares); return (_cost, _feeShares); } /* withdrawal_reverse(cost): * price = reserve / supply * net = cost / price * gross = net / 0.99 # fee is assumed to be 1% for simplicity * fee = gross - net * return gross, fee */ function _calcWithdrawalSharesFromCost(uint256 _cost, uint256 _totalReserve, uint256 _totalSupply, uint256 _withdrawalFee) internal pure returns (uint256 _grossShares, uint256 _feeShares) { uint256 _netShares = _cost == _totalReserve ? _totalSupply : _cost.mul(_totalSupply).div(_totalReserve); _grossShares = _netShares.mul(1e18).div(uint256(1e18).sub(_withdrawalFee)); _feeShares = _grossShares.sub(_netShares); return (_grossShares, _feeShares); } /* withdrawal(gross): * price = reserve / supply * net = gross * 0.99 # fee is assumed to be 1% for simplicity * cost = net * price * fee = gross - net * return cost, fee */ function _calcWithdrawalCostFromShares(uint256 _grossShares, uint256 _totalReserve, uint256 _totalSupply, uint256 _withdrawalFee) internal pure returns (uint256 _cost, uint256 _feeShares) { uint256 _netShares = _grossShares.mul(uint256(1e18).sub(_withdrawalFee)).div(1e18); _cost = _netShares == _totalSupply ? _totalReserve : _netShares.mul(_totalReserve).div(_totalSupply); _feeShares = _grossShares.sub(_netShares); return (_cost, _feeShares); } } // File: contracts/modules/Math.sol pragma solidity ^0.6.0; /** * @dev This library implements auxiliary math definitions. */ library Math { function _min(uint256 _amount1, uint256 _amount2) internal pure returns (uint256 _minAmount) { return _amount1 < _amount2 ? _amount1 : _amount2; } function _max(uint256 _amount1, uint256 _amount2) internal pure returns (uint256 _maxAmount) { return _amount1 > _amount2 ? _amount1 : _amount2; } } // File: contracts/network/$.sol pragma solidity ^0.6.0; /** * @dev This library is provided for conveniece. It is the single source for * the current network and all related hardcoded contract addresses. It * also provide useful definitions for debuging faultless code via events. */ library $ { address constant GRO = 0x09e64c2B61a5f1690Ee6fbeD9baf5D6990F8dFd0; } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // 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(IERC20 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(IERC20 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(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/modules/Transfers.sol pragma solidity ^0.6.0; /** * @dev This library abstracts ERC-20 operations. */ library Transfers { using SafeERC20 for IERC20; /** * @dev Retrieves a given ERC-20 token balance for the current contract. * @param _token An ERC-20 compatible token address. * @return _balance The current contract balance of the given ERC-20 token. */ function _getBalance(address _token) internal view returns (uint256 _balance) { return IERC20(_token).balanceOf(address(this)); } /** * @dev Allows a spender to access a given ERC-20 balance for the current contract. * @param _token An ERC-20 compatible token address. * @param _to The spender address. * @param _amount The exact spending allowance amount. */ function _approveFunds(address _token, address _to, uint256 _amount) internal { uint256 _allowance = IERC20(_token).allowance(address(this), _to); if (_allowance > _amount) { IERC20(_token).safeDecreaseAllowance(_to, _allowance - _amount); } else if (_allowance < _amount) { IERC20(_token).safeIncreaseAllowance(_to, _amount - _allowance); } } /** * @dev Transfer a given ERC-20 token amount into the current contract. * @param _token An ERC-20 compatible token address. * @param _from The source address. * @param _amount The amount to be transferred. */ function _pullFunds(address _token, address _from, uint256 _amount) internal { if (_amount == 0) return; IERC20(_token).safeTransferFrom(_from, address(this), _amount); } /** * @dev Transfer a given ERC-20 token amount from the current contract. * @param _token An ERC-20 compatible token address. * @param _to The target address. * @param _amount The amount to be transferred. */ function _pushFunds(address _token, address _to, uint256 _amount) internal { if (_amount == 0) return; IERC20(_token).safeTransfer(_to, _amount); } } // File: contracts/G.sol pragma solidity ^0.6.0; /** * @dev This public library provides a single entrypoint to most of the relevant * internal libraries available in the modules folder. It exists to * circunvent the contract size limitation imposed by the EVM. All function * calls are directly delegated to the target library function preserving * argument and return values exactly as they are. This library is shared * by many contracts and even other public libraries from this repository, * therefore it needs to be published alongside them. */ library G { function min(uint256 _amount1, uint256 _amount2) public pure returns (uint256 _minAmount) { return Math._min(_amount1, _amount2); } function max(uint256 _amount1, uint256 _amount2) public pure returns (uint256 _maxAmount) { return Math._max(_amount1, _amount2); } function getBalance(address _token) public view returns (uint256 _balance) { return Transfers._getBalance(_token); } function pullFunds(address _token, address _from, uint256 _amount) public { Transfers._pullFunds(_token, _from, _amount); } function pushFunds(address _token, address _to, uint256 _amount) public { Transfers._pushFunds(_token, _to, _amount); } function approveFunds(address _token, address _to, uint256 _amount) public { Transfers._approveFunds(_token, _to, _amount); } } // File: contracts/GTokenType3.sol pragma solidity ^0.6.0; /** * @notice This contract implements the functionality for the gToken Type 3. * It has a higher deposit/withdrawal fee when compared to other * gTokens (10%). Half of the collected fee used to reward token * holders while the other half is burned along with the same proportion * of the reserve. It is used in the implementation of stkGRO. */ contract GTokenType3 is ERC20, ReentrancyGuard, GToken, GVoting { using SafeMath for uint256; uint256 constant DEPOSIT_FEE = 10e16; // 10% uint256 constant WITHDRAWAL_FEE = 10e16; // 10% uint256 constant VOTING_ROUND_INTERVAL = 1 days; address public immutable override reserveToken; mapping (address => address) public override candidate; mapping (address => uint256) private votingRound; mapping (address => uint256[2]) private voting; /** * @dev Constructor for the gToken contract. * @param _name The ERC-20 token name. * @param _symbol The ERC-20 token symbol. * @param _decimals The ERC-20 token decimals. * @param _reserveToken The ERC-20 token address to be used as reserve * token (e.g. GRO for sktGRO). */ constructor (string memory _name, string memory _symbol, uint8 _decimals, address _reserveToken) ERC20(_name, _symbol) public { _setupDecimals(_decimals); reserveToken = _reserveToken; } /** * @notice Allows for the beforehand calculation of shares to be * received/minted upon depositing to the contract. * @param _cost The amount of reserve token being deposited. * @param _totalReserve The reserve balance as obtained by totalReserve(). * @param _totalSupply The shares supply as obtained by totalSupply(). * @param _depositFee The current deposit fee as obtained by depositFee(). * @return _netShares The net amount of shares being received. * @return _feeShares The fee amount of shares being deducted. */ function calcDepositSharesFromCost(uint256 _cost, uint256 _totalReserve, uint256 _totalSupply, uint256 _depositFee) public pure override returns (uint256 _netShares, uint256 _feeShares) { return GFormulae._calcDepositSharesFromCost(_cost, _totalReserve, _totalSupply, _depositFee); } /** * @notice Allows for the beforehand calculation of the amount of * reserve token to be deposited in order to receive the desired * amount of shares. * @param _netShares The amount of this gToken shares to receive. * @param _totalReserve The reserve balance as obtained by totalReserve(). * @param _totalSupply The shares supply as obtained by totalSupply(). * @param _depositFee The current deposit fee as obtained by depositFee(). * @return _cost The cost, in the reserve token, to be paid. * @return _feeShares The fee amount of shares being deducted. */ function calcDepositCostFromShares(uint256 _netShares, uint256 _totalReserve, uint256 _totalSupply, uint256 _depositFee) public pure override returns (uint256 _cost, uint256 _feeShares) { return GFormulae._calcDepositCostFromShares(_netShares, _totalReserve, _totalSupply, _depositFee); } /** * @notice Allows for the beforehand calculation of shares to be * given/burned upon withdrawing from the contract. * @param _cost The amount of reserve token being withdrawn. * @param _totalReserve The reserve balance as obtained by totalReserve() * @param _totalSupply The shares supply as obtained by totalSupply() * @param _withdrawalFee The current withdrawal fee as obtained by withdrawalFee() * @return _grossShares The total amount of shares being deducted, * including fees. * @return _feeShares The fee amount of shares being deducted. */ function calcWithdrawalSharesFromCost(uint256 _cost, uint256 _totalReserve, uint256 _totalSupply, uint256 _withdrawalFee) public pure override returns (uint256 _grossShares, uint256 _feeShares) { return GFormulae._calcWithdrawalSharesFromCost(_cost, _totalReserve, _totalSupply, _withdrawalFee); } /** * @notice Allows for the beforehand calculation of the amount of * reserve token to be withdrawn given the desired amount of * shares. * @param _grossShares The amount of this gToken shares to provide. * @param _totalReserve The reserve balance as obtained by totalReserve(). * @param _totalSupply The shares supply as obtained by totalSupply(). * @param _withdrawalFee The current withdrawal fee as obtained by withdrawalFee(). * @return _cost The cost, in the reserve token, to be received. * @return _feeShares The fee amount of shares being deducted. */ function calcWithdrawalCostFromShares(uint256 _grossShares, uint256 _totalReserve, uint256 _totalSupply, uint256 _withdrawalFee) public pure override returns (uint256 _cost, uint256 _feeShares) { return GFormulae._calcWithdrawalCostFromShares(_grossShares, _totalReserve, _totalSupply, _withdrawalFee); } /** * @notice Provides the amount of reserve tokens currently being help by * this contract. * @return _totalReserve The amount of the reserve token corresponding * to this contract's balance. */ function totalReserve() public view virtual override returns (uint256 _totalReserve) { return G.getBalance(reserveToken); } /** * @notice Provides the current minting/deposit fee. This fee is * applied to the amount of this gToken shares being created * upon deposit. The fee defaults to 10%. * @return _depositFee A percent value that accounts for the percentage * of shares being minted at each deposit that be * collected as fee. */ function depositFee() public view override returns (uint256 _depositFee) { return DEPOSIT_FEE; } /** * @notice Provides the current burning/withdrawal fee. This fee is * applied to the amount of this gToken shares being redeemed * upon withdrawal. The fee defaults to 10%. * @return _withdrawalFee A percent value that accounts for the * percentage of shares being burned at each * withdrawal that be collected as fee. */ function withdrawalFee() public view override returns (uint256 _withdrawalFee) { return WITHDRAWAL_FEE; } /** * @notice Provides the number of votes a given candidate has at the end * of the previous voting interval. The interval is 24 hours * and resets at 12AM UTC. See _transferVotes(). * @param _candidate The candidate for which we want to know the number * of delegated votes. * @return _votes The candidate number of votes. It is the sum of the * balances of the voters that have him as cadidate at * the end of the previous voting interval. */ function votes(address _candidate) public view override returns (uint256 _votes) { uint256 _votingRound = block.timestamp.div(VOTING_ROUND_INTERVAL); // if the candidate balance was last updated the current round // uses the backup instead (position 1), otherwise uses the most // up-to-date balance (position 0) return voting[_candidate][votingRound[_candidate] < _votingRound ? 0 : 1]; } /** * @notice Performs the minting of gToken shares upon the deposit of the * reserve token. The actual number of shares being minted can * be calculated using the calcDepositSharesFromCost function. * In every deposit, 10% of the shares is retained in terms of * deposit fee. The fee amount and half of its equivalent * reserve amount are immediately burned. The funds will be * pulled in by this contract, therefore they must be previously * approved. * @param _cost The amount of reserve token being deposited in the * operation. */ function deposit(uint256 _cost) public override nonReentrant { address _from = msg.sender; require(_cost > 0, "cost must be greater than 0"); (uint256 _netShares, uint256 _feeShares) = GFormulae._calcDepositSharesFromCost(_cost, totalReserve(), totalSupply(), depositFee()); require(_netShares > 0, "shares must be greater than 0"); G.pullFunds(reserveToken, _from, _cost); _mint(_from, _netShares); _burnReserveFromShares(_feeShares.div(2)); } /** * @notice Performs the burning of gToken shares upon the withdrawal of * the reserve token. The actual amount of the reserve token to * be received can be calculated using the * calcWithdrawalCostFromShares function. In every withdrawal, * 10% of the shares is retained in terms of withdrawal fee. * The fee amount and half of its equivalent reserve amount are * immediately burned. * @param _grossShares The gross amount of this gToken shares being * redeemed in the operation. */ function withdraw(uint256 _grossShares) public override nonReentrant { address _from = msg.sender; require(_grossShares > 0, "shares must be greater than 0"); (uint256 _cost, uint256 _feeShares) = GFormulae._calcWithdrawalCostFromShares(_grossShares, totalReserve(), totalSupply(), withdrawalFee()); require(_cost > 0, "cost must be greater than 0"); _cost = G.min(_cost, G.getBalance(reserveToken)); G.pushFunds(reserveToken, _from, _cost); _burn(_from, _grossShares); _burnReserveFromShares(_feeShares.div(2)); } /** * @notice Changes the voter's choice for candidate and vote delegation. * It is only going to be reflected in the voting by the next * interval. The interval is 24 hours and resets at 12AM UTC. * This function will emit a ChangeCandidate event. * @param _newCandidate The new candidate chosen. */ function setCandidate(address _newCandidate) public override nonReentrant { address _voter = msg.sender; uint256 _votes = balanceOf(_voter); address _oldCandidate = candidate[_voter]; candidate[_voter] = _newCandidate; _transferVotes(_oldCandidate, _newCandidate, _votes); emit ChangeCandidate(_voter, _oldCandidate, _newCandidate); } /** * @dev Burns a given amount of shares worth of the reserve token. * See burnReserve(). * @param _grossShares The amount of shares for which the equivalent, * in the reserve token, will be burned. */ function _burnReserveFromShares(uint256 _grossShares) internal virtual { // we use the withdrawal formula to calculated how much is burned (withdrawn) from the contract // since the fee is 0 using the deposit formula would yield the same amount (uint256 _cost,) = GFormulae._calcWithdrawalCostFromShares(_grossShares, totalReserve(), totalSupply(), 0); _cost = G.min(_cost, G.getBalance(reserveToken)); _burnReserve(_cost); } /** * @dev Burns the given amount of the reserve token. The default behavior * of the function for general ERC-20 is to send the funds to * address(0), but that can be overriden by a subcontract. * @param _reserveAmount The amount of the reserve token being burned. */ function _burnReserve(uint256 _reserveAmount) internal virtual { G.pushFunds(reserveToken, address(0), _reserveAmount); } /** * @dev This hook is called whenever tokens are minted, burned and * transferred. This contract forbids token transfers by design. * Token minting and burning will be reflected in the additional * votes being credited or debited to the chosen candidate. * See _transferVotes(). * @param _from The provider of funds. Address 0 for minting. * @param _to The receiver of funds. Address 0 for burning. * @param _amount The amount being transfered. */ function _beforeTokenTransfer(address _from, address _to, uint256 _amount) internal override { require(_from == address(0) || _to == address(0), "transfer prohibited"); address _oldCandidate = candidate[_from]; address _newCandidate = candidate[_to]; uint256 _votes = _amount; _transferVotes(_oldCandidate, _newCandidate, _votes); } /** * @dev Implements the vote transfer logic. It will deduct the votes * from one candidate and credit it to another candidate. If * either of candidates is the 0 address, the the voter is either * setting its initial candidate or abstaining himself from voting. * The change is only reflected after the voting interval resets. * We use a 2 element array to keep track of votes. The amount on * position 0 is always the current vote count for the candidate. * The amount on position 1 is a backup that reflect the vote count * prior to the current round only if it has been updated for the * current round. We also record the last voting round where the * candidate balance was updated. If the last round is the current * then we use the backup value on position 1, otherwise we use * the most up to date value on position 0. This function will * emit a ChangeVotes event upon candidate vote balance change. * See _updateVotes(). * @param _oldCandidate The candidate to deduct votes from. * @param _newCandidate The candidate to credit voter for. * @param _votes the number of votes being transfered. */ function _transferVotes(address _oldCandidate, address _newCandidate, uint256 _votes) internal { if (_votes == 0) return; if (_oldCandidate == _newCandidate) return; if (_oldCandidate != address(0)) { // position 0 always has the most up-to-date balance uint256 _oldVotes = voting[_oldCandidate][0]; uint256 _newVotes = _oldVotes.sub(_votes); // updates position 0 backing up the previous amount _updateVotes(_oldCandidate, _newVotes); emit ChangeVotes(_oldCandidate, _oldVotes, _newVotes); } if (_newCandidate != address(0)) { // position 0 always has the most up-to-date balance uint256 _oldVotes = voting[_newCandidate][0]; uint256 _newVotes = _oldVotes.add(_votes); // updates position 0 backing up the previous amount _updateVotes(_newCandidate, _newVotes); emit ChangeVotes(_newCandidate, _oldVotes, _newVotes); } } /** * @dev Updates the candidate's current vote balance (position 0) and * backs up the vote balance for the previous interval (position 1). * The routine makes sure we do not overwrite and corrupt the * backup if multiple vote updates happen within a single roung. * See _transferVotes(). * @param _candidate The candidate for which we are updating the votes. * @param _votes The candidate's new vote balance. */ function _updateVotes(address _candidate, uint256 _votes) internal { uint256 _votingRound = block.timestamp.div(VOTING_ROUND_INTERVAL); // if the candidates voting round is not the current it means // we are updating the voting balance for the first time in // the current round, that is the only time we want to make a // backup of the vote balance for the previous roung if (votingRound[_candidate] < _votingRound) { votingRound[_candidate] = _votingRound; // position 1 is the backup if there are updates in // the current round voting[_candidate][1] = voting[_candidate][0]; } // position 0 always hold the up-to-date vote balance voting[_candidate][0] = _votes; } } // File: contracts/GTokens.sol pragma solidity ^0.6.0; /** * @notice Definition of stkGRO. As a gToken Type 3, it uses GRO as reserve and * burns both reserve and supply with each operation. */ contract stkGRO is GTokenType3 { constructor () GTokenType3("staked GRO", "stkGRO", 18, $.GRO) public { } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_voter","type":"address"},{"indexed":true,"internalType":"address","name":"_oldCandidate","type":"address"},{"indexed":true,"internalType":"address","name":"_newCandidate","type":"address"}],"name":"ChangeCandidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_candidate","type":"address"},{"indexed":false,"internalType":"uint256","name":"_oldVotes","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newVotes","type":"uint256"}],"name":"ChangeVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"_netShares","type":"uint256"},{"internalType":"uint256","name":"_totalReserve","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"name":"calcDepositCostFromShares","outputs":[{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_feeShares","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_totalReserve","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"name":"calcDepositSharesFromCost","outputs":[{"internalType":"uint256","name":"_netShares","type":"uint256"},{"internalType":"uint256","name":"_feeShares","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_grossShares","type":"uint256"},{"internalType":"uint256","name":"_totalReserve","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_withdrawalFee","type":"uint256"}],"name":"calcWithdrawalCostFromShares","outputs":[{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_feeShares","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_totalReserve","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_withdrawalFee","type":"uint256"}],"name":"calcWithdrawalSharesFromCost","outputs":[{"internalType":"uint256","name":"_grossShares","type":"uint256"},{"internalType":"uint256","name":"_feeShares","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"candidate","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint256","name":"_cost","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newCandidate","type":"address"}],"name":"setCandidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReserve","outputs":[{"internalType":"uint256","name":"_totalReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"votes","outputs":[{"internalType":"uint256","name":"_votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_grossShares","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalFee","outputs":[{"internalType":"uint256","name":"_withdrawalFee","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040518060400160405280600a81526020017f7374616b65642047524f000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f73746b47524f000000000000000000000000000000000000000000000000000081525060127309e64c2b61a5f1690ee6fbed9baf5d6990f8dfd083838160039080519060200190620000af9291906200015f565b508060049080519060200190620000c89291906200015f565b506012600560006101000a81548160ff021916908360ff1602179055505050600160068190555062000100826200014160201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250505050505062000205565b80600560006101000a81548160ff021916908360ff16021790555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001a257805160ff1916838001178555620001d3565b82800160010185558215620001d3579182015b82811115620001d2578251825591602001919060010190620001b5565b5b509050620001e29190620001e6565b5090565b5b8082111562000201576000816000905550600101620001e7565b5090565b60805160601c61317a62000241600039806109bc5280610ad25280610c79528061103752806112735280611ca452806125d0525061317a6000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80638bc7e8c4116100c3578063bf4c988e1161007c578063bf4c988e14610405578063d8bff5a514610435578063dd62ed3e14610465578063e7d5f87914610495578063f4325d67146104c6578063f98d98f7146104e457610158565b80638bc7e8c41461031c57806395d89b411461033a57806397f04e2514610358578063a457c2d714610389578063a9059cbb146103b9578063b6b55f25146103e957610158565b8063313ce56711610115578063313ce56714610231578063395093511461024f578063397808f61461027f5780634c68df67146102b057806367a52793146102ce57806370a08231146102ec57610158565b806306fdde031461015d57806307880b7f1461017b578063095ea7b31461019757806318160ddd146101c757806323b872dd146101e55780632e1a7d4d14610215575b600080fd5b610165610515565b6040516101729190612d6c565b60405180910390f35b61019560048036038101906101909190612682565b6105b7565b005b6101b160048036038101906101ac9190612736565b610783565b6040516101be9190612d51565b60405180910390f35b6101cf6107a1565b6040516101dc9190612f0e565b60405180910390f35b6101ff60048036038101906101fa91906126e7565b6107ab565b60405161020c9190612d51565b60405180910390f35b61022f600480360381019061022a9190612772565b610884565b005b610239610b75565b6040516102469190612f7b565b60405180910390f35b61026960048036038101906102649190612736565b610b8c565b6040516102769190612d51565b60405180910390f35b610299600480360381019061029491906127c4565b610c3f565b6040516102a7929190612f52565b60405180910390f35b6102b8610c5b565b6040516102c59190612f0e565b60405180910390f35b6102d6610d09565b6040516102e39190612f0e565b60405180910390f35b61030660048036038101906103019190612682565b610d19565b6040516103139190612f0e565b60405180910390f35b610324610d61565b6040516103319190612f0e565b60405180910390f35b610342610d71565b60405161034f9190612d6c565b60405180910390f35b610372600480360381019061036d91906127c4565b610e13565b604051610380929190612f52565b60405180910390f35b6103a3600480360381019061039e9190612736565b610e2f565b6040516103b09190612d51565b60405180910390f35b6103d360048036038101906103ce9190612736565b610efc565b6040516103e09190612d51565b60405180910390f35b61040360048036038101906103fe9190612772565b610f1a565b005b61041f600480360381019061041a9190612682565b6110da565b60405161042c9190612cc8565b60405180910390f35b61044f600480360381019061044a9190612682565b61110d565b60405161045c9190612f0e565b60405180910390f35b61047f600480360381019061047a91906126ab565b6111ce565b60405161048c9190612f0e565b60405180910390f35b6104af60048036038101906104aa91906127c4565b611255565b6040516104bd929190612f52565b60405180910390f35b6104ce611271565b6040516104db9190612cc8565b60405180910390f35b6104fe60048036038101906104f991906127c4565b611295565b60405161050c929190612f52565b60405180910390f35b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105ad5780601f10610582576101008083540402835291602001916105ad565b820191906000526020600020905b81548152906001019060200180831161059057829003601f168201915b5050505050905090565b600260065414156105fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f490612ece565b60405180910390fd5b60026006819055506000339050600061061582610d19565b90506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506107048185846112b1565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f426a69ad29253c6955e1e1c1aa3d839cb461b956ba993f661a249d20b78ffb0260405160405180910390a4505050600160068190555050565b60006107976107906114f0565b84846114f8565b6001905092915050565b6000600254905090565b60006107b88484846116c3565b610879846107c46114f0565b610874856040518060600160405280602881526020016130f860289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061082a6114f0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119589092919063ffffffff16565b6114f8565b600190509392505050565b600260065414156108ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c190612ece565b60405180910390fd5b600260068190555060003390506000821161091a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091190612dee565b60405180910390fd5b60008061093e84610929610c5b565b6109316107a1565b610939610d61565b6119b3565b9150915060008211610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097c90612e2e565b60405180910390fd5b7367c4621970792023d25a678639cc3a3c94f3d608637ae2b5c7837367c4621970792023d25a678639cc3a3c94f3d60863f8b2cb4f7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016109f79190612cad565b60206040518083038186803b158015610a0f57600080fd5b505af4158015610a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a47919061279b565b6040518363ffffffff1660e01b8152600401610a64929190612f29565b60206040518083038186803b158015610a7c57600080fd5b505af4158015610a90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab4919061279b565b91507367c4621970792023d25a678639cc3a3c94f3d6086312111b487f000000000000000000000000000000000000000000000000000000000000000085856040518463ffffffff1660e01b8152600401610b1193929190612d1a565b60006040518083038186803b158015610b2957600080fd5b505af4158015610b3d573d6000803e3d6000fd5b50505050610b4b8385611a55565b610b67610b62600283611c0390919063ffffffff16565b611c4d565b505050600160068190555050565b6000600560009054906101000a900460ff16905090565b6000610c35610b996114f0565b84610c308560016000610baa6114f0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dab90919063ffffffff16565b6114f8565b6001905092915050565b600080610c4e86868686611e00565b9150915094509492505050565b60007367c4621970792023d25a678639cc3a3c94f3d60863f8b2cb4f7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401610cb49190612cad565b60206040518083038186803b158015610ccc57600080fd5b505af4158015610ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d04919061279b565b905090565b600067016345785d8a0000905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600067016345785d8a0000905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e095780601f10610dde57610100808354040283529160200191610e09565b820191906000526020600020905b815481529060010190602001808311610dec57829003601f168201915b5050505050905090565b600080610e22868686866119b3565b9150915094509492505050565b6000610ef2610e3c6114f0565b84610eed856040518060600160405280602581526020016131206025913960016000610e666114f0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119589092919063ffffffff16565b6114f8565b6001905092915050565b6000610f10610f096114f0565b84846116c3565b6001905092915050565b60026006541415610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5790612ece565b60405180910390fd5b6002600681905550600033905060008211610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa790612e2e565b60405180910390fd5b600080610fd484610fbf610c5b565b610fc76107a1565b610fcf610d09565b611ea2565b915091506000821161101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290612dee565b60405180910390fd5b7367c4621970792023d25a678639cc3a3c94f3d60863201add9b7f000000000000000000000000000000000000000000000000000000000000000085876040518463ffffffff1660e01b815260040161107693929190612d1a565b60006040518083038186803b15801561108e57600080fd5b505af41580156110a2573d6000803e3d6000fd5b505050506110b08383611f44565b6110cc6110c7600283611c0390919063ffffffff16565b611c4d565b505050600160068190555050565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806111266201518042611c0390919063ffffffff16565b9050600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106111b45760016111b7565b60005b60ff16600281106111c457fe5b0154915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080611264868686866120d8565b9150915094509492505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806112a486868686611ea2565b9150915094509492505050565b60008114156112bf576114eb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112f8576114eb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146113f1576000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002811061137957fe5b015490506000611392838361217a90919063ffffffff16565b905061139e85826121c4565b8473ffffffffffffffffffffffffffffffffffffffff167f34db285924a8247034fe18b79b396fd7eb07b41f47a72e7d70e9f0d5c4e7472483836040516113e6929190612f52565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146114ea576000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002811061147257fe5b01549050600061148b8383611dab90919063ffffffff16565b905061149784826121c4565b8373ffffffffffffffffffffffffffffffffffffffff167f34db285924a8247034fe18b79b396fd7eb07b41f47a72e7d70e9f0d5c4e7472483836040516114df929190612f52565b60405180910390a250505b5b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f90612eae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cf90612dce565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516116b69190612f0e565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a90612e8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a90612d8e565b60405180910390fd5b6117ae83838361235d565b611819816040518060600160405280602681526020016130d2602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119589092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118ac816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dab90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161194b9190612f0e565b60405180910390a3505050565b60008383111582906119a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119979190612d6c565b60405180910390fd5b5060008385039050809150509392505050565b60008060006119ff670de0b6b3a76400006119f16119e287670de0b6b3a764000061217a90919063ffffffff16565b8a6124e390919063ffffffff16565b611c0390919063ffffffff16565b9050848114611a3257611a2d85611a1f88846124e390919063ffffffff16565b611c0390919063ffffffff16565b611a34565b855b9250611a49818861217a90919063ffffffff16565b91505094509492505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc90612e6e565b60405180910390fd5b611ad18260008361235d565b611b3c816040518060600160405280602281526020016130b0602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119589092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b938160025461217a90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611bf79190612f0e565b60405180910390a35050565b6000611c4583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612553565b905092915050565b6000611c6a82611c5b610c5b565b611c636107a1565b60006119b3565b5090507367c4621970792023d25a678639cc3a3c94f3d608637ae2b5c7827367c4621970792023d25a678639cc3a3c94f3d60863f8b2cb4f7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401611cdf9190612cad565b60206040518083038186803b158015611cf757600080fd5b505af4158015611d0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2f919061279b565b6040518363ffffffff1660e01b8152600401611d4c929190612f29565b60206040518083038186803b158015611d6457600080fd5b505af4158015611d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9c919061279b565b9050611da7816125b4565b5050565b600080828401905083811015611df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ded90612e0e565b60405180910390fd5b8091505092915050565b6000806000858714611e3657611e3186611e23878a6124e390919063ffffffff16565b611c0390919063ffffffff16565b611e38565b845b9050611e81611e5885670de0b6b3a764000061217a90919063ffffffff16565b611e73670de0b6b3a7640000846124e390919063ffffffff16565b611c0390919063ffffffff16565b9250611e96818461217a90919063ffffffff16565b91505094509492505050565b6000806000858514611ed857611ed386611ec5878a6124e390919063ffffffff16565b611c0390919063ffffffff16565b611eda565b865b9050611f23670de0b6b3a7640000611f15611f0687670de0b6b3a764000061217a90919063ffffffff16565b846124e390919063ffffffff16565b611c0390919063ffffffff16565b9250611f38838261217a90919063ffffffff16565b91505094509492505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab90612eee565b60405180910390fd5b611fc06000838361235d565b611fd581600254611dab90919063ffffffff16565b60028190555061202c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dab90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120cc9190612f0e565b60405180910390a35050565b60008060006121246120fb85670de0b6b3a764000061217a90919063ffffffff16565b612116670de0b6b3a76400008a6124e390919063ffffffff16565b611c0390919063ffffffff16565b9050848614612157576121528561214488846124e390919063ffffffff16565b611c0390919063ffffffff16565b612159565b805b925061216e878261217a90919063ffffffff16565b91505094509492505050565b60006121bc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611958565b905092915050565b60006121dc6201518042611c0390919063ffffffff16565b905080600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156123075780600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600281106122b457fe5b0154600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060016002811061230157fe5b01819055505b81600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002811061235357fe5b0181905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806123c45750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b612403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fa90612dae565b60405180910390fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008390506124db8383836112b1565b505050505050565b6000808314156124f6576000905061254d565b600082840290508284828161250757fe5b0414612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f90612e4e565b60405180910390fd5b809150505b92915050565b6000808311829061259a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125919190612d6c565b60405180910390fd5b5060008385816125a657fe5b049050809150509392505050565b7367c4621970792023d25a678639cc3a3c94f3d6086312111b487f00000000000000000000000000000000000000000000000000000000000000006000846040518463ffffffff1660e01b815260040161261093929190612ce3565b60006040518083038186803b15801561262857600080fd5b505af415801561263c573d6000803e3d6000fd5b5050505050565b60008135905061265281613081565b92915050565b60008135905061266781613098565b92915050565b60008151905061267c81613098565b92915050565b60006020828403121561269457600080fd5b60006126a284828501612643565b91505092915050565b600080604083850312156126be57600080fd5b60006126cc85828601612643565b92505060206126dd85828601612643565b9150509250929050565b6000806000606084860312156126fc57600080fd5b600061270a86828701612643565b935050602061271b86828701612643565b925050604061272c86828701612658565b9150509250925092565b6000806040838503121561274957600080fd5b600061275785828601612643565b925050602061276885828601612658565b9150509250929050565b60006020828403121561278457600080fd5b600061279284828501612658565b91505092915050565b6000602082840312156127ad57600080fd5b60006127bb8482850161266d565b91505092915050565b600080600080608085870312156127da57600080fd5b60006127e887828801612658565b94505060206127f987828801612658565b935050604061280a87828801612658565b925050606061281b87828801612658565b91505092959194509250565b61283081613007565b82525050565b61283f81612fb2565b82525050565b61284e81612fb2565b82525050565b61285d81612fc4565b82525050565b600061286e82612f96565b6128788185612fa1565b935061288881856020860161303d565b61289181613070565b840191505092915050565b60006128a9602383612fa1565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061290f601383612fa1565b91507f7472616e736665722070726f68696269746564000000000000000000000000006000830152602082019050919050565b600061294f602283612fa1565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006129b5601d83612fa1565b91507f736861726573206d7573742062652067726561746572207468616e20300000006000830152602082019050919050565b60006129f5601b83612fa1565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000612a35601b83612fa1565b91507f636f7374206d7573742062652067726561746572207468616e203000000000006000830152602082019050919050565b6000612a75602183612fa1565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612adb602183612fa1565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b41602583612fa1565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ba7602483612fa1565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c0d601f83612fa1565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000612c4d601f83612fa1565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b612c8981612ff0565b82525050565b612c9881612ff0565b82525050565b612ca781612ffa565b82525050565b6000602082019050612cc26000830184612845565b92915050565b6000602082019050612cdd6000830184612836565b92915050565b6000606082019050612cf86000830186612845565b612d056020830185612827565b612d126040830184612c8f565b949350505050565b6000606082019050612d2f6000830186612845565b612d3c6020830185612845565b612d496040830184612c8f565b949350505050565b6000602082019050612d666000830184612854565b92915050565b60006020820190508181036000830152612d868184612863565b905092915050565b60006020820190508181036000830152612da78161289c565b9050919050565b60006020820190508181036000830152612dc781612902565b9050919050565b60006020820190508181036000830152612de781612942565b9050919050565b60006020820190508181036000830152612e07816129a8565b9050919050565b60006020820190508181036000830152612e27816129e8565b9050919050565b60006020820190508181036000830152612e4781612a28565b9050919050565b60006020820190508181036000830152612e6781612a68565b9050919050565b60006020820190508181036000830152612e8781612ace565b9050919050565b60006020820190508181036000830152612ea781612b34565b9050919050565b60006020820190508181036000830152612ec781612b9a565b9050919050565b60006020820190508181036000830152612ee781612c00565b9050919050565b60006020820190508181036000830152612f0781612c40565b9050919050565b6000602082019050612f236000830184612c80565b92915050565b6000604082019050612f3e6000830185612c8f565b612f4b6020830184612c8f565b9392505050565b6000604082019050612f676000830185612c80565b612f746020830184612c80565b9392505050565b6000602082019050612f906000830184612c9e565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612fbd82612fd0565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061301282613019565b9050919050565b60006130248261302b565b9050919050565b600061303682612fd0565b9050919050565b60005b8381101561305b578082015181840152602081019050613040565b8381111561306a576000848401525b50505050565b6000601f19601f8301169050919050565b61308a81612fb2565b811461309557600080fd5b50565b6130a181612ff0565b81146130ac57600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122000dd0ede69c7ba5667a3d3ea358c9adea596234057501c4698dc590a7cc38eab64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c80638bc7e8c4116100c3578063bf4c988e1161007c578063bf4c988e14610405578063d8bff5a514610435578063dd62ed3e14610465578063e7d5f87914610495578063f4325d67146104c6578063f98d98f7146104e457610158565b80638bc7e8c41461031c57806395d89b411461033a57806397f04e2514610358578063a457c2d714610389578063a9059cbb146103b9578063b6b55f25146103e957610158565b8063313ce56711610115578063313ce56714610231578063395093511461024f578063397808f61461027f5780634c68df67146102b057806367a52793146102ce57806370a08231146102ec57610158565b806306fdde031461015d57806307880b7f1461017b578063095ea7b31461019757806318160ddd146101c757806323b872dd146101e55780632e1a7d4d14610215575b600080fd5b610165610515565b6040516101729190612d6c565b60405180910390f35b61019560048036038101906101909190612682565b6105b7565b005b6101b160048036038101906101ac9190612736565b610783565b6040516101be9190612d51565b60405180910390f35b6101cf6107a1565b6040516101dc9190612f0e565b60405180910390f35b6101ff60048036038101906101fa91906126e7565b6107ab565b60405161020c9190612d51565b60405180910390f35b61022f600480360381019061022a9190612772565b610884565b005b610239610b75565b6040516102469190612f7b565b60405180910390f35b61026960048036038101906102649190612736565b610b8c565b6040516102769190612d51565b60405180910390f35b610299600480360381019061029491906127c4565b610c3f565b6040516102a7929190612f52565b60405180910390f35b6102b8610c5b565b6040516102c59190612f0e565b60405180910390f35b6102d6610d09565b6040516102e39190612f0e565b60405180910390f35b61030660048036038101906103019190612682565b610d19565b6040516103139190612f0e565b60405180910390f35b610324610d61565b6040516103319190612f0e565b60405180910390f35b610342610d71565b60405161034f9190612d6c565b60405180910390f35b610372600480360381019061036d91906127c4565b610e13565b604051610380929190612f52565b60405180910390f35b6103a3600480360381019061039e9190612736565b610e2f565b6040516103b09190612d51565b60405180910390f35b6103d360048036038101906103ce9190612736565b610efc565b6040516103e09190612d51565b60405180910390f35b61040360048036038101906103fe9190612772565b610f1a565b005b61041f600480360381019061041a9190612682565b6110da565b60405161042c9190612cc8565b60405180910390f35b61044f600480360381019061044a9190612682565b61110d565b60405161045c9190612f0e565b60405180910390f35b61047f600480360381019061047a91906126ab565b6111ce565b60405161048c9190612f0e565b60405180910390f35b6104af60048036038101906104aa91906127c4565b611255565b6040516104bd929190612f52565b60405180910390f35b6104ce611271565b6040516104db9190612cc8565b60405180910390f35b6104fe60048036038101906104f991906127c4565b611295565b60405161050c929190612f52565b60405180910390f35b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105ad5780601f10610582576101008083540402835291602001916105ad565b820191906000526020600020905b81548152906001019060200180831161059057829003601f168201915b5050505050905090565b600260065414156105fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f490612ece565b60405180910390fd5b60026006819055506000339050600061061582610d19565b90506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506107048185846112b1565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f426a69ad29253c6955e1e1c1aa3d839cb461b956ba993f661a249d20b78ffb0260405160405180910390a4505050600160068190555050565b60006107976107906114f0565b84846114f8565b6001905092915050565b6000600254905090565b60006107b88484846116c3565b610879846107c46114f0565b610874856040518060600160405280602881526020016130f860289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061082a6114f0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119589092919063ffffffff16565b6114f8565b600190509392505050565b600260065414156108ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c190612ece565b60405180910390fd5b600260068190555060003390506000821161091a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091190612dee565b60405180910390fd5b60008061093e84610929610c5b565b6109316107a1565b610939610d61565b6119b3565b9150915060008211610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097c90612e2e565b60405180910390fd5b7367c4621970792023d25a678639cc3a3c94f3d608637ae2b5c7837367c4621970792023d25a678639cc3a3c94f3d60863f8b2cb4f7f00000000000000000000000009e64c2b61a5f1690ee6fbed9baf5d6990f8dfd06040518263ffffffff1660e01b81526004016109f79190612cad565b60206040518083038186803b158015610a0f57600080fd5b505af4158015610a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a47919061279b565b6040518363ffffffff1660e01b8152600401610a64929190612f29565b60206040518083038186803b158015610a7c57600080fd5b505af4158015610a90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab4919061279b565b91507367c4621970792023d25a678639cc3a3c94f3d6086312111b487f00000000000000000000000009e64c2b61a5f1690ee6fbed9baf5d6990f8dfd085856040518463ffffffff1660e01b8152600401610b1193929190612d1a565b60006040518083038186803b158015610b2957600080fd5b505af4158015610b3d573d6000803e3d6000fd5b50505050610b4b8385611a55565b610b67610b62600283611c0390919063ffffffff16565b611c4d565b505050600160068190555050565b6000600560009054906101000a900460ff16905090565b6000610c35610b996114f0565b84610c308560016000610baa6114f0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dab90919063ffffffff16565b6114f8565b6001905092915050565b600080610c4e86868686611e00565b9150915094509492505050565b60007367c4621970792023d25a678639cc3a3c94f3d60863f8b2cb4f7f00000000000000000000000009e64c2b61a5f1690ee6fbed9baf5d6990f8dfd06040518263ffffffff1660e01b8152600401610cb49190612cad565b60206040518083038186803b158015610ccc57600080fd5b505af4158015610ce0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d04919061279b565b905090565b600067016345785d8a0000905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600067016345785d8a0000905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e095780601f10610dde57610100808354040283529160200191610e09565b820191906000526020600020905b815481529060010190602001808311610dec57829003601f168201915b5050505050905090565b600080610e22868686866119b3565b9150915094509492505050565b6000610ef2610e3c6114f0565b84610eed856040518060600160405280602581526020016131206025913960016000610e666114f0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119589092919063ffffffff16565b6114f8565b6001905092915050565b6000610f10610f096114f0565b84846116c3565b6001905092915050565b60026006541415610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5790612ece565b60405180910390fd5b6002600681905550600033905060008211610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa790612e2e565b60405180910390fd5b600080610fd484610fbf610c5b565b610fc76107a1565b610fcf610d09565b611ea2565b915091506000821161101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290612dee565b60405180910390fd5b7367c4621970792023d25a678639cc3a3c94f3d60863201add9b7f00000000000000000000000009e64c2b61a5f1690ee6fbed9baf5d6990f8dfd085876040518463ffffffff1660e01b815260040161107693929190612d1a565b60006040518083038186803b15801561108e57600080fd5b505af41580156110a2573d6000803e3d6000fd5b505050506110b08383611f44565b6110cc6110c7600283611c0390919063ffffffff16565b611c4d565b505050600160068190555050565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806111266201518042611c0390919063ffffffff16565b9050600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106111b45760016111b7565b60005b60ff16600281106111c457fe5b0154915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080611264868686866120d8565b9150915094509492505050565b7f00000000000000000000000009e64c2b61a5f1690ee6fbed9baf5d6990f8dfd081565b6000806112a486868686611ea2565b9150915094509492505050565b60008114156112bf576114eb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112f8576114eb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146113f1576000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002811061137957fe5b015490506000611392838361217a90919063ffffffff16565b905061139e85826121c4565b8473ffffffffffffffffffffffffffffffffffffffff167f34db285924a8247034fe18b79b396fd7eb07b41f47a72e7d70e9f0d5c4e7472483836040516113e6929190612f52565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146114ea576000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002811061147257fe5b01549050600061148b8383611dab90919063ffffffff16565b905061149784826121c4565b8373ffffffffffffffffffffffffffffffffffffffff167f34db285924a8247034fe18b79b396fd7eb07b41f47a72e7d70e9f0d5c4e7472483836040516114df929190612f52565b60405180910390a250505b5b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f90612eae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cf90612dce565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516116b69190612f0e565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a90612e8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a90612d8e565b60405180910390fd5b6117ae83838361235d565b611819816040518060600160405280602681526020016130d2602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119589092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118ac816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dab90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161194b9190612f0e565b60405180910390a3505050565b60008383111582906119a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119979190612d6c565b60405180910390fd5b5060008385039050809150509392505050565b60008060006119ff670de0b6b3a76400006119f16119e287670de0b6b3a764000061217a90919063ffffffff16565b8a6124e390919063ffffffff16565b611c0390919063ffffffff16565b9050848114611a3257611a2d85611a1f88846124e390919063ffffffff16565b611c0390919063ffffffff16565b611a34565b855b9250611a49818861217a90919063ffffffff16565b91505094509492505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc90612e6e565b60405180910390fd5b611ad18260008361235d565b611b3c816040518060600160405280602281526020016130b0602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119589092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b938160025461217a90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611bf79190612f0e565b60405180910390a35050565b6000611c4583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612553565b905092915050565b6000611c6a82611c5b610c5b565b611c636107a1565b60006119b3565b5090507367c4621970792023d25a678639cc3a3c94f3d608637ae2b5c7827367c4621970792023d25a678639cc3a3c94f3d60863f8b2cb4f7f00000000000000000000000009e64c2b61a5f1690ee6fbed9baf5d6990f8dfd06040518263ffffffff1660e01b8152600401611cdf9190612cad565b60206040518083038186803b158015611cf757600080fd5b505af4158015611d0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2f919061279b565b6040518363ffffffff1660e01b8152600401611d4c929190612f29565b60206040518083038186803b158015611d6457600080fd5b505af4158015611d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9c919061279b565b9050611da7816125b4565b5050565b600080828401905083811015611df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ded90612e0e565b60405180910390fd5b8091505092915050565b6000806000858714611e3657611e3186611e23878a6124e390919063ffffffff16565b611c0390919063ffffffff16565b611e38565b845b9050611e81611e5885670de0b6b3a764000061217a90919063ffffffff16565b611e73670de0b6b3a7640000846124e390919063ffffffff16565b611c0390919063ffffffff16565b9250611e96818461217a90919063ffffffff16565b91505094509492505050565b6000806000858514611ed857611ed386611ec5878a6124e390919063ffffffff16565b611c0390919063ffffffff16565b611eda565b865b9050611f23670de0b6b3a7640000611f15611f0687670de0b6b3a764000061217a90919063ffffffff16565b846124e390919063ffffffff16565b611c0390919063ffffffff16565b9250611f38838261217a90919063ffffffff16565b91505094509492505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab90612eee565b60405180910390fd5b611fc06000838361235d565b611fd581600254611dab90919063ffffffff16565b60028190555061202c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dab90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120cc9190612f0e565b60405180910390a35050565b60008060006121246120fb85670de0b6b3a764000061217a90919063ffffffff16565b612116670de0b6b3a76400008a6124e390919063ffffffff16565b611c0390919063ffffffff16565b9050848614612157576121528561214488846124e390919063ffffffff16565b611c0390919063ffffffff16565b612159565b805b925061216e878261217a90919063ffffffff16565b91505094509492505050565b60006121bc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611958565b905092915050565b60006121dc6201518042611c0390919063ffffffff16565b905080600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156123075780600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600281106122b457fe5b0154600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060016002811061230157fe5b01819055505b81600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002811061235357fe5b0181905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806123c45750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b612403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fa90612dae565b60405180910390fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008390506124db8383836112b1565b505050505050565b6000808314156124f6576000905061254d565b600082840290508284828161250757fe5b0414612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f90612e4e565b60405180910390fd5b809150505b92915050565b6000808311829061259a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125919190612d6c565b60405180910390fd5b5060008385816125a657fe5b049050809150509392505050565b7367c4621970792023d25a678639cc3a3c94f3d6086312111b487f00000000000000000000000009e64c2b61a5f1690ee6fbed9baf5d6990f8dfd06000846040518463ffffffff1660e01b815260040161261093929190612ce3565b60006040518083038186803b15801561262857600080fd5b505af415801561263c573d6000803e3d6000fd5b5050505050565b60008135905061265281613081565b92915050565b60008135905061266781613098565b92915050565b60008151905061267c81613098565b92915050565b60006020828403121561269457600080fd5b60006126a284828501612643565b91505092915050565b600080604083850312156126be57600080fd5b60006126cc85828601612643565b92505060206126dd85828601612643565b9150509250929050565b6000806000606084860312156126fc57600080fd5b600061270a86828701612643565b935050602061271b86828701612643565b925050604061272c86828701612658565b9150509250925092565b6000806040838503121561274957600080fd5b600061275785828601612643565b925050602061276885828601612658565b9150509250929050565b60006020828403121561278457600080fd5b600061279284828501612658565b91505092915050565b6000602082840312156127ad57600080fd5b60006127bb8482850161266d565b91505092915050565b600080600080608085870312156127da57600080fd5b60006127e887828801612658565b94505060206127f987828801612658565b935050604061280a87828801612658565b925050606061281b87828801612658565b91505092959194509250565b61283081613007565b82525050565b61283f81612fb2565b82525050565b61284e81612fb2565b82525050565b61285d81612fc4565b82525050565b600061286e82612f96565b6128788185612fa1565b935061288881856020860161303d565b61289181613070565b840191505092915050565b60006128a9602383612fa1565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061290f601383612fa1565b91507f7472616e736665722070726f68696269746564000000000000000000000000006000830152602082019050919050565b600061294f602283612fa1565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006129b5601d83612fa1565b91507f736861726573206d7573742062652067726561746572207468616e20300000006000830152602082019050919050565b60006129f5601b83612fa1565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000612a35601b83612fa1565b91507f636f7374206d7573742062652067726561746572207468616e203000000000006000830152602082019050919050565b6000612a75602183612fa1565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612adb602183612fa1565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b41602583612fa1565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ba7602483612fa1565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c0d601f83612fa1565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000612c4d601f83612fa1565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b612c8981612ff0565b82525050565b612c9881612ff0565b82525050565b612ca781612ffa565b82525050565b6000602082019050612cc26000830184612845565b92915050565b6000602082019050612cdd6000830184612836565b92915050565b6000606082019050612cf86000830186612845565b612d056020830185612827565b612d126040830184612c8f565b949350505050565b6000606082019050612d2f6000830186612845565b612d3c6020830185612845565b612d496040830184612c8f565b949350505050565b6000602082019050612d666000830184612854565b92915050565b60006020820190508181036000830152612d868184612863565b905092915050565b60006020820190508181036000830152612da78161289c565b9050919050565b60006020820190508181036000830152612dc781612902565b9050919050565b60006020820190508181036000830152612de781612942565b9050919050565b60006020820190508181036000830152612e07816129a8565b9050919050565b60006020820190508181036000830152612e27816129e8565b9050919050565b60006020820190508181036000830152612e4781612a28565b9050919050565b60006020820190508181036000830152612e6781612a68565b9050919050565b60006020820190508181036000830152612e8781612ace565b9050919050565b60006020820190508181036000830152612ea781612b34565b9050919050565b60006020820190508181036000830152612ec781612b9a565b9050919050565b60006020820190508181036000830152612ee781612c00565b9050919050565b60006020820190508181036000830152612f0781612c40565b9050919050565b6000602082019050612f236000830184612c80565b92915050565b6000604082019050612f3e6000830185612c8f565b612f4b6020830184612c8f565b9392505050565b6000604082019050612f676000830185612c80565b612f746020830184612c80565b9392505050565b6000602082019050612f906000830184612c9e565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612fbd82612fd0565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061301282613019565b9050919050565b60006130248261302b565b9050919050565b600061303682612fd0565b9050919050565b60005b8381101561305b578082015181840152602081019050613040565b8381111561306a576000848401525b50505050565b6000601f19601f8301169050919050565b61308a81612fb2565b811461309557600080fd5b50565b6130a181612ff0565b81146130ac57600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122000dd0ede69c7ba5667a3d3ea358c9adea596234057501c4698dc590a7cc38eab64736f6c634300060c0033
Deployed Bytecode Sourcemap
58151:118:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17474:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52289:356;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19580:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18549:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20223:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51397:542;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18401:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20953:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46110:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;47588:130;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48114:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18712:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48630:110;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17676:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47029:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;21674:269;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19044:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50337:469;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43042:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49284:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19282:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45197:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;42990:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44293:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;17474:83;17511:13;17544:5;17537:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17474:83;:::o;52289:356::-;28022:1;28628:7;;:19;;28620:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28022:1;28761:7;:18;;;;52370:14:::1;52387:10;52370:27;;52402:14;52419:17;52429:6;52419:9;:17::i;:::-;52402:34;;52441:21;52465:9;:17;52475:6;52465:17;;;;;;;;;;;;;;;;;;;;;;;;;52441:41;;52507:13;52487:9;:17;52497:6;52487:17;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;52525:52;52540:13;52555;52570:6;52525:14;:52::i;:::-;52626:13;52587:53;;52611:13;52587:53;;52603:6;52587:53;;;;;;;;;;;;28792:1;;;27978::::0;28940:7;:22;;;;52289:356;:::o;19580:169::-;19663:4;19680:39;19689:12;:10;:12::i;:::-;19703:7;19712:6;19680:8;:39::i;:::-;19737:4;19730:11;;19580:169;;;;:::o;18549:100::-;18602:7;18629:12;;18622:19;;18549:100;:::o;20223:321::-;20329:4;20346:36;20356:6;20364:9;20375:6;20346:9;:36::i;:::-;20393:121;20402:6;20410:12;:10;:12::i;:::-;20424:89;20462:6;20424:89;;;;;;;;;;;;;;;;;:11;:19;20436:6;20424:19;;;;;;;;;;;;;;;:33;20444:12;:10;:12::i;:::-;20424:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;20393:8;:121::i;:::-;20532:4;20525:11;;20223:321;;;;;:::o;51397:542::-;28022:1;28628:7;;:19;;28620:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28022:1;28761:7;:18;;;;51473:13:::1;51489:10;51473:26;;51527:1;51512:12;:16;51504:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51568:13;51583:18:::0;51605:101:::1;51645:12;51659:14;:12;:14::i;:::-;51675:13;:11;:13::i;:::-;51690:15;:13;:15::i;:::-;51605:39;:101::i;:::-;51567:139;;;;51727:1;51719:5;:9;51711:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;51773:1;:5;51779;51786:1;:12;51799;51786:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51773:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51765:48;;51818:1;:11;51830:12;51844:5;51851;51818:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51862:26;51868:5;51875:12;51862:5;:26::i;:::-;51893:41;51916:17;51931:1;51916:10;:14;;:17;;;;:::i;:::-;51893:22;:41::i;:::-;28792:1;;;27978::::0;28940:7;:22;;;;51397:542;:::o;18401:83::-;18442:5;18467:9;;;;;;;;;;;18460:16;;18401:83;:::o;20953:218::-;21041:4;21058:83;21067:12;:10;:12::i;:::-;21081:7;21090:50;21129:10;21090:11;:25;21102:12;:10;:12::i;:::-;21090:25;;;;;;;;;;;;;;;:34;21116:7;21090:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;21058:8;:83::i;:::-;21159:4;21152:11;;20953:218;;;;:::o;46110:304::-;46262:20;46284:18;46318:91;46358:5;46365:13;46380:12;46394:14;46318:39;:91::i;:::-;46311:98;;;;46110:304;;;;;;;:::o;47588:130::-;47650:21;47687:1;:12;47700;47687:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47680:33;;47588:130;:::o;48114:101::-;48166:19;42869:5;48192:18;;48114:101;:::o;18712:119::-;18778:7;18805:9;:18;18815:7;18805:18;;;;;;;;;;;;;;;;18798:25;;18712:119;;;:::o;48630:110::-;48685:22;42919:5;48714:21;;48630:110;:::o;17676:87::-;17715:13;17748:7;17741:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17676:87;:::o;47029:311::-;47188:13;47203:18;47237:98;47277:12;47291:13;47306:12;47320:14;47237:39;:98::i;:::-;47230:105;;;;47029:311;;;;;;;:::o;21674:269::-;21767:4;21784:129;21793:12;:10;:12::i;:::-;21807:7;21816:96;21855:15;21816:96;;;;;;;;;;;;;;;;;:11;:25;21828:12;:10;:12::i;:::-;21816:25;;;;;;;;;;;;;;;:34;21842:7;21816:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;21784:8;:129::i;:::-;21931:4;21924:11;;21674:269;;;;:::o;19044:175::-;19130:4;19147:42;19157:12;:10;:12::i;:::-;19171:9;19182:6;19147:9;:42::i;:::-;19207:4;19200:11;;19044:175;;;;:::o;50337:469::-;28022:1;28628:7;;:19;;28620:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28022:1;28761:7;:18;;;;50405:13:::1;50421:10;50405:26;;50452:1;50444:5;:9;50436:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;50491:18;50511::::0;50533:88:::1;50570:5;50577:14;:12;:14::i;:::-;50593:13;:11;:13::i;:::-;50608:12;:10;:12::i;:::-;50533:36;:88::i;:::-;50490:131;;;;50647:1;50634:10;:14;50626:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;50687:1;:11;50699:12;50713:5;50720;50687:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50731:24;50737:5;50744:10;50731:5;:24::i;:::-;50760:41;50783:17;50798:1;50783:10;:14;;:17;;;;:::i;:::-;50760:22;:41::i;:::-;28792:1;;;27978::::0;28940:7;:22;;;;50337:469;:::o;43042:54::-;;;;;;;;;;;;;;;;;;;;;;:::o;49284:408::-;49349:14;49372:20;49395:42;42978:6;49395:15;:19;;:42;;;;:::i;:::-;49372:65;;49621:6;:18;49628:10;49621:18;;;;;;;;;;;;;;;49666:12;49640:11;:23;49652:10;49640:23;;;;;;;;;;;;;;;;:38;:46;;49685:1;49640:46;;;49681:1;49640:46;49621:66;;;;;;;;;;;49614:73;;;49284:408;;;:::o;19282:151::-;19371:7;19398:11;:18;19410:5;19398:18;;;;;;;;;;;;;;;:27;19417:7;19398:27;;;;;;;;;;;;;;;;19391:34;;19282:151;;;;:::o;45197:295::-;45348:13;45363:18;45397:90;45434:10;45446:13;45461:12;45475:11;45397:36;:90::i;:::-;45390:97;;;;45197:295;;;;;;;:::o;42990:46::-;;;:::o;44293:290::-;44439:18;44459;44493:85;44530:5;44537:13;44552:12;44566:11;44493:36;:85::i;:::-;44486:92;;;;44293:290;;;;;;;:::o;55862:891::-;55978:1;55968:6;:11;55964:24;;;55981:7;;55964:24;56013:13;55996:30;;:13;:30;;;55992:43;;;56028:7;;55992:43;56068:1;56043:27;;:13;:27;;;56039:353;;56135:17;56155:6;:21;56162:13;56155:21;;;;;;;;;;;;;;;56177:1;56155:24;;;;;;;;;56135:44;;56185:17;56205:21;56219:6;56205:9;:13;;:21;;;;:::i;:::-;56185:41;;56289:38;56302:13;56317:9;56289:12;:38::i;:::-;56350:13;56338:48;;;56365:9;56376;56338:48;;;;;;;:::i;:::-;;;;;;;;56039:353;;;56425:1;56400:27;;:13;:27;;;56396:353;;56492:17;56512:6;:21;56519:13;56512:21;;;;;;;;;;;;;;;56534:1;56512:24;;;;;;;;;56492:44;;56542:17;56562:21;56576:6;56562:9;:13;;:21;;;;:::i;:::-;56542:41;;56646:38;56659:13;56674:9;56646:12;:38::i;:::-;56707:13;56695:48;;;56722:9;56733;56695:48;;;;;;;:::i;:::-;;;;;;;;56396:353;;;55862:891;;;;:::o;6086:106::-;6139:15;6174:10;6167:17;;6086:106;:::o;24819:346::-;24938:1;24921:19;;:5;:19;;;;24913:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25019:1;25000:21;;:7;:21;;;;24992:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25103:6;25073:11;:18;25085:5;25073:18;;;;;;;;;;;;;;;:27;25092:7;25073:27;;;;;;;;;;;;;;;:36;;;;25141:7;25125:32;;25134:5;25125:32;;;25150:6;25125:32;;;;;;:::i;:::-;;;;;;;;24819:346;;;:::o;22433:539::-;22557:1;22539:20;;:6;:20;;;;22531:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;22641:1;22620:23;;:9;:23;;;;22612:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;22696:47;22717:6;22725:9;22736:6;22696:20;:47::i;:::-;22776:71;22798:6;22776:71;;;;;;;;;;;;;;;;;:9;:17;22786:6;22776:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;22756:9;:17;22766:6;22756:17;;;;;;;;;;;;;;;:91;;;;22881:32;22906:6;22881:9;:20;22891:9;22881:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;22858:9;:20;22868:9;22858:20;;;;;;;;;;;;;;;:55;;;;22946:9;22929:35;;22938:6;22929:35;;;22957:6;22929:35;;;;;;:::i;:::-;;;;;;;;22433:539;;;:::o;1905:192::-;1991:7;2024:1;2019;:6;;2027:12;2011:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2051:9;2067:1;2063;:5;2051:17;;2088:1;2081:8;;;1905:192;;;;;:::o;33815:464::-;33968:13;33983:18;34010;34031:61;34087:4;34031:51;34048:33;34066:14;34056:4;34048:17;;:33;;;;:::i;:::-;34031:12;:16;;:51;;;;:::i;:::-;:55;;:61;;;;:::i;:::-;34010:82;;34119:12;34105:10;:26;:92;;34150:47;34184:12;34150:29;34165:13;34150:10;:14;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;34105:92;;;34134:13;34105:92;34097:100;;34215:28;34232:10;34215:12;:16;;:28;;;;:::i;:::-;34202:41;;34248:26;33815:464;;;;;;;:::o;23963:418::-;24066:1;24047:21;;:7;:21;;;;24039:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24119:49;24140:7;24157:1;24161:6;24119:20;:49::i;:::-;24202:68;24225:6;24202:68;;;;;;;;;;;;;;;;;:9;:18;24212:7;24202:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;24181:9;:18;24191:7;24181:18;;;;;;;;;;;;;;;:89;;;;24296:24;24313:6;24296:12;;:16;;:24;;;;:::i;:::-;24281:12;:39;;;;24362:1;24336:37;;24345:7;24336:37;;;24366:6;24336:37;;;;;;:::i;:::-;;;;;;;;23963:418;;:::o;3303:132::-;3361:7;3388:39;3392:1;3395;3388:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3381:46;;3303:132;;;;:::o;52895:444::-;53152:13;53170:87;53210:12;53224:14;:12;:14::i;:::-;53240:13;:11;:13::i;:::-;53255:1;53170:39;:87::i;:::-;53151:106;;;53270:1;:5;53276;53283:1;:12;53296;53283:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53270:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53262:48;;53315:19;53328:5;53315:12;:19::i;:::-;52895:444;;:::o;1002:181::-;1060:7;1080:9;1096:1;1092;:5;1080:17;;1121:1;1116;:6;;1108:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;1174:1;1167:8;;;1002:181;;;;:::o;33140:466::-;33286:20;33308:18;33335;33365:13;33356:5;:22;:82;;33396:42;33424:13;33396:23;33406:12;33396:5;:9;;:23;;;;:::i;:::-;:27;;:42;;;;:::i;:::-;33356:82;;;33381:12;33356:82;33335:103;;33458:59;33483:33;33501:14;33491:4;33483:17;;:33;;;;:::i;:::-;33458:20;33473:4;33458:10;:14;;:20;;;;:::i;:::-;:24;;:59;;;;:::i;:::-;33443:74;;33535:28;33552:10;33535:12;:16;;:28;;;;:::i;:::-;33522:41;;33568:33;33140:466;;;;;;;:::o;31797:455::-;31937:18;31957;31984:20;32023:13;32007:12;:29;:82;;32047:42;32075:13;32047:23;32057:12;32047:5;:9;;:23;;;;:::i;:::-;:27;;:42;;;;:::i;:::-;32007:82;;;32039:5;32007:82;31984:105;;32107:58;32160:4;32107:48;32124:30;32142:11;32132:4;32124:17;;:30;;;;:::i;:::-;32107:12;:16;;:48;;;;:::i;:::-;:52;;:58;;;;:::i;:::-;32094:71;;32183:28;32200:10;32183:12;:16;;:28;;;;:::i;:::-;32170:41;;32216:31;31797:455;;;;;;;:::o;23253:378::-;23356:1;23337:21;;:7;:21;;;;23329:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;23407:49;23436:1;23440:7;23449:6;23407:20;:49::i;:::-;23484:24;23501:6;23484:12;;:16;;:24;;;;:::i;:::-;23469:12;:39;;;;23540:30;23563:6;23540:9;:18;23550:7;23540:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;23519:9;:18;23529:7;23519:18;;;;;;;;;;;;;;;:51;;;;23607:7;23586:37;;23603:1;23586:37;;;23616:6;23586:37;;;;;;:::i;:::-;;;;;;;;23253:378;;:::o;32466:457::-;32611:13;32626:18;32653:20;32676:56;32701:30;32719:11;32709:4;32701:17;;:30;;;;:::i;:::-;32676:20;32691:4;32676:10;:14;;:20;;;;:::i;:::-;:24;;:56;;;;:::i;:::-;32653:79;;32762:12;32745:13;:29;:96;;32792:49;32828:12;32792:31;32809:13;32792:12;:16;;:31;;;;:::i;:::-;:35;;:49;;;;:::i;:::-;32745:96;;;32777:12;32745:96;32737:104;;32859:28;32876:10;32859:12;:16;;:28;;;;:::i;:::-;32846:41;;32892:26;32466:457;;;;;;;:::o;1466:136::-;1524:7;1551:43;1555:1;1558;1551:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1544:50;;1466:136;;;;:::o;57218:715::-;57292:20;57315:42;42978:6;57315:15;:19;;:42;;;;:::i;:::-;57292:65;;57641:12;57615:11;:23;57627:10;57615:23;;;;;;;;;;;;;;;;:38;57611:226;;;57687:12;57661:11;:23;57673:10;57661:23;;;;;;;;;;;;;;;:38;;;;57810:6;:18;57817:10;57810:18;;;;;;;;;;;;;;;57829:1;57810:21;;;;;;;;;57786:6;:18;57793:10;57786:18;;;;;;;;;;;;;;;57805:1;57786:21;;;;;;;;:45;;;;57611:226;57922:6;57898;:18;57905:10;57898:18;;;;;;;;;;;;;;;57917:1;57898:21;;;;;;;;:30;;;;57218:715;;;:::o;54272:351::-;54397:1;54380:19;;:5;:19;;;:40;;;;54418:1;54403:17;;:3;:17;;;54380:40;54372:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;54449:21;54473:9;:16;54483:5;54473:16;;;;;;;;;;;;;;;;;;;;;;;;;54449:40;;54494:21;54518:9;:14;54528:3;54518:14;;;;;;;;;;;;;;;;;;;;;;;;;54494:38;;54537:14;54554:7;54537:24;;54566:52;54581:13;54596;54611:6;54566:14;:52::i;:::-;54272:351;;;;;;:::o;2356:471::-;2414:7;2664:1;2659;:6;2655:47;;;2689:1;2682:8;;;;2655:47;2714:9;2730:1;2726;:5;2714:17;;2759:1;2754;2750;:5;;;;;;:10;2742:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2818:1;2811:8;;;2356:471;;;;;:::o;3931:278::-;4017:7;4049:1;4045;:5;4052:12;4037:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;4076:9;4092:1;4088;:5;;;;;;4076:17;;4200:1;4193:8;;;3931:278;;;;;:::o;53640:128::-;53710:1;:11;53722:12;53744:1;53748:14;53710:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53640:128;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:130::-;;222:6;209:20;200:29;;234:33;261:5;234:33;:::i;:::-;194:78;;;;:::o;279:134::-;;363:6;357:13;348:22;;375:33;402:5;375:33;:::i;:::-;342:71;;;;:::o;420:241::-;;524:2;512:9;503:7;499:23;495:32;492:2;;;540:1;537;530:12;492:2;575:1;592:53;637:7;628:6;617:9;613:22;592:53;:::i;:::-;582:63;;554:97;486:175;;;;:::o;668:366::-;;;789:2;777:9;768:7;764:23;760:32;757:2;;;805:1;802;795:12;757:2;840:1;857:53;902:7;893:6;882:9;878:22;857:53;:::i;:::-;847:63;;819:97;947:2;965:53;1010:7;1001:6;990:9;986:22;965:53;:::i;:::-;955:63;;926:98;751:283;;;;;:::o;1041:491::-;;;;1179:2;1167:9;1158:7;1154:23;1150:32;1147:2;;;1195:1;1192;1185:12;1147:2;1230:1;1247:53;1292:7;1283:6;1272:9;1268:22;1247:53;:::i;:::-;1237:63;;1209:97;1337:2;1355:53;1400:7;1391:6;1380:9;1376:22;1355:53;:::i;:::-;1345:63;;1316:98;1445:2;1463:53;1508:7;1499:6;1488:9;1484:22;1463:53;:::i;:::-;1453:63;;1424:98;1141:391;;;;;:::o;1539:366::-;;;1660:2;1648:9;1639:7;1635:23;1631:32;1628:2;;;1676:1;1673;1666:12;1628:2;1711:1;1728:53;1773:7;1764:6;1753:9;1749:22;1728:53;:::i;:::-;1718:63;;1690:97;1818:2;1836:53;1881:7;1872:6;1861:9;1857:22;1836:53;:::i;:::-;1826:63;;1797:98;1622:283;;;;;:::o;1912:241::-;;2016:2;2004:9;1995:7;1991:23;1987:32;1984:2;;;2032:1;2029;2022:12;1984:2;2067:1;2084:53;2129:7;2120:6;2109:9;2105:22;2084:53;:::i;:::-;2074:63;;2046:97;1978:175;;;;:::o;2160:263::-;;2275:2;2263:9;2254:7;2250:23;2246:32;2243:2;;;2291:1;2288;2281:12;2243:2;2326:1;2343:64;2399:7;2390:6;2379:9;2375:22;2343:64;:::i;:::-;2333:74;;2305:108;2237:186;;;;:::o;2430:617::-;;;;;2585:3;2573:9;2564:7;2560:23;2556:33;2553:2;;;2602:1;2599;2592:12;2553:2;2637:1;2654:53;2699:7;2690:6;2679:9;2675:22;2654:53;:::i;:::-;2644:63;;2616:97;2744:2;2762:53;2807:7;2798:6;2787:9;2783:22;2762:53;:::i;:::-;2752:63;;2723:98;2852:2;2870:53;2915:7;2906:6;2895:9;2891:22;2870:53;:::i;:::-;2860:63;;2831:98;2960:2;2978:53;3023:7;3014:6;3003:9;2999:22;2978:53;:::i;:::-;2968:63;;2939:98;2547:500;;;;;;;:::o;3054:150::-;3153:45;3192:5;3153:45;:::i;:::-;3148:3;3141:58;3135:69;;:::o;3211:113::-;3294:24;3312:5;3294:24;:::i;:::-;3289:3;3282:37;3276:48;;:::o;3331:121::-;3422:24;3440:5;3422:24;:::i;:::-;3417:3;3410:37;3404:48;;:::o;3459:104::-;3536:21;3551:5;3536:21;:::i;:::-;3531:3;3524:34;3518:45;;:::o;3570:347::-;;3682:39;3715:5;3682:39;:::i;:::-;3733:71;3797:6;3792:3;3733:71;:::i;:::-;3726:78;;3809:52;3854:6;3849:3;3842:4;3835:5;3831:16;3809:52;:::i;:::-;3882:29;3904:6;3882:29;:::i;:::-;3877:3;3873:39;3866:46;;3662:255;;;;;:::o;3925:372::-;;4085:67;4149:2;4144:3;4085:67;:::i;:::-;4078:74;;4185:34;4181:1;4176:3;4172:11;4165:55;4254:5;4249:2;4244:3;4240:12;4233:27;4288:2;4283:3;4279:12;4272:19;;4071:226;;;:::o;4306:319::-;;4466:67;4530:2;4525:3;4466:67;:::i;:::-;4459:74;;4566:21;4562:1;4557:3;4553:11;4546:42;4616:2;4611:3;4607:12;4600:19;;4452:173;;;:::o;4634:371::-;;4794:67;4858:2;4853:3;4794:67;:::i;:::-;4787:74;;4894:34;4890:1;4885:3;4881:11;4874:55;4963:4;4958:2;4953:3;4949:12;4942:26;4996:2;4991:3;4987:12;4980:19;;4780:225;;;:::o;5014:329::-;;5174:67;5238:2;5233:3;5174:67;:::i;:::-;5167:74;;5274:31;5270:1;5265:3;5261:11;5254:52;5334:2;5329:3;5325:12;5318:19;;5160:183;;;:::o;5352:327::-;;5512:67;5576:2;5571:3;5512:67;:::i;:::-;5505:74;;5612:29;5608:1;5603:3;5599:11;5592:50;5670:2;5665:3;5661:12;5654:19;;5498:181;;;:::o;5688:327::-;;5848:67;5912:2;5907:3;5848:67;:::i;:::-;5841:74;;5948:29;5944:1;5939:3;5935:11;5928:50;6006:2;6001:3;5997:12;5990:19;;5834:181;;;:::o;6024:370::-;;6184:67;6248:2;6243:3;6184:67;:::i;:::-;6177:74;;6284:34;6280:1;6275:3;6271:11;6264:55;6353:3;6348:2;6343:3;6339:12;6332:25;6385:2;6380:3;6376:12;6369:19;;6170:224;;;:::o;6403:370::-;;6563:67;6627:2;6622:3;6563:67;:::i;:::-;6556:74;;6663:34;6659:1;6654:3;6650:11;6643:55;6732:3;6727:2;6722:3;6718:12;6711:25;6764:2;6759:3;6755:12;6748:19;;6549:224;;;:::o;6782:374::-;;6942:67;7006:2;7001:3;6942:67;:::i;:::-;6935:74;;7042:34;7038:1;7033:3;7029:11;7022:55;7111:7;7106:2;7101:3;7097:12;7090:29;7147:2;7142:3;7138:12;7131:19;;6928:228;;;:::o;7165:373::-;;7325:67;7389:2;7384:3;7325:67;:::i;:::-;7318:74;;7425:34;7421:1;7416:3;7412:11;7405:55;7494:6;7489:2;7484:3;7480:12;7473:28;7529:2;7524:3;7520:12;7513:19;;7311:227;;;:::o;7547:331::-;;7707:67;7771:2;7766:3;7707:67;:::i;:::-;7700:74;;7807:33;7803:1;7798:3;7794:11;7787:54;7869:2;7864:3;7860:12;7853:19;;7693:185;;;:::o;7887:331::-;;8047:67;8111:2;8106:3;8047:67;:::i;:::-;8040:74;;8147:33;8143:1;8138:3;8134:11;8127:54;8209:2;8204:3;8200:12;8193:19;;8033:185;;;:::o;8226:113::-;8309:24;8327:5;8309:24;:::i;:::-;8304:3;8297:37;8291:48;;:::o;8346:121::-;8437:24;8455:5;8437:24;:::i;:::-;8432:3;8425:37;8419:48;;:::o;8474:107::-;8553:22;8569:5;8553:22;:::i;:::-;8548:3;8541:35;8535:46;;:::o;8588:238::-;;8723:2;8712:9;8708:18;8700:26;;8737:79;8813:1;8802:9;8798:17;8789:6;8737:79;:::i;:::-;8694:132;;;;:::o;8833:222::-;;8960:2;8949:9;8945:18;8937:26;;8974:71;9042:1;9031:9;9027:17;9018:6;8974:71;:::i;:::-;8931:124;;;;:::o;9062:492::-;;9261:2;9250:9;9246:18;9238:26;;9275:79;9351:1;9340:9;9336:17;9327:6;9275:79;:::i;:::-;9365:88;9449:2;9438:9;9434:18;9425:6;9365:88;:::i;:::-;9464:80;9540:2;9529:9;9525:18;9516:6;9464:80;:::i;:::-;9232:322;;;;;;:::o;9561:476::-;;9752:2;9741:9;9737:18;9729:26;;9766:79;9842:1;9831:9;9827:17;9818:6;9766:79;:::i;:::-;9856:80;9932:2;9921:9;9917:18;9908:6;9856:80;:::i;:::-;9947;10023:2;10012:9;10008:18;9999:6;9947:80;:::i;:::-;9723:314;;;;;;:::o;10044:210::-;;10165:2;10154:9;10150:18;10142:26;;10179:65;10241:1;10230:9;10226:17;10217:6;10179:65;:::i;:::-;10136:118;;;;:::o;10261:310::-;;10408:2;10397:9;10393:18;10385:26;;10458:9;10452:4;10448:20;10444:1;10433:9;10429:17;10422:47;10483:78;10556:4;10547:6;10483:78;:::i;:::-;10475:86;;10379:192;;;;:::o;10578:416::-;;10778:2;10767:9;10763:18;10755:26;;10828:9;10822:4;10818:20;10814:1;10803:9;10799:17;10792:47;10853:131;10979:4;10853:131;:::i;:::-;10845:139;;10749:245;;;:::o;11001:416::-;;11201:2;11190:9;11186:18;11178:26;;11251:9;11245:4;11241:20;11237:1;11226:9;11222:17;11215:47;11276:131;11402:4;11276:131;:::i;:::-;11268:139;;11172:245;;;:::o;11424:416::-;;11624:2;11613:9;11609:18;11601:26;;11674:9;11668:4;11664:20;11660:1;11649:9;11645:17;11638:47;11699:131;11825:4;11699:131;:::i;:::-;11691:139;;11595:245;;;:::o;11847:416::-;;12047:2;12036:9;12032:18;12024:26;;12097:9;12091:4;12087:20;12083:1;12072:9;12068:17;12061:47;12122:131;12248:4;12122:131;:::i;:::-;12114:139;;12018:245;;;:::o;12270:416::-;;12470:2;12459:9;12455:18;12447:26;;12520:9;12514:4;12510:20;12506:1;12495:9;12491:17;12484:47;12545:131;12671:4;12545:131;:::i;:::-;12537:139;;12441:245;;;:::o;12693:416::-;;12893:2;12882:9;12878:18;12870:26;;12943:9;12937:4;12933:20;12929:1;12918:9;12914:17;12907:47;12968:131;13094:4;12968:131;:::i;:::-;12960:139;;12864:245;;;:::o;13116:416::-;;13316:2;13305:9;13301:18;13293:26;;13366:9;13360:4;13356:20;13352:1;13341:9;13337:17;13330:47;13391:131;13517:4;13391:131;:::i;:::-;13383:139;;13287:245;;;:::o;13539:416::-;;13739:2;13728:9;13724:18;13716:26;;13789:9;13783:4;13779:20;13775:1;13764:9;13760:17;13753:47;13814:131;13940:4;13814:131;:::i;:::-;13806:139;;13710:245;;;:::o;13962:416::-;;14162:2;14151:9;14147:18;14139:26;;14212:9;14206:4;14202:20;14198:1;14187:9;14183:17;14176:47;14237:131;14363:4;14237:131;:::i;:::-;14229:139;;14133:245;;;:::o;14385:416::-;;14585:2;14574:9;14570:18;14562:26;;14635:9;14629:4;14625:20;14621:1;14610:9;14606:17;14599:47;14660:131;14786:4;14660:131;:::i;:::-;14652:139;;14556:245;;;:::o;14808:416::-;;15008:2;14997:9;14993:18;14985:26;;15058:9;15052:4;15048:20;15044:1;15033:9;15029:17;15022:47;15083:131;15209:4;15083:131;:::i;:::-;15075:139;;14979:245;;;:::o;15231:416::-;;15431:2;15420:9;15416:18;15408:26;;15481:9;15475:4;15471:20;15467:1;15456:9;15452:17;15445:47;15506:131;15632:4;15506:131;:::i;:::-;15498:139;;15402:245;;;:::o;15654:222::-;;15781:2;15770:9;15766:18;15758:26;;15795:71;15863:1;15852:9;15848:17;15839:6;15795:71;:::i;:::-;15752:124;;;;:::o;15883:357::-;;16046:2;16035:9;16031:18;16023:26;;16060:79;16136:1;16125:9;16121:17;16112:6;16060:79;:::i;:::-;16150:80;16226:2;16215:9;16211:18;16202:6;16150:80;:::i;:::-;16017:223;;;;;:::o;16247:333::-;;16402:2;16391:9;16387:18;16379:26;;16416:71;16484:1;16473:9;16469:17;16460:6;16416:71;:::i;:::-;16498:72;16566:2;16555:9;16551:18;16542:6;16498:72;:::i;:::-;16373:207;;;;;:::o;16587:214::-;;16710:2;16699:9;16695:18;16687:26;;16724:67;16788:1;16777:9;16773:17;16764:6;16724:67;:::i;:::-;16681:120;;;;:::o;16808:122::-;;16902:5;16896:12;16886:22;;16867:63;;;:::o;16938:163::-;;17053:6;17048:3;17041:19;17090:4;17085:3;17081:14;17066:29;;17034:67;;;;:::o;17109:91::-;;17171:24;17189:5;17171:24;:::i;:::-;17160:35;;17154:46;;;:::o;17207:85::-;;17280:5;17273:13;17266:21;17255:32;;17249:43;;;:::o;17299:121::-;;17372:42;17365:5;17361:54;17350:65;;17344:76;;;:::o;17427:72::-;;17489:5;17478:16;;17472:27;;;:::o;17506:81::-;;17577:4;17570:5;17566:16;17555:27;;17549:38;;;:::o;17594:129::-;;17681:37;17712:5;17681:37;:::i;:::-;17668:50;;17662:61;;;:::o;17730:121::-;;17809:37;17840:5;17809:37;:::i;:::-;17796:50;;17790:61;;;:::o;17858:108::-;;17937:24;17955:5;17937:24;:::i;:::-;17924:37;;17918:48;;;:::o;17974:268::-;18039:1;18046:101;18060:6;18057:1;18054:13;18046:101;;;18136:1;18131:3;18127:11;18121:18;18117:1;18112:3;18108:11;18101:39;18082:2;18079:1;18075:10;18070:15;;18046:101;;;18162:6;18159:1;18156:13;18153:2;;;18227:1;18218:6;18213:3;18209:16;18202:27;18153:2;18023:219;;;;:::o;18250:97::-;;18338:2;18334:7;18329:2;18322:5;18318:14;18314:28;18304:38;;18298:49;;;:::o;18355:117::-;18424:24;18442:5;18424:24;:::i;:::-;18417:5;18414:35;18404:2;;18463:1;18460;18453:12;18404:2;18398:74;:::o;18479:117::-;18548:24;18566:5;18548:24;:::i;:::-;18541:5;18538:35;18528:2;;18587:1;18584;18577:12;18528:2;18522:74;:::o
Swarm Source
ipfs://00dd0ede69c7ba5667a3d3ea358c9adea596234057501c4698dc590a7cc38eab
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.