Polygon Sponsored slots available. Book your slot here!
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
AdValoremStakingPool
Compiler Version
v0.7.0+commit.9e61f92b
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-06-27 */ // SPDX-License-Identifier: MIT pragma solidity ^0.7.0; pragma experimental ABIEncoderV2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // taken from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol // removed constructor for upgradeability warnings /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // 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; } } /** * @title SafeBEP20 * @dev Wrappers around BEP20 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 SafeBEP20 for IBEP20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeBEP20 { using SafeMath for uint256; using Address for address; function safeTransfer( IBEP20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IBEP20 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 * {IBEP20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IBEP20 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), 'SafeBEP20: approve from non-zero to non-zero allowance' ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IBEP20 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( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, 'SafeBEP20: 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(IBEP20 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, 'SafeBEP20: low-level call failed'); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), 'SafeBEP20: BEP20 operation did not succeed'); } } } interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library 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; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } 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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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); } } } } library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } interface IToken { function mint(address _to, uint256 _amount) external; function burn(address _from, uint256 _amount) external; function owner() external returns (address); } contract AdValoremStakingPool is OwnableUpgradeable, ReentrancyGuard { using SafeMath for uint256; using SafeBEP20 for IBEP20; struct UserPoolInfo { uint256 amount; // How many tokens the user has provided. uint256 timeDeposited; // When pool is deposited. uint256 timeClaimed; // When the reward token is claimed. } // Info of each pool. struct PoolInfo { uint256 totalSupply; uint256 apr; // How many allocation points assigned to this pool. PAYs to distribute per block. uint256 timeLocked; // How long stake must be locked for string label; // Pool label bool isActive; // Pool active } // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes VLR tokens. mapping(uint256 => mapping(address => UserPoolInfo)) public userPoolInfo; address public adValoremToken; uint256 public totalRewardSupply; uint256 public constant PRECISION = 10000; uint256 private constant YEAR_TIME = 365 days; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event PoolAdded(uint256 apr, uint256 timeLocked, string label); event SetPoolInfo(uint256 pid, uint256 apr, uint256 timeLocked, string label, bool isActive); event RewardTokenDeposited(uint256 amount); event Claimed(address user, uint256 pid, uint256 rewardAmount); event EmergencyWithdraw(address user, uint256 pid, uint256 amount); event RewardTokenWithdrawn(address user, uint256 amount); function initialize(address _adValoremToken) external initializer { __Ownable_init(); adValoremToken = _adValoremToken; // staking pool poolInfo.push( PoolInfo({ totalSupply: 0, apr: 500, timeLocked: 30 * 24 * 60 * 60,// 30 days timestamp label: "Pool One", isActive: true }) ); poolInfo.push( PoolInfo({ totalSupply: 0, apr: 1000, timeLocked: 60 * 24 * 60 * 60,// 60 days timestamp label: "Pool two", isActive: true }) ); poolInfo.push( PoolInfo({ totalSupply: 0, apr: 1500, timeLocked: 180 * 24 * 60 * 60,// 180 days timestamp label: "Pool Three", isActive: true }) ); poolInfo.push( PoolInfo({ totalSupply: 0, apr: 2000, timeLocked: 360 * 24 * 60 * 60, // 360 days timestamp label: "Pool Four", isActive: true }) ); } function poolLength() external view returns (uint256) { return poolInfo.length; } /* ========== External Functions ========== */ // View function to see pending PAYs from Pools on frontend. function pendingReward(uint256 _pid, address _user) public view returns (uint256) { PoolInfo memory pool = poolInfo[_pid]; UserPoolInfo storage user = userPoolInfo[_pid][_user]; // Minting reward uint256 rewardDuration = 0; if (user.timeClaimed.sub(user.timeDeposited) <= pool.timeLocked) { if (block.timestamp.sub(user.timeClaimed) <= pool.timeLocked) { rewardDuration = block.timestamp - user.timeClaimed; } else { rewardDuration = pool.timeLocked; } } else { rewardDuration = 0; } uint256 pendingUserAdValorem = user .amount .mul(rewardDuration) .mul(pool.apr) .div(PRECISION) .div(YEAR_TIME); return pendingUserAdValorem; } // Deposit PAY tokens for PAY allocation. function deposit(uint256 _pid, uint256 _amount) external nonReentrant { _deposit(_pid, _amount); } function _deposit(uint256 _pid, uint256 _amount) private { PoolInfo storage pool = poolInfo[_pid]; UserPoolInfo storage user = userPoolInfo[_pid][msg.sender]; require(pool.isActive, "deposit: This Pool is non activated"); if (user.amount > 0) { _claimPendingReward(_pid, address(msg.sender)); } else { user.timeDeposited = block.timestamp; user.timeClaimed = block.timestamp; } if (_amount > 0) { uint256 before = IBEP20(adValoremToken).balanceOf(address(this)); IBEP20(adValoremToken).safeTransferFrom( address(msg.sender), address(this), _amount ); uint256 post = IBEP20(adValoremToken).balanceOf(address(this)); uint256 finalAmount = post.sub(before); uint256 remain = user.amount.add(finalAmount); user.amount = remain; pool.totalSupply = pool.totalSupply.add(finalAmount); emit Deposit(msg.sender, _pid, finalAmount); } } // Withdraw tokens function withdraw(uint256 _pid, uint256 _amount) external nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserPoolInfo storage user = userPoolInfo[_pid][msg.sender]; require( block.timestamp >= user.timeDeposited + pool.timeLocked, "withdraw: Time locked" ); require(user.amount - _amount >= 0, "withdraw: not good"); if (user.amount > 0) { _claimPendingReward(_pid, address(msg.sender)); } if (_amount > 0) { uint256 remain = user.amount.sub(_amount); user.amount = remain; pool.totalSupply = pool.totalSupply.sub(_amount); IBEP20(adValoremToken).safeTransfer(address(msg.sender), _amount); } } // claim reward tokens function _claimPendingReward(uint256 _pid, address _address) private { UserPoolInfo storage user = userPoolInfo[_pid][_address]; uint256 rewardAmount = pendingReward(_pid, _address); require( totalRewardSupply >= rewardAmount, "claimPendingReward: Should charge reward token" ); totalRewardSupply = totalRewardSupply.sub(rewardAmount); if (rewardAmount != 0) { IBEP20(adValoremToken).safeTransfer(_address, rewardAmount); } user.timeClaimed = block.timestamp; emit Claimed(_address, _pid, rewardAmount); } function harvest(uint256 _pid) external { PoolInfo storage pool = poolInfo[_pid]; UserPoolInfo storage user = userPoolInfo[_pid][address(msg.sender)]; require(pool.isActive, "harvest: this Pool is non activated"); if (user.amount > 0) { _claimPendingReward(_pid, address(msg.sender)); } } function compound(uint256 _pid) external { PoolInfo storage pool = poolInfo[_pid]; UserPoolInfo storage user = userPoolInfo[_pid][address(msg.sender)]; require(pool.isActive, "compound: This Pool is non activated"); address _address = address(msg.sender); uint256 rewardAmount = pendingReward(_pid, _address); if (rewardAmount > 0) { _deposit(_pid, rewardAmount); user.timeDeposited = block.timestamp; } } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same VLR token more than once. Rewards will be messed up if you do. function addPool( uint256 _apr, uint256 _timeLocked, string memory _label ) external onlyOwner { poolInfo.push( PoolInfo({ totalSupply: 0, apr: _apr, timeLocked: _timeLocked, label: _label, isActive: true }) ); emit PoolAdded(_apr, _timeLocked, _label); } // Update the given pool info. Can only be called by the owner. function setPoolInfo(uint256 _pid, uint256 _apr, uint256 _timeLocked, string memory _label, bool _isActive) external onlyOwner { poolInfo[_pid].apr = _apr; poolInfo[_pid].timeLocked = _timeLocked; poolInfo[_pid].label = _label; poolInfo[_pid].isActive = _isActive; emit SetPoolInfo(_pid, _apr, _timeLocked, _label, _isActive); } // Deposite tokens for reward function depositRewardToken(uint256 _amount) external onlyOwner { uint256 originalBalance = IBEP20(adValoremToken).balanceOf(address(this)); IBEP20(adValoremToken).safeTransferFrom( msg.sender, address(this), _amount ); uint256 currentBalance = IBEP20(adValoremToken).balanceOf(address(this)); totalRewardSupply = totalRewardSupply.add(currentBalance - originalBalance); emit RewardTokenDeposited(_amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function withdrawRewardToken() external onlyOwner { uint256 amount = totalRewardSupply; totalRewardSupply = 0; IBEP20(adValoremToken).safeTransfer(address(msg.sender), amount); emit RewardTokenWithdrawn(msg.sender, amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) external nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserPoolInfo storage user = userPoolInfo[_pid][msg.sender]; require( block.timestamp >= user.timeDeposited.add(pool.timeLocked), "time locked" ); uint256 amount = user.amount; pool.totalSupply = pool.totalSupply.sub(user.amount); user.amount = 0; IBEP20(adValoremToken).safeTransfer(address(msg.sender), amount); emit EmergencyWithdraw(msg.sender, _pid, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"apr","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeLocked","type":"uint256"},{"indexed":false,"internalType":"string","name":"label","type":"string"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardTokenDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardTokenWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"apr","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeLocked","type":"uint256"},{"indexed":false,"internalType":"string","name":"label","type":"string"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SetPoolInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adValoremToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_apr","type":"uint256"},{"internalType":"uint256","name":"_timeLocked","type":"uint256"},{"internalType":"string","name":"_label","type":"string"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adValoremToken","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"timeLocked","type":"uint256"},{"internalType":"string","name":"label","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_apr","type":"uint256"},{"internalType":"uint256","name":"_timeLocked","type":"uint256"},{"internalType":"string","name":"_label","type":"string"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPoolInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalRewardSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userPoolInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timeDeposited","type":"uint256"},{"internalType":"uint256","name":"timeClaimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506123c2806100206000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c806398969e82116100ad578063c4d66de811610071578063c4d66de814610246578063ddc6326214610259578063e2bbb1581461026c578063e7c44a351461027f578063f2fde38b146102925761012c565b806398969e82146101fd578063aa5f7e2614610210578063aa7a07e914610223578063aaf5eb681461022b578063c089bd74146102335761012c565b80635312ea8e116100f45780635312ea8e146101bd5780636cd3272b146101d0578063715018a6146101e55780638a8a759e146101ed5780638da5cb5b146101f55761012c565b8063081e3eda146101315780630e60f4871461014f5780631526fe2714610164578063441a3e70146101885780634e27072a1461019b575b600080fd5b6101396102a5565b6040516101469190612252565b60405180910390f35b61016261015d366004611db3565b6102ab565b005b610177610172366004611ce8565b6103e8565b604051610146959493929190612299565b610162610196366004611d44565b6104c6565b6101ae6101a9366004611d18565b6105b2565b60405161014693929190612283565b6101626101cb366004611ce8565b6105de565b6101d86106e6565b6040516101469190611e68565b6101626106f5565b61013961077e565b6101d8610784565b61013961020b366004611d18565b610793565b61016261021e366004611ce8565b610958565b6101626109e2565b610139610a7d565b610162610241366004611ce8565b610a83565b610162610254366004611cb1565b610c30565b610162610267366004611ce8565b611063565b61016261027a366004611d44565b6110d6565b61016261028d366004611d65565b611111565b6101626102a0366004611cb1565b611242565b60665490565b6102b3611303565b6001600160a01b03166102c4610784565b6001600160a01b0316146102f35760405162461bcd60e51b81526004016102ea9061216c565b60405180910390fd5b836066868154811061030157fe5b906000526020600020906005020160010181905550826066868154811061032457fe5b906000526020600020906005020160020181905550816066868154811061034757fe5b9060005260206000209060050201600301908051906020019061036b929190611b58565b50806066868154811061037a57fe5b906000526020600020906005020160040160006101000a81548160ff0219169083151502179055507fd3726649c4981243b2d7ba30a40b7ae013cc105ceb7c8795923a80f0561b682785858585856040516103d9959493929190612299565b60405180910390a15050505050565b606681815481106103f557fe5b9060005260206000209060050201600091509050806000015490806001015490806002015490806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104b35780601f10610488576101008083540402835291602001916104b3565b820191906000526020600020905b81548152906001019060200180831161049657829003601f168201915b5050506004909301549192505060ff1685565b600260655414156104e95760405162461bcd60e51b81526004016102ea9061221b565b600260658190555060006066838154811061050057fe5b60009182526020808320868452606782526040808520338652909252922060026005909202909201908101546001830154919350014210156105545760405162461bcd60e51b81526004016102ea906120b9565b805415610565576105658433611307565b82156105a757805460009061057a90856113cd565b808355835490915061058c90856113cd565b83556068546105a5906001600160a01b03163386611416565b505b505060016065555050565b606760209081526000928352604080842090915290825290208054600182015460029092015490919083565b600260655414156106015760405162461bcd60e51b81526004016102ea9061221b565b600260658190555060006066828154811061061857fe5b60009182526020808320858452606782526040808520338652909252922060026005909202909201908101546001830154919350610656919061146c565b4210156106755760405162461bcd60e51b81526004016102ea90611eed565b8054825461068390826113cd565b8355600082556068546106a0906001600160a01b03163383611416565b7fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05953385836040516106d393929190611e95565b60405180910390a1505060016065555050565b6068546001600160a01b031681565b6106fd611303565b6001600160a01b031661070e610784565b6001600160a01b0316146107345760405162461bcd60e51b81526004016102ea9061216c565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b60695481565b6033546001600160a01b031690565b600061079d611bd6565b606684815481106107aa57fe5b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561087a5780601f1061084f5761010080835404028352916020019161087a565b820191906000526020600020905b81548152906001019060200180831161085d57829003601f168201915b50505091835250506004919091015460ff16151560209182015260008681526067825260408082206001600160a01b038816835290925281812091830151600183015460028401549495509293919290916108d4916113cd565b1161090c57604083015160028301546108ee9042906113cd565b11610900575060028101544203610907565b5060408201515b610910565b5060005b600061094b6301e13380610945612710610945886020015161093f888a6000015461149190919063ffffffff16565b90611491565b906114cb565b9450505050505b92915050565b60006066828154811061096757fe5b600091825260208083208584526067825260408085203386529092529220600460059092029092019081015490925060ff166109b55760405162461bcd60e51b81526004016102ea90611fd9565b3360006109c28583610793565b905080156109db576109d4858261150d565b4260018401555b5050505050565b6109ea611303565b6001600160a01b03166109fb610784565b6001600160a01b031614610a215760405162461bcd60e51b81526004016102ea9061216c565b606980546000909155606854610a41906001600160a01b03163383611416565b7f5991a08bb51d1fc3f552255ed446f040dca378ad3ff91763507b63b185eb5d2e3382604051610a72929190611e7c565b60405180910390a150565b61271081565b610a8b611303565b6001600160a01b0316610a9c610784565b6001600160a01b031614610ac25760405162461bcd60e51b81526004016102ea9061216c565b6068546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610af3903090600401611e68565b60206040518083038186803b158015610b0b57600080fd5b505afa158015610b1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b439190611d00565b606854909150610b5e906001600160a01b031633308561172c565b6068546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610b8f903090600401611e68565b60206040518083038186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdf9190611d00565b606954909150610bf19083830361146c565b6069556040517ef47ca585dd6cf83a933a9b8f943cbbfe2132ea2233abecf979e7eaa74c911490610c23908590612252565b60405180910390a1505050565b600054610100900460ff1680610c495750610c4961174d565b80610c57575060005460ff16155b610c735760405162461bcd60e51b81526004016102ea9061206b565b600054610100900460ff16158015610c9e576000805460ff1961ff0019909116610100171660011790555b610ca661175e565b606880546001600160a01b0319166001600160a01b0384161790556040805160a08101825260008082526101f4602080840191825262278d0084860190815285518087019096526008865267506f6f6c204f6e6560c01b8683015260608501958652600160808601819052606680549182018155909452845160008051602061230d8339815191526005909502948501908155925160008051602061234d8339815191528501555160008051602061232d8339815191528401559351805193949193610d879360008051602061236d83398151915201929190910190611b58565b50608091820151600491909101805460ff19169115159190911790556040805160a08101825260008082526103e86020808401918252624f1a0084860190815285518087019096526008865267506f6f6c2074776f60c01b86830152606085019586526001968501879052606680549788018155909352835160008051602061230d8339815191526005909702968701908155915160008051602061234d833981519152870155915160008051602061232d833981519152860155925180519294610e699360008051602061236d833981519152909101929190910190611b58565b50608091820151600491909101805460ff19169115159190911790556040805160a08101825260008082526105dc602080840191825262ed4e008486019081528551808701909652600a865269506f6f6c20546872656560b01b86830152606085019586526001968501879052606680549788018155909352835160008051602061230d8339815191526005909702968701908155915160008051602061234d833981519152870155915160008051602061232d833981519152860155925180519294610f4d9360008051602061236d833981519152909101929190910190611b58565b50608091820151600491909101805460ff19169115159190911790556040805160a08101825260008082526107d060208084019182526301da9c00848601908152855180870190965260098652682837b7b6102337bab960b91b86830152606085019586526001968501879052606680549788018155909352835160008051602061230d8339815191526005909702968701908155915160008051602061234d833981519152870155915160008051602061232d8339815191528601559251805192946110319360008051602061236d833981519152909101929190910190611b58565b50608091909101516004909101805460ff1916911515919091179055801561105f576000805461ff00191690555b5050565b60006066828154811061107257fe5b600091825260208083208584526067825260408085203386529092529220600460059092029092019081015490925060ff166110c05760405162461bcd60e51b81526004016102ea906121d8565b8054156110d1576110d18333611307565b505050565b600260655414156110f95760405162461bcd60e51b81526004016102ea9061221b565b6002606555611108828261150d565b50506001606555565b611119611303565b6001600160a01b031661112a610784565b6001600160a01b0316146111505760405162461bcd60e51b81526004016102ea9061216c565b6040805160a08101825260008082526020808301878152938301868152606084018681526001608086018190526066805491820181559094528451600590940260008051602061230d8339815191528101948555955160008051602061234d833981519152870155905160008051602061232d833981519152860155518051939492936111f29360008051602061236d83398151915201929190910190611b58565b50608091909101516004909101805460ff19169115159190911790556040517fbf3fbd338c5907bc0cdc5422e41db4a4fe5943a14c195f12c5a2b38d2d155bea90610c239085908590859061225b565b61124a611303565b6001600160a01b031661125b610784565b6001600160a01b0316146112815760405162461bcd60e51b81526004016102ea9061216c565b6001600160a01b0381166112a75760405162461bcd60e51b81526004016102ea90611f5c565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b60008281526067602090815260408083206001600160a01b03851684529091528120906113348484610793565b90508060695410156113585760405162461bcd60e51b81526004016102ea9061201d565b60695461136590826113cd565b606955801561138557606854611385906001600160a01b03168483611416565b4260028301556040517f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a906113bf90859087908590611e95565b60405180910390a150505050565b600061140f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117f1565b9392505050565b6110d18363a9059cbb60e01b8484604051602401611435929190611e7c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261181d565b60008282018381101561140f5760405162461bcd60e51b81526004016102ea90611fa2565b6000826114a057506000610952565b828202828482816114ad57fe5b041461140f5760405162461bcd60e51b81526004016102ea9061212b565b600061140f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506118ac565b60006066838154811061151c57fe5b600091825260208083208684526067825260408085203386529092529220600460059092029092019081015490925060ff1661156a5760405162461bcd60e51b81526004016102ea906120e8565b8054156115805761157b8433611307565b61158e565b426001820181905560028201555b8215611726576068546040516370a0823160e01b81526000916001600160a01b0316906370a08231906115c5903090600401611e68565b60206040518083038186803b1580156115dd57600080fd5b505afa1580156115f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116159190611d00565b606854909150611630906001600160a01b031633308761172c565b6068546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611661903090600401611e68565b60206040518083038186803b15801561167957600080fd5b505afa15801561168d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b19190611d00565b905060006116bf82846113cd565b84549091506000906116d1908361146c565b80865586549091506116e3908361146c565b8655604051889033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1590611719908690612252565b60405180910390a3505050505b50505050565b611726846323b872dd60e01b85858560405160240161143593929190611eb6565b6000611758306118e3565b15905090565b600054610100900460ff1680611777575061177761174d565b80611785575060005460ff16155b6117a15760405162461bcd60e51b81526004016102ea9061206b565b600054610100900460ff161580156117cc576000805460ff1961ff0019909116610100171660011790555b6117d46118e9565b6117dc61196a565b80156117ee576000805461ff00191690555b50565b600081848411156118155760405162461bcd60e51b81526004016102ea9190611eda565b505050900390565b6060611872826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a449092919063ffffffff16565b8051909150156110d157808060200190518101906118909190611ccc565b6110d15760405162461bcd60e51b81526004016102ea90611f12565b600081836118cd5760405162461bcd60e51b81526004016102ea9190611eda565b5060008385816118d957fe5b0495945050505050565b3b151590565b600054610100900460ff1680611902575061190261174d565b80611910575060005460ff16155b61192c5760405162461bcd60e51b81526004016102ea9061206b565b600054610100900460ff161580156117dc576000805460ff1961ff00199091166101001716600117905580156117ee576000805461ff001916905550565b600054610100900460ff1680611983575061198361174d565b80611991575060005460ff16155b6119ad5760405162461bcd60e51b81526004016102ea9061206b565b600054610100900460ff161580156119d8576000805460ff1961ff0019909116610100171660011790555b60006119e2611303565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156117ee576000805461ff001916905550565b6060611a538484600085611a5b565b949350505050565b6060611a6685611b1f565b611a825760405162461bcd60e51b81526004016102ea906121a1565b60006060866001600160a01b03168587604051611a9f9190611e4c565b60006040518083038185875af1925050503d8060008114611adc576040519150601f19603f3d011682016040523d82523d6000602084013e611ae1565b606091505b50915091508115611af5579150611a539050565b805115611b055780518082602001fd5b8360405162461bcd60e51b81526004016102ea9190611eda565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611a53575050151592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611b9957805160ff1916838001178555611bc6565b82800160010185558215611bc6579182015b82811115611bc6578251825591602001919060010190611bab565b50611bd2929150611c07565b5090565b6040518060a00160405280600081526020016000815260200160008152602001606081526020016000151581525090565b5b80821115611bd25760008155600101611c08565b80356001600160a01b038116811461095257600080fd5b600082601f830112611c43578081fd5b813567ffffffffffffffff80821115611c5a578283fd5b604051601f8301601f191681016020018281118282101715611c7a578485fd5b604052828152925082848301602001861015611c9557600080fd5b8260208601602083013760006020848301015250505092915050565b600060208284031215611cc2578081fd5b61140f8383611c1c565b600060208284031215611cdd578081fd5b815161140f816122fe565b600060208284031215611cf9578081fd5b5035919050565b600060208284031215611d11578081fd5b5051919050565b60008060408385031215611d2a578081fd5b82359150611d3b8460208501611c1c565b90509250929050565b60008060408385031215611d56578182fd5b50508035926020909101359150565b600080600060608486031215611d79578081fd5b8335925060208401359150604084013567ffffffffffffffff811115611d9d578182fd5b611da986828701611c33565b9150509250925092565b600080600080600060a08688031215611dca578081fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115611df5578182fd5b611e0188828901611c33565b9250506080860135611e12816122fe565b809150509295509295909350565b60008151808452611e388160208601602086016122d2565b601f01601f19169290920160200192915050565b60008251611e5e8184602087016122d2565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020825261140f6020830184611e20565b6020808252600b908201526a1d1a5b59481b1bd8dad95960aa1b604082015260600190565b6020808252602a908201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526024908201527f636f6d706f756e643a205468697320506f6f6c206973206e6f6e206163746976604082015263185d195960e21b606082015260800190565b6020808252602e908201527f636c61696d50656e64696e675265776172643a2053686f756c6420636861726760408201526d32903932bbb0b932103a37b5b2b760911b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252601590820152741dda5d1a191c985dce88151a5b59481b1bd8dad959605a1b604082015260600190565b60208082526023908201527f6465706f7369743a205468697320506f6f6c206973206e6f6e206163746976616040820152621d195960ea1b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526023908201527f686172766573743a207468697320506f6f6c206973206e6f6e206163746976616040820152621d195960ea1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b60008482528360208301526060604083015261227a6060830184611e20565b95945050505050565b9283526020830191909152604082015260600190565b600086825285602083015284604083015260a060608301526122be60a0830185611e20565b905082151560808301529695505050505050565b60005b838110156122ed5781810151838201526020016122d5565b838111156117265750506000910152565b80151581146117ee57600080fdfe46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435446501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435646501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435546501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94357a26469706673582212207e7348d5359b428b55ba28bed46630dd3e8a43b12fb0a8630d90f848f764449464736f6c63430007000033
Deployed ByteCode Sourcemap
34676:10382:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37642:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43108:401;;;;;;:::i;:::-;;:::i;:::-;;35412:26;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;40094:785::-;;;;;;:::i;:::-;;:::i;35495:72::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;44468:587::-;;;;;;:::i;:::-;;:::i;35576:29::-;;;:::i;:::-;;;;;;;:::i;5074:148::-;;;:::i;35612:32::-;;;:::i;4423:87::-;;;:::i;37865:900::-;;;;;;:::i;:::-;;:::i;41918:509::-;;;;;;:::i;:::-;;:::i;44131:266::-;;;:::i;35653:41::-;;;:::i;43552:508::-;;;;;;:::i;:::-;;:::i;36338:1296::-;;;;;;:::i;:::-;;:::i;41557:353::-;;;;;;:::i;:::-;;:::i;38820:112::-;;;;;;:::i;:::-;;:::i;42601:430::-;;;;;;:::i;:::-;;:::i;5377:244::-;;;;;;:::i;:::-;;:::i;37642:95::-;37714:8;:15;37642:95;:::o;43108:401::-;4654:12;:10;:12::i;:::-;-1:-1:-1;;;;;4643:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4643:23:0;;4635:68;;;;-1:-1:-1;;;4635:68:0;;;;;;;:::i;:::-;;;;;;;;;43290:4:::1;43269:8;43278:4;43269:14;;;;;;;;;;;;;;;;;;:18;;:25;;;;43333:11;43305:8;43314:4;43305:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;43378:6;43355:8;43364:4;43355:14;;;;;;;;;;;;;;;;;;:20;;:29;;;;;;;;;;;;:::i;:::-;;43421:9;43395:8;43404:4;43395:14;;;;;;;;;;;;;;;;;;:23;;;:35;;;;;;;;;;;;;;;;;;43446:55;43458:4;43464;43470:11;43483:6;43491:9;43446:55;;;;;;;;;;:::i;:::-;;;;;;;;43108:401:::0;;;;;:::o;35412:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35412:26:0;;;;;;;-1:-1:-1;;35412:26:0;;;:::o;40094:785::-;7486:1;8021:7;;:19;;8013:63;;;;-1:-1:-1;;;8013:63:0;;;;;;;:::i;:::-;7486:1;8154:7;:18;;;;40176:21:::1;40200:8;40209:4;40200:14;;;;;;;;;::::0;;;::::1;::::0;;;40253:18;;;:12:::1;:18:::0;;;;;;40272:10:::1;40253:30:::0;;;;;;;40356:15:::1;40200:14;::::0;;::::1;::::0;;::::1;40356:15:::0;;::::1;::::0;40335:18:::1;::::0;::::1;::::0;40200:14;;-1:-1:-1;40335:36:0::1;40316:15;:55;;40294:126;;;;-1:-1:-1::0;;;40294:126:0::1;;;;;;;:::i;:::-;40505:11:::0;;:15;40501:94:::1;;40537:46;40557:4;40571:10;40537:19;:46::i;:::-;40611:11:::0;;40607:265:::1;;40656:11:::0;;40639:14:::1;::::0;40656:24:::1;::::0;40672:7;40656:15:::1;:24::i;:::-;40695:20:::0;;;40749:16;;40639:41;;-1:-1:-1;40749:29:0::1;::::0;40770:7;40749:20:::1;:29::i;:::-;40730:48:::0;;40802:14:::1;::::0;40795:65:::1;::::0;-1:-1:-1;;;;;40802:14:0::1;40839:10;40852:7:::0;40795:35:::1;:65::i;:::-;40607:265;;-1:-1:-1::0;;7442:1:0;8333:7;:22;-1:-1:-1;;40094:785:0:o;35495:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44468:587::-;7486:1;8021:7;;:19;;8013:63;;;;-1:-1:-1;;;8013:63:0;;;;;;;:::i;:::-;7486:1;8154:7;:18;;;;44542:21:::1;44566:8;44575:4;44566:14;;;;;;;;;::::0;;;::::1;::::0;;;44619:18;;;:12:::1;:18:::0;;;;;;44638:10:::1;44619:30:::0;;;;;;;44724:15:::1;44566:14;::::0;;::::1;::::0;;::::1;44724:15:::0;;::::1;::::0;44701:18:::1;::::0;::::1;::::0;44566:14;;-1:-1:-1;44701:39:0::1;::::0;:18;:22:::1;:39::i;:::-;44682:15;:58;;44660:119;;;;-1:-1:-1::0;;;44660:119:0::1;;;;;;;:::i;:::-;44809:11:::0;;44852:16;;:33:::1;::::0;44809:11;44852:20:::1;:33::i;:::-;44833:52:::0;;:16:::1;44896:15:::0;;44931:14:::1;::::0;44924:64:::1;::::0;-1:-1:-1;;;;;44931:14:0::1;44968:10;44981:6:::0;44924:35:::1;:64::i;:::-;45004:43;45022:10;45034:4;45040:6;45004:43;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;7442:1:0;8333:7;:22;-1:-1:-1;;44468:587:0:o;35576:29::-;;;-1:-1:-1;;;;;35576:29:0;;:::o;5074:148::-;4654:12;:10;:12::i;:::-;-1:-1:-1;;;;;4643:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4643:23:0;;4635:68;;;;-1:-1:-1;;;4635:68:0;;;;;;;:::i;:::-;5165:6:::1;::::0;5144:40:::1;::::0;5181:1:::1;::::0;-1:-1:-1;;;;;5165:6:0::1;::::0;5144:40:::1;::::0;5181:1;;5144:40:::1;5195:6;:19:::0;;-1:-1:-1;;;;;;5195:19:0::1;::::0;;5074:148::o;35612:32::-;;;;:::o;4423:87::-;4496:6;;-1:-1:-1;;;;;4496:6:0;4423:87;:::o;37865:900::-;37965:7;37990:20;;:::i;:::-;38013:8;38022:4;38013:14;;;;;;;;;;;;;;;;;;37990:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37990:37:0;;;-1:-1:-1;;37990:37:0;;;;;;;;;;;;;;;;38066:18;;;:12;:18;;;;;;-1:-1:-1;;;;;38066:25:0;;;;;;;;;;38216:15;;;;37990:37;38193:18;;;38172:16;;;;37990:37;;-1:-1:-1;38066:25:0;;37990:37;;38216:15;;38172:40;;:20;:40::i;:::-;:59;38168:363;;38293:15;;;;38272:16;;;;38252:37;;:15;;:19;:37::i;:::-;:56;38248:221;;-1:-1:-1;38364:16:0;;;;38346:15;:34;38248:221;;;-1:-1:-1;38438:15:0;;;;38248:221;38168:363;;;-1:-1:-1;38518:1:0;38168:363;38543:28;38574:145;35738:8;38574:116;35689:5;38574:87;38652:4;:8;;;38574:59;38618:14;38574:4;:25;;;:43;;:59;;;;:::i;:::-;:77;;:87::i;:::-;:105;;:116::i;:145::-;38543:176;-1:-1:-1;;;;;37865:900:0;;;;;:::o;41918:509::-;41970:21;41994:8;42003:4;41994:14;;;;;;;;;;;;;;;;42047:18;;;:12;:18;;;;;;42074:10;42047:39;;;;;;;42105:13;41994:14;;;;;;;42105:13;;;;41994:14;;-1:-1:-1;42105:13:0;;42097:62;;;;-1:-1:-1;;;42097:62:0;;;;;;;:::i;:::-;42207:10;42180:16;42252:29;42266:4;42207:10;42252:13;:29::i;:::-;42229:52;-1:-1:-1;42296:16:0;;42292:128;;42329:28;42338:4;42344:12;42329:8;:28::i;:::-;42393:15;42372:18;;;:36;42292:128;41918:509;;;;;:::o;44131:266::-;4654:12;:10;:12::i;:::-;-1:-1:-1;;;;;4643:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4643:23:0;;4635:68;;;;-1:-1:-1;;;4635:68:0;;;;;;;:::i;:::-;44209:17:::1;::::0;;44192:14:::1;44237:21:::0;;;44276:14:::1;::::0;44269:64:::1;::::0;-1:-1:-1;;;;;44276:14:0::1;44313:10;44209:17:::0;44269:35:::1;:64::i;:::-;44349:40;44370:10;44382:6;44349:40;;;;;;;:::i;:::-;;;;;;;;4714:1;44131:266::o:0;35653:41::-;35689:5;35653:41;:::o;43552:508::-;4654:12;:10;:12::i;:::-;-1:-1:-1;;;;;4643:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4643:23:0;;4635:68;;;;-1:-1:-1;;;4635:68:0;;;;;;;:::i;:::-;43660:14:::1;::::0;43653:47:::1;::::0;-1:-1:-1;;;43653:47:0;;43627:23:::1;::::0;-1:-1:-1;;;;;43660:14:0::1;::::0;43653:32:::1;::::0;:47:::1;::::0;43694:4:::1;::::0;43653:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43718:14;::::0;43627:73;;-1:-1:-1;43711:125:0::1;::::0;-1:-1:-1;;;;;43718:14:0::1;43765:10;43798:4;43818:7:::0;43711:39:::1;:125::i;:::-;43879:14;::::0;43872:47:::1;::::0;-1:-1:-1;;;43872:47:0;;43847:22:::1;::::0;-1:-1:-1;;;;;43879:14:0::1;::::0;43872:32:::1;::::0;:47:::1;::::0;43913:4:::1;::::0;43872:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43950:17;::::0;43847:72;;-1:-1:-1;43950:55:0::1;::::0;43972:32;;::::1;43950:21;:55::i;:::-;43930:17;:75:::0;44023:29:::1;::::0;::::1;::::0;::::1;::::0;44044:7;;44023:29:::1;:::i;:::-;;;;;;;;4714:1;;43552:508:::0;:::o;36338:1296::-;1483:13;;;;;;;;:33;;;1500:16;:14;:16::i;:::-;1483:50;;;-1:-1:-1;1521:12:0;;;;1520:13;1483:50;1475:109;;;;-1:-1:-1;;;1475:109:0;;;;;;;:::i;:::-;1597:19;1620:13;;;;;;1619:14;1644:101;;;;1679:13;:20;;-1:-1:-1;;;;1679:20:0;;;;;1714:19;1695:4;1714:19;;;1644:101;36438:16:::1;:14;:16::i;:::-;36465:14;:32:::0;;-1:-1:-1;;;;;;36465:32:0::1;-1:-1:-1::0;;;;;36465:32:0;::::1;;::::0;;36563:222:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;36563:222:0;;;36629:3:::1;36563:222;::::0;;::::1;::::0;;;36663:17:::1;36563:222:::0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;36563:222:0;;::::1;::::0;;;;;;;-1:-1:-1;36563:222:0;;;;;;36535:8:::1;:261:::0;;;;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;36535:261:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;;;;;;;;;;;36535:261:0;;;;-1:-1:-1;;;;;;;;;;;36535:261:0;;;;;;;36563:222;;36535:261;;::::1;::::0;-1:-1:-1;;;;;;;;;;;36535:261:0;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;36535:261:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;36535:261:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36835:224:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;36835:224:0;;;36901:4:::1;36835:224;::::0;;::::1;::::0;;;36936:17:::1;36835:224:::0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;36835:224:0;;::::1;::::0;;;;;;;-1:-1:-1;36835:224:0;;;;;;36807:8:::1;:263:::0;;;;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;36807:263:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;;;;;;;;;;;36807:263:0;;;;;-1:-1:-1;;;;;;;;;;;36807:263:0;;;;;;;36835:224;;36807:263:::1;::::0;-1:-1:-1;;;;;;;;;;;36807:263:0;;;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;36807:263:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;36807:263:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37109:228:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;37109:228:0;;;37175:4:::1;37109:228;::::0;;::::1;::::0;;;37210:18:::1;37109:228:::0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;37109:228:0;;::::1;::::0;;;;;;;-1:-1:-1;37109:228:0;;;;;;37081:8:::1;:267:::0;;;;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;37081:267:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;;;;;;;;;;;37081:267:0;;;;;-1:-1:-1;;;;;;;;;;;37081:267:0;;;;;;;37109:228;;37081:267:::1;::::0;-1:-1:-1;;;;;;;;;;;37081:267:0;;;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;37081:267:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;37081:267:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37387:228:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;37387:228:0;;;37453:4:::1;37387:228;::::0;;::::1;::::0;;;37488:18:::1;37387:228:::0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;37387:228:0;;::::1;::::0;;;;;;;-1:-1:-1;37387:228:0;;;;;;37359:8:::1;:267:::0;;;;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;37359:267:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;-1:-1:-1;;;;;;;;;;;37359:267:0;;;;;-1:-1:-1;;;;;;;;;;;37359:267:0;;;;;;;37387:228;;37359:267:::1;::::0;-1:-1:-1;;;;;;;;;;;37359:267:0;;;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;37359:267:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;37359:267:0::1;::::0;::::1;;::::0;;;::::1;::::0;;1771:68;;;;1822:5;1806:21;;-1:-1:-1;;1806:21:0;;;1771:68;36338:1296;;:::o;41557:353::-;41608:21;41632:8;41641:4;41632:14;;;;;;;;;;;;;;;;41685:18;;;:12;:18;;;;;;41712:10;41685:39;;;;;;;41743:13;41632:14;;;;;;;41743:13;;;;41632:14;;-1:-1:-1;41743:13:0;;41735:61;;;;-1:-1:-1;;;41735:61:0;;;;;;;:::i;:::-;41813:11;;:15;41809:94;;41845:46;41865:4;41879:10;41845:19;:46::i;:::-;41557:353;;;:::o;38820:112::-;7486:1;8021:7;;:19;;8013:63;;;;-1:-1:-1;;;8013:63:0;;;;;;;:::i;:::-;7486:1;8154:7;:18;38901:23:::1;38910:4:::0;38916:7;38901:8:::1;:23::i;:::-;-1:-1:-1::0;;7442:1:0;8333:7;:22;38820:112::o;42601:430::-;4654:12;:10;:12::i;:::-;-1:-1:-1;;;;;4643:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4643:23:0;;4635:68;;;;-1:-1:-1;;;4635:68:0;;;;;;;:::i;:::-;42767:193:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;42767:193:0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;42940:4:::1;42767:193:::0;;;;;;42739:8:::1;:232:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;::::1;-1:-1:-1::0;;;;;;;;;;;42739:232:0;::::1;::::0;;;;;-1:-1:-1;;;;;;;;;;;42739:232:0;;;;;-1:-1:-1;;;;;;;;;;;42739:232:0;;;;;;42767:193;;42739:232;;::::1;::::0;-1:-1:-1;;;;;;;;;;;42739:232:0;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;42739:232:0::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;42739:232:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42987:36:::1;::::0;::::1;::::0;::::1;::::0;42997:4;;43003:11;;43016:6;;42987:36:::1;:::i;5377:244::-:0;4654:12;:10;:12::i;:::-;-1:-1:-1;;;;;4643:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4643:23:0;;4635:68;;;;-1:-1:-1;;;4635:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5466:22:0;::::1;5458:73;;;;-1:-1:-1::0;;;5458:73:0::1;;;;;;;:::i;:::-;5568:6;::::0;5547:38:::1;::::0;-1:-1:-1;;;;;5547:38:0;;::::1;::::0;5568:6:::1;::::0;5547:38:::1;::::0;5568:6:::1;::::0;5547:38:::1;5596:6;:17:::0;;-1:-1:-1;;;;;;5596:17:0::1;-1:-1:-1::0;;;;;5596:17:0;;;::::1;::::0;;;::::1;::::0;;5377:244::o;2813:106::-;2901:10;2813:106;:::o;40915:634::-;40995:25;41023:18;;;:12;:18;;;;;;;;-1:-1:-1;;;;;41023:28:0;;;;;;;;;;41087:29;41036:4;41042:8;41087:13;:29::i;:::-;41064:52;;41170:12;41149:17;;:33;;41127:129;;;;-1:-1:-1;;;41127:129:0;;;;;;;:::i;:::-;41289:17;;:35;;41311:12;41289:21;:35::i;:::-;41269:17;:55;41339:17;;41335:109;;41380:14;;41373:59;;-1:-1:-1;;;;;41380:14:0;41409:8;41419:12;41373:35;:59::i;:::-;41473:15;41454:16;;;:34;41504:37;;;;;;41512:8;;41522:4;;41528:12;;41504:37;:::i;:::-;;;;;;;;40915:634;;;;:::o;16698:136::-;16756:7;16783:43;16787:1;16790;16783:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;16776:50;16698:136;-1:-1:-1;;;16698:136:0:o;8929:211::-;9046:86;9066:5;9096:23;;;9121:2;9125:5;9073:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;9073:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9073:58:0;-1:-1:-1;;;;;;9073:58:0;;;;;;;;;;9046:19;:86::i;16234:181::-;16292:7;16324:5;;;16348:6;;;;16340:46;;;;-1:-1:-1;;;16340:46:0;;;;;;;:::i;17622:471::-;17680:7;17925:6;17921:47;;-1:-1:-1;17955:1:0;17948:8;;17921:47;17992:5;;;17996:1;17992;:5;:1;18016:5;;;;;:10;18008:56;;;;-1:-1:-1;;;18008:56:0;;;;;;;:::i;18569:132::-;18627:7;18654:39;18658:1;18661;18654:39;;;;;;;;;;;;;;;;;:3;:39::i;38940:1116::-;39008:21;39032:8;39041:4;39032:14;;;;;;;;;;;;;;;;39085:18;;;:12;:18;;;;;;39104:10;39085:30;;;;;;;39134:13;39032:14;;;;;;;39134:13;;;;39032:14;;-1:-1:-1;39134:13:0;;39126:61;;;;-1:-1:-1;;;39126:61:0;;;;;;;:::i;:::-;39204:11;;:15;39200:212;;39236:46;39256:4;39270:10;39236:19;:46::i;:::-;39200:212;;;39336:15;39315:18;;;:36;;;39366:16;;;:34;39200:212;39428:11;;39424:625;;39480:14;;39473:47;;-1:-1:-1;;;39473:47:0;;39456:14;;-1:-1:-1;;;;;39480:14:0;;39473:32;;:47;;39514:4;;39473:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39542:14;;39456:64;;-1:-1:-1;39535:150:0;;-1:-1:-1;;;;;39542:14:0;39601:10;39639:4;39663:7;39535:39;:150::i;:::-;39722:14;;39715:47;;-1:-1:-1;;;39715:47:0;;39700:12;;-1:-1:-1;;;;;39722:14:0;;39715:32;;:47;;39756:4;;39715:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39700:62;-1:-1:-1;39777:19:0;39799:16;39700:62;39808:6;39799:8;:16::i;:::-;39847:11;;39777:38;;-1:-1:-1;39830:14:0;;39847:28;;39777:38;39847:15;:28::i;:::-;39892:20;;;39946:16;;39830:45;;-1:-1:-1;39946:33:0;;39967:11;39946:20;:33::i;:::-;39927:52;;39999:38;;40019:4;;40007:10;;39999:38;;;;40025:11;;39999:38;:::i;:::-;;;;;;;;39424:625;;;;;38940:1116;;;;:::o;9148:248::-;9292:96;9312:5;9342:27;;;9371:4;9377:2;9381:5;9319:68;;;;;;;;;;:::i;1939:125::-;1987:4;2012:44;2050:4;2012:29;:44::i;:::-;2011:45;2004:52;;1939:125;:::o;4009:129::-;1483:13;;;;;;;;:33;;;1500:16;:14;:16::i;:::-;1483:50;;;-1:-1:-1;1521:12:0;;;;1520:13;1483:50;1475:109;;;;-1:-1:-1;;;1475:109:0;;;;;;;:::i;:::-;1597:19;1620:13;;;;;;1619:14;1644:101;;;;1679:13;:20;;-1:-1:-1;;;;1679:20:0;;;;;1714:19;1695:4;1714:19;;;1644:101;4067:26:::1;:24;:26::i;:::-;4104;:24;:26::i;:::-;1775:14:::0;1771:68;;;1822:5;1806:21;;-1:-1:-1;;1806:21:0;;;1771:68;4009:129;:::o;17137:226::-;17257:7;17293:12;17285:6;;;;17277:29;;;;-1:-1:-1;;;17277:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;17329:5:0;;;17137:226::o;11464:774::-;11888:23;11914:69;11942:4;11914:69;;;;;;;;;;;;;;;;;11922:5;-1:-1:-1;;;;;11914:27:0;;;:69;;;;;:::i;:::-;11998:17;;11888:95;;-1:-1:-1;11998:21:0;11994:237;;12153:10;12142:30;;;;;;;;;;;;:::i;:::-;12134:85;;;;-1:-1:-1;;;12134:85:0;;;;;;;:::i;19197:312::-;19317:7;19352:12;19345:5;19337:28;;;;-1:-1:-1;;;19337:28:0;;;;;;;;:::i;:::-;;19376:9;19392:1;19388;:5;;;;;;;19197:312;-1:-1:-1;;;;;19197:312:0:o;28224:422::-;28591:20;28630:8;;;28224:422::o;2742:65::-;1483:13;;;;;;;;:33;;;1500:16;:14;:16::i;:::-;1483:50;;;-1:-1:-1;1521:12:0;;;;1520:13;1483:50;1475:109;;;;-1:-1:-1;;;1475:109:0;;;;;;;:::i;:::-;1597:19;1620:13;;;;;;1619:14;1644:101;;;;1679:13;:20;;-1:-1:-1;;;;1679:20:0;;;;;1714:19;1695:4;1714:19;;;1775:14;1771:68;;;1822:5;1806:21;;-1:-1:-1;;1806:21:0;;;2742:65;:::o;4146:196::-;1483:13;;;;;;;;:33;;;1500:16;:14;:16::i;:::-;1483:50;;;-1:-1:-1;1521:12:0;;;;1520:13;1483:50;1475:109;;;;-1:-1:-1;;;1475:109:0;;;;;;;:::i;:::-;1597:19;1620:13;;;;;;1619:14;1644:101;;;;1679:13;:20;;-1:-1:-1;;;;1679:20:0;;;;;1714:19;1695:4;1714:19;;;1644:101;4214:17:::1;4234:12;:10;:12::i;:::-;4257:6;:18:::0;;-1:-1:-1;;;;;;4257:18:0::1;-1:-1:-1::0;;;;;4257:18:0;::::1;::::0;;::::1;::::0;;;4291:43:::1;::::0;4257:18;;-1:-1:-1;4257:18:0;-1:-1:-1;;4291:43:0::1;::::0;-1:-1:-1;;4291:43:0::1;1757:1;1775:14:::0;1771:68;;;1822:5;1806:21;;-1:-1:-1;;1806:21:0;;;4146:196;:::o;25088:230::-;25225:12;25257:53;25280:6;25288:4;25294:1;25297:12;25257:22;:53::i;:::-;25250:60;25088:230;-1:-1:-1;;;;25088:230:0:o;26576:1020::-;26749:12;26782:18;26793:6;26782:10;:18::i;:::-;26774:60;;;;-1:-1:-1;;;26774:60:0;;;;;;;:::i;:::-;26908:12;26922:23;26949:6;-1:-1:-1;;;;;26949:11:0;26968:8;26978:4;26949:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26907:76;;;;26998:7;26994:595;;;27029:10;-1:-1:-1;27022:17:0;;-1:-1:-1;27022:17:0;26994:595;27143:17;;:21;27139:439;;27406:10;27400:17;27467:15;27454:10;27450:2;27446:19;27439:44;27354:148;27549:12;27542:20;;-1:-1:-1;;;27542:20:0;;;;;;;;:::i;21951:641::-;22011:4;22492:20;;22322:66;22541:23;;;;;;:42;;-1:-1:-1;;22568:15:0;;;22533:51;-1:-1:-1;;21951:641:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;5:130;72:20;;-1:-1;;;;;23625:54;;24744:35;;24734:2;;24793:1;;24783:12;409:442;;511:3;504:4;496:6;492:17;488:27;478:2;;-1:-1;;519:12;478:2;566:6;553:20;22606:18;;22598:6;22595:30;22592:2;;;-1:-1;;22628:12;22592:2;22261;22255:9;22701;22682:17;;-1:-1;;22678:33;22287:17;;22769:4;22287:17;22347:34;;;22383:22;;;22344:62;22341:2;;;-1:-1;;22409:12;22341:2;22261;22428:22;659:21;;;579:74;-1:-1;579:74;759:16;;;22769:4;759:16;756:25;-1:-1;753:2;;;794:1;;784:12;753:2;24231:6;22769:4;701:6;697:17;22769:4;735:5;731:16;24208:30;24287:1;22769:4;24278:6;735:5;24269:16;;24262:27;;;;471:380;;;;:::o;1137:241::-;;1241:2;1229:9;1220:7;1216:23;1212:32;1209:2;;;-1:-1;;1247:12;1209:2;1309:53;1354:7;1330:22;1309:53;:::i;1385:257::-;;1497:2;1485:9;1476:7;1472:23;1468:32;1465:2;;;-1:-1;;1503:12;1465:2;354:6;348:13;366:30;390:5;366:30;:::i;1649:241::-;;1753:2;1741:9;1732:7;1728:23;1724:32;1721:2;;;-1:-1;;1759:12;1721:2;-1:-1;926:20;;1715:175;-1:-1;1715:175::o;1897:263::-;;2012:2;2000:9;1991:7;1987:23;1983:32;1980:2;;;-1:-1;;2018:12;1980:2;-1:-1;1074:13;;1974:186;-1:-1;1974:186::o;2167:366::-;;;2288:2;2276:9;2267:7;2263:23;2259:32;2256:2;;;-1:-1;;2294:12;2256:2;939:6;926:20;2346:63;;2464:53;2509:7;2446:2;2489:9;2485:22;2464:53;:::i;:::-;2454:63;;2250:283;;;;;:::o;2540:366::-;;;2661:2;2649:9;2640:7;2636:23;2632:32;2629:2;;;-1:-1;;2667:12;2629:2;-1:-1;;926:20;;;2819:2;2858:22;;;926:20;;-1:-1;2623:283::o;2913:597::-;;;;3061:2;3049:9;3040:7;3036:23;3032:32;3029:2;;;-1:-1;;3067:12;3029:2;939:6;926:20;3119:63;;3219:2;3262:9;3258:22;926:20;3227:63;;3355:2;3344:9;3340:18;3327:32;3379:18;3371:6;3368:30;3365:2;;;-1:-1;;3401:12;3365:2;3431:63;3486:7;3477:6;3466:9;3462:22;3431:63;:::i;:::-;3421:73;;;3023:487;;;;;:::o;3517:843::-;;;;;;3696:3;3684:9;3675:7;3671:23;3667:33;3664:2;;;-1:-1;;3703:12;3664:2;939:6;926:20;3755:63;;3855:2;3898:9;3894:22;926:20;3863:63;;3963:2;4006:9;4002:22;926:20;3971:63;;4099:2;4088:9;4084:18;4071:32;4123:18;4115:6;4112:30;4109:2;;;-1:-1;;4145:12;4109:2;4175:63;4230:7;4221:6;4210:9;4206:22;4175:63;:::i;:::-;4165:73;;;4275:3;4316:9;4312:22;206:20;231:30;255:5;231:30;:::i;:::-;4284:60;;;;3658:702;;;;;;;;:::o;5110:347::-;;5255:5;22878:12;23317:6;23312:3;23305:19;5349:52;5394:6;23354:4;23349:3;23345:14;23354:4;5375:5;5371:16;5349:52;:::i;:::-;22701:9;24648:14;-1:-1;;24644:28;5413:39;;;;23354:4;5413:39;;5202:255;-1:-1;;5202:255::o;10995:271::-;;4907:5;22878:12;5018:52;5063:6;5058:3;5051:4;5044:5;5040:16;5018:52;:::i;:::-;5082:16;;;;;11129:137;-1:-1;;11129:137::o;11273:222::-;-1:-1;;;;;23625:54;;;;4587:37;;11400:2;11385:18;;11371:124::o;11502:349::-;-1:-1;;;;;23625:54;;;;4446:58;;11837:2;11822:18;;10946:37;11665:2;11650:18;;11636:215::o;11858:460::-;-1:-1;;;;;23625:54;;;;4446:58;;12221:2;12206:18;;10946:37;;;;12304:2;12289:18;;10946:37;12049:2;12034:18;;12020:298::o;12325:444::-;-1:-1;;;;;23625:54;;;4587:37;;23625:54;;;;12672:2;12657:18;;4587:37;12755:2;12740:18;;10946:37;;;;12508:2;12493:18;;12479:290::o;13567:310::-;;13714:2;13735:17;13728:47;13789:78;13714:2;13703:9;13699:18;13853:6;13789:78;:::i;13884:416::-;14084:2;14098:47;;;5689:2;14069:18;;;23305:19;-1:-1;;;23345:14;;;5705:34;5758:12;;;14055:245::o;14307:416::-;14507:2;14521:47;;;6009:2;14492:18;;;23305:19;6045:34;23345:14;;;6025:55;-1:-1;;;6100:12;;;6093:34;6146:12;;;14478:245::o;14730:416::-;14930:2;14944:47;;;6397:2;14915:18;;;23305:19;6433:34;23345:14;;;6413:55;-1:-1;;;6488:12;;;6481:30;6530:12;;;14901:245::o;15153:416::-;15353:2;15367:47;;;6781:2;15338:18;;;23305:19;6817:29;23345:14;;;6797:50;6866:12;;;15324:245::o;15576:416::-;15776:2;15790:47;;;7117:2;15761:18;;;23305:19;7153:34;23345:14;;;7133:55;-1:-1;;;7208:12;;;7201:28;7248:12;;;15747:245::o;15999:416::-;16199:2;16213:47;;;7499:2;16184:18;;;23305:19;7535:34;23345:14;;;7515:55;-1:-1;;;7590:12;;;7583:38;7640:12;;;16170:245::o;16422:416::-;16622:2;16636:47;;;7891:2;16607:18;;;23305:19;7927:34;23345:14;;;7907:55;-1:-1;;;7982:12;;;7975:38;8032:12;;;16593:245::o;16845:416::-;17045:2;17059:47;;;8283:2;17030:18;;;23305:19;-1:-1;;;23345:14;;;8299:44;8362:12;;;17016:245::o;17268:416::-;17468:2;17482:47;;;8613:2;17453:18;;;23305:19;8649:34;23345:14;;;8629:55;-1:-1;;;8704:12;;;8697:27;8743:12;;;17439:245::o;17691:416::-;17891:2;17905:47;;;8994:2;17876:18;;;23305:19;9030:34;23345:14;;;9010:55;-1:-1;;;9085:12;;;9078:25;9122:12;;;17862:245::o;18114:416::-;18314:2;18328:47;;;18299:18;;;23305:19;9409:34;23345:14;;;9389:55;9463:12;;;18285:245::o;18537:416::-;18737:2;18751:47;;;9714:2;18722:18;;;23305:19;9750:31;23345:14;;;9730:52;9801:12;;;18708:245::o;19383:416::-;19583:2;19597:47;;;10379:2;19568:18;;;23305:19;10415:34;23345:14;;;10395:55;-1:-1;;;10470:12;;;10463:27;10509:12;;;19554:245::o;19806:416::-;20006:2;20020:47;;;10760:2;19991:18;;;23305:19;10796:33;23345:14;;;10776:54;10849:12;;;19977:245::o;20229:222::-;10946:37;;;20356:2;20341:18;;20327:124::o;20458:532::-;;10976:5;10953:3;10946:37;10976:5;20825:2;20814:9;20810:18;10946:37;20661:2;20862;20851:9;20847:18;20840:48;20902:78;20661:2;20650:9;20646:18;20966:6;20902:78;:::i;:::-;20894:86;20632:358;-1:-1;;;;;20632:358::o;20997:444::-;10946:37;;;21344:2;21329:18;;10946:37;;;;21427:2;21412:18;;10946:37;21180:2;21165:18;;21151:290::o;21448:744::-;;10976:5;10953:3;10946:37;10976:5;21866:2;21855:9;21851:18;10946:37;10976:5;21949:2;21938:9;21934:18;10946:37;21701:3;21986:2;21975:9;21971:18;21964:48;22026:78;21701:3;21690:9;21686:19;22090:6;22026:78;:::i;:::-;22018:86;;4728:5;23537:13;23530:21;22177:3;22166:9;22162:19;4701:34;21672:520;;;;;;;;:::o;24304:268::-;24369:1;24376:101;24390:6;24387:1;24384:13;24376:101;;;24457:11;;;24451:18;24438:11;;;24431:39;24412:2;24405:10;24376:101;;;24492:6;24489:1;24486:13;24483:2;;;-1:-1;;24369:1;24539:16;;24532:27;24353:219::o;24809:111::-;24890:5;23537:13;23530:21;24868:5;24865:32;24855:2;;24911:1;;24901:12
Swarm Source
ipfs://7e7348d5359b428b55ba28bed46630dd3e8a43b12fb0a8630d90f848f7644494
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.