ERC-20
Overview
Max Total Supply
99,613.276150231255780717 TORRO
Holders
151
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Torro
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity Multiple files format)
// "SPDX-License-Identifier: UNLICENSED" pragma solidity 0.6.6; import "./Ownable.sol"; import "./EnumerableSet.sol"; import "./SafeMath.sol"; import "./ITorro.sol"; import "./ITorroFactory.sol"; /// @title ERC-20 Torro governing token. /// @notice Contract for ERC-20 governing token. /// @author ORayskiy - @robitnik_TorroDao contract Torro is ITorro, OwnableUpgradeSafe { using SafeMath for uint256; using EnumerableSet for EnumerableSet.AddressSet; // Structs. /// @notice structure to hold holder's information. struct Holder { uint256 balance; uint256 staked; mapping(address => uint256) allowances; mapping(uint256 => uint256) stakeLock; uint256 locked; } // Private data. uint8 constant private _decimals = 18; string private _name; string private _symbol; uint256 private _totalSupply; address private _dao; address private _factory; bool private _isMain; mapping(address => Holder) private _holders; EnumerableSet.AddressSet private _holderAddresses; // Events. /// @notice Event for dispatching when token transfer occurs. /// @param from address of tokens' sender. /// @param to address of tokens' reciever. /// @param amount amount of tokens sent. event Transfer(address indexed from, address indexed to, uint256 amount); /// @notice Event for dispatching when tokens allowance has been approved. /// @param owner address of tokens' owner. /// @param spender address of tokens; spender. /// @param value amount of tokens approved for use. event Approval(address indexed owner, address indexed spender, uint256 value); /// @notice Event for dispatching when tokens have been staked. /// @param owner address of tokens' owner that have been staked. /// @param amount amount of tokens that have been staked. event Stake(address indexed owner, uint256 amount); /// @notice Event for dispatching when tokens have been unstaked. /// @param owner address of tokens' owner that have been unstaked. /// @param amount amount of tokens that have been unstaked. event Unstake(address indexed owner, uint256 amount); /// @notice Event for dispatching when benefits have been added. event AddBenefits(); // Constructor. constructor() public { __Ownable_init(); _name = "Torro DAO Token"; _symbol = "TORRO"; _totalSupply = 1e23; _dao = address(0x0); _factory = address(0x0); _isMain = true; _holders[msg.sender].balance = _totalSupply; _holderAddresses.add(msg.sender); emit Transfer(address(0x0), msg.sender, _totalSupply); } /// @notice Initializes governing token. /// @param dao_ address of cloned DAO. /// @param factory_ address of factory. /// @param supply_ total supply of tokens. function initializeCustom(address dao_, address factory_, uint256 supply_) public override initializer { __Ownable_init(); _name = "Torro DAO Pool Token"; _symbol = "TORRO_POOL"; _totalSupply = supply_; _dao = dao_; _factory = factory_; _isMain = false; _holders[dao_].balance = _totalSupply; _holderAddresses.add(dao_); emit Transfer(address(0x0), dao_, _totalSupply); } // Public calls. /// @notice Token's name. /// @return string name of the token. function name() public override view returns (string memory) { return _name; } /// @notice Token's symbol. /// @return string symbol of the token. function symbol() public override view returns (string memory) { return _symbol; } /// @notice Token's decimals. /// @return uint8 demials of the token. function decimals() public override pure returns (uint8) { return _decimals; } /// @notice Token's total supply. /// @return uint256 total supply of the token. function totalSupply() public override view returns (uint256) { return _totalSupply; } /// @notice Count of token holders. /// @return uint256 number of token holders. function holdersCount() public override view returns (uint256) { return _holderAddresses.length(); } /// @notice All token holders. /// @return array of addresses of token holders. function holders() public override view returns (address[] memory) { uint256 length = _holderAddresses.length(); address[] memory holderAddresses = new address[](length); for (uint256 i = 0; i < length; i++) { holderAddresses[i] = _holderAddresses.at(i); } return holderAddresses; } /// @notice Available balance for address. /// @param sender_ address to get available balance for. /// @return uint256 amount of tokens available for given address. function balanceOf(address sender_) public override view returns (uint256) { return _holders[sender_].balance; } /// @notice Staked balance for address. /// @param sender_ address to get staked balance for. /// @return uint256 amount of staked tokens for given address. function stakedOf(address sender_) public override view returns (uint256) { return _holders[sender_].staked; } /// @notice Total balance for address = available + staked. /// @param sender_ address to get total balance for. /// @return uint256 total amount of tokens for given address. function totalOf(address sender_) public override view returns (uint256) { return _holders[sender_].balance.add(_holders[sender_].staked); } /// @notice Locked staked balance for address /// @param sender_ address to get locked staked balance for. /// @return uint256 amount of locked staked tokens for given address. function lockedOf(address sender_) public override view returns (uint256) { return _holders[sender_].locked; } /// @notice Spending allowance. /// @param owner_ token owner address. /// @param spender_ token spender address. /// @return uint256 amount of owner's tokens that spender can use. function allowance(address owner_, address spender_) public override view returns (uint256) { return _holders[owner_].allowances[spender_]; } /// @notice Unstaked supply of token. /// @return uint256 amount of tokens in circulation that are not staked. function unstakedSupply() public override view returns (uint256) { uint256 supply = 0; for (uint256 i = 0; i < _holderAddresses.length(); i++) { supply = supply.add(_holders[_holderAddresses.at(i)].balance); } return supply; } /// @notice Staked supply of token. /// @return uint256 amount of tokens in circulation that are staked. function stakedSupply() public override view returns (uint256) { uint256 supply = 0; for (uint256 i = 0; i < _holderAddresses.length(); i++) { supply = supply.add(_holders[_holderAddresses.at(i)].staked); } return supply; } // Public transactions. /// @notice Transfer tokens to recipient. /// @param recipient_ address of tokens' recipient. /// @param amount_ amount of tokens to transfer. /// @return bool true if successful. function transfer(address recipient_, uint256 amount_) public override returns (bool) { _transfer(msg.sender, recipient_, amount_); return true; } /// @notice Approve spender to spend an allowance. /// @param spender_ address that will be allowed to spend specified amount of tokens. /// @param amount_ amount of tokens that spender can spend. /// @return bool true if successful. function approve(address spender_, uint256 amount_) public override returns (bool) { _approve(msg.sender, spender_, amount_); return true; } /// @notice Approves DAO to spend tokens. /// @param owner_ address whose tokens DAO can spend. /// @param amount_ amount of tokens that DAO can spend. /// @return bool true if successful. function approveDao(address owner_, uint256 amount_) public override returns (bool) { require(msg.sender == _dao); _approve(owner_, _dao, amount_); return true; } /// @notice Locks account's staked tokens. /// @param owner_ address whose tokens should be locked. /// @param amount_ amount of tokens to lock. /// @param id_ lock id. function lockStakesDao(address owner_, uint256 amount_, uint256 id_) public override { require(msg.sender == _dao); Holder storage holder = _holders[owner_]; require(holder.staked >= amount_); holder.stakeLock[id_] = amount_; holder.locked = holder.locked.add(amount_); } /// @notice Unlocks account's staked tokens. /// @param owner_ address whose tokens should be unlocked. /// @param id_ unlock id. function unlockStakesDao(address owner_, uint256 id_) public override { require(msg.sender == _dao); Holder storage holder = _holders[owner_]; uint256 amount = holder.stakeLock[id_]; if (amount > 0) { holder.locked = holder.locked.sub(amount); } delete holder.stakeLock[id_]; } /// @notice Transfers tokens from owner to recipient by approved spender. /// @param owner_ address of tokens' owner whose tokens will be spent. /// @param recipient_ address of recipient that will recieve tokens. /// @param amount_ amount of tokens to be spent. /// @return bool true if successful. function transferFrom(address owner_, address recipient_, uint256 amount_) public override returns (bool) { require(_holders[owner_].allowances[msg.sender] >= amount_); _transfer(owner_, recipient_, amount_); _approve(owner_, msg.sender, _holders[owner_].allowances[msg.sender].sub(amount_)); return true; } /// @notice Increases allowance for given spender. /// @param spender_ spender to increase allowance for. /// @param addedValue_ extra amount that spender can spend. /// @return bool true if successful. function increaseAllowance(address spender_, uint256 addedValue_) public override returns (bool) { _approve(msg.sender, spender_, _holders[msg.sender].allowances[spender_].add(addedValue_)); return true; } /// @notice Decreases allowance for given spender. /// @param spender_ spender to decrease allowance for. /// @param subtractedValue_ removed amount that spender can spend. /// @return bool true if successful. function decreaseAllowance(address spender_, uint256 subtractedValue_) public override returns (bool) { _approve(msg.sender, spender_, _holders[msg.sender].allowances[spender_].sub(subtractedValue_)); return true; } /// @notice Stake tokens. /// @param amount_ amount of tokens to be staked. /// @return bool true if successful. function stake(uint256 amount_) public override returns (bool) { require(amount_ >= 1e18); require(balanceOf(msg.sender) >= amount_); Holder storage holder = _holders[msg.sender]; holder.balance = holder.balance.sub(amount_); holder.staked = holder.staked.add(amount_); emit Transfer(msg.sender, address(this), amount_); emit Stake(msg.sender, amount_); return true; } /// @notice Unstake tokens. /// @param amount_ amount of tokens to be unstaked. /// @return bool true if successful. function unstake(uint256 amount_) public override returns (bool) { require(stakedOf(msg.sender) >= amount_); Holder storage holder = _holders[msg.sender]; require(holder.staked.sub(holder.locked) >= amount_); uint256 amount; if (_isMain) { uint256 burn = amount_ / 200; uint256 tempTotalSupply = _totalSupply.sub(burn); if (tempTotalSupply < 1e22) { burn = _totalSupply.sub(tempTotalSupply); } if (burn > 0) { amount = amount_.sub(burn); _totalSupply = _totalSupply.sub(burn); emit Transfer(msg.sender, address(0x0), burn); } } else { amount = amount_; } holder.staked = holder.staked.sub(amount_); holder.balance = holder.balance.add(amount); emit Transfer(address(this), msg.sender, amount); emit Unstake(msg.sender, amount_); return true; } /// @notice Functionality for DAO to add benefits for all stakers. /// @param amount_ amount of wei to be shared among stakers. function addBenefits(uint256 amount_) public override { require(msg.sender == _dao || ITorroFactory(_factory).isDao(msg.sender)); for (uint256 i = 0; i < _holderAddresses.length(); i++) { address holder = _holderAddresses.at(i); uint256 staked = stakedOf(holder); if (staked > 0) { uint256 amount = staked.mul(amount_) / stakedSupply(); if (amount > 0) { ITorroFactory(_factory).addBenefits(holder, amount); } } } // Emit event that benefits have been added for token. emit AddBenefits(); } /// @notice Functionality to burn tokens. /// @param amount_ amount of tokens to burn. function burn(uint256 amount_) public override { Holder storage burner = _holders[msg.sender]; require(burner.balance >= amount_); burner.balance = burner.balance.sub(amount_); _totalSupply = _totalSupply.sub(amount_); emit Transfer(msg.sender, address(0x0), amount_); } // Private transactions. /// @notice Main functionality for token trnasfer. /// @param sender_ address that sends tokens. /// @param recipient_ address that will recieve tokens. /// @param amount_ amount of tokens to be sent. function _transfer(address sender_, address recipient_, uint256 amount_) private { require(sender_ != address(0x0)); require(recipient_ != address(0x0)); Holder storage sender = _holders[sender_]; Holder storage recipient = _holders[recipient_]; require(sender.balance >= amount_); if (_holderAddresses.contains(recipient_)) { recipient.balance = recipient.balance.add(amount_); } else { recipient.balance = amount_; _holderAddresses.add(recipient_); } sender.balance = sender.balance.sub(amount_); if (totalOf(sender_) == 0) { _holderAddresses.remove(sender_); } emit Transfer(sender_, recipient_, amount_); } /// @notice Main functionality for token allowance approval. /// @param owner_ address whose tokens will be spent. /// @param spender_ address that will be able to spend tokens. /// @param amount_ amount of tokens that can be spent. function _approve(address owner_, address spender_, uint256 amount_) private { require(owner_ != address(0x0)); require(spender_ != address(0x0)); _holders[owner_].allowances[spender_] = amount_; emit Approval(owner_, spender_, amount_); } // Owner transactions. /// @notice Sets DAO and Factory addresses. /// @param dao_ DAO address that this token governs. /// @param factory_ Factory address. function setDaoFactoryAddresses(address dao_, address factory_) public override onlyOwner { _dao = dao_; _factory = factory_; } }
pragma solidity ^0.6.0; import "./Initializable.sol"; /* * @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. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; }
pragma solidity ^0.6.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; }
// "SPDX-License-Identifier: UNLICENSED" pragma solidity 0.6.6; /// @title Interface for ERC-20 Torro governing token. /// @notice ERC-20 token. /// @author ORayskiy - @robitnik_TorroDao interface ITorro { // Initializer. /// @notice Initializes governing token. /// @param dao_ address of cloned DAO. /// @param factory_ address of factory. /// @param supply_ total supply of tokens. function initializeCustom(address dao_, address factory_, uint256 supply_) external; // Public calls. /// @notice Token's name. /// @return string name of the token. function name() external view returns (string memory); /// @notice Token's symbol. /// @return string symbol of the token. function symbol() external view returns (string memory); /// @notice Token's decimals. /// @return uint8 demials of the token. function decimals() external pure returns (uint8); /// @notice Token's total supply. /// @return uint256 total supply of the token. function totalSupply() external view returns (uint256); /// @notice Count of token holders. /// @return uint256 number of token holders. function holdersCount() external view returns (uint256); /// @notice All token holders. /// @return array of addresses of token holders. function holders() external view returns (address[] memory); /// @notice Available balance for address. /// @param sender_ address to get available balance for. /// @return uint256 amount of tokens available for given address. function balanceOf(address sender_) external view returns (uint256); /// @notice Staked balance for address. /// @param sender_ address to get staked balance for. /// @return uint256 amount of staked tokens for given address. function stakedOf(address sender_) external view returns (uint256); /// @notice Total balance for address = available + staked. /// @param sender_ address to get total balance for. /// @return uint256 total amount of tokens for given address. function totalOf(address sender_) external view returns (uint256); /// @notice Locked staked balance for address /// @param sender_ address to get locked staked balance for. /// @return uint256 amount of locked staked tokens for given address. function lockedOf(address sender_) external view returns (uint256); /// @notice Spending allowance. /// @param owner_ token owner address. /// @param spender_ token spender address. /// @return uint256 amount of owner's tokens that spender can use. function allowance(address owner_, address spender_) external view returns (uint256); /// @notice Unstaked supply of token. /// @return uint256 amount of tokens in circulation that are not staked. function unstakedSupply() external view returns (uint256); /// @notice Staked supply of token. /// @return uint256 amount of tokens in circulation that are staked. function stakedSupply() external view returns (uint256); // Public transactions. /// @notice Transfer tokens to recipient. /// @param recipient_ address of tokens' recipient. /// @param amount_ amount of tokens to transfer. /// @return bool true if successful. function transfer(address recipient_, uint256 amount_) external returns (bool); /// @notice Approve spender to spend an allowance. /// @param spender_ address that will be allowed to spend specified amount of tokens. /// @param amount_ amount of tokens that spender can spend. /// @return bool true if successful. function approve(address spender_, uint256 amount_) external returns (bool); /// @notice Approves DAO to spend tokens. /// @param owner_ address whose tokens DAO can spend. /// @param amount_ amount of tokens that DAO can spend. /// @return bool true if successful. function approveDao(address owner_, uint256 amount_) external returns (bool); /// @notice Locks account's staked tokens. /// @param owner_ address whose tokens should be locked. /// @param amount_ amount of tokens to lock. /// @param id_ lock id. function lockStakesDao(address owner_, uint256 amount_, uint256 id_) external; /// @notice Unlocks account's staked tokens. /// @param owner_ address whose tokens should be unlocked. /// @param id_ unlock id. function unlockStakesDao(address owner_, uint256 id_) external; /// @notice Transfers tokens from owner to recipient by approved spender. /// @param owner_ address of tokens' owner whose tokens will be spent. /// @param recipient_ address of recipient that will recieve tokens. /// @param amount_ amount of tokens to be spent. /// @return bool true if successful. function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool); /// @notice Increases allowance for given spender. /// @param spender_ spender to increase allowance for. /// @param addedValue_ extra amount that spender can spend. /// @return bool true if successful. function increaseAllowance(address spender_, uint256 addedValue_) external returns (bool); /// @notice Decreases allowance for given spender. /// @param spender_ spender to decrease allowance for. /// @param subtractedValue_ removed amount that spender can spend. /// @return bool true if successful. function decreaseAllowance(address spender_, uint256 subtractedValue_) external returns (bool); /// @notice Stake tokens. /// @param amount_ amount of tokens to be staked. /// @return bool true if successful. function stake(uint256 amount_) external returns (bool); /// @notice Unstake tokens. /// @param amount_ amount of tokens to be unstaked. /// @return bool true if successful. function unstake(uint256 amount_) external returns (bool); /// @notice Functionality for DAO to add benefits for all stakers. /// @param amount_ amount of wei to be shared among stakers. function addBenefits(uint256 amount_) external; /// @notice Sets DAO and Factory addresses. /// @param dao_ DAO address that this token governs. /// @param factory_ Factory address. function setDaoFactoryAddresses(address dao_, address factory_) external; /// @notice Functionality for owner to burn tokens. /// @param amount_ amount of tokens to burn. function burn(uint256 amount_) external; }
// "SPDX-License-Identifier: UNLICENSED" pragma solidity 0.6.6; /// @title Factory interface with benefits related methods exposed. /// @notice Interface for claiming, adding and depositing benefits. /// @author ORayskiy - @robitnik_TorroDao interface ITorroFactory { /// @notice Address of the main token. /// @return address of the main token. function mainToken() external view returns (address); /// @notice Address of the main DAO. /// @return address of the main DAO. function mainDao() external view returns (address); /// @notice Checks whether provided address is a valid DAO. /// @param dao_ address to check. /// @return bool true if address is a valid DAO. function isDao(address dao_) external view returns (bool); /// @notice Claim available benefits for holder. /// @param amount_ of wei to claim. function claimBenefits(uint256 amount_) external; /// @notice Adds withdrawal benefits for holder. /// @param recipient_ holder that's getting benefits. /// @param amount_ benefits amount to be added to holder's existing benefits. function addBenefits(address recipient_, uint256 amount_) external; /// @notice Depositis withdrawal benefits. /// @param token_ governing token for DAO that's depositing benefits. function depositBenefits(address token_) external payable; }
pragma solidity ^0.6.0; import "./Context.sol"; import "./Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; }
pragma solidity =0.6.6; // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint x, uint y) internal pure returns (uint z) { require((z = x + y) >= x, 'ds-math-add-overflow'); } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, 'ds-math-sub-underflow'); } function mul(uint x, uint y) internal pure returns (uint z) { require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow'); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"AddBenefits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstake","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"addBenefits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender_","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"approveDao","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":[],"name":"holders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"addedValue_","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dao_","type":"address"},{"internalType":"address","name":"factory_","type":"address"},{"internalType":"uint256","name":"supply_","type":"uint256"}],"name":"initializeCustom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"lockStakesDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender_","type":"address"}],"name":"lockedOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dao_","type":"address"},{"internalType":"address","name":"factory_","type":"address"}],"name":"setDaoFactoryAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"stake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender_","type":"address"}],"name":"stakedOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender_","type":"address"}],"name":"totalOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"owner_","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"unlockStakesDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"unstake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50620000256001600160e01b036200013216565b60408051808201909152600f8082526e2a37b93937902220a7902a37b5b2b760891b60209092019182526200005d9160979162000475565b5060408051808201909152600580825264544f52524f60d81b60209092019182526200008c9160989162000475565b5069152d02c7e14af68000006099819055609a80546001600160a01b0319169055609b80546001600160a81b031916600160a01b179055336000818152609c6020908152604090912092909255620000f191609d9190620017ff6200020b821b17901c565b50609954604080519182525133916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a362000517565b600054610100900460ff1680620001575750620001576001600160e01b036200023416565b8062000166575060005460ff16155b620001a35760405162461bcd60e51b815260040180806020018281038252602e815260200180620021f2602e913960400191505060405180910390fd5b600054610100900460ff16158015620001cf576000805460ff1961ff0019909116610100171660011790555b620001e26001600160e01b036200023b16565b620001f56001600160e01b03620002ec16565b801562000208576000805461ff00191690555b50565b60006200022b836001600160a01b0384166001600160e01b036200040116565b90505b92915050565b303b155b90565b600054610100900460ff1680620002605750620002606001600160e01b036200023416565b806200026f575060005460ff16155b620002ac5760405162461bcd60e51b815260040180806020018281038252602e815260200180620021f2602e913960400191505060405180910390fd5b600054610100900460ff16158015620001f5576000805460ff1961ff001990911661010017166001179055801562000208576000805461ff001916905550565b600054610100900460ff1680620003115750620003116001600160e01b036200023416565b8062000320575060005460ff16155b6200035d5760405162461bcd60e51b815260040180806020018281038252602e815260200180620021f2602e913960400191505060405180910390fd5b600054610100900460ff1615801562000389576000805460ff1961ff0019909116610100171660011790555b60006200039e6001600160e01b036200045916565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801562000208576000805461ff001916905550565b60006200041883836001600160e01b036200045d16565b62000450575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200022e565b5060006200022e565b3390565b60009081526001919091016020526040902054151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620004b857805160ff1916838001178555620004e8565b82800160010185558215620004e8579182015b82811115620004e8578251825591602001919060010190620004cb565b50620004f6929150620004fa565b5090565b6200023891905b80821115620004f6576000815560010162000501565b611ccb80620005276000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80638188f71c11610104578063a5f1e282116100a2578063d41ce4b111610071578063d41ce4b1146105f4578063dd62ed3e146105fc578063e3c064031461062a578063f2fde38b1461065c576101da565b8063a5f1e2821461055f578063a694fc3a14610585578063a9059cbb146105a2578063af500ba3146105ce576101da565b806393be3bc6116100de57806393be3bc6146104c957806395d89b41146104ff5780639cedea7c14610507578063a457c2d714610533576101da565b80638188f71c146104275780638da5cb5b1461047f578063912c2673146104a3576101da565b8063313ce5671161017c578063506be6e41161014b578063506be6e4146103c55780636b4ed21b146103f157806370a08231146103f9578063715018a61461041f576101da565b8063313ce56714610341578063395093511461035f57806342966c681461038b5780634c5844e7146103a8576101da565b806322614097116101b857806322614097146102b657806323b872dd146102e65780632e17de781461031c5780632fa6e16b14610339576101da565b806306fdde03146101df578063095ea7b31461025c57806318160ddd1461029c575b600080fd5b6101e7610682565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610221578181015183820152602001610209565b50505050905090810190601f16801561024e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102886004803603604081101561027257600080fd5b506001600160a01b038135169060200135610719565b604080519115158252519081900360200190f35b6102a4610730565b60408051918252519081900360200190f35b6102e4600480360360408110156102cc57600080fd5b506001600160a01b0381358116916020013516610736565b005b610288600480360360608110156102fc57600080fd5b506001600160a01b038135811691602081013590911690604001356107ce565b6102886004803603602081101561033257600080fd5b503561085c565b6102a46109f6565b610349610a5b565b6040805160ff9092168252519081900360200190f35b6102886004803603604081101561037557600080fd5b506001600160a01b038135169060200135610a60565b6102e4600480360360208110156103a157600080fd5b5035610a9f565b6102e4600480360360208110156103be57600080fd5b5035610b10565b610288600480360360408110156103db57600080fd5b506001600160a01b038135169060200135610cb1565b6102a4610ce3565b6102a46004803603602081101561040f57600080fd5b50356001600160a01b0316610cf4565b6102e4610d0f565b61042f610dc3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561046b578181015183820152602001610453565b505050509050019250505060405180910390f35b610487610e68565b604080516001600160a01b039092168252519081900360200190f35b6102a4600480360360208110156104b957600080fd5b50356001600160a01b0316610e77565b6102e4600480360360608110156104df57600080fd5b506001600160a01b03813581169160208101359091169060400135610ea5565b6101e761104f565b6102e46004803603604081101561051d57600080fd5b506001600160a01b0381351690602001356110b0565b6102886004803603604081101561054957600080fd5b506001600160a01b038135169060200135611125565b6102a46004803603602081101561057557600080fd5b50356001600160a01b0316611164565b6102886004803603602081101561059b57600080fd5b5035611182565b610288600480360360408110156105b857600080fd5b506001600160a01b03813516906020013561124f565b6102a4600480360360208110156105e457600080fd5b50356001600160a01b031661125c565b6102a461127a565b6102a46004803603604081101561061257600080fd5b506001600160a01b03813581169160200135166112dc565b6102e46004803603606081101561064057600080fd5b506001600160a01b03813516906020810135906040013561130b565b6102e46004803603602081101561067257600080fd5b50356001600160a01b031661137e565b60978054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561070e5780601f106106e35761010080835404028352916020019161070e565b820191906000526020600020905b8154815290600101906020018083116106f157829003601f168201915b505050505090505b90565b6000610726338484611489565b5060015b92915050565b60995490565b61073e611515565b6065546001600160a01b039081169116146107a0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b609a80546001600160a01b039384166001600160a01b031991821617909155609b8054929093169116179055565b6001600160a01b0383166000908152609c6020908152604080832033845260020190915281205482111561080157600080fd5b61080c848484611519565b6001600160a01b0384166000908152609c602090815260408083203380855260029091019092529091205461085291869161084d908663ffffffff61162716565b611489565b5060019392505050565b6000816108683361125c565b101561087357600080fd5b336000908152609c6020526040902060048101546001820154849161089e919063ffffffff61162716565b10156108a957600080fd5b609b54600090600160a01b900460ff16156109605760995460c88504906000906108d9908363ffffffff61162716565b905069021e19e0c9bab240000081101561090357609954610900908263ffffffff61162716565b91505b811561095957610919868363ffffffff61162716565b60995490935061092f908363ffffffff61162716565b6099556040805183815290516000913391600080516020611c768339815191529181900360200190a35b5050610963565b50825b6001820154610978908563ffffffff61162716565b6001830155815461098f908263ffffffff61167716565b825560408051828152905133913091600080516020611c768339815191529181900360200190a360408051858152905133917f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd919081900360200190a25060019392505050565b600080805b610a05609d6116c6565b811015610a5557610a4b609c6000610a24609d8563ffffffff6116d116565b6001600160a01b03168152602081019190915260400160002054839063ffffffff61167716565b91506001016109fb565b50905090565b601290565b336000818152609c602090815260408083206001600160a01b0387168452600201909152812054909161072691859061084d908663ffffffff61167716565b336000908152609c602052604090208054821115610abc57600080fd5b8054610ace908363ffffffff61162716565b8155609954610ae3908363ffffffff61162716565b6099556040805183815290516000913391600080516020611c768339815191529181900360200190a35050565b609a546001600160a01b0316331480610b9b5750609b546040805162fcec5360e51b815233600482015290516001600160a01b0390921691631f9d8a6091602480820192602092909190829003018186803b158015610b6e57600080fd5b505afa158015610b82573d6000803e3d6000fd5b505050506040513d6020811015610b9857600080fd5b50515b610ba457600080fd5b60005b610bb1609d6116c6565b811015610c84576000610bcb609d8363ffffffff6116d116565b90506000610bd88261125c565b90508015610c7a576000610bea61127a565b610bfa838763ffffffff6116e416565b81610c0157fe5b0490508015610c7857609b546040805163453d03f360e01b81526001600160a01b038681166004830152602482018590529151919092169163453d03f391604480830192600092919082900301818387803b158015610c5f57600080fd5b505af1158015610c73573d6000803e3d6000fd5b505050505b505b5050600101610ba7565b506040517fcac873607e8a6b1088c9430235e31dc744c15fe900a64c030316066bb06f0ddd90600090a150565b609a546000906001600160a01b03163314610ccb57600080fd5b609a546107269084906001600160a01b031684611489565b6000610cef609d6116c6565b905090565b6001600160a01b03166000908152609c602052604090205490565b610d17611515565b6065546001600160a01b03908116911614610d79576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60606000610dd1609d6116c6565b905060608167ffffffffffffffff81118015610dec57600080fd5b50604051908082528060200260200182016040528015610e16578160200160208202803683370190505b50905060005b82811015610e6157610e35609d8263ffffffff6116d116565b828281518110610e4157fe5b6001600160a01b0390921660209283029190910190910152600101610e1c565b5091505090565b6065546001600160a01b031690565b6001600160a01b0381166000908152609c602052604081206001810154905461072a9163ffffffff61167716565b600054610100900460ff1680610ebe5750610ebe611747565b80610ecc575060005460ff16155b610f075760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff16158015610f32576000805460ff1961ff0019909116610100171660011790555b610f3a61174d565b604080518082019091526014808252732a37b93937902220a7902837b7b6102a37b5b2b760611b6020909201918252610f7591609791611b67565b5060408051808201909152600a808252691513d49493d7d413d3d360b21b6020909201918252610fa791609891611b67565b506099829055609a80546001600160a01b038087166001600160a01b03199283168117909355609b805460ff60a01b199288169316929092171690556000908152609c60205260409020829055611005609d8563ffffffff6117ff16565b5060995460408051918252516001600160a01b03861691600091600080516020611c768339815191529181900360200190a38015611049576000805461ff00191690555b50505050565b60988054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561070e5780601f106106e35761010080835404028352916020019161070e565b609a546001600160a01b031633146110c757600080fd5b6001600160a01b0382166000908152609c602090815260408083208484526003810190925290912054801561111157600482015461110b908263ffffffff61162716565b60048301555b506000918252600301602052604081205550565b336000818152609c602090815260408083206001600160a01b0387168452600201909152812054909161072691859061084d908663ffffffff61162716565b6001600160a01b03166000908152609c602052604090206004015490565b6000670de0b6b3a764000082101561119957600080fd5b816111a333610cf4565b10156111ae57600080fd5b336000908152609c6020526040902080546111cf908463ffffffff61162716565b815560018101546111e6908463ffffffff61167716565b600182015560408051848152905130913391600080516020611c768339815191529181900360200190a360408051848152905133917febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a919081900360200190a250600192915050565b6000610726338484611519565b6001600160a01b03166000908152609c602052604090206001015490565b600080805b611289609d6116c6565b811015610a55576112d2609c60006112a8609d8563ffffffff6116d116565b6001600160a01b03168152602081019190915260400160002060010154839063ffffffff61167716565b915060010161127f565b6001600160a01b039182166000908152609c602090815260408083209390941682526002909201909152205490565b609a546001600160a01b0316331461132257600080fd5b6001600160a01b0383166000908152609c60205260409020600181015483111561134b57600080fd5b600082815260038201602052604090208390556004810154611373908463ffffffff61167716565b600490910155505050565b611386611515565b6065546001600160a01b039081169116146113e8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661142d5760405162461bcd60e51b8152600401808060200182810382526026815260200180611c226026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661149c57600080fd5b6001600160a01b0382166114af57600080fd5b6001600160a01b038084166000818152609c602090815260408083209487168084526002909501825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b3390565b6001600160a01b03831661152c57600080fd5b6001600160a01b03821661153f57600080fd5b6001600160a01b038084166000908152609c602052604080822092851682529020815483111561156e57600080fd5b61157f609d8563ffffffff61181416565b1561159d578054611596908463ffffffff61167716565b81556115b3565b8281556115b1609d8563ffffffff6117ff16565b505b81546115c5908463ffffffff61162716565b82556115d085610e77565b6115e7576115e5609d8663ffffffff61182916565b505b836001600160a01b0316856001600160a01b0316600080516020611c76833981519152856040518082815260200191505060405180910390a35050505050565b8082038281111561072a576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b8082018281101561072a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b600061072a8261183e565b60006116dd8383611842565b9392505050565b60008115806116ff575050808202828282816116fc57fe5b04145b61072a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b303b1590565b600054610100900460ff16806117665750611766611747565b80611774575060005460ff16155b6117af5760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156117da576000805460ff1961ff0019909116610100171660011790555b6117e26118a6565b6117ea611946565b80156117fc576000805461ff00191690555b50565b60006116dd836001600160a01b038416611a3f565b60006116dd836001600160a01b038416611a89565b60006116dd836001600160a01b038416611aa1565b5490565b815460009082106118845760405162461bcd60e51b8152600401808060200182810382526022815260200180611c006022913960400191505060405180910390fd5b82600001828154811061189357fe5b9060005260206000200154905092915050565b600054610100900460ff16806118bf57506118bf611747565b806118cd575060005460ff16155b6119085760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156117ea576000805460ff1961ff00199091166101001716600117905580156117fc576000805461ff001916905550565b600054610100900460ff168061195f575061195f611747565b8061196d575060005460ff16155b6119a85760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156119d3576000805460ff1961ff0019909116610100171660011790555b60006119dd611515565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156117fc576000805461ff001916905550565b6000611a4b8383611a89565b611a815750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561072a565b50600061072a565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611b5d5783546000198083019190810190600090879083908110611ad457fe5b9060005260206000200154905080876000018481548110611af157fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611b2157fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061072a565b600091505061072a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611ba857805160ff1916838001178555611bd5565b82800160010185558215611bd5579182015b82811115611bd5578251825591602001919060010190611bba565b50611be1929150611be5565b5090565b61071691905b80821115611be15760008155600101611beb56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122047307f293d7be7f557f4d42e29fa7f3395a1dd8ed88fc8a7937da6a5b3cc146364736f6c63430006060033436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80638188f71c11610104578063a5f1e282116100a2578063d41ce4b111610071578063d41ce4b1146105f4578063dd62ed3e146105fc578063e3c064031461062a578063f2fde38b1461065c576101da565b8063a5f1e2821461055f578063a694fc3a14610585578063a9059cbb146105a2578063af500ba3146105ce576101da565b806393be3bc6116100de57806393be3bc6146104c957806395d89b41146104ff5780639cedea7c14610507578063a457c2d714610533576101da565b80638188f71c146104275780638da5cb5b1461047f578063912c2673146104a3576101da565b8063313ce5671161017c578063506be6e41161014b578063506be6e4146103c55780636b4ed21b146103f157806370a08231146103f9578063715018a61461041f576101da565b8063313ce56714610341578063395093511461035f57806342966c681461038b5780634c5844e7146103a8576101da565b806322614097116101b857806322614097146102b657806323b872dd146102e65780632e17de781461031c5780632fa6e16b14610339576101da565b806306fdde03146101df578063095ea7b31461025c57806318160ddd1461029c575b600080fd5b6101e7610682565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610221578181015183820152602001610209565b50505050905090810190601f16801561024e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102886004803603604081101561027257600080fd5b506001600160a01b038135169060200135610719565b604080519115158252519081900360200190f35b6102a4610730565b60408051918252519081900360200190f35b6102e4600480360360408110156102cc57600080fd5b506001600160a01b0381358116916020013516610736565b005b610288600480360360608110156102fc57600080fd5b506001600160a01b038135811691602081013590911690604001356107ce565b6102886004803603602081101561033257600080fd5b503561085c565b6102a46109f6565b610349610a5b565b6040805160ff9092168252519081900360200190f35b6102886004803603604081101561037557600080fd5b506001600160a01b038135169060200135610a60565b6102e4600480360360208110156103a157600080fd5b5035610a9f565b6102e4600480360360208110156103be57600080fd5b5035610b10565b610288600480360360408110156103db57600080fd5b506001600160a01b038135169060200135610cb1565b6102a4610ce3565b6102a46004803603602081101561040f57600080fd5b50356001600160a01b0316610cf4565b6102e4610d0f565b61042f610dc3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561046b578181015183820152602001610453565b505050509050019250505060405180910390f35b610487610e68565b604080516001600160a01b039092168252519081900360200190f35b6102a4600480360360208110156104b957600080fd5b50356001600160a01b0316610e77565b6102e4600480360360608110156104df57600080fd5b506001600160a01b03813581169160208101359091169060400135610ea5565b6101e761104f565b6102e46004803603604081101561051d57600080fd5b506001600160a01b0381351690602001356110b0565b6102886004803603604081101561054957600080fd5b506001600160a01b038135169060200135611125565b6102a46004803603602081101561057557600080fd5b50356001600160a01b0316611164565b6102886004803603602081101561059b57600080fd5b5035611182565b610288600480360360408110156105b857600080fd5b506001600160a01b03813516906020013561124f565b6102a4600480360360208110156105e457600080fd5b50356001600160a01b031661125c565b6102a461127a565b6102a46004803603604081101561061257600080fd5b506001600160a01b03813581169160200135166112dc565b6102e46004803603606081101561064057600080fd5b506001600160a01b03813516906020810135906040013561130b565b6102e46004803603602081101561067257600080fd5b50356001600160a01b031661137e565b60978054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561070e5780601f106106e35761010080835404028352916020019161070e565b820191906000526020600020905b8154815290600101906020018083116106f157829003601f168201915b505050505090505b90565b6000610726338484611489565b5060015b92915050565b60995490565b61073e611515565b6065546001600160a01b039081169116146107a0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b609a80546001600160a01b039384166001600160a01b031991821617909155609b8054929093169116179055565b6001600160a01b0383166000908152609c6020908152604080832033845260020190915281205482111561080157600080fd5b61080c848484611519565b6001600160a01b0384166000908152609c602090815260408083203380855260029091019092529091205461085291869161084d908663ffffffff61162716565b611489565b5060019392505050565b6000816108683361125c565b101561087357600080fd5b336000908152609c6020526040902060048101546001820154849161089e919063ffffffff61162716565b10156108a957600080fd5b609b54600090600160a01b900460ff16156109605760995460c88504906000906108d9908363ffffffff61162716565b905069021e19e0c9bab240000081101561090357609954610900908263ffffffff61162716565b91505b811561095957610919868363ffffffff61162716565b60995490935061092f908363ffffffff61162716565b6099556040805183815290516000913391600080516020611c768339815191529181900360200190a35b5050610963565b50825b6001820154610978908563ffffffff61162716565b6001830155815461098f908263ffffffff61167716565b825560408051828152905133913091600080516020611c768339815191529181900360200190a360408051858152905133917f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd919081900360200190a25060019392505050565b600080805b610a05609d6116c6565b811015610a5557610a4b609c6000610a24609d8563ffffffff6116d116565b6001600160a01b03168152602081019190915260400160002054839063ffffffff61167716565b91506001016109fb565b50905090565b601290565b336000818152609c602090815260408083206001600160a01b0387168452600201909152812054909161072691859061084d908663ffffffff61167716565b336000908152609c602052604090208054821115610abc57600080fd5b8054610ace908363ffffffff61162716565b8155609954610ae3908363ffffffff61162716565b6099556040805183815290516000913391600080516020611c768339815191529181900360200190a35050565b609a546001600160a01b0316331480610b9b5750609b546040805162fcec5360e51b815233600482015290516001600160a01b0390921691631f9d8a6091602480820192602092909190829003018186803b158015610b6e57600080fd5b505afa158015610b82573d6000803e3d6000fd5b505050506040513d6020811015610b9857600080fd5b50515b610ba457600080fd5b60005b610bb1609d6116c6565b811015610c84576000610bcb609d8363ffffffff6116d116565b90506000610bd88261125c565b90508015610c7a576000610bea61127a565b610bfa838763ffffffff6116e416565b81610c0157fe5b0490508015610c7857609b546040805163453d03f360e01b81526001600160a01b038681166004830152602482018590529151919092169163453d03f391604480830192600092919082900301818387803b158015610c5f57600080fd5b505af1158015610c73573d6000803e3d6000fd5b505050505b505b5050600101610ba7565b506040517fcac873607e8a6b1088c9430235e31dc744c15fe900a64c030316066bb06f0ddd90600090a150565b609a546000906001600160a01b03163314610ccb57600080fd5b609a546107269084906001600160a01b031684611489565b6000610cef609d6116c6565b905090565b6001600160a01b03166000908152609c602052604090205490565b610d17611515565b6065546001600160a01b03908116911614610d79576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b60606000610dd1609d6116c6565b905060608167ffffffffffffffff81118015610dec57600080fd5b50604051908082528060200260200182016040528015610e16578160200160208202803683370190505b50905060005b82811015610e6157610e35609d8263ffffffff6116d116565b828281518110610e4157fe5b6001600160a01b0390921660209283029190910190910152600101610e1c565b5091505090565b6065546001600160a01b031690565b6001600160a01b0381166000908152609c602052604081206001810154905461072a9163ffffffff61167716565b600054610100900460ff1680610ebe5750610ebe611747565b80610ecc575060005460ff16155b610f075760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff16158015610f32576000805460ff1961ff0019909116610100171660011790555b610f3a61174d565b604080518082019091526014808252732a37b93937902220a7902837b7b6102a37b5b2b760611b6020909201918252610f7591609791611b67565b5060408051808201909152600a808252691513d49493d7d413d3d360b21b6020909201918252610fa791609891611b67565b506099829055609a80546001600160a01b038087166001600160a01b03199283168117909355609b805460ff60a01b199288169316929092171690556000908152609c60205260409020829055611005609d8563ffffffff6117ff16565b5060995460408051918252516001600160a01b03861691600091600080516020611c768339815191529181900360200190a38015611049576000805461ff00191690555b50505050565b60988054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561070e5780601f106106e35761010080835404028352916020019161070e565b609a546001600160a01b031633146110c757600080fd5b6001600160a01b0382166000908152609c602090815260408083208484526003810190925290912054801561111157600482015461110b908263ffffffff61162716565b60048301555b506000918252600301602052604081205550565b336000818152609c602090815260408083206001600160a01b0387168452600201909152812054909161072691859061084d908663ffffffff61162716565b6001600160a01b03166000908152609c602052604090206004015490565b6000670de0b6b3a764000082101561119957600080fd5b816111a333610cf4565b10156111ae57600080fd5b336000908152609c6020526040902080546111cf908463ffffffff61162716565b815560018101546111e6908463ffffffff61167716565b600182015560408051848152905130913391600080516020611c768339815191529181900360200190a360408051848152905133917febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a919081900360200190a250600192915050565b6000610726338484611519565b6001600160a01b03166000908152609c602052604090206001015490565b600080805b611289609d6116c6565b811015610a55576112d2609c60006112a8609d8563ffffffff6116d116565b6001600160a01b03168152602081019190915260400160002060010154839063ffffffff61167716565b915060010161127f565b6001600160a01b039182166000908152609c602090815260408083209390941682526002909201909152205490565b609a546001600160a01b0316331461132257600080fd5b6001600160a01b0383166000908152609c60205260409020600181015483111561134b57600080fd5b600082815260038201602052604090208390556004810154611373908463ffffffff61167716565b600490910155505050565b611386611515565b6065546001600160a01b039081169116146113e8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661142d5760405162461bcd60e51b8152600401808060200182810382526026815260200180611c226026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661149c57600080fd5b6001600160a01b0382166114af57600080fd5b6001600160a01b038084166000818152609c602090815260408083209487168084526002909501825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b3390565b6001600160a01b03831661152c57600080fd5b6001600160a01b03821661153f57600080fd5b6001600160a01b038084166000908152609c602052604080822092851682529020815483111561156e57600080fd5b61157f609d8563ffffffff61181416565b1561159d578054611596908463ffffffff61167716565b81556115b3565b8281556115b1609d8563ffffffff6117ff16565b505b81546115c5908463ffffffff61162716565b82556115d085610e77565b6115e7576115e5609d8663ffffffff61182916565b505b836001600160a01b0316856001600160a01b0316600080516020611c76833981519152856040518082815260200191505060405180910390a35050505050565b8082038281111561072a576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b8082018281101561072a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b600061072a8261183e565b60006116dd8383611842565b9392505050565b60008115806116ff575050808202828282816116fc57fe5b04145b61072a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b303b1590565b600054610100900460ff16806117665750611766611747565b80611774575060005460ff16155b6117af5760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156117da576000805460ff1961ff0019909116610100171660011790555b6117e26118a6565b6117ea611946565b80156117fc576000805461ff00191690555b50565b60006116dd836001600160a01b038416611a3f565b60006116dd836001600160a01b038416611a89565b60006116dd836001600160a01b038416611aa1565b5490565b815460009082106118845760405162461bcd60e51b8152600401808060200182810382526022815260200180611c006022913960400191505060405180910390fd5b82600001828154811061189357fe5b9060005260206000200154905092915050565b600054610100900460ff16806118bf57506118bf611747565b806118cd575060005460ff16155b6119085760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156117ea576000805460ff1961ff00199091166101001716600117905580156117fc576000805461ff001916905550565b600054610100900460ff168061195f575061195f611747565b8061196d575060005460ff16155b6119a85760405162461bcd60e51b815260040180806020018281038252602e815260200180611c48602e913960400191505060405180910390fd5b600054610100900460ff161580156119d3576000805460ff1961ff0019909116610100171660011790555b60006119dd611515565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156117fc576000805461ff001916905550565b6000611a4b8383611a89565b611a815750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561072a565b50600061072a565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611b5d5783546000198083019190810190600090879083908110611ad457fe5b9060005260206000200154905080876000018481548110611af157fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611b2157fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061072a565b600091505061072a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611ba857805160ff1916838001178555611bd5565b82800160010185558215611bd5579182015b82811115611bd5578251825591602001919060010190611bba565b50611be1929150611be5565b5090565b61071691905b80821115611be15760008155600101611beb56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122047307f293d7be7f557f4d42e29fa7f3395a1dd8ed88fc8a7937da6a5b3cc146364736f6c63430006060033
Deployed Bytecode Sourcemap
346:14737:7:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;346:14737:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;3378:86:7;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3378:86:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7569:153;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7569:153:7;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3894:91;;;:::i;:::-;;;;;;;;;;;;;;;;14940:140;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;14940:140:7;;;;;;;;;;:::i;:::-;;9378:330;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;9378:330:7;;;;;;;;;;;;;;;;;:::i;11268:893::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11268:893:7;;:::i;6305:256::-;;;:::i;3716:86::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9929:218;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;9929:218:7;;;;;;;;:::i;12988:300::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12988:300:7;;:::i;12301:586::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12301:586:7;;:::i;7929:180::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7929:180:7;;;;;;;;:::i;4078:108::-;;;:::i;4776:120::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4776:120:7;-1:-1:-1;;;;;4776:120:7;;:::i;1888:145:5:-;;;:::i;4278:317:7:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4278:317:7;;;;;;;;;;;;;;;;;1265:77:5;;;:::i;:::-;;;;-1:-1:-1;;;;;1265:77:5;;;;;;;;;;;;;;5376:148:7;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5376:148:7;-1:-1:-1;;;;;5376:148:7;;:::i;2850:430::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;2850:430:7;;;;;;;;;;;;;;;;;:::i;3544:90::-;;;:::i;8740:317::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;8740:317:7;;;;;;;;:::i;10375:228::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;10375:228:7;;;;;;;;:::i;5716:118::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5716:118:7;-1:-1:-1;;;;;5716:118:7;;:::i;10730:406::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10730:406:7;;:::i;7158:159::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7158:159:7;;;;;;;;:::i;5068:118::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5068:118:7;-1:-1:-1;;;;;5068:118:7;;:::i;6678:253::-;;;:::i;6033:149::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;6033:149:7;;;;;;;;;;:::i;8296:299::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;8296:299:7;;;;;;;;;;;;;:::i;2182:240:5:-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2182:240:5;-1:-1:-1;;;;;2182:240:5;;:::i;3378:86:7:-;3453:5;3446:12;;;;;;;;-1:-1:-1;;3446:12:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3424:13;;3446:12;;3453:5;;3446:12;;3453:5;3446:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3378:86;;:::o;7569:153::-;7646:4;7659:39;7668:10;7680:8;7690:7;7659:8;:39::i;:::-;-1:-1:-1;7712:4:7;7569:153;;;;;:::o;3894:91::-;3968:12;;3894:91;:::o;14940:140::-;1479:12:5;:10;:12::i;:::-;1469:6;;-1:-1:-1;;;;;1469:6:5;;;:22;;;1461:67;;;;;-1:-1:-1;;;1461:67:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15037:4:7::1;:11:::0;;-1:-1:-1;;;;;15037:11:7;;::::1;-1:-1:-1::0;;;;;;15037:11:7;;::::1;;::::0;;;15055:8:::1;:19:::0;;;;;::::1;::::0;::::1;;::::0;;14940:140::o;9378:330::-;-1:-1:-1;;;;;9499:16:7;;9478:4;9499:16;;;:8;:16;;;;;;;;9527:10;9499:39;;:27;;:39;;;;;;:50;-1:-1:-1;9499:50:7;9491:59;;12:1:-1;9;2:12;9491:59:7;9557:38;9567:6;9575:10;9587:7;9557:9;:38::i;:::-;-1:-1:-1;;;;;9631:16:7;;;;;;:8;:16;;;;;;;;9619:10;9631:39;;;:27;;;;:39;;;;;;;9602:82;;9611:6;;9631:52;;9675:7;9631:52;:43;:52;:::i;:::-;9602:8;:82::i;:::-;-1:-1:-1;9698:4:7;9378:330;;;;;:::o;11268:893::-;11327:4;11372:7;11348:20;11357:10;11348:8;:20::i;:::-;:31;;11340:40;;12:1:-1;9;2:12;11340:40:7;11420:10;11387:21;11411:20;;;:8;:20;;;;;11464:13;;;;11446;;;;11482:7;;11446:32;;:13;:32;:17;:32;:::i;:::-;:43;;11438:52;;12:1:-1;9;2:12;11438:52:7;11524:7;;11499:14;;-1:-1:-1;;;11524:7:7;;;;11520:424;;;11605:12;;11567:3;11557:13;;;11542:12;;11605:22;;11557:13;11605:22;:16;:22;:::i;:::-;11579:48;;11658:4;11640:15;:22;11636:89;;;11682:12;;:33;;11699:15;11682:33;:16;:33;:::i;:::-;11675:40;;11636:89;11737:8;;11733:165;;11767:17;:7;11779:4;11767:17;:11;:17;:::i;:::-;11810:12;;11758:26;;-1:-1:-1;11810:22:7;;11827:4;11810:22;:16;:22;:::i;:::-;11795:12;:37;11848:40;;;;;;;;11877:3;;11857:10;;-1:-1:-1;;;;;;;;;;;11848:40:7;;;;;;;;11733:165;11520:424;;;;;-1:-1:-1;11929:7:7;11520:424;11966:13;;;;:26;;11984:7;11966:26;:17;:26;:::i;:::-;11950:13;;;:42;12016:14;;:26;;12035:6;12016:26;:18;:26;:::i;:::-;11999:43;;12054;;;;;;;;12078:10;;12071:4;;-1:-1:-1;;;;;;;;;;;12054:43:7;;;;;;;;12109:28;;;;;;;;12117:10;;12109:28;;;;;;;;;;-1:-1:-1;12151:4:7;;11268:893;-1:-1:-1;;;11268:893:7:o;6305:256::-;6361:7;;;6402:134;6426:25;:16;:23;:25::i;:::-;6422:1;:29;6402:134;;;6476:52;6487:8;:32;6496:22;:16;6516:1;6496:22;:19;:22;:::i;:::-;-1:-1:-1;;;;;6487:32:7;;;;;;;;;;;;-1:-1:-1;6487:32:7;:40;6476:6;;:52;:10;:52;:::i;:::-;6467:61;-1:-1:-1;6453:3:7;;6402:134;;;-1:-1:-1;6549:6:7;-1:-1:-1;6305:256:7;:::o;3716:86::-;790:2;3716:86;:::o;9929:218::-;10042:10;10020:4;10064:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;10064:41:7;;;;:31;;:41;;;;;;10020:4;;10033:90;;10054:8;;10064:58;;10110:11;10064:58;:45;:58;:::i;12988:300::-;13075:10;13042:21;13066:20;;;:8;:20;;;;;13101:14;;:25;-1:-1:-1;13101:25:7;13093:34;;12:1:-1;9;2:12;13093:34:7;13151:14;;:27;;13170:7;13151:27;:18;:27;:::i;:::-;13134:44;;13200:12;;:25;;13217:7;13200:25;:16;:25;:::i;:::-;13185:12;:40;13239:43;;;;;;;;13268:3;;13248:10;;-1:-1:-1;;;;;;;;;;;13239:43:7;;;;;;;;12988:300;;:::o;12301:586::-;12384:4;;-1:-1:-1;;;;;12384:4:7;12370:10;:18;;:63;;-1:-1:-1;12406:8:7;;12392:41;;;-1:-1:-1;;;12392:41:7;;12422:10;12392:41;;;;;;-1:-1:-1;;;;;12406:8:7;;;;12392:29;;:41;;;;;;;;;;;;;;;12406:8;12392:41;;;2:2:-1;;;;27:1;24;17:12;2:2;12392:41:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12392:41:7;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12392:41:7;12370:63;12362:72;;12:1:-1;9;2:12;12362:72:7;12446:9;12441:354;12465:25;:16;:23;:25::i;:::-;12461:1;:29;12441:354;;;12506:14;12523:22;:16;12543:1;12523:22;:19;:22;:::i;:::-;12506:39;;12554:14;12571:16;12580:6;12571:8;:16::i;:::-;12554:33;-1:-1:-1;12600:10:7;;12596:192;;12623:14;12662;:12;:14::i;:::-;12640:19;:6;12651:7;12640:19;:10;:19;:::i;:::-;:36;;;;;;;-1:-1:-1;12691:10:7;;12687:92;;12730:8;;12716:51;;;-1:-1:-1;;;12716:51:7;;-1:-1:-1;;;;;12716:51:7;;;;;;;;;;;;;;;12730:8;;;;;12716:35;;:51;;;;;12730:8;;12716:51;;;;;;;12730:8;;12716:51;;;2:2:-1;;;;27:1;24;17:12;2:2;12716:51:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12716:51:7;;;;12687:92;12596:192;;-1:-1:-1;;12492:3:7;;12441:354;;;-1:-1:-1;12868:13:7;;;;;;;12301:586;:::o;7929:180::-;8042:4;;8007;;-1:-1:-1;;;;;8042:4:7;8028:10;:18;8020:27;;12:1:-1;9;2:12;8020:27:7;8071:4;;8054:31;;8063:6;;-1:-1:-1;;;;;8071:4:7;8077:7;8054:8;:31::i;4078:108::-;4132:7;4155:25;:16;:23;:25::i;:::-;4148:32;;4078:108;:::o;4776:120::-;-1:-1:-1;;;;;4865:17:7;4842:7;4865:17;;;:8;:17;;;;;:25;;4776:120::o;1888:145:5:-;1479:12;:10;:12::i;:::-;1469:6;;-1:-1:-1;;;;;1469:6:5;;;:22;;;1461:67;;;;;-1:-1:-1;;;1461:67:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1978:6:::1;::::0;1957:40:::1;::::0;1994:1:::1;::::0;-1:-1:-1;;;;;1978:6:5::1;::::0;1957:40:::1;::::0;1994:1;;1957:40:::1;2007:6;:19:::0;;-1:-1:-1;;;;;;2007:19:5::1;::::0;;1888:145::o;4278:317:7:-;4327:16;4352:14;4369:25;:16;:23;:25::i;:::-;4352:42;;4401:32;4450:6;4436:21;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4436:21:7;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;4436:21:7;-1:-1:-1;4401:56:7;-1:-1:-1;4469:9:7;4464:97;4488:6;4484:1;:10;4464:97;;;4531:22;:16;4551:1;4531:22;:19;:22;:::i;:::-;4510:15;4526:1;4510:18;;;;;;;;-1:-1:-1;;;;;4510:43:7;;;:18;;;;;;;;;;;:43;4496:3;;4464:97;;;-1:-1:-1;4574:15:7;-1:-1:-1;;4278:317:7;:::o;1265:77:5:-;1329:6;;-1:-1:-1;;;;;1329:6:5;1265:77;:::o;5376:148:7:-;-1:-1:-1;;;;;5493:17:7;;5440:7;5493:17;;;:8;:17;;;;;:24;;;;5463:25;;:55;;;:29;:55;:::i;2850:430::-;1024:12:4;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:4;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:4;;;;;1225:18;1213:4;1225:18;;;1170:80;2960:16:7::1;:14;:16::i;:::-;2985:30;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;2985:30:7::1;::::0;;::::1;::::0;;;::::1;::::0;:5:::1;::::0;:30:::1;:::i;:::-;-1:-1:-1::0;3022:22:7::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;3022:22:7::1;::::0;;::::1;::::0;;;::::1;::::0;:7:::1;::::0;:22:::1;:::i;:::-;-1:-1:-1::0;3051:12:7::1;:22:::0;;;3080:4:::1;:11:::0;;-1:-1:-1;;;;;3080:11:7;;::::1;-1:-1:-1::0;;;;;;3080:11:7;;::::1;::::0;::::1;::::0;;;3098:8:::1;:19:::0;;-1:-1:-1;;;;3098:19:7;;::::1;::::0;::::1;::::0;;;::::1;3124:15;::::0;;3080:4:::1;3148:14:::0;;;:8:::1;:14;::::0;;;;:37;;;3192:26:::1;:16;3087:4:::0;3192:26:::1;:20;:26;:::i;:::-;-1:-1:-1::0;3261:12:7::1;::::0;3232:42:::1;::::0;;;;;;-1:-1:-1;;;;;3232:42:7;::::1;::::0;3249:3:::1;::::0;-1:-1:-1;;;;;;;;;;;3232:42:7;;;;::::1;::::0;;::::1;1268:14:4::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:4;;;1264:55;2850:430:7;;;;:::o;3544:90::-;3621:7;3614:14;;;;;;;;-1:-1:-1;;3614:14:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3592:13;;3614:14;;3621:7;;3614:14;;3621:7;3614:14;;;;;;;;;;;;;;;;;;;;;;;;8740:317;8839:4;;-1:-1:-1;;;;;8839:4:7;8825:10;:18;8817:27;;12:1:-1;9;2:12;8817:27:7;-1:-1:-1;;;;;8875:16:7;;8851:21;8875:16;;;:8;:16;;;;;;;;8915:21;;;:16;;;:21;;;;;;;8947:10;;8943:74;;8984:13;;;;:25;;9002:6;8984:25;:17;:25;:::i;:::-;8968:13;;;:41;8943:74;-1:-1:-1;9030:21:7;;;;:16;;:21;;;;;9023:28;-1:-1:-1;8740:317:7:o;10375:228::-;10493:10;10471:4;10515:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;10515:41:7;;;;:31;;:41;;;;;;10471:4;;10484:95;;10505:8;;10515:63;;10561:16;10515:63;:45;:63;:::i;5716:118::-;-1:-1:-1;;;;;5804:17:7;5781:7;5804:17;;;:8;:17;;;;;:24;;;;5716:118::o;10730:406::-;10787:4;10819;10808:7;:15;;10800:24;;12:1:-1;9;2:12;10800:24:7;10864:7;10839:21;10849:10;10839:9;:21::i;:::-;:32;;10831:41;;12:1:-1;9;2:12;10831:41:7;10912:10;10879:21;10903:20;;;:8;:20;;;;;10947:14;;:27;;10966:7;10947:27;:18;:27;:::i;:::-;10930:44;;10997:13;;;;:26;;11015:7;10997:26;:17;:26;:::i;:::-;10981:13;;;:42;11033:44;;;;;;;;11062:4;;11042:10;;-1:-1:-1;;;;;;;;;;;11033:44:7;;;;;;;;11087:26;;;;;;;;11093:10;;11087:26;;;;;;;;;;-1:-1:-1;11127:4:7;;10730:406;-1:-1:-1;;10730:406:7:o;7158:159::-;7238:4;7251:42;7261:10;7273;7285:7;7251:9;:42::i;5068:118::-;-1:-1:-1;;;;;5156:17:7;5133:7;5156:17;;;:8;:17;;;;;:24;;;;5068:118::o;6678:253::-;6732:7;;;6773:133;6797:25;:16;:23;:25::i;:::-;6793:1;:29;6773:133;;;6847:51;6858:8;:32;6867:22;:16;6887:1;6867:22;:19;:22;:::i;:::-;-1:-1:-1;;;;;6858:32:7;;;;;;;;;;;;-1:-1:-1;6858:32:7;:39;;;6847:6;;:51;:10;:51;:::i;:::-;6838:60;-1:-1:-1;6824:3:7;;6773:133;;6033:149;-1:-1:-1;;;;;6139:16:7;;;6116:7;6139:16;;;:8;:16;;;;;;;;:37;;;;;;:27;;;;:37;;;;;;6033:149::o;8296:299::-;8410:4;;-1:-1:-1;;;;;8410:4:7;8396:10;:18;8388:27;;12:1:-1;9;2:12;8388:27:7;-1:-1:-1;;;;;8446:16:7;;8422:21;8446:16;;;:8;:16;;;;;8477:13;;;;:24;-1:-1:-1;8477:24:7;8469:33;;12:1:-1;9;2:12;8469:33:7;8509:21;;;;:16;;;:21;;;;;:31;;;8563:13;;;;:26;;8533:7;8563:26;:17;:26;:::i;:::-;8547:13;;;;:42;-1:-1:-1;;;8296:299:7:o;2182:240:5:-;1479:12;:10;:12::i;:::-;1469:6;;-1:-1:-1;;;;;1469:6:5;;;:22;;;1461:67;;;;;-1:-1:-1;;;1461:67:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2270:22:5;::::1;2262:73;;;;-1:-1:-1::0;;;2262:73:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2371:6;::::0;2350:38:::1;::::0;-1:-1:-1;;;;;2350:38:5;;::::1;::::0;2371:6:::1;::::0;2350:38:::1;::::0;2371:6:::1;::::0;2350:38:::1;2398:6;:17:::0;;-1:-1:-1;;;;;;2398:17:5::1;-1:-1:-1::0;;;;;2398:17:5;;;::::1;::::0;;;::::1;::::0;;2182:240::o;14497:266:7:-;-1:-1:-1;;;;;14589:22:7;;14581:31;;12:1:-1;9;2:12;14581:31:7;-1:-1:-1;;;;;14627:24:7;;14619:33;;12:1:-1;9;2:12;14619:33:7;-1:-1:-1;;;;;14661:16:7;;;;;;;:8;:16;;;;;;;;:37;;;;;;:27;;;;:37;;;;;;:47;;;14722:35;;;;;;;;;;;;;;;;;14497:266;;;:::o;930:104:0:-;1017:10;930:104;:::o;13537:709:7:-;-1:-1:-1;;;;;13633:23:7;;13625:32;;12:1:-1;9;2:12;13625:32:7;-1:-1:-1;;;;;13672:26:7;;13664:35;;12:1:-1;9;2:12;13664:35:7;-1:-1:-1;;;;;13732:17:7;;;13708:21;13732:17;;;:8;:17;;;;;;13783:20;;;;;;;13820:14;;:25;-1:-1:-1;13820:25:7;13812:34;;12:1:-1;9;2:12;13812:34:7;13859:37;:16;13885:10;13859:37;:25;:37;:::i;:::-;13855:201;;;13927:17;;:30;;13949:7;13927:30;:21;:30;:::i;:::-;13907:50;;13855:201;;;13980:27;;;14016:32;:16;14037:10;14016:32;:20;:32;:::i;:::-;;13855:201;14079:14;;:27;;14098:7;14079:27;:18;:27;:::i;:::-;14062:44;;14117:16;14125:7;14117;:16::i;:::-;14113:76;;14149:32;:16;14173:7;14149:32;:23;:32;:::i;:::-;;14113:76;14220:10;-1:-1:-1;;;;;14202:38:7;14211:7;-1:-1:-1;;;;;14202:38:7;-1:-1:-1;;;;;;;;;;;14232:7:7;14202:38;;;;;;;;;;;;;;;;;;13537:709;;;;;:::o;286:127:6:-;369:5;;;364:16;;;;356:50;;;;;-1:-1:-1;;;356:50:6;;;;;;;;;;;;-1:-1:-1;;;356:50:6;;;;;;;;;;;;;;154:126;237:5;;;232:16;;;;224:49;;;;;-1:-1:-1;;;224:49:6;;;;;;;;;;;;-1:-1:-1;;;224:49:6;;;;;;;;;;;;;;5605:115:1;5668:7;5694:19;5702:3;5694:7;:19::i;6052:147::-;6126:7;6168:22;6172:3;6184:5;6168:3;:22::i;:::-;6160:31;6052:147;-1:-1:-1;;;6052:147:1:o;419:140:6:-;471:6;497;;;:30;;-1:-1:-1;;512:5:6;;;526:1;521;512:5;521:1;507:15;;;;;:20;497:30;489:63;;;;;-1:-1:-1;;;489:63:6;;;;;;;;;;;;-1:-1:-1;;;489:63:6;;;;;;;;;;;;;;1409:498:4;1820:4;1864:17;1895:7;1409:498;:::o;861:126:5:-;1024:12:4;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:4;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:4;;;;;1225:18;1213:4;1225:18;;;1170:80;918:26:5::1;:24;:26::i;:::-;954;:24;:26::i;:::-;1268:14:4::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:4;;;1264:55;861:126:5;:::o;4831:141:1:-;4901:4;4924:41;4929:3;-1:-1:-1;;;;;4949:14:1;;4924:4;:41::i;5368:156::-;5448:4;5471:46;5481:3;-1:-1:-1;;;;;5501:14:1;;5471:9;:46::i;5140:147::-;5213:4;5236:44;5244:3;-1:-1:-1;;;;;5264:14:1;;5236:7;:44::i;3951:107::-;4033:18;;3951:107::o;4390:201::-;4484:18;;4457:7;;4484:26;-1:-1:-1;4476:73:1;;;;-1:-1:-1;;;4476:73:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4566:3;:11;;4578:5;4566:18;;;;;;;;;;;;;;;;4559:25;;4390:201;;;;:::o;857:66:0:-;1024:12:4;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:4;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:4;;;;;1225:18;1213:4;1225:18;;;1268:14;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:4;;;857:66:0;:::o;993:195:5:-;1024:12:4;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:4;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:4;;;;;1225:18;1213:4;1225:18;;;1170:80;1062:17:5::1;1082:12;:10;:12::i;:::-;1104:6;:18:::0;;-1:-1:-1;;;;;;1104:18:5::1;-1:-1:-1::0;;;;;1104:18:5;::::1;::::0;;::::1;::::0;;;1137:43:::1;::::0;1104:18;;-1:-1:-1;1104:18:5;-1:-1:-1;;1137:43:5::1;::::0;-1:-1:-1;;1137:43:5::1;1256:1:4;1268:14:::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:4;;;993:195:5;:::o;1578:404:1:-;1641:4;1662:21;1672:3;1677:5;1662:9;:21::i;:::-;1657:319;;-1:-1:-1;27:10;;39:1;23:18;;;45:23;;1699:11:1;:23;;;;;;;;;;;;;1879:18;;1857:19;;;:12;;;:19;;;;;;:40;;;;1911:11;;1657:319;-1:-1:-1;1960:5:1;1953:12;;3743:127;3816:4;3839:19;;;:12;;;;;:19;;;;;;:24;;;3743:127::o;2150:1512::-;2216:4;2353:19;;;:12;;;:19;;;;;;2387:15;;2383:1273;;2816:18;;-1:-1:-1;;2768:14:1;;;;2816:22;;;;2744:21;;2816:3;;:22;;3098;;;;;;;;;;;;;;3078:42;;3241:9;3212:3;:11;;3224:13;3212:26;;;;;;;;;;;;;;;;;;;:38;;;;3316:23;;;3358:1;3316:12;;;:23;;;;;;3342:17;;;3316:43;;3465:17;;3316:3;;3465:17;;;;;;;;;;;;;;;;;;;;;;3557:3;:12;;:19;3570:5;3557:19;;;;;;;;;;;3550:26;;;3598:4;3591:11;;;;;;;;2383:1273;3640:5;3633:12;;;;;346:14737:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;346:14737:7;;;-1:-1:-1;346:14737:7;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://47307f293d7be7f557f4d42e29fa7f3395a1dd8ed88fc8a7937da6a5b3cc1463
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.