Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 115 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy | 12708127 | 1181 days ago | IN | 0 ETH | 0.01034679 | ||||
Buy | 12688025 | 1184 days ago | IN | 0 ETH | 0.02697045 | ||||
Buy | 12688024 | 1184 days ago | IN | 0 ETH | 0.02678845 | ||||
Buy | 12682122 | 1185 days ago | IN | 0 ETH | 0.02897101 | ||||
Buy | 12662553 | 1188 days ago | IN | 0 ETH | 0.01655486 | ||||
Buy | 12657688 | 1189 days ago | IN | 0 ETH | 0.0196589 | ||||
Buy | 12657687 | 1189 days ago | IN | 0 ETH | 0.0196589 | ||||
Buy | 12657645 | 1189 days ago | IN | 0 ETH | 0.0196589 | ||||
Buy | 12657630 | 1189 days ago | IN | 0 ETH | 0.01558432 | ||||
Buy | 12657629 | 1189 days ago | IN | 0 ETH | 0.01345082 | ||||
Buy | 12626180 | 1194 days ago | IN | 0 ETH | 0.00075682 | ||||
Buy | 12626171 | 1194 days ago | IN | 0 ETH | 0.00075682 | ||||
Buy | 12626164 | 1194 days ago | IN | 0 ETH | 0.00075682 | ||||
Buy | 12512876 | 1212 days ago | IN | 0 ETH | 0.00266459 | ||||
Buy | 12279056 | 1248 days ago | IN | 0 ETH | 0.0467659 | ||||
Buy | 12242415 | 1253 days ago | IN | 0 ETH | 0.01182577 | ||||
Buy | 12189191 | 1262 days ago | IN | 0 ETH | 0.17241907 | ||||
Buy | 12172249 | 1264 days ago | IN | 0 ETH | 0.0836447 | ||||
Buy | 12145363 | 1268 days ago | IN | 0 ETH | 0.09565731 | ||||
Buy | 12130253 | 1271 days ago | IN | 0 ETH | 0.027376 | ||||
Buy | 12065414 | 1281 days ago | IN | 0 ETH | 0.13619603 | ||||
Buy | 12065331 | 1281 days ago | IN | 0 ETH | 0.13565552 | ||||
Buy | 12065326 | 1281 days ago | IN | 0 ETH | 0.14063941 | ||||
Buy | 12047722 | 1283 days ago | IN | 0 ETH | 0.10987869 | ||||
Buy | 12033831 | 1285 days ago | IN | 0 ETH | 0.02328307 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12708127 | 1181 days ago | 0.00825 ETH | ||||
12708127 | 1181 days ago | 0.33 ETH | ||||
12708127 | 1181 days ago | 0.33825 ETH | ||||
12688025 | 1184 days ago | 0.0125 ETH | ||||
12688025 | 1184 days ago | 0.5 ETH | ||||
12688025 | 1184 days ago | 0.5125 ETH | ||||
12688024 | 1184 days ago | 0.015 ETH | ||||
12688024 | 1184 days ago | 0.6 ETH | ||||
12688024 | 1184 days ago | 0.615 ETH | ||||
12682122 | 1185 days ago | 0.00825 ETH | ||||
12682122 | 1185 days ago | 0.33 ETH | ||||
12682122 | 1185 days ago | 0.33825 ETH | ||||
12662553 | 1188 days ago | 0.00825 ETH | ||||
12662553 | 1188 days ago | 0.33 ETH | ||||
12662553 | 1188 days ago | 0.33825 ETH | ||||
12657688 | 1189 days ago | 0.00825 ETH | ||||
12657688 | 1189 days ago | 0.33 ETH | ||||
12657688 | 1189 days ago | 0.33825 ETH | ||||
12657687 | 1189 days ago | 0.01125 ETH | ||||
12657687 | 1189 days ago | 0.45 ETH | ||||
12657687 | 1189 days ago | 0.46125 ETH | ||||
12657645 | 1189 days ago | 0.00825 ETH | ||||
12657645 | 1189 days ago | 0.33 ETH | ||||
12657645 | 1189 days ago | 0.33825 ETH | ||||
12657630 | 1189 days ago | 0.25 ETH |
Loading...
Loading
Contract Name:
BuyAdapter
Compiler Version
v0.6.8+commit.0bbfe453
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-07-20 */ // File: @openzeppelin/contracts/math/SafeMath.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @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/utils/ReentrancyGuard.sol pragma solidity ^0.6.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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/utils/Address.sol pragma solidity ^0.6.2; /** * @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 pragma solidity ^0.6.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.6.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: contracts/ERC721Holder.sol pragma solidity ^0.6.8; contract ERC721Holder is IERC721Receiver { // Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")). bytes4 internal constant NEW_ERC721_RECEIVED = 0x150b7a02; // Equal to: bytes4(keccak256("onERC721Received(address,uint256,bytes)")); bytes4 internal constant OLD_ERC721_RECEIVED = 0xf0b9e5ba; /** * @dev implements old onERC721Received interface */ function onERC721Received(address, uint256, bytes memory) public pure returns (bytes4) { return OLD_ERC721_RECEIVED; } /** * @dev The ERC721 smart contract calls this function on the recipient * after a {IERC721-safeTransferFrom}. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return NEW_ERC721_RECEIVED; } } // File: contracts/ConverterManager.sol pragma solidity ^0.6.8; contract ConverterManager is Ownable { event SetConverter(address indexed converter); // configured fee converter address public converterAddress; /** * @param _converter address of collected fees burner implementation */ function setConverter(address _converter) public virtual onlyOwner { converterAddress = _converter; emit SetConverter(_converter); } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.6.2; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transfered from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: contracts/ITransferableRegistry.sol pragma solidity ^0.6.8; interface ITransferableRegistry is IERC721 { function transfer(address _to, uint256 _tokenId) external; } // File: contracts/dex/IConverter.sol pragma solidity ^0.6.8; interface IConverter { function getTrader() external view returns (address); function calcNeededTokensForEther(IERC20 _dstToken, uint256 _etherAmount) external view returns (uint256); function swapEtherToToken(IERC20 _dstToken) external payable returns (uint256); function swapTokenToEther(IERC20 _srcToken, uint256 _srcAmount, uint256 _maxDstAmount) external returns (uint256 dstAmount, uint256 srcRemainder); } // File: contracts/BuyAdapter.sol pragma solidity ^0.6.8; contract BuyAdapter is Ownable, ReentrancyGuard, ERC721Holder, ConverterManager { using SafeMath for uint256; using SafeERC20 for IERC20; event ExecutedOrder( address indexed registry, uint256 indexed tokenId, address indexed marketplace, uint256 orderValue, uint256 orderFees ); event ExecutedOrder( address indexed marketplace, uint256 orderValue, uint256 orderFees, bytes marketplaceData ); event MarketplaceAllowance(address indexed marketplace, bool value); event FeesCollectorChange(address indexed collector); event AdapterFeeChange(uint256 previousFee, uint256 newFee); // Allowed tranfer type enum enum TransferType { safeTransferFrom, transferFrom, transfer } // Order execution fee in a 0 - 1000000 basis uint256 public adapterTransactionFee; // Max allowed fee for the adapter uint256 public constant ADAPTER_FEE_MAX = 150000; // 15% uint256 public constant ADAPTER_FEE_PRECISION = 1000000; // MarketFeesCollector address address payable public adapterFeesCollector; /** * @dev constructor * @param _converter address for the IConverter * @param _collector address for the Fee Collector contract * @param _adapderFee initial adapter fee */ constructor( address _converter, address payable _collector, uint256 _adapderFee ) Ownable() public { setConverter(_converter); setFeesCollector(_collector); setAdapterFee(_adapderFee); } /** * @dev Sets fees collector for the adapter * @param _collector Address for the fees collector */ function setFeesCollector(address payable _collector) public onlyOwner { adapterFeesCollector = _collector; emit FeesCollectorChange(_collector); } /** * @dev Sets the adapter fees taken from every relayed order * @param _transactionFee in a 0 - ADAPTER_FEE_MAX basis */ function setAdapterFee(uint256 _transactionFee) public onlyOwner { require( ADAPTER_FEE_MAX >= _transactionFee, "BuyAdapter: Invalid transaction fee" ); emit AdapterFeeChange(adapterTransactionFee, _transactionFee); adapterTransactionFee = _transactionFee; } /** * @dev Relays buy marketplace order. Uses the IConverter to * swap erc20 tokens to ethers and call _buy() with the exact ether amount * @param _registry NFT registry address * @param _tokenId listed asset Id. * @param _marketplace marketplace listing the asset. * @param _encodedCallData forwarded to _marketplace. * @param _orderAmount (excluding fees) in ethers for the markeplace order * @param _paymentToken ERC20 address of the token used to pay * @param _maxPaymentTokenAmount max ERC20 token to use. Prevent high splippage. * @param _transferType choice for calling the ERC721 registry * @param _beneficiary where to send the ERC721 token */ function buy( ITransferableRegistry _registry, uint256 _tokenId, address _marketplace, bytes memory _encodedCallData, uint256 _orderAmount, IERC20 _paymentToken, uint256 _maxPaymentTokenAmount, TransferType _transferType, address _beneficiary ) public nonReentrant { IConverter converter = IConverter(converterAddress); // Calc total needed for this order + adapter fees uint256 orderFees = _calcOrderFees(_orderAmount); uint256 totalOrderAmount = _orderAmount.add(orderFees); // Get amount of srcTokens needed for the exchange uint256 paymentTokenAmount = converter.calcNeededTokensForEther( _paymentToken, totalOrderAmount ); require( paymentTokenAmount > 0, "BuyAdapter: paymentTokenAmount invalid" ); require( paymentTokenAmount <= _maxPaymentTokenAmount, "BuyAdapter: paymentTokenAmount > _maxPaymentTokenAmount" ); // Get Tokens from sender _paymentToken.safeTransferFrom( msg.sender, address(this), paymentTokenAmount ); // allow converter for this paymentTokenAmount transfer _paymentToken.safeApprove(converterAddress, paymentTokenAmount); // Get ethers from converter (uint256 convertedEth, uint256 remainderTokenAmount) = converter.swapTokenToEther( _paymentToken, paymentTokenAmount, totalOrderAmount ); require( convertedEth == totalOrderAmount, "BuyAdapter: invalid ether amount after conversion" ); if (remainderTokenAmount > 0) { _paymentToken.safeTransfer(msg.sender, remainderTokenAmount); } _buy( _registry, _tokenId, _marketplace, _encodedCallData, _orderAmount, orderFees, _transferType, _beneficiary ); } /** * @dev Relays buy marketplace order taking the configured fees * from message value. * @param _registry NFT registry address * @param _tokenId listed asset Id. * @param _marketplace marketplace listing the asset. * @param _encodedCallData forwarded to the _marketplace. * @param _orderAmount (excluding fees) in ethers for the markeplace order * @param _transferType choice for calling the ERC721 registry * @param _beneficiary where to send the ERC721 token */ function buy( ITransferableRegistry _registry, uint256 _tokenId, address _marketplace, bytes memory _encodedCallData, uint256 _orderAmount, TransferType _transferType, address _beneficiary ) public payable nonReentrant { // Calc total needed for this order + adapter fees uint256 orderFees = _calcOrderFees(_orderAmount); uint256 totalOrderAmount = _orderAmount.add(orderFees); // Check the order + fees require( msg.value == totalOrderAmount, "BuyAdapter: invalid msg.value != (order + fees)" ); _buy( _registry, _tokenId, _marketplace, _encodedCallData, _orderAmount, orderFees, _transferType, _beneficiary ); } /** * @dev Relays buy marketplace order taking the configured fees * from message value. * Notice that this method won't check what was bought. The calldata must have * the desire beneficiry. * @param _marketplace marketplace listing the asset. * @param _encodedCallData forwarded to the _marketplace. * @param _orderAmount (excluding fees) in ethers for the markeplace order */ function buy( address _marketplace, bytes memory _encodedCallData, uint256 _orderAmount ) public payable nonReentrant { // Calc total needed for this order + adapter fees uint256 orderFees = _calcOrderFees(_orderAmount); uint256 totalOrderAmount = _orderAmount.add(orderFees); // Check the order + fees require( msg.value == totalOrderAmount, "BuyAdapter: invalid msg.value != (order + fees)" ); _buy( _marketplace, _encodedCallData, _orderAmount, orderFees ); } /** * @dev Relays buy marketplace order. Uses the IConverter to * swap erc20 tokens to ethers and call _buy() with the exact ether amount. * Notice that this method won't check what was bought. The calldata must have * the desire beneficiry. * @param _marketplace marketplace listing the asset. * @param _encodedCallData forwarded to _marketplace. * @param _orderAmount (excluding fees) in ethers for the markeplace order * @param _paymentToken ERC20 address of the token used to pay * @param _maxPaymentTokenAmount max ERC20 token to use. Prevent high splippage. */ function buy( address _marketplace, bytes memory _encodedCallData, uint256 _orderAmount, IERC20 _paymentToken, uint256 _maxPaymentTokenAmount ) public nonReentrant { IConverter converter = IConverter(converterAddress); // Calc total needed for this order + adapter fees uint256 orderFees = _calcOrderFees(_orderAmount); uint256 totalOrderAmount = _orderAmount.add(orderFees); // Get amount of srcTokens needed for the exchange uint256 paymentTokenAmount = converter.calcNeededTokensForEther( _paymentToken, totalOrderAmount ); require( paymentTokenAmount > 0, "BuyAdapter: paymentTokenAmount invalid" ); require( paymentTokenAmount <= _maxPaymentTokenAmount, "BuyAdapter: paymentTokenAmount > _maxPaymentTokenAmount" ); // Get Tokens from sender _paymentToken.safeTransferFrom( msg.sender, address(this), paymentTokenAmount ); // allow converter for this paymentTokenAmount transfer _paymentToken.safeApprove(converterAddress, paymentTokenAmount); // Get ethers from converter (uint256 convertedEth, uint256 remainderTokenAmount) = converter.swapTokenToEther( _paymentToken, paymentTokenAmount, totalOrderAmount ); require( convertedEth == totalOrderAmount, "BuyAdapter: invalid ether amount after conversion" ); if (remainderTokenAmount > 0) { _paymentToken.safeTransfer(msg.sender, remainderTokenAmount); } _buy( _marketplace, _encodedCallData, _orderAmount, orderFees ); } /** * @dev Internal call relays the order to a _marketplace. * @param _registry NFT registry address * @param _tokenId listed asset Id. * @param _marketplace marketplace listing the asset. * @param _encodedCallData forwarded to _marketplace. * @param _orderAmount (excluding fees) in ethers for the markeplace order * @param _feesAmount in ethers for the order * @param _transferType choice for calling the ERC721 registry * @param _beneficiary where to send the ERC721 token */ function _buy( ITransferableRegistry _registry, uint256 _tokenId, address _marketplace, bytes memory _encodedCallData, uint256 _orderAmount, uint256 _feesAmount, TransferType _transferType, address _beneficiary ) private { require(_orderAmount > 0, "BuyAdapter: invalid order value"); require(adapterFeesCollector != address(0), "BuyAdapter: fees Collector must be set"); // Save contract balance before call to marketplace uint256 preCallBalance = address(this).balance; // execute buy order in destination marketplace (bool success, ) = _marketplace.call{ value: _orderAmount }( _encodedCallData ); require( success, "BuyAdapter: marketplace failed to execute buy order" ); require( address(this).balance == preCallBalance.sub(_orderAmount), "BuyAdapter: postcall balance mismatch" ); require( _registry.ownerOf(_tokenId) == address(this), "BuyAdapter: tokenId not transfered" ); // Send balance to Collector. Reverts on failure require( adapterFeesCollector.send(address(this).balance), "BuyAdapter: error sending fees to collector" ); // Transfer tokenId to caller _transferItem( _registry, _tokenId, _transferType, _beneficiary ); // Log succesful executed order emit ExecutedOrder( address(_registry), _tokenId, _marketplace, _orderAmount, _feesAmount ); } /** * @dev Internal call relays the order to a _marketplace. * Notice that this method won't check what was bought. The calldata must have * the desire beneficiry. * @param _marketplace marketplace listing the asset. * @param _encodedCallData forwarded to _marketplace. * @param _orderAmount (excluding fees) in ethers for the markeplace order * @param _feesAmount in ethers for the order */ function _buy( address _marketplace, bytes memory _encodedCallData, uint256 _orderAmount, uint256 _feesAmount ) private { require(_orderAmount > 0, "BuyAdapter: invalid order value"); require(adapterFeesCollector != address(0), "BuyAdapter: fees Collector must be set"); // Save contract balance before call to marketplace uint256 preCallBalance = address(this).balance; // execute buy order in destination marketplace (bool success, ) = _marketplace.call{ value: _orderAmount }( _encodedCallData ); require( success, "BuyAdapter: marketplace failed to execute buy order" ); require( address(this).balance == preCallBalance.sub(_orderAmount), "BuyAdapter: postcall balance mismatch" ); // Send balance to Collector. Reverts on failure require( adapterFeesCollector.send(address(this).balance), "BuyAdapter: error sending fees to collector" ); // Log succesful executed order emit ExecutedOrder( _marketplace, _orderAmount, _feesAmount, _encodedCallData ); } /** * @dev Transfer the NFT to the final owner * @param _registry NFT registry address * @param _tokenId listed token Id. * @param _transferType choice for calling the ERC721 registry * @param _beneficiary where to send the ERC721 token */ function _transferItem( ITransferableRegistry _registry, uint256 _tokenId, TransferType _transferType, address _beneficiary ) private { require(_beneficiary != address(this), "BuyAdapter: invalid beneficiary"); if (_transferType == TransferType.safeTransferFrom) { _registry.safeTransferFrom(address(this), _beneficiary, _tokenId); } else if (_transferType == TransferType.transferFrom) { _registry.transferFrom( address(this), _beneficiary, _tokenId ); } else if (_transferType == TransferType.transfer) { _registry.transfer( _beneficiary, _tokenId ); } else { revert('BuyAdapter: Unsopported transferType'); } require( _registry.ownerOf(_tokenId) == _beneficiary, "BuyAdapter: error with asset transfer" ); } /** * @param _orderAmount item value as in the NFT marketplace * @return adapter fees from total order value */ function _calcOrderFees(uint256 _orderAmount) private view returns (uint256) { return _orderAmount .mul(adapterTransactionFee) .div(ADAPTER_FEE_PRECISION); } receive() external payable { require(msg.sender != tx.origin, "BuyAdapter: sender invalid"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_converter","type":"address"},{"internalType":"address payable","name":"_collector","type":"address"},{"internalType":"uint256","name":"_adapderFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"AdapterFeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registry","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"marketplace","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"orderFees","type":"uint256"}],"name":"ExecutedOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"marketplace","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"orderFees","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"marketplaceData","type":"bytes"}],"name":"ExecutedOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collector","type":"address"}],"name":"FeesCollectorChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"marketplace","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"MarketplaceAllowance","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":"converter","type":"address"}],"name":"SetConverter","type":"event"},{"inputs":[],"name":"ADAPTER_FEE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADAPTER_FEE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adapterFeesCollector","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adapterTransactionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ITransferableRegistry","name":"_registry","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_marketplace","type":"address"},{"internalType":"bytes","name":"_encodedCallData","type":"bytes"},{"internalType":"uint256","name":"_orderAmount","type":"uint256"},{"internalType":"enum BuyAdapter.TransferType","name":"_transferType","type":"uint8"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract ITransferableRegistry","name":"_registry","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_marketplace","type":"address"},{"internalType":"bytes","name":"_encodedCallData","type":"bytes"},{"internalType":"uint256","name":"_orderAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_paymentToken","type":"address"},{"internalType":"uint256","name":"_maxPaymentTokenAmount","type":"uint256"},{"internalType":"enum BuyAdapter.TransferType","name":"_transferType","type":"uint8"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketplace","type":"address"},{"internalType":"bytes","name":"_encodedCallData","type":"bytes"},{"internalType":"uint256","name":"_orderAmount","type":"uint256"},{"internalType":"contract IERC20","name":"_paymentToken","type":"address"},{"internalType":"uint256","name":"_maxPaymentTokenAmount","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketplace","type":"address"},{"internalType":"bytes","name":"_encodedCallData","type":"bytes"},{"internalType":"uint256","name":"_orderAmount","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"converterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transactionFee","type":"uint256"}],"name":"setAdapterFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_converter","type":"address"}],"name":"setConverter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_collector","type":"address"}],"name":"setFeesCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003f8638038062003f86833981810160405260608110156200003757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505060006200006e6200014f60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001808190555062000124836200015760201b60201c565b6200013582620002b060201b60201c565b62000146816200040960201b60201c565b50505062000584565b600033905090565b620001676200014f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000229576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fc06343c9448e37c4ed257861469b4b35c140991c9cf08a4c38d335a1bc6a75d360405160405180910390a250565b620002c06200014f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000382576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fba265e20be387f8937b3b82562be8389bc8d09d0342f59413cdbc3dd414e564260405160405180910390a250565b620004196200014f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620004db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80620249f0101562000539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018062003f636023913960400191505060405180910390fd5b7f552893ff1179f25b1926dceb67fd12d0cc80f321a3ab90033956728e3ab106b960035482604051808381526020018281526020019250505060405180910390a18060038190555050565b6139cf80620005946000396000f3fe6080604052600436106101025760003560e01c806391c0871c11610095578063bba3a7c711610064578063bba3a7c7146108ac578063ce45332614610991578063f0b9e5ba146109e8578063f2fde38b14610b2c578063fd7d4b8f14610b7d576101ab565b806391c0871c14610590578063aba1e2ba14610704578063b19337a414610820578063ba215f6314610871576101ab565b806370bbde42116100d157806370bbde42146103bb578063715018a6146103e6578063742e08e3146103fd5780638da5cb5b14610539576101ab565b8063150b7a02146101b05780632c5eadde14610314578063373071f21461033f57806345ce5f1914610390576101ab565b366101ab573273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156101a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f427579416461707465723a2073656e64657220696e76616c696400000000000081525060200191505060405180910390fd5b005b600080fd5b3480156101bc57600080fd5b506102c0600480360360808110156101d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561023a57600080fd5b82018360208201111561024c57600080fd5b8035906020019184600183028401116401000000008311171561026e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610bd4565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561032057600080fd5b50610329610be8565b6040518082815260200191505060405180910390f35b34801561034b57600080fd5b5061038e6004803603602081101561036257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bef565b005b34801561039c57600080fd5b506103a5610d3f565b6040518082815260200191505060405180910390f35b3480156103c757600080fd5b506103d0610d45565b6040518082815260200191505060405180910390f35b3480156103f257600080fd5b506103fb610d4c565b005b610537600480360360e081101561041357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561047a57600080fd5b82018360208201111561048c57600080fd5b803590602001918460018302840111640100000000831117156104ae57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ed4565b005b34801561054557600080fd5b5061054e610ff3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059c57600080fd5b5061070260048036036101208110156105b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561061b57600080fd5b82018360208201111561062d57600080fd5b8035906020019184600183028401116401000000008311171561064f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061101c565b005b34801561071057600080fd5b5061081e600480360360a081101561072757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561076457600080fd5b82018360208201111561077657600080fd5b8035906020019184600183028401116401000000008311171561079857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611467565b005b34801561082c57600080fd5b5061086f6004803603602081101561084357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118aa565b005b34801561087d57600080fd5b506108aa6004803603602081101561089457600080fd5b81019080803590602001909291905050506119fa565b005b61098f600480360360608110156108c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156108ff57600080fd5b82018360208201111561091157600080fd5b8035906020019184600183028401116401000000008311171561093357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611b6a565b005b34801561099d57600080fd5b506109a6611c81565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109f457600080fd5b50610ad860048036036060811015610a0b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610a5257600080fd5b820183602082011115610a6457600080fd5b80359060200191846001830284011164010000000083111715610a8657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ca7565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b348015610b3857600080fd5b50610b7b60048036036020811015610b4f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cba565b005b348015610b8957600080fd5b50610b92611ec7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600063150b7a0260e01b9050949350505050565b620249f081565b610bf7611eed565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cb8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fba265e20be387f8937b3b82562be8389bc8d09d0342f59413cdbc3dd414e564260405160405180910390a250565b60035481565b620f424081565b610d54611eed565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e15576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026001541415610f4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000610f6084611ef5565b90506000610f778286611f2890919063ffffffff16565b9050803414610fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061390b602f913960400191505060405180910390fd5b610fe18989898989878a8a611fb0565b50506001808190555050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60026001541415611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006110cf87611ef5565b905060006110e68289611f2890919063ffffffff16565b905060008373ffffffffffffffffffffffffffffffffffffffff1663b27f823689846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561116f57600080fd5b505afa158015611183573d6000803e3d6000fd5b505050506040513d602081101561119957600080fd5b8101908080519060200190929190505050905060008111611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806138786026913960400191505060405180910390fd5b8681111561125e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806137476037913960400191505060405180910390fd5b61128b3330838b73ffffffffffffffffffffffffffffffffffffffff1661248d909392919063ffffffff16565b6112d8600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828a73ffffffffffffffffffffffffffffffffffffffff1661257a9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff16633bba21dc8b85876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200193505050506040805180830381600087803b15801561136957600080fd5b505af115801561137d573d6000803e3d6000fd5b505050506040513d604081101561139357600080fd5b8101908080519060200190929190805190602001909291905050509150915083821461140a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806138266031913960400191505060405180910390fd5b600081111561143f5761143e33828c73ffffffffffffffffffffffffffffffffffffffff166127819092919063ffffffff16565b5b61144f8f8f8f8f8f8a8e8e611fb0565b50505050505060018081905550505050505050505050565b600260015414156114e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061151a85611ef5565b905060006115318287611f2890919063ffffffff16565b905060008373ffffffffffffffffffffffffffffffffffffffff1663b27f823687846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156115ba57600080fd5b505afa1580156115ce573d6000803e3d6000fd5b505050506040513d60208110156115e457600080fd5b8101908080519060200190929190505050905060008111611650576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806138786026913960400191505060405180910390fd5b848111156116a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806137476037913960400191505060405180910390fd5b6116d63330838973ffffffffffffffffffffffffffffffffffffffff1661248d909392919063ffffffff16565b611723600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828873ffffffffffffffffffffffffffffffffffffffff1661257a9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff16633bba21dc8985876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200193505050506040805180830381600087803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b505050506040513d60408110156117de57600080fd5b81019080805190602001909291908051906020019092919050505091509150838214611855576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806138266031913960400191505060405180910390fd5b600081111561188a5761188933828a73ffffffffffffffffffffffffffffffffffffffff166127819092919063ffffffff16565b5b6118968b8b8b88612839565b505050505050600180819055505050505050565b6118b2611eed565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611973576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fc06343c9448e37c4ed257861469b4b35c140991c9cf08a4c38d335a1bc6a75d360405160405180910390a250565b611a02611eed565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ac3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80620249f01015611b1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806138e86023913960400191505060405180910390fd5b7f552893ff1179f25b1926dceb67fd12d0cc80f321a3ab90033956728e3ab106b960035482604051808381526020018281526020019250505060405180910390a18060038190555050565b60026001541415611be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000611bf682611ef5565b90506000611c0d8284611f2890919063ffffffff16565b9050803414611c67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061390b602f913960400191505060405180910390fd5b611c7385858585612839565b505060018081905550505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600063f0b9e5ba60e01b90509392505050565b611cc2611eed565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137216026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b6000611f21620f4240611f1360035485612c4c90919063ffffffff16565b612cd290919063ffffffff16565b9050919050565b600080828401905083811015611fa6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008411612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f427579416461707465723a20696e76616c6964206f726465722076616c75650081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137cd6026913960400191505060405180910390fd5b600047905060008773ffffffffffffffffffffffffffffffffffffffff1686886040518082805190602001908083835b6020831061212157805182526020820191506020810190506020830392506120fe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612183576040519150601f19603f3d011682016040523d82523d6000602084013e612188565b606091505b50509050806121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806137f36033913960400191505060405180910390fd5b6121f58683612d1c90919063ffffffff16565b471461224c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061389e6025913960400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16636352211e8b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156122b457600080fd5b505afa1580156122c8573d6000803e3d6000fd5b505050506040513d60208110156122de57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461235b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806136ff6022913960400191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050612407576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061377e602b913960400191505060405180910390fd5b6124138a8a8686612d66565b8773ffffffffffffffffffffffffffffffffffffffff16898b73ffffffffffffffffffffffffffffffffffffffff167f41db66efa207667201b031e90bc1ac58c2af27431cb9961a9391c8d9485c1c5b8989604051808381526020018281526020019250505060405180910390a450505050505050505050565b612574846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613220565b50505050565b6000811480612674575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561263757600080fd5b505afa15801561264b573d6000803e3d6000fd5b505050506040513d602081101561266157600080fd5b8101908080519060200190929190505050145b6126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806139646036913960400191505060405180910390fd5b61277c8363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613220565b505050565b6128348363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613220565b505050565b600082116128af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f427579416461707465723a20696e76616c6964206f726465722076616c75650081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612957576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137cd6026913960400191505060405180910390fd5b600047905060008573ffffffffffffffffffffffffffffffffffffffff1684866040518082805190602001908083835b602083106129aa5780518252602082019150602081019050602083039250612987565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612a0c576040519150601f19603f3d011682016040523d82523d6000602084013e612a11565b606091505b5050905080612a6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806137f36033913960400191505060405180910390fd5b612a7e8483612d1c90919063ffffffff16565b4714612ad5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061389e6025913960400191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050612b81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061377e602b913960400191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff167f252c6c3690d9bf864928fcc8c84eb799be8e3324c6cb81eb35bea7a4c76f21068585886040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612c08578082015181840152602081019050612bed565b50505050905090810190601f168015612c355780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2505050505050565b600080831415612c5f5760009050612ccc565b6000828402905082848281612c7057fe5b0414612cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806138576021913960400191505060405180910390fd5b809150505b92915050565b6000612d1483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061330f565b905092915050565b6000612d5e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506133d5565b905092915050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f427579416461707465723a20696e76616c69642062656e65666963696172790081525060200191505060405180910390fd5b60006002811115612e1557fe5b826002811115612e2157fe5b1415612eff578373ffffffffffffffffffffffffffffffffffffffff166342842e0e3083866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612ee257600080fd5b505af1158015612ef6573d6000803e3d6000fd5b5050505061310b565b60016002811115612f0c57fe5b826002811115612f1857fe5b1415612ff6578373ffffffffffffffffffffffffffffffffffffffff166323b872dd3083866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612fd957600080fd5b505af1158015612fed573d6000803e3d6000fd5b5050505061310a565b60028081111561300257fe5b82600281111561300e57fe5b14156130b8578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561309b57600080fd5b505af11580156130af573d6000803e3d6000fd5b50505050613109565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806137a96024913960400191505060405180910390fd5b5b5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561317357600080fd5b505afa158015613187573d6000803e3d6000fd5b505050506040513d602081101561319d57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461321a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806138c36025913960400191505060405180910390fd5b50505050565b6060613282826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134959092919063ffffffff16565b905060008151111561330a578080602001905160208110156132a357600080fd5b8101908080519060200190929190505050613309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061393a602a913960400191505060405180910390fd5b5b505050565b600080831182906133bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613380578082015181840152602081019050613365565b50505050905090810190601f1680156133ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816133c757fe5b049050809150509392505050565b6000838311158290613482576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561344757808201518184015260208101905061342c565b50505050905090810190601f1680156134745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60606134a484846000856134ad565b90509392505050565b60606134b8856136b3565b61352a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061357a5780518252602082019150602081019050602083039250613557565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146135dc576040519150601f19603f3d011682016040523d82523d6000602084013e6135e1565b606091505b509150915081156135f65780925050506136ab565b6000815111156136095780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613670578082015181840152602081019050613655565b50505050905090810190601f16801561369d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156136f557506000801b8214155b9250505091905056fe427579416461707465723a20746f6b656e4964206e6f74207472616e7366657265644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373427579416461707465723a207061796d656e74546f6b656e416d6f756e74203e205f6d61785061796d656e74546f6b656e416d6f756e74427579416461707465723a206572726f722073656e64696e67206665657320746f20636f6c6c6563746f72427579416461707465723a20556e736f70706f72746564207472616e7366657254797065427579416461707465723a206665657320436f6c6c6563746f72206d75737420626520736574427579416461707465723a206d61726b6574706c616365206661696c656420746f206578656375746520627579206f72646572427579416461707465723a20696e76616c696420657468657220616d6f756e7420616674657220636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77427579416461707465723a207061796d656e74546f6b656e416d6f756e7420696e76616c6964427579416461707465723a20706f737463616c6c2062616c616e6365206d69736d61746368427579416461707465723a206572726f722077697468206173736574207472616e73666572427579416461707465723a20496e76616c6964207472616e73616374696f6e20666565427579416461707465723a20696e76616c6964206d73672e76616c756520213d20286f72646572202b2066656573295361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220ea4d9eff11d5530a2fe5900e1ccbac94d2b13a2f9bb2047a7f55ed760975fc8664736f6c63430006080033427579416461707465723a20496e76616c6964207472616e73616374696f6e206665650000000000000000000000002859581da59bd4e16a866dd06b461b76d8e489a40000000000000000000000000d58aaae9f0c4d020486f534363f3fca7a6aecb600000000000000000000000000000000000000000000000000000000000061a8
Deployed Bytecode
0x6080604052600436106101025760003560e01c806391c0871c11610095578063bba3a7c711610064578063bba3a7c7146108ac578063ce45332614610991578063f0b9e5ba146109e8578063f2fde38b14610b2c578063fd7d4b8f14610b7d576101ab565b806391c0871c14610590578063aba1e2ba14610704578063b19337a414610820578063ba215f6314610871576101ab565b806370bbde42116100d157806370bbde42146103bb578063715018a6146103e6578063742e08e3146103fd5780638da5cb5b14610539576101ab565b8063150b7a02146101b05780632c5eadde14610314578063373071f21461033f57806345ce5f1914610390576101ab565b366101ab573273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156101a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f427579416461707465723a2073656e64657220696e76616c696400000000000081525060200191505060405180910390fd5b005b600080fd5b3480156101bc57600080fd5b506102c0600480360360808110156101d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561023a57600080fd5b82018360208201111561024c57600080fd5b8035906020019184600183028401116401000000008311171561026e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610bd4565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561032057600080fd5b50610329610be8565b6040518082815260200191505060405180910390f35b34801561034b57600080fd5b5061038e6004803603602081101561036257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bef565b005b34801561039c57600080fd5b506103a5610d3f565b6040518082815260200191505060405180910390f35b3480156103c757600080fd5b506103d0610d45565b6040518082815260200191505060405180910390f35b3480156103f257600080fd5b506103fb610d4c565b005b610537600480360360e081101561041357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561047a57600080fd5b82018360208201111561048c57600080fd5b803590602001918460018302840111640100000000831117156104ae57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ed4565b005b34801561054557600080fd5b5061054e610ff3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059c57600080fd5b5061070260048036036101208110156105b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561061b57600080fd5b82018360208201111561062d57600080fd5b8035906020019184600183028401116401000000008311171561064f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061101c565b005b34801561071057600080fd5b5061081e600480360360a081101561072757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561076457600080fd5b82018360208201111561077657600080fd5b8035906020019184600183028401116401000000008311171561079857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611467565b005b34801561082c57600080fd5b5061086f6004803603602081101561084357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118aa565b005b34801561087d57600080fd5b506108aa6004803603602081101561089457600080fd5b81019080803590602001909291905050506119fa565b005b61098f600480360360608110156108c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156108ff57600080fd5b82018360208201111561091157600080fd5b8035906020019184600183028401116401000000008311171561093357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611b6a565b005b34801561099d57600080fd5b506109a6611c81565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109f457600080fd5b50610ad860048036036060811015610a0b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610a5257600080fd5b820183602082011115610a6457600080fd5b80359060200191846001830284011164010000000083111715610a8657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ca7565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b348015610b3857600080fd5b50610b7b60048036036020811015610b4f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cba565b005b348015610b8957600080fd5b50610b92611ec7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600063150b7a0260e01b9050949350505050565b620249f081565b610bf7611eed565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cb8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fba265e20be387f8937b3b82562be8389bc8d09d0342f59413cdbc3dd414e564260405160405180910390a250565b60035481565b620f424081565b610d54611eed565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e15576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60026001541415610f4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000610f6084611ef5565b90506000610f778286611f2890919063ffffffff16565b9050803414610fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061390b602f913960400191505060405180910390fd5b610fe18989898989878a8a611fb0565b50506001808190555050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60026001541415611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006110cf87611ef5565b905060006110e68289611f2890919063ffffffff16565b905060008373ffffffffffffffffffffffffffffffffffffffff1663b27f823689846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561116f57600080fd5b505afa158015611183573d6000803e3d6000fd5b505050506040513d602081101561119957600080fd5b8101908080519060200190929190505050905060008111611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806138786026913960400191505060405180910390fd5b8681111561125e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806137476037913960400191505060405180910390fd5b61128b3330838b73ffffffffffffffffffffffffffffffffffffffff1661248d909392919063ffffffff16565b6112d8600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828a73ffffffffffffffffffffffffffffffffffffffff1661257a9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff16633bba21dc8b85876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200193505050506040805180830381600087803b15801561136957600080fd5b505af115801561137d573d6000803e3d6000fd5b505050506040513d604081101561139357600080fd5b8101908080519060200190929190805190602001909291905050509150915083821461140a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806138266031913960400191505060405180910390fd5b600081111561143f5761143e33828c73ffffffffffffffffffffffffffffffffffffffff166127819092919063ffffffff16565b5b61144f8f8f8f8f8f8a8e8e611fb0565b50505050505060018081905550505050505050505050565b600260015414156114e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061151a85611ef5565b905060006115318287611f2890919063ffffffff16565b905060008373ffffffffffffffffffffffffffffffffffffffff1663b27f823687846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156115ba57600080fd5b505afa1580156115ce573d6000803e3d6000fd5b505050506040513d60208110156115e457600080fd5b8101908080519060200190929190505050905060008111611650576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806138786026913960400191505060405180910390fd5b848111156116a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806137476037913960400191505060405180910390fd5b6116d63330838973ffffffffffffffffffffffffffffffffffffffff1661248d909392919063ffffffff16565b611723600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828873ffffffffffffffffffffffffffffffffffffffff1661257a9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff16633bba21dc8985876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200193505050506040805180830381600087803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b505050506040513d60408110156117de57600080fd5b81019080805190602001909291908051906020019092919050505091509150838214611855576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806138266031913960400191505060405180910390fd5b600081111561188a5761188933828a73ffffffffffffffffffffffffffffffffffffffff166127819092919063ffffffff16565b5b6118968b8b8b88612839565b505050505050600180819055505050505050565b6118b2611eed565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611973576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fc06343c9448e37c4ed257861469b4b35c140991c9cf08a4c38d335a1bc6a75d360405160405180910390a250565b611a02611eed565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ac3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80620249f01015611b1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806138e86023913960400191505060405180910390fd5b7f552893ff1179f25b1926dceb67fd12d0cc80f321a3ab90033956728e3ab106b960035482604051808381526020018281526020019250505060405180910390a18060038190555050565b60026001541415611be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000611bf682611ef5565b90506000611c0d8284611f2890919063ffffffff16565b9050803414611c67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061390b602f913960400191505060405180910390fd5b611c7385858585612839565b505060018081905550505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600063f0b9e5ba60e01b90509392505050565b611cc2611eed565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137216026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b6000611f21620f4240611f1360035485612c4c90919063ffffffff16565b612cd290919063ffffffff16565b9050919050565b600080828401905083811015611fa6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008411612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f427579416461707465723a20696e76616c6964206f726465722076616c75650081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137cd6026913960400191505060405180910390fd5b600047905060008773ffffffffffffffffffffffffffffffffffffffff1686886040518082805190602001908083835b6020831061212157805182526020820191506020810190506020830392506120fe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612183576040519150601f19603f3d011682016040523d82523d6000602084013e612188565b606091505b50509050806121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806137f36033913960400191505060405180910390fd5b6121f58683612d1c90919063ffffffff16565b471461224c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061389e6025913960400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16636352211e8b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156122b457600080fd5b505afa1580156122c8573d6000803e3d6000fd5b505050506040513d60208110156122de57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461235b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806136ff6022913960400191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050612407576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061377e602b913960400191505060405180910390fd5b6124138a8a8686612d66565b8773ffffffffffffffffffffffffffffffffffffffff16898b73ffffffffffffffffffffffffffffffffffffffff167f41db66efa207667201b031e90bc1ac58c2af27431cb9961a9391c8d9485c1c5b8989604051808381526020018281526020019250505060405180910390a450505050505050505050565b612574846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613220565b50505050565b6000811480612674575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561263757600080fd5b505afa15801561264b573d6000803e3d6000fd5b505050506040513d602081101561266157600080fd5b8101908080519060200190929190505050145b6126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806139646036913960400191505060405180910390fd5b61277c8363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613220565b505050565b6128348363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613220565b505050565b600082116128af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f427579416461707465723a20696e76616c6964206f726465722076616c75650081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612957576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137cd6026913960400191505060405180910390fd5b600047905060008573ffffffffffffffffffffffffffffffffffffffff1684866040518082805190602001908083835b602083106129aa5780518252602082019150602081019050602083039250612987565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612a0c576040519150601f19603f3d011682016040523d82523d6000602084013e612a11565b606091505b5050905080612a6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806137f36033913960400191505060405180910390fd5b612a7e8483612d1c90919063ffffffff16565b4714612ad5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061389e6025913960400191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050612b81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061377e602b913960400191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff167f252c6c3690d9bf864928fcc8c84eb799be8e3324c6cb81eb35bea7a4c76f21068585886040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612c08578082015181840152602081019050612bed565b50505050905090810190601f168015612c355780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2505050505050565b600080831415612c5f5760009050612ccc565b6000828402905082848281612c7057fe5b0414612cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806138576021913960400191505060405180910390fd5b809150505b92915050565b6000612d1483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061330f565b905092915050565b6000612d5e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506133d5565b905092915050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f427579416461707465723a20696e76616c69642062656e65666963696172790081525060200191505060405180910390fd5b60006002811115612e1557fe5b826002811115612e2157fe5b1415612eff578373ffffffffffffffffffffffffffffffffffffffff166342842e0e3083866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612ee257600080fd5b505af1158015612ef6573d6000803e3d6000fd5b5050505061310b565b60016002811115612f0c57fe5b826002811115612f1857fe5b1415612ff6578373ffffffffffffffffffffffffffffffffffffffff166323b872dd3083866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612fd957600080fd5b505af1158015612fed573d6000803e3d6000fd5b5050505061310a565b60028081111561300257fe5b82600281111561300e57fe5b14156130b8578373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561309b57600080fd5b505af11580156130af573d6000803e3d6000fd5b50505050613109565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806137a96024913960400191505060405180910390fd5b5b5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561317357600080fd5b505afa158015613187573d6000803e3d6000fd5b505050506040513d602081101561319d57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461321a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806138c36025913960400191505060405180910390fd5b50505050565b6060613282826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134959092919063ffffffff16565b905060008151111561330a578080602001905160208110156132a357600080fd5b8101908080519060200190929190505050613309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061393a602a913960400191505060405180910390fd5b5b505050565b600080831182906133bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613380578082015181840152602081019050613365565b50505050905090810190601f1680156133ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816133c757fe5b049050809150509392505050565b6000838311158290613482576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561344757808201518184015260208101905061342c565b50505050905090810190601f1680156134745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60606134a484846000856134ad565b90509392505050565b60606134b8856136b3565b61352a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061357a5780518252602082019150602081019050602083039250613557565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146135dc576040519150601f19603f3d011682016040523d82523d6000602084013e6135e1565b606091505b509150915081156135f65780925050506136ab565b6000815111156136095780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613670578082015181840152602081019050613655565b50505050905090810190601f16801561369d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156136f557506000801b8214155b9250505091905056fe427579416461707465723a20746f6b656e4964206e6f74207472616e7366657265644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373427579416461707465723a207061796d656e74546f6b656e416d6f756e74203e205f6d61785061796d656e74546f6b656e416d6f756e74427579416461707465723a206572726f722073656e64696e67206665657320746f20636f6c6c6563746f72427579416461707465723a20556e736f70706f72746564207472616e7366657254797065427579416461707465723a206665657320436f6c6c6563746f72206d75737420626520736574427579416461707465723a206d61726b6574706c616365206661696c656420746f206578656375746520627579206f72646572427579416461707465723a20696e76616c696420657468657220616d6f756e7420616674657220636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77427579416461707465723a207061796d656e74546f6b656e416d6f756e7420696e76616c6964427579416461707465723a20706f737463616c6c2062616c616e6365206d69736d61746368427579416461707465723a206572726f722077697468206173736574207472616e73666572427579416461707465723a20496e76616c6964207472616e73616374696f6e20666565427579416461707465723a20696e76616c6964206d73672e76616c756520213d20286f72646572202b2066656573295361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220ea4d9eff11d5530a2fe5900e1ccbac94d2b13a2f9bb2047a7f55ed760975fc8664736f6c63430006080033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002859581da59bd4e16a866dd06b461b76d8e489a40000000000000000000000000d58aaae9f0c4d020486f534363f3fca7a6aecb600000000000000000000000000000000000000000000000000000000000061a8
-----Decoded View---------------
Arg [0] : _converter (address): 0x2859581da59BD4e16a866Dd06b461b76d8E489a4
Arg [1] : _collector (address): 0x0d58aaAe9F0c4d020486f534363f3FCa7a6AEcB6
Arg [2] : _adapderFee (uint256): 25000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002859581da59bd4e16a866dd06b461b76d8e489a4
Arg [1] : 0000000000000000000000000d58aaae9f0c4d020486f534363f3fca7a6aecb6
Arg [2] : 00000000000000000000000000000000000000000000000000000000000061a8
Deployed Bytecode Sourcemap
32894:16372:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49215:9;49201:23;;:10;:23;;;;49193:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32894:16372;;12:1:-1;9;2:12;25838:210:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25838:210:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25838:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;25838:210:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25838:210:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25838:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;25838:210:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;33872:48;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33872:48:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34693:170;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34693:170:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34693:170:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;33787:36;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33787:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33934:55;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33934:55:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8128:148;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8128:148:0;;;:::i;:::-;;38770:906;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;38770:906:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;38770:906:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;38770:906:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;38770:906:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;38770:906:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7486:79;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7486:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36081:2149;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36081:2149:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36081:2149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;36081:2149:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36081:2149:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;36081:2149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;36081:2149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41429:1910;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41429:1910:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;41429:1910:0;;;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;41429:1910:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;41429:1910:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41429:1910:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;41429:1910:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26396:155;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26396:155:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;26396:155:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;35017:325;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35017:325:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;35017:325:0;;;;;;;;;;;;;;;;;:::i;:::-;;40119:667;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;40119:667:0;;;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;40119:667:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;40119:667:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;40119:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;40119:667:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26264:31;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26264:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25559:132;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25559:132:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;25559:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;25559:132:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25559:132:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25559:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;25559:132:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8431:244;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8431:244:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;8431:244:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;34034:43;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34034:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25838:210;25990:6;25321:10;26021:19;;26014:26;;25838:210;;;;;;:::o;33872:48::-;33914:6;33872:48;:::o;34693:170::-;7708:12;:10;:12::i;:::-;7698:22;;:6;;;;;;;;;;;:22;;;7690:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34798:10:::1;34775:20;;:33;;;;;;;;;;;;;;;;;;34844:10;34824:31;;;;;;;;;;;;34693:170:::0;:::o;33787:36::-;;;;:::o;33934:55::-;33982:7;33934:55;:::o;8128:148::-;7708:12;:10;:12::i;:::-;7698:22;;:6;;;;;;;;;;;:22;;;7690:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8235:1:::1;8198:40;;8219:6;::::0;::::1;;;;;;;;;8198:40;;;;;;;;;;;;8266:1;8249:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;8128:148::o:0;38770:906::-;10415:1;11021:7;;:19;;11013:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10415:1;11154:7;:18;;;;39142:17:::1;39162:28;39177:12;39162:14;:28::i;:::-;39142:48;;39201:24;39228:27;39245:9;39228:12;:16;;:27;;;;:::i;:::-;39201:54;;39338:16;39325:9;:29;39303:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39442:226;39461:9;39485:8;39508:12;39535:16;39566:12;39593:9;39617:13;39645:12;39442:4;:226::i;:::-;11185:1;;10371::::0;11333:7;:22;;;;38770:906;;;;;;;:::o;7486:79::-;7524:7;7551:6;;;;;;;;;;;7544:13;;7486:79;:::o;36081:2149::-;10415:1;11021:7;;:19;;11013:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10415:1;11154:7;:18;;;;36457:20:::1;36491:16;;;;;;;;;;;36457:51;;36581:17;36601:28;36616:12;36601:14;:28::i;:::-;36581:48;;36640:24;36667:27;36684:9;36667:12;:16;;:27;;;;:::i;:::-;36640:54;;36767:26;36796:9;:34;;;36845:13;36873:16;36796:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36796:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36796:104:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;36796:104:0;;;;;;;;;;;;;;;;36767:133;;36956:1;36935:18;:22;36913:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37080:22;37058:18;:44;;37036:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37233:101;37278:10;37298:4;37305:18;37233:13;:30;;;;:101;;;;;;:::i;:::-;37412:63;37438:16;;;;;;;;;;;37456:18;37412:13;:25;;;;:63;;;;;:::i;:::-;37527:20;37549:28:::0;37581:9:::1;:26;;;37622:13;37650:18;37683:16;37581:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37581:129:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37581:129:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;37581:129:0;;;;;;;;;;;;;;;;;;;;;;;;;37526:184;;;;37761:16;37745:12;:32;37723:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37894:1;37871:20;:24;37867:117;;;37912:60;37939:10;37951:20;37912:13;:26;;;;:60;;;;;:::i;:::-;37867:117;37996:226;38015:9;38039:8;38062:12;38089:16;38120:12;38147:9;38171:13;38199:12;37996:4;:226::i;:::-;11185:1;;;;;;10371::::0;11333:7;:22;;;;36081:2149;;;;;;;;;:::o;41429:1910::-;10415:1;11021:7;;:19;;11013:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10415:1;11154:7;:18;;;;41668:20:::1;41702:16;;;;;;;;;;;41668:51;;41792:17;41812:28;41827:12;41812:14;:28::i;:::-;41792:48;;41851:24;41878:27;41895:9;41878:12;:16;;:27;;;;:::i;:::-;41851:54;;41978:26;42007:9;:34;;;42056:13;42084:16;42007:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42007:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42007:104:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;42007:104:0;;;;;;;;;;;;;;;;41978:133;;42167:1;42146:18;:22;42124:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42291:22;42269:18;:44;;42247:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42444:101;42489:10;42509:4;42516:18;42444:13;:30;;;;:101;;;;;;:::i;:::-;42623:63;42649:16;;;;;;;;;;;42667:18;42623:13;:25;;;;:63;;;;;:::i;:::-;42738:20;42760:28:::0;42792:9:::1;:26;;;42833:13;42861:18;42894:16;42792:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42792:129:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42792:129:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;42792:129:0;;;;;;;;;;;;;;;;;;;;;;;;;42737:184;;;;42972:16;42956:12;:32;42934:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43105:1;43082:20;:24;43078:117;;;43123:60;43150:10;43162:20;43123:13;:26;;;;:60;;;;;:::i;:::-;43078:117;43207:124;43226:12;43253:16;43284:12;43311:9;43207:4;:124::i;:::-;11185:1;;;;;;10371::::0;11333:7;:22;;;;41429:1910;;;;;:::o;26396:155::-;7708:12;:10;:12::i;:::-;7698:22;;:6;;;;;;;;;;;:22;;;7690:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26493:10:::1;26474:16;;:29;;;;;;;;;;;;;;;;;;26532:10;26519:24;;;;;;;;;;;;26396:155:::0;:::o;35017:325::-;7708:12;:10;:12::i;:::-;7698:22;;:6;;;;;;;;;;;:22;;;7690:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35134:15:::1;33914:6;35115:34;;35093:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35228:56;35245:21;;35268:15;35228:56;;;;;;;;;;;;;;;;;;;;;;;;35319:15;35295:21;:39;;;;35017:325:::0;:::o;40119:667::-;10415:1;11021:7;;:19;;11013:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10415:1;11154:7;:18;;;;40354:17:::1;40374:28;40389:12;40374:14;:28::i;:::-;40354:48;;40413:24;40440:27;40457:9;40440:12;:16;;:27;;;;:::i;:::-;40413:54;;40550:16;40537:9;:29;40515:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40654:124;40673:12;40700:16;40731:12;40758:9;40654:4;:124::i;:::-;11185:1;;10371::::0;11333:7;:22;;;;40119:667;;;:::o;26264:31::-;;;;;;;;;;;;;:::o;25559:132::-;25638:6;25467:10;25664:19;;25657:26;;25559:132;;;;;:::o;8431:244::-;7708:12;:10;:12::i;:::-;7698:22;;:6;;;;;;;;;;;:22;;;7690:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8540:1:::1;8520:22;;:8;:22;;;;8512:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8630:8;8601:38;;8622:6;::::0;::::1;;;;;;;;;8601:38;;;;;;;;;;;;8659:8;8650:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;8431:244:::0;:::o;34034:43::-;;;;;;;;;;;;;:::o;6040:106::-;6093:15;6128:10;6121:17;;6040:106;:::o;48950:197::-;49018:7;49045:94;33982:7;49045:53;49076:21;;49045:12;:30;;:53;;;;:::i;:::-;:71;;:94;;;;:::i;:::-;49038:101;;48950:197;;;:::o;956:181::-;1014:7;1034:9;1050:1;1046;:5;1034:17;;1075:1;1070;:6;;1062:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1128:1;1121:8;;;956:181;;;;:::o;43891:1806::-;44237:1;44222:12;:16;44214:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44325:1;44293:34;;:20;;;;;;;;;;;:34;;;;44285:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44444:22;44469:21;44444:46;;44561:12;44579;:17;;44605:12;44634:16;44579:82;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;44579:82:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;44560:101:0;;;44696:7;44674:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44842:32;44861:12;44842:14;:18;;:32;;;;:::i;:::-;44817:21;:57;44795:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45013:4;44974:44;;:9;:17;;;44992:8;44974:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44974:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44974:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;44974:27:0;;;;;;;;;;;;;;;;:44;;;44952:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45173:20;;;;;;;;;;;:25;;:48;45199:21;45173:48;;;;;;;;;;;;;;;;;;;;;;;45151:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45344:126;45372:9;45396:8;45419:13;45447:12;45344:13;:126::i;:::-;45613:12;45529:160;;45590:8;45565:9;45529:160;;;45640:12;45667:11;45529:160;;;;;;;;;;;;;;;;;;;;;;;;43891:1806;;;;;;;;;;:::o;21254:205::-;21355:96;21375:5;21405:27;;;21434:4;21440:2;21444:5;21382:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21382:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;21382:68:0;21355:19;:96::i;:::-;21254:205;;;;:::o;21728:622::-;22107:1;22098:5;:10;22097:62;;;;22157:1;22114:5;:15;;;22138:4;22145:7;22114:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22114:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22114:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;22114:39:0;;;;;;;;;;;;;;;;:44;22097:62;22089:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22252:90;22272:5;22302:22;;;22326:7;22335:5;22279:62;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22279:62:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;22279:62:0;22252:19;:90::i;:::-;21728:622;;;:::o;21069:177::-;21152:86;21172:5;21202:23;;;21227:2;21231:5;21179:58;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21179:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;21179:58:0;21152:19;:86::i;:::-;21069:177;;;:::o;46152:1325::-;46361:1;46346:12;:16;46338:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46449:1;46417:34;;:20;;;;;;;;;;;:34;;;;46409:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46568:22;46593:21;46568:46;;46685:12;46703;:17;;46729:12;46758:16;46703:82;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;46703:82:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;46684:101:0;;;46820:7;46798:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46966:32;46985:12;46966:14;:18;;:32;;;;:::i;:::-;46941:21;:57;46919:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47156:20;;;;;;;;;;;:25;;:48;47182:21;47156:48;;;;;;;;;;;;;;;;;;;;;;;47134:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47362:12;47334:135;;;47389:12;47416:11;47442:16;47334:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;47334:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46152:1325;;;;;;:::o;2310:471::-;2368:7;2618:1;2613;:6;2609:47;;;2643:1;2636:8;;;;2609:47;2668:9;2684:1;2680;:5;2668:17;;2713:1;2708;2704;:5;;;;;;:10;2696:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2772:1;2765:8;;;2310:471;;;;;:::o;3257:132::-;3315:7;3342:39;3346:1;3349;3342:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3335:46;;3257:132;;;;:::o;1420:136::-;1478:7;1505:43;1509:1;1512;1505:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1498:50;;1420:136;;;;:::o;47766:1041::-;47998:4;47974:29;;:12;:29;;;;47966:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48073:29;48056:46;;;;;;;;:13;:46;;;;;;;;;48052:605;;;48119:9;:26;;;48154:4;48161:12;48175:8;48119:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48119:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48119:65:0;;;;48052:605;;;48225:25;48208:42;;;;;;;;:13;:42;;;;;;;;;48204:453;;;48267:9;:22;;;48316:4;48340:12;48371:8;48267:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48267:127:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48267:127:0;;;;48204:453;;;48435:21;48418:38;;;;;;;;:13;:38;;;;;;;;;48414:243;;;48473:9;:18;;;48510:12;48541:8;48473:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48473:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48473:91:0;;;;48414:243;;;48599:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48414:243;48204:453;48052:605;48722:12;48691:43;;:9;:17;;;48709:8;48691:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48691:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48691:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;48691:27:0;;;;;;;;;;;;;;;;:43;;;48669:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47766:1041;;;;:::o;23374:761::-;23798:23;23824:69;23852:4;23824:69;;;;;;;;;;;;;;;;;23832:5;23824:27;;;;:69;;;;;:::i;:::-;23798:95;;23928:1;23908:10;:17;:21;23904:224;;;24050:10;24039:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;24039:30:0;;;;;;;;;;;;;;;;24031:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23904:224;23374:761;;;:::o;3885:278::-;3971:7;4003:1;3999;:5;4006:12;3991:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3991:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4030:9;4046:1;4042;:5;;;;;;4030:17;;4154:1;4147:8;;;3885:278;;;;;:::o;1859:192::-;1945:7;1978:1;1973;:6;;1981:12;1965:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1965:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2005:9;2021:1;2017;:5;2005:17;;2042:1;2035:8;;;1859:192;;;;;:::o;18050:196::-;18153:12;18185:53;18208:6;18216:4;18222:1;18225:12;18185:22;:53::i;:::-;18178:60;;18050:196;;;;;:::o;19427:979::-;19557:12;19590:18;19601:6;19590:10;:18::i;:::-;19582:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19716:12;19730:23;19757:6;:11;;19777:8;19788:4;19757:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;19757:36:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;19715:78:0;;;;19808:7;19804:595;;;19839:10;19832:17;;;;;;19804:595;19973:1;19953:10;:17;:21;19949:439;;;20216:10;20210:17;20277:15;20264:10;20260:2;20256:19;20249:44;20164:148;20359:12;20352:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20352:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19427:979;;;;;;;:::o;14935:619::-;14995:4;15257:16;15284:19;15306:66;15284:88;;;;15475:7;15463:20;15451:32;;15515:11;15503:8;:23;;:42;;;;;15542:3;15530:15;;:8;:15;;15503:42;15495:51;;;;14935:619;;;:::o
Swarm Source
ipfs://ea4d9eff11d5530a2fe5900e1ccbac94d2b13a2f9bb2047a7f55ed760975fc86
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.