Source Code
Latest 25 from a total of 29 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw From Ma... | 15837025 | 1234 days ago | IN | 0 ETH | 0.00220996 | ||||
| Withdraw From Ma... | 15821378 | 1237 days ago | IN | 0 ETH | 0.00332118 | ||||
| Claim | 15821368 | 1237 days ago | IN | 0 ETH | 0.0042922 | ||||
| Withdraw From Ma... | 15627810 | 1264 days ago | IN | 0 ETH | 0.0031668 | ||||
| Claim | 15621357 | 1265 days ago | IN | 0 ETH | 0.00162278 | ||||
| Set Compound | 15621349 | 1265 days ago | IN | 0 ETH | 0.00078431 | ||||
| Deposit To Pool | 15605051 | 1267 days ago | IN | 0 ETH | 0.00280463 | ||||
| Deposit To Pool | 15594971 | 1268 days ago | IN | 0 ETH | 0.00241344 | ||||
| Deposit To Pool | 15593751 | 1268 days ago | IN | 0 ETH | 0.0027345 | ||||
| Deposit To Pool | 15591720 | 1269 days ago | IN | 0 ETH | 0.0038923 | ||||
| Set Lock Up Bonu... | 15589805 | 1269 days ago | IN | 0 ETH | 0.00105032 | ||||
| Deposit To Pool | 15586306 | 1269 days ago | IN | 0 ETH | 0.00319134 | ||||
| Deposit To Pool | 15585502 | 1270 days ago | IN | 0 ETH | 0.0032304 | ||||
| Deposit To Pool | 15584861 | 1270 days ago | IN | 0 ETH | 0.00448413 | ||||
| Deposit To Pool | 15584850 | 1270 days ago | IN | 0 ETH | 0.00035572 | ||||
| Deposit To Pool | 15584848 | 1270 days ago | IN | 0 ETH | 0.0027589 | ||||
| Deposit To Pool | 15584826 | 1270 days ago | IN | 0 ETH | 0.00418283 | ||||
| Deposit To Pool | 15584779 | 1270 days ago | IN | 0 ETH | 0.00491241 | ||||
| Deposit To Pool | 15584747 | 1270 days ago | IN | 0 ETH | 0.00702817 | ||||
| Deposit To Pool | 15582291 | 1270 days ago | IN | 0 ETH | 0.00255143 | ||||
| Deposit To Pool | 15582268 | 1270 days ago | IN | 0 ETH | 0.00307344 | ||||
| Unpause | 15577446 | 1271 days ago | IN | 0 ETH | 0.00032071 | ||||
| Pause | 15575614 | 1271 days ago | IN | 0 ETH | 0.00024201 | ||||
| Unpause | 15575601 | 1271 days ago | IN | 0 ETH | 0.00025574 | ||||
| Owner Deposit | 15575428 | 1271 days ago | IN | 0 ETH | 0.00611284 |
Latest 8 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 15821368 | 1237 days ago | 0.00882824 ETH | ||||
| Transfer | 15821368 | 1237 days ago | 0.00146467 ETH | ||||
| Transfer | 15821368 | 1237 days ago | 0.03972569 ETH | ||||
| Transfer | 15627810 | 1264 days ago | 0.02080733 ETH | ||||
| Transfer | 15621357 | 1265 days ago | 0.0045939 ETH | ||||
| Transfer | 15605051 | 1267 days ago | 0.01555022 ETH | ||||
| Transfer | 15591720 | 1269 days ago | 0.01606802 ETH | ||||
| Transfer | 15584747 | 1270 days ago | 0.01432079 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Staking
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-09-20
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;
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;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and 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;
}
}
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev 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 {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
/**
* @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 Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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");
(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");
(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");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal 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
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a / b + (a % b == 0 ? 0 : 1);
}
}
/**
* @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.3.0, sets of type `bytes32` (`Bytes32Set`), `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;
if (lastIndex != toDeleteIndex) {
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] = valueIndex; // Replace lastvalue's index to valueIndex
}
// 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) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
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(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, 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(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set 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(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
// 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(uint160(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(uint160(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(uint160(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(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
// 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));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}
contract Staking is Ownable, Pausable, ReentrancyGuard {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using EnumerableSet for EnumerableSet.AddressSet;
using EnumerableSet for EnumerableSet.UintSet;
struct UserInfo {
bool planChosen;
bool withdrawn;
uint256 lockPlan;
uint256 amount;
uint256 rewardDebt;
uint256 pendingRewards;
uint256 lastDeposit;
uint256 claimedAt;
uint256 lockUpEnd;
}
struct AutoCompounder {
EnumerableSet.AddressSet autoCompounding;
}
struct NftInfo {
uint256 nftAmount;
uint256 nftLevel;
EnumerableSet.UintSet userNfts;
}
struct PoolInfo {
IERC20 stakingToken;
uint256 collectedPenalty;
uint256 rewardRate;
uint256 lastUpdateTime;
uint256 totalStaked;
uint256 totalReward;
uint256 accPerShare;
uint256 penaltyFee;
uint256 currentIndex;
uint256[4] lockDurations;
uint256[4] lockBonus;
uint256[4] stakersInLockup;
bool active;
}
IERC20 public immutable rewardToken;
address public feeRecipient;
uint256 lockBonusDivider = 100;
uint256 public constant MAX_FEE = 100;
uint256 public constant FEE_LIMIT = 20; // 20%
uint256 public totalPools;
uint256 public rewardCycle = 24 hours;
uint256 compoundGas = 500000;
uint256 public endTime;
uint256 public totalSupply;
uint256 public dividendsDistributed;
mapping(uint256 => PoolInfo) public poolInfo;
mapping(uint256 => mapping(address => UserInfo)) public usersInfo;
mapping(uint256 => AutoCompounder) compoundInfo;
mapping(address => uint256) public usersDividends;
bool withdrawingProcess;
EnumerableSet.AddressSet users;
event NftBatchDeposit(address user, uint256[] NftIds);
event NftDeposit(address user, uint256 NftId);
event NftBatchWithdrawl(address user, uint256[] NftIds);
event NftWithdrawl(address user, uint256 NftId);
event Deposit(address user, uint256 amount, uint256 poolId);
event Withdraw(address user, uint256 amount, uint256 poolId);
event Claim(address user, uint256 amount);
event Compounded(address user, uint256 amount);
event CompoundingProcessed(uint iterations, uint count);
event PoolAdded(IERC20 Token);
modifier updateUserList(uint256 poolId) {
_;
if (usersInfo[poolId][_msgSender()].amount > 0 || usersInfo[poolId][_msgSender()].pendingRewards > 0) _checkOrAddUser(_msgSender());
else _removeUser(_msgSender());
}
modifier withdrawing{
withdrawingProcess = true;
_;
withdrawingProcess = false;
}
modifier updateReward(uint256 poolId) {
UserInfo storage user = usersInfo[poolId][_msgSender()];
PoolInfo storage pools = poolInfo[poolId];
if (block.timestamp <= pools.lastUpdateTime) {
return;
}
uint256 totalStaked = pools.totalStaked;
if (totalStaked == 0) {
pools.lastUpdateTime = block.timestamp;
}
if(totalSupply > 0) {
uint256 multiplier = Math.min(block.timestamp, endTime).sub(pools.lastUpdateTime);
uint256 reward = multiplier.mul(pools.rewardRate);
pools.accPerShare = pools.accPerShare.add(reward.mul(1e12).div(totalSupply));
pools.totalReward = pools.totalReward.add(multiplier.mul(pools.rewardRate));
}
pools.lastUpdateTime = Math.min(block.timestamp, endTime);
if(!withdrawingProcess){
uint256 pending = user.amount.mul(pools.accPerShare).div(1e12).sub(user.rewardDebt);
user.pendingRewards = user.pendingRewards.add(pending);
}
_;
user.rewardDebt = user.amount.mul(pools.accPerShare).div(1e12);
if (user.claimedAt == 0) user.claimedAt = block.timestamp;
}
constructor(IERC20 _rewardToken, uint256 rewardRate) {
rewardToken = _rewardToken;
feeRecipient = _msgSender();
totalPools++;
PoolInfo storage pools = poolInfo[1];
pools.stakingToken = _rewardToken;
pools.rewardRate = rewardRate;
pools.active = true;
pools.lockDurations[0] = 30 days;
pools.lockDurations[1] = 90 days;
pools.lockDurations[2] = 180 days;
pools.lockDurations[3] = 360 days;
pools.lockBonus[0] = 5;
pools.lockBonus[1] = 15;
pools.lockBonus[2] = 30;
pools.lockBonus[3] = 60;
pools.penaltyFee = 20;
endTime = block.timestamp.add(1826.25 days); // In default, 5 years
}
receive() external payable {}
function pause() external onlyOwner {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
function setPool(IERC20 _token, uint256 _rewardRate, uint256[4] memory lockTimes) external onlyOwner {
uint256 newPool = ++totalPools;
PoolInfo storage pools = poolInfo[newPool];
pools.stakingToken = _token;
pools.rewardRate = _rewardRate;
pools.active = true;
setLockUpDurations(newPool, lockTimes[0], lockTimes[1], lockTimes[2], lockTimes[3]);
emit PoolAdded(_token);
}
function updatePool(uint256 poolId, uint256 _rewardRate, bool active, uint256 penaltyFees) external onlyOwner {
require(poolId <= totalPools);
PoolInfo storage pools = poolInfo[poolId];
setRewardRate(_rewardRate, poolId);
pools.active = active;
setPenaltyFee(poolId, penaltyFees);
}
function ownerDeposit(uint256 amount) external onlyOwner {
rewardToken.safeTransferFrom(_msgSender(), address(this), amount);
totalSupply = totalSupply.add(amount);
}
function setEndTime(uint256 _time) external onlyOwner {
require (block.timestamp < _time, "!available");
endTime = _time;
}
function restartPeriod(uint256 _minutes) external onlyOwner {
require (block.timestamp > endTime, "!expired");
endTime = block.timestamp.add(_minutes.mul(1 minutes));
}
function setRewardCycle(uint256 _cycleMinutes) external onlyOwner {
rewardCycle = _cycleMinutes.mul(1 minutes);
}
function withdrawPenalty(uint256 poolId) external onlyOwner {
PoolInfo storage pools = poolInfo[poolId];
uint sendAmount = pools.collectedPenalty;
uint curBal = pools.stakingToken.balanceOf(address(this));
if (pools.collectedPenalty > curBal) sendAmount = curBal;
pools.stakingToken.safeTransfer(feeRecipient, sendAmount);
pools.collectedPenalty -= sendAmount;
}
function setPenaltyFee(uint256 poolId, uint256 _fee) internal onlyOwner {
require(_fee <= FEE_LIMIT, "invalid fee");
PoolInfo storage pools = poolInfo[poolId];
pools.penaltyFee = _fee;
}
function setFeeRecipient(address _recipient) external onlyOwner {
feeRecipient = _recipient;
}
function setLockUpDurations(uint256 poolId, uint256 first, uint256 second, uint256 third, uint256 fourth) public onlyOwner {
PoolInfo storage pools = poolInfo[poolId];
pools.lockDurations[0] = first * 1 days;
pools.lockDurations[1] = second * 1 days;
pools.lockDurations[2] = third * 1 days;
pools.lockDurations[3] = fourth * 1 days;
}
function setLockUpBonus(uint256 poolId, uint256 first, uint256 second, uint256 third, uint256 fourth) public onlyOwner {
PoolInfo storage pools = poolInfo[poolId];
pools.lockBonus[0] = first;
pools.lockBonus[1] = second;
pools.lockBonus[2] = third;
pools.lockBonus[3] = fourth;
}
function claimable(uint256 poolId, address _user) external view returns (uint256, uint256) {
UserInfo storage user = usersInfo[poolId][_user];
PoolInfo storage pools = poolInfo[poolId];
if (user.amount == 0) return (user.pendingRewards, 0);
uint256 curAccPerShare = pools.accPerShare;
uint256 curTotalReward = pools.totalReward;
if (totalSupply > 0) {
uint256 multiplier = Math.min(block.timestamp, endTime).sub(pools.lastUpdateTime);
uint256 reward = multiplier.mul(pools.rewardRate);
curTotalReward += reward;
curAccPerShare = pools.accPerShare.add(reward.mul(1e12).div(totalSupply));
}
uint amount = user.amount;
uint available = amount.mul(curAccPerShare).div(1e12).sub(user.rewardDebt).add(user.pendingRewards);
uint reflectedAmount = address(this).balance;
uint dividendAmount = 0;
if (curTotalReward > 0) {
dividendAmount = reflectedAmount.mul(available).div(curTotalReward);
}
return (available, dividendAmount);
}
function setCompound(uint256 poolId) public {
require(poolInfo[poolId].active, "This is not an active pool");
require(!Address.isContract(_msgSender()), "Message sender cannot be a contract");
require(usersInfo[1][_msgSender()].planChosen, "You must have a lock up plan for the main pool");
AutoCompounder storage compounding = compoundInfo[poolId];
if (!compounding.autoCompounding.contains(_msgSender())) {
compounding.autoCompounding.add(_msgSender());
} else {
compounding.autoCompounding.remove(_msgSender());
}
}
function updateCompoundRewards(uint256 poolId, address compounder) internal {
UserInfo storage user = usersInfo[poolId][compounder];
PoolInfo storage pools = poolInfo[poolId];
if (totalSupply > 0) {
uint256 multiplier = Math.min(block.timestamp, endTime).sub(pools.lastUpdateTime);
uint256 reward = multiplier.mul(pools.rewardRate);
pools.totalReward = pools.totalReward.add(multiplier.mul(pools.rewardRate));
pools.accPerShare = pools.accPerShare.add(reward.mul(1e12).div(totalSupply));
}
pools.lastUpdateTime = Math.min(block.timestamp, endTime);
uint256 pending = user.amount.mul(pools.accPerShare).div(1e12).sub(user.rewardDebt);
user.pendingRewards = user.pendingRewards.add(pending);
}
function compoundGains(uint256 poolId, uint256 index) internal {
address compounder = compoundList(poolId, index);
UserInfo storage user = usersInfo[poolId][compounder];
PoolInfo storage pools = poolInfo[poolId];
updateCompoundRewards(poolId, compounder);
uint256 compoundAmount = user.pendingRewards;
if(poolId == 1){
_safeTransferDividends(compoundList(1, index), compoundAmount);
}
usersInfo[1][compounder].amount = usersInfo[1][compounder].amount.add(compoundAmount);
poolInfo[1].totalStaked = poolInfo[1].totalStaked.add(compoundAmount);
totalSupply = totalSupply.sub(compoundAmount);
emit Compounded(compounder, compoundAmount);
user.pendingRewards = 0;
user.claimedAt = block.timestamp;
user.rewardDebt = user.amount.mul(pools.accPerShare).div(1e12);
}
function processGains(uint256 poolId, uint256 gas) internal {
PoolInfo storage pools = poolInfo[poolId];
if(compoundCount(poolId) == 0){return;}
uint256 gasUsed;
uint256 gasLeft = gasleft();
uint256 iterations;
uint256 count;
while(gasUsed < gas && iterations < compoundCount(poolId)){
if(pools.currentIndex >= compoundCount(poolId)) {
pools.currentIndex = 0;
}
if(shouldAutoCompound(poolId, pools.currentIndex)) {
compoundGains(poolId, pools.currentIndex);
count++;
}
gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
gasLeft = gasleft();
pools.currentIndex++;
iterations++;
}
emit CompoundingProcessed(iterations, count);
}
function depositToPool(uint256 amount, uint256 planIndex, uint256 poolId) external nonReentrant whenNotPaused updateReward(poolId) updateUserList(poolId) {
require (block.timestamp < endTime, "expired");
require(!Address.isContract(_msgSender()), "Message sender cannot be a contact");
require(planIndex >= 0 && planIndex < 4, "You must choose a plan index between 0-3");
UserInfo storage user = usersInfo[poolId][_msgSender()];
PoolInfo storage pools = poolInfo[poolId];
require(pools.active, "This is not an active pool");
if(user.withdrawn){
user.withdrawn = false;
}
require(!user.withdrawn);
pools.stakingToken.transferFrom(_msgSender(), address(this), amount);
if(user.planChosen){
user.amount = user.amount.add(amount);
user.lastDeposit = block.timestamp;
pools.totalStaked.add(amount);
} else {
user.planChosen = true;
user.lockPlan = planIndex;
user.lockUpEnd = block.timestamp + pools.lockDurations[planIndex];
pools.stakersInLockup[planIndex]++;
user.amount = user.amount.add(amount);
user.lastDeposit = block.timestamp;
pools.totalStaked = pools.totalStaked.add(amount);
}
emit Deposit(_msgSender(), amount, poolId);
if (user.claimedAt == 0) user.claimedAt = block.timestamp;
}
function withdrawBeforeLockUp(uint256 poolId, uint256 amount) internal returns(uint256) {
PoolInfo storage pools = poolInfo[poolId];
uint256 feeAmount;
uint256 withdrawAmount;
feeAmount = (amount * pools.penaltyFee) / MAX_FEE;
pools.collectedPenalty += feeAmount;
withdrawAmount = amount.sub(feeAmount);
return(withdrawAmount);
}
function withdrawFromMainPool(uint256 amount) public nonReentrant withdrawing updateReward(1) updateUserList(1) {
require(!Address.isContract(_msgSender()), "Message sender cannot be a contract");
UserInfo storage user = usersInfo[1][_msgSender()];
require(!user.withdrawn && user.planChosen, "User has withdrawn and must choose another lock up period");
PoolInfo storage pools = poolInfo[1];
if(block.timestamp < user.lockUpEnd) {
require(amount > 0 && amount <= user.amount, "You cannot withdraw 0 tokens or withdraw more than your user amount");
(uint256 withdrawAmount) = withdrawBeforeLockUp(1, amount);
if(amount == user.amount){
rewardToken.safeTransfer(_msgSender(), withdrawAmount);
emit Withdraw(_msgSender(), withdrawAmount, 1);
user.amount = 0;
pools.totalStaked = pools.totalStaked.sub(amount);
user.planChosen = false;
user.withdrawn = true;
pools.stakersInLockup[user.lockPlan]--;
} else {
rewardToken.safeTransfer(_msgSender(), withdrawAmount);
user.amount = user.amount.sub(amount);
pools.totalStaked = pools.totalStaked.sub(amount);
emit Withdraw(_msgSender(), withdrawAmount, 1);
if(user.amount == 0){
user.amount = 0;
user.planChosen = false;
user.withdrawn = true;
pools.stakersInLockup[user.lockPlan]--;
}
}
} else {
require(amount == user.amount, "Your lock up has ended, you must withdraw all tokens");
uint256 withdrawAmount = user.amount + ((user.amount * pools.lockBonus[user.lockPlan]) / lockBonusDivider);
if(withdrawAmount > totalSupply.add(user.amount)){
rewardToken.safeTransfer(_msgSender(), totalSupply.add(user.amount));
emit Withdraw(_msgSender(), totalSupply.add(user.amount), 1);
if(totalSupply != 0){
totalSupply = 0;
}
pools.totalStaked = pools.totalStaked.sub(user.amount);
} else {
rewardToken.safeTransfer(_msgSender(), withdrawAmount);
totalSupply = totalSupply.sub(withdrawAmount.sub(user.amount));
pools.totalStaked = pools.totalStaked.sub(user.amount);
emit Withdraw(_msgSender(), withdrawAmount, 1);
}
pools.stakersInLockup[user.lockPlan]--;
user.amount = 0;
user.withdrawn = true;
user.planChosen = false;
}
}
function withdrawFromOtherPools(uint256 poolId, uint256 amount) public nonReentrant withdrawing updateReward(poolId) updateUserList(poolId) {
require(!Address.isContract(_msgSender()), "Message sender cannot be a contract");
require(poolId > 1, "You cannot withdraw from the main pool using this function");
UserInfo storage user = usersInfo[poolId][_msgSender()];
require(!user.withdrawn && user.planChosen, "User has withdrawn and must choose another lock up period");
PoolInfo storage pools = poolInfo[poolId];
if(block.timestamp < user.lockUpEnd){
require(amount > 0 && amount <= user.amount, "You cannot withdraw 0 tokens or withdraw more than your user balance");
uint256 withdrawAmount = withdrawBeforeLockUp(poolId, amount);
if(amount == user.amount){
pools.stakingToken.safeTransfer(_msgSender(), withdrawAmount);
pools.totalStaked = pools.totalStaked.sub(amount);
emit Withdraw(_msgSender(), withdrawAmount, poolId);
pools.stakersInLockup[user.lockPlan]--;
user.withdrawn = true;
user.planChosen = false;
user.amount = 0;
} else {
pools.stakingToken.safeTransfer(_msgSender(), withdrawAmount);
pools.totalStaked = pools.totalStaked.sub(amount);
emit Withdraw(_msgSender(), withdrawAmount, poolId);
user.amount = user.amount.sub(amount);
if(user.amount == 0){
user.amount = 0;
user.planChosen = false;
user.withdrawn = true;
pools.stakersInLockup[user.lockPlan]--;
}
}
} else {
require(amount == user.amount, "Your lock up has ended, you must withdraw all tokens");
pools.stakingToken.safeTransfer(_msgSender(), amount);
pools.totalStaked = pools.totalStaked.sub(amount);
emit Withdraw(_msgSender(), amount, poolId);
pools.stakersInLockup[user.lockPlan]--;
user.withdrawn = true;
user.planChosen = false;
user.amount = 0;
}
}
function withdrawAll(uint256 poolId) external {
UserInfo storage user = usersInfo[poolId][_msgSender()];
if(poolId == 1)
withdrawFromMainPool(user.amount);
else
withdrawFromOtherPools(poolId, user.amount);
}
function withdrawPercent(uint256 poolId, uint256 percent) external {
UserInfo storage user = usersInfo[poolId][_msgSender()];
require(percent <= 100);
uint256 amountToWithdraw = (user.amount * percent) / 100;
if(poolId == 1)
withdrawFromMainPool(amountToWithdraw);
else
withdrawFromOtherPools(poolId, amountToWithdraw);
}
function claim(uint256 poolId) public nonReentrant updateReward(poolId) updateUserList(poolId) {
require(!Address.isContract(_msgSender()), "Message sender cannot be a contract");
UserInfo storage user = usersInfo[poolId][_msgSender()];
AutoCompounder storage compounding = compoundInfo[poolId];
require(!user.withdrawn, "You have already withdrawn from this pool");
uint256 claimAmount = user.pendingRewards;
if(!compounding.autoCompounding.contains(_msgSender())){
require (block.timestamp.sub(user.claimedAt) >= rewardCycle, "Your reward cycle is not over yet");
rewardToken.safeTransfer(_msgSender(), claimAmount);
if(poolId == 1){
_safeTransferDividends(_msgSender(), claimAmount);
}
emit Claim(_msgSender(), claimAmount);
totalSupply = totalSupply.sub(claimAmount);
user.pendingRewards = 0;
user.claimedAt = block.timestamp;
processGains(poolId, compoundGas);
} else {
require(block.timestamp.sub(user.claimedAt) >= rewardCycle, "Your reward cycle is not over yet");
require(usersInfo[1][_msgSender()].planChosen, "You must choose a lock plan for the main pool");
if(poolId == 1){
_safeTransferDividends(_msgSender(), claimAmount);
}
user.claimedAt = block.timestamp;
usersInfo[1][_msgSender()].amount = usersInfo[1][_msgSender()].amount.add(claimAmount);
poolInfo[1].totalStaked = poolInfo[1].totalStaked.add(claimAmount);
emit Compounded(_msgSender(), claimAmount);
totalSupply = totalSupply.sub(claimAmount);
user.pendingRewards = 0;
processGains(poolId, compoundGas);
}
}
function _safeTransferDividends(address _to, uint256 _rewardAmount) internal returns (uint256) {
PoolInfo storage pools = poolInfo[1];
uint reflectedAmount = address(this).balance;
if (reflectedAmount == 0 || pools.totalReward == 0) return 0;
uint dividendAmount;
if(_rewardAmount <= pools.totalReward) {
dividendAmount = reflectedAmount.mul(_rewardAmount).div(pools.totalReward);
if (dividendAmount > 0) {
payable(_to).transfer(dividendAmount);
}
pools.totalReward = pools.totalReward.sub(_rewardAmount);
dividendsDistributed = dividendsDistributed.add(dividendAmount);
usersDividends[_to] = usersDividends[_to].add(dividendAmount);
}
return dividendAmount;
}
function setRewardRate(uint256 _rewardRate, uint256 poolId) internal {
PoolInfo storage pools = poolInfo[poolId];
require (endTime > block.timestamp, "expired");
require (_rewardRate > 0, "Rewards per second should be greater than 0!");
// Update pool infos with old reward rate before setting new one first
if (totalSupply > 0) {
uint256 multiplier = block.timestamp.sub(pools.lastUpdateTime);
uint256 reward = multiplier.mul(pools.rewardRate);
pools.totalReward = pools.totalReward.add(reward);
pools.accPerShare = pools.accPerShare.add(reward.mul(1e12).div(totalSupply));
}
pools.lastUpdateTime = block.timestamp;
pools.rewardRate = _rewardRate;
}
function _removeUser(address _user) internal {
if (users.contains(_user)) {
users.remove(_user);
}
}
function _checkOrAddUser(address _user) internal {
if (!users.contains(_user)) {
users.add(_user);
}
}
function shouldAutoCompound(uint256 poolId, uint256 index) internal view returns(bool cycleDone) {
return block.timestamp - usersInfo[poolId][compoundList(poolId, index)].claimedAt >= rewardCycle
&& usersInfo[1][compoundList(poolId, index)].planChosen;
}
function isCompounder(uint256 poolId) public view returns(bool){
AutoCompounder storage compounding = compoundInfo[poolId];
return compounding.autoCompounding.contains(_msgSender());
}
function compoundCount(uint256 poolId) public view returns (uint) {
AutoCompounder storage compounding = compoundInfo[poolId];
return compounding.autoCompounding.length();
}
function compoundList(uint256 poolId, uint256 index) internal view returns (address indexedAddress) {
AutoCompounder storage compounding = compoundInfo[poolId];
indexedAddress = compounding.autoCompounding.at(index);
return indexedAddress;
}
function compoundingList(uint256 poolId) external view onlyOwner returns (address[] memory Addresses) {
AutoCompounder storage compounding = compoundInfo[poolId];
Addresses = compounding.autoCompounding.values();
return Addresses;
}
function lockUpTimes(uint256 poolId) external view returns(uint256[4] memory lockDurations, uint256[4] memory lockUpBonus) {
PoolInfo storage pools = poolInfo[poolId];
lockDurations = pools.lockDurations;
lockUpBonus = pools.lockBonus;
}
function stakersInPlan(uint256 poolId) external view returns(uint256[4] memory) {
PoolInfo storage pools = poolInfo[poolId];
return pools.stakersInLockup;
}
function userCount() external view returns (uint) {
return users.length();
}
function userList() external view onlyOwner returns (address[] memory Addresses) {
Addresses = users.values();
return Addresses;
}
function userStakedAmount(uint256 poolId) public view returns(uint) {
return usersInfo[poolId][_msgSender()].amount;
}
function currentTime() external view returns(uint time) {
time = block.timestamp;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"rewardRate","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Compounded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"CompoundingProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"NftIds","type":"uint256[]"}],"name":"NftBatchDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"NftIds","type":"uint256[]"}],"name":"NftBatchWithdrawl","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"NftId","type":"uint256"}],"name":"NftDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"NftId","type":"uint256"}],"name":"NftWithdrawl","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC20","name":"Token","type":"address"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"FEE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"compoundCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"compoundingList","outputs":[{"internalType":"address[]","name":"Addresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTime","outputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"planIndex","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"depositToPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"isCompounder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"lockUpTimes","outputs":[{"internalType":"uint256[4]","name":"lockDurations","type":"uint256[4]"},{"internalType":"uint256[4]","name":"lockUpBonus","type":"uint256[4]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"stakingToken","type":"address"},{"internalType":"uint256","name":"collectedPenalty","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"totalReward","type":"uint256"},{"internalType":"uint256","name":"accPerShare","type":"uint256"},{"internalType":"uint256","name":"penaltyFee","type":"uint256"},{"internalType":"uint256","name":"currentIndex","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minutes","type":"uint256"}],"name":"restartPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardCycle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"setCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"first","type":"uint256"},{"internalType":"uint256","name":"second","type":"uint256"},{"internalType":"uint256","name":"third","type":"uint256"},{"internalType":"uint256","name":"fourth","type":"uint256"}],"name":"setLockUpBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"first","type":"uint256"},{"internalType":"uint256","name":"second","type":"uint256"},{"internalType":"uint256","name":"third","type":"uint256"},{"internalType":"uint256","name":"fourth","type":"uint256"}],"name":"setLockUpDurations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_rewardRate","type":"uint256"},{"internalType":"uint256[4]","name":"lockTimes","type":"uint256[4]"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cycleMinutes","type":"uint256"}],"name":"setRewardCycle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"stakersInPlan","outputs":[{"internalType":"uint256[4]","name":"","type":"uint256[4]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPools","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"_rewardRate","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"penaltyFees","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userList","outputs":[{"internalType":"address[]","name":"Addresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"userStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"usersDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"usersInfo","outputs":[{"internalType":"bool","name":"planChosen","type":"bool"},{"internalType":"bool","name":"withdrawn","type":"bool"},{"internalType":"uint256","name":"lockPlan","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"pendingRewards","type":"uint256"},{"internalType":"uint256","name":"lastDeposit","type":"uint256"},{"internalType":"uint256","name":"claimedAt","type":"uint256"},{"internalType":"uint256","name":"lockUpEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFromMainPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFromOtherPools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"withdrawPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"withdrawPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60a06040526064600355620151806005556207a1206006553480156200002457600080fd5b50604051620045c1380380620045c1833981016040819052620000479162000310565b6200005233620002ab565b6000805460ff60a01b19168155600180556001600160601b0319606084901b16608052600280546001600160a01b031916331790556004805491620000978362000367565b909155505060016000819052600a60209081527fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc780546001600160a01b0319166001600160a01b0386161781557fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc98490557fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bdc805460ff191690931790925562278d007fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bd0556276a7007fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bd15562ed4e007fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bd2556301da9c007fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bd35560057fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bd455600f7fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bd555601e7fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bd655603c7fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bd75560147fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bce556200029e904290630967a76090620002fb811b62002c8417901c565b600755506200039b915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006200030982846200034c565b9392505050565b600080604083850312156200032457600080fd5b82516001600160a01b03811681146200033c57600080fd5b6020939093015192949293505050565b6000821982111562000362576200036262000385565b500190565b60006000198214156200037e576200037e62000385565b5060010190565b634e487b7160e01b600052601160045260246000fd5b60805160601c6141f2620003cf600039600081816109480152818161101a015281816112f10152611d3901526141f26000f3fe6080604052600436106102765760003560e01c80637dc733f31161014f578063ab3c7e52116100c1578063d18e81b31161007a578063d18e81b3146108c3578063e74b981b146108d6578063e8e18257146108f6578063f2fde38b14610916578063f7c618c114610936578063fa4b7d1d1461096a57600080fd5b8063ab3c7e5214610823578063b0b8437414610839578063bc063e1a1461084e578063c42d48f914610863578063cbd756ef14610883578063ccb98ffc146108a357600080fd5b80638456cb59116101135780638456cb591461074d5780638da5cb5b14610762578063958e2d3114610780578063984fb358146107a0578063a0c7f71c146107ce578063a679b3c41461080357600080fd5b80637dc733f3146105f35780637dd28d03146106135780637e989cde146106405780637f22d99a146106605780638115a3bc1461069b57600080fd5b806346904840116101e857806364f6761f116101ac57806364f6761f1461053b5780636b1a9dae1461055b5780636ee010ae14610588578063715018a61461059e5780637646c038146105b3578063793cd66a146105d357600080fd5b8063469048401461048e5780634ff6fc50146104c65780635430d337146104dc5780635943bcb1146104fc5780635c975abb1461051c57600080fd5b80631526fe271161023a5780631526fe271461033e57806318160ddd1461040d57806322c28011146104235780633197cbb614610443578063379607f5146104595780633f4ba83a1461047957600080fd5b8063021067f41461028257806307973ccf146102b75780630e0f785f146102da5780630f745cdc146102fc578063141833dc1461031e57600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506102a261029d366004613c3e565b61098a565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102cc6109ab565b6040519081526020016102ae565b3480156102e657600080fd5b506102ef6109bc565b6040516102ae9190613dc8565b34801561030857600080fd5b5061031c610317366004613ca0565b6109fc565b005b34801561032a57600080fd5b5061031c610339366004613c3e565b610feb565b34801561034a57600080fd5b506103b7610359366004613c3e565b600a6020526000908152604090208054600182015460028301546003840154600485015460058601546006870154600788015460088901546015909901546001600160a01b0390981698969795969495939492939192909160ff168a565b604080516001600160a01b03909b168b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301521515610120820152610140016102ae565b34801561041957600080fd5b506102cc60085481565b34801561042f57600080fd5b5061031c61043e366004613c3e565b61105d565b34801561044f57600080fd5b506102cc60075481565b34801561046557600080fd5b5061031c610474366004613c3e565b611098565b34801561048557600080fd5b5061031c61160d565b34801561049a57600080fd5b506002546104ae906001600160a01b031681565b6040516001600160a01b0390911681526020016102ae565b3480156104d257600080fd5b506102cc60095481565b3480156104e857600080fd5b5061031c6104f7366004613d2d565b611641565b34801561050857600080fd5b506102cc610517366004613c3e565b61169d565b34801561052857600080fd5b50600054600160a01b900460ff166102a2565b34801561054757600080fd5b5061031c610556366004613b99565b6116b4565b34801561056757600080fd5b506102cc610576366004613b5f565b600d6020526000908152604090205481565b34801561059457600080fd5b506102cc60055481565b3480156105aa57600080fd5b5061031c6117a1565b3480156105bf57600080fd5b5061031c6105ce366004613c3e565b6117d5565b3480156105df57600080fd5b5061031c6105ee366004613c3e565b611856565b3480156105ff57600080fd5b5061031c61060e366004613c3e565b611f2d565b34801561061f57600080fd5b5061063361062e366004613c3e565b61206f565b6040516102ae9190613e15565b34801561064c57600080fd5b5061031c61065b366004613d2d565b6120be565b34801561066c57600080fd5b506102cc61067b366004613c3e565b6000908152600b6020908152604080832033845290915290206002015490565b3480156106a757600080fd5b506107076106b6366004613c70565b600b6020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460079097015460ff8088169861010090980416969089565b604080519915158a5297151560208a0152968801959095526060870193909352608086019190915260a085015260c084015260e0830152610100820152610120016102ae565b34801561075957600080fd5b5061031c612144565b34801561076e57600080fd5b506000546001600160a01b03166104ae565b34801561078c57600080fd5b5061031c61079b366004613c3e565b612176565b3480156107ac57600080fd5b506107c06107bb366004613c3e565b6121b3565b6040516102ae929190613e23565b3480156107da57600080fd5b506107ee6107e9366004613c70565b61223d565b604080519283526020830191909152016102ae565b34801561080f57600080fd5b5061031c61081e366004613ca0565b61236b565b34801561082f57600080fd5b506102cc60045481565b34801561084557600080fd5b506102cc601481565b34801561085a57600080fd5b506102cc606481565b34801561086f57600080fd5b5061031c61087e366004613c3e565b6123d9565b34801561088f57600080fd5b5061031c61089e366004613cc2565b6124e3565b3480156108af57600080fd5b5061031c6108be366004613c3e565b612555565b3480156108cf57600080fd5b50426102cc565b3480156108e257600080fd5b5061031c6108f1366004613b5f565b6125c0565b34801561090257600080fd5b5061031c610911366004613d01565b61260c565b34801561092257600080fd5b5061031c610931366004613b5f565b612ba5565b34801561094257600080fd5b506104ae7f000000000000000000000000000000000000000000000000000000000000000081565b34801561097657600080fd5b506102ef610985366004613c3e565b612c40565b6000818152600c602052604081206109a4335b8290612c99565b9392505050565b60006109b7600f612cbb565b905090565b6000546060906001600160a01b031633146109f25760405162461bcd60e51b81526004016109e990613f4a565b60405180910390fd5b6109b7600f612cc5565b60026001541415610a1f5760405162461bcd60e51b81526004016109e990613fdc565b60026001908155600e805460ff191690911790556000828152600b602090815260408083203384528252808320858452600a9092529091206003810154849291904211610a6d575050610fd8565b600481015480610a7e574260038301555b60085415610b1d576000610aa28360030154610a9c42600754612cd2565b90612ce8565b90506000610abd846002015483612cf490919063ffffffff16565b9050610af1610ae6600854610ae064e8d4a5100085612cf490919063ffffffff16565b90612d00565b600686015490612c84565b60068501556002840154610b1590610b0a908490612cf4565b600586015490612c84565b600585015550505b610b2942600754612cd2565b6003830155600e5460ff16610b7f576000610b668460030154610a9c64e8d4a51000610ae087600601548960020154612cf490919063ffffffff16565b6004850154909150610b789082612c84565b6004850155505b85610b94335b6001600160a01b03163b151590565b15610bb15760405162461bcd60e51b81526004016109e990613e72565b60018711610c275760405162461bcd60e51b815260206004820152603a60248201527f596f752063616e6e6f742077697468647261772066726f6d20746865206d616960448201527f6e20706f6f6c207573696e6720746869732066756e6374696f6e00000000000060648201526084016109e9565b6000878152600b6020908152604080832033845290915290208054610100900460ff16158015610c585750805460ff165b610c745760405162461bcd60e51b81526004016109e990613f7f565b6000888152600a602052604090206007820154421015610e7f57600088118015610ca2575081600201548811155b610d225760405162461bcd60e51b8152602060048201526044602482018190527f596f752063616e6e6f74207769746864726177203020746f6b656e73206f7220908201527f7769746864726177206d6f7265207468616e20796f757220757365722062616c606482015263616e636560e01b608482015260a4016109e9565b6000610d2e8a8a612d0c565b90508260020154891415610dd657610d53335b83546001600160a01b03169083612d6a565b6004820154610d62908a612ce8565b600483015560008051602061417d83398151915233828c604051610d8893929190613da7565b60405180910390a181601101836001015460048110610da957610da961410d565b018054906000610db8836140af565b9091555050825461ffff191661010017835560006002840155610e79565b610ddf33610d41565b6004820154610dee908a612ce8565b600483015560008051602061417d83398151915233828c604051610e1493929190613da7565b60405180910390a16002830154610e2b908a612ce8565b60028401819055610e795760006002840155825461ffff19166101001783556001830154601183019060048110610e6457610e6461410d565b018054906000610e73836140af565b91905055505b50610f37565b81600201548814610ea25760405162461bcd60e51b81526004016109e990613eb5565b610eb83382546001600160a01b0316908a612d6a565b6004810154610ec79089612ce8565b600482015560008051602061417d83398151915233898b604051610eed93929190613da7565b60405180910390a180601101826001015460048110610f0e57610f0e61410d565b018054906000610f1d836140af565b9091555050815461ffff1916610100178255600060028301555b50506000818152600b60209081526040808320338452909152902060020154151580610f7e57506000818152600b6020908152604080832033845290915290206004015415155b15610f9157610f8c33612dcd565b610f9a565b610f9a33612de7565b50610fbf64e8d4a51000610ae084600601548660020154612cf490919063ffffffff16565b60038401556006830154610fd4574260068401555b5050505b5050600e805460ff191690555060018055565b6000546001600160a01b031633146110155760405162461bcd60e51b81526004016109e990613f4a565b61104a7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316333084612e02565b6008546110579082612c84565b60085550565b6000546001600160a01b031633146110875760405162461bcd60e51b81526004016109e990613f4a565b61109281603c612cf4565b60055550565b600260015414156110bb5760405162461bcd60e51b81526004016109e990613fdc565b60026001556000818152600b602090815260408083203384528252808320848452600a90925290912060038101548392919042116110fa575050611605565b60048101548061110b574260038301555b600854156111885760006111298360030154610a9c42600754612cd2565b90506000611144846002015483612cf490919063ffffffff16565b9050611167610ae6600854610ae064e8d4a5100085612cf490919063ffffffff16565b6006850155600284015461118090610b0a908490612cf4565b600585015550505b61119442600754612cd2565b6003830155600e5460ff166111ea5760006111d18460030154610a9c64e8d4a51000610ae087600601548960020154612cf490919063ffffffff16565b60048501549091506111e39082612c84565b6004850155505b846111f433610b85565b156112115760405162461bcd60e51b81526004016109e990613e72565b6000868152600b602090815260408083203384528252808320898452600c9092529091208154610100900460ff161561129e5760405162461bcd60e51b815260206004820152602960248201527f596f75206861766520616c72656164792077697468647261776e2066726f6d206044820152681d1a1a5cc81c1bdbdb60ba1b60648201526084016109e9565b60048201546112ad8233612c99565b6113a35760055460068401546112c4904290612ce8565b10156112e25760405162461bcd60e51b81526004016109e990613f09565b611318335b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169083612d6a565b886001141561132e5761132c335b82612e3a565b505b7f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d433604080516001600160a01b039092168252602082018490520160405180910390a160085461137e9082612ce8565b60085560006004840155426006808501919091555461139e908a90612f51565b611563565b60055460068401546113b6904290612ce8565b10156113d45760405162461bcd60e51b81526004016109e990613f09565b33600090815260008051602061419d833981519152602052604090205460ff166114565760405162461bcd60e51b815260206004820152602d60248201527f596f75206d7573742063686f6f73652061206c6f636b20706c616e20666f722060448201526c1d1a19481b585a5b881c1bdbdb609a1b60648201526084016109e9565b886001141561146a5761146833611326565b505b42600684015533600090815260008051602061419d833981519152602052604090206002015461149a9082612c84565b33600090815260008051602061419d8339815191526020908152604082206002019290925560019052600a905260008051602061415d833981519152546114e19082612c84565b6001600052600a60205260008051602061415d833981519152557fc16de066392da7e40ceccb739c331fc48a2e76bf147449613c48023d960eec3233604080516001600160a01b039092168252602082018490520160405180910390a160085461154b9082612ce8565b60085560006004840155600654611563908a90612f51565b5050506000818152600b602090815260408083203384529091529020600201541515806115ab57506000818152600b6020908152604080832033845290915290206004015415155b156115be576115b933612dcd565b6115c7565b6115c733612de7565b506115ec64e8d4a51000610ae084600601548660020154612cf490919063ffffffff16565b60038401556006830154611601574260068401555b5050505b505060018055565b6000546001600160a01b031633146116375760405162461bcd60e51b81526004016109e990613f4a565b61163f613066565b565b6000546001600160a01b0316331461166b5760405162461bcd60e51b81526004016109e990613f4a565b6000858152600a60205260409020600d8101858155600e8201859055600f8201849055829060035b0155505050505050565b6000818152600c602052604081206109a481612cbb565b6000546001600160a01b031633146116de5760405162461bcd60e51b81526004016109e990613f4a565b60006004600081546116ef906140c6565b91829055506000818152600a6020526040812080546001600160a01b0319166001600160a01b0388161781556002810186905560158101805460ff1916600117905591925061175e908390859060200201518560016020020151866002602002015187600360200201516120be565b6040516001600160a01b03861681527f73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea69060200160405180910390a15050505050565b6000546001600160a01b031633146117cb5760405162461bcd60e51b81526004016109e990613f4a565b61163f6000613103565b6000546001600160a01b031633146117ff5760405162461bcd60e51b81526004016109e990613f4a565b600754421161183b5760405162461bcd60e51b815260206004820152600860248201526708595e1c1a5c995960c21b60448201526064016109e9565b61185061184982603c612cf4565b4290612c84565b60075550565b600260015414156118795760405162461bcd60e51b81526004016109e990613fdc565b60026001908155600e805460ff19168217905533600090815260008051602061419d83398151915260209081526040822091839052600a90527fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bca547fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc7904211611903575050611f1b565b600481015480611914574260038301555b600854156119915760006119328360030154610a9c42600754612cd2565b9050600061194d846002015483612cf490919063ffffffff16565b9050611970610ae6600854610ae064e8d4a5100085612cf490919063ffffffff16565b6006850155600284015461198990610b0a908490612cf4565b600585015550505b61199d42600754612cd2565b6003830155600e5460ff166119f35760006119da8460030154610a9c64e8d4a51000610ae087600601548960020154612cf490919063ffffffff16565b60048501549091506119ec9082612c84565b6004850155505b60016119fe33610b85565b15611a1b5760405162461bcd60e51b81526004016109e990613e72565b33600090815260008051602061419d833981519152602052604090208054610100900460ff16158015611a4f5750805460ff165b611a6b5760405162461bcd60e51b81526004016109e990613f7f565b6001600052600a60205260078101547fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc790421015611c8d57600088118015611ab7575081600201548811155b611b355760405162461bcd60e51b815260206004820152604360248201527f596f752063616e6e6f74207769746864726177203020746f6b656e73206f722060448201527f7769746864726177206d6f7265207468616e20796f7572207573657220616d6f6064820152621d5b9d60ea1b608482015260a4016109e9565b6000611b4260018a612d0c565b90508260020154891415611be057611b59336112e7565b60008051602061417d83398151915233826001604051611b7b93929190613da7565b60405180910390a1600060028401556004820154611b99908a612ce8565b600480840191909155835461ffff1916610100178455600184015460118401918110611bc757611bc761410d565b018054906000611bd6836140af565b9190505550611c87565b611be9336112e7565b6002830154611bf8908a612ce8565b60028401556004820154611c0c908a612ce8565b600483015560008051602061417d83398151915233826001604051611c3393929190613da7565b60405180910390a16002830154611c875760006002840155825461ffff19166101001783556001830154601183019060048110611c7257611c7261410d565b018054906000611c81836140af565b91905055505b50611e7a565b81600201548814611cb05760405162461bcd60e51b81526004016109e990613eb5565b600060035482600d01846001015460048110611cce57611cce61410d565b01548460020154611cdf919061404d565b611ce9919061402b565b8360020154611cf89190614013565b9050611d138360020154600854612c8490919063ffffffff16565b811115611dc557611d60336002850154600854611d2f91612c84565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190612d6a565b60008051602061417d833981519152336002850154600854611d8191612c84565b6001604051611d9293929190613da7565b60405180910390a160085415611da85760006008555b60028301546004830154611dbb91612ce8565b6004830155611e37565b611dce336112e7565b611df1611de8846002015483612ce890919063ffffffff16565b60085490612ce8565b60085560028301546004830154611e0791612ce8565b600483015560008051602061417d83398151915233826001604051611e2e93929190613da7565b60405180910390a15b81601101836001015460048110611e5057611e5061410d565b018054906000611e5f836140af565b90915550506000600284015550815461ffff19166101001782555b50506000818152600b60209081526040808320338452909152902060020154151580611ec157506000818152600b6020908152604080832033845290915290206004015415155b15611ed457611ecf33612dcd565b611edd565b611edd33612de7565b50611f0264e8d4a51000610ae084600601548660020154612cf490919063ffffffff16565b60038401556006830154611f17574260068401555b5050505b5050600e805460ff1916905560018055565b6000818152600a602052604090206015015460ff16611f8e5760405162461bcd60e51b815260206004820152601a60248201527f54686973206973206e6f7420616e2061637469766520706f6f6c00000000000060448201526064016109e9565b611f9733610b85565b15611fb45760405162461bcd60e51b81526004016109e990613e72565b33600090815260008051602061419d833981519152602052604090205460ff166120375760405162461bcd60e51b815260206004820152602e60248201527f596f75206d75737420686176652061206c6f636b20757020706c616e20666f7260448201526d081d1a19481b585a5b881c1bdbdb60921b60648201526084016109e9565b6000818152600c6020526040902061204e3361099d565b6120615761205c8133613153565b505050565b61205c8133613168565b5050565b612077613b41565b6000828152600a602052604090819020815160808101928390529091601183019060049082845b81548152602001906001019080831161209e575050505050915050919050565b6000546001600160a01b031633146120e85760405162461bcd60e51b81526004016109e990613f4a565b6000858152600a60205260409020612103856201518061404d565b6009820155612115846201518061404d565b600a820155612127836201518061404d565b600b820155612139826201518061404d565b600982016003611693565b6000546001600160a01b0316331461216e5760405162461bcd60e51b81526004016109e990613f4a565b61163f61317d565b6000818152600b60209081526040808320338452909152902060018214156121a55761206b8160020154611856565b61206b8282600201546109fc565b6121bb613b41565b6121c3613b41565b6000838152600a602052604090819020815160808101928390529091600983019060049082845b8154815260200190600101908083116121ea575050604080516080810191829052949750600d8601935060049250905082845b81548152602001906001019080831161221d575050505050915050915091565b6000828152600b602090815260408083206001600160a01b03851684528252808320858452600a9092528220600282015483929190612286575060040154915060009050612364565b60068101546005820154600854156123085760006122ae8460030154610a9c42600754612cd2565b905060006122c9856002015483612cf490919063ffffffff16565b90506122d58184614013565b92506123036122f8600854610ae064e8d4a5100085612cf490919063ffffffff16565b600687015490612c84565b935050505b60028401546004850154600386015460009161233b9161233590610a9c64e8d4a51000610ae0888b612cf4565b90612c84565b905047600084156123575761235485610ae08486612cf4565b90505b9198509096505050505050505b9250929050565b6000828152600b602090815260408083203384529091529020606482111561239257600080fd5b600060648383600201546123a6919061404d565b6123b0919061402b565b905083600114156123c9576123c481611856565b6123d3565b6123d384826109fc565b50505050565b6000546001600160a01b031633146124035760405162461bcd60e51b81526004016109e990613f4a565b6000818152600a60205260408082206001810154815492516370a0823160e01b81523060048201529193909290916001600160a01b03909116906370a082319060240160206040518083038186803b15801561245e57600080fd5b505afa158015612472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124969190613c57565b905080836001015411156124a8578091505b60025483546124c4916001600160a01b03918216911684612d6a565b818360010160008282546124d8919061406c565b909155505050505050565b6000546001600160a01b0316331461250d5760405162461bcd60e51b81526004016109e990613f4a565b60045484111561251c57600080fd5b6000848152600a602052604090206125348486613205565b60158101805460ff191684151517905561254e8583613343565b5050505050565b6000546001600160a01b0316331461257f5760405162461bcd60e51b81526004016109e990613f4a565b8042106125bb5760405162461bcd60e51b815260206004820152600a60248201526921617661696c61626c6560b01b60448201526064016109e9565b600755565b6000546001600160a01b031633146125ea5760405162461bcd60e51b81526004016109e990613f4a565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002600154141561262f5760405162461bcd60e51b81526004016109e990613fdc565b6002600155600054600160a01b900460ff16156126815760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109e9565b6000818152600b602090815260408083203384528252808320848452600a90925290912060038101548392919042116126bb575050612b9b565b6004810154806126cc574260038301555b600854156127495760006126ea8360030154610a9c42600754612cd2565b90506000612705846002015483612cf490919063ffffffff16565b9050612728610ae6600854610ae064e8d4a5100085612cf490919063ffffffff16565b6006850155600284015461274190610b0a908490612cf4565b600585015550505b61275542600754612cd2565b6003830155600e5460ff166127ab5760006127928460030154610a9c64e8d4a51000610ae087600601548960020154612cf490919063ffffffff16565b60048501549091506127a49082612c84565b6004850155505b8460075442106127e75760405162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b60448201526064016109e9565b6127f033610b85565b156128485760405162461bcd60e51b815260206004820152602260248201527f4d6573736167652073656e6465722063616e6e6f74206265206120636f6e746160448201526118dd60f21b60648201526084016109e9565b600487106128a95760405162461bcd60e51b815260206004820152602860248201527f596f75206d7573742063686f6f7365206120706c616e20696e646578206265746044820152677765656e20302d3360c01b60648201526084016109e9565b6000868152600b602090815260408083203384528252808320898452600a909252909120601581015460ff166129215760405162461bcd60e51b815260206004820152601a60248201527f54686973206973206e6f7420616e2061637469766520706f6f6c00000000000060448201526064016109e9565b8154610100900460ff161561293a57815461ff00191682555b8154610100900460ff161561294e57600080fd5b80546001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018d9052606401602060405180830381600087803b1580156129ad57600080fd5b505af11580156129c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e59190613b7c565b50815460ff1615612a1f5760028201546129ff908b612c84565b60028301554260058301556004810154612a19908b612c84565b50612aaf565b815460ff1916600190811783558201899055600981018960048110612a4657612a4661410d565b0154612a529042614013565b6007830155601181018960048110612a6c57612a6c61410d565b018054906000612a7b836140c6565b90915550506002820154612a8f908b612c84565b60028301554260058301556004810154612aa9908b612c84565b60048201555b7f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15338b8a604051612ae293929190613da7565b60405180910390a16006820154612afa574260068301555b50506000818152600b60209081526040808320338452909152902060020154151580612b4157506000818152600b6020908152604080832033845290915290206004015415155b15612b5457612b4f33612dcd565b612b5d565b612b5d33612de7565b50612b8264e8d4a51000610ae084600601548660020154612cf490919063ffffffff16565b60038401556006830154612b97574260068401555b5050505b5050600180555050565b6000546001600160a01b03163314612bcf5760405162461bcd60e51b81526004016109e990613f4a565b6001600160a01b038116612c345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e9565b612c3d81613103565b50565b6000546060906001600160a01b03163314612c6d5760405162461bcd60e51b81526004016109e990613f4a565b6000828152600c602052604090206109a481612cc5565b6000612c908284614013565b90505b92915050565b6001600160a01b03811660009081526001830160205260408120541515612c90565b6000612c93825490565b606060006109a4836133c1565b6000818310612ce15781612c90565b5090919050565b6000612c90828461406c565b6000612c90828461404d565b6000612c90828461402b565b6000828152600a60205260408120600781015482908190606490612d30908761404d565b612d3a919061402b565b915081836001016000828254612d509190614013565b90915550612d6090508583612ce8565b9695505050505050565b6040516001600160a01b03831660248201526044810182905261205c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261341d565b612dd8600f82612c99565b612c3d5761206b600f82613153565b612df2600f82612c99565b15612c3d5761206b600f82613168565b6040516001600160a01b03808516602483015283166044820152606481018290526123d39085906323b872dd60e01b90608401612d96565b60016000908152600a6020527fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc747801580612e7757506005820154155b15612e8757600092505050612c93565b600082600501548511612f48576005830154612ea790610ae08488612cf4565b90508015612ee7576040516001600160a01b0387169082156108fc029083906000818181858888f19350505050158015612ee5573d6000803e3d6000fd5b505b6005830154612ef69086612ce8565b6005840155600954612f089082612c84565b6009556001600160a01b0386166000908152600d6020526040902054612f2e9082612c84565b6001600160a01b0387166000908152600d60205260409020555b95945050505050565b6000828152600a60205260409020612f688361169d565b612f7157505050565b6000805a90506000805b8584108015612f915750612f8e8761169d565b82105b1561302457612f9f8761169d565b856008015410612fb157600060088601555b612fbf8786600801546134ef565b15612fe057612fd2878660080154613588565b80612fdc816140c6565b9150505b612ff5612fee5a8590612ce8565b8590612c84565b93505a600886018054919450600061300c836140c6565b9190505550818061301c906140c6565b925050612f7b565b60408051838152602081018390527f899b268db1bda532ae8a19ff5fdd4dca661f0de13ad278f55f592727f890b23c910160405180910390a150505050505050565b600054600160a01b900460ff166130b65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109e9565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612c90836001600160a01b038416613719565b6000612c90836001600160a01b038416613768565b600054600160a01b900460ff16156131ca5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109e9565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130e63390565b6000818152600a60205260409020600754421061324e5760405162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b60448201526064016109e9565b600083116132b35760405162461bcd60e51b815260206004820152602c60248201527f5265776172647320706572207365636f6e642073686f756c642062652067726560448201526b61746572207468616e20302160a01b60648201526084016109e9565b600854156133335760006132d4826003015442612ce890919063ffffffff16565b905060006132ef836002015483612cf490919063ffffffff16565b60058401549091506133019082612c84565b600584015560085461332b9061332090610ae08464e8d4a51000612cf4565b600685015490612c84565b600684015550505b4260038201556002019190915550565b6000546001600160a01b0316331461336d5760405162461bcd60e51b81526004016109e990613f4a565b60148111156133ac5760405162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b60448201526064016109e9565b6000918252600a602052604090912060070155565b60608160000180548060200260200160405190810160405280929190818152602001828054801561341157602002820191906000526020600020905b8154815260200190600101908083116133fd575b50505050509050919050565b6000613472826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661385b9092919063ffffffff16565b80519091501561205c57808060200190518101906134909190613b7c565b61205c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109e9565b6005546000838152600b602052604081209091908261350e8686613872565b6001600160a01b03168152602081019190915260400160002060060154613535904261406c565b10158015612c90575060016000908152600b60205260008051602061419d833981519152906135648585613872565b6001600160a01b0316815260208101919091526040016000205460ff169392505050565b60006135948383613872565b6000848152600b602090815260408083206001600160a01b03851684528252808320878452600a909252909120919250906135cf858461388a565b600482015460018614156135ed576135eb611326600187613872565b505b6001600160a01b038416600090815260008051602061419d83398151915260205260409020600201546136209082612c84565b6001600160a01b038516600090815260008051602061419d8339815191526020908152604082206002019290925560019052600a905260008051602061415d833981519152546136709082612c84565b6001600052600a60205260008051602061415d833981519152556008546136979082612ce8565b600855604080516001600160a01b0386168152602081018390527fc16de066392da7e40ceccb739c331fc48a2e76bf147449613c48023d960eec32910160405180910390a1600060048401554260068085019190915582015460028401546137099164e8d4a5100091610ae091612cf4565b8360030181905550505050505050565b600081815260018301602052604081205461376057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155612c93565b506000612c93565b6000818152600183016020526040812054801561385157600061378c60018361406c565b85549091506000906137a09060019061406c565b90508181146138055760008660000182815481106137c0576137c061410d565b90600052602060002001549050808760000184815481106137e3576137e361410d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613816576138166140f7565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612c93565b6000915050612c93565b606061386a84846000856139a1565b949350505050565b6000828152600c6020526040812061386a8184613ad2565b6000828152600b602090815260408083206001600160a01b03851684528252808320858452600a9092529091206008541561393e5760006138d58260030154610a9c42600754612cd2565b905060006138f0836002015483612cf490919063ffffffff16565b905061391761390c846002015484612cf490919063ffffffff16565b600585015490612c84565b60058401556008546139369061332090610ae08464e8d4a51000612cf4565b600684015550505b61394a42600754612cd2565b816003018190555060006139808360030154610a9c64e8d4a51000610ae086600601548860020154612cf490919063ffffffff16565b60048401549091506139929082612c84565b83600401819055505050505050565b606082471015613a025760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109e9565b6001600160a01b0385163b613a595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109e9565b600080866001600160a01b03168587604051613a759190613d8b565b60006040518083038185875af1925050503d8060008114613ab2576040519150601f19603f3d011682016040523d82523d6000602084013e613ab7565b606091505b5091509150613ac7828286613ade565b979650505050505050565b6000612c908383613b17565b60608315613aed5750816109a4565b825115613afd5782518084602001fd5b8160405162461bcd60e51b81526004016109e99190613e3f565b6000826000018281548110613b2e57613b2e61410d565b9060005260206000200154905092915050565b60405180608001604052806004906020820280368337509192915050565b600060208284031215613b7157600080fd5b81356109a481614139565b600060208284031215613b8e57600080fd5b81516109a48161414e565b600080600060c08486031215613bae57600080fd5b8335613bb981614139565b92506020848101359250605f85018613613bd257600080fd5b6040516080810181811067ffffffffffffffff82111715613bf557613bf5614123565b806040525080604087018860c089011115613c0f57600080fd5b60005b6004811015613c2f57813583529184019190840190600101613c12565b50505080925050509250925092565b600060208284031215613c5057600080fd5b5035919050565b600060208284031215613c6957600080fd5b5051919050565b60008060408385031215613c8357600080fd5b823591506020830135613c9581614139565b809150509250929050565b60008060408385031215613cb357600080fd5b50508035926020909101359150565b60008060008060808587031215613cd857600080fd5b84359350602085013592506040850135613cf18161414e565b9396929550929360600135925050565b600080600060608486031215613d1657600080fd5b505081359360208301359350604090920135919050565b600080600080600060a08688031215613d4557600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b8060005b60048110156123d3578151845260209384019390910190600101613d6c565b60008251613d9d818460208701614083565b9190910192915050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015613e095783516001600160a01b031683529284019291840191600101613de4565b50909695505050505050565b60808101612c938284613d68565b6101008101613e328285613d68565b6109a46080830184613d68565b6020815260008251806020840152613e5e816040850160208701614083565b601f01601f19169190910160400192915050565b60208082526023908201527f4d6573736167652073656e6465722063616e6e6f74206265206120636f6e74726040820152621858dd60ea1b606082015260800190565b60208082526034908201527f596f7572206c6f636b2075702068617320656e6465642c20796f75206d75737460408201527320776974686472617720616c6c20746f6b656e7360601b606082015260800190565b60208082526021908201527f596f757220726577617264206379636c65206973206e6f74206f7665722079656040820152601d60fa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526039908201527f55736572206861732077697468647261776e20616e64206d7573742063686f6f60408201527f736520616e6f74686572206c6f636b20757020706572696f6400000000000000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115614026576140266140e1565b500190565b60008261404857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614067576140676140e1565b500290565b60008282101561407e5761407e6140e1565b500390565b60005b8381101561409e578181015183820152602001614086565b838111156123d35750506000910152565b6000816140be576140be6140e1565b506000190190565b60006000198214156140da576140da6140e1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612c3d57600080fd5b8015158114612c3d57600080fdfebbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bcbf279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56872c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cfa26469706673582212200886e402c1336a6b9bd2d5446e966af60ba6104fcc54b9bbc0564200e3d7c39364736f6c63430008070033000000000000000000000000f345754d715fb208f7b3965fa5fa0b4cff2dfe8f00000000000000000000000000000000000000000000000000000000001cfde0
Deployed Bytecode
0x6080604052600436106102765760003560e01c80637dc733f31161014f578063ab3c7e52116100c1578063d18e81b31161007a578063d18e81b3146108c3578063e74b981b146108d6578063e8e18257146108f6578063f2fde38b14610916578063f7c618c114610936578063fa4b7d1d1461096a57600080fd5b8063ab3c7e5214610823578063b0b8437414610839578063bc063e1a1461084e578063c42d48f914610863578063cbd756ef14610883578063ccb98ffc146108a357600080fd5b80638456cb59116101135780638456cb591461074d5780638da5cb5b14610762578063958e2d3114610780578063984fb358146107a0578063a0c7f71c146107ce578063a679b3c41461080357600080fd5b80637dc733f3146105f35780637dd28d03146106135780637e989cde146106405780637f22d99a146106605780638115a3bc1461069b57600080fd5b806346904840116101e857806364f6761f116101ac57806364f6761f1461053b5780636b1a9dae1461055b5780636ee010ae14610588578063715018a61461059e5780637646c038146105b3578063793cd66a146105d357600080fd5b8063469048401461048e5780634ff6fc50146104c65780635430d337146104dc5780635943bcb1146104fc5780635c975abb1461051c57600080fd5b80631526fe271161023a5780631526fe271461033e57806318160ddd1461040d57806322c28011146104235780633197cbb614610443578063379607f5146104595780633f4ba83a1461047957600080fd5b8063021067f41461028257806307973ccf146102b75780630e0f785f146102da5780630f745cdc146102fc578063141833dc1461031e57600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506102a261029d366004613c3e565b61098a565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102cc6109ab565b6040519081526020016102ae565b3480156102e657600080fd5b506102ef6109bc565b6040516102ae9190613dc8565b34801561030857600080fd5b5061031c610317366004613ca0565b6109fc565b005b34801561032a57600080fd5b5061031c610339366004613c3e565b610feb565b34801561034a57600080fd5b506103b7610359366004613c3e565b600a6020526000908152604090208054600182015460028301546003840154600485015460058601546006870154600788015460088901546015909901546001600160a01b0390981698969795969495939492939192909160ff168a565b604080516001600160a01b03909b168b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301521515610120820152610140016102ae565b34801561041957600080fd5b506102cc60085481565b34801561042f57600080fd5b5061031c61043e366004613c3e565b61105d565b34801561044f57600080fd5b506102cc60075481565b34801561046557600080fd5b5061031c610474366004613c3e565b611098565b34801561048557600080fd5b5061031c61160d565b34801561049a57600080fd5b506002546104ae906001600160a01b031681565b6040516001600160a01b0390911681526020016102ae565b3480156104d257600080fd5b506102cc60095481565b3480156104e857600080fd5b5061031c6104f7366004613d2d565b611641565b34801561050857600080fd5b506102cc610517366004613c3e565b61169d565b34801561052857600080fd5b50600054600160a01b900460ff166102a2565b34801561054757600080fd5b5061031c610556366004613b99565b6116b4565b34801561056757600080fd5b506102cc610576366004613b5f565b600d6020526000908152604090205481565b34801561059457600080fd5b506102cc60055481565b3480156105aa57600080fd5b5061031c6117a1565b3480156105bf57600080fd5b5061031c6105ce366004613c3e565b6117d5565b3480156105df57600080fd5b5061031c6105ee366004613c3e565b611856565b3480156105ff57600080fd5b5061031c61060e366004613c3e565b611f2d565b34801561061f57600080fd5b5061063361062e366004613c3e565b61206f565b6040516102ae9190613e15565b34801561064c57600080fd5b5061031c61065b366004613d2d565b6120be565b34801561066c57600080fd5b506102cc61067b366004613c3e565b6000908152600b6020908152604080832033845290915290206002015490565b3480156106a757600080fd5b506107076106b6366004613c70565b600b6020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460079097015460ff8088169861010090980416969089565b604080519915158a5297151560208a0152968801959095526060870193909352608086019190915260a085015260c084015260e0830152610100820152610120016102ae565b34801561075957600080fd5b5061031c612144565b34801561076e57600080fd5b506000546001600160a01b03166104ae565b34801561078c57600080fd5b5061031c61079b366004613c3e565b612176565b3480156107ac57600080fd5b506107c06107bb366004613c3e565b6121b3565b6040516102ae929190613e23565b3480156107da57600080fd5b506107ee6107e9366004613c70565b61223d565b604080519283526020830191909152016102ae565b34801561080f57600080fd5b5061031c61081e366004613ca0565b61236b565b34801561082f57600080fd5b506102cc60045481565b34801561084557600080fd5b506102cc601481565b34801561085a57600080fd5b506102cc606481565b34801561086f57600080fd5b5061031c61087e366004613c3e565b6123d9565b34801561088f57600080fd5b5061031c61089e366004613cc2565b6124e3565b3480156108af57600080fd5b5061031c6108be366004613c3e565b612555565b3480156108cf57600080fd5b50426102cc565b3480156108e257600080fd5b5061031c6108f1366004613b5f565b6125c0565b34801561090257600080fd5b5061031c610911366004613d01565b61260c565b34801561092257600080fd5b5061031c610931366004613b5f565b612ba5565b34801561094257600080fd5b506104ae7f000000000000000000000000f345754d715fb208f7b3965fa5fa0b4cff2dfe8f81565b34801561097657600080fd5b506102ef610985366004613c3e565b612c40565b6000818152600c602052604081206109a4335b8290612c99565b9392505050565b60006109b7600f612cbb565b905090565b6000546060906001600160a01b031633146109f25760405162461bcd60e51b81526004016109e990613f4a565b60405180910390fd5b6109b7600f612cc5565b60026001541415610a1f5760405162461bcd60e51b81526004016109e990613fdc565b60026001908155600e805460ff191690911790556000828152600b602090815260408083203384528252808320858452600a9092529091206003810154849291904211610a6d575050610fd8565b600481015480610a7e574260038301555b60085415610b1d576000610aa28360030154610a9c42600754612cd2565b90612ce8565b90506000610abd846002015483612cf490919063ffffffff16565b9050610af1610ae6600854610ae064e8d4a5100085612cf490919063ffffffff16565b90612d00565b600686015490612c84565b60068501556002840154610b1590610b0a908490612cf4565b600586015490612c84565b600585015550505b610b2942600754612cd2565b6003830155600e5460ff16610b7f576000610b668460030154610a9c64e8d4a51000610ae087600601548960020154612cf490919063ffffffff16565b6004850154909150610b789082612c84565b6004850155505b85610b94335b6001600160a01b03163b151590565b15610bb15760405162461bcd60e51b81526004016109e990613e72565b60018711610c275760405162461bcd60e51b815260206004820152603a60248201527f596f752063616e6e6f742077697468647261772066726f6d20746865206d616960448201527f6e20706f6f6c207573696e6720746869732066756e6374696f6e00000000000060648201526084016109e9565b6000878152600b6020908152604080832033845290915290208054610100900460ff16158015610c585750805460ff165b610c745760405162461bcd60e51b81526004016109e990613f7f565b6000888152600a602052604090206007820154421015610e7f57600088118015610ca2575081600201548811155b610d225760405162461bcd60e51b8152602060048201526044602482018190527f596f752063616e6e6f74207769746864726177203020746f6b656e73206f7220908201527f7769746864726177206d6f7265207468616e20796f757220757365722062616c606482015263616e636560e01b608482015260a4016109e9565b6000610d2e8a8a612d0c565b90508260020154891415610dd657610d53335b83546001600160a01b03169083612d6a565b6004820154610d62908a612ce8565b600483015560008051602061417d83398151915233828c604051610d8893929190613da7565b60405180910390a181601101836001015460048110610da957610da961410d565b018054906000610db8836140af565b9091555050825461ffff191661010017835560006002840155610e79565b610ddf33610d41565b6004820154610dee908a612ce8565b600483015560008051602061417d83398151915233828c604051610e1493929190613da7565b60405180910390a16002830154610e2b908a612ce8565b60028401819055610e795760006002840155825461ffff19166101001783556001830154601183019060048110610e6457610e6461410d565b018054906000610e73836140af565b91905055505b50610f37565b81600201548814610ea25760405162461bcd60e51b81526004016109e990613eb5565b610eb83382546001600160a01b0316908a612d6a565b6004810154610ec79089612ce8565b600482015560008051602061417d83398151915233898b604051610eed93929190613da7565b60405180910390a180601101826001015460048110610f0e57610f0e61410d565b018054906000610f1d836140af565b9091555050815461ffff1916610100178255600060028301555b50506000818152600b60209081526040808320338452909152902060020154151580610f7e57506000818152600b6020908152604080832033845290915290206004015415155b15610f9157610f8c33612dcd565b610f9a565b610f9a33612de7565b50610fbf64e8d4a51000610ae084600601548660020154612cf490919063ffffffff16565b60038401556006830154610fd4574260068401555b5050505b5050600e805460ff191690555060018055565b6000546001600160a01b031633146110155760405162461bcd60e51b81526004016109e990613f4a565b61104a7f000000000000000000000000f345754d715fb208f7b3965fa5fa0b4cff2dfe8f6001600160a01b0316333084612e02565b6008546110579082612c84565b60085550565b6000546001600160a01b031633146110875760405162461bcd60e51b81526004016109e990613f4a565b61109281603c612cf4565b60055550565b600260015414156110bb5760405162461bcd60e51b81526004016109e990613fdc565b60026001556000818152600b602090815260408083203384528252808320848452600a90925290912060038101548392919042116110fa575050611605565b60048101548061110b574260038301555b600854156111885760006111298360030154610a9c42600754612cd2565b90506000611144846002015483612cf490919063ffffffff16565b9050611167610ae6600854610ae064e8d4a5100085612cf490919063ffffffff16565b6006850155600284015461118090610b0a908490612cf4565b600585015550505b61119442600754612cd2565b6003830155600e5460ff166111ea5760006111d18460030154610a9c64e8d4a51000610ae087600601548960020154612cf490919063ffffffff16565b60048501549091506111e39082612c84565b6004850155505b846111f433610b85565b156112115760405162461bcd60e51b81526004016109e990613e72565b6000868152600b602090815260408083203384528252808320898452600c9092529091208154610100900460ff161561129e5760405162461bcd60e51b815260206004820152602960248201527f596f75206861766520616c72656164792077697468647261776e2066726f6d206044820152681d1a1a5cc81c1bdbdb60ba1b60648201526084016109e9565b60048201546112ad8233612c99565b6113a35760055460068401546112c4904290612ce8565b10156112e25760405162461bcd60e51b81526004016109e990613f09565b611318335b6001600160a01b037f000000000000000000000000f345754d715fb208f7b3965fa5fa0b4cff2dfe8f169083612d6a565b886001141561132e5761132c335b82612e3a565b505b7f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d433604080516001600160a01b039092168252602082018490520160405180910390a160085461137e9082612ce8565b60085560006004840155426006808501919091555461139e908a90612f51565b611563565b60055460068401546113b6904290612ce8565b10156113d45760405162461bcd60e51b81526004016109e990613f09565b33600090815260008051602061419d833981519152602052604090205460ff166114565760405162461bcd60e51b815260206004820152602d60248201527f596f75206d7573742063686f6f73652061206c6f636b20706c616e20666f722060448201526c1d1a19481b585a5b881c1bdbdb609a1b60648201526084016109e9565b886001141561146a5761146833611326565b505b42600684015533600090815260008051602061419d833981519152602052604090206002015461149a9082612c84565b33600090815260008051602061419d8339815191526020908152604082206002019290925560019052600a905260008051602061415d833981519152546114e19082612c84565b6001600052600a60205260008051602061415d833981519152557fc16de066392da7e40ceccb739c331fc48a2e76bf147449613c48023d960eec3233604080516001600160a01b039092168252602082018490520160405180910390a160085461154b9082612ce8565b60085560006004840155600654611563908a90612f51565b5050506000818152600b602090815260408083203384529091529020600201541515806115ab57506000818152600b6020908152604080832033845290915290206004015415155b156115be576115b933612dcd565b6115c7565b6115c733612de7565b506115ec64e8d4a51000610ae084600601548660020154612cf490919063ffffffff16565b60038401556006830154611601574260068401555b5050505b505060018055565b6000546001600160a01b031633146116375760405162461bcd60e51b81526004016109e990613f4a565b61163f613066565b565b6000546001600160a01b0316331461166b5760405162461bcd60e51b81526004016109e990613f4a565b6000858152600a60205260409020600d8101858155600e8201859055600f8201849055829060035b0155505050505050565b6000818152600c602052604081206109a481612cbb565b6000546001600160a01b031633146116de5760405162461bcd60e51b81526004016109e990613f4a565b60006004600081546116ef906140c6565b91829055506000818152600a6020526040812080546001600160a01b0319166001600160a01b0388161781556002810186905560158101805460ff1916600117905591925061175e908390859060200201518560016020020151866002602002015187600360200201516120be565b6040516001600160a01b03861681527f73cca62ab1b520c9715bf4e6c71e3e518c754e7148f65102f43289a7df0efea69060200160405180910390a15050505050565b6000546001600160a01b031633146117cb5760405162461bcd60e51b81526004016109e990613f4a565b61163f6000613103565b6000546001600160a01b031633146117ff5760405162461bcd60e51b81526004016109e990613f4a565b600754421161183b5760405162461bcd60e51b815260206004820152600860248201526708595e1c1a5c995960c21b60448201526064016109e9565b61185061184982603c612cf4565b4290612c84565b60075550565b600260015414156118795760405162461bcd60e51b81526004016109e990613fdc565b60026001908155600e805460ff19168217905533600090815260008051602061419d83398151915260209081526040822091839052600a90527fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bca547fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc7904211611903575050611f1b565b600481015480611914574260038301555b600854156119915760006119328360030154610a9c42600754612cd2565b9050600061194d846002015483612cf490919063ffffffff16565b9050611970610ae6600854610ae064e8d4a5100085612cf490919063ffffffff16565b6006850155600284015461198990610b0a908490612cf4565b600585015550505b61199d42600754612cd2565b6003830155600e5460ff166119f35760006119da8460030154610a9c64e8d4a51000610ae087600601548960020154612cf490919063ffffffff16565b60048501549091506119ec9082612c84565b6004850155505b60016119fe33610b85565b15611a1b5760405162461bcd60e51b81526004016109e990613e72565b33600090815260008051602061419d833981519152602052604090208054610100900460ff16158015611a4f5750805460ff165b611a6b5760405162461bcd60e51b81526004016109e990613f7f565b6001600052600a60205260078101547fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc790421015611c8d57600088118015611ab7575081600201548811155b611b355760405162461bcd60e51b815260206004820152604360248201527f596f752063616e6e6f74207769746864726177203020746f6b656e73206f722060448201527f7769746864726177206d6f7265207468616e20796f7572207573657220616d6f6064820152621d5b9d60ea1b608482015260a4016109e9565b6000611b4260018a612d0c565b90508260020154891415611be057611b59336112e7565b60008051602061417d83398151915233826001604051611b7b93929190613da7565b60405180910390a1600060028401556004820154611b99908a612ce8565b600480840191909155835461ffff1916610100178455600184015460118401918110611bc757611bc761410d565b018054906000611bd6836140af565b9190505550611c87565b611be9336112e7565b6002830154611bf8908a612ce8565b60028401556004820154611c0c908a612ce8565b600483015560008051602061417d83398151915233826001604051611c3393929190613da7565b60405180910390a16002830154611c875760006002840155825461ffff19166101001783556001830154601183019060048110611c7257611c7261410d565b018054906000611c81836140af565b91905055505b50611e7a565b81600201548814611cb05760405162461bcd60e51b81526004016109e990613eb5565b600060035482600d01846001015460048110611cce57611cce61410d565b01548460020154611cdf919061404d565b611ce9919061402b565b8360020154611cf89190614013565b9050611d138360020154600854612c8490919063ffffffff16565b811115611dc557611d60336002850154600854611d2f91612c84565b6001600160a01b037f000000000000000000000000f345754d715fb208f7b3965fa5fa0b4cff2dfe8f169190612d6a565b60008051602061417d833981519152336002850154600854611d8191612c84565b6001604051611d9293929190613da7565b60405180910390a160085415611da85760006008555b60028301546004830154611dbb91612ce8565b6004830155611e37565b611dce336112e7565b611df1611de8846002015483612ce890919063ffffffff16565b60085490612ce8565b60085560028301546004830154611e0791612ce8565b600483015560008051602061417d83398151915233826001604051611e2e93929190613da7565b60405180910390a15b81601101836001015460048110611e5057611e5061410d565b018054906000611e5f836140af565b90915550506000600284015550815461ffff19166101001782555b50506000818152600b60209081526040808320338452909152902060020154151580611ec157506000818152600b6020908152604080832033845290915290206004015415155b15611ed457611ecf33612dcd565b611edd565b611edd33612de7565b50611f0264e8d4a51000610ae084600601548660020154612cf490919063ffffffff16565b60038401556006830154611f17574260068401555b5050505b5050600e805460ff1916905560018055565b6000818152600a602052604090206015015460ff16611f8e5760405162461bcd60e51b815260206004820152601a60248201527f54686973206973206e6f7420616e2061637469766520706f6f6c00000000000060448201526064016109e9565b611f9733610b85565b15611fb45760405162461bcd60e51b81526004016109e990613e72565b33600090815260008051602061419d833981519152602052604090205460ff166120375760405162461bcd60e51b815260206004820152602e60248201527f596f75206d75737420686176652061206c6f636b20757020706c616e20666f7260448201526d081d1a19481b585a5b881c1bdbdb60921b60648201526084016109e9565b6000818152600c6020526040902061204e3361099d565b6120615761205c8133613153565b505050565b61205c8133613168565b5050565b612077613b41565b6000828152600a602052604090819020815160808101928390529091601183019060049082845b81548152602001906001019080831161209e575050505050915050919050565b6000546001600160a01b031633146120e85760405162461bcd60e51b81526004016109e990613f4a565b6000858152600a60205260409020612103856201518061404d565b6009820155612115846201518061404d565b600a820155612127836201518061404d565b600b820155612139826201518061404d565b600982016003611693565b6000546001600160a01b0316331461216e5760405162461bcd60e51b81526004016109e990613f4a565b61163f61317d565b6000818152600b60209081526040808320338452909152902060018214156121a55761206b8160020154611856565b61206b8282600201546109fc565b6121bb613b41565b6121c3613b41565b6000838152600a602052604090819020815160808101928390529091600983019060049082845b8154815260200190600101908083116121ea575050604080516080810191829052949750600d8601935060049250905082845b81548152602001906001019080831161221d575050505050915050915091565b6000828152600b602090815260408083206001600160a01b03851684528252808320858452600a9092528220600282015483929190612286575060040154915060009050612364565b60068101546005820154600854156123085760006122ae8460030154610a9c42600754612cd2565b905060006122c9856002015483612cf490919063ffffffff16565b90506122d58184614013565b92506123036122f8600854610ae064e8d4a5100085612cf490919063ffffffff16565b600687015490612c84565b935050505b60028401546004850154600386015460009161233b9161233590610a9c64e8d4a51000610ae0888b612cf4565b90612c84565b905047600084156123575761235485610ae08486612cf4565b90505b9198509096505050505050505b9250929050565b6000828152600b602090815260408083203384529091529020606482111561239257600080fd5b600060648383600201546123a6919061404d565b6123b0919061402b565b905083600114156123c9576123c481611856565b6123d3565b6123d384826109fc565b50505050565b6000546001600160a01b031633146124035760405162461bcd60e51b81526004016109e990613f4a565b6000818152600a60205260408082206001810154815492516370a0823160e01b81523060048201529193909290916001600160a01b03909116906370a082319060240160206040518083038186803b15801561245e57600080fd5b505afa158015612472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124969190613c57565b905080836001015411156124a8578091505b60025483546124c4916001600160a01b03918216911684612d6a565b818360010160008282546124d8919061406c565b909155505050505050565b6000546001600160a01b0316331461250d5760405162461bcd60e51b81526004016109e990613f4a565b60045484111561251c57600080fd5b6000848152600a602052604090206125348486613205565b60158101805460ff191684151517905561254e8583613343565b5050505050565b6000546001600160a01b0316331461257f5760405162461bcd60e51b81526004016109e990613f4a565b8042106125bb5760405162461bcd60e51b815260206004820152600a60248201526921617661696c61626c6560b01b60448201526064016109e9565b600755565b6000546001600160a01b031633146125ea5760405162461bcd60e51b81526004016109e990613f4a565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002600154141561262f5760405162461bcd60e51b81526004016109e990613fdc565b6002600155600054600160a01b900460ff16156126815760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109e9565b6000818152600b602090815260408083203384528252808320848452600a90925290912060038101548392919042116126bb575050612b9b565b6004810154806126cc574260038301555b600854156127495760006126ea8360030154610a9c42600754612cd2565b90506000612705846002015483612cf490919063ffffffff16565b9050612728610ae6600854610ae064e8d4a5100085612cf490919063ffffffff16565b6006850155600284015461274190610b0a908490612cf4565b600585015550505b61275542600754612cd2565b6003830155600e5460ff166127ab5760006127928460030154610a9c64e8d4a51000610ae087600601548960020154612cf490919063ffffffff16565b60048501549091506127a49082612c84565b6004850155505b8460075442106127e75760405162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b60448201526064016109e9565b6127f033610b85565b156128485760405162461bcd60e51b815260206004820152602260248201527f4d6573736167652073656e6465722063616e6e6f74206265206120636f6e746160448201526118dd60f21b60648201526084016109e9565b600487106128a95760405162461bcd60e51b815260206004820152602860248201527f596f75206d7573742063686f6f7365206120706c616e20696e646578206265746044820152677765656e20302d3360c01b60648201526084016109e9565b6000868152600b602090815260408083203384528252808320898452600a909252909120601581015460ff166129215760405162461bcd60e51b815260206004820152601a60248201527f54686973206973206e6f7420616e2061637469766520706f6f6c00000000000060448201526064016109e9565b8154610100900460ff161561293a57815461ff00191682555b8154610100900460ff161561294e57600080fd5b80546001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018d9052606401602060405180830381600087803b1580156129ad57600080fd5b505af11580156129c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e59190613b7c565b50815460ff1615612a1f5760028201546129ff908b612c84565b60028301554260058301556004810154612a19908b612c84565b50612aaf565b815460ff1916600190811783558201899055600981018960048110612a4657612a4661410d565b0154612a529042614013565b6007830155601181018960048110612a6c57612a6c61410d565b018054906000612a7b836140c6565b90915550506002820154612a8f908b612c84565b60028301554260058301556004810154612aa9908b612c84565b60048201555b7f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15338b8a604051612ae293929190613da7565b60405180910390a16006820154612afa574260068301555b50506000818152600b60209081526040808320338452909152902060020154151580612b4157506000818152600b6020908152604080832033845290915290206004015415155b15612b5457612b4f33612dcd565b612b5d565b612b5d33612de7565b50612b8264e8d4a51000610ae084600601548660020154612cf490919063ffffffff16565b60038401556006830154612b97574260068401555b5050505b5050600180555050565b6000546001600160a01b03163314612bcf5760405162461bcd60e51b81526004016109e990613f4a565b6001600160a01b038116612c345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e9565b612c3d81613103565b50565b6000546060906001600160a01b03163314612c6d5760405162461bcd60e51b81526004016109e990613f4a565b6000828152600c602052604090206109a481612cc5565b6000612c908284614013565b90505b92915050565b6001600160a01b03811660009081526001830160205260408120541515612c90565b6000612c93825490565b606060006109a4836133c1565b6000818310612ce15781612c90565b5090919050565b6000612c90828461406c565b6000612c90828461404d565b6000612c90828461402b565b6000828152600a60205260408120600781015482908190606490612d30908761404d565b612d3a919061402b565b915081836001016000828254612d509190614013565b90915550612d6090508583612ce8565b9695505050505050565b6040516001600160a01b03831660248201526044810182905261205c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261341d565b612dd8600f82612c99565b612c3d5761206b600f82613153565b612df2600f82612c99565b15612c3d5761206b600f82613168565b6040516001600160a01b03808516602483015283166044820152606481018290526123d39085906323b872dd60e01b90608401612d96565b60016000908152600a6020527fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc747801580612e7757506005820154155b15612e8757600092505050612c93565b600082600501548511612f48576005830154612ea790610ae08488612cf4565b90508015612ee7576040516001600160a01b0387169082156108fc029083906000818181858888f19350505050158015612ee5573d6000803e3d6000fd5b505b6005830154612ef69086612ce8565b6005840155600954612f089082612c84565b6009556001600160a01b0386166000908152600d6020526040902054612f2e9082612c84565b6001600160a01b0387166000908152600d60205260409020555b95945050505050565b6000828152600a60205260409020612f688361169d565b612f7157505050565b6000805a90506000805b8584108015612f915750612f8e8761169d565b82105b1561302457612f9f8761169d565b856008015410612fb157600060088601555b612fbf8786600801546134ef565b15612fe057612fd2878660080154613588565b80612fdc816140c6565b9150505b612ff5612fee5a8590612ce8565b8590612c84565b93505a600886018054919450600061300c836140c6565b9190505550818061301c906140c6565b925050612f7b565b60408051838152602081018390527f899b268db1bda532ae8a19ff5fdd4dca661f0de13ad278f55f592727f890b23c910160405180910390a150505050505050565b600054600160a01b900460ff166130b65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109e9565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612c90836001600160a01b038416613719565b6000612c90836001600160a01b038416613768565b600054600160a01b900460ff16156131ca5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109e9565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130e63390565b6000818152600a60205260409020600754421061324e5760405162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b60448201526064016109e9565b600083116132b35760405162461bcd60e51b815260206004820152602c60248201527f5265776172647320706572207365636f6e642073686f756c642062652067726560448201526b61746572207468616e20302160a01b60648201526084016109e9565b600854156133335760006132d4826003015442612ce890919063ffffffff16565b905060006132ef836002015483612cf490919063ffffffff16565b60058401549091506133019082612c84565b600584015560085461332b9061332090610ae08464e8d4a51000612cf4565b600685015490612c84565b600684015550505b4260038201556002019190915550565b6000546001600160a01b0316331461336d5760405162461bcd60e51b81526004016109e990613f4a565b60148111156133ac5760405162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b60448201526064016109e9565b6000918252600a602052604090912060070155565b60608160000180548060200260200160405190810160405280929190818152602001828054801561341157602002820191906000526020600020905b8154815260200190600101908083116133fd575b50505050509050919050565b6000613472826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661385b9092919063ffffffff16565b80519091501561205c57808060200190518101906134909190613b7c565b61205c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109e9565b6005546000838152600b602052604081209091908261350e8686613872565b6001600160a01b03168152602081019190915260400160002060060154613535904261406c565b10158015612c90575060016000908152600b60205260008051602061419d833981519152906135648585613872565b6001600160a01b0316815260208101919091526040016000205460ff169392505050565b60006135948383613872565b6000848152600b602090815260408083206001600160a01b03851684528252808320878452600a909252909120919250906135cf858461388a565b600482015460018614156135ed576135eb611326600187613872565b505b6001600160a01b038416600090815260008051602061419d83398151915260205260409020600201546136209082612c84565b6001600160a01b038516600090815260008051602061419d8339815191526020908152604082206002019290925560019052600a905260008051602061415d833981519152546136709082612c84565b6001600052600a60205260008051602061415d833981519152556008546136979082612ce8565b600855604080516001600160a01b0386168152602081018390527fc16de066392da7e40ceccb739c331fc48a2e76bf147449613c48023d960eec32910160405180910390a1600060048401554260068085019190915582015460028401546137099164e8d4a5100091610ae091612cf4565b8360030181905550505050505050565b600081815260018301602052604081205461376057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155612c93565b506000612c93565b6000818152600183016020526040812054801561385157600061378c60018361406c565b85549091506000906137a09060019061406c565b90508181146138055760008660000182815481106137c0576137c061410d565b90600052602060002001549050808760000184815481106137e3576137e361410d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613816576138166140f7565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612c93565b6000915050612c93565b606061386a84846000856139a1565b949350505050565b6000828152600c6020526040812061386a8184613ad2565b6000828152600b602090815260408083206001600160a01b03851684528252808320858452600a9092529091206008541561393e5760006138d58260030154610a9c42600754612cd2565b905060006138f0836002015483612cf490919063ffffffff16565b905061391761390c846002015484612cf490919063ffffffff16565b600585015490612c84565b60058401556008546139369061332090610ae08464e8d4a51000612cf4565b600684015550505b61394a42600754612cd2565b816003018190555060006139808360030154610a9c64e8d4a51000610ae086600601548860020154612cf490919063ffffffff16565b60048401549091506139929082612c84565b83600401819055505050505050565b606082471015613a025760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109e9565b6001600160a01b0385163b613a595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109e9565b600080866001600160a01b03168587604051613a759190613d8b565b60006040518083038185875af1925050503d8060008114613ab2576040519150601f19603f3d011682016040523d82523d6000602084013e613ab7565b606091505b5091509150613ac7828286613ade565b979650505050505050565b6000612c908383613b17565b60608315613aed5750816109a4565b825115613afd5782518084602001fd5b8160405162461bcd60e51b81526004016109e99190613e3f565b6000826000018281548110613b2e57613b2e61410d565b9060005260206000200154905092915050565b60405180608001604052806004906020820280368337509192915050565b600060208284031215613b7157600080fd5b81356109a481614139565b600060208284031215613b8e57600080fd5b81516109a48161414e565b600080600060c08486031215613bae57600080fd5b8335613bb981614139565b92506020848101359250605f85018613613bd257600080fd5b6040516080810181811067ffffffffffffffff82111715613bf557613bf5614123565b806040525080604087018860c089011115613c0f57600080fd5b60005b6004811015613c2f57813583529184019190840190600101613c12565b50505080925050509250925092565b600060208284031215613c5057600080fd5b5035919050565b600060208284031215613c6957600080fd5b5051919050565b60008060408385031215613c8357600080fd5b823591506020830135613c9581614139565b809150509250929050565b60008060408385031215613cb357600080fd5b50508035926020909101359150565b60008060008060808587031215613cd857600080fd5b84359350602085013592506040850135613cf18161414e565b9396929550929360600135925050565b600080600060608486031215613d1657600080fd5b505081359360208301359350604090920135919050565b600080600080600060a08688031215613d4557600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b8060005b60048110156123d3578151845260209384019390910190600101613d6c565b60008251613d9d818460208701614083565b9190910192915050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015613e095783516001600160a01b031683529284019291840191600101613de4565b50909695505050505050565b60808101612c938284613d68565b6101008101613e328285613d68565b6109a46080830184613d68565b6020815260008251806020840152613e5e816040850160208701614083565b601f01601f19169190910160400192915050565b60208082526023908201527f4d6573736167652073656e6465722063616e6e6f74206265206120636f6e74726040820152621858dd60ea1b606082015260800190565b60208082526034908201527f596f7572206c6f636b2075702068617320656e6465642c20796f75206d75737460408201527320776974686472617720616c6c20746f6b656e7360601b606082015260800190565b60208082526021908201527f596f757220726577617264206379636c65206973206e6f74206f7665722079656040820152601d60fa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526039908201527f55736572206861732077697468647261776e20616e64206d7573742063686f6f60408201527f736520616e6f74686572206c6f636b20757020706572696f6400000000000000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115614026576140266140e1565b500190565b60008261404857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614067576140676140e1565b500290565b60008282101561407e5761407e6140e1565b500390565b60005b8381101561409e578181015183820152602001614086565b838111156123d35750506000910152565b6000816140be576140be6140e1565b506000190190565b60006000198214156140da576140da6140e1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612c3d57600080fd5b8015158114612c3d57600080fdfebbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bcbf279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56872c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cfa26469706673582212200886e402c1336a6b9bd2d5446e966af60ba6104fcc54b9bbc0564200e3d7c39364736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f345754d715fb208f7b3965fa5fa0b4cff2dfe8f00000000000000000000000000000000000000000000000000000000001cfde0
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0xF345754D715fb208F7b3965FA5fA0B4Cff2dFE8f
Arg [1] : rewardRate (uint256): 1900000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f345754d715fb208f7b3965fa5fa0b4cff2dfe8f
Arg [1] : 00000000000000000000000000000000000000000000000000000000001cfde0
Deployed Bytecode Sourcemap
43058:26053:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67167:207;;;;;;;;;;-1:-1:-1;67167:207:0;;;;;:::i;:::-;;:::i;:::-;;;7348:14:1;;7341:22;7323:41;;7311:2;7296:18;67167:207:0;;;;;;;;68612:90;;;;;;;;;;;;;:::i;:::-;;;19985:25:1;;;19973:2;19958:18;68612:90:0;19839:177:1;68710:153:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;60130:2287::-;;;;;;;;;;-1:-1:-1;60130:2287:0;;;;;:::i;:::-;;:::i;:::-;;48829:189;;;;;;;;;;-1:-1:-1;48829:189:0;;;;;:::i;:::-;;:::i;44646:44::-;;;;;;;;;;-1:-1:-1;44646:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44646:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8798:32:1;;;8780:51;;8862:2;8847:18;;8840:34;;;;8890:18;;;8883:34;;;;8948:2;8933:18;;8926:34;;;;8991:3;8976:19;;8969:35;;;;8818:3;9020:19;;9013:35;9079:3;9064:19;;9057:35;9123:3;9108:19;;9101:35;9167:3;9152:19;;9145:35;9224:14;9217:22;9211:3;9196:19;;9189:51;8767:3;8752:19;44646:44:0;8373:873:1;44571:26:0;;;;;;;;;;;;;;;;49379:127;;;;;;;;;;-1:-1:-1;49379:127:0;;;;;:::i;:::-;;:::i;44542:22::-;;;;;;;;;;;;;;;;63089:1869;;;;;;;;;;-1:-1:-1;63089:1869:0;;;;;:::i;:::-;;:::i;47967:67::-;;;;;;;;;;;;;:::i;44264:27::-;;;;;;;;;;-1:-1:-1;44264:27:0;;;;-1:-1:-1;;;;;44264:27:0;;;;;;-1:-1:-1;;;;;4479:32:1;;;4461:51;;4449:2;4434:18;44264:27:0;4315:203:1;44604:35:0;;;;;;;;;;;;;;;;50690:337;;;;;;;;;;-1:-1:-1;50690:337:0;;;;;:::i;:::-;;:::i;67382:196::-;;;;;;;;;;-1:-1:-1;67382:196:0;;;;;:::i;:::-;;:::i;6015:86::-;;;;;;;;;;-1:-1:-1;6062:4:0;6086:7;-1:-1:-1;;;6086:7:0;;;;6015:86;;48042:439;;;;;;;;;;-1:-1:-1;48042:439:0;;;;;:::i;:::-;;:::i;44823:49::-;;;;;;;;;;-1:-1:-1;44823:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;44463:37;;;;;;;;;;;;;;;;4215:103;;;;;;;;;;;;;:::i;49180:191::-;;;;;;;;;;-1:-1:-1;49180:191:0;;;;;:::i;:::-;;:::i;57313:2809::-;;;;;;;;;;-1:-1:-1;57313:2809:0;;;;;:::i;:::-;;:::i;52163:618::-;;;;;;;;;;-1:-1:-1;52163:618:0;;;;;:::i;:::-;;:::i;68425:179::-;;;;;;;;;;-1:-1:-1;68425:179:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50297:385::-;;;;;;;;;;-1:-1:-1;50297:385:0;;;;;:::i;:::-;;:::i;68871:132::-;;;;;;;;;;-1:-1:-1;68871:132:0;;;;;:::i;:::-;68933:4;68957:17;;;:9;:17;;;;;;;;2511:10;68957:31;;;;;;;:38;;;;68871:132;44697:65;;;;;;;;;;-1:-1:-1;44697:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7759:14:1;;7752:22;7734:41;;7818:14;;7811:22;7806:2;7791:18;;7784:50;7850:18;;;7843:34;;;;7908:2;7893:18;;7886:34;;;;7951:3;7936:19;;7929:35;;;;7995:3;7980:19;;7973:35;8039:3;8024:19;;8017:35;8083:3;8068:19;;8061:35;8127:3;8112:19;;8105:35;7721:3;7706:19;44697:65:0;7375:771:1;47896:63:0;;;;;;;;;;;;;:::i;3564:87::-;;;;;;;;;;-1:-1:-1;3610:7:0;3637:6;-1:-1:-1;;;;;3637:6:0;3564:87;;62425:258;;;;;;;;;;-1:-1:-1;62425:258:0;;;;;:::i;:::-;;:::i;68144:269::-;;;;;;;;;;-1:-1:-1;68144:269:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;51035:1120::-;;;;;;;;;;-1:-1:-1;51035:1120:0;;;;;:::i;:::-;;:::i;:::-;;;;20195:25:1;;;20251:2;20236:18;;20229:34;;;;20168:18;51035:1120:0;20021:248:1;62691:390:0;;;;;;;;;;-1:-1:-1;62691:390:0;;;;;:::i;:::-;;:::i;44431:25::-;;;;;;;;;;;;;;;;44379:38;;;;;;;;;;;;44415:2;44379:38;;44335:37;;;;;;;;;;;;44369:3;44335:37;;49514:431;;;;;;;;;;-1:-1:-1;49514:431:0;;;;;:::i;:::-;;:::i;48489:332::-;;;;;;;;;;-1:-1:-1;48489:332:0;;;;;:::i;:::-;;:::i;49026:146::-;;;;;;;;;;-1:-1:-1;49026:146:0;;;;;:::i;:::-;;:::i;69011:97::-;;;;;;;;;;-1:-1:-1;69085:15:0;69011:97;;50181:108;;;;;;;;;;-1:-1:-1;50181:108:0;;;;;:::i;:::-;;:::i;55402:1498::-;;;;;;;;;;-1:-1:-1;55402:1498:0;;;;;:::i;:::-;;:::i;4473:201::-;;;;;;;;;;-1:-1:-1;4473:201:0;;;;;:::i;:::-;;:::i;44222:35::-;;;;;;;;;;;;;;;67871:265;;;;;;;;;;-1:-1:-1;67871:265:0;;;;;:::i;:::-;;:::i;67167:207::-;67225:4;67278:20;;;:12;:20;;;;;67316:50;2511:10;67353:12;67316:11;;:36;:50::i;:::-;67309:57;67167:207;-1:-1:-1;;;67167:207:0:o;68612:90::-;68656:4;68680:14;:5;:12;:14::i;:::-;68673:21;;68612:90;:::o;68710:153::-;3610:7;3637:6;68763:26;;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;;;;;;;;;68814:14:::1;:5;:12;:14::i;60130:2287::-:0;944:1;1542:7;;:19;;1534:63;;;;-1:-1:-1;;;1534:63:0;;;;;;;:::i;:::-;944:1;1675:7;:18;;;45788::::1;:25:::0;;-1:-1:-1;;45788:25:0::1;::::0;;::::1;::::0;;-1:-1:-1;45949:17:0;;;:9:::2;:17;::::0;;;;;;;2511:10;45949:31;;;;;;;46016:16;;;:8:::2;:16:::0;;;;;;46066:20:::2;::::0;::::2;::::0;45949:17;;:31;46016:16;46047:15:::2;:39;46043:78;;46103:7;;;;46043:78;46153:17;::::0;::::2;::::0;46185:16;46181:87:::2;;46241:15;46218:20;::::0;::::2;:38:::0;46181:87:::2;46281:11;::::0;:15;46278:373:::2;;46313:18;46334:60;46373:5;:20;;;46334:34;46343:15;46360:7;;46334:8;:34::i;:::-;:38:::0;::::2;:60::i;:::-;46313:81;;46409:14;46426:32;46441:5;:16;;;46426:10;:14;;:32;;;;:::i;:::-;46409:49;;46493:56;46515:33;46536:11;;46515:16;46526:4;46515:6;:10;;:16;;;;:::i;:::-;:20:::0;::::2;:33::i;:::-;46493:17;::::0;::::2;::::0;;:21:::2;:56::i;:::-;46473:17;::::0;::::2;:76:::0;46621:16:::2;::::0;::::2;::::0;46584:55:::2;::::0;46606:32:::2;::::0;:10;;:14:::2;:32::i;:::-;46584:17;::::0;::::2;::::0;;:21:::2;:55::i;:::-;46564:17;::::0;::::2;:75:::0;-1:-1:-1;;46278:373:0::2;46686:34;46695:15;46712:7;;46686:8;:34::i;:::-;46663:20;::::0;::::2;:57:::0;46737:18:::2;::::0;::::2;;46733:202;;46771:15;46789:65;46838:4;:15;;;46789:44;46828:4;46789:34;46805:5;:17;;;46789:4;:11;;;:15;;:34;;;;:::i;:65::-;46891:19;::::0;::::2;::::0;46771:83;;-1:-1:-1;46891:32:0::2;::::0;46771:83;46891:23:::2;:32::i;:::-;46869:19;::::0;::::2;:54:::0;-1:-1:-1;46733:202:0::2;60262:6:::0;60290:32:::4;2511:10:::0;60309:12:::4;-1:-1:-1::0;;;;;11836:19:0;;:23;;;11541:326;60290:32:::4;60289:33;60281:81;;;;-1:-1:-1::0;;;60281:81:0::4;;;;;;;:::i;:::-;60390:1;60381:6;:10;60373:81;;;::::0;-1:-1:-1;;;60373:81:0;;16296:2:1;60373:81:0::4;::::0;::::4;16278:21:1::0;16335:2;16315:18;;;16308:30;16374:34;16354:18;;;16347:62;16445:28;16425:18;;;16418:56;16491:19;;60373:81:0::4;16094:422:1::0;60373:81:0::4;60465:21;60489:17:::0;;;:9:::4;:17;::::0;;;;;;;2511:10;60489:31;;;;;;;60540:14;;::::4;::::0;::::4;;;60539:15;:34:::0;::::4;;;-1:-1:-1::0;60558:15:0;;::::4;;60539:34;60531:104;;;;-1:-1:-1::0;;;60531:104:0::4;;;;;;;:::i;:::-;60646:22;60671:16:::0;;;:8:::4;:16;::::0;;;;60721:14:::4;::::0;::::4;::::0;60703:15:::4;:32;60700:1710;;;60768:1;60759:6;:10;:35;;;;;60783:4;:11;;;60773:6;:21;;60759:35;60751:116;;;::::0;-1:-1:-1;;;60751:116:0;;17610:2:1;60751:116:0::4;::::0;::::4;17592:21:1::0;17649:2;17629:18;;;17622:30;;;17688:34;17668:18;;;17661:62;17759:34;17739:18;;;17732:62;-1:-1:-1;;;17810:19:1;;;17803:35;17855:19;;60751:116:0::4;17408:472:1::0;60751:116:0::4;60882:22;60907:36;60928:6;60936;60907:20;:36::i;:::-;60882:61;;60971:4;:11;;;60961:6;:21;60958:975;;;61002:61;2511:10:::0;61034:12:::4;61002:18:::0;;-1:-1:-1;;;;;61002:18:0::4;::::0;61048:14;61002:31:::4;:61::i;:::-;61102:17;::::0;::::4;::::0;:29:::4;::::0;61124:6;61102:21:::4;:29::i;:::-;61082:17;::::0;::::4;:49:::0;-1:-1:-1;;;;;;;;;;;2511:10:0;61178:14:::4;61194:6;61155:46;;;;;;;;:::i;:::-;;;;;;;;61220:5;:21;;61242:4;:13;;;61220:36;;;;;;;:::i;:::-;;:38:::0;;;:36:::4;:38;::::0;::::4;:::i;:::-;::::0;;;-1:-1:-1;;61277:21:0;;-1:-1:-1;;61317:23:0;61277:21:::4;61317:23:::0;;;61277:14:::4;61359:11;::::0;::::4;:15:::0;60958:975:::4;;;61415:61;2511:10:::0;61447:12:::4;2431:98:::0;61415:61:::4;61515:17;::::0;::::4;::::0;:29:::4;::::0;61537:6;61515:21:::4;:29::i;:::-;61495:17;::::0;::::4;:49:::0;-1:-1:-1;;;;;;;;;;;2511:10:0;61591:14:::4;61607:6;61568:46;;;;;;;;:::i;:::-;;;;;;;;61647:11;::::0;::::4;::::0;:23:::4;::::0;61663:6;61647:15:::4;:23::i;:::-;61633:11;::::0;::::4;:37:::0;;;61689:229:::4;;61746:1;61732:11;::::0;::::4;:15:::0;61770:23;;-1:-1:-1;;61816:21:0;61770:23:::4;61816:21;::::0;;61770:23;61882:13;::::4;::::0;61860:21:::4;::::0;::::4;::::0;:36:::4;::::0;::::4;;;;;:::i;:::-;;:38:::0;;;:36:::4;:38;::::0;::::4;:::i;:::-;;;;;;61689:229;60736:1208;60700:1710;;;61983:4;:11;;;61973:6;:21;61965:86;;;;-1:-1:-1::0;;;61965:86:0::4;;;;;;;:::i;:::-;62066:53;2511:10:::0;62066:18;;-1:-1:-1;;;;;62066:18:0::4;::::0;62112:6;62066:31:::4;:53::i;:::-;62154:17;::::0;::::4;::::0;:29:::4;::::0;62176:6;62154:21:::4;:29::i;:::-;62134:17;::::0;::::4;:49:::0;-1:-1:-1;;;;;;;;;;;2511:10:0;62226:6:::4;62234;62203:38;;;;;;;;:::i;:::-;;;;;;;;62256:5;:21;;62278:4;:13;;;62256:36;;;;;;;:::i;:::-;;:38:::0;;;:36:::4;:38;::::0;::::4;:::i;:::-;::::0;;;-1:-1:-1;;62309:21:0;;-1:-1:-1;;62345:23:0;62309:21:::4;62345:23:::0;;;62309:14:::4;62383:11;::::0;::::4;:15:::0;60700:1710:::4;-1:-1:-1::0;;45616:1:0::3;45575:17:::0;;;:9:::3;:17;::::0;;;;;;;2511:10;45575:31;;;;;;;:38:::3;;::::0;:42;;;:96:::3;;-1:-1:-1::0;45670:1:0::3;45621:17:::0;;;:9:::3;:17;::::0;;;;;;;2511:10;45621:31;;;;;;;:46:::3;;::::0;:50;;45575:96:::3;45571:172;;;45673:29;2511:10:::0;45673:15:::3;:29::i;:::-;45571:172;;;45718:25;2511:10:::0;45718:11:::3;:25::i;:::-;46945:1;46985:44:::2;47024:4;46985:34;47001:5;:17;;;46985:4;:11;;;:15;;:34;;;;:::i;:44::-;46967:15;::::0;::::2;:62:::0;47044:14:::2;::::0;::::2;::::0;47040:57:::2;;47082:15;47065:14;::::0;::::2;:32:::0;47040:57:::2;45914:1191;;;45824:1;-1:-1:-1::0;;45836:18:0::1;:26:::0;;-1:-1:-1;;45836:26:0::1;::::0;;-1:-1:-1;45836:26:0;1854:22;;60130:2287::o;48829:189::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;48897:65:::1;:11;-1:-1:-1::0;;;;;48897:28:0::1;2511:10:::0;48948:4:::1;48955:6:::0;48897:28:::1;:65::i;:::-;48987:11;::::0;:23:::1;::::0;49003:6;48987:15:::1;:23::i;:::-;48973:11;:37:::0;-1:-1:-1;48829:189:0:o;49379:127::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;49470:28:::1;:13:::0;49488:9:::1;49470:17;:28::i;:::-;49456:11;:42:::0;-1:-1:-1;49379:127:0:o;63089:1869::-;944:1;1542:7;;:19;;1534:63;;;;-1:-1:-1;;;1534:63:0;;;;;;;:::i;:::-;944:1;1675:7;:18;45925:21:::1;45949:17:::0;;;:9:::1;:17;::::0;;;;;;;2511:10;45949:31;;;;;;;46016:16;;;:8:::1;:16:::0;;;;;;46066:20:::1;::::0;::::1;::::0;45949:17;;:31;46016:16;46047:15:::1;:39;46043:78;;46103:7;;;;46043:78;46153:17;::::0;::::1;::::0;46185:16;46181:87:::1;;46241:15;46218:20;::::0;::::1;:38:::0;46181:87:::1;46281:11;::::0;:15;46278:373:::1;;46313:18;46334:60;46373:5;:20;;;46334:34;46343:15;46360:7;;46334:8;:34::i;:60::-;46313:81;;46409:14;46426:32;46441:5;:16;;;46426:10;:14;;:32;;;;:::i;:::-;46409:49;;46493:56;46515:33;46536:11;;46515:16;46526:4;46515:6;:10;;:16;;;;:::i;46493:56::-;46473:17;::::0;::::1;:76:::0;46621:16:::1;::::0;::::1;::::0;46584:55:::1;::::0;46606:32:::1;::::0;:10;;:14:::1;:32::i;46584:55::-;46564:17;::::0;::::1;:75:::0;-1:-1:-1;;46278:373:0::1;46686:34;46695:15;46712:7;;46686:8;:34::i;:::-;46663:20;::::0;::::1;:57:::0;46737:18:::1;::::0;::::1;;46733:202;;46771:15;46789:65;46838:4;:15;;;46789:44;46828:4;46789:34;46805:5;:17;;;46789:4;:11;;;:15;;:34;;;;:::i;:65::-;46891:19;::::0;::::1;::::0;46771:83;;-1:-1:-1;46891:32:0::1;::::0;46771:83;46891:23:::1;:32::i;:::-;46869:19;::::0;::::1;:54:::0;-1:-1:-1;46733:202:0::1;63176:6:::0;63204:32:::3;2511:10:::0;63223:12:::3;2431:98:::0;63204:32:::3;63203:33;63195:81;;;;-1:-1:-1::0;;;63195:81:0::3;;;;;;;:::i;:::-;63287:21;63311:17:::0;;;:9:::3;:17;::::0;;;;;;;2511:10;63311:31;;;;;;;63390:20;;;:12:::3;:20:::0;;;;;;63430:14;;::::3;::::0;::::3;;;63429:15;63421:69;;;::::0;-1:-1:-1;;;63421:69:0;;15528:2:1;63421:69:0::3;::::0;::::3;15510:21:1::0;15567:2;15547:18;;;15540:30;15606:34;15586:18;;;15579:62;-1:-1:-1;;;15657:18:1;;;15650:39;15706:19;;63421:69:0::3;15326:405:1::0;63421:69:0::3;63523:19;::::0;::::3;::::0;63557:50:::3;:11:::0;2511:10;63557:36:::3;:50::i;:::-;63553:1398;;63671:11;::::0;63652:14:::3;::::0;::::3;::::0;63632:35:::3;::::0;:15:::3;::::0;:19:::3;:35::i;:::-;:50;;63623:97;;;;-1:-1:-1::0;;;63623:97:0::3;;;;;;;:::i;:::-;63735:51;2511:10:::0;63760:12:::3;-1:-1:-1::0;;;;;63735:11:0::3;:24;::::0;63774:11;63735:24:::3;:51::i;:::-;63804:6;63814:1;63804:11;63801:99;;;63835:49;2511:10:::0;63858:12:::3;63872:11;63835:22;:49::i;:::-;;63801:99;63919:32;2511:10:::0;63919:32:::3;::::0;;-1:-1:-1;;;;;5095:32:1;;;5077:51;;5159:2;5144:18;;5137:34;;;5050:18;63919:32:0::3;;;;;;;63987:11;::::0;:28:::3;::::0;64003:11;63987:15:::3;:28::i;:::-;63973:11;:42:::0;64057:1:::3;64035:19;::::0;::::3;:23:::0;64090:15:::3;64073:14;::::0;;::::3;:32:::0;;;;64141:11;64120:33:::3;::::0;64133:6;;64120:12:::3;:33::i;:::-;63553:1398;;;64233:11;::::0;64214:14:::3;::::0;::::3;::::0;64194:35:::3;::::0;:15:::3;::::0;:19:::3;:35::i;:::-;:50;;64186:96;;;;-1:-1:-1::0;;;64186:96:0::3;;;;;;;:::i;:::-;2511:10:::0;64305:12:::3;:26:::0;;;-1:-1:-1;;;;;;;;;;;64305:12:0::3;:26:::0;;;;:37;::::3;;64297:95;;;::::0;-1:-1:-1;;;64297:95:0;;19627:2:1;64297:95:0::3;::::0;::::3;19609:21:1::0;19666:2;19646:18;;;19639:30;19705:34;19685:18;;;19678:62;-1:-1:-1;;;19756:18:1;;;19749:43;19809:19;;64297:95:0::3;19425:409:1::0;64297:95:0::3;64410:6;64420:1;64410:11;64407:99;;;64441:49;2511:10:::0;64464:12:::3;2431:98:::0;64441:49:::3;;64407:99;64537:15;64520:14;::::0;::::3;:32:::0;2511:10;64603:12:::3;:26:::0;;;-1:-1:-1;;;;;;;;;;;64603:12:0::3;:26:::0;;;;:33:::3;;::::0;:50:::3;::::0;64641:11;64603:37:::3;:50::i;:::-;2511:10:::0;64567:12:::3;:26:::0;;;-1:-1:-1;;;;;;;;;;;64567:12:0::3;:26:::0;;;;;;:33:::3;;:86:::0;;;;64577:1:::3;64694:11:::0;;:8:::3;:11:::0;;-1:-1:-1;;;;;;;;;;;64694:23:0;:40:::3;::::0;64722:11;64694:27:::3;:40::i;:::-;64677:1;64668:11;::::0;:8:::3;:11;::::0;-1:-1:-1;;;;;;;;;;;64668:66:0;64754:37:::3;2511:10:::0;64754:37:::3;::::0;;-1:-1:-1;;;;;5095:32:1;;;5077:51;;5159:2;5144:18;;5137:34;;;5050:18;64754:37:0::3;;;;;;;64822:11;::::0;:28:::3;::::0;64838:11;64822:15:::3;:28::i;:::-;64808:11;:42:::0;64890:1:::3;64868:19;::::0;::::3;:23:::0;64927:11:::3;::::0;64906:33:::3;::::0;64919:6;;64906:12:::3;:33::i;:::-;-1:-1:-1::0;;;45616:1:0::2;45575:17:::0;;;:9:::2;:17;::::0;;;;;;;2511:10;45575:31;;;;;;;:38:::2;;::::0;:42;;;:96:::2;;-1:-1:-1::0;45670:1:0::2;45621:17:::0;;;:9:::2;:17;::::0;;;;;;;2511:10;45621:31;;;;;;;:46:::2;;::::0;:50;;45575:96:::2;45571:172;;;45673:29;2511:10:::0;45673:15:::3;:29::i;:::-:2;45571:172;;;45718:25;2511:10:::0;45718:11:::3;:25::i;:::-:2;46945:1;46985:44:::1;47024:4;46985:34;47001:5;:17;;;46985:4;:11;;;:15;;:34;;;;:::i;:44::-;46967:15;::::0;::::1;:62:::0;47044:14:::1;::::0;::::1;::::0;47040:57:::1;;47082:15;47065:14;::::0;::::1;:32:::0;47040:57:::1;45914:1191;;;1706:1;-1:-1:-1::0;;900:1:0;1854:22;;63089:1869::o;47967:67::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;48016:10:::1;:8;:10::i;:::-;47967:67::o:0;50690:337::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;50820:22:::1;50845:16:::0;;;:8:::1;:16;::::0;;;;50872:15:::1;::::0;::::1;:26:::0;;;50909:18;;;:27;;;50947:18;;;:26;;;51005:6;;51000:1:::1;50984:18;;:27:::0;-1:-1:-1;;;;;;50690:337:0:o;67382:196::-;67442:4;67496:20;;;:12;:20;;;;;67534:36;67496:20;67534:34;:36::i;48042:439::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;48154:15:::1;48174:10;;48172:12;;;;;:::i;:::-;::::0;;;;-1:-1:-1;48195:22:0::1;48220:17:::0;;;:8:::1;:17;::::0;;;;48248:27;;-1:-1:-1;;;;;;48248:27:0::1;-1:-1:-1::0;;;;;48248:27:0;::::1;;::::0;;48286:16:::1;::::0;::::1;:30:::0;;;48327:12:::1;::::0;::::1;:19:::0;;-1:-1:-1;;48327:19:0::1;-1:-1:-1::0;48327:19:0::1;::::0;;48172:12;;-1:-1:-1;48357:83:0::1;::::0;48172:12;;48385:9;;:12:::1;;;::::0;48399:9;48409:1:::1;48399:12;;;::::0;48413:9;48423:1:::1;48413:12;;;::::0;48427:9;48437:1:::1;48427:12;;;;48357:18;:83::i;:::-;48456:17;::::0;-1:-1:-1;;;;;4479:32:1;;4461:51;;48456:17:0::1;::::0;4449:2:1;4434:18;48456:17:0::1;;;;;;;48143:338;;48042:439:::0;;;:::o;4215:103::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;4280:30:::1;4307:1;4280:18;:30::i;49180:191::-:0;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;49278:7:::1;;49260:15;:25;49251:47;;;::::0;-1:-1:-1;;;49251:47:0;;14074:2:1;49251:47:0::1;::::0;::::1;14056:21:1::0;14113:1;14093:18;;;14086:29;-1:-1:-1;;;14131:18:1;;;14124:38;14179:18;;49251:47:0::1;13872:331:1::0;49251:47:0::1;49319:44;49339:23;:8:::0;49352:9:::1;49339:12;:23::i;:::-;49319:15;::::0;:19:::1;:44::i;:::-;49309:7;:54:::0;-1:-1:-1;49180:191:0:o;57313:2809::-;944:1;1542:7;;:19;;1534:63;;;;-1:-1:-1;;;1534:63:0;;;;;;;:::i;:::-;944:1;1675:7;:18;;;45788::::1;:25:::0;;-1:-1:-1;;45788:25:0::1;::::0;::::1;::::0;;2511:10;-1:-1:-1;45949:31:0;;;-1:-1:-1;;;;;;;;;;;45949:17:0::2;:31:::0;;;;;;46016:16;;;;:8:::2;:16:::0;;46066:20;;46016:16;;46047:15:::2;:39;46043:78;;46103:7;;;;46043:78;46153:17;::::0;::::2;::::0;46185:16;46181:87:::2;;46241:15;46218:20;::::0;::::2;:38:::0;46181:87:::2;46281:11;::::0;:15;46278:373:::2;;46313:18;46334:60;46373:5;:20;;;46334:34;46343:15;46360:7;;46334:8;:34::i;:60::-;46313:81;;46409:14;46426:32;46441:5;:16;;;46426:10;:14;;:32;;;;:::i;:::-;46409:49;;46493:56;46515:33;46536:11;;46515:16;46526:4;46515:6;:10;;:16;;;;:::i;46493:56::-;46473:17;::::0;::::2;:76:::0;46621:16:::2;::::0;::::2;::::0;46584:55:::2;::::0;46606:32:::2;::::0;:10;;:14:::2;:32::i;46584:55::-;46564:17;::::0;::::2;:75:::0;-1:-1:-1;;46278:373:0::2;46686:34;46695:15;46712:7;;46686:8;:34::i;:::-;46663:20;::::0;::::2;:57:::0;46737:18:::2;::::0;::::2;;46733:202;;46771:15;46789:65;46838:4;:15;;;46789:44;46828:4;46789:34;46805:5;:17;;;46789:4;:11;;;:15;;:34;;;;:::i;:65::-;46891:19;::::0;::::2;::::0;46771:83;;-1:-1:-1;46891:32:0::2;::::0;46771:83;46891:23:::2;:32::i;:::-;46869:19;::::0;::::2;:54:::0;-1:-1:-1;46733:202:0::2;57422:1:::3;57445:32:::4;2511:10:::0;57464:12:::4;2431:98:::0;57445:32:::4;57444:33;57436:81;;;;-1:-1:-1::0;;;57436:81:0::4;;;;;;;:::i;:::-;2511:10:::0;57528:21:::4;57552:26:::0;;;-1:-1:-1;;;;;;;;;;;57552:12:0::4;:26:::0;;;;57598:14;;::::4;::::0;::::4;;;57597:15;:34:::0;::::4;;;-1:-1:-1::0;57616:15:0;;::::4;;57597:34;57589:104;;;;-1:-1:-1::0;;;57589:104:0::4;;;;;;;:::i;:::-;57738:1;57704:22;57729:11:::0;:8:::4;:11;::::0;57772:14:::4;::::0;::::4;::::0;57729:11;;57754:15:::4;:32;57751:2364;;;57820:1;57811:6;:10;:35;;;;;57835:4;:11;;;57825:6;:21;;57811:35;57803:115;;;::::0;-1:-1:-1;;;57803:115:0;;16723:2:1;57803:115:0::4;::::0;::::4;16705:21:1::0;16762:2;16742:18;;;16735:30;16801:34;16781:18;;;16774:62;16872:34;16852:18;;;16845:62;-1:-1:-1;;;16923:19:1;;;16916:34;16967:19;;57803:115:0::4;16521:471:1::0;57803:115:0::4;57934:22;57960:31;57981:1;57984:6;57960:20;:31::i;:::-;57933:58;;58019:4;:11;;;58009:6;:21;58006:959;;;58050:54;2511:10:::0;58075:12:::4;2431:98:::0;58050:54:::4;-1:-1:-1::0;;;;;;;;;;;2511:10:0;58151:14:::4;58167:1;58128:41;;;;;;;;:::i;:::-;;;;;;;;58202:1;58188:11;::::0;::::4;:15:::0;58242:17:::4;::::0;::::4;::::0;:29:::4;::::0;58264:6;58242:21:::4;:29::i;:::-;58222:17;::::0;;::::4;:49:::0;;;;58290:23;;-1:-1:-1;;58332:21:0;58290:23:::4;58332:21;::::0;;58290:23;58394:13;::::4;::::0;58372:21:::4;::::0;::::4;::::0;:36;::::4;;;;;:::i;:::-;;:38:::0;;;:36:::4;:38;::::0;::::4;:::i;:::-;;;;;;58006:959;;;58451:54;2511:10:::0;58476:12:::4;2431:98:::0;58451:54:::4;58538:11;::::0;::::4;::::0;:23:::4;::::0;58554:6;58538:15:::4;:23::i;:::-;58524:11;::::0;::::4;:37:::0;58600:17:::4;::::0;::::4;::::0;:29:::4;::::0;58622:6;58600:21:::4;:29::i;:::-;58580:17;::::0;::::4;:49:::0;-1:-1:-1;;;;;;;;;;;2511:10:0;58684:14:::4;58700:1;58661:41;;;;;;;;:::i;:::-;;;;;;;;58724:11;::::0;::::4;::::0;58721:229:::4;;58778:1;58764:11;::::0;::::4;:15:::0;58802:23;;-1:-1:-1;;58848:21:0;58802:23:::4;58848:21;::::0;;58802:23;58914:13;::::4;::::0;58892:21:::4;::::0;::::4;::::0;:36:::4;::::0;::::4;;;;;:::i;:::-;;:38:::0;;;:36:::4;:38;::::0;::::4;:::i;:::-;;;;;;58721:229;57788:1188;57751:2364;;;59015:4;:11;;;59005:6;:21;58997:86;;;;-1:-1:-1::0;;;58997:86:0::4;;;;;;;:::i;:::-;59098:22;59187:16;;59153:5;:15;;59169:4;:13;;;59153:30;;;;;;;:::i;:::-;;;59139:4;:11;;;:44;;;;:::i;:::-;59138:65;;;;:::i;:::-;59123:4;:11;;;:81;;;;:::i;:::-;59098:106;;59239:28;59255:4;:11;;;59239;;:15;;:28;;;;:::i;:::-;59222:14;:45;59219:728;;;59287:68;2511:10:::0;59342:11:::4;::::0;::::4;::::0;59326::::4;::::0;:28:::4;::::0;:15:::4;:28::i;:::-;-1:-1:-1::0;;;;;59287:11:0::4;:24;::::0;:68;:24:::4;:68::i;:::-;-1:-1:-1::0;;;;;;;;;;;2511:10:0;59418:11:::4;::::0;::::4;::::0;59402::::4;::::0;:28:::4;::::0;:15:::4;:28::i;:::-;59432:1;59379:55;;;;;;;;:::i;:::-;;;;;;;;59456:11;::::0;:16;59453:78:::4;;59510:1;59496:11;:15:::0;59453:78:::4;59601:11;::::0;::::4;::::0;59579:17:::4;::::0;::::4;::::0;:34:::4;::::0;:21:::4;:34::i;:::-;59559:17;::::0;::::4;:54:::0;59219:728:::4;;;59654:54;2511:10:::0;59679:12:::4;2431:98:::0;59654:54:::4;59741:48;59757:31;59776:4;:11;;;59757:14;:18;;:31;;;;:::i;:::-;59741:11;::::0;;:15:::4;:48::i;:::-;59727:11;:62:::0;59854:11:::4;::::0;::::4;::::0;59832:17:::4;::::0;::::4;::::0;:34:::4;::::0;:21:::4;:34::i;:::-;59812:17;::::0;::::4;:54:::0;-1:-1:-1;;;;;;;;;;;2511:10:0;59913:14:::4;59929:1;59890:41;;;;;;;;:::i;:::-;;;;;;;;59219:728;59961:5;:21;;59983:4;:13;;;59961:36;;;;;;;:::i;:::-;;:38:::0;;;:36:::4;:38;::::0;::::4;:::i;:::-;::::0;;;-1:-1:-1;;60028:1:0::4;60014:11;::::0;::::4;:15:::0;-1:-1:-1;60044:21:0;;-1:-1:-1;;60080:23:0;60044:21:::4;60080:23:::0;;;57751:2364:::4;-1:-1:-1::0;;45616:1:0::3;45575:17:::0;;;:9:::3;:17;::::0;;;;;;;2511:10;45575:31;;;;;;;:38:::3;;::::0;:42;;;:96:::3;;-1:-1:-1::0;45670:1:0::3;45621:17:::0;;;:9:::3;:17;::::0;;;;;;;2511:10;45621:31;;;;;;;:46:::3;;::::0;:50;;45575:96:::3;45571:172;;;45673:29;2511:10:::0;45673:15:::3;:29::i;:::-;45571:172;;;45718:25;2511:10:::0;45718:11:::3;:25::i;:::-;46945:1;46985:44:::2;47024:4;46985:34;47001:5;:17;;;46985:4;:11;;;:15;;:34;;;;:::i;:44::-;46967:15;::::0;::::2;:62:::0;47044:14:::2;::::0;::::2;::::0;47040:57:::2;;47082:15;47065:14;::::0;::::2;:32:::0;47040:57:::2;45914:1191;;;45824:1;-1:-1:-1::0;;45836:18:0::1;:26:::0;;-1:-1:-1;;45836:26:0::1;::::0;;;1854:22;;57313:2809::o;52163:618::-;52226:16;;;;:8;:16;;;;;:23;;;;;52218:62;;;;-1:-1:-1;;;52218:62:0;;15173:2:1;52218:62:0;;;15155:21:1;15212:2;15192:18;;;15185:30;15251:28;15231:18;;;15224:56;15297:18;;52218:62:0;14971:350:1;52218:62:0;52300:32;2511:10;52319:12;2431:98;52300:32;52299:33;52291:81;;;;-1:-1:-1;;;52291:81:0;;;;;;;:::i;:::-;2511:10;52391:12;:26;;;-1:-1:-1;;;;;;;;;;;52391:12:0;:26;;;;:37;;;52383:96;;;;-1:-1:-1;;;52383:96:0;;19212:2:1;52383:96:0;;;19194:21:1;19251:2;19231:18;;;19224:30;19290:34;19270:18;;;19263:62;-1:-1:-1;;;19341:18:1;;;19334:44;19395:19;;52383:96:0;19010:410:1;52383:96:0;52490:34;52527:20;;;:12;:20;;;;;52563:50;2511:10;52600:12;2431:98;52563:50;52558:216;;52630:45;:11;2511:10;52630:31;:45::i;:::-;;52207:574;52163:618;:::o;52558:216::-;52708:48;:11;2511:10;52708:34;:48::i;52558:216::-;52207:574;52163:618;:::o;68425:179::-;68486:17;;:::i;:::-;68516:22;68541:16;;;:8;:16;;;;;;;68568:28;;;;;;;;;68541:16;;68575:21;;;;68568:28;;68575:21;68568:28;;;;;;;;;;;;;;;;;;;;;;;;;68425:179;;;:::o;50297:385::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;50431:22:::1;50456:16:::0;;;:8:::1;:16;::::0;;;;50508:14:::1;:5:::0;50516:6:::1;50508:14;:::i;:::-;50483:19;::::0;::::1;:39:::0;50558:15:::1;:6:::0;50567::::1;50558:15;:::i;:::-;50533:22:::0;;;:40;50609:14:::1;:5:::0;50617:6:::1;50609:14;:::i;:::-;50584:22:::0;;;:39;50659:15:::1;:6:::0;50668::::1;50659:15;:::i;:::-;50634:19;::::0;::::1;50654:1;50634:22;::::0;47896:63;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;47943:8:::1;:6;:8::i;62425:258::-:0;62482:21;62506:17;;;:9;:17;;;;;;;;2511:10;62506:31;;;;;;;62561:1;62551:11;;62548:127;;;62573:33;62594:4;:11;;;62573:20;:33::i;62548:127::-;62632:43;62655:6;62663:4;:11;;;62632:22;:43::i;68144:269::-;68203:31;;:::i;:::-;68236:29;;:::i;:::-;68278:22;68303:16;;;:8;:16;;;;;;;68330:35;;;;;;;;;68303:16;;68346:19;;;;68330:35;;68346:19;68330:35;;;;;;;;;;;;;;;;;-1:-1:-1;;68376:29:0;;;;;;;;;;68330:35;;-1:-1:-1;68390:15:0;;;;-1:-1:-1;68376:29:0;;-1:-1:-1;68376:29:0;-1:-1:-1;68390:15:0;68376:29;;;;;;;;;;;;;;;;;;;;;;;;68267:146;68144:269;;;:::o;51035:1120::-;51108:7;51161:17;;;:9;:17;;;;;;;;-1:-1:-1;;;;;51161:24:0;;;;;;;;;51221:16;;;:8;:16;;;;;51252:11;;;;51108:7;;51161:24;51221:16;51248:53;;-1:-1:-1;51278:19:0;;;;-1:-1:-1;51299:1:0;;-1:-1:-1;51270:31:0;;51248:53;51337:17;;;;51390;;;;51422:11;;:15;51418:320;;51454:18;51475:60;51514:5;:20;;;51475:34;51484:15;51501:7;;51475:8;:34::i;:60::-;51454:81;;51550:14;51567:32;51582:5;:16;;;51567:10;:14;;:32;;;;:::i;:::-;51550:49;-1:-1:-1;51614:24:0;51550:49;51614:24;;:::i;:::-;;;51670:56;51692:33;51713:11;;51692:16;51703:4;51692:6;:10;;:16;;;;:::i;:33::-;51670:17;;;;;:21;:56::i;:::-;51653:73;;51439:299;;51418:320;51762:11;;;;51863:19;;;;51842:15;;;;51748:11;;51801:82;;:57;;:36;51832:4;51801:26;51762:11;51812:14;51801:10;:26::i;:57::-;:61;;:82::i;:::-;51784:99;-1:-1:-1;51917:21:0;51894:20;51987:18;;51983:118;;52039:50;52074:14;52039:30;:15;52059:9;52039:19;:30::i;:50::-;52022:67;;51983:118;52121:9;;-1:-1:-1;52132:14:0;;-1:-1:-1;;;;;;;51035:1120:0;;;;;;:::o;62691:390::-;62769:21;62793:17;;;:9;:17;;;;;;;;2511:10;62793:31;;;;;;;62854:3;62843:14;;;62835:23;;;;;;62869:24;62922:3;62911:7;62897:4;:11;;;:21;;;;:::i;:::-;62896:29;;;;:::i;:::-;62869:56;;62939:6;62949:1;62939:11;62936:137;;;62961:38;62982:16;62961:20;:38::i;:::-;62936:137;;;63025:48;63048:6;63056:16;63025:22;:48::i;:::-;62758:323;;62691:390;;:::o;49514:431::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;49585:22:::1;49610:16:::0;;;:8:::1;:16;::::0;;;;;49655:22:::1;::::0;::::1;::::0;49702:18;;:43;;-1:-1:-1;;;49702:43:0;;49739:4:::1;49702:43;::::0;::::1;4461:51:1::0;49610:16:0;;49655:22;;49585;;-1:-1:-1;;;;;49702:18:0;;::::1;::::0;:28:::1;::::0;4434:18:1;;49702:43:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49688:57;;49795:6;49770:5;:22;;;:31;49766:56;;;49816:6;49803:19;;49766:56;49865:12;::::0;49833:18;;:57:::1;::::0;-1:-1:-1;;;;;49833:18:0;;::::1;::::0;49865:12:::1;49879:10:::0;49833:31:::1;:57::i;:::-;49927:10;49901:5;:22;;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;49514:431:0:o;48489:332::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;48628:10:::1;;48618:6;:20;;48610:29;;;::::0;::::1;;48650:22;48675:16:::0;;;:8:::1;:16;::::0;;;;48702:34:::1;48716:11:::0;48684:6;48702:13:::1;:34::i;:::-;48747:12;::::0;::::1;:21:::0;;-1:-1:-1;;48747:21:0::1;::::0;::::1;;;::::0;;48779:34:::1;48793:6:::0;48801:11;48779:13:::1;:34::i;:::-;48599:222;48489:332:::0;;;;:::o;49026:146::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;49118:5:::1;49100:15;:23;49091:47;;;::::0;-1:-1:-1;;;49091:47:0;;18873:2:1;49091:47:0::1;::::0;::::1;18855:21:1::0;18912:2;18892:18;;;18885:30;-1:-1:-1;;;18931:18:1;;;18924:40;18981:18;;49091:47:0::1;18671:334:1::0;49091:47:0::1;49149:7;:15:::0;49026:146::o;50181:108::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;50256:12:::1;:25:::0;;-1:-1:-1;;;;;;50256:25:0::1;-1:-1:-1::0;;;;;50256:25:0;;;::::1;::::0;;;::::1;::::0;;50181:108::o;55402:1498::-;944:1;1542:7;;:19;;1534:63;;;;-1:-1:-1;;;1534:63:0;;;;;;;:::i;:::-;944:1;1675:7;:18;6062:4;6086:7;-1:-1:-1;;;6086:7:0;;;;6340:9:::1;6332:38;;;::::0;-1:-1:-1;;;6332:38:0;;13308:2:1;6332:38:0::1;::::0;::::1;13290:21:1::0;13347:2;13327:18;;;13320:30;-1:-1:-1;;;13366:18:1;;;13359:46;13422:18;;6332:38:0::1;13106:340:1::0;6332:38:0::1;45925:21:::2;45949:17:::0;;;:9:::2;:17;::::0;;;;;;;2511:10;45949:31;;;;;;;46016:16;;;:8:::2;:16:::0;;;;;;46066:20:::2;::::0;::::2;::::0;45949:17;;:31;46016:16;46047:15:::2;:39;46043:78;;46103:7;;;;46043:78;46153:17;::::0;::::2;::::0;46185:16;46181:87:::2;;46241:15;46218:20;::::0;::::2;:38:::0;46181:87:::2;46281:11;::::0;:15;46278:373:::2;;46313:18;46334:60;46373:5;:20;;;46334:34;46343:15;46360:7;;46334:8;:34::i;:60::-;46313:81;;46409:14;46426:32;46441:5;:16;;;46426:10;:14;;:32;;;;:::i;:::-;46409:49;;46493:56;46515:33;46536:11;;46515:16;46526:4;46515:6;:10;;:16;;;;:::i;46493:56::-;46473:17;::::0;::::2;:76:::0;46621:16:::2;::::0;::::2;::::0;46584:55:::2;::::0;46606:32:::2;::::0;:10;;:14:::2;:32::i;46584:55::-;46564:17;::::0;::::2;:75:::0;-1:-1:-1;;46278:373:0::2;46686:34;46695:15;46712:7;;46686:8;:34::i;:::-;46663:20;::::0;::::2;:57:::0;46737:18:::2;::::0;::::2;;46733:202;;46771:15;46789:65;46838:4;:15;;;46789:44;46828:4;46789:34;46805:5;:17;;;46789:4;:11;;;:15;;:34;;;;:::i;:65::-;46891:19;::::0;::::2;::::0;46771:83;;-1:-1:-1;46891:32:0::2;::::0;46771:83;46891:23:::2;:32::i;:::-;46869:19;::::0;::::2;:54:::0;-1:-1:-1;46733:202:0::2;55548:6:::3;55594:7:::4;;55576:15;:25;55567:46;;;::::0;-1:-1:-1;;;55567:46:0;;12973:2:1;55567:46:0::4;::::0;::::4;12955:21:1::0;13012:1;12992:18;;;12985:29;-1:-1:-1;;;13030:18:1;;;13023:37;13077:18;;55567:46:0::4;12771:330:1::0;55567:46:0::4;55633:32;2511:10:::0;55652:12:::4;2431:98:::0;55633:32:::4;55632:33;55624:80;;;::::0;-1:-1:-1;;;55624:80:0;;9841:2:1;55624:80:0::4;::::0;::::4;9823:21:1::0;9880:2;9860:18;;;9853:30;9919:34;9899:18;;;9892:62;-1:-1:-1;;;9970:18:1;;;9963:32;10012:19;;55624:80:0::4;9639:398:1::0;55624:80:0::4;55753:1;55741:9;:13;55715:84;;;::::0;-1:-1:-1;;;55715:84:0;;11404:2:1;55715:84:0::4;::::0;::::4;11386:21:1::0;11443:2;11423:18;;;11416:30;11482:34;11462:18;;;11455:62;-1:-1:-1;;;11533:18:1;;;11526:38;11581:19;;55715:84:0::4;11202:404:1::0;55715:84:0::4;55810:21;55834:17:::0;;;:9:::4;:17;::::0;;;;;;;2511:10;55834:31;;;;;;;55913:16;;;:8:::4;:16:::0;;;;;;55948:12:::4;::::0;::::4;::::0;::::4;;55940:51;;;::::0;-1:-1:-1;;;55940:51:0;;15173:2:1;55940:51:0::4;::::0;::::4;15155:21:1::0;15212:2;15192:18;;;15185:30;15251:28;15231:18;;;15224:56;15297:18;;55940:51:0::4;14971:350:1::0;55940:51:0::4;56005:14:::0;;::::4;::::0;::::4;;;56002:67;;;56035:22:::0;;-1:-1:-1;;56035:22:0::4;::::0;;56002:67:::4;56088:14:::0;;::::4;::::0;::::4;;;56087:15;56079:24;;;::::0;::::4;;56114:18:::0;;-1:-1:-1;;;;;56114:18:0::4;:31;2511:10:::0;56114:68:::4;::::0;-1:-1:-1;;;;;;56114:68:0::4;::::0;;;;;;-1:-1:-1;;;;;4781:15:1;;;56114:68:0::4;::::0;::::4;4763:34:1::0;56168:4:0::4;4813:18:1::0;;;4806:43;4865:18;;;4858:34;;;4698:18;;56114:68:0::4;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;56198:15:0;;::::4;;56195:577;;;56243:11;::::0;::::4;::::0;:23:::4;::::0;56259:6;56243:15:::4;:23::i;:::-;56229:11;::::0;::::4;:37:::0;56300:15:::4;56281:16;::::0;::::4;:34:::0;56330:17:::4;::::0;::::4;::::0;:29:::4;::::0;56352:6;56330:21:::4;:29::i;:::-;;56195:577;;;56392:22:::0;;-1:-1:-1;;56392:22:0::4;56410:4;56392:22:::0;;::::4;::::0;;56429:13;::::4;:25:::0;;;56516:19:::4;::::0;::::4;56445:9:::0;56516:30:::4;::::0;::::4;;;;;:::i;:::-;;::::0;56498:48:::4;::::0;:15:::4;:48;:::i;:::-;56481:14;::::0;::::4;:65:::0;56561:21:::4;::::0;::::4;56583:9:::0;56561:32:::4;::::0;::::4;;;;;:::i;:::-;;:34:::0;;;:32:::4;:34;::::0;::::4;:::i;:::-;::::0;;;-1:-1:-1;;56624:11:0::4;::::0;::::4;::::0;:23:::4;::::0;56640:6;56624:15:::4;:23::i;:::-;56610:11;::::0;::::4;:37:::0;56681:15:::4;56662:16;::::0;::::4;:34:::0;56731:17:::4;::::0;::::4;::::0;:29:::4;::::0;56753:6;56731:21:::4;:29::i;:::-;56711:17;::::0;::::4;:49:::0;56195:577:::4;56787:37;2511:10:::0;56809:6:::4;56817;56787:37;;;;;;;;:::i;:::-;;;;;;;;56839:14;::::0;::::4;::::0;56835:57:::4;;56877:15;56860:14;::::0;::::4;:32:::0;56835:57:::4;-1:-1:-1::0;;45616:1:0::3;45575:17:::0;;;:9:::3;:17;::::0;;;;;;;2511:10;45575:31;;;;;;;:38:::3;;::::0;:42;;;:96:::3;;-1:-1:-1::0;45670:1:0::3;45621:17:::0;;;:9:::3;:17;::::0;;;;;;;2511:10;45621:31;;;;;;;:46:::3;;::::0;:50;;45575:96:::3;45571:172;;;45673:29;2511:10:::0;45673:15:::3;:29::i;:::-;45571:172;;;45718:25;2511:10:::0;45718:11:::3;:25::i;:::-;46945:1;46985:44:::2;47024:4;46985:34;47001:5;:17;;;46985:4;:11;;;:15;;:34;;;;:::i;:44::-;46967:15;::::0;::::2;:62:::0;47044:14:::2;::::0;::::2;::::0;47040:57:::2;;47082:15;47065:14;::::0;::::2;:32:::0;47040:57:::2;45914:1191;;;6381:1;-1:-1:-1::0;;900:1:0;1854:22;;-1:-1:-1;;55402:1498:0:o;4473:201::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4562:22:0;::::1;4554:73;;;::::0;-1:-1:-1;;;4554:73:0;;10997:2:1;4554:73:0::1;::::0;::::1;10979:21:1::0;11036:2;11016:18;;;11009:30;11075:34;11055:18;;;11048:62;-1:-1:-1;;;11126:18:1;;;11119:36;11172:19;;4554:73:0::1;10795:402:1::0;4554:73:0::1;4638:28;4657:8;4638:18;:28::i;:::-;4473:201:::0;:::o;67871:265::-;3610:7;3637:6;67946:26;;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;67985:34:::1;68022:20:::0;;;:12:::1;:20;::::0;;;;68065:36:::1;68022:20:::0;68065:34:::1;:36::i;25344:98::-:0;25402:7;25429:5;25433:1;25429;:5;:::i;:::-;25422:12;;25344:98;;;;;:::o;38925:167::-;-1:-1:-1;;;;;39059:23:0;;39005:4;34461:19;;;:12;;;:19;;;;;;:24;;39029:55;34364:129;39178:117;39241:7;39268:19;39276:3;34662:18;;34579:109;40357:266;40420:16;40449:22;40474:19;40482:3;40474:7;:19::i;29856:106::-;29914:7;29945:1;29941;:5;:13;;29953:1;29941:13;;;-1:-1:-1;29949:1:0;;29856:106;-1:-1:-1;29856:106:0:o;25725:98::-;25783:7;25810:5;25814:1;25810;:5;:::i;26082:98::-;26140:7;26167:5;26171:1;26167;:5;:::i;26481:98::-;26539:7;26566:5;26570:1;26566;:5;:::i;56908:397::-;56987:7;57032:16;;;:8;:16;;;;;57142;;;;56987:7;;;;44369:3;;57133:25;;:6;:25;:::i;:::-;57132:37;;;;:::i;:::-;57120:49;;57206:9;57180:5;:22;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;57243:21:0;;-1:-1:-1;57243:6:0;57254:9;57243:10;:21::i;:::-;57226:38;56908:397;-1:-1:-1;;;;;;56908:397:0:o;19337:211::-;19481:58;;-1:-1:-1;;;;;5095:32:1;;19481:58:0;;;5077:51:1;5144:18;;;5137:34;;;19454:86:0;;19474:5;;-1:-1:-1;;;19504:23:0;5050:18:1;;19481:58:0;;;;-1:-1:-1;;19481:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;19481:58:0;-1:-1:-1;;;;;;19481:58:0;;;;;;;;;;19454:19;:86::i;66736:138::-;66801:21;:5;66816;66801:14;:21::i;:::-;66796:71;;66839:16;:5;66849;66839:9;:16::i;66592:136::-;66652:21;:5;66667;66652:14;:21::i;:::-;66648:73;;;66690:19;:5;66703;66690:12;:19::i;19556:248::-;19727:68;;-1:-1:-1;;;;;4781:15:1;;;19727:68:0;;;4763:34:1;4833:15;;4813:18;;;4806:43;4865:18;;;4858:34;;;19700:96:0;;19720:5;;-1:-1:-1;;;19750:27:0;4698:18:1;;19727:68:0;4523:375:1;64966:825:0;65106:1;65052:7;65097:11;;;:8;:11;;;65142:21;65178:20;;;:46;;-1:-1:-1;65202:17:0;;;;:22;65178:46;65174:60;;;65233:1;65226:8;;;;;;65174:60;65245:19;65295:5;:17;;;65278:13;:34;65275:477;;65387:17;;;;65348:57;;:34;:15;65368:13;65348:19;:34::i;:57::-;65331:74;-1:-1:-1;65424:18:0;;65420:96;;65463:37;;-1:-1:-1;;;;;65463:21:0;;;:37;;;;;65485:14;;65463:37;;;;65485:14;65463:21;:37;;;;;;;;;;;;;;;;;;;;;65420:96;65550:17;;;;:36;;65572:13;65550:21;:36::i;:::-;65530:17;;;:56;65624:20;;:40;;65649:14;65624:24;:40::i;:::-;65601:20;:63;-1:-1:-1;;;;;65701:19:0;;;;;;:14;:19;;;;;;:39;;65725:14;65701:23;:39::i;:::-;-1:-1:-1;;;;;65679:19:0;;;;;;:14;:19;;;;;:61;65275:477;65769:14;64966:825;-1:-1:-1;;;;;64966:825:0:o;54531:863::-;54602:22;54627:16;;;:8;:16;;;;;54657:21;54636:6;54657:13;:21::i;:::-;54654:39;;54685:7;54531:863;;:::o;54654:39::-;54703:15;54729;54747:9;54729:27;;54767:18;54796:13;54820:512;54836:3;54826:7;:13;:51;;;;;54856:21;54870:6;54856:13;:21::i;:::-;54843:10;:34;54826:51;54820:512;;;54918:21;54932:6;54918:13;:21::i;:::-;54896:5;:18;;;:43;54893:105;;54981:1;54960:18;;;:22;54893:105;55015:46;55034:6;55042:5;:18;;;55015;:46::i;:::-;55012:153;;;55082:41;55096:6;55104:5;:18;;;55082:13;:41::i;:::-;55142:7;;;;:::i;:::-;;;;55012:153;55189:35;55201:22;55213:9;55201:7;;:11;:22::i;:::-;55189:7;;:11;:35::i;:::-;55179:45;;55249:9;55273:18;;;:20;;55239:19;;-1:-1:-1;55273:18:0;:20;;;:::i;:::-;;;;;;55308:12;;;;;:::i;:::-;;;;54820:512;;;55347:39;;;20195:25:1;;;20251:2;20236:18;;20229:34;;;55347:39:0;;20168:18:1;55347:39:0;;;;;;;54591:803;;;;;54531:863;;:::o;7074:120::-;6062:4;6086:7;-1:-1:-1;;;6086:7:0;;;;6610:41;;;;-1:-1:-1;;;6610:41:0;;10244:2:1;6610:41:0;;;10226:21:1;10283:2;10263:18;;;10256:30;-1:-1:-1;;;10302:18:1;;;10295:50;10362:18;;6610:41:0;10042:344:1;6610:41:0;7143:5:::1;7133:15:::0;;-1:-1:-1;;;;7133:15:0::1;::::0;;7164:22:::1;2511:10:::0;7173:12:::1;7164:22;::::0;-1:-1:-1;;;;;4479:32:1;;;4461:51;;4449:2;4434:18;7164:22:0::1;;;;;;;7074:120::o:0;4834:191::-;4908:16;4927:6;;-1:-1:-1;;;;;4944:17:0;;;-1:-1:-1;;;;;;4944:17:0;;;;;;4977:40;;4927:6;;;;;;;4977:40;;4908:16;4977:40;4897:128;4834:191;:::o;38353:152::-;38423:4;38447:50;38452:3;-1:-1:-1;;;;;38472:23:0;;38447:4;:50::i;38681:158::-;38754:4;38778:53;38786:3;-1:-1:-1;;;;;38806:23:0;;38778:7;:53::i;6815:118::-;6062:4;6086:7;-1:-1:-1;;;6086:7:0;;;;6340:9;6332:38;;;;-1:-1:-1;;;6332:38:0;;13308:2:1;6332:38:0;;;13290:21:1;13347:2;13327:18;;;13320:30;-1:-1:-1;;;13366:18:1;;;13359:46;13422:18;;6332:38:0;13106:340:1;6332:38:0;6875:7:::1;:14:::0;;-1:-1:-1;;;;6875:14:0::1;-1:-1:-1::0;;;6875:14:0::1;::::0;;6905:20:::1;6912:12;2511:10:::0;;2431:98;65799:785;65879:22;65904:16;;;:8;:16;;;;;65940:7;;65950:15;-1:-1:-1;65931:46:0;;;;-1:-1:-1;;;65931:46:0;;12973:2:1;65931:46:0;;;12955:21:1;13012:1;12992:18;;;12985:29;-1:-1:-1;;;13030:18:1;;;13023:37;13077:18;;65931:46:0;12771:330:1;65931:46:0;66011:1;65997:11;:15;65988:73;;;;-1:-1:-1;;;65988:73:0;;11813:2:1;65988:73:0;;;11795:21:1;11852:2;11832:18;;;11825:30;11891:34;11871:18;;;11864:62;-1:-1:-1;;;11942:18:1;;;11935:42;11994:19;;65988:73:0;11611:408:1;65988:73:0;66158:11;;:15;66154:333;;66190:18;66211:41;66231:5;:20;;;66211:15;:19;;:41;;;;:::i;:::-;66190:62;;66267:14;66284:32;66299:5;:16;;;66284:10;:14;;:32;;;;:::i;:::-;66351:17;;;;66267:49;;-1:-1:-1;66351:29:0;;66267:49;66351:21;:29::i;:::-;66331:17;;;:49;66458:11;;66415:56;;66437:33;;:16;:6;66448:4;66437:10;:16::i;:33::-;66415:17;;;;;:21;:56::i;:::-;66395:17;;;:76;-1:-1:-1;;66154:333:0;66520:15;66497:20;;;:38;66546:16;;:30;;;;-1:-1:-1;65799:785:0:o;49953:220::-;3610:7;3637:6;-1:-1:-1;;;;;3637:6:0;2511:10;3784:23;3776:68;;;;-1:-1:-1;;;3776:68:0;;;;;;;:::i;:::-;44415:2:::1;50044:4;:17;;50036:41;;;::::0;-1:-1:-1;;;50036:41:0;;12633:2:1;50036:41:0::1;::::0;::::1;12615:21:1::0;12672:2;12652:18;;;12645:30;-1:-1:-1;;;12691:18:1;;;12684:41;12742:18;;50036:41:0::1;12431:335:1::0;50036:41:0::1;50088:22;50113:16:::0;;;:8:::1;:16;::::0;;;;;50142::::1;;:23:::0;49953:220::o;35712:111::-;35768:16;35804:3;:11;;35797:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35712:111;;;:::o;21910:716::-;22334:23;22360:69;22388:4;22360:69;;;;;;;;;;;;;;;;;22368:5;-1:-1:-1;;;;;22360:27:0;;;:69;;;;;:::i;:::-;22444:17;;22334:95;;-1:-1:-1;22444:21:0;22440:179;;22541:10;22530:30;;;;;;;;;;;;:::i;:::-;22522:85;;;;-1:-1:-1;;;22522:85:0;;17199:2:1;22522:85:0;;;17181:21:1;17238:2;17218:18;;;17211:30;17277:34;17257:18;;;17250:62;-1:-1:-1;;;17328:18:1;;;17321:40;17378:19;;22522:85:0;16997:406:1;66882:277:0;67075:11;;66963:14;67015:17;;;:9;:17;;;;;66963:14;;67075:11;66963:14;67033:27;67025:6;67054:5;67033:12;:27::i;:::-;-1:-1:-1;;;;;67015:46:0;;;;;;;;;;;;-1:-1:-1;67015:46:0;:56;;;66997:74;;:15;:74;:::i;:::-;:89;;:154;;;;-1:-1:-1;67109:1:0;67099:12;;;;:9;:12;;-1:-1:-1;;;;;;;;;;;67099:12:0;67112:27;67125:6;67133:5;67112:12;:27::i;:::-;-1:-1:-1;;;;;67099:41:0;;;;;;;;;;;;-1:-1:-1;67099:41:0;:52;;;;66882:277;-1:-1:-1;;;66882:277:0:o;53620:903::-;53694:18;53715:27;53728:6;53736:5;53715:12;:27::i;:::-;53753:21;53777:17;;;:9;:17;;;;;;;;-1:-1:-1;;;;;53777:29:0;;;;;;;;;53842:16;;;:8;:16;;;;;;53694:48;;-1:-1:-1;53777:29:0;53869:41;53787:6;53694:48;53869:21;:41::i;:::-;53946:19;;;;53989:1;53979:11;;53976:104;;;54006:62;54029:22;54042:1;54045:5;54029:12;:22::i;54006:62::-;;53976:104;-1:-1:-1;;;;;54124:24:0;;:12;:24;;;-1:-1:-1;;;;;;;;;;;54124:12:0;:24;:12;:24;;:31;;;:51;;54160:14;54124:35;:51::i;:::-;-1:-1:-1;;;;;54090:24:0;;:12;:24;;;-1:-1:-1;;;;;;;;;;;54090:12:0;:24;;;:12;:24;;:31;;:85;;;;54100:1;54212:11;;:8;:11;;-1:-1:-1;;;;;;;;;;;54212:23:0;:43;;54240:14;54212:27;:43::i;:::-;54195:1;54186:11;;:8;:11;;-1:-1:-1;;;;;;;;;;;54186:69:0;54280:11;;:31;;54296:14;54280:15;:31::i;:::-;54266:11;:45;54327:38;;;-1:-1:-1;;;;;5095:32:1;;5077:51;;5159:2;5144:18;;5137:34;;;54327:38:0;;5050:18:1;54327:38:0;;;;;;;54398:1;54376:19;;;:23;54427:15;54410:14;;;;:32;;;;54487:17;;;54471:11;;;;:44;;54510:4;;54471:34;;:15;:34::i;:44::-;54453:4;:15;;:62;;;;53683:840;;;;53620:903;;:::o;32268:414::-;32331:4;34461:19;;;:12;;;:19;;;;;;32348:327;;-1:-1:-1;32391:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;32574:18;;32552:19;;;:12;;;:19;;;;;;:40;;;;32607:11;;32348:327;-1:-1:-1;32658:5:0;32651:12;;32858:1420;32924:4;33063:19;;;:12;;;:19;;;;;;33099:15;;33095:1176;;33474:21;33498:14;33511:1;33498:10;:14;:::i;:::-;33547:18;;33474:38;;-1:-1:-1;33527:17:0;;33547:22;;33568:1;;33547:22;:::i;:::-;33527:42;;33603:13;33590:9;:26;33586:405;;33637:17;33657:3;:11;;33669:9;33657:22;;;;;;;;:::i;:::-;;;;;;;;;33637:42;;33811:9;33782:3;:11;;33794:13;33782:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;33896:23;;;:12;;;:23;;;;;:36;;;33586:405;34072:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34167:3;:12;;:19;34180:5;34167:19;;;;;;;;;;;34160:26;;;34210:4;34203:11;;;;;;;33095:1176;34254:5;34247:12;;;;;14286:229;14423:12;14455:52;14477:6;14485:4;14491:1;14494:12;14455:21;:52::i;:::-;14448:59;14286:229;-1:-1:-1;;;;14286:229:0:o;67586:273::-;67662:22;67734:20;;;:12;:20;;;;;67782:37;67734:20;67813:5;67782:30;:37::i;52789:823::-;52876:21;52900:17;;;:9;:17;;;;;;;;-1:-1:-1;;;;;52900:29:0;;;;;;;;;52965:16;;;:8;:16;;;;;;52998:11;;:15;52994:374;;53030:18;53051:60;53090:5;:20;;;53051:34;53060:15;53077:7;;53051:8;:34::i;:60::-;53030:81;;53126:14;53143:32;53158:5;:16;;;53143:10;:14;;:32;;;;:::i;:::-;53126:49;;53210:55;53232:32;53247:5;:16;;;53232:10;:14;;:32;;;;:::i;:::-;53210:17;;;;;:21;:55::i;:::-;53190:17;;;:75;53343:11;;53300:56;;53322:33;;:16;:6;53333:4;53322:10;:16::i;53300:56::-;53280:17;;;:76;-1:-1:-1;;52994:374:0;53401:34;53410:15;53427:7;;53401:8;:34::i;:::-;53378:5;:20;;:57;;;;53456:15;53474:65;53523:4;:15;;;53474:44;53513:4;53474:34;53490:5;:17;;;53474:4;:11;;;:15;;:34;;;;:::i;:65::-;53572:19;;;;53456:83;;-1:-1:-1;53572:32:0;;53456:83;53572:23;:32::i;:::-;53550:4;:19;;:54;;;;52865:747;;;52789:823;;:::o;15406:510::-;15576:12;15634:5;15609:21;:30;;15601:81;;;;-1:-1:-1;;;15601:81:0;;12226:2:1;15601:81:0;;;12208:21:1;12265:2;12245:18;;;12238:30;12304:34;12284:18;;;12277:62;-1:-1:-1;;;12355:18:1;;;12348:36;12401:19;;15601:81:0;12024:402:1;15601:81:0;-1:-1:-1;;;;;11836:19:0;;;15693:60;;;;-1:-1:-1;;;15693:60:0;;15938:2:1;15693:60:0;;;15920:21:1;15977:2;15957:18;;;15950:30;16016:31;15996:18;;;15989:59;16065:18;;15693:60:0;15736:353:1;15693:60:0;15767:12;15781:23;15808:6;-1:-1:-1;;;;;15808:11:0;15827:5;15834:4;15808:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15766:73;;;;15857:51;15874:7;15883:10;15895:12;15857:16;:51::i;:::-;15850:58;15406:510;-1:-1:-1;;;;;;;15406:510:0:o;39649:158::-;39723:7;39774:22;39778:3;39790:5;39774:3;:22::i;18092:712::-;18242:12;18271:7;18267:530;;;-1:-1:-1;18302:10:0;18295:17;;18267:530;18416:17;;:21;18412:374;;18614:10;18608:17;18675:15;18662:10;18658:2;18654:19;18647:44;18412:374;18757:12;18750:20;;-1:-1:-1;;;18750:20:0;;;;;;;;:::i;35042:120::-;35109:7;35136:3;:11;;35148:5;35136:18;;;;;;;;:::i;:::-;;;;;;;;;35129:25;;35042:120;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:245::-;333:6;386:2;374:9;365:7;361:23;357:32;354:52;;;402:1;399;392:12;354:52;434:9;428:16;453:28;475:5;453:28;:::i;516:1006::-;630:6;638;646;699:3;687:9;678:7;674:23;670:33;667:53;;;716:1;713;706:12;667:53;755:9;742:23;774:31;799:5;774:31;:::i;:::-;824:5;-1:-1:-1;848:2:1;882:18;;;869:32;;-1:-1:-1;939:2:1;924:18;;920:32;-1:-1:-1;910:60:1;;966:1;963;956:12;910:60;999:2;993:9;1041:3;1033:6;1029:16;1111:6;1099:10;1096:22;1075:18;1063:10;1060:34;1057:62;1054:88;;;1122:18;;:::i;:::-;1162:10;1158:2;1151:22;;1193:6;1234:2;1223:9;1219:18;1273:7;1267:3;1256:9;1252:19;1249:32;1246:52;;;1294:1;1291;1284:12;1246:52;1316:1;1326:165;1340:4;1337:1;1334:11;1326:165;;;1399:17;;1387:30;;1437:12;;;;1469;;;;1360:1;1353:9;1326:165;;;1330:3;;;1510:6;1500:16;;;;516:1006;;;;;:::o;1527:180::-;1586:6;1639:2;1627:9;1618:7;1614:23;1610:32;1607:52;;;1655:1;1652;1645:12;1607:52;-1:-1:-1;1678:23:1;;1527:180;-1:-1:-1;1527:180:1:o;1712:184::-;1782:6;1835:2;1823:9;1814:7;1810:23;1806:32;1803:52;;;1851:1;1848;1841:12;1803:52;-1:-1:-1;1874:16:1;;1712:184;-1:-1:-1;1712:184:1:o;1901:315::-;1969:6;1977;2030:2;2018:9;2009:7;2005:23;2001:32;1998:52;;;2046:1;2043;2036:12;1998:52;2082:9;2069:23;2059:33;;2142:2;2131:9;2127:18;2114:32;2155:31;2180:5;2155:31;:::i;:::-;2205:5;2195:15;;;1901:315;;;;;:::o;2221:248::-;2289:6;2297;2350:2;2338:9;2329:7;2325:23;2321:32;2318:52;;;2366:1;2363;2356:12;2318:52;-1:-1:-1;;2389:23:1;;;2459:2;2444:18;;;2431:32;;-1:-1:-1;2221:248:1:o;2474:446::-;2557:6;2565;2573;2581;2634:3;2622:9;2613:7;2609:23;2605:33;2602:53;;;2651:1;2648;2641:12;2602:53;2687:9;2674:23;2664:33;;2744:2;2733:9;2729:18;2716:32;2706:42;;2798:2;2787:9;2783:18;2770:32;2811:28;2833:5;2811:28;:::i;:::-;2474:446;;;;-1:-1:-1;2858:5:1;;2910:2;2895:18;2882:32;;-1:-1:-1;;2474:446:1:o;2925:316::-;3002:6;3010;3018;3071:2;3059:9;3050:7;3046:23;3042:32;3039:52;;;3087:1;3084;3077:12;3039:52;-1:-1:-1;;3110:23:1;;;3180:2;3165:18;;3152:32;;-1:-1:-1;3231:2:1;3216:18;;;3203:32;;2925:316;-1:-1:-1;2925:316:1:o;3246:454::-;3341:6;3349;3357;3365;3373;3426:3;3414:9;3405:7;3401:23;3397:33;3394:53;;;3443:1;3440;3433:12;3394:53;-1:-1:-1;;3466:23:1;;;3536:2;3521:18;;3508:32;;-1:-1:-1;3587:2:1;3572:18;;3559:32;;3638:2;3623:18;;3610:32;;-1:-1:-1;3689:3:1;3674:19;3661:33;;-1:-1:-1;3246:454:1;-1:-1:-1;3246:454:1:o;3705:326::-;3798:5;3821:1;3831:194;3845:4;3842:1;3839:11;3831:194;;;3904:13;;3892:26;;3941:4;3965:12;;;;4000:15;;;;3865:1;3858:9;3831:194;;4036:274;4165:3;4203:6;4197:13;4219:53;4265:6;4260:3;4253:4;4245:6;4241:17;4219:53;:::i;:::-;4288:16;;;;;4036:274;-1:-1:-1;;4036:274:1:o;5182:353::-;-1:-1:-1;;;;;5410:32:1;;;;5392:51;;5474:2;5459:18;;5452:34;;;;5517:2;5502:18;;5495:34;5380:2;5365:18;;5182:353::o;5890:658::-;6061:2;6113:21;;;6183:13;;6086:18;;;6205:22;;;6032:4;;6061:2;6284:15;;;;6258:2;6243:18;;;6032:4;6327:195;6341:6;6338:1;6335:13;6327:195;;;6406:13;;-1:-1:-1;;;;;6402:39:1;6390:52;;6497:15;;;;6462:12;;;;6438:1;6356:9;6327:195;;;-1:-1:-1;6539:3:1;;5890:658;-1:-1:-1;;;;;;5890:658:1:o;6553:242::-;6733:3;6718:19;;6746:43;6722:9;6771:6;6746:43;:::i;6800:378::-;7054:3;7039:19;;7067:43;7043:9;7092:6;7067:43;:::i;:::-;7119:53;7167:3;7156:9;7152:19;7144:6;7119:53;:::i;9251:383::-;9400:2;9389:9;9382:21;9363:4;9432:6;9426:13;9475:6;9470:2;9459:9;9455:18;9448:34;9491:66;9550:6;9545:2;9534:9;9530:18;9525:2;9517:6;9513:15;9491:66;:::i;:::-;9618:2;9597:15;-1:-1:-1;;9593:29:1;9578:45;;;;9625:2;9574:54;;9251:383;-1:-1:-1;;9251:383:1:o;10391:399::-;10593:2;10575:21;;;10632:2;10612:18;;;10605:30;10671:34;10666:2;10651:18;;10644:62;-1:-1:-1;;;10737:2:1;10722:18;;10715:33;10780:3;10765:19;;10391:399::o;13451:416::-;13653:2;13635:21;;;13692:2;13672:18;;;13665:30;13731:34;13726:2;13711:18;;13704:62;-1:-1:-1;;;13797:2:1;13782:18;;13775:50;13857:3;13842:19;;13451:416::o;14208:397::-;14410:2;14392:21;;;14449:2;14429:18;;;14422:30;14488:34;14483:2;14468:18;;14461:62;-1:-1:-1;;;14554:2:1;14539:18;;14532:31;14595:3;14580:19;;14208:397::o;14610:356::-;14812:2;14794:21;;;14831:18;;;14824:30;14890:34;14885:2;14870:18;;14863:62;14957:2;14942:18;;14610:356::o;17885:421::-;18087:2;18069:21;;;18126:2;18106:18;;;18099:30;18165:34;18160:2;18145:18;;18138:62;18236:27;18231:2;18216:18;;18209:55;18296:3;18281:19;;17885:421::o;18311:355::-;18513:2;18495:21;;;18552:2;18532:18;;;18525:30;18591:33;18586:2;18571:18;;18564:61;18657:2;18642:18;;18311:355::o;20274:128::-;20314:3;20345:1;20341:6;20338:1;20335:13;20332:39;;;20351:18;;:::i;:::-;-1:-1:-1;20387:9:1;;20274:128::o;20407:217::-;20447:1;20473;20463:132;;20517:10;20512:3;20508:20;20505:1;20498:31;20552:4;20549:1;20542:15;20580:4;20577:1;20570:15;20463:132;-1:-1:-1;20609:9:1;;20407:217::o;20629:168::-;20669:7;20735:1;20731;20727:6;20723:14;20720:1;20717:21;20712:1;20705:9;20698:17;20694:45;20691:71;;;20742:18;;:::i;:::-;-1:-1:-1;20782:9:1;;20629:168::o;20802:125::-;20842:4;20870:1;20867;20864:8;20861:34;;;20875:18;;:::i;:::-;-1:-1:-1;20912:9:1;;20802:125::o;20932:258::-;21004:1;21014:113;21028:6;21025:1;21022:13;21014:113;;;21104:11;;;21098:18;21085:11;;;21078:39;21050:2;21043:10;21014:113;;;21145:6;21142:1;21139:13;21136:48;;;-1:-1:-1;;21180:1:1;21162:16;;21155:27;20932:258::o;21195:136::-;21234:3;21262:5;21252:39;;21271:18;;:::i;:::-;-1:-1:-1;;;21307:18:1;;21195:136::o;21336:135::-;21375:3;-1:-1:-1;;21396:17:1;;21393:43;;;21416:18;;:::i;:::-;-1:-1:-1;21463:1:1;21452:13;;21336:135::o;21476:127::-;21537:10;21532:3;21528:20;21525:1;21518:31;21568:4;21565:1;21558:15;21592:4;21589:1;21582:15;21608:127;21669:10;21664:3;21660:20;21657:1;21650:31;21700:4;21697:1;21690:15;21724:4;21721:1;21714:15;21740:127;21801:10;21796:3;21792:20;21789:1;21782:31;21832:4;21829:1;21822:15;21856:4;21853:1;21846:15;21872:127;21933:10;21928:3;21924:20;21921:1;21914:31;21964:4;21961:1;21954:15;21988:4;21985:1;21978:15;22004:131;-1:-1:-1;;;;;22079:31:1;;22069:42;;22059:70;;22125:1;22122;22115:12;22140:118;22226:5;22219:13;22212:21;22205:5;22202:32;22192:60;;22248:1;22245;22238:12
Swarm Source
ipfs://0886e402c1336a6b9bd2d5446e966af60ba6104fcc54b9bbc0564200e3d7c393
Loading...
Loading
Loading...
Loading
Net Worth in USD
$192.16
Net Worth in ETH
0.091583
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,098.16 | 0.0916 | $192.16 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.