Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,048 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 15436454 | 851 days ago | IN | 0 ETH | 0.00738992 | ||||
Unstake | 15265265 | 878 days ago | IN | 0 ETH | 0.04554818 | ||||
Unstake | 15199176 | 889 days ago | IN | 0 ETH | 0.01012152 | ||||
Unstake | 15198339 | 889 days ago | IN | 0 ETH | 0.00076958 | ||||
Unstake | 15175299 | 892 days ago | IN | 0 ETH | 0.00600195 | ||||
Unstake | 15160951 | 895 days ago | IN | 0 ETH | 0.01333665 | ||||
Unstake | 15102122 | 904 days ago | IN | 0 ETH | 0.06014762 | ||||
Unstake | 15062614 | 910 days ago | IN | 0 ETH | 0.02850096 | ||||
Unstake | 15024078 | 917 days ago | IN | 0 ETH | 0.01950137 | ||||
Unstake | 14825283 | 950 days ago | IN | 0 ETH | 0.01264567 | ||||
Unstake | 14812725 | 952 days ago | IN | 0 ETH | 0.09211892 | ||||
Unstake | 14787898 | 956 days ago | IN | 0 ETH | 0.06024399 | ||||
Unstake | 14771569 | 959 days ago | IN | 0 ETH | 0.01721524 | ||||
Unstake | 14662248 | 976 days ago | IN | 0 ETH | 0.04948217 | ||||
Unstake | 14662218 | 976 days ago | IN | 0 ETH | 0.00675018 | ||||
Unstake | 14655948 | 977 days ago | IN | 0 ETH | 0.13245131 | ||||
Unstake | 14635124 | 981 days ago | IN | 0 ETH | 0.02893309 | ||||
Unstake | 14599252 | 986 days ago | IN | 0 ETH | 0.03311352 | ||||
Unstake | 14557889 | 993 days ago | IN | 0 ETH | 0.03212041 | ||||
Unstake | 14545930 | 995 days ago | IN | 0 ETH | 0.09601839 | ||||
Unstake | 14540437 | 995 days ago | IN | 0 ETH | 0.0104879 | ||||
Unstake | 14497059 | 1002 days ago | IN | 0 ETH | 0.00997363 | ||||
Unstake | 14491907 | 1003 days ago | IN | 0 ETH | 0.00374713 | ||||
Unstake | 14491893 | 1003 days ago | IN | 0 ETH | 0.07036552 | ||||
Unstake | 14479355 | 1005 days ago | IN | 0 ETH | 0.06036342 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
NRGYMarketMaker
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-04 */ // File: node_modules\@openzeppelin\contracts\token\ERC20\IERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: node_modules\@openzeppelin\contracts\math\SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: node_modules\@openzeppelin\contracts\utils\Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin\contracts\token\ERC20\SafeERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: node_modules\@openzeppelin\contracts\GSN\Context.sol pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: node_modules\@openzeppelin\contracts\token\ERC20\ERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: @openzeppelin\contracts\token\ERC20\ERC20Burnable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { using SafeMath for uint256; /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance"); _approve(account, _msgSender(), decreasedAllowance); _burn(account, amount); } } // File: contracts\ENERGY.sol pragma solidity 0.7.6; contract ENERGY is ERC20Burnable { using SafeMath for uint256; uint256 public constant initialSupply = 89099136 * 10 ** 3; uint256 public lastWeekTime; uint256 public weekCount; //staking start when week count set to 1 -> rewards calculated before just updating week uint256 public constant totalWeeks = 100; address public stakingContrAddr; address public liquidityContrAddr; uint256 public constant timeStep = 1 weeks; modifier onlyStaking() { require(_msgSender() == stakingContrAddr, "Not staking contract"); _; } constructor (address _liquidityContrAddr) ERC20("ENERGY", "NRGY") { //89099.136 coins _setupDecimals(6); lastWeekTime = block.timestamp; liquidityContrAddr = _liquidityContrAddr; _mint(_msgSender(), initialSupply.mul(4).div(10)); //40% _mint(liquidityContrAddr, initialSupply.mul(6).div(10)); //60% } function mintNewCoins(uint256[3] memory lastWeekRewards) public onlyStaking returns(bool) { if(weekCount >= 1) { uint256 newMint = lastWeekRewards[0].add(lastWeekRewards[1]).add(lastWeekRewards[2]); uint256 liquidityMint = (newMint.mul(20)).div(100); _mint(liquidityContrAddr, liquidityMint); _mint(stakingContrAddr, newMint); } else { _mint(liquidityContrAddr, initialSupply); } return true; } //updates only at end of week function updateWeek() public onlyStaking { weekCount++; lastWeekTime = block.timestamp; } function updateStakingContract(address _stakingContrAddr) public { require(stakingContrAddr == address(0), "Staking contract is already set"); stakingContrAddr = _stakingContrAddr; } function burnOnUnstake(address account, uint256 amount) public onlyStaking { _burn(account, amount); } function getLastWeekUpdateTime() public view returns(uint256) { return lastWeekTime; } function isMintingCompleted() public view returns(bool) { if(weekCount > totalWeeks) { return true; } else { return false; } } function isGreaterThanAWeek() public view returns(bool) { if(block.timestamp > getLastWeekUpdateTime().add(timeStep)) { return true; } else { return false; } } } // File: contracts\NRGYMarketMaker.sol pragma solidity 0.7.6; contract NRGYMarketMaker { using SafeERC20 for IERC20; using SafeMath for uint256; struct UserData { address user; bool isActive; uint256 rewards; uint256 feeRewards; uint256 depositTime; uint256 share; //update when user came first time or after unstaking to stake uint256 startedWeek; //update everytime whenever user comes to unstake uint256 endedWeek; mapping(uint256 => uint256) shareByWeekNo; } struct FeeRewardData { uint256 value; uint256 timeStamp; uint256 totalStakersAtThatTime; uint256 weekGiven; mapping(address => bool) isClaimed; } ENERGY public energy; IERC20 public lpToken; uint256 public totalShares; //initially it will be 27000 uint256[] public stakingLimit; uint256 public constant minStakeForFeeRewards = 25 * 10 ** 6; uint256 public totalRewards; uint256 public totalFeeRewards; uint256 public rewardsAvailableInContract; uint256 public feeRewardsAvailableInContract; uint256 public feeRewardsCount; uint256 public totalStakeUsers; uint256 public constant percentageDivider = 100; //10%, 30%, 60% uint256[3] private rewardPercentages = [10, 30, 60]; //7.5% uint256 public constant unstakeFees = 75; //total weeks uint256 public totalWeeks; //user informations mapping(uint256 => address) public userList; mapping(address => UserData) public userInfo; mapping (address => bool) public smartContractStakers; //contract info mapping(uint256 => uint256) private stakePerWeek; mapping(uint256 => uint256) private totalSharesByWeek; mapping(uint256 => uint256[3]) private rewardByWeek; mapping(uint256 => FeeRewardData) private feeRewardData; event Staked(address indexed _user, uint256 _amountStaked, uint256 _balanceOf); event Withdrawn(address indexed _user, uint256 _amountTransferred, uint256 _amountUnstaked, uint256 _shareDeducted, uint256 _rewardsDeducted, uint256 _feeRewardsDeducted); event RewardDistributed(uint256 _weekNo, uint256[3] _lastWeekRewards); event FeeRewardDistributed(uint256 _amount, uint256 _totalFeeRewards); constructor(address _energy) { energy = ENERGY(_energy); lpToken = IERC20(_energy); totalWeeks = energy.totalWeeks(); stakingLimit.push(27000 * 10 ** 6); } // stake the coins function stake(uint256 amount) public { _stake(amount, tx.origin); } function stakeOnBehalf(uint256 amount, address _who) public { _stake(amount, _who); } function _stake(uint256 _amount, address _who) internal { uint256 _weekCount = energy.weekCount(); bool isWeekOver = energy.isGreaterThanAWeek(); if((_weekCount >= 1 && !isWeekOver) || _weekCount == 0) { require(!isStakingLimitReached(_amount, _weekCount), "Stake limit has been reached"); } //if week over or week is 0 if(!isWeekOver || _weekCount == 0) { //add current week stake stakePerWeek[_weekCount] = getStakeByWeekNo(_weekCount).add(_amount); // update current week cumulative stake //store total shares by week no at time of stake totalSharesByWeek[_weekCount] = totalShares.add(_amount); userInfo[_who].shareByWeekNo[_weekCount] = getUserShareByWeekNo(_who, _weekCount).add(_amount); //if current week share is 0 get share for previous week if(_weekCount == 0) { if(stakingLimit[0] == totalShares.add(_amount)) { setStakingLimit(_weekCount, stakingLimit[0]); energy.mintNewCoins(getRewardsByWeekNo(0)); energy.updateWeek(); } } } else/*is week is greater than 1 and is over */ { //update this week shae by adding previous week share userInfo[_who].shareByWeekNo[_weekCount.add(1)] = getUserShareByWeekNo(_who, _weekCount).add(_amount); //update next week stake stakePerWeek[_weekCount.add(1)] = getStakeByWeekNo(_weekCount.add(1)).add(_amount); //update next week cumulative stake //store total shares of next week no at time of stake totalSharesByWeek[_weekCount.add(1)] = totalShares.add(_amount); setStakingLimit(_weekCount, totalShares); energy.updateWeek(); //if week over update followings and greater than 1 /*give rewards only after week end and till 3 more weeks of total weeks */ if(_weekCount <= totalWeeks.add(3)) { //store rewards generated that week by week no at end of week //eg: when week 1 is over, it will store rewards generated that week before week changed from 1 to 2 setRewards(_weekCount); uint256 rewardDistributed = (rewardByWeek[_weekCount][0]) .add(rewardByWeek[_weekCount][1]) .add(rewardByWeek[_weekCount][2]); totalRewards = totalRewards.add(rewardDistributed); energy.mintNewCoins(getRewardsByWeekNo(_weekCount)); rewardsAvailableInContract = rewardsAvailableInContract.add(rewardDistributed); emit RewardDistributed(_weekCount, getRewardsByWeekNo(_weekCount)); } } //if user not active, set current week as his start week if(!getUserStatus(_who)) { userInfo[_who].isActive = true; if(getUserShare(_who) < minStakeForFeeRewards) { userInfo[_who].startedWeek = _weekCount; userInfo[_who].depositTime = block.timestamp; } } if(!isUserPreviouslyStaked(_who)) { userList[totalStakeUsers] = _who; totalStakeUsers++; smartContractStakers[_who] = true; userInfo[_who].user = _who; } userInfo[_who].share = userInfo[_who].share.add(_amount); //update total shares in the end totalShares = totalShares.add(_amount); //if-> user is directly staking if(msg.sender == tx.origin) { // now we can issue shares lpToken.safeTransferFrom(_who, address(this), _amount); } else /*through liquity contract */ { // now we can issue shares //transfer from liquidty contract lpToken.safeTransferFrom(msg.sender, address(this), _amount); } emit Staked(_who, _amount, claimedBalanceOf(_who)); } function setStakingLimit(uint256 _weekCount, uint256 _share) internal { uint256 lastWeekStakingLeft = stakingLimit[_weekCount].sub(getStakeByWeekNo(_weekCount)); // first 4 weeks are: 0,1,2,3 if(_weekCount <= 3) { //32% stakingLimit.push((_share.mul(32)).div(percentageDivider)); } if(_weekCount > 3) { //0.04% stakingLimit.push((_share.mul(4)).div(percentageDivider)); } stakingLimit[_weekCount.add(1)] = stakingLimit[_weekCount.add(1)].add(lastWeekStakingLeft); } function setRewards(uint256 _weekCount) internal { (rewardByWeek[_weekCount][0], rewardByWeek[_weekCount][1], rewardByWeek[_weekCount][2]) = calculateRewardsByWeekCount(_weekCount); } function calculateRewards() public view returns(uint256 _lastWeekReward, uint256 _secondLastWeekReward, uint256 _thirdLastWeekReward) { return calculateRewardsByWeekCount(energy.weekCount()); } function calculateRewardsByWeekCount(uint256 _weekCount) public view returns(uint256 _lastWeekReward, uint256 _secondLastWeekReward, uint256 _thirdLastWeekReward) { bool isLastWeek = (_weekCount >= totalWeeks); if(isLastWeek) { if(_weekCount.sub(totalWeeks) == 0) { _lastWeekReward = (getStakeByWeekNo(_weekCount).mul(rewardPercentages[0])).div(percentageDivider); _secondLastWeekReward = (getStakeByWeekNo(_weekCount.sub(1)).mul(rewardPercentages[1])).div(percentageDivider); _thirdLastWeekReward = (getStakeByWeekNo(_weekCount.sub(2)).mul(rewardPercentages[2])).div(percentageDivider); } else if(_weekCount.sub(totalWeeks) == 1) { _secondLastWeekReward = (getStakeByWeekNo(_weekCount.sub(1)).mul(rewardPercentages[1])).div(percentageDivider); _thirdLastWeekReward = (getStakeByWeekNo(_weekCount.sub(2)).mul(rewardPercentages[2])).div(percentageDivider); } else if(_weekCount.sub(totalWeeks) == 2) { _thirdLastWeekReward = (getStakeByWeekNo(_weekCount.sub(2)).mul(rewardPercentages[2])).div(percentageDivider); } } else { if(_weekCount == 1) { _lastWeekReward = (getStakeByWeekNo(_weekCount).mul(rewardPercentages[0])).div(percentageDivider); } else if(_weekCount == 2) { _lastWeekReward = (getStakeByWeekNo(_weekCount).mul(rewardPercentages[0])).div(percentageDivider); _secondLastWeekReward = (getStakeByWeekNo(_weekCount.sub(1)).mul(rewardPercentages[1])).div(percentageDivider); } else if(_weekCount >= 3) { _lastWeekReward = (getStakeByWeekNo(_weekCount).mul(rewardPercentages[0])).div(percentageDivider); _secondLastWeekReward = (getStakeByWeekNo(_weekCount.sub(1)).mul(rewardPercentages[1])).div(percentageDivider); _thirdLastWeekReward = (getStakeByWeekNo(_weekCount.sub(2)).mul(rewardPercentages[2])).div(percentageDivider); } } } function isStakingLimitReached(uint256 _amount, uint256 _weekCount) public view returns(bool) { return (getStakeByWeekNo(_weekCount).add(_amount) > stakingLimit[_weekCount]); } function remainingStakingLimit(uint256 _weekCount) public view returns(uint256) { return (stakingLimit[_weekCount].sub(getStakeByWeekNo(_weekCount))); } function distributeFees(uint256 _amount) public { uint256 _weekCount = energy.weekCount(); FeeRewardData storage _feeRewardData = feeRewardData[feeRewardsCount]; _feeRewardData.value = _amount; _feeRewardData.timeStamp = block.timestamp; _feeRewardData.totalStakersAtThatTime = totalStakeUsers; _feeRewardData.weekGiven = _weekCount; feeRewardsCount++; totalFeeRewards = totalFeeRewards.add(_amount); feeRewardsAvailableInContract = feeRewardsAvailableInContract.add(_amount); lpToken.safeTransferFrom(msg.sender, address(this), _amount); emit FeeRewardDistributed(_amount, totalFeeRewards); } ///unstake the coins function unstake(uint256 _amount) public { UserData storage _user = userInfo[msg.sender]; uint256 _weekCount = energy.weekCount(); //get user rewards till date(week) and add to claimed rewards userInfo[msg.sender].rewards = _user.rewards .add(getUserRewardsByWeekNo(msg.sender, _weekCount)); //get user fee rewards till date(week) and add to claimed fee rewards userInfo[msg.sender].feeRewards = _user.feeRewards.add(_calculateFeeRewards(msg.sender)); require(_amount <= claimedBalanceOf(msg.sender), "Unstake amount is greater than user balance"); //calculate unstake fee uint256 _fees = (_amount.mul(unstakeFees)).div(1000); //calulcate amount to transfer to user uint256 _toTransfer = _amount.sub(_fees); //burn unstake fees energy.burnOnUnstake(address(this), _fees); lpToken.safeTransfer(msg.sender, _toTransfer); //if amount can be paid from rewards if(_amount <= getUserTotalRewards(msg.sender)) { //if amount can be paid from rewards if(_user.rewards >= _amount) { _user.rewards = _user.rewards.sub(_amount); rewardsAvailableInContract = rewardsAvailableInContract.sub(_amount); emit Withdrawn(msg.sender, _toTransfer, _amount, 0, _amount, 0); } else/*else take sum of fee rewards and rewards */ { //get remaining amount less than rewards uint256 remAmount = _amount.sub(_user.rewards); rewardsAvailableInContract = rewardsAvailableInContract.sub(_user.rewards); feeRewardsAvailableInContract = feeRewardsAvailableInContract.sub(remAmount); emit Withdrawn(msg.sender, _toTransfer, _amount, 0, _user.rewards, remAmount); //update fee rewards from remaining amount _user.rewards = 0; _user.feeRewards = _user.feeRewards.sub(remAmount); } } else/* take from total shares*/ { //get remaining amount less than rewards uint256 remAmount = _amount.sub(getUserTotalRewards(msg.sender)); rewardsAvailableInContract = rewardsAvailableInContract.sub(_user.rewards); feeRewardsAvailableInContract = feeRewardsAvailableInContract.sub(_user.feeRewards); emit Withdrawn(msg.sender, _toTransfer, _amount, remAmount, _user.rewards, _user.feeRewards); _user.rewards = 0; _user.feeRewards = 0; //update user share from remaining amount _user.share = _user.share.sub(remAmount); //update total shares totalShares = totalShares.sub(remAmount); //update total shares by week no at time of unstake totalSharesByWeek[_weekCount] = totalSharesByWeek[_weekCount].sub(remAmount); } lpToken.safeApprove(address(this), 0); //set user status to false _user.isActive = false; //update user end(unstake) week _user.endedWeek = _weekCount == 0 ? _weekCount : _weekCount.sub(1); } function _calculateFeeRewards(address _who) internal returns(uint256) { uint256 _accumulatedRewards; //check if user have minimum share too claim fee rewards if(getUserShare(_who) >= minStakeForFeeRewards) { //loop through all the rewards for(uint256 i = 0; i < feeRewardsCount; i++) { //if rewards week and timestamp is greater than user deposit time and rewards. //Also only if user has not claimed particular fee rewards if(getUserStartedWeek(_who) <= feeRewardData[i].weekGiven && getUserLastDepositTime(_who) < feeRewardData[i].timeStamp && !feeRewardData[i].isClaimed[_who]) { _accumulatedRewards = _accumulatedRewards.add(feeRewardData[i].value.div(feeRewardData[i].totalStakersAtThatTime)); feeRewardData[i].isClaimed[_who] = true; } } } return _accumulatedRewards; } /* * ------------------Getter inteface for user--------------------- * */ function getUserUnclaimedFeesRewards(address _who) public view returns(uint256) { uint256 _accumulatedRewards; //check if user have minimum share too claim fee rewards if(getUserShare(_who) >= minStakeForFeeRewards) { //loop through all the rewards for(uint256 i = 0; i < feeRewardsCount; i++) { //if rewards week and timestamp is greater than user deposit time and rewards. //Also only if user has not claimed particular fee rewards if(getUserStartedWeek(_who) <= feeRewardData[i].weekGiven && getUserLastDepositTime(_who) < feeRewardData[i].timeStamp && !feeRewardData[i].isClaimed[_who]) { _accumulatedRewards = _accumulatedRewards.add(feeRewardData[i].value.div(feeRewardData[i].totalStakersAtThatTime)); } } } return _accumulatedRewards; } //return rewards till weekcount passed function getUserCurrentRewards(address _who) public view returns(uint256) { uint256 _weekCount = energy.weekCount(); uint256[3] memory thisWeekReward; (thisWeekReward[0], thisWeekReward[1], thisWeekReward[2]) = calculateRewardsByWeekCount(_weekCount); uint256 userShareAtThatWeek = getUserPercentageShareByWeekNo(_who, _weekCount); return getUserRewardsByWeekNo(_who, _weekCount) .add(_calculateRewardByUserShare(thisWeekReward, userShareAtThatWeek)) .add(getUserRewards(_who)); } //return rewards till one week less than the weekcount passed //calculate rewards till previous week and deduct rewards claimed at time of unstake //return rewards available to claim function getUserRewardsByWeekNo(address _who, uint256 _weekCount) public view returns(uint256) { uint256 rewardsAccumulated; uint256 userEndWeek = getUserEndedWeek(_who); //clculate rewards only if user is active or user share is greater than 1 if(getUserStatus(_who) || (getUserShare(_who) > 0)) { for(uint256 i = userEndWeek.add(1); i < _weekCount; i++) { uint256 userShareAtThatWeek = getUserPercentageShareByWeekNo(_who, i); rewardsAccumulated = rewardsAccumulated.add(_calculateRewardByUserShare(getRewardsByWeekNo(i), userShareAtThatWeek)); } } return rewardsAccumulated; } function _calculateRewardByUserShare(uint256[3] memory rewardAtThatWeek, uint256 userShareAtThatWeek) internal pure returns(uint256) { return (((rewardAtThatWeek[0] .add(rewardAtThatWeek[1]) .add(rewardAtThatWeek[2])) .mul(userShareAtThatWeek)) .div(percentageDivider.mul(percentageDivider))); } function getUserPercentageShareByWeekNo(address _who, uint256 _weekCount) public view returns(uint256) { return _getUserPercentageShareByValue(getSharesByWeekNo(_weekCount), getUserShareByWeekNo(_who, _weekCount)); } function _getUserPercentageShareByValue(uint256 _totalShares, uint256 _userShare) internal pure returns(uint256) { if(_totalShares == 0 || _userShare == 0) { return 0; } else { //two times percentageDivider multiplied because of decimal percentage which are less than 1 return (_userShare.mul(percentageDivider.mul(percentageDivider))).div(_totalShares); } } //give sum of share(staked amount) + rewards is user have a claimed it through unstaking function claimedBalanceOf(address _who) public view returns(uint256) { return getUserShare(_who).add(getUserRewards(_who)).add(getUserFeeRewards(_who)); } function getUserRewards(address _who) public view returns(uint256) { return userInfo[_who].rewards; } function getUserFeeRewards(address _who) public view returns(uint256) { return userInfo[_who].feeRewards; } function getUserTotalRewards(address _who) public view returns(uint256) { return userInfo[_who].feeRewards.add(userInfo[_who].rewards); } function getUserShare(address _who) public view returns(uint256) { return userInfo[_who].share; } function getUserShareByWeekNo(address _who, uint256 _weekCount) public view returns(uint256) { if(getUserStatus(_who)) { return (_userShareByWeekNo(_who, _weekCount) > 0 || _weekCount == 0) ? _userShareByWeekNo(_who, _weekCount) : getUserShareByWeekNo(_who, _weekCount.sub(1)); } else if(getUserShare(_who) > 0) { return getUserShare(_who); } return 0; } function _userShareByWeekNo(address _who, uint256 _weekCount) internal view returns(uint256) { return userInfo[_who].shareByWeekNo[_weekCount]; } function getUserStatus(address _who) public view returns(bool) { return userInfo[_who].isActive; } function getUserStartedWeek(address _who) public view returns(uint256) { return userInfo[_who].startedWeek; } function getUserEndedWeek(address _who) public view returns(uint256) { return userInfo[_who].endedWeek; } function getUserLastDepositTime(address _who) public view returns(uint256) { return userInfo[_who].depositTime; } function isUserPreviouslyStaked(address _who) public view returns(bool) { return smartContractStakers[_who]; } function getUserFeeRewardClaimStatus(address _who, uint256 _index) public view returns(bool) { return feeRewardData[_index].isClaimed[_who]; } /* * ------------------Getter inteface for contract--------------------- * */ function getRewardsByWeekNo(uint256 _weekCount) public view returns(uint256[3] memory) { return rewardByWeek[_weekCount]; } function getFeeRewardsByIndex(uint256 _index) public view returns(uint256, uint256, uint256, uint256) { return (feeRewardData[_index].value, feeRewardData[_index].timeStamp, feeRewardData[_index].totalStakersAtThatTime, feeRewardData[_index].weekGiven); } function getRewardPercentages() public view returns(uint256[3] memory) { return rewardPercentages; } function getStakeByWeekNo(uint256 _weekCount) public view returns(uint256) { return stakePerWeek[_weekCount]; } function getSharesByWeekNo(uint256 _weekCount) public view returns(uint256) { return totalSharesByWeek[_weekCount]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_energy","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalFeeRewards","type":"uint256"}],"name":"FeeRewardDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_weekNo","type":"uint256"},{"indexed":false,"internalType":"uint256[3]","name":"_lastWeekRewards","type":"uint256[3]"}],"name":"RewardDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_balanceOf","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountTransferred","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountUnstaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_shareDeducted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rewardsDeducted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_feeRewardsDeducted","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"calculateRewards","outputs":[{"internalType":"uint256","name":"_lastWeekReward","type":"uint256"},{"internalType":"uint256","name":"_secondLastWeekReward","type":"uint256"},{"internalType":"uint256","name":"_thirdLastWeekReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weekCount","type":"uint256"}],"name":"calculateRewardsByWeekCount","outputs":[{"internalType":"uint256","name":"_lastWeekReward","type":"uint256"},{"internalType":"uint256","name":"_secondLastWeekReward","type":"uint256"},{"internalType":"uint256","name":"_thirdLastWeekReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"claimedBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"energy","outputs":[{"internalType":"contract ENERGY","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRewardsAvailableInContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRewardsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getFeeRewardsByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardPercentages","outputs":[{"internalType":"uint256[3]","name":"","type":"uint256[3]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weekCount","type":"uint256"}],"name":"getRewardsByWeekNo","outputs":[{"internalType":"uint256[3]","name":"","type":"uint256[3]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weekCount","type":"uint256"}],"name":"getSharesByWeekNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weekCount","type":"uint256"}],"name":"getStakeByWeekNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"getUserCurrentRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"getUserEndedWeek","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getUserFeeRewardClaimStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"getUserFeeRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"getUserLastDepositTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"},{"internalType":"uint256","name":"_weekCount","type":"uint256"}],"name":"getUserPercentageShareByWeekNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"getUserRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"},{"internalType":"uint256","name":"_weekCount","type":"uint256"}],"name":"getUserRewardsByWeekNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"getUserShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"},{"internalType":"uint256","name":"_weekCount","type":"uint256"}],"name":"getUserShareByWeekNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"getUserStartedWeek","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"getUserStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"getUserTotalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"getUserUnclaimedFeesRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_weekCount","type":"uint256"}],"name":"isStakingLimitReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"isUserPreviouslyStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minStakeForFeeRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentageDivider","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_weekCount","type":"uint256"}],"name":"remainingStakingLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsAvailableInContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"smartContractStakers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_who","type":"address"}],"name":"stakeOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakeUsers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWeeks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"feeRewards","type":"uint256"},{"internalType":"uint256","name":"depositTime","type":"uint256"},{"internalType":"uint256","name":"share","type":"uint256"},{"internalType":"uint256","name":"startedWeek","type":"uint256"},{"internalType":"uint256","name":"endedWeek","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"userList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526040518060600160405280600a60ff168152602001601e60ff168152602001603c60ff16815250600a9060036200003d929190620001e2565b503480156200004b57600080fd5b50604051620046c9380380620046c9833981810160405260208110156200007157600080fd5b8101908080519060200190929190505050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630be081146040518163ffffffff1660e01b815260040160206040518083038186803b1580156200016a57600080fd5b505afa1580156200017f573d6000803e3d6000fd5b505050506040513d60208110156200019657600080fd5b8101908080519060200190929190505050600d819055506003640649534e009080600181540180825580915050600190039060005260206000200160009091909190915055506200024b565b826003810192821562000219579160200282015b8281111562000218578251829060ff16905591602001919060010190620001f6565b5b5090506200022891906200022c565b5090565b5b80821115620002475760008160009055506001016200022d565b5090565b61446e806200025b6000396000f3fe608060405234801561001057600080fd5b50600436106102895760003560e01c80636029bf9f1161015c578063a13a5b82116100ce578063c8de1d5611610087578063c8de1d5614610d2e578063dd31c65a14610d86578063ea0d5dcd14610dc8578063f4e79b3d14610e22578063f7a149a614610e84578063f927babb14610ea257610289565b8063a13a5b8214610ba6578063a694fc3a14610c08578063aa84924414610c36578063aceccf8f14610c6a578063bbbaee4c14610cb8578063bdf320c014610d1057610289565b80637b941f5a116101205780637b941f5a146109bd5780638386bd7b14610a1757806385f83a5714610a6f5780638c209da414610ac657806392fe573614610b085780639f4216e814610b4e57610289565b80636029bf9f14610873578063666c4b5c146108a157806366a0eef7146108f95780636a6dc30b14610951578063797352b81461096f57610289565b806326e516bc116102005780633e50de30116101b95780633e50de301461071b57806340273ed814610747578063460b50881461079f57806351d2a248146108035780635b562879146108215780635fcbd2851461083f57610289565b806326e516bc146105cf5780632e17de78146105ed5780632f7e83971461061b578063340c9a5214610639578063398a0231146106a35780633a98ef39146106fd57610289565b80630be08114116102525780630be081141461041a5780630e15561a146104385780631959a002146104565780631c64f11e146104f75780631e79f0d51461051557806322e4447e1461057757610289565b8062c425701461028e57806305345142146102e657806306fa8ce714610328578063078b0fb7146103805780630a495177146103d8575b600080fd5b6102d0600480360360208110156102a457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ef2565b6040518082815260200191505060405180910390f35b610312600480360360208110156102fc57600080fd5b8101908080359060200190929190505050610f3e565b6040518082815260200191505060405180910390f35b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f5b565b6040518082815260200191505060405180910390f35b6103c26004803603602081101561039657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fa7565b6040518082815260200191505060405180910390f35b610404600480360360208110156103ee57600080fd5b8101908080359060200190929190505050610ff3565b6040518082815260200191505060405180910390f35b610422611010565b6040518082815260200191505060405180910390f35b610440611016565b6040518082815260200191505060405180910390f35b6104986004803603602081101561046c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061101c565b604051808973ffffffffffffffffffffffffffffffffffffffff16815260200188151581526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b6104ff611091565b6040518082815260200191505060405180910390f35b6105616004803603604081101561052b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611097565b6040518082815260200191505060405180910390f35b6105b96004803603602081101561058d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611123565b6040518082815260200191505060405180910390f35b6105d761126c565b6040518082815260200191505060405180910390f35b6106196004803603602081101561060357600080fd5b8101908080359060200190929190505050611272565b005b61062361197e565b6040518082815260200191505060405180910390f35b6106656004803603602081101561064f57600080fd5b8101908080359060200190929190505050611984565b6040518082600360200280838360005b83811015610690578082015181840152602081019050610675565b5050505090500191505060405180910390f35b6106e5600480360360208110156106b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119e2565b60405180821515815260200191505060405180910390f35b610705611a02565b6040518082815260200191505060405180910390f35b610723611a08565b60405180848152602001838152602001828152602001935050505060405180910390f35b6107896004803603602081101561075d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ac1565b6040518082815260200191505060405180910390f35b6107eb600480360360408110156107b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b0d565b60405180821515815260200191505060405180910390f35b61080b611b78565b6040518082815260200191505060405180910390f35b610829611b7d565b6040518082815260200191505060405180910390f35b610847611b82565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61089f6004803603602081101561088957600080fd5b8101908080359060200190929190505050611ba8565b005b6108e3600480360360208110156108b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d6a565b6040518082815260200191505060405180910390f35b61093b6004803603602081101561090f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e0a565b6040518082815260200191505060405180910390f35b610959611e56565b6040518082815260200191505060405180910390f35b6109a56004803603604081101561098557600080fd5b810190808035906020019092919080359060200190929190505050611e5e565b60405180821515815260200191505060405180910390f35b6109ff600480360360208110156109d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e9c565b60405180821515815260200191505060405180910390f35b610a5960048036036020811015610a2d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ef2565b6040518082815260200191505060405180910390f35b610a9b60048036036020811015610a8557600080fd5b8101908080359060200190929190505050612042565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610af260048036036020811015610adc57600080fd5b81019080803590602001909291905050506120b3565b6040518082815260200191505060405180910390f35b610b106120ee565b6040518082600360200280838360005b83811015610b3b578082015181840152602081019050610b20565b5050505090500191505060405180910390f35b610b7a60048036036020811015610b6457600080fd5b8101908080359060200190929190505050612139565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610bf260048036036040811015610bbc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061216c565b6040518082815260200191505060405180910390f35b610c3460048036036020811015610c1e57600080fd5b810190808035906020019092919050505061220d565b005b610c3e61221a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610cb660048036036040811015610c8057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061223e565b005b610cfa60048036036020811015610cce57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061224c565b6040518082815260200191505060405180910390f35b610d18612298565b6040518082815260200191505060405180910390f35b610d7060048036036020811015610d4457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061229e565b6040518082815260200191505060405180910390f35b610db260048036036020811015610d9c57600080fd5b81019080803590602001909291905050506122e4565b6040518082815260200191505060405180910390f35b610e0a60048036036020811015610dde57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612308565b60405180821515815260200191505060405180910390f35b610e6e60048036036040811015610e3857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612361565b6040518082815260200191505060405180910390f35b610e8c612386565b6040518082815260200191505060405180910390f35b610ece60048036036020811015610eb857600080fd5b810190808035906020019092919050505061238c565b60405180848152602001838152602001828152602001935050505060405180910390f35b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301549050919050565b600060116000838152602001908152602001600020549050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501549050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b600060126000838152602001908152602001600020549050919050565b600d5481565b60045481565b600f6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060010154908060020154908060030154908060040154908060050154908060060154905088565b60065481565b60006110a283612308565b156110f75760006110b384846127c5565b11806110bf5750600082145b6110e5576110e0836110db60018561282390919063ffffffff16565b611097565b6110f0565b6110ef83836127c5565b5b905061111d565b60006111028461224c565b1115611118576111118361224c565b905061111d565b600090505b92915050565b60008063017d78406111348461224c565b106112635760005b60085481101561126157601460008281526020019081526020016000206003015461116685610f5b565b111580156111915750601460008281526020019081526020016000206001015461118f85610ef2565b105b80156111fb57506014600082815260200190815260200160002060040160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611254576112516112426014600084815260200190815260200160002060020154601460008581526020019081526020016000206000015461286d90919063ffffffff16565b836128b790919063ffffffff16565b91505b808060010191505061113c565b505b80915050919050565b60075481565b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcd087a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561131e57600080fd5b505afa158015611332573d6000803e3d6000fd5b505050506040513d602081101561134857600080fd5b8101908080519060200190929190505050905061137b611368338361216c565b83600101546128b790919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506113e06113cd3361293f565b83600201546128b790919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061142f3361229e565b831115611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061440e602b913960400191505060405180910390fd5b60006114b16103e86114a3604b87612af490919063ffffffff16565b61286d90919063ffffffff16565b905060006114c8828661282390919063ffffffff16565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081b7a4e30846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050506115c03382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b7a9092919063ffffffff16565b6115c933611d6a565b85116117815784846001015410611689576115f185856001015461282390919063ffffffff16565b846001018190555061160e8560065461282390919063ffffffff16565b6006819055503373ffffffffffffffffffffffffffffffffffffffff167fc1df1e8d1517a1d530e03dd0b5abd27970c523aa08e4dab690b68af40b925d9682876000896000604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a261177c565b60006116a285600101548761282390919063ffffffff16565b90506116bd856001015460065461282390919063ffffffff16565b6006819055506116d88160075461282390919063ffffffff16565b6007819055503373ffffffffffffffffffffffffffffffffffffffff167fc1df1e8d1517a1d530e03dd0b5abd27970c523aa08e4dab690b68af40b925d9683886000896001015486604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a26000856001018190555061177281866002015461282390919063ffffffff16565b8560020181905550505b6118e1565b600061179e61178f33611d6a565b8761282390919063ffffffff16565b90506117b9856001015460065461282390919063ffffffff16565b6006819055506117d8856002015460075461282390919063ffffffff16565b6007819055503373ffffffffffffffffffffffffffffffffffffffff167fc1df1e8d1517a1d530e03dd0b5abd27970c523aa08e4dab690b68af40b925d9683888489600101548a60020154604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a2600085600101819055506000856002018190555061187f81866004015461282390919063ffffffff16565b856004018190555061189c8160025461282390919063ffffffff16565b6002819055506118c881601260008781526020019081526020016000205461282390919063ffffffff16565b6012600086815260200190815260200160002081905550505b61192f306000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612c1c9092919063ffffffff16565b60008460000160146101000a81548160ff0219169083151502179055506000831461196d5761196860018461282390919063ffffffff16565b61196f565b825b84600601819055505050505050565b60085481565b61198c614344565b601360008381526020019081526020016000206003806020026040519081016040528092919082600380156119d6576020028201915b8154815260200190600101908083116119c2575b50505050509050919050565b60106020528060005260406000206000915054906101000a900460ff1681565b60025481565b6000806000611ab660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcd087a46040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7657600080fd5b505afa158015611a8a573d6000803e3d6000fd5b505050506040513d6020811015611aa057600080fd5b810190808051906020019092919050505061238c565b925092509250909192565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601549050919050565b60006014600083815260200190815260200160002060040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b604b81565b606481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcd087a46040518163ffffffff1660e01b815260040160206040518083038186803b158015611c1157600080fd5b505afa158015611c25573d6000803e3d6000fd5b505050506040513d6020811015611c3b57600080fd5b81019080805190602001909291905050509050600060146000600854815260200190815260200160002090508281600001819055504281600101819055506009548160020181905550818160030181905550600860008154809291906001019190505550611cb4836005546128b790919063ffffffff16565b600581905550611ccf836007546128b790919063ffffffff16565b600781905550611d24333085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612de1909392919063ffffffff16565b7ffb62f62d175052f21fcd995af4fa2b8055a8215bda0702547e7819615dcde83583600554604051808381526020018281526020019250505060405180910390a1505050565b6000611e03600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546128b790919063ffffffff16565b9050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050919050565b63017d784081565b600060038281548110611e6d57fe5b9060005260206000200154611e9384611e8585610f3e565b6128b790919063ffffffff16565b11905092915050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcd087a46040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5b57600080fd5b505afa158015611f6f573d6000803e3d6000fd5b505050506040513d6020811015611f8557600080fd5b81019080805190602001909291905050509050611fa0614344565b611fa98261238c565b83600060038110611fb657fe5b6020020184600160038110611fc757fe5b6020020185600260038110611fd857fe5b602002018381525083815250838152505050506000611ff78584612361565b905061203861200586610fa7565b61202a6120128585612ea2565b61201c898861216c565b6128b790919063ffffffff16565b6128b790919063ffffffff16565b9350505050919050565b600080600080601460008681526020019081526020016000206000015460146000878152602001908152602001600020600101546014600088815260200190815260200160002060020154601460008981526020019081526020016000206003015493509350935093509193509193565b60006120e76120c183610f3e565b600384815481106120ce57fe5b906000526020600020015461282390919063ffffffff16565b9050919050565b6120f6614344565b600a60038060200260405190810160405280929190826003801561212f576020028201915b81548152602001906001019080831161211b575b5050505050905090565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061217a85611ac1565b905061218585612308565b80612198575060006121968661224c565b115b156122025760006121b36001836128b790919063ffffffff16565b90505b848110156122005760006121ca8783612361565b90506121f06121e16121db84611984565b83612ea2565b856128b790919063ffffffff16565b93505080806001019150506121b6565b505b819250505092915050565b6122178132612f3b565b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122488282612f3b565b5050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401549050919050565b60055481565b60006122dd6122ac83611e0a565b6122cf6122b885610fa7565b6122c18661224c565b6128b790919063ffffffff16565b6128b790919063ffffffff16565b9050919050565b600381815481106122f457600080fd5b906000526020600020016000915090505481565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff169050919050565b600061237e61236f83610ff3565b6123798585611097565b613bf6565b905092915050565b60095481565b600080600080600d54851015905080156125e25760006123b7600d548761282390919063ffffffff16565b14156124a5576123fa60646123ec600a6000600381106123d357fe5b01546123de89610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b935061244c606461243e600a60016003811061241257fe5b015461243061242b60018b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b925061249e6064612490600a60026003811061246457fe5b015461248261247d60028b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b91506125dd565b60016124bc600d548761282390919063ffffffff16565b141561256b576125126064612504600a6001600381106124d857fe5b01546124f66124f160018b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b92506125646064612556600a60026003811061252a57fe5b015461254861254360028b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b91506125dc565b6002612582600d548761282390919063ffffffff16565b14156125db576125d860646125ca600a60026003811061259e57fe5b01546125bc6125b760028b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b91505b5b5b6127bd565b600185141561262f57612628606461261a600a60006003811061260157fe5b015461260c89610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b93506127bc565b60028514156126ce576126756064612667600a60006003811061264e57fe5b015461265989610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b93506126c760646126b9600a60016003811061268d57fe5b01546126ab6126a660018b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b92506127bb565b600385106127ba576127136064612705600a6000600381106126ec57fe5b01546126f789610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b93506127656064612757600a60016003811061272b57fe5b015461274961274460018b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b92506127b760646127a9600a60026003811061277d57fe5b015461279b61279660028b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b91505b5b5b5b509193909250565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600701600083815260200190815260200160002054905092915050565b600061286583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c55565b905092915050565b60006128af83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d15565b905092915050565b600080828401905083811015612935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008063017d78406129508461224c565b10612aeb5760005b600854811015612ae957601460008281526020019081526020016000206003015461298285610f5b565b111580156129ad575060146000828152602001908152602001600020600101546129ab85610ef2565b105b8015612a1757506014600082815260200190815260200160002060040160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612adc57612a6d612a5e6014600084815260200190815260200160002060020154601460008581526020019081526020016000206000015461286d90919063ffffffff16565b836128b790919063ffffffff16565b915060016014600083815260200190815260200160002060040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080600101915050612958565b505b80915050919050565b600080831415612b075760009050612b74565b6000828402905082848281612b1857fe5b0414612b6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061438d6021913960400191505060405180910390fd5b809150505b92915050565b612c178363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613ddb565b505050565b6000811480612cea575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015612cad57600080fd5b505afa158015612cc1573d6000803e3d6000fd5b505050506040513d6020811015612cd757600080fd5b8101908080519060200190929190505050145b612d3f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143d86036913960400191505060405180910390fd5b612ddc8363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613ddb565b505050565b612e9c846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613ddb565b50505050565b6000612f33612ebb606480612af490919063ffffffff16565b612f2584612f1787600260038110612ecf57fe5b6020020151612f0989600160038110612ee457fe5b60200201518a600060038110612ef657fe5b60200201516128b790919063ffffffff16565b6128b790919063ffffffff16565b612af490919063ffffffff16565b61286d90919063ffffffff16565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcd087a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612fa457600080fd5b505afa158015612fb8573d6000803e3d6000fd5b505050506040513d6020811015612fce57600080fd5b8101908080519060200190929190505050905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4c71cc26040518163ffffffff1660e01b815260040160206040518083038186803b15801561304a57600080fd5b505afa15801561305e573d6000803e3d6000fd5b505050506040513d602081101561307457600080fd5b8101908080519060200190929190505050905060018210158015613096575080155b806130a15750600082145b15613124576130b08483611e5e565b15613123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f5374616b65206c696d697420686173206265656e20726561636865640000000081525060200191505060405180910390fd5b5b8015806131315750600082145b156133cd576131518461314384610f3e565b6128b790919063ffffffff16565b601160008481526020019081526020016000208190555061317d846002546128b790919063ffffffff16565b60126000848152602001908152602001600020819055506131b0846131a28585611097565b6128b790919063ffffffff16565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070160008481526020019081526020016000208190555060008214156133c857613225846002546128b790919063ffffffff16565b600360008154811061323357fe5b906000526020600020015414156133c75761326682600360008154811061325657fe5b9060005260206000200154613eca565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631a23a0d46132ac6000611984565b6040518263ffffffff1660e01b81526004018082600360200280838360005b838110156132e65780820151818401526020810190506132cb565b50505050905001915050602060405180830381600087803b15801561330a57600080fd5b505af115801561331e573d6000803e3d6000fd5b505050506040513d602081101561333457600080fd5b81019080805190602001909291905050505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ebfdc59a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156133ae57600080fd5b505af11580156133c2573d6000803e3d6000fd5b505050505b5b6137ab565b6133e9846133db8585611097565b6128b790919063ffffffff16565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070160006134416001866128b790919063ffffffff16565b8152602001908152602001600020819055506134818461347361346e6001866128b790919063ffffffff16565b610f3e565b6128b790919063ffffffff16565b601160006134996001866128b790919063ffffffff16565b8152602001908152602001600020819055506134c0846002546128b790919063ffffffff16565b601260006134d86001866128b790919063ffffffff16565b8152602001908152602001600020819055506134f682600254613eca565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ebfdc59a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561355e57600080fd5b505af1158015613572573d6000803e3d6000fd5b5050505061358c6003600d546128b790919063ffffffff16565b82116137aa5761359b82614021565b6000613622601360008581526020019081526020016000206002600381106135bf57fe5b0154613614601360008781526020019081526020016000206001600381106135e357fe5b01546013600088815260200190815260200160002060006003811061360457fe5b01546128b790919063ffffffff16565b6128b790919063ffffffff16565b9050613639816004546128b790919063ffffffff16565b60048190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631a23a0d461368485611984565b6040518263ffffffff1660e01b81526004018082600360200280838360005b838110156136be5780820151818401526020810190506136a3565b50505050905001915050602060405180830381600087803b1580156136e257600080fd5b505af11580156136f6573d6000803e3d6000fd5b505050506040513d602081101561370c57600080fd5b810190808051906020019092919050505050613733816006546128b790919063ffffffff16565b6006819055507fbf3ce27352ab864c3042d9069b0fa75d3123f8c59da2b95414cf2ec4d8c2c51c8361376485611984565b6040518083815260200182600360200280838360005b8381101561379557808201518184015260208101905061377a565b505050509050019250505060405180910390a1505b5b6137b483612308565b6138b7576001600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a81548160ff02191690831515021790555063017d78406138218461224c565b10156138b65781600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005018190555042600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b5b6138c083611e9c565b613a045782600e6000600954815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506009600081548092919060010191905055506001601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b613a5984600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401546128b790919063ffffffff16565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550613ab4846002546128b790919063ffffffff16565b6002819055503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415613b4257613b3d833086600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612de1909392919063ffffffff16565b613b92565b613b91333086600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612de1909392919063ffffffff16565b5b8273ffffffffffffffffffffffffffffffffffffffff167f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9085613bd48661229e565b604051808381526020018281526020019250505060405180910390a250505050565b600080831480613c065750600082145b15613c145760009050613c4f565b613c4c83613c3e613c2f606480612af490919063ffffffff16565b85612af490919063ffffffff16565b61286d90919063ffffffff16565b90505b92915050565b6000838311158290613d02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613cc7578082015181840152602081019050613cac565b50505050905090810190601f168015613cf45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290613dc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d86578082015181840152602081019050613d6b565b50505050905090810190601f168015613db35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613dcd57fe5b049050809150509392505050565b6000613e3d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140a59092919063ffffffff16565b9050600081511115613ec557808060200190516020811015613e5e57600080fd5b8101908080519060200190929190505050613ec4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806143ae602a913960400191505060405180910390fd5b5b505050565b6000613efe613ed884610f3e565b60038581548110613ee557fe5b906000526020600020015461282390919063ffffffff16565b905060038311613f58576003613f316064613f23602086612af490919063ffffffff16565b61286d90919063ffffffff16565b90806001815401808255809150506001900390600052602060002001600090919091909150555b6003831115613fb1576003613f8a6064613f7c600486612af490919063ffffffff16565b61286d90919063ffffffff16565b90806001815401808255809150506001900390600052602060002001600090919091909150555b613fee816003613fcb6001876128b790919063ffffffff16565b81548110613fd557fe5b90600052602060002001546128b790919063ffffffff16565b60036140046001866128b790919063ffffffff16565b8154811061400e57fe5b9060005260206000200181905550505050565b61402a8161238c565b6013600085815260200190815260200160002060006003811061404957fe5b0160006013600087815260200190815260200160002060016003811061406b57fe5b0160006013600089815260200190815260200160002060026003811061408d57fe5b01600086919050558591905055849190505550505050565b60606140b484846000856140bd565b90509392505050565b606082471015614118576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806143676026913960400191505060405180910390fd5b61412185614265565b614193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106141e257805182526020820191506020810190506020830392506141bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614244576040519150601f19603f3d011682016040523d82523d6000602084013e614249565b606091505b5091509150614259828286614278565b92505050949350505050565b600080823b905060008111915050919050565b606083156142885782905061433d565b60008351111561429b5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156143025780820151818401526020810190506142e7565b50505050905090810190601f16801561432f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b604051806060016040528060039060208202803683378082019150509050509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365556e7374616b6520616d6f756e742069732067726561746572207468616e20757365722062616c616e6365a26469706673582212205c7d11244b586f904ef8a4429b496b18d6f7d559b1350314714e49d102570fcf64736f6c63430007060033000000000000000000000000c29acac647c63dbd8618e817d41ea9de69174ae1
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102895760003560e01c80636029bf9f1161015c578063a13a5b82116100ce578063c8de1d5611610087578063c8de1d5614610d2e578063dd31c65a14610d86578063ea0d5dcd14610dc8578063f4e79b3d14610e22578063f7a149a614610e84578063f927babb14610ea257610289565b8063a13a5b8214610ba6578063a694fc3a14610c08578063aa84924414610c36578063aceccf8f14610c6a578063bbbaee4c14610cb8578063bdf320c014610d1057610289565b80637b941f5a116101205780637b941f5a146109bd5780638386bd7b14610a1757806385f83a5714610a6f5780638c209da414610ac657806392fe573614610b085780639f4216e814610b4e57610289565b80636029bf9f14610873578063666c4b5c146108a157806366a0eef7146108f95780636a6dc30b14610951578063797352b81461096f57610289565b806326e516bc116102005780633e50de30116101b95780633e50de301461071b57806340273ed814610747578063460b50881461079f57806351d2a248146108035780635b562879146108215780635fcbd2851461083f57610289565b806326e516bc146105cf5780632e17de78146105ed5780632f7e83971461061b578063340c9a5214610639578063398a0231146106a35780633a98ef39146106fd57610289565b80630be08114116102525780630be081141461041a5780630e15561a146104385780631959a002146104565780631c64f11e146104f75780631e79f0d51461051557806322e4447e1461057757610289565b8062c425701461028e57806305345142146102e657806306fa8ce714610328578063078b0fb7146103805780630a495177146103d8575b600080fd5b6102d0600480360360208110156102a457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ef2565b6040518082815260200191505060405180910390f35b610312600480360360208110156102fc57600080fd5b8101908080359060200190929190505050610f3e565b6040518082815260200191505060405180910390f35b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f5b565b6040518082815260200191505060405180910390f35b6103c26004803603602081101561039657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fa7565b6040518082815260200191505060405180910390f35b610404600480360360208110156103ee57600080fd5b8101908080359060200190929190505050610ff3565b6040518082815260200191505060405180910390f35b610422611010565b6040518082815260200191505060405180910390f35b610440611016565b6040518082815260200191505060405180910390f35b6104986004803603602081101561046c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061101c565b604051808973ffffffffffffffffffffffffffffffffffffffff16815260200188151581526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b6104ff611091565b6040518082815260200191505060405180910390f35b6105616004803603604081101561052b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611097565b6040518082815260200191505060405180910390f35b6105b96004803603602081101561058d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611123565b6040518082815260200191505060405180910390f35b6105d761126c565b6040518082815260200191505060405180910390f35b6106196004803603602081101561060357600080fd5b8101908080359060200190929190505050611272565b005b61062361197e565b6040518082815260200191505060405180910390f35b6106656004803603602081101561064f57600080fd5b8101908080359060200190929190505050611984565b6040518082600360200280838360005b83811015610690578082015181840152602081019050610675565b5050505090500191505060405180910390f35b6106e5600480360360208110156106b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119e2565b60405180821515815260200191505060405180910390f35b610705611a02565b6040518082815260200191505060405180910390f35b610723611a08565b60405180848152602001838152602001828152602001935050505060405180910390f35b6107896004803603602081101561075d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ac1565b6040518082815260200191505060405180910390f35b6107eb600480360360408110156107b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b0d565b60405180821515815260200191505060405180910390f35b61080b611b78565b6040518082815260200191505060405180910390f35b610829611b7d565b6040518082815260200191505060405180910390f35b610847611b82565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61089f6004803603602081101561088957600080fd5b8101908080359060200190929190505050611ba8565b005b6108e3600480360360208110156108b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d6a565b6040518082815260200191505060405180910390f35b61093b6004803603602081101561090f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e0a565b6040518082815260200191505060405180910390f35b610959611e56565b6040518082815260200191505060405180910390f35b6109a56004803603604081101561098557600080fd5b810190808035906020019092919080359060200190929190505050611e5e565b60405180821515815260200191505060405180910390f35b6109ff600480360360208110156109d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e9c565b60405180821515815260200191505060405180910390f35b610a5960048036036020811015610a2d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ef2565b6040518082815260200191505060405180910390f35b610a9b60048036036020811015610a8557600080fd5b8101908080359060200190929190505050612042565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610af260048036036020811015610adc57600080fd5b81019080803590602001909291905050506120b3565b6040518082815260200191505060405180910390f35b610b106120ee565b6040518082600360200280838360005b83811015610b3b578082015181840152602081019050610b20565b5050505090500191505060405180910390f35b610b7a60048036036020811015610b6457600080fd5b8101908080359060200190929190505050612139565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610bf260048036036040811015610bbc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061216c565b6040518082815260200191505060405180910390f35b610c3460048036036020811015610c1e57600080fd5b810190808035906020019092919050505061220d565b005b610c3e61221a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610cb660048036036040811015610c8057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061223e565b005b610cfa60048036036020811015610cce57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061224c565b6040518082815260200191505060405180910390f35b610d18612298565b6040518082815260200191505060405180910390f35b610d7060048036036020811015610d4457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061229e565b6040518082815260200191505060405180910390f35b610db260048036036020811015610d9c57600080fd5b81019080803590602001909291905050506122e4565b6040518082815260200191505060405180910390f35b610e0a60048036036020811015610dde57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612308565b60405180821515815260200191505060405180910390f35b610e6e60048036036040811015610e3857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612361565b6040518082815260200191505060405180910390f35b610e8c612386565b6040518082815260200191505060405180910390f35b610ece60048036036020811015610eb857600080fd5b810190808035906020019092919050505061238c565b60405180848152602001838152602001828152602001935050505060405180910390f35b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301549050919050565b600060116000838152602001908152602001600020549050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501549050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b600060126000838152602001908152602001600020549050919050565b600d5481565b60045481565b600f6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060010154908060020154908060030154908060040154908060050154908060060154905088565b60065481565b60006110a283612308565b156110f75760006110b384846127c5565b11806110bf5750600082145b6110e5576110e0836110db60018561282390919063ffffffff16565b611097565b6110f0565b6110ef83836127c5565b5b905061111d565b60006111028461224c565b1115611118576111118361224c565b905061111d565b600090505b92915050565b60008063017d78406111348461224c565b106112635760005b60085481101561126157601460008281526020019081526020016000206003015461116685610f5b565b111580156111915750601460008281526020019081526020016000206001015461118f85610ef2565b105b80156111fb57506014600082815260200190815260200160002060040160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611254576112516112426014600084815260200190815260200160002060020154601460008581526020019081526020016000206000015461286d90919063ffffffff16565b836128b790919063ffffffff16565b91505b808060010191505061113c565b505b80915050919050565b60075481565b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcd087a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561131e57600080fd5b505afa158015611332573d6000803e3d6000fd5b505050506040513d602081101561134857600080fd5b8101908080519060200190929190505050905061137b611368338361216c565b83600101546128b790919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506113e06113cd3361293f565b83600201546128b790919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061142f3361229e565b831115611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061440e602b913960400191505060405180910390fd5b60006114b16103e86114a3604b87612af490919063ffffffff16565b61286d90919063ffffffff16565b905060006114c8828661282390919063ffffffff16565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081b7a4e30846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050506115c03382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b7a9092919063ffffffff16565b6115c933611d6a565b85116117815784846001015410611689576115f185856001015461282390919063ffffffff16565b846001018190555061160e8560065461282390919063ffffffff16565b6006819055503373ffffffffffffffffffffffffffffffffffffffff167fc1df1e8d1517a1d530e03dd0b5abd27970c523aa08e4dab690b68af40b925d9682876000896000604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a261177c565b60006116a285600101548761282390919063ffffffff16565b90506116bd856001015460065461282390919063ffffffff16565b6006819055506116d88160075461282390919063ffffffff16565b6007819055503373ffffffffffffffffffffffffffffffffffffffff167fc1df1e8d1517a1d530e03dd0b5abd27970c523aa08e4dab690b68af40b925d9683886000896001015486604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a26000856001018190555061177281866002015461282390919063ffffffff16565b8560020181905550505b6118e1565b600061179e61178f33611d6a565b8761282390919063ffffffff16565b90506117b9856001015460065461282390919063ffffffff16565b6006819055506117d8856002015460075461282390919063ffffffff16565b6007819055503373ffffffffffffffffffffffffffffffffffffffff167fc1df1e8d1517a1d530e03dd0b5abd27970c523aa08e4dab690b68af40b925d9683888489600101548a60020154604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a2600085600101819055506000856002018190555061187f81866004015461282390919063ffffffff16565b856004018190555061189c8160025461282390919063ffffffff16565b6002819055506118c881601260008781526020019081526020016000205461282390919063ffffffff16565b6012600086815260200190815260200160002081905550505b61192f306000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612c1c9092919063ffffffff16565b60008460000160146101000a81548160ff0219169083151502179055506000831461196d5761196860018461282390919063ffffffff16565b61196f565b825b84600601819055505050505050565b60085481565b61198c614344565b601360008381526020019081526020016000206003806020026040519081016040528092919082600380156119d6576020028201915b8154815260200190600101908083116119c2575b50505050509050919050565b60106020528060005260406000206000915054906101000a900460ff1681565b60025481565b6000806000611ab660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcd087a46040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7657600080fd5b505afa158015611a8a573d6000803e3d6000fd5b505050506040513d6020811015611aa057600080fd5b810190808051906020019092919050505061238c565b925092509250909192565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601549050919050565b60006014600083815260200190815260200160002060040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b604b81565b606481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcd087a46040518163ffffffff1660e01b815260040160206040518083038186803b158015611c1157600080fd5b505afa158015611c25573d6000803e3d6000fd5b505050506040513d6020811015611c3b57600080fd5b81019080805190602001909291905050509050600060146000600854815260200190815260200160002090508281600001819055504281600101819055506009548160020181905550818160030181905550600860008154809291906001019190505550611cb4836005546128b790919063ffffffff16565b600581905550611ccf836007546128b790919063ffffffff16565b600781905550611d24333085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612de1909392919063ffffffff16565b7ffb62f62d175052f21fcd995af4fa2b8055a8215bda0702547e7819615dcde83583600554604051808381526020018281526020019250505060405180910390a1505050565b6000611e03600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546128b790919063ffffffff16565b9050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050919050565b63017d784081565b600060038281548110611e6d57fe5b9060005260206000200154611e9384611e8585610f3e565b6128b790919063ffffffff16565b11905092915050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcd087a46040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5b57600080fd5b505afa158015611f6f573d6000803e3d6000fd5b505050506040513d6020811015611f8557600080fd5b81019080805190602001909291905050509050611fa0614344565b611fa98261238c565b83600060038110611fb657fe5b6020020184600160038110611fc757fe5b6020020185600260038110611fd857fe5b602002018381525083815250838152505050506000611ff78584612361565b905061203861200586610fa7565b61202a6120128585612ea2565b61201c898861216c565b6128b790919063ffffffff16565b6128b790919063ffffffff16565b9350505050919050565b600080600080601460008681526020019081526020016000206000015460146000878152602001908152602001600020600101546014600088815260200190815260200160002060020154601460008981526020019081526020016000206003015493509350935093509193509193565b60006120e76120c183610f3e565b600384815481106120ce57fe5b906000526020600020015461282390919063ffffffff16565b9050919050565b6120f6614344565b600a60038060200260405190810160405280929190826003801561212f576020028201915b81548152602001906001019080831161211b575b5050505050905090565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061217a85611ac1565b905061218585612308565b80612198575060006121968661224c565b115b156122025760006121b36001836128b790919063ffffffff16565b90505b848110156122005760006121ca8783612361565b90506121f06121e16121db84611984565b83612ea2565b856128b790919063ffffffff16565b93505080806001019150506121b6565b505b819250505092915050565b6122178132612f3b565b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122488282612f3b565b5050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401549050919050565b60055481565b60006122dd6122ac83611e0a565b6122cf6122b885610fa7565b6122c18661224c565b6128b790919063ffffffff16565b6128b790919063ffffffff16565b9050919050565b600381815481106122f457600080fd5b906000526020600020016000915090505481565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff169050919050565b600061237e61236f83610ff3565b6123798585611097565b613bf6565b905092915050565b60095481565b600080600080600d54851015905080156125e25760006123b7600d548761282390919063ffffffff16565b14156124a5576123fa60646123ec600a6000600381106123d357fe5b01546123de89610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b935061244c606461243e600a60016003811061241257fe5b015461243061242b60018b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b925061249e6064612490600a60026003811061246457fe5b015461248261247d60028b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b91506125dd565b60016124bc600d548761282390919063ffffffff16565b141561256b576125126064612504600a6001600381106124d857fe5b01546124f66124f160018b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b92506125646064612556600a60026003811061252a57fe5b015461254861254360028b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b91506125dc565b6002612582600d548761282390919063ffffffff16565b14156125db576125d860646125ca600a60026003811061259e57fe5b01546125bc6125b760028b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b91505b5b5b6127bd565b600185141561262f57612628606461261a600a60006003811061260157fe5b015461260c89610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b93506127bc565b60028514156126ce576126756064612667600a60006003811061264e57fe5b015461265989610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b93506126c760646126b9600a60016003811061268d57fe5b01546126ab6126a660018b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b92506127bb565b600385106127ba576127136064612705600a6000600381106126ec57fe5b01546126f789610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b93506127656064612757600a60016003811061272b57fe5b015461274961274460018b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b92506127b760646127a9600a60026003811061277d57fe5b015461279b61279660028b61282390919063ffffffff16565b610f3e565b612af490919063ffffffff16565b61286d90919063ffffffff16565b91505b5b5b5b509193909250565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600701600083815260200190815260200160002054905092915050565b600061286583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c55565b905092915050565b60006128af83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d15565b905092915050565b600080828401905083811015612935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008063017d78406129508461224c565b10612aeb5760005b600854811015612ae957601460008281526020019081526020016000206003015461298285610f5b565b111580156129ad575060146000828152602001908152602001600020600101546129ab85610ef2565b105b8015612a1757506014600082815260200190815260200160002060040160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612adc57612a6d612a5e6014600084815260200190815260200160002060020154601460008581526020019081526020016000206000015461286d90919063ffffffff16565b836128b790919063ffffffff16565b915060016014600083815260200190815260200160002060040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080600101915050612958565b505b80915050919050565b600080831415612b075760009050612b74565b6000828402905082848281612b1857fe5b0414612b6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061438d6021913960400191505060405180910390fd5b809150505b92915050565b612c178363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613ddb565b505050565b6000811480612cea575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015612cad57600080fd5b505afa158015612cc1573d6000803e3d6000fd5b505050506040513d6020811015612cd757600080fd5b8101908080519060200190929190505050145b612d3f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143d86036913960400191505060405180910390fd5b612ddc8363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613ddb565b505050565b612e9c846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613ddb565b50505050565b6000612f33612ebb606480612af490919063ffffffff16565b612f2584612f1787600260038110612ecf57fe5b6020020151612f0989600160038110612ee457fe5b60200201518a600060038110612ef657fe5b60200201516128b790919063ffffffff16565b6128b790919063ffffffff16565b612af490919063ffffffff16565b61286d90919063ffffffff16565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcd087a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612fa457600080fd5b505afa158015612fb8573d6000803e3d6000fd5b505050506040513d6020811015612fce57600080fd5b8101908080519060200190929190505050905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4c71cc26040518163ffffffff1660e01b815260040160206040518083038186803b15801561304a57600080fd5b505afa15801561305e573d6000803e3d6000fd5b505050506040513d602081101561307457600080fd5b8101908080519060200190929190505050905060018210158015613096575080155b806130a15750600082145b15613124576130b08483611e5e565b15613123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f5374616b65206c696d697420686173206265656e20726561636865640000000081525060200191505060405180910390fd5b5b8015806131315750600082145b156133cd576131518461314384610f3e565b6128b790919063ffffffff16565b601160008481526020019081526020016000208190555061317d846002546128b790919063ffffffff16565b60126000848152602001908152602001600020819055506131b0846131a28585611097565b6128b790919063ffffffff16565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070160008481526020019081526020016000208190555060008214156133c857613225846002546128b790919063ffffffff16565b600360008154811061323357fe5b906000526020600020015414156133c75761326682600360008154811061325657fe5b9060005260206000200154613eca565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631a23a0d46132ac6000611984565b6040518263ffffffff1660e01b81526004018082600360200280838360005b838110156132e65780820151818401526020810190506132cb565b50505050905001915050602060405180830381600087803b15801561330a57600080fd5b505af115801561331e573d6000803e3d6000fd5b505050506040513d602081101561333457600080fd5b81019080805190602001909291905050505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ebfdc59a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156133ae57600080fd5b505af11580156133c2573d6000803e3d6000fd5b505050505b5b6137ab565b6133e9846133db8585611097565b6128b790919063ffffffff16565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070160006134416001866128b790919063ffffffff16565b8152602001908152602001600020819055506134818461347361346e6001866128b790919063ffffffff16565b610f3e565b6128b790919063ffffffff16565b601160006134996001866128b790919063ffffffff16565b8152602001908152602001600020819055506134c0846002546128b790919063ffffffff16565b601260006134d86001866128b790919063ffffffff16565b8152602001908152602001600020819055506134f682600254613eca565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ebfdc59a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561355e57600080fd5b505af1158015613572573d6000803e3d6000fd5b5050505061358c6003600d546128b790919063ffffffff16565b82116137aa5761359b82614021565b6000613622601360008581526020019081526020016000206002600381106135bf57fe5b0154613614601360008781526020019081526020016000206001600381106135e357fe5b01546013600088815260200190815260200160002060006003811061360457fe5b01546128b790919063ffffffff16565b6128b790919063ffffffff16565b9050613639816004546128b790919063ffffffff16565b60048190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631a23a0d461368485611984565b6040518263ffffffff1660e01b81526004018082600360200280838360005b838110156136be5780820151818401526020810190506136a3565b50505050905001915050602060405180830381600087803b1580156136e257600080fd5b505af11580156136f6573d6000803e3d6000fd5b505050506040513d602081101561370c57600080fd5b810190808051906020019092919050505050613733816006546128b790919063ffffffff16565b6006819055507fbf3ce27352ab864c3042d9069b0fa75d3123f8c59da2b95414cf2ec4d8c2c51c8361376485611984565b6040518083815260200182600360200280838360005b8381101561379557808201518184015260208101905061377a565b505050509050019250505060405180910390a1505b5b6137b483612308565b6138b7576001600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a81548160ff02191690831515021790555063017d78406138218461224c565b10156138b65781600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005018190555042600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b5b6138c083611e9c565b613a045782600e6000600954815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506009600081548092919060010191905055506001601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b613a5984600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401546128b790919063ffffffff16565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550613ab4846002546128b790919063ffffffff16565b6002819055503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415613b4257613b3d833086600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612de1909392919063ffffffff16565b613b92565b613b91333086600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612de1909392919063ffffffff16565b5b8273ffffffffffffffffffffffffffffffffffffffff167f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9085613bd48661229e565b604051808381526020018281526020019250505060405180910390a250505050565b600080831480613c065750600082145b15613c145760009050613c4f565b613c4c83613c3e613c2f606480612af490919063ffffffff16565b85612af490919063ffffffff16565b61286d90919063ffffffff16565b90505b92915050565b6000838311158290613d02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613cc7578082015181840152602081019050613cac565b50505050905090810190601f168015613cf45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290613dc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d86578082015181840152602081019050613d6b565b50505050905090810190601f168015613db35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613dcd57fe5b049050809150509392505050565b6000613e3d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140a59092919063ffffffff16565b9050600081511115613ec557808060200190516020811015613e5e57600080fd5b8101908080519060200190929190505050613ec4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806143ae602a913960400191505060405180910390fd5b5b505050565b6000613efe613ed884610f3e565b60038581548110613ee557fe5b906000526020600020015461282390919063ffffffff16565b905060038311613f58576003613f316064613f23602086612af490919063ffffffff16565b61286d90919063ffffffff16565b90806001815401808255809150506001900390600052602060002001600090919091909150555b6003831115613fb1576003613f8a6064613f7c600486612af490919063ffffffff16565b61286d90919063ffffffff16565b90806001815401808255809150506001900390600052602060002001600090919091909150555b613fee816003613fcb6001876128b790919063ffffffff16565b81548110613fd557fe5b90600052602060002001546128b790919063ffffffff16565b60036140046001866128b790919063ffffffff16565b8154811061400e57fe5b9060005260206000200181905550505050565b61402a8161238c565b6013600085815260200190815260200160002060006003811061404957fe5b0160006013600087815260200190815260200160002060016003811061406b57fe5b0160006013600089815260200190815260200160002060026003811061408d57fe5b01600086919050558591905055849190505550505050565b60606140b484846000856140bd565b90509392505050565b606082471015614118576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806143676026913960400191505060405180910390fd5b61412185614265565b614193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106141e257805182526020820191506020810190506020830392506141bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614244576040519150601f19603f3d011682016040523d82523d6000602084013e614249565b606091505b5091509150614259828286614278565b92505050949350505050565b600080823b905060008111915050919050565b606083156142885782905061433d565b60008351111561429b5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156143025780820151818401526020810190506142e7565b50505050905090810190601f16801561432f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b604051806060016040528060039060208202803683378082019150509050509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365556e7374616b6520616d6f756e742069732067726561746572207468616e20757365722062616c616e6365a26469706673582212205c7d11244b586f904ef8a4429b496b18d6f7d559b1350314714e49d102570fcf64736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c29acac647c63dbd8618e817d41ea9de69174ae1
-----Decoded View---------------
Arg [0] : _energy (address): 0xC29aCAc647c63DBd8618E817d41eA9De69174aE1
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c29acac647c63dbd8618e817d41ea9de69174ae1
Deployed Bytecode Sourcemap
34658:22487:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55722:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56874:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55456:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54140:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57011:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36079:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35624:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36192:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35695:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54678:475;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50266:966;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35743:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45911:3215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35794:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56267:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36243:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35454:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42494:207;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55591:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55993:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36013:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35868:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35426:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45180:697;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54396:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54263:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35557:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44808:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55857:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;51288:582;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56416:320;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45006:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56748:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36142:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52080:698;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37316:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35399:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37410:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54555:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35658:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53960:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35521:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55332:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53191:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35831:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42713:2089;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55722:127;55788:7;55815:8;:14;55824:4;55815:14;;;;;;;;;;;;;;;:26;;;55808:33;;55722:127;;;:::o;56874:125::-;56940:7;56967:12;:24;56980:10;56967:24;;;;;;;;;;;;56960:31;;56874:125;;;:::o;55456:123::-;55518:7;55545:8;:14;55554:4;55545:14;;;;;;;;;;;;;;;:26;;;55538:33;;55456:123;;;:::o;54140:115::-;54198:7;54225:8;:14;54234:4;54225:14;;;;;;;;;;;;;;;:22;;;54218:29;;54140:115;;;:::o;57011:131::-;57078:7;57105:17;:29;57123:10;57105:29;;;;;;;;;;;;57098:36;;57011:131;;;:::o;36079:25::-;;;;:::o;35624:27::-;;;;:::o;36192:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35695:41::-;;;;:::o;54678:475::-;54762:7;54785:19;54799:4;54785:13;:19::i;:::-;54782:345;;;54868:1;54829:36;54848:4;54854:10;54829:18;:36::i;:::-;:40;:59;;;;54887:1;54873:10;:15;54829:59;54828:190;;54973:45;54994:4;55000:17;55015:1;55000:10;:14;;:17;;;;:::i;:::-;54973:20;:45::i;:::-;54828:190;;;54913:36;54932:4;54938:10;54913:18;:36::i;:::-;54828:190;54821:197;;;;54782:345;55060:1;55039:18;55052:4;55039:12;:18::i;:::-;:22;55036:91;;;55085:18;55098:4;55085:12;:18::i;:::-;55078:25;;;;55036:91;55144:1;55137:8;;54678:475;;;;;:::o;50266:966::-;50337:7;50357:27;35605:12;50464:18;50477:4;50464:12;:18::i;:::-;:43;50461:727;;50572:9;50568:609;50591:15;;50587:1;:19;50568:609;;;50836:13;:16;50850:1;50836:16;;;;;;;;;;;:26;;;50808:24;50827:4;50808:18;:24::i;:::-;:54;;:136;;;;;50918:13;:16;50932:1;50918:16;;;;;;;;;;;:26;;;50887:28;50910:4;50887:22;:28::i;:::-;:57;50808:136;:195;;;;;50971:13;:16;50985:1;50971:16;;;;;;;;;;;:26;;:32;50998:4;50971:32;;;;;;;;;;;;;;;;;;;;;;;;;50970:33;50808:195;50805:357;;;51050:92;51074:67;51101:13;:16;51115:1;51101:16;;;;;;;;;;;:39;;;51074:13;:16;51088:1;51074:16;;;;;;;;;;;:22;;;:26;;:67;;;;:::i;:::-;51050:19;:23;;:92;;;;:::i;:::-;51028:114;;50805:357;50608:3;;;;;;;50568:609;;;;50461:727;51205:19;51198:26;;;50266:966;;;:::o;35743:44::-;;;;:::o;45911:3215::-;45963:22;45988:8;:20;45997:10;45988:20;;;;;;;;;;;;;;;45963:45;;46019:18;46040:6;;;;;;;;;;;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46019:39;;46171:107;46231:46;46254:10;46266;46231:22;:46::i;:::-;46171:5;:13;;;:59;;:107;;;;:::i;:::-;46140:8;:20;46149:10;46140:20;;;;;;;;;;;;;;;:28;;:138;;;;46402:54;46423:32;46444:10;46423:20;:32::i;:::-;46402:5;:16;;;:20;;:54;;;;:::i;:::-;46368:8;:20;46377:10;46368:20;;;;;;;;;;;;;;;:31;;:88;;;;46486:28;46503:10;46486:16;:28::i;:::-;46475:7;:39;;46467:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46606:13;46622:36;46653:4;46623:24;36051:2;46623:7;:11;;:24;;;;:::i;:::-;46622:30;;:36;;;;:::i;:::-;46606:52;;46717:19;46739:18;46751:5;46739:7;:11;;:18;;;;:::i;:::-;46717:40;;46797:6;;;;;;;;;;:20;;;46826:4;46833:5;46797:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46850:45;46871:10;46883:11;46850:7;;;;;;;;;;;:20;;;;:45;;;;;:::i;:::-;46966:31;46986:10;46966:19;:31::i;:::-;46955:7;:42;46952:1932;;47084:7;47067:5;:13;;;:24;47064:914;;47128:26;47146:7;47128:5;:13;;;:17;;:26;;;;:::i;:::-;47112:5;:13;;:42;;;;47202:39;47233:7;47202:26;;:30;;:39;;;;:::i;:::-;47173:26;:68;;;;47275:10;47265:58;;;47287:11;47300:7;47309:1;47312:7;47321:1;47265:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47064:914;;;47467:17;47487:26;47499:5;:13;;;47487:7;:11;;:26;;;;:::i;:::-;47467:46;;47561:45;47592:5;:13;;;47561:26;;:30;;:45;;;;:::i;:::-;47532:26;:74;;;;47657:44;47691:9;47657:29;;:33;;:44;;;;:::i;:::-;47625:29;:76;;;;47735:10;47725:72;;;47747:11;47760:7;47769:1;47772:5;:13;;;47787:9;47725:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47892:1;47876:5;:13;;:17;;;;47931:31;47952:9;47931:5;:16;;;:20;;:31;;;;:::i;:::-;47912:5;:16;;:50;;;;47064:914;;46952:1932;;;48091:17;48111:44;48123:31;48143:10;48123:19;:31::i;:::-;48111:7;:11;;:44;;;;:::i;:::-;48091:64;;48199:45;48230:5;:13;;;48199:26;;:30;;:45;;;;:::i;:::-;48170:26;:74;;;;48291:51;48325:5;:16;;;48291:29;;:33;;:51;;;;:::i;:::-;48259:29;:83;;;;48372:10;48362:87;;;48384:11;48397:7;48406:9;48417:5;:13;;;48432:5;:16;;;48362:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48480:1;48464:5;:13;;:17;;;;48515:1;48496:5;:16;;:20;;;;48600:26;48616:9;48600:5;:11;;;:15;;:26;;;;:::i;:::-;48586:5;:11;;:40;;;;48690:26;48706:9;48690:11;;:15;;:26;;;;:::i;:::-;48676:11;:40;;;;48828:44;48862:9;48828:17;:29;48846:10;48828:29;;;;;;;;;;;;:33;;:44;;;;:::i;:::-;48796:17;:29;48814:10;48796:29;;;;;;;;;;;:76;;;;46952:1932;;48894:37;48922:4;48929:1;48894:7;;;;;;;;;;;:19;;;;:37;;;;;:::i;:::-;48995:5;48978;:14;;;:22;;;;;;;;;;;;;;;;;;49084:1;49070:10;:15;:48;;49101:17;49116:1;49101:10;:14;;:17;;;;:::i;:::-;49070:48;;;49088:10;49070:48;49052:5;:15;;:66;;;;45911:3215;;;;;:::o;35794:30::-;;;;:::o;56267:137::-;56335:17;;:::i;:::-;56372:12;:24;56385:10;56372:24;;;;;;;;;;;56365:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56267:137;;;:::o;36243:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;35454:26::-;;;;:::o;42494:207::-;42542:23;42567:29;42598:28;42646:47;42674:6;;;;;;;;;;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42646:27;:47::i;:::-;42639:54;;;;;;42494:207;;;:::o;55591:119::-;55651:7;55678:8;:14;55687:4;55678:14;;;;;;;;;;;;;;;:24;;;55671:31;;55591:119;;;:::o;55993:156::-;56080:4;56104:13;:21;56118:6;56104:21;;;;;;;;;;;:31;;:37;56136:4;56104:37;;;;;;;;;;;;;;;;;;;;;;;;;56097:44;;55993:156;;;;:::o;36013:40::-;36051:2;36013:40;:::o;35868:47::-;35912:3;35868:47;:::o;35426:21::-;;;;;;;;;;;;;:::o;45180:697::-;45239:18;45260:6;;;;;;;;;;;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45239:39;;45289:36;45328:13;:30;45342:15;;45328:30;;;;;;;;;;;45289:69;;45392:7;45369:14;:20;;:30;;;;45437:15;45410:14;:24;;:42;;;;45503:15;;45463:14;:37;;:55;;;;45556:10;45529:14;:24;;:37;;;;45577:15;;:17;;;;;;;;;;;;;45623:28;45643:7;45623:15;;:19;;:28;;;;:::i;:::-;45605:15;:46;;;;45694:42;45728:7;45694:29;;:33;;:42;;;;:::i;:::-;45662:29;:74;;;;45747:60;45772:10;45792:4;45799:7;45747;;;;;;;;;;;:24;;;;:60;;;;;;:::i;:::-;45823:46;45844:7;45853:15;;45823:46;;;;;;;;;;;;;;;;;;;;;;;;45180:697;;;:::o;54396:151::-;54459:7;54486:53;54516:8;:14;54525:4;54516:14;;;;;;;;;;;;;;;:22;;;54486:8;:14;54495:4;54486:14;;;;;;;;;;;;;;;:25;;;:29;;:53;;;;:::i;:::-;54479:60;;54396:151;;;:::o;54263:121::-;54324:7;54351:8;:14;54360:4;54351:14;;;;;;;;;;;;;;;:25;;;54344:32;;54263:121;;;:::o;35557:60::-;35605:12;35557:60;:::o;44808:190::-;44896:4;44965:12;44978:10;44965:24;;;;;;;;;;;;;;;;44921:41;44954:7;44921:28;44938:10;44921:16;:28::i;:::-;:32;;:41;;;;:::i;:::-;:68;44913:77;;44808:190;;;;:::o;55857:124::-;55923:4;55947:20;:26;55968:4;55947:26;;;;;;;;;;;;;;;;;;;;;;;;;55940:33;;55857:124;;;:::o;51288:582::-;51353:7;51373:18;51394:6;;;;;;;;;;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51373:39;;51423:32;;:::i;:::-;51544:39;51572:10;51544:27;:39::i;:::-;51467:14;51482:1;51467:17;;;;;;;;;;51495:14;51510:1;51495:17;;;;;;;;;;51523:14;51538:1;51523:17;;;;;;;;;;51466:117;;;;;;;;;;;;;;;51594:27;51624:48;51655:4;51661:10;51624:30;:48::i;:::-;51594:78;;51690:172;51841:20;51856:4;51841:14;:20::i;:::-;51690:128;51753:64;51781:14;51797:19;51753:27;:64::i;:::-;51690:40;51713:4;51719:10;51690:22;:40::i;:::-;:62;;:128;;;;:::i;:::-;:150;;:172;;;;:::i;:::-;51683:179;;;;;51288:582;;;:::o;56416:320::-;56482:7;56491;56500;56509;56537:13;:21;56551:6;56537:21;;;;;;;;;;;:27;;;56583:13;:21;56597:6;56583:21;;;;;;;;;;;:31;;;56633:13;:21;56647:6;56633:21;;;;;;;;;;;:44;;;56696:13;:21;56710:6;56696:21;;;;;;;;;;;:31;;;56529:199;;;;;;;;56416:320;;;;;:::o;45006:166::-;45077:7;45105:58;45134:28;45151:10;45134:16;:28::i;:::-;45105:12;45118:10;45105:24;;;;;;;;;;;;;;;;:28;;:58;;;;:::i;:::-;45097:67;;45006:166;;;:::o;56748:114::-;56800:17;;:::i;:::-;56837;56830:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56748:114;:::o;36142:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;52080:698::-;52166:7;52186:26;52223:19;52245:22;52262:4;52245:16;:22::i;:::-;52223:44;;52364:19;52378:4;52364:13;:19::i;:::-;:47;;;;52409:1;52388:18;52401:4;52388:12;:18::i;:::-;:22;52364:47;52361:374;;;52432:9;52444:18;52460:1;52444:11;:15;;:18;;;;:::i;:::-;52432:30;;52428:296;52468:10;52464:1;:14;52428:296;;;52504:27;52534:39;52565:4;52571:1;52534:30;:39::i;:::-;52504:69;;52613:95;52636:71;52664:21;52683:1;52664:18;:21::i;:::-;52687:19;52636:27;:71::i;:::-;52613:18;:22;;:95;;;;:::i;:::-;52592:116;;52428:296;52480:3;;;;;;;52428:296;;;;52361:374;52752:18;52745:25;;;;52080:698;;;;:::o;37316:82::-;37365:25;37372:6;37380:9;37365:6;:25::i;:::-;37316:82;:::o;35399:20::-;;;;;;;;;;;;:::o;37410:99::-;37481:20;37488:6;37496:4;37481:6;:20::i;:::-;37410:99;;:::o;54555:111::-;54611:7;54638:8;:14;54647:4;54638:14;;;;;;;;;;;;;;;:20;;;54631:27;;54555:111;;;:::o;35658:30::-;;;;:::o;53960:168::-;54020:7;54047:73;54096:23;54114:4;54096:17;:23::i;:::-;54047:44;54070:20;54085:4;54070:14;:20::i;:::-;54047:18;54060:4;54047:12;:18::i;:::-;:22;;:44;;;;:::i;:::-;:48;;:73;;;;:::i;:::-;54040:80;;53960:168;;;:::o;35521:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55332:112::-;55389:4;55413:8;:14;55422:4;55413:14;;;;;;;;;;;;;;;:23;;;;;;;;;;;;55406:30;;55332:112;;;:::o;53191:230::-;53285:7;53312:101;53343:29;53361:10;53343:17;:29::i;:::-;53374:38;53395:4;53401:10;53374:20;:38::i;:::-;53312:30;:101::i;:::-;53305:108;;53191:230;;;;:::o;35831:30::-;;;;:::o;42713:2089::-;42790:23;42815:29;42846:28;42887:15;42920:10;;42906;:24;;42887:44;;42945:10;42942:1853;;;43005:1;42975:26;42990:10;;42975;:14;;:26;;;;:::i;:::-;:31;42972:926;;;43045:79;35912:3;43046:54;43079:17;43097:1;43079:20;;;;;;;;;43046:28;43063:10;43046:16;:28::i;:::-;:32;;:54;;;;:::i;:::-;43045:60;;:79;;;;:::i;:::-;43027:97;;43167:86;35912:3;43168:61;43208:17;43226:1;43208:20;;;;;;;;;43168:35;43185:17;43200:1;43185:10;:14;;:17;;;;:::i;:::-;43168:16;:35::i;:::-;:39;;:61;;;;:::i;:::-;43167:67;;:86;;;;:::i;:::-;43143:110;;43295:86;35912:3;43296:61;43336:17;43354:1;43336:20;;;;;;;;;43296:35;43313:17;43328:1;43313:10;:14;;:17;;;;:::i;:::-;43296:16;:35::i;:::-;:39;;:61;;;;:::i;:::-;43295:67;;:86;;;;:::i;:::-;43272:109;;42972:926;;;43436:1;43406:26;43421:10;;43406;:14;;:26;;;;:::i;:::-;:31;43403:495;;;43482:86;35912:3;43483:61;43523:17;43541:1;43523:20;;;;;;;;;43483:35;43500:17;43515:1;43500:10;:14;;:17;;;;:::i;:::-;43483:16;:35::i;:::-;:39;;:61;;;;:::i;:::-;43482:67;;:86;;;;:::i;:::-;43458:110;;43610:86;35912:3;43611:61;43651:17;43669:1;43651:20;;;;;;;;;43611:35;43628:17;43643:1;43628:10;:14;;:17;;;;:::i;:::-;43611:16;:35::i;:::-;:39;;:61;;;;:::i;:::-;43610:67;;:86;;;;:::i;:::-;43587:109;;43403:495;;;43751:1;43721:26;43736:10;;43721;:14;;:26;;;;:::i;:::-;:31;43718:180;;;43796:86;35912:3;43797:61;43837:17;43855:1;43837:20;;;;;;;;;43797:35;43814:17;43829:1;43814:10;:14;;:17;;;;:::i;:::-;43797:16;:35::i;:::-;:39;;:61;;;;:::i;:::-;43796:67;;:86;;;;:::i;:::-;43773:109;;43718:180;43403:495;42972:926;42942:1853;;;43947:1;43933:10;:15;43930:854;;;43987:79;35912:3;43988:54;44021:17;44039:1;44021:20;;;;;;;;;43988:28;44005:10;43988:16;:28::i;:::-;:32;;:54;;;;:::i;:::-;43987:60;;:79;;;;:::i;:::-;43969:97;;43930:854;;;44105:1;44091:10;:15;44088:696;;;44145:79;35912:3;44146:54;44179:17;44197:1;44179:20;;;;;;;;;44146:28;44163:10;44146:16;:28::i;:::-;:32;;:54;;;;:::i;:::-;44145:60;;:79;;;;:::i;:::-;44127:97;;44267:86;35912:3;44268:61;44308:17;44326:1;44308:20;;;;;;;;;44268:35;44285:17;44300:1;44285:10;:14;;:17;;;;:::i;:::-;44268:16;:35::i;:::-;:39;;:61;;;;:::i;:::-;44267:67;;:86;;;;:::i;:::-;44243:110;;44088:696;;;44392:1;44378:10;:15;44375:409;;44432:79;35912:3;44433:54;44466:17;44484:1;44466:20;;;;;;;;;44433:28;44450:10;44433:16;:28::i;:::-;:32;;:54;;;;:::i;:::-;44432:60;;:79;;;;:::i;:::-;44414:97;;44554:86;35912:3;44555:61;44595:17;44613:1;44595:20;;;;;;;;;44555:35;44572:17;44587:1;44572:10;:14;;:17;;;;:::i;:::-;44555:16;:35::i;:::-;:39;;:61;;;;:::i;:::-;44554:67;;:86;;;;:::i;:::-;44530:110;;44682:86;35912:3;44683:61;44723:17;44741:1;44723:20;;;;;;;;;44683:35;44700:17;44715:1;44700:10;:14;;:17;;;;:::i;:::-;44683:16;:35::i;:::-;:39;;:61;;;;:::i;:::-;44682:67;;:86;;;;:::i;:::-;44659:109;;44375:409;44088:696;43930:854;42942:1853;42713:2089;;;;;;:::o;55165:159::-;55249:7;55276:8;:14;55285:4;55276:14;;;;;;;;;;;;;;;:28;;:40;55305:10;55276:40;;;;;;;;;;;;55269:47;;55165:159;;;;:::o;4226:136::-;4284:7;4311:43;4315:1;4318;4311:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4304:50;;4226:136;;;;:::o;6063:132::-;6121:7;6148:39;6152:1;6155;6148:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6141:46;;6063:132;;;;:::o;3762:181::-;3820:7;3840:9;3856:1;3852;:5;3840:17;;3881:1;3876;:6;;3868:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3934:1;3927:8;;;3762:181;;;;:::o;49138:1018::-;49199:7;49219:27;35605:12;49326:18;49339:4;49326:12;:18::i;:::-;:43;49323:789;;49434:9;49430:671;49453:15;;49449:1;:19;49430:671;;;49698:13;:16;49712:1;49698:16;;;;;;;;;;;:26;;;49670:24;49689:4;49670:18;:24::i;:::-;:54;;:136;;;;;49780:13;:16;49794:1;49780:16;;;;;;;;;;;:26;;;49749:28;49772:4;49749:22;:28::i;:::-;:57;49670:136;:195;;;;;49833:13;:16;49847:1;49833:16;;;;;;;;;;;:26;;:32;49860:4;49833:32;;;;;;;;;;;;;;;;;;;;;;;;;49832:33;49670:195;49667:419;;;49912:92;49936:67;49963:13;:16;49977:1;49963:16;;;;;;;;;;;:39;;;49936:13;:16;49950:1;49936:16;;;;;;;;;;;:22;;;:26;;:67;;;;:::i;:::-;49912:19;:23;;:92;;;;:::i;:::-;49890:114;;50062:4;50027:13;:16;50041:1;50027:16;;;;;;;;;;;:26;;:32;50054:4;50027:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;49667:419;49470:3;;;;;;;49430:671;;;;49323:789;50129:19;50122:26;;;49138:1018;;;:::o;5116:471::-;5174:7;5424:1;5419;:6;5415:47;;;5449:1;5442:8;;;;5415:47;5474:9;5490:1;5486;:5;5474:17;;5519:1;5514;5510;:5;;;;;;:10;5502:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5578:1;5571:8;;;5116:471;;;;;:::o;15922:177::-;16005:86;16025:5;16055:23;;;16080:2;16084:5;16032:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16005:19;:86::i;:::-;15922:177;;;:::o;16581:622::-;16960:1;16951:5;:10;16950:62;;;;17010:1;16967:5;:15;;;16991:4;16998:7;16967:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;16950:62;16942:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17105:90;17125:5;17155:22;;;17179:7;17188:5;17132:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17105:19;:90::i;:::-;16581:622;;;:::o;16107:205::-;16208:96;16228:5;16258:27;;;16287:4;16293:2;16297:5;16235:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16208:19;:96::i;:::-;16107:205;;;;:::o;52790:393::-;52914:7;52942:232;53133:40;35912:3;;53133:21;;:40;;;;:::i;:::-;52943:162;53085:19;52944:113;53037:16;53054:1;53037:19;;;;;;;;;;;52944:66;52990:16;53007:1;52990:19;;;;;;;;;;;52944:16;52961:1;52944:19;;;;;;;;;;;:45;;:66;;;;:::i;:::-;:92;;:113;;;;:::i;:::-;52943:141;;:162;;;;:::i;:::-;52942:190;;:232;;;;:::i;:::-;52934:241;;52790:393;;;;:::o;37517:4141::-;37584:18;37605:6;;;;;;;;;;;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37584:39;;37634:15;37652:6;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37634:45;;37710:1;37696:10;:15;;:30;;;;;37716:10;37715:11;37696:30;37695:51;;;;37745:1;37731:10;:15;37695:51;37692:167;;;37772:42;37794:7;37803:10;37772:21;:42::i;:::-;37771:43;37763:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37692:167;37912:10;37911:11;:30;;;;37940:1;37926:10;:15;37911:30;37908:2494;;;38023:41;38056:7;38023:28;38040:10;38023:16;:28::i;:::-;:32;;:41;;;;:::i;:::-;37996:12;:24;38009:10;37996:24;;;;;;;;;;;:68;;;;38226:24;38242:7;38226:11;;:15;;:24;;;;:::i;:::-;38194:17;:29;38212:10;38194:29;;;;;;;;;;;:56;;;;38308:51;38351:7;38308:38;38329:4;38335:10;38308:20;:38::i;:::-;:42;;:51;;;;:::i;:::-;38265:8;:14;38274:4;38265:14;;;;;;;;;;;;;;;:28;;:40;38294:10;38265:40;;;;;;;;;;;:94;;;;38463:1;38449:10;:15;38446:296;;;38507:24;38523:7;38507:11;;:15;;:24;;;;:::i;:::-;38488:12;38501:1;38488:15;;;;;;;;;;;;;;;;:43;38485:242;;;38556:44;38572:10;38584:12;38597:1;38584:15;;;;;;;;;;;;;;;;38556;:44::i;:::-;38623:6;;;;;;;;;;:19;;;38643:21;38662:1;38643:18;:21::i;:::-;38623:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38688:6;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38485:242;38446:296;37908:2494;;;38933:51;38976:7;38933:38;38954:4;38960:10;38933:20;:38::i;:::-;:42;;:51;;;;:::i;:::-;38883:8;:14;38892:4;38883:14;;;;;;;;;;;;;;;:28;;:47;38912:17;38927:1;38912:10;:14;;:17;;;;:::i;:::-;38883:47;;;;;;;;;;;:101;;;;39071:48;39111:7;39071:35;39088:17;39103:1;39088:10;:14;;:17;;;;:::i;:::-;39071:16;:35::i;:::-;:39;;:48;;;;:::i;:::-;39037:12;:31;39050:17;39065:1;39050:10;:14;;:17;;;;:::i;:::-;39037:31;;;;;;;;;;;:82;;;;39289:24;39305:7;39289:11;;:15;;:24;;;;:::i;:::-;39250:17;:36;39268:17;39283:1;39268:10;:14;;:17;;;;:::i;:::-;39250:36;;;;;;;;;;;:63;;;;39328:40;39344:10;39356:11;;39328:15;:40::i;:::-;39383:6;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39587:17;39602:1;39587:10;;:14;;:17;;;;:::i;:::-;39573:10;:31;39570:821;;39822:22;39833:10;39822;:22::i;:::-;39863:25;39891:163;40026:12;:24;40039:10;40026:24;;;;;;;;;;;40051:1;40026:27;;;;;;;;;39891:96;39959:12;:24;39972:10;39959:24;;;;;;;;;;;39984:1;39959:27;;;;;;;;;39892:12;:24;39905:10;39892:24;;;;;;;;;;;39917:1;39892:27;;;;;;;;;39891:67;;:96;;;;:::i;:::-;:134;;:163;;;;:::i;:::-;39863:191;;40088:35;40105:17;40088:12;;:16;;:35;;;;:::i;:::-;40073:12;:50;;;;40142:6;;;;;;;;;;:19;;;40162:30;40181:10;40162:18;:30::i;:::-;40142:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40241:49;40272:17;40241:26;;:30;;:49;;;;:::i;:::-;40212:26;:78;;;;40314:61;40332:10;40344:30;40363:10;40344:18;:30::i;:::-;40314:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39570:821;;37908:2494;40492:19;40506:4;40492:13;:19::i;:::-;40488:280;;40554:4;40528:8;:14;40537:4;40528:14;;;;;;;;;;;;;;;:23;;;:30;;;;;;;;;;;;;;;;;;35605:12;40576:18;40589:4;40576:12;:18::i;:::-;:42;40573:184;;;40668:10;40639:8;:14;40648:4;40639:14;;;;;;;;;;;;;;;:26;;:39;;;;40726:15;40697:8;:14;40706:4;40697:14;;;;;;;;;;;;;;;:26;;:44;;;;40573:184;40488:280;40792:28;40815:4;40792:22;:28::i;:::-;40788:214;;40865:4;40837:8;:25;40846:15;;40837:25;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;40884:15;;:17;;;;;;;;;;;;;40945:4;40916:20;:26;40937:4;40916:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;40986:4;40964:8;:14;40973:4;40964:14;;;;;;;;;;;;;;;:19;;;:26;;;;;;;;;;;;;;;;;;40788:214;41045:33;41070:7;41045:8;:14;41054:4;41045:14;;;;;;;;;;;;;;;:20;;;:24;;:33;;;;:::i;:::-;41022:8;:14;41031:4;41022:14;;;;;;;;;;;;;;;:20;;:56;;;;41145:24;41161:7;41145:11;;:15;;:24;;;;:::i;:::-;41131:11;:38;;;;41248:9;41234:23;;:10;:23;;;41231:359;;;41314:54;41339:4;41353;41360:7;41314;;;;;;;;;;;:24;;;;:54;;;;;;:::i;:::-;41231:359;;;41518:60;41543:10;41563:4;41570:7;41518;;;;;;;;;;;:24;;;;:60;;;;;;:::i;:::-;41231:359;41612:4;41605:45;;;41618:7;41627:22;41644:4;41627:16;:22::i;:::-;41605:45;;;;;;;;;;;;;;;;;;;;;;;;37517:4141;;;;:::o;53429:429::-;53533:7;53572:1;53556:12;:17;:36;;;;53591:1;53577:10;:15;53556:36;53553:298;;;53616:1;53609:8;;;;53553:298;53763:76;53826:12;53764:56;53779:40;35912:3;;53779:21;;:40;;;;:::i;:::-;53764:10;:14;;:56;;;;:::i;:::-;53763:62;;:76;;;;:::i;:::-;53756:83;;53429:429;;;;;:::o;4665:192::-;4751:7;4784:1;4779;:6;;4787:12;4771:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4811:9;4827:1;4823;:5;4811:17;;4848:1;4841:8;;;4665:192;;;;;:::o;6691:278::-;6777:7;6809:1;6805;:5;6812:12;6797:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6836:9;6852:1;6848;:5;;;;;;6836:17;;6960:1;6953:8;;;6691:278;;;;;:::o;18227:761::-;18651:23;18677:69;18705:4;18677:69;;;;;;;;;;;;;;;;;18685:5;18677:27;;;;:69;;;;;:::i;:::-;18651:95;;18781:1;18761:10;:17;:21;18757:224;;;18903:10;18892:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18884:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18757:224;18227:761;;;:::o;41670:585::-;41751:27;41781:58;41810:28;41827:10;41810:16;:28::i;:::-;41781:12;41794:10;41781:24;;;;;;;;;;;;;;;;:28;;:58;;;;:::i;:::-;41751:88;;41906:1;41892:10;:15;41889:124;;41943:12;41961:39;35912:3;41962:14;41973:2;41962:6;:10;;:14;;;;:::i;:::-;41961:20;;:39;;;;:::i;:::-;41943:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41889:124;42039:1;42026:10;:14;42023:124;;;42078:12;42096:38;35912:3;42097:13;42108:1;42097:6;:10;;:13;;;;:::i;:::-;42096:19;;:38;;;;:::i;:::-;42078:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42023:124;42191:56;42227:19;42191:12;42204:17;42219:1;42204:10;:14;;:17;;;;:::i;:::-;42191:31;;;;;;;;;;;;;;;;:35;;:56;;;;:::i;:::-;42157:12;42170:17;42185:1;42170:10;:14;;:17;;;;:::i;:::-;42157:31;;;;;;;;;;;;;;;:90;;;;41670:585;;;:::o;42267:215::-;42435:39;42463:10;42435:27;:39::i;:::-;42328:12;:24;42341:10;42328:24;;;;;;;;;;;42353:1;42328:27;;;;;;;;;42366:12;:24;42379:10;42366:24;;;;;;;;;;;42391:1;42366:27;;;;;;;;;42404:12;:24;42417:10;42404:24;;;;;;;;;;;42429:1;42404:27;;;;;;;;;42327:147;;;;;;;;;;;;;;;;;;42267:215;:::o;11923:195::-;12026:12;12058:52;12080:6;12088:4;12094:1;12097:12;12058:21;:52::i;:::-;12051:59;;11923:195;;;;;:::o;12975:530::-;13102:12;13160:5;13135:21;:30;;13127:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13227:18;13238:6;13227:10;:18::i;:::-;13219:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13353:12;13367:23;13394:6;:11;;13414:5;13422:4;13394:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13352:75;;;;13445:52;13463:7;13472:10;13484:12;13445:17;:52::i;:::-;13438:59;;;;12975:530;;;;;;:::o;9005:422::-;9065:4;9273:12;9384:7;9372:20;9364:28;;9418:1;9411:4;:8;9404:15;;;9005:422;;;:::o;14511:742::-;14626:12;14655:7;14651:595;;;14686:10;14679:17;;;;14651:595;14820:1;14800:10;:17;:21;14796:439;;;15063:10;15057:17;15124:15;15111:10;15107:2;15103:19;15096:44;15011:148;15206:12;15199:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14511:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://5c7d11244b586f904ef8a4429b496b18d6f7d559b1350314714e49d102570fcf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.