Source Code
Latest 25 from a total of 2,949 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Emergency Withdr... | 22015328 | 350 days ago | IN | 0 ETH | 0.00005159 | ||||
| Emergency Withdr... | 20060675 | 623 days ago | IN | 0 ETH | 0.00044325 | ||||
| Emergency Withdr... | 12611135 | 1718 days ago | IN | 0 ETH | 0.00049599 | ||||
| Emergency Withdr... | 12611046 | 1718 days ago | IN | 0 ETH | 0.00048128 | ||||
| Emergency Withdr... | 12611018 | 1718 days ago | IN | 0 ETH | 0.00048128 | ||||
| Emergency Withdr... | 12610971 | 1718 days ago | IN | 0 ETH | 0.00048128 | ||||
| Emergency Withdr... | 12610963 | 1718 days ago | IN | 0 ETH | 0.00053476 | ||||
| Emergency Withdr... | 12610941 | 1718 days ago | IN | 0 ETH | 0.00064171 | ||||
| Emergency Withdr... | 12610684 | 1718 days ago | IN | 0 ETH | 0.00053476 | ||||
| Emergency Withdr... | 12610625 | 1718 days ago | IN | 0 ETH | 0.00048128 | ||||
| Emergency Withdr... | 12610494 | 1718 days ago | IN | 0 ETH | 0.00064171 | ||||
| Emergency Withdr... | 12609990 | 1718 days ago | IN | 0 ETH | 0.00053476 | ||||
| Emergency Withdr... | 12609866 | 1718 days ago | IN | 0 ETH | 0.0004796 | ||||
| Emergency Withdr... | 12609866 | 1718 days ago | IN | 0 ETH | 0.000436 | ||||
| Emergency Withdr... | 12609861 | 1718 days ago | IN | 0 ETH | 0.00053476 | ||||
| Emergency Withdr... | 12591078 | 1721 days ago | IN | 0 ETH | 0.00060621 | ||||
| Deposit | 12372271 | 1755 days ago | IN | 0 ETH | 0.00486316 | ||||
| Withdraw | 12313191 | 1764 days ago | IN | 0 ETH | 0.0046409 | ||||
| Deposit | 12293276 | 1767 days ago | IN | 0 ETH | 0.01333604 | ||||
| Withdraw | 12237423 | 1776 days ago | IN | 0 ETH | 0.01541218 | ||||
| Withdraw | 12214888 | 1779 days ago | IN | 0 ETH | 0.00703555 | ||||
| Withdraw | 12196826 | 1782 days ago | IN | 0 ETH | 0.00903098 | ||||
| Deposit | 12196620 | 1782 days ago | IN | 0 ETH | 0.01375132 | ||||
| Withdraw | 12192102 | 1783 days ago | IN | 0 ETH | 0.01321044 | ||||
| Withdraw | 12184237 | 1784 days ago | IN | 0 ETH | 0.01404854 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Caesar
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-11-12
*/
/**
*Submitted for verification at Etherscan.io on 2020-08-26
*/
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.6.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/math/SafeMath.sol
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/utils/Address.sol
/**
* @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) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
/**
* @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");
}
}
}
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256`
* (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(value)));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(value)));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(value)));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint256(_at(set._inner, index)));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
// File: @openzeppelin/contracts/GSN/Context.sol
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
contract wksaToken is Context, IERC20, Ownable {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
mapping (address => bool) public minters;
mapping (address => bool) public blackAccounts;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name, string memory symbol) public {
_name = name;
_symbol = symbol;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
require(!blackAccounts[recipient]);
_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) {
require(!blackAccounts[recipient]);
_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");
_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");
_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");
_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 is 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_;
}
/// @notice Creates `_amount` token to `_to`. Must only be called by the owner.
function mint(address _to, uint256 _amount) public{
require(minters[msg.sender], "!minter");
require (totalSupply() + _amount <= 20000*1e18, 'totalSupply exceeds 20000');
_mint(_to, _amount);
}
function addMinter(address _minter) public onlyOwner{
minters[_minter] = true;
}
function removeMinter(address _minter) public onlyOwner{
minters[_minter] = false;
}
function addBlackAccount(address _account) public onlyOwner{
blackAccounts[_account] = true;
}
function removeBlockAccount(address _account) public onlyOwner{
blackAccounts[_account] = false;
}
}
// File: contracts/caesar.sol
pragma solidity 0.6.12;
interface IMigrator {
// Perform LP token migration from legacy UniswapV2 to kkSwap.
// Take the current LP token address and return the new LP token address.
// Migrator should have full access to the caller's LP token.
// Return the new LP token address.
//
// XXX Migrator must have allowance access to UniswapV2 LP tokens.
// kkSwap must mint EXACTLY the same amount of kkSwap LP tokens or
// else something bad will happen. Traditional UniswapV2 does not
// do that so be careful!
function migrate(IERC20 token) external returns (IERC20);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721{
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of NFTs in `owner`'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the NFT specified by `tokenId`.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
* another (`to`).
*
*
*
* Requirements:
* - `from`, `to` cannot be zero.
* - `tokenId` must be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this
* NFT by either {approve} or {setApprovalForAll}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
* another (`to`).
*
* Requirements:
* - If the caller is not `from`, it must be approved to move this NFT by
* either {approve} or {setApprovalForAll}.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) external;
}
// Caesar is the master of wKSA. He can make wKSA and he is a fair guy.
//
// Note that it's ownable and the owner wields tremendous power. The ownership
// will be transferred to a governance smart contract once wksa is sufficiently
// distributed and the community can show to govern itself.
//
// Have fun reading it. Hopefully it's bug-free. God bless.
contract Caesar is Ownable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
// Info of each user.
struct UserInfo {
uint256 amount; // How many LP tokens the user has provided.
uint256 rewardDebt; // Reward debt. See explanation below.
uint256 weight;
uint256 nksnLength;
uint256 nkcnLength;
uint256 nkcmLength;
uint256 inviteNumber;
//
// We do some fancy math here. Basically, any point in time, the amount of wksa
// entitled to a user but is pending to be distributed is:
//
// pending reward = (user.amount * pool.accWKSAPerShare) - user.rewardDebt
//
// Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens:
// 1. The pool's `accWKSAPerShare` (and `lastRewardBlock`) gets updated.
// 2. User receives the pending reward sent to his/her address.
// 3. User's `amount` gets updated.
// 4. User's `rewardDebt` gets updated.
}
// Info of each pool.
struct PoolInfo {
IERC20 lpToken; // Address of LP token contract.
uint256 allocPoint; // How many allocation points assigned to this pool. wKSA to distribute per block.
uint256 lastRewardBlock; // Last block number that wKSA distribution occurs.
uint256 weightedSupply;
uint256 accWKSAPerShare; // Accumulated wKSA per share, times 1e12. See below.
}
// The wKSA TOKEN!
wksaToken public wksa;
// Block number when bonus wKSA period ends.
uint256 public bonusEndBlock;
// wKSA tokens created per block.
uint256 public wksaPerBlock;
// Bonus muliplier for early wksa makers.
uint256 public constant BONUS_MULTIPLIER = 5;
// The migrator contract. It has a lot of power. Can only be set through governance (owner).
IMigrator public migrator;
// Info of each pool.
PoolInfo[] public poolInfo;
// Info of each user that stakes LP tokens.
mapping (uint256 => mapping (address => UserInfo)) public userInfo;
mapping (uint256 => mapping (address => uint256[])) public nksnList;
mapping (uint256 => mapping (address => uint256[])) public nkcnList;
mapping (uint256 => mapping (address => uint256[])) public nkcmList;
// Total allocation poitns. Must be the sum of all allocation points in all pools.
uint256 public totalAllocPoint = 0;
// The block number when wKSA mining starts.
uint256 public startBlock;
// Last user id
uint256 public lastUser;
// Find user's address by id
mapping (uint256 => address) public idToAddr;
// Find user's id by address
mapping (address => uint256) public addrToId;
// Set user's inviter
mapping (address => address) public inviter;
// Amount of userd invited
mapping (address => address[]) public inviterList;
// NFT bonus
mapping (uint256 => uint256) public levelBonus;
// NFT addresses
IERC721 public nksnToken = IERC721(0xEB34C0D43893d72601106AbED8BD413fdba6D0ab);
IERC721 public nkcnToken = IERC721(0xBb23dfb032477e251B260D19AEc4C3641693c688);
IERC721 public nkcmToken = IERC721(0xc22395d3F39715Ca966BebD5489D5303b29b93df);
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
event NFTReceived(address operator, address from, uint256 tokenId, bytes data);
constructor(
wksaToken _wksa,
uint256 _wksaPerBlock,
uint256 _startBlock,
uint256 _bonusEndBlock
) public {
levelBonus[1] = 1e10;
for (uint256 i = 2; i <= 5; i++) {
levelBonus[i] = levelBonus[i-1] + levelBonus[1].div(2**(i-1));
}
lastUser = 1;
wksa = _wksa;
wksaPerBlock = _wksaPerBlock;
bonusEndBlock = _bonusEndBlock;
startBlock = _startBlock;
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
// Add a new lp to the pool. Can only be called by the owner.
// XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do.
function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate) public onlyOwner {
if (_withUpdate) {
massUpdatePools();
}
uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
totalAllocPoint = totalAllocPoint.add(_allocPoint);
poolInfo.push(PoolInfo({
lpToken: _lpToken,
allocPoint: _allocPoint,
lastRewardBlock: lastRewardBlock,
weightedSupply: 0,
accWKSAPerShare: 0
}));
}
// Update the given pool's wKSA allocation point. Can only be called by the owner.
function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner {
if (_withUpdate) {
massUpdatePools();
}
totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
poolInfo[_pid].allocPoint = _allocPoint;
}
// Set the migrator contract. Can only be called by the owner.
function setMigrator(IMigrator _migrator) public onlyOwner {
migrator = _migrator;
}
// Migrate lp token to another lp contract. Can be called by anyone. We trust that migrator contract is good.
function migrate(uint256 _pid) public {
require(address(migrator) != address(0), "migrate: no migrator");
PoolInfo storage pool = poolInfo[_pid];
IERC20 lpToken = pool.lpToken;
uint256 bal = lpToken.balanceOf(address(this));
lpToken.safeApprove(address(migrator), bal);
IERC20 newLpToken = migrator.migrate(lpToken);
require(bal == newLpToken.balanceOf(address(this)), "migrate: bad");
pool.lpToken = newLpToken;
}
// Return reward multiplier over the given _from to _to block.
function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {
if (_to <= bonusEndBlock) {
return _to.sub(_from).mul(BONUS_MULTIPLIER);
} else if (_from >= bonusEndBlock) {
return _to.sub(_from);
} else {
return bonusEndBlock.sub(_from).mul(BONUS_MULTIPLIER).add(
_to.sub(bonusEndBlock)
);
}
}
// Return reward weight on NFTs staked and users invited
function getWeight(uint256 _nksn, uint256 _nkcn, uint256 _nkcm, uint256 _inviteAmount) public view returns (uint256) {
uint256 weight = _inviteAmount.mul(1e10).add(1e12);
if(weight > 120e10){
weight = 120e10;
}
if(_nksn >= 5){
weight = weight.add(levelBonus[5].mul(15));
}
else{
weight = weight.add(levelBonus[_nksn].mul(15));
}
if(_nkcn >= 5){
weight = weight.add(levelBonus[5].mul(10));
}
else{
weight = weight.add(levelBonus[_nkcn].mul(10));
}
if(_nkcm >= 5){
weight = weight.add(levelBonus[5].mul(5));
}
else{
weight = weight.add(levelBonus[_nkcm].mul(5));
}
return weight;
}
// View function to see pending wKSA on frontend.
function pendingWKSA(uint256 _pid, address _user) external view returns (uint256) {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accWKSAPerShare = pool.accWKSAPerShare;
uint256 lpSupply = pool.weightedSupply;
if (block.number > pool.lastRewardBlock && lpSupply != 0) {
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
uint256 wksaReward = multiplier.mul(wksaPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
accWKSAPerShare = accWKSAPerShare.add(wksaReward.mul(1e12).div(lpSupply));
}
return user.amount.mul(user.weight).div(1e12).mul(accWKSAPerShare).div(1e12).sub(user.rewardDebt);
}
// Update reward vairables for all pools. Be careful of gas spending!
function massUpdatePools() public {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
// Update reward variables of the given pool to be up-to-date.
function updatePool(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
if (block.number <= pool.lastRewardBlock) {
return;
}
uint256 lpSupply = pool.weightedSupply;
if (lpSupply == 0) {
pool.lastRewardBlock = block.number;
return;
}
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
uint256 wksaReward = multiplier.mul(wksaPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
wksa.mint(address(this), wksaReward);
pool.accWKSAPerShare = pool.accWKSAPerShare.add(wksaReward.mul(1e12).div(lpSupply));
pool.lastRewardBlock = block.number;
}
// Update reward weight of the given pool
function updatePoolWeight(uint256 _pid, address _user) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint newWeight = getWeight(user.nksnLength, user.nkcnLength, user.nkcmLength, user.inviteNumber);
if(newWeight != user.weight){
pool.weightedSupply = pool.weightedSupply.add(user.amount.mul(newWeight).div(1e12)).sub(user.amount.mul(user.weight).div(1e12));
}
}
// Update reward weight of the given user
function updateUserWeight(uint256 _pid, address _user) public {
UserInfo storage user = userInfo[_pid][_user];
uint newWeight = getWeight(user.nksnLength, user.nkcnLength, user.nkcmLength, user.inviteNumber);
if(newWeight != user.weight){
user.weight = newWeight;
}
}
// Deposit LP tokens to Caesar for wksa allocation.
function deposit(uint256 _pid, uint256 _amount, uint256 _inviter) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
updatePool(_pid);
if(user.weight == 0){
user.weight = getWeight(user.nksnLength, user.nkcnLength, user.nkcmLength, user.inviteNumber);
}
if (user.amount > 0) {
uint256 pending = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12).sub(user.rewardDebt);
safeWKSATransfer(msg.sender, pending);
}
if(_amount > 0 && addrToId[msg.sender] == 0){
addrToId[msg.sender] = lastUser;
idToAddr[lastUser] = msg.sender;
lastUser ++;
if(_inviter > 0 && _inviter < addrToId[msg.sender] &&
idToAddr[_inviter] != address(0) && inviter[msg.sender] == address(0)){
inviterList[idToAddr[_inviter]].push(msg.sender);
UserInfo storage upline = userInfo[_pid][idToAddr[_inviter]];
upline.inviteNumber ++;
inviter[msg.sender] = idToAddr[_inviter];
if(upline.amount > 0){
uint256 pending = upline.amount.mul(upline.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12).sub(upline.rewardDebt);
safeWKSATransfer(idToAddr[_inviter], pending);
}
updatePoolWeight(_pid, idToAddr[_inviter]);
updateUserWeight(_pid, idToAddr[_inviter]);
upline.rewardDebt = upline.amount.mul(upline.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12);
}
}
pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
user.amount = user.amount.add(_amount);
pool.weightedSupply = pool.weightedSupply.add(_amount.mul(user.weight).div(1e12));
user.rewardDebt = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12);
emit Deposit(msg.sender, _pid, _amount);
}
// Withdraw LP tokens from Caesar.
function withdraw(uint256 _pid, uint256 _amount) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
require(user.amount >= _amount, "withdraw: not good");
updatePool(_pid);
uint256 pending = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12).sub(user.rewardDebt);
safeWKSATransfer(msg.sender, pending);
pool.weightedSupply = pool.weightedSupply.sub(_amount.mul(user.weight).div(1e12));
user.amount = user.amount.sub(_amount);
user.rewardDebt = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12);
pool.lpToken.safeTransfer(address(msg.sender), _amount);
emit Withdraw(msg.sender, _pid, _amount);
}
// Withdraw without caring about rewards. EMERGENCY ONLY.
function emergencyWithdraw(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
pool.lpToken.safeTransfer(address(msg.sender), user.amount);
emit EmergencyWithdraw(msg.sender, _pid, user.amount);
user.amount = 0;
user.rewardDebt = 0;
}
// Safe wksa transfer function, just in case if rounding error causes pool to not have enough wksa.
function safeWKSATransfer(address _to, uint256 _amount) internal {
uint256 wksaBal = wksa.balanceOf(address(this));
if (_amount > wksaBal) {
wksa.transfer(_to, wksaBal);
} else {
wksa.transfer(_to, _amount);
}
}
function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4) {
emit NFTReceived(operator, from, tokenId, data);
return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));
}
function stakeNKSN(uint256 nksnId, uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
nksnList[_pid][msg.sender].push(nksnId);
user.nksnLength ++;
nksnToken.safeTransferFrom(msg.sender, address(this), nksnId);
updatePool(_pid);
if (user.amount > 0) {
uint256 pending = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12).sub(user.rewardDebt);
safeWKSATransfer(msg.sender, pending);
}
updatePoolWeight(_pid, msg.sender);
updateUserWeight(_pid, msg.sender);
user.rewardDebt = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12);
}
function withdrawNKSN(uint256 nksnId, uint256 _pid) public {
require(nksnId > 0, "the nksnId error");
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
for(uint256 i = 0; i < nksnList[_pid][msg.sender].length; i ++){
if(nksnList[_pid][msg.sender][i] == nksnId){
nksnList[_pid][msg.sender][i] = nksnList[_pid][msg.sender][nksnList[_pid][msg.sender].length-1];
nksnList[_pid][msg.sender].pop();
user.nksnLength --;
nksnToken.safeTransferFrom(address(this), msg.sender, nksnId);
break;
}
}
updatePool(_pid);
uint256 pending = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12).sub(user.rewardDebt);
safeWKSATransfer(msg.sender, pending);
updatePoolWeight(_pid, msg.sender);
updateUserWeight(_pid, msg.sender);
user.rewardDebt = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12);
}
function stakeNKCN(uint256 nkcnId, uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
nkcnList[_pid][msg.sender].push(nkcnId);
user.nkcnLength ++;
nkcnToken.safeTransferFrom(msg.sender, address(this), nkcnId);
updatePool(_pid);
if (user.amount > 0) {
uint256 pending = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12).sub(user.rewardDebt);
safeWKSATransfer(msg.sender, pending);
}
updatePoolWeight(_pid, msg.sender);
updateUserWeight(_pid, msg.sender);
user.rewardDebt = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12);
}
function withdrawNKCN(uint256 nkcnId, uint256 _pid) public {
require(nkcnId > 0, "the nkcnId error");
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
for(uint256 i = 0; i < nkcnList[_pid][msg.sender].length; i ++){
if(nkcnList[_pid][msg.sender][i] == nkcnId){
nkcnList[_pid][msg.sender][i] = nkcnList[_pid][msg.sender][nkcnList[_pid][msg.sender].length-1];
nkcnList[_pid][msg.sender].pop();
user.nkcnLength --;
nkcnToken.safeTransferFrom(address(this), msg.sender, nkcnId);
break;
}
}
updatePool(_pid);
uint256 pending = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12).sub(user.rewardDebt);
safeWKSATransfer(msg.sender, pending);
updatePoolWeight(_pid, msg.sender);
updateUserWeight(_pid, msg.sender);
user.rewardDebt = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12);
}
function stakeNKCM(uint256 nkcmId, uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
nkcmList[_pid][msg.sender].push(nkcmId);
user.nkcmLength ++ ;
nkcmToken.safeTransferFrom(msg.sender, address(this), nkcmId);
updatePool(_pid);
if (user.amount > 0) {
uint256 pending = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12).sub(user.rewardDebt);
safeWKSATransfer(msg.sender, pending);
}
updatePoolWeight(_pid, msg.sender);
updateUserWeight(_pid, msg.sender);
user.rewardDebt = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12);
}
function withdrawNKCM(uint256 nkcmId, uint256 _pid) public {
require(nkcmId > 0, "the nksmId error");
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
for(uint256 i = 0; i < nkcmList[_pid][msg.sender].length; i ++){
if(nkcmList[_pid][msg.sender][i] == nkcmId){
nkcmList[_pid][msg.sender][i] = nkcmList[_pid][msg.sender][nkcmList[_pid][msg.sender].length-1];
nkcmList[_pid][msg.sender].pop();
user.nkcmLength --;
nkcmToken.safeTransferFrom(address(this), msg.sender, nkcmId);
break;
}
}
updatePool(_pid);
uint256 pending = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12).sub(user.rewardDebt);
safeWKSATransfer(msg.sender, pending);
updatePoolWeight(_pid, msg.sender);
updateUserWeight(_pid, msg.sender);
user.rewardDebt = user.amount.mul(user.weight).div(1e12).mul(pool.accWKSAPerShare).div(1e12);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract wksaToken","name":"_wksa","type":"address"},{"internalType":"uint256","name":"_wksaPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"NFTReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addrToId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_inviter","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nksn","type":"uint256"},{"internalType":"uint256","name":"_nkcn","type":"uint256"},{"internalType":"uint256","name":"_nkcm","type":"uint256"},{"internalType":"uint256","name":"_inviteAmount","type":"uint256"}],"name":"getWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"inviter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"inviterList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"levelBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigrator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nkcmList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nkcmToken","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nkcnList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nkcnToken","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nksnList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nksnToken","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingWKSA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"weightedSupply","type":"uint256"},{"internalType":"uint256","name":"accWKSAPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigrator","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nkcmId","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"stakeNKCM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nkcnId","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"stakeNKCN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nksnId","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"stakeNKSN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"updatePoolWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"updateUserWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"nksnLength","type":"uint256"},{"internalType":"uint256","name":"nkcnLength","type":"uint256"},{"internalType":"uint256","name":"nkcmLength","type":"uint256"},{"internalType":"uint256","name":"inviteNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nkcmId","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdrawNKCM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nkcnId","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdrawNKCN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nksnId","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdrawNKSN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wksa","outputs":[{"internalType":"contract wksaToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wksaPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040526000600a5573eb34c0d43893d72601106abed8bd413fdba6d0ab601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073bb23dfb032477e251b260d19aec4c3641693c688601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c22395d3f39715ca966bebd5489d5303b29b93df601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200011557600080fd5b5060405162005e4238038062005e42833981810160405260808110156200013b57600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919050505060006200017c6200032260201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506402540be4006011600060018152602001908152602001600020819055506000600290505b60058111620002b9576200027c6001820360020a6011600060018152602001908152602001600020546200032a60201b62004ce51790919060201c565b601160006001840381526020019081526020016000205401601160008381526020019081526020016000208190555080806001019150506200023f565b506001600c8190555083600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826003819055508060028190555081600b819055505050505062000447565b600033905090565b60006200037483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200037c60201b60201c565b905092915050565b600080831182906200042c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620003f0578082015181840152602081019050620003d3565b50505050905090810190601f1680156200041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200043957fe5b049050809150509392505050565b6159eb80620004576000396000f3fe608060405234801561001057600080fd5b50600436106102895760003560e01c806351eb05a61161015c57806393f1a40b116100ce578063cd857a1c11610087578063cd857a1c14610d34578063e18cb3d614610d6c578063e19ccf8714610dce578063ee8f0b7a14610e06578063f2fde38b14610e74578063ff079eb314610eb857610289565b806393f1a40b14610b7857806398d71fc114610c04578063a33c4df114610c52578063a50ab7ab14610caa578063b0b95fa214610cde578063c7e548a614610cfc57610289565b8063715018a611610120578063715018a614610a4e5780637cd07e4714610a585780638aa2855014610a8c5780638da5cb5b14610aaa5780638dbb1e3a14610ade5780638ed2f58914610b2a57610289565b806351eb05a61461096c5780635312ea8e1461099a578063630b5ba1146109c857806364482f79146109d257806370b6d7e614610a1657610289565b806323cf3118116102005780634511f56e116101b95780634511f56e146107f0578063454b06081461084857806348cd4cb114610876578063496abe8a146108945780634aad528f146108cc5780634c70536c1461093857610289565b806323cf311814610630578063248f5eff1461067457806328a5138c146106d45780633079d93f1461074c578063441a3e701461078057806344be421d146107b857610289565b8063150b7a0211610252578063150b7a02146103ac5780631526fe27146104e457806317caf6f1146105585780631aed6553146105765780631e255d7c146105945780631eaaa045146105d657610289565b8062aeef8a1461028e57806301e953a7146102d05780630314f02e1461033c578063081e3eda1461035a5780631299fbd714610378575b600080fd5b6102ce600480360360608110156102a457600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610f24565b005b610326600480360360608110156102e657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117fb565b6040518082815260200191505060405180910390f35b610344611836565b6040518082815260200191505060405180910390f35b61036261183c565b6040518082815260200191505060405180910390f35b610380611849565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104af600480360360808110156103c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561042957600080fd5b82018360208201111561043b57600080fd5b8035906020019184600183028401116401000000008311171561045d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061186f565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b610510600480360360208110156104fa57600080fd5b810190808035906020019092919050505061197c565b604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6105606119df565b6040518082815260200191505060405180910390f35b61057e6119e5565b6040518082815260200191505060405180910390f35b6105c0600480360360208110156105aa57600080fd5b81019080803590602001909291905050506119eb565b6040518082815260200191505060405180910390f35b61062e600480360360608110156105ec57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611a03565b005b6106726004803603602081101561064657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bed565b005b6106be6004803603608081101561068a57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611cf9565b6040518082815260200191505060405180910390f35b610720600480360360408110156106ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ee0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610754611f2b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107b66004803603604081101561079657600080fd5b810190808035906020019092919080359060200190929190505050611f51565b005b6107ee600480360360408110156107ce57600080fd5b810190808035906020019092919080359060200190929190505050612241565b005b61081c6004803603602081101561080657600080fd5b8101908080359060200190929190505050612788565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108746004803603602081101561085e57600080fd5b81019080803590602001909291905050506127bb565b005b61087e612be5565b6040518082815260200191505060405180910390f35b6108ca600480360360408110156108aa57600080fd5b810190808035906020019092919080359060200190929190505050612beb565b005b610922600480360360608110156108e257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613132565b6040518082815260200191505060405180910390f35b61094061316d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109986004803603602081101561098257600080fd5b8101908080359060200190929190505050613193565b005b6109c6600480360360208110156109b057600080fd5b810190808035906020019092919050505061333e565b005b6109d0613470565b005b610a14600480360360608110156109e857600080fd5b81019080803590602001909291908035906020019092919080351515906020019092919050505061349d565b005b610a4c60048036036040811015610a2c57600080fd5b8101908080359060200190929190803590602001909291905050506135e7565b005b610a56613b2e565b005b610a60613cb4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a94613cda565b6040518082815260200191505060405180910390f35b610ab2613cdf565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b1460048036036040811015610af457600080fd5b810190808035906020019092919080359060200190929190505050613d08565b6040518082815260200191505060405180910390f35b610b7660048036036040811015610b4057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613dba565b005b610bc460048036036040811015610b8e57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613eef565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b610c5060048036036040811015610c1a57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f3e565b005b610c9460048036036020811015610c6857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fcd565b6040518082815260200191505060405180910390f35b610cb2613fe5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ce661400b565b6040518082815260200191505060405180910390f35b610d3260048036036040811015610d1257600080fd5b810190808035906020019092919080359060200190929190505050614011565b005b610d6a60048036036040811015610d4a57600080fd5b8101908080359060200190929190803590602001909291905050506142f4565b005b610db860048036036040811015610d8257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506145d7565b6040518082815260200191505060405180910390f35b610e0460048036036040811015610de457600080fd5b810190808035906020019092919080359060200190929190505050614789565b005b610e4860048036036020811015610e1c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614a6c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610eb660048036036020811015610e8a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614a9f565b005b610f0e60048036036060811015610ece57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614caa565b6040518082815260200191505060405180910390f35b600060058481548110610f3357fe5b9060005260206000209060050201905060006006600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610fa085613193565b600081600201541415610fd257610fc98160030154826004015483600501548460060154611cf9565b81600201819055505b600081600001541115611064576000611056826001015461104864e8d4a5100061103a876004015461102c64e8d4a5100061101e8a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506110623382614dff565b505b6000841180156110b357506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b1561168257600c54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555033600d6000600c54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c600081548092919060010191905055506000831180156111b25750600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483105b801561121e5750600073ffffffffffffffffffffffffffffffffffffffff16600d600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156112b55750600073ffffffffffffffffffffffffffffffffffffffff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156116815760106000600d600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600660008781526020019081526020016000206000600d600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060060160008154809291906001019190505550600d600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008160000154111561159e57600061155d826001015461154f64e8d4a51000611541886004015461153364e8d4a510006115258a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b905061159c600d600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614dff565b505b6115db86600d600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613dba565b61161886600d600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613f3e565b61167764e8d4a51000611669856004015461165b64e8d4a5100061164d87600201548860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b8160010181905550505b5b6116d33330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16615078909392919063ffffffff16565b6116ea84826000015461513990919063ffffffff16565b816000018190555061173661172364e8d4a51000611715846002015488614d2f90919063ffffffff16565b614ce590919063ffffffff16565b836003015461513990919063ffffffff16565b826003018190555061179d64e8d4a5100061178f846004015461178164e8d4a5100061177387600201548860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b8160010181905550843373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15866040518082815260200191505060405180910390a35050505050565b6009602052826000526040600020602052816000526040600020818154811061182057fe5b9060005260206000200160009250925050505481565b60035481565b6000600580549050905090565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f1d823cdc8f0514a95b53538df2d2f3deaf98d1c534c6e750daa593173c27f8f085858585604051808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156119145780820151818401526020810190506118f9565b50505050905090810190601f1680156119415780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a17f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f9050949350505050565b6005818154811061198957fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b600a5481565b60025481565b60116020528060005260406000206000915090505481565b611a0b6151c1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611acb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015611ada57611ad9613470565b5b6000600b544311611aed57600b54611aef565b435b9050611b0684600a5461513990919063ffffffff16565b600a8190555060056040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001868152602001838152602001600081526020016000815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040155505050505050565b611bf56151c1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cb5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611d2b64e8d4a51000611d1d6402540be40086614d2f90919063ffffffff16565b61513990919063ffffffff16565b90506501176592e000811115611d45576501176592e00090505b60058610611d8e57611d87611d78600f601160006005815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b9050611dca565b611dc7611db8600f601160008a815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b90505b60058510611e1357611e0c611dfd600a601160006005815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b9050611e4f565b611e4c611e3d600a6011600089815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b90505b60058410611e9857611e91611e826005601160006005815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b9050611ed4565b611ed1611ec260056011600088815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b90505b80915050949350505050565b60106020528160005260406000208181548110611ef957fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060058381548110611f6057fe5b9060005260206000209060050201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050828160000154101561203e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b61204784613193565b60006120be82600101546120b064e8d4a510006120a2876004015461209464e8d4a510006120868a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506120ca3382614dff565b61210e6120fb64e8d4a510006120ed856002015488614d2f90919063ffffffff16565b614ce590919063ffffffff16565b8460030154614db590919063ffffffff16565b836003018190555061212d848360000154614db590919063ffffffff16565b826000018190555061219464e8d4a51000612186856004015461217864e8d4a5100061216a88600201548960000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b82600101819055506121eb33858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166151c99092919063ffffffff16565b843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b600082116122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f746865206e6b736e4964206572726f720000000000000000000000000000000081525060200191505060405180910390fd5b6000600582815481106122c657fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b6007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561267957846007600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106123e457fe5b9060005260206000200154141561266c576007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060016007600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481106124a657fe5b90600052602060002001546007600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061250c57fe5b90600052602060002001819055506007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061257357fe5b60019003818190600052602060002001600090559055816003016000815480929190600190039190505550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561264f57600080fd5b505af1158015612663573d6000803e3d6000fd5b50505050612679565b808060010191505061232d565b5061268383613193565b60006126fa82600101546126ec64e8d4a510006126de87600401546126d064e8d4a510006126c28a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506127063382614dff565b6127108433613dba565b61271a8433613f3e565b61277964e8d4a5100061276b856004015461275d64e8d4a5100061274f88600201548960000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b82600101819055505050505050565b600d6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6d6967726174653a206e6f206d69677261746f7200000000000000000000000081525060200191505060405180910390fd5b60006005828154811061288f57fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561293157600080fd5b505afa158015612945573d6000803e3d6000fd5b505050506040513d602081101561295b57600080fd5b810190808051906020019092919050505090506129bb600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff1661526b9092919063ffffffff16565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ce5494bb846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015612a4857600080fd5b505af1158015612a5c573d6000803e3d6000fd5b505050506040513d6020811015612a7257600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612aec57600080fd5b505afa158015612b00573d6000803e3d6000fd5b505050506040513d6020811015612b1657600080fd5b81019080805190602001909291905050508214612b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6d6967726174653a20626164000000000000000000000000000000000000000081525060200191505060405180910390fd5b808460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b600b5481565b60008211612c61576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f746865206e6b636e4964206572726f720000000000000000000000000000000081525060200191505060405180910390fd5b600060058281548110612c7057fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b6008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561302357846008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612d8e57fe5b90600052602060002001541415613016576008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060016008600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490500381548110612e5057fe5b90600052602060002001546008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612eb657fe5b90600052602060002001819055506008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480612f1d57fe5b60019003818190600052602060002001600090559055816004016000815480929190600190039190505550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612ff957600080fd5b505af115801561300d573d6000803e3d6000fd5b50505050613023565b8080600101915050612cd7565b5061302d83613193565b60006130a4826001015461309664e8d4a51000613088876004015461307a64e8d4a5100061306c8a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506130b03382614dff565b6130ba8433613dba565b6130c48433613f3e565b61312364e8d4a51000613115856004015461310764e8d4a510006130f988600201548960000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b82600101819055505050505050565b6008602052826000526040600020602052816000526040600020818154811061315757fe5b9060005260206000200160009250925050505481565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600582815481106131a257fe5b90600052602060002090600502019050806002015443116131c3575061333b565b60008160030154905060008114156131e557438260020181905550505061333b565b60006131f5836002015443613d08565b90506000613238600a5461322a866001015461321c60035487614d2f90919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156132cd57600080fd5b505af11580156132e1573d6000803e3d6000fd5b505050506133256133128461330464e8d4a5100085614d2f90919063ffffffff16565b614ce590919063ffffffff16565b856004015461513990919063ffffffff16565b8460040181905550438460020181905550505050505b50565b60006005828154811061334d57fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506134043382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166151c99092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b6000600580549050905060005b818110156134995761348e81613193565b80600101905061347d565b5050565b6134a56151c1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613565576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801561357457613573613470565b5b6135b9826135ab6005868154811061358857fe5b906000526020600020906005020160010154600a54614db590919063ffffffff16565b61513990919063ffffffff16565b600a8190555081600584815481106135cd57fe5b906000526020600020906005020160010181905550505050565b6000821161365d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f746865206e6b736d4964206572726f720000000000000000000000000000000081525060200191505060405180910390fd5b60006005828154811061366c57fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b6009600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015613a1f57846009600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061378a57fe5b90600052602060002001541415613a12576009600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060016009600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050038154811061384c57fe5b90600052602060002001546009600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106138b257fe5b90600052602060002001819055506009600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061391957fe5b60019003818190600052602060002001600090559055816005016000815480929190600190039190505550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156139f557600080fd5b505af1158015613a09573d6000803e3d6000fd5b50505050613a1f565b80806001019150506136d3565b50613a2983613193565b6000613aa08260010154613a9264e8d4a51000613a848760040154613a7664e8d4a51000613a688a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b9050613aac3382614dff565b613ab68433613dba565b613ac08433613f3e565b613b1f64e8d4a51000613b118560040154613b0364e8d4a51000613af588600201548960000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b82600101819055505050505050565b613b366151c1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613bf6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006002548211613d4057613d396005613d2b8585614db590919063ffffffff16565b614d2f90919063ffffffff16565b9050613db4565b6002548310613d6357613d5c8383614db590919063ffffffff16565b9050613db4565b613db1613d7b60025484614db590919063ffffffff16565b613da36005613d9587600254614db590919063ffffffff16565b614d2f90919063ffffffff16565b61513990919063ffffffff16565b90505b92915050565b600060058381548110613dc957fe5b9060005260206000209060050201905060006006600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000613e4b8260030154836004015484600501548560060154611cf9565b905081600201548114613ee857613edf613e8d64e8d4a51000613e7f85600201548660000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b613ed1613ebe64e8d4a51000613eb0868860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b866003015461513990919063ffffffff16565b614db590919063ffffffff16565b83600301819055505b5050505050565b6006602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b60006006600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000613fb08260030154836004015484600501548560060154611cf9565b905081600201548114613fc7578082600201819055505b50505050565b600e6020528060005260406000206000915090505481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b60006005828154811061402057fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208490806001815401808255809150506001900390600052602060002001600090919091909150558060050160008154809291906001019190505550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156141c057600080fd5b505af11580156141d4573d6000803e3d6000fd5b505050506141e183613193565b600081600001541115614273576000614265826001015461425764e8d4a51000614249876004015461423b64e8d4a5100061422d8a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506142713382614dff565b505b61427d8333613dba565b6142878333613f3e565b6142e664e8d4a510006142d884600401546142ca64e8d4a510006142bc87600201548860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b816001018190555050505050565b60006005828154811061430357fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208490806001815401808255809150506001900390600052602060002001600090919091909150558060030160008154809291906001019190505550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156144a357600080fd5b505af11580156144b7573d6000803e3d6000fd5b505050506144c483613193565b600081600001541115614556576000614548826001015461453a64e8d4a5100061452c876004015461451e64e8d4a510006145108a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506145543382614dff565b505b6145608333613dba565b61456a8333613f3e565b6145c964e8d4a510006145bb84600401546145ad64e8d4a5100061459f87600201548860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b816001018190555050505050565b600080600584815481106145e757fe5b9060005260206000209060050201905060006006600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600401549050600083600301549050836002015443118015614671575060008114155b1561470c576000614686856002015443613d08565b905060006146c9600a546146bb88600101546146ad60035487614d2f90919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b90506147076146f8846146ea64e8d4a5100085614d2f90919063ffffffff16565b614ce590919063ffffffff16565b8561513990919063ffffffff16565b935050505b61477d836001015461476f64e8d4a510006147618661475364e8d4a510006147458b600201548c60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b94505050505092915050565b60006005828154811061479857fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506008600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208490806001815401808255809150506001900390600052602060002001600090919091909150558060040160008154809291906001019190505550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561493857600080fd5b505af115801561494c573d6000803e3d6000fd5b5050505061495983613193565b6000816000015411156149eb5760006149dd82600101546149cf64e8d4a510006149c187600401546149b364e8d4a510006149a58a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506149e93382614dff565b505b6149f58333613dba565b6149ff8333613f3e565b614a5e64e8d4a51000614a508460040154614a4264e8d4a51000614a3487600201548860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b816001018190555050505050565b600f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b614aa76151c1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614bed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061590f6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528260005260406000206020528160005260406000208181548110614ccf57fe5b9060005260206000200160009250925050505481565b6000614d2783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615430565b905092915050565b600080831415614d425760009050614daf565b6000828402905082848281614d5357fe5b0414614daa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806159356021913960400191505060405180910390fd5b809150505b92915050565b6000614df783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506154f6565b905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614e8a57600080fd5b505afa158015614e9e573d6000803e3d6000fd5b505050506040513d6020811015614eb457600080fd5b8101908080519060200190929190505050905080821115614fa357600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614f6257600080fd5b505af1158015614f76573d6000803e3d6000fd5b505050506040513d6020811015614f8c57600080fd5b810190808051906020019092919050505050615073565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561503657600080fd5b505af115801561504a573d6000803e3d6000fd5b505050506040513d602081101561506057600080fd5b8101908080519060200190929190505050505b505050565b615133846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506155b6565b50505050565b6000808284019050838110156151b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b6152668363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506155b6565b505050565b6000811480615339575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156152fc57600080fd5b505afa158015615310573d6000803e3d6000fd5b505050506040513d602081101561532657600080fd5b8101908080519060200190929190505050145b61538e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806159806036913960400191505060405180910390fd5b61542b8363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506155b6565b505050565b600080831182906154dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156154a1578082015181840152602081019050615486565b50505050905090810190601f1680156154ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816154e857fe5b049050809150509392505050565b60008383111582906155a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561556857808201518184015260208101905061554d565b50505050905090810190601f1680156155955780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060615618826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166156a59092919063ffffffff16565b90506000815111156156a05780806020019051602081101561563957600080fd5b810190808051906020019092919050505061569f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615956602a913960400191505060405180910390fd5b5b505050565b60606156b484846000856156bd565b90509392505050565b60606156c8856158c3565b61573a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061578a5780518252602082019150602081019050602083039250615767565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146157ec576040519150601f19603f3d011682016040523d82523d6000602084013e6157f1565b606091505b509150915081156158065780925050506158bb565b6000815111156158195780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615880578082015181840152602081019050615865565b50505050905090810190601f1680156158ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561590557506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220dc7474d9158f93104556d167b072b1bba2116b93d0ec1d760e349224aecf33a364736f6c634300060c0033000000000000000000000000071ecb8a06d60b4d9dc53676ae2d0d7514ed4c3c000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000ab74300000000000000000000000000000000000000000000000000000000000acfad0
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102895760003560e01c806351eb05a61161015c57806393f1a40b116100ce578063cd857a1c11610087578063cd857a1c14610d34578063e18cb3d614610d6c578063e19ccf8714610dce578063ee8f0b7a14610e06578063f2fde38b14610e74578063ff079eb314610eb857610289565b806393f1a40b14610b7857806398d71fc114610c04578063a33c4df114610c52578063a50ab7ab14610caa578063b0b95fa214610cde578063c7e548a614610cfc57610289565b8063715018a611610120578063715018a614610a4e5780637cd07e4714610a585780638aa2855014610a8c5780638da5cb5b14610aaa5780638dbb1e3a14610ade5780638ed2f58914610b2a57610289565b806351eb05a61461096c5780635312ea8e1461099a578063630b5ba1146109c857806364482f79146109d257806370b6d7e614610a1657610289565b806323cf3118116102005780634511f56e116101b95780634511f56e146107f0578063454b06081461084857806348cd4cb114610876578063496abe8a146108945780634aad528f146108cc5780634c70536c1461093857610289565b806323cf311814610630578063248f5eff1461067457806328a5138c146106d45780633079d93f1461074c578063441a3e701461078057806344be421d146107b857610289565b8063150b7a0211610252578063150b7a02146103ac5780631526fe27146104e457806317caf6f1146105585780631aed6553146105765780631e255d7c146105945780631eaaa045146105d657610289565b8062aeef8a1461028e57806301e953a7146102d05780630314f02e1461033c578063081e3eda1461035a5780631299fbd714610378575b600080fd5b6102ce600480360360608110156102a457600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610f24565b005b610326600480360360608110156102e657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117fb565b6040518082815260200191505060405180910390f35b610344611836565b6040518082815260200191505060405180910390f35b61036261183c565b6040518082815260200191505060405180910390f35b610380611849565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104af600480360360808110156103c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561042957600080fd5b82018360208201111561043b57600080fd5b8035906020019184600183028401116401000000008311171561045d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061186f565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b610510600480360360208110156104fa57600080fd5b810190808035906020019092919050505061197c565b604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6105606119df565b6040518082815260200191505060405180910390f35b61057e6119e5565b6040518082815260200191505060405180910390f35b6105c0600480360360208110156105aa57600080fd5b81019080803590602001909291905050506119eb565b6040518082815260200191505060405180910390f35b61062e600480360360608110156105ec57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611a03565b005b6106726004803603602081101561064657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bed565b005b6106be6004803603608081101561068a57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611cf9565b6040518082815260200191505060405180910390f35b610720600480360360408110156106ea57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ee0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610754611f2b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107b66004803603604081101561079657600080fd5b810190808035906020019092919080359060200190929190505050611f51565b005b6107ee600480360360408110156107ce57600080fd5b810190808035906020019092919080359060200190929190505050612241565b005b61081c6004803603602081101561080657600080fd5b8101908080359060200190929190505050612788565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108746004803603602081101561085e57600080fd5b81019080803590602001909291905050506127bb565b005b61087e612be5565b6040518082815260200191505060405180910390f35b6108ca600480360360408110156108aa57600080fd5b810190808035906020019092919080359060200190929190505050612beb565b005b610922600480360360608110156108e257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613132565b6040518082815260200191505060405180910390f35b61094061316d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109986004803603602081101561098257600080fd5b8101908080359060200190929190505050613193565b005b6109c6600480360360208110156109b057600080fd5b810190808035906020019092919050505061333e565b005b6109d0613470565b005b610a14600480360360608110156109e857600080fd5b81019080803590602001909291908035906020019092919080351515906020019092919050505061349d565b005b610a4c60048036036040811015610a2c57600080fd5b8101908080359060200190929190803590602001909291905050506135e7565b005b610a56613b2e565b005b610a60613cb4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a94613cda565b6040518082815260200191505060405180910390f35b610ab2613cdf565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b1460048036036040811015610af457600080fd5b810190808035906020019092919080359060200190929190505050613d08565b6040518082815260200191505060405180910390f35b610b7660048036036040811015610b4057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613dba565b005b610bc460048036036040811015610b8e57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613eef565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b610c5060048036036040811015610c1a57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f3e565b005b610c9460048036036020811015610c6857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fcd565b6040518082815260200191505060405180910390f35b610cb2613fe5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ce661400b565b6040518082815260200191505060405180910390f35b610d3260048036036040811015610d1257600080fd5b810190808035906020019092919080359060200190929190505050614011565b005b610d6a60048036036040811015610d4a57600080fd5b8101908080359060200190929190803590602001909291905050506142f4565b005b610db860048036036040811015610d8257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506145d7565b6040518082815260200191505060405180910390f35b610e0460048036036040811015610de457600080fd5b810190808035906020019092919080359060200190929190505050614789565b005b610e4860048036036020811015610e1c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614a6c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610eb660048036036020811015610e8a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614a9f565b005b610f0e60048036036060811015610ece57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614caa565b6040518082815260200191505060405180910390f35b600060058481548110610f3357fe5b9060005260206000209060050201905060006006600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610fa085613193565b600081600201541415610fd257610fc98160030154826004015483600501548460060154611cf9565b81600201819055505b600081600001541115611064576000611056826001015461104864e8d4a5100061103a876004015461102c64e8d4a5100061101e8a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506110623382614dff565b505b6000841180156110b357506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b1561168257600c54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555033600d6000600c54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c600081548092919060010191905055506000831180156111b25750600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483105b801561121e5750600073ffffffffffffffffffffffffffffffffffffffff16600d600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156112b55750600073ffffffffffffffffffffffffffffffffffffffff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156116815760106000600d600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600660008781526020019081526020016000206000600d600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060060160008154809291906001019190505550600d600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008160000154111561159e57600061155d826001015461154f64e8d4a51000611541886004015461153364e8d4a510006115258a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b905061159c600d600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614dff565b505b6115db86600d600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613dba565b61161886600d600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613f3e565b61167764e8d4a51000611669856004015461165b64e8d4a5100061164d87600201548860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b8160010181905550505b5b6116d33330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16615078909392919063ffffffff16565b6116ea84826000015461513990919063ffffffff16565b816000018190555061173661172364e8d4a51000611715846002015488614d2f90919063ffffffff16565b614ce590919063ffffffff16565b836003015461513990919063ffffffff16565b826003018190555061179d64e8d4a5100061178f846004015461178164e8d4a5100061177387600201548860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b8160010181905550843373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15866040518082815260200191505060405180910390a35050505050565b6009602052826000526040600020602052816000526040600020818154811061182057fe5b9060005260206000200160009250925050505481565b60035481565b6000600580549050905090565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f1d823cdc8f0514a95b53538df2d2f3deaf98d1c534c6e750daa593173c27f8f085858585604051808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156119145780820151818401526020810190506118f9565b50505050905090810190601f1680156119415780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a17f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f9050949350505050565b6005818154811061198957fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b600a5481565b60025481565b60116020528060005260406000206000915090505481565b611a0b6151c1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611acb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015611ada57611ad9613470565b5b6000600b544311611aed57600b54611aef565b435b9050611b0684600a5461513990919063ffffffff16565b600a8190555060056040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001868152602001838152602001600081526020016000815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040155505050505050565b611bf56151c1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cb5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611d2b64e8d4a51000611d1d6402540be40086614d2f90919063ffffffff16565b61513990919063ffffffff16565b90506501176592e000811115611d45576501176592e00090505b60058610611d8e57611d87611d78600f601160006005815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b9050611dca565b611dc7611db8600f601160008a815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b90505b60058510611e1357611e0c611dfd600a601160006005815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b9050611e4f565b611e4c611e3d600a6011600089815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b90505b60058410611e9857611e91611e826005601160006005815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b9050611ed4565b611ed1611ec260056011600088815260200190815260200160002054614d2f90919063ffffffff16565b8261513990919063ffffffff16565b90505b80915050949350505050565b60106020528160005260406000208181548110611ef957fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060058381548110611f6057fe5b9060005260206000209060050201905060006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050828160000154101561203e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b61204784613193565b60006120be82600101546120b064e8d4a510006120a2876004015461209464e8d4a510006120868a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506120ca3382614dff565b61210e6120fb64e8d4a510006120ed856002015488614d2f90919063ffffffff16565b614ce590919063ffffffff16565b8460030154614db590919063ffffffff16565b836003018190555061212d848360000154614db590919063ffffffff16565b826000018190555061219464e8d4a51000612186856004015461217864e8d4a5100061216a88600201548960000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b82600101819055506121eb33858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166151c99092919063ffffffff16565b843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b600082116122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f746865206e6b736e4964206572726f720000000000000000000000000000000081525060200191505060405180910390fd5b6000600582815481106122c657fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b6007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561267957846007600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106123e457fe5b9060005260206000200154141561266c576007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060016007600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481106124a657fe5b90600052602060002001546007600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061250c57fe5b90600052602060002001819055506007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061257357fe5b60019003818190600052602060002001600090559055816003016000815480929190600190039190505550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561264f57600080fd5b505af1158015612663573d6000803e3d6000fd5b50505050612679565b808060010191505061232d565b5061268383613193565b60006126fa82600101546126ec64e8d4a510006126de87600401546126d064e8d4a510006126c28a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506127063382614dff565b6127108433613dba565b61271a8433613f3e565b61277964e8d4a5100061276b856004015461275d64e8d4a5100061274f88600201548960000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b82600101819055505050505050565b600d6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6d6967726174653a206e6f206d69677261746f7200000000000000000000000081525060200191505060405180910390fd5b60006005828154811061288f57fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561293157600080fd5b505afa158015612945573d6000803e3d6000fd5b505050506040513d602081101561295b57600080fd5b810190808051906020019092919050505090506129bb600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff1661526b9092919063ffffffff16565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ce5494bb846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015612a4857600080fd5b505af1158015612a5c573d6000803e3d6000fd5b505050506040513d6020811015612a7257600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612aec57600080fd5b505afa158015612b00573d6000803e3d6000fd5b505050506040513d6020811015612b1657600080fd5b81019080805190602001909291905050508214612b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6d6967726174653a20626164000000000000000000000000000000000000000081525060200191505060405180910390fd5b808460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b600b5481565b60008211612c61576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f746865206e6b636e4964206572726f720000000000000000000000000000000081525060200191505060405180910390fd5b600060058281548110612c7057fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b6008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561302357846008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612d8e57fe5b90600052602060002001541415613016576008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060016008600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490500381548110612e5057fe5b90600052602060002001546008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612eb657fe5b90600052602060002001819055506008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480612f1d57fe5b60019003818190600052602060002001600090559055816004016000815480929190600190039190505550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612ff957600080fd5b505af115801561300d573d6000803e3d6000fd5b50505050613023565b8080600101915050612cd7565b5061302d83613193565b60006130a4826001015461309664e8d4a51000613088876004015461307a64e8d4a5100061306c8a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506130b03382614dff565b6130ba8433613dba565b6130c48433613f3e565b61312364e8d4a51000613115856004015461310764e8d4a510006130f988600201548960000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b82600101819055505050505050565b6008602052826000526040600020602052816000526040600020818154811061315757fe5b9060005260206000200160009250925050505481565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600582815481106131a257fe5b90600052602060002090600502019050806002015443116131c3575061333b565b60008160030154905060008114156131e557438260020181905550505061333b565b60006131f5836002015443613d08565b90506000613238600a5461322a866001015461321c60035487614d2f90919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156132cd57600080fd5b505af11580156132e1573d6000803e3d6000fd5b505050506133256133128461330464e8d4a5100085614d2f90919063ffffffff16565b614ce590919063ffffffff16565b856004015461513990919063ffffffff16565b8460040181905550438460020181905550505050505b50565b60006005828154811061334d57fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506134043382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166151c99092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b6000600580549050905060005b818110156134995761348e81613193565b80600101905061347d565b5050565b6134a56151c1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613565576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801561357457613573613470565b5b6135b9826135ab6005868154811061358857fe5b906000526020600020906005020160010154600a54614db590919063ffffffff16565b61513990919063ffffffff16565b600a8190555081600584815481106135cd57fe5b906000526020600020906005020160010181905550505050565b6000821161365d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f746865206e6b736d4964206572726f720000000000000000000000000000000081525060200191505060405180910390fd5b60006005828154811061366c57fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b6009600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015613a1f57846009600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061378a57fe5b90600052602060002001541415613a12576009600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060016009600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050038154811061384c57fe5b90600052602060002001546009600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106138b257fe5b90600052602060002001819055506009600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061391957fe5b60019003818190600052602060002001600090559055816005016000815480929190600190039190505550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156139f557600080fd5b505af1158015613a09573d6000803e3d6000fd5b50505050613a1f565b80806001019150506136d3565b50613a2983613193565b6000613aa08260010154613a9264e8d4a51000613a848760040154613a7664e8d4a51000613a688a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b9050613aac3382614dff565b613ab68433613dba565b613ac08433613f3e565b613b1f64e8d4a51000613b118560040154613b0364e8d4a51000613af588600201548960000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b82600101819055505050505050565b613b366151c1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613bf6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006002548211613d4057613d396005613d2b8585614db590919063ffffffff16565b614d2f90919063ffffffff16565b9050613db4565b6002548310613d6357613d5c8383614db590919063ffffffff16565b9050613db4565b613db1613d7b60025484614db590919063ffffffff16565b613da36005613d9587600254614db590919063ffffffff16565b614d2f90919063ffffffff16565b61513990919063ffffffff16565b90505b92915050565b600060058381548110613dc957fe5b9060005260206000209060050201905060006006600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000613e4b8260030154836004015484600501548560060154611cf9565b905081600201548114613ee857613edf613e8d64e8d4a51000613e7f85600201548660000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b613ed1613ebe64e8d4a51000613eb0868860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b866003015461513990919063ffffffff16565b614db590919063ffffffff16565b83600301819055505b5050505050565b6006602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b60006006600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000613fb08260030154836004015484600501548560060154611cf9565b905081600201548114613fc7578082600201819055505b50505050565b600e6020528060005260406000206000915090505481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b60006005828154811061402057fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208490806001815401808255809150506001900390600052602060002001600090919091909150558060050160008154809291906001019190505550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156141c057600080fd5b505af11580156141d4573d6000803e3d6000fd5b505050506141e183613193565b600081600001541115614273576000614265826001015461425764e8d4a51000614249876004015461423b64e8d4a5100061422d8a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506142713382614dff565b505b61427d8333613dba565b6142878333613f3e565b6142e664e8d4a510006142d884600401546142ca64e8d4a510006142bc87600201548860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b816001018190555050505050565b60006005828154811061430357fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208490806001815401808255809150506001900390600052602060002001600090919091909150558060030160008154809291906001019190505550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156144a357600080fd5b505af11580156144b7573d6000803e3d6000fd5b505050506144c483613193565b600081600001541115614556576000614548826001015461453a64e8d4a5100061452c876004015461451e64e8d4a510006145108a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506145543382614dff565b505b6145608333613dba565b61456a8333613f3e565b6145c964e8d4a510006145bb84600401546145ad64e8d4a5100061459f87600201548860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b816001018190555050505050565b600080600584815481106145e757fe5b9060005260206000209060050201905060006006600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600401549050600083600301549050836002015443118015614671575060008114155b1561470c576000614686856002015443613d08565b905060006146c9600a546146bb88600101546146ad60035487614d2f90919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b90506147076146f8846146ea64e8d4a5100085614d2f90919063ffffffff16565b614ce590919063ffffffff16565b8561513990919063ffffffff16565b935050505b61477d836001015461476f64e8d4a510006147618661475364e8d4a510006147458b600201548c60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b94505050505092915050565b60006005828154811061479857fe5b9060005260206000209060050201905060006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506008600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208490806001815401808255809150506001900390600052602060002001600090919091909150558060040160008154809291906001019190505550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561493857600080fd5b505af115801561494c573d6000803e3d6000fd5b5050505061495983613193565b6000816000015411156149eb5760006149dd82600101546149cf64e8d4a510006149c187600401546149b364e8d4a510006149a58a600201548b60000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614db590919063ffffffff16565b90506149e93382614dff565b505b6149f58333613dba565b6149ff8333613f3e565b614a5e64e8d4a51000614a508460040154614a4264e8d4a51000614a3487600201548860000154614d2f90919063ffffffff16565b614ce590919063ffffffff16565b614d2f90919063ffffffff16565b614ce590919063ffffffff16565b816001018190555050505050565b600f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b614aa76151c1565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614bed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061590f6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60076020528260005260406000206020528160005260406000208181548110614ccf57fe5b9060005260206000200160009250925050505481565b6000614d2783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615430565b905092915050565b600080831415614d425760009050614daf565b6000828402905082848281614d5357fe5b0414614daa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806159356021913960400191505060405180910390fd5b809150505b92915050565b6000614df783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506154f6565b905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614e8a57600080fd5b505afa158015614e9e573d6000803e3d6000fd5b505050506040513d6020811015614eb457600080fd5b8101908080519060200190929190505050905080821115614fa357600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614f6257600080fd5b505af1158015614f76573d6000803e3d6000fd5b505050506040513d6020811015614f8c57600080fd5b810190808051906020019092919050505050615073565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561503657600080fd5b505af115801561504a573d6000803e3d6000fd5b505050506040513d602081101561506057600080fd5b8101908080519060200190929190505050505b505050565b615133846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506155b6565b50505050565b6000808284019050838110156151b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b6152668363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506155b6565b505050565b6000811480615339575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156152fc57600080fd5b505afa158015615310573d6000803e3d6000fd5b505050506040513d602081101561532657600080fd5b8101908080519060200190929190505050145b61538e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806159806036913960400191505060405180910390fd5b61542b8363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506155b6565b505050565b600080831182906154dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156154a1578082015181840152602081019050615486565b50505050905090810190601f1680156154ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816154e857fe5b049050809150509392505050565b60008383111582906155a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561556857808201518184015260208101905061554d565b50505050905090810190601f1680156155955780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060615618826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166156a59092919063ffffffff16565b90506000815111156156a05780806020019051602081101561563957600080fd5b810190808051906020019092919050505061569f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615956602a913960400191505060405180910390fd5b5b505050565b60606156b484846000856156bd565b90509392505050565b60606156c8856158c3565b61573a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061578a5780518252602082019150602081019050602083039250615767565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146157ec576040519150601f19603f3d011682016040523d82523d6000602084013e6157f1565b606091505b509150915081156158065780925050506158bb565b6000815111156158195780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615880578082015181840152602081019050615865565b50505050905090810190601f1680156158ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561590557506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220dc7474d9158f93104556d167b072b1bba2116b93d0ec1d760e349224aecf33a364736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000071ecb8a06d60b4d9dc53676ae2d0d7514ed4c3c000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000ab74300000000000000000000000000000000000000000000000000000000000acfad0
-----Decoded View---------------
Arg [0] : _wksa (address): 0x071EcB8A06d60B4D9dc53676ae2d0d7514ed4C3C
Arg [1] : _wksaPerBlock (uint256): 4000000000000000
Arg [2] : _startBlock (uint256): 11236400
Arg [3] : _bonusEndBlock (uint256): 11336400
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000071ecb8a06d60b4d9dc53676ae2d0d7514ed4c3c
Arg [1] : 000000000000000000000000000000000000000000000000000e35fa931a0000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000ab7430
Arg [3] : 0000000000000000000000000000000000000000000000000000000000acfad0
Deployed Bytecode Sourcemap
42229:20131:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52649:2116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44526:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43932:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46370:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45460:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56441:270;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;44223:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44688:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43858:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45215:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46634:545;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47655:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48936:819;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45141:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;43780:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54813:798;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57513:1083;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44896:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47876:491;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44779:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59398:1083;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44452:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45375:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50925:724;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55682:356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50669:180;;;:::i;:::-;;47275:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61274:1083;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28765:148;;;:::i;:::-;;44162:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44013:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28123:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48443:423;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51708:494;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44305:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52261:323;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44981:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45290:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44832:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60493:769;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56723:778;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49818:768;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58608:778;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45059:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29068:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44378:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52649:2116;52733:21;52757:8;52766:4;52757:14;;;;;;;;;;;;;;;;;;52733:38;;52782:21;52806:8;:14;52815:4;52806:14;;;;;;;;;;;:26;52821:10;52806:26;;;;;;;;;;;;;;;52782:50;;52843:16;52854:4;52843:10;:16::i;:::-;52890:1;52875:4;:11;;;:16;52872:140;;;52921:79;52931:4;:15;;;52948:4;:15;;;52965:4;:15;;;52982:4;:17;;;52921:9;:79::i;:::-;52907:4;:11;;:93;;;;52872:140;53042:1;53028:4;:11;;;:15;53024:213;;;53060:15;53078:95;53157:4;:15;;;53078:74;53147:4;53078:64;53121:4;:20;;;53078:38;53111:4;53078:28;53094:4;:11;;;53078:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;:78;;:95;;;;:::i;:::-;53060:113;;53188:37;53205:10;53217:7;53188:16;:37::i;:::-;53024:213;;53270:1;53260:7;:11;:40;;;;;53299:1;53275:8;:20;53284:10;53275:20;;;;;;;;;;;;;;;;:25;53260:40;53257:1112;;;53339:8;;53316;:20;53325:10;53316:20;;;;;;;;;;;;;;;:31;;;;53383:10;53362:8;:18;53371:8;;53362:18;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;53408:8;;:11;;;;;;;;;;;;;53462:1;53451:8;:12;:47;;;;;53478:8;:20;53487:10;53478:20;;;;;;;;;;;;;;;;53467:8;:31;53451:47;:97;;;;;53546:1;53516:32;;:8;:18;53525:8;53516:18;;;;;;;;;;;;;;;;;;;;;:32;;;;53451:97;:134;;;;;53583:1;53552:33;;:7;:19;53560:10;53552:19;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;53451:134;53448:910;;;53605:11;:31;53617:8;:18;53626:8;53617:18;;;;;;;;;;;;;;;;;;;;;53605:31;;;;;;;;;;;;;;;53642:10;53605:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53672:23;53698:8;:14;53707:4;53698:14;;;;;;;;;;;:34;53713:8;:18;53722:8;53713:18;;;;;;;;;;;;;;;;;;;;;53698:34;;;;;;;;;;;;;;;53672:60;;53751:6;:19;;;:22;;;;;;;;;;;;;53814:8;:18;53823:8;53814:18;;;;;;;;;;;;;;;;;;;;;53792:7;:19;53800:10;53792:19;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;53872:1;53856:6;:13;;;:17;53853:251;;;53897:15;53915:101;53998:6;:17;;;53915:78;53988:4;53915:68;53962:4;:20;;;53915:42;53952:4;53915:32;53933:6;:13;;;53915:6;:13;;;:17;;:32;;;;:::i;:::-;:36;;:42;;;;:::i;:::-;:46;;:68;;;;:::i;:::-;:72;;:78;;;;:::i;:::-;:82;;:101;;;;:::i;:::-;53897:119;;54039:45;54056:8;:18;54065:8;54056:18;;;;;;;;;;;;;;;;;;;;;54076:7;54039:16;:45::i;:::-;53853:251;;54122:42;54139:4;54145:8;:18;54154:8;54145:18;;;;;;;;;;;;;;;;;;;;;54122:16;:42::i;:::-;54183;54200:4;54206:8;:18;54215:8;54206:18;;;;;;;;;;;;;;;;;;;;;54183:16;:42::i;:::-;54264:78;54337:4;54264:68;54311:4;:20;;;54264:42;54301:4;54264:32;54282:6;:13;;;54264:6;:13;;;:17;;:32;;;;:::i;:::-;:36;;:42;;;;:::i;:::-;:46;;:68;;;;:::i;:::-;:72;;:78;;;;:::i;:::-;54244:6;:17;;:98;;;;53448:910;;53257:1112;54389:74;54427:10;54448:4;54455:7;54389:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;54488:24;54504:7;54488:4;:11;;;:15;;:24;;;;:::i;:::-;54474:4;:11;;:38;;;;54545:59;54569:34;54598:4;54569:24;54581:4;:11;;;54569:7;:11;;:24;;;;:::i;:::-;:28;;:34;;;;:::i;:::-;54545:4;:19;;;:23;;:59;;;;:::i;:::-;54523:4;:19;;:81;;;;54633:74;54702:4;54633:64;54676:4;:20;;;54633:38;54666:4;54633:28;54649:4;:11;;;54633:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;54615:4;:15;;:92;;;;54743:4;54731:10;54723:34;;;54749:7;54723:34;;;;;;;;;;;;;;;;;;52649:2116;;;;;:::o;44526:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43932:27::-;;;;:::o;46370:95::-;46415:7;46442:8;:15;;;;46435:22;;46370:95;:::o;45460:78::-;;;;;;;;;;;;;:::o;56441:270::-;56551:6;56575:42;56587:8;56597:4;56603:7;56612:4;56575:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56642:60;56628:75;;56441:270;;;;;;:::o;44223:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44688:34::-;;;;:::o;43858:28::-;;;;:::o;45215:46::-;;;;;;;;;;;;;;;;;:::o;46634:545::-;28345:12;:10;:12::i;:::-;28335:22;;:6;;;;;;;;;;:22;;;28327:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46735:11:::1;46731:61;;;46763:17;:15;:17::i;:::-;46731:61;46802:23;46843:10;;46828:12;:25;:53;;46871:10;;46828:53;;;46856:12;46828:53;46802:79;;46910:32;46930:11;46910:15;;:19;;:32;;;;:::i;:::-;46892:15;:50;;;;46953:8;46967:203;;;;;;;;47000:8;46967:203;;;;;;47035:11;46967:203;;;;47078:15;46967:203;;;;47124:1;46967:203;;;;47157:1;46967:203;;::::0;46953:218:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28405:1;46634:545:::0;;;:::o;47655:98::-;28345:12;:10;:12::i;:::-;28335:22;;:6;;;;;;;;;;:22;;;28327:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47736:9:::1;47725:8;;:20;;;;;;;;;;;;;;;;;;47655:98:::0;:::o;48936:819::-;49044:7;49064:14;49081:33;49109:4;49081:23;49099:4;49081:13;:17;;:23;;;;:::i;:::-;:27;;:33;;;;:::i;:::-;49064:50;;49137:6;49128;:15;49125:61;;;49168:6;49159:15;;49125:61;49208:1;49199:5;:10;49196:170;;49234:33;49245:21;49263:2;49245:10;:13;49256:1;49245:13;;;;;;;;;;;;:17;;:21;;;;:::i;:::-;49234:6;:10;;:33;;;;:::i;:::-;49225:42;;49196:170;;;49317:37;49328:25;49350:2;49328:10;:17;49339:5;49328:17;;;;;;;;;;;;:21;;:25;;;;:::i;:::-;49317:6;:10;;:37;;;;:::i;:::-;49308:46;;49196:170;49388:1;49379:5;:10;49376:170;;49414:33;49425:21;49443:2;49425:10;:13;49436:1;49425:13;;;;;;;;;;;;:17;;:21;;;;:::i;:::-;49414:6;:10;;:33;;;;:::i;:::-;49405:42;;49376:170;;;49497:37;49508:25;49530:2;49508:10;:17;49519:5;49508:17;;;;;;;;;;;;:21;;:25;;;;:::i;:::-;49497:6;:10;;:37;;;;:::i;:::-;49488:46;;49376:170;49568:1;49559:5;:10;49556:168;;49594:32;49605:20;49623:1;49605:10;:13;49616:1;49605:13;;;;;;;;;;;;:17;;:20;;;;:::i;:::-;49594:6;:10;;:32;;;;:::i;:::-;49585:41;;49556:168;;;49676:36;49687:24;49709:1;49687:10;:17;49698:5;49687:17;;;;;;;;;;;;:21;;:24;;;;:::i;:::-;49676:6;:10;;:36;;;;:::i;:::-;49667:45;;49556:168;49741:6;49734:13;;;48936:819;;;;;;:::o;45141:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43780:21::-;;;;;;;;;;;;;:::o;54813:798::-;54880:21;54904:8;54913:4;54904:14;;;;;;;;;;;;;;;;;;54880:38;;54929:21;54953:8;:14;54962:4;54953:14;;;;;;;;;;;:26;54968:10;54953:26;;;;;;;;;;;;;;;54929:50;;55013:7;54998:4;:11;;;:22;;54990:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55054:16;55065:4;55054:10;:16::i;:::-;55081:15;55099:95;55178:4;:15;;;55099:74;55168:4;55099:64;55142:4;:20;;;55099:38;55132:4;55099:28;55115:4;:11;;;55099:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;:78;;:95;;;;:::i;:::-;55081:113;;55205:37;55222:10;55234:7;55205:16;:37::i;:::-;55275:59;55299:34;55328:4;55299:24;55311:4;:11;;;55299:7;:11;;:24;;;;:::i;:::-;:28;;:34;;;;:::i;:::-;55275:4;:19;;;:23;;:59;;;;:::i;:::-;55253:4;:19;;:81;;;;55359:24;55375:7;55359:4;:11;;;:15;;:24;;;;:::i;:::-;55345:4;:11;;:38;;;;55412:74;55481:4;55412:64;55455:4;:20;;;55412:38;55445:4;55412:28;55428:4;:11;;;55412:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;55394:4;:15;;:92;;;;55497:55;55531:10;55544:7;55497:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;55589:4;55577:10;55568:35;;;55595:7;55568:35;;;;;;;;;;;;;;;;;;54813:798;;;;;:::o;57513:1083::-;57600:1;57591:6;:10;57583:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57633:21;57657:8;57666:4;57657:14;;;;;;;;;;;;;;;;;;57633:38;;57682:21;57706:8;:14;57715:4;57706:14;;;;;;;;;;;:26;57721:10;57706:26;;;;;;;;;;;;;;;57682:50;;57747:9;57743:454;57766:8;:14;57775:4;57766:14;;;;;;;;;;;:26;57781:10;57766:26;;;;;;;;;;;;;;;:33;;;;57762:1;:37;57743:454;;;57857:6;57824:8;:14;57833:4;57824:14;;;;;;;;;;;:26;57839:10;57824:26;;;;;;;;;;;;;;;57851:1;57824:29;;;;;;;;;;;;;;;;:39;57821:365;;;57915:8;:14;57924:4;57915:14;;;;;;;;;;;:26;57930:10;57915:26;;;;;;;;;;;;;;;57976:1;57942:8;:14;57951:4;57942:14;;;;;;;;;;;:26;57957:10;57942:26;;;;;;;;;;;;;;;:33;;;;:35;57915:63;;;;;;;;;;;;;;;;57883:8;:14;57892:4;57883:14;;;;;;;;;;;:26;57898:10;57883:26;;;;;;;;;;;;;;;57910:1;57883:29;;;;;;;;;;;;;;;:95;;;;57997:8;:14;58006:4;57997:14;;;;;;;;;;;:26;58012:10;57997:26;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;58048:4;:15;;;:18;;;;;;;;;;;;;;58085:9;;;;;;;;;;;:26;;;58120:4;58127:10;58139:6;58085:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58165:5;;57821:365;57801:4;;;;;;;57743:454;;;;58207:16;58218:4;58207:10;:16::i;:::-;58234:15;58252:95;58331:4;:15;;;58252:74;58321:4;58252:64;58295:4;:20;;;58252:38;58285:4;58252:28;58268:4;:11;;;58252:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;:78;;:95;;;;:::i;:::-;58234:113;;58358:37;58375:10;58387:7;58358:16;:37::i;:::-;58406:34;58423:4;58429:10;58406:16;:34::i;:::-;58451;58468:4;58474:10;58451:16;:34::i;:::-;58514:74;58583:4;58514:64;58557:4;:20;;;58514:38;58547:4;58514:28;58530:4;:11;;;58514:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;58496:4;:15;;:92;;;;57513:1083;;;;;:::o;44896:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;47876:491::-;47962:1;47933:31;;47941:8;;;;;;;;;;;47933:31;;;;47925:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48000:21;48024:8;48033:4;48024:14;;;;;;;;;;;;;;;;;;48000:38;;48049:14;48066:4;:12;;;;;;;;;;;;48049:29;;48089:11;48103:7;:17;;;48129:4;48103:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48089:46;;48146:43;48174:8;;;;;;;;;;;48185:3;48146:7;:19;;;;:43;;;;;:::i;:::-;48200:17;48220:8;;;;;;;;;;;:16;;;48237:7;48220:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48200:45;;48271:10;:20;;;48300:4;48271:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48264:3;:42;48256:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48349:10;48334:4;:12;;;:25;;;;;;;;;;;;;;;;;;47876:491;;;;;:::o;44779:25::-;;;;:::o;59398:1083::-;59485:1;59476:6;:10;59468:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59518:21;59542:8;59551:4;59542:14;;;;;;;;;;;;;;;;;;59518:38;;59567:21;59591:8;:14;59600:4;59591:14;;;;;;;;;;;:26;59606:10;59591:26;;;;;;;;;;;;;;;59567:50;;59632:9;59628:454;59651:8;:14;59660:4;59651:14;;;;;;;;;;;:26;59666:10;59651:26;;;;;;;;;;;;;;;:33;;;;59647:1;:37;59628:454;;;59742:6;59709:8;:14;59718:4;59709:14;;;;;;;;;;;:26;59724:10;59709:26;;;;;;;;;;;;;;;59736:1;59709:29;;;;;;;;;;;;;;;;:39;59706:365;;;59800:8;:14;59809:4;59800:14;;;;;;;;;;;:26;59815:10;59800:26;;;;;;;;;;;;;;;59861:1;59827:8;:14;59836:4;59827:14;;;;;;;;;;;:26;59842:10;59827:26;;;;;;;;;;;;;;;:33;;;;:35;59800:63;;;;;;;;;;;;;;;;59768:8;:14;59777:4;59768:14;;;;;;;;;;;:26;59783:10;59768:26;;;;;;;;;;;;;;;59795:1;59768:29;;;;;;;;;;;;;;;:95;;;;59882:8;:14;59891:4;59882:14;;;;;;;;;;;:26;59897:10;59882:26;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;59933:4;:15;;;:18;;;;;;;;;;;;;;59970:9;;;;;;;;;;;:26;;;60005:4;60012:10;60024:6;59970:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60050:5;;59706:365;59686:4;;;;;;;59628:454;;;;60092:16;60103:4;60092:10;:16::i;:::-;60119:15;60137:95;60216:4;:15;;;60137:74;60206:4;60137:64;60180:4;:20;;;60137:38;60170:4;60137:28;60153:4;:11;;;60137:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;:78;;:95;;;;:::i;:::-;60119:113;;60243:37;60260:10;60272:7;60243:16;:37::i;:::-;60291:34;60308:4;60314:10;60291:16;:34::i;:::-;60336;60353:4;60359:10;60336:16;:34::i;:::-;60399:74;60468:4;60399:64;60442:4;:20;;;60399:38;60432:4;60399:28;60415:4;:11;;;60399:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;60381:4;:15;;:92;;;;59398:1083;;;;;:::o;44452:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45375:78::-;;;;;;;;;;;;;:::o;50925:724::-;50977:21;51001:8;51010:4;51001:14;;;;;;;;;;;;;;;;;;50977:38;;51046:4;:20;;;51030:12;:36;51026:75;;51083:7;;;51026:75;51121:16;51140:4;:19;;;51121:38;;51186:1;51174:8;:13;51170:102;;;51227:12;51204:4;:20;;:35;;;;51254:7;;;;51170:102;51282:18;51303:49;51317:4;:20;;;51339:12;51303:13;:49::i;:::-;51282:70;;51363:18;51384:70;51438:15;;51384:49;51417:4;:15;;;51384:28;51399:12;;51384:10;:14;;:28;;;;:::i;:::-;:32;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;51363:91;;51465:4;;;;;;;;;;;:9;;;51483:4;51490:10;51465:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51535:60;51560:34;51585:8;51560:20;51575:4;51560:10;:14;;:20;;;;:::i;:::-;:24;;:34;;;;:::i;:::-;51535:4;:20;;;:24;;:60;;;;:::i;:::-;51512:4;:20;;:83;;;;51629:12;51606:4;:20;;:35;;;;50925:724;;;;;;:::o;55682:356::-;55741:21;55765:8;55774:4;55765:14;;;;;;;;;;;;;;;;;;55741:38;;55790:21;55814:8;:14;55823:4;55814:14;;;;;;;;;;;:26;55829:10;55814:26;;;;;;;;;;;;;;;55790:50;;55851:59;55885:10;55898:4;:11;;;55851:4;:12;;;;;;;;;;;;:25;;;;:59;;;;;:::i;:::-;55956:4;55944:10;55926:48;;;55962:4;:11;;;55926:48;;;;;;;;;;;;;;;;;;55999:1;55985:4;:11;;:15;;;;56029:1;56011:4;:15;;:19;;;;55682:356;;;:::o;50669:180::-;50714:14;50731:8;:15;;;;50714:32;;50762:11;50757:85;50785:6;50779:3;:12;50757:85;;;50815:15;50826:3;50815:10;:15::i;:::-;50793:5;;;;;50757:85;;;;50669:180;:::o;47275:304::-;28345:12;:10;:12::i;:::-;28335:22;;:6;;;;;;;;;;:22;;;28327:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47373:11:::1;47369:61;;;47401:17;:15;:17::i;:::-;47369:61;47458:63;47509:11;47458:46;47478:8;47487:4;47478:14;;;;;;;;;;;;;;;;;;:25;;;47458:15;;:19;;:46;;;;:::i;:::-;:50;;:63;;;;:::i;:::-;47440:15;:81;;;;47560:11;47532:8;47541:4;47532:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;47275:304:::0;;;:::o;61274:1083::-;61361:1;61352:6;:10;61344:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61394:21;61418:8;61427:4;61418:14;;;;;;;;;;;;;;;;;;61394:38;;61443:21;61467:8;:14;61476:4;61467:14;;;;;;;;;;;:26;61482:10;61467:26;;;;;;;;;;;;;;;61443:50;;61508:9;61504:454;61527:8;:14;61536:4;61527:14;;;;;;;;;;;:26;61542:10;61527:26;;;;;;;;;;;;;;;:33;;;;61523:1;:37;61504:454;;;61618:6;61585:8;:14;61594:4;61585:14;;;;;;;;;;;:26;61600:10;61585:26;;;;;;;;;;;;;;;61612:1;61585:29;;;;;;;;;;;;;;;;:39;61582:365;;;61676:8;:14;61685:4;61676:14;;;;;;;;;;;:26;61691:10;61676:26;;;;;;;;;;;;;;;61737:1;61703:8;:14;61712:4;61703:14;;;;;;;;;;;:26;61718:10;61703:26;;;;;;;;;;;;;;;:33;;;;:35;61676:63;;;;;;;;;;;;;;;;61644:8;:14;61653:4;61644:14;;;;;;;;;;;:26;61659:10;61644:26;;;;;;;;;;;;;;;61671:1;61644:29;;;;;;;;;;;;;;;:95;;;;61758:8;:14;61767:4;61758:14;;;;;;;;;;;:26;61773:10;61758:26;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;61809:4;:15;;;:18;;;;;;;;;;;;;;61846:9;;;;;;;;;;;:26;;;61881:4;61888:10;61900:6;61846:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61926:5;;61582:365;61562:4;;;;;;;61504:454;;;;61968:16;61979:4;61968:10;:16::i;:::-;61995:15;62013:95;62092:4;:15;;;62013:74;62082:4;62013:64;62056:4;:20;;;62013:38;62046:4;62013:28;62029:4;:11;;;62013:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;:78;;:95;;;;:::i;:::-;61995:113;;62119:37;62136:10;62148:7;62119:16;:37::i;:::-;62167:34;62184:4;62190:10;62167:16;:34::i;:::-;62212;62229:4;62235:10;62212:16;:34::i;:::-;62275:74;62344:4;62275:64;62318:4;:20;;;62275:38;62308:4;62275:28;62291:4;:11;;;62275:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;62257:4;:15;;:92;;;;61274:1083;;;;;:::o;28765:148::-;28345:12;:10;:12::i;:::-;28335:22;;:6;;;;;;;;;;:22;;;28327:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28872:1:::1;28835:40;;28856:6;::::0;::::1;;;;;;;;28835:40;;;;;;;;;;;;28903:1;28886:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;28765:148::o:0;44162:25::-;;;;;;;;;;;;;:::o;44013:44::-;44056:1;44013:44;:::o;28123:79::-;28161:7;28188:6;;;;;;;;;;;28181:13;;28123:79;:::o;48443:423::-;48515:7;48546:13;;48539:3;:20;48535:324;;48583:36;44056:1;48583:14;48591:5;48583:3;:7;;:14;;;;:::i;:::-;:18;;:36;;;;:::i;:::-;48576:43;;;;48535:324;48650:13;;48641:5;:22;48637:222;;48687:14;48695:5;48687:3;:7;;:14;;;;:::i;:::-;48680:21;;;;48637:222;48741:106;48810:22;48818:13;;48810:3;:7;;:22;;;;:::i;:::-;48741:46;44056:1;48741:24;48759:5;48741:13;;:17;;:24;;;;:::i;:::-;:28;;:46;;;;:::i;:::-;:50;;:106;;;;:::i;:::-;48734:113;;48443:423;;;;;:::o;51708:494::-;51781:21;51805:8;51814:4;51805:14;;;;;;;;;;;;;;;;;;51781:38;;51830:21;51854:8;:14;51863:4;51854:14;;;;;;;;;;;:21;51869:5;51854:21;;;;;;;;;;;;;;;51830:45;;51896:14;51913:79;51923:4;:15;;;51940:4;:15;;;51957:4;:15;;;51974:4;:17;;;51913:9;:79::i;:::-;51896:96;;52019:4;:11;;;52006:9;:24;52003:182;;52068:105;52134:38;52167:4;52134:28;52150:4;:11;;;52134:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;52068:61;52092:36;52123:4;52092:26;52108:9;52092:4;:11;;;:15;;:26;;;;:::i;:::-;:30;;:36;;;;:::i;:::-;52068:4;:19;;;:23;;:61;;;;:::i;:::-;:65;;:105;;;;:::i;:::-;52046:4;:19;;:127;;;;52003:182;51708:494;;;;;:::o;44305:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52261:323::-;52334:21;52358:8;:14;52367:4;52358:14;;;;;;;;;;;:21;52373:5;52358:21;;;;;;;;;;;;;;;52334:45;;52392:14;52409:79;52419:4;:15;;;52436:4;:15;;;52453:4;:15;;;52470:4;:17;;;52409:9;:79::i;:::-;52392:96;;52515:4;:11;;;52502:9;:24;52499:78;;52556:9;52542:4;:11;;:23;;;;52499:78;52261:323;;;;:::o;44981:44::-;;;;;;;;;;;;;;;;;:::o;45290:78::-;;;;;;;;;;;;;:::o;44832:23::-;;;;:::o;60493:769::-;60560:21;60584:8;60593:4;60584:14;;;;;;;;;;;;;;;;;;60560:38;;60609:21;60633:8;:14;60642:4;60633:14;;;;;;;;;;;:26;60648:10;60633:26;;;;;;;;;;;;;;;60609:50;;60670:8;:14;60679:4;60670:14;;;;;;;;;;;:26;60685:10;60670:26;;;;;;;;;;;;;;;60702:6;60670:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60720:4;:15;;;:18;;;;;;;;;;;;;60750:9;;;;;;;;;;;:26;;;60777:10;60797:4;60804:6;60750:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60822:16;60833:4;60822:10;:16::i;:::-;60867:1;60853:4;:11;;;:15;60849:213;;;60885:15;60903:95;60982:4;:15;;;60903:74;60972:4;60903:64;60946:4;:20;;;60903:38;60936:4;60903:28;60919:4;:11;;;60903:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;:78;;:95;;;;:::i;:::-;60885:113;;61013:37;61030:10;61042:7;61013:16;:37::i;:::-;60849:213;;61072:34;61089:4;61095:10;61072:16;:34::i;:::-;61117;61134:4;61140:10;61117:16;:34::i;:::-;61180:74;61249:4;61180:64;61223:4;:20;;;61180:38;61213:4;61180:28;61196:4;:11;;;61180:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;61162:4;:15;;:92;;;;60493:769;;;;:::o;56723:778::-;56790:21;56814:8;56823:4;56814:14;;;;;;;;;;;;;;;;;;56790:38;;56839:21;56863:8;:14;56872:4;56863:14;;;;;;;;;;;:26;56878:10;56863:26;;;;;;;;;;;;;;;56839:50;;56900:8;:14;56909:4;56900:14;;;;;;;;;;;:26;56915:10;56900:26;;;;;;;;;;;;;;;56932:6;56900:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56950:4;:15;;;:18;;;;;;;;;;;;;56979:9;;;;;;;;;;;:26;;;57006:10;57026:4;57033:6;56979:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57051:16;57062:4;57051:10;:16::i;:::-;57106:1;57092:4;:11;;;:15;57088:213;;;57124:15;57142:95;57221:4;:15;;;57142:74;57211:4;57142:64;57185:4;:20;;;57142:38;57175:4;57142:28;57158:4;:11;;;57142:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;:78;;:95;;;;:::i;:::-;57124:113;;57252:37;57269:10;57281:7;57252:16;:37::i;:::-;57088:213;;57311:34;57328:4;57334:10;57311:16;:34::i;:::-;57356;57373:4;57379:10;57356:16;:34::i;:::-;57419:74;57488:4;57419:64;57462:4;:20;;;57419:38;57452:4;57419:28;57435:4;:11;;;57419:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;57401:4;:15;;:92;;;;56723:778;;;;:::o;49818:768::-;49891:7;49911:21;49935:8;49944:4;49935:14;;;;;;;;;;;;;;;;;;49911:38;;49960:21;49984:8;:14;49993:4;49984:14;;;;;;;;;;;:21;49999:5;49984:21;;;;;;;;;;;;;;;49960:45;;50016:23;50042:4;:20;;;50016:46;;50073:16;50092:4;:19;;;50073:38;;50141:4;:20;;;50126:12;:35;:52;;;;;50177:1;50165:8;:13;;50126:52;50122:349;;;50195:18;50216:49;50230:4;:20;;;50252:12;50216:13;:49::i;:::-;50195:70;;50280:18;50301:70;50355:15;;50301:49;50334:4;:15;;;50301:28;50316:12;;50301:10;:14;;:28;;;;:::i;:::-;:32;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;50280:91;;50404:55;50424:34;50449:8;50424:20;50439:4;50424:10;:14;;:20;;;;:::i;:::-;:24;;:34;;;;:::i;:::-;50404:15;:19;;:55;;;;:::i;:::-;50386:73;;50122:349;;;50488:90;50562:4;:15;;;50488:69;50552:4;50488:59;50531:15;50488:38;50521:4;50488:28;50504:4;:11;;;50488:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:59;;;;:::i;:::-;:63;;:69;;;;:::i;:::-;:73;;:90;;;;:::i;:::-;50481:97;;;;;;49818:768;;;;:::o;58608:778::-;58675:21;58699:8;58708:4;58699:14;;;;;;;;;;;;;;;;;;58675:38;;58724:21;58748:8;:14;58757:4;58748:14;;;;;;;;;;;:26;58763:10;58748:26;;;;;;;;;;;;;;;58724:50;;58785:8;:14;58794:4;58785:14;;;;;;;;;;;:26;58800:10;58785:26;;;;;;;;;;;;;;;58817:6;58785:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58835:4;:15;;;:18;;;;;;;;;;;;;58864:9;;;;;;;;;;;:26;;;58891:10;58911:4;58918:6;58864:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58936:16;58947:4;58936:10;:16::i;:::-;58991:1;58977:4;:11;;;:15;58973:213;;;59009:15;59027:95;59106:4;:15;;;59027:74;59096:4;59027:64;59070:4;:20;;;59027:38;59060:4;59027:28;59043:4;:11;;;59027:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;:78;;:95;;;;:::i;:::-;59009:113;;59137:37;59154:10;59166:7;59137:16;:37::i;:::-;58973:213;;59196:34;59213:4;59219:10;59196:16;:34::i;:::-;59241;59258:4;59264:10;59241:16;:34::i;:::-;59304:74;59373:4;59304:64;59347:4;:20;;;59304:38;59337:4;59304:28;59320:4;:11;;;59304:4;:11;;;:15;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;:42;;:64;;;;:::i;:::-;:68;;:74;;;;:::i;:::-;59286:4;:15;;:92;;;;58608:778;;;;:::o;45059:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;29068:244::-;28345:12;:10;:12::i;:::-;28335:22;;:6;;;;;;;;;;:22;;;28327:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29177:1:::1;29157:22;;:8;:22;;;;29149:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29267:8;29238:38;;29259:6;::::0;::::1;;;;;;;;29238:38;;;;;;;;;;;;29296:8;29287:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;29068:244:::0;:::o;44378:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6071:132::-;6129:7;6156:39;6160:1;6163;6156:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6149:46;;6071:132;;;;:::o;5124:471::-;5182:7;5432:1;5427;:6;5423:47;;;5457:1;5450:8;;;;5423:47;5482:9;5498:1;5494;:5;5482:17;;5527:1;5522;5518;:5;;;;;;:10;5510:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5586:1;5579:8;;;5124:471;;;;;:::o;4234:136::-;4292:7;4319:43;4323:1;4326;4319:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4312:50;;4234:136;;;;:::o;56151:278::-;56227:15;56245:4;;;;;;;;;;;:14;;;56268:4;56245:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56227:47;;56299:7;56289;:17;56285:137;;;56323:4;;;;;;;;;;;:13;;;56337:3;56342:7;56323:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56285:137;;;56383:4;;;;;;;;;;;:13;;;56397:3;56402:7;56383:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56285:137;56151:278;;;:::o;15253:205::-;15354:96;15374:5;15404:27;;;15433:4;15439:2;15443:5;15381:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15354:19;:96::i;:::-;15253:205;;;;:::o;3770:181::-;3828:7;3848:9;3864:1;3860;:5;3848:17;;3889:1;3884;:6;;3876:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:1;3935:8;;;3770:181;;;;:::o;26706:106::-;26759:15;26794:10;26787:17;;26706:106;:::o;15068:177::-;15151:86;15171:5;15201:23;;;15226:2;15230:5;15178:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15151:19;:86::i;:::-;15068:177;;;:::o;15727:622::-;16106:1;16097:5;:10;16096:62;;;;16156:1;16113:5;:15;;;16137:4;16144:7;16113:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;16096:62;16088:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16251:90;16271:5;16301:22;;;16325:7;16334:5;16278:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16251:19;:90::i;:::-;15727:622;;;:::o;6699:278::-;6785:7;6817:1;6813;:5;6820:12;6805:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6844:9;6860:1;6856;:5;;;;;;6844:17;;6968:1;6961:8;;;6699:278;;;;;:::o;4673:192::-;4759:7;4792:1;4787;:6;;4795:12;4779:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4819:9;4835:1;4831;:5;4819:17;;4856:1;4849:8;;;4673:192;;;;;:::o;17373:761::-;17797:23;17823:69;17851:4;17823:69;;;;;;;;;;;;;;;;;17831:5;17823:27;;;;:69;;;;;:::i;:::-;17797:95;;17927:1;17907:10;:17;:21;17903:224;;;18049:10;18038:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18030:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17903:224;17373:761;;;:::o;12082:196::-;12185:12;12217:53;12240:6;12248:4;12254:1;12257:12;12217:22;:53::i;:::-;12210:60;;12082:196;;;;;:::o;13459:979::-;13589:12;13622:18;13633:6;13622:10;:18::i;:::-;13614:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13748:12;13762:23;13789:6;:11;;13809:8;13820:4;13789:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13747:78;;;;13840:7;13836:595;;;13871:10;13864:17;;;;;;13836:595;14005:1;13985:10;:17;:21;13981:439;;;14248:10;14242:17;14309:15;14296:10;14292:2;14288:19;14281:44;14196:148;14391:12;14384:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13459:979;;;;;;;:::o;8967:619::-;9027:4;9289:16;9316:19;9338:66;9316:88;;;;9507:7;9495:20;9483:32;;9547:11;9535:8;:23;;:42;;;;;9574:3;9562:15;;:8;:15;;9535:42;9527:51;;;;8967:619;;;:::o
Swarm Source
ipfs://dc7474d9158f93104556d167b072b1bba2116b93d0ec1d760e349224aecf33a3
Loading...
Loading
Loading...
Loading
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.