Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 108 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Safe Transfer Fr... | 16902930 | 1070 days ago | IN | 0 ETH | 0.00137927 | ||||
| Mint Bored Elons | 15734036 | 1233 days ago | IN | 0.06 ETH | 0.00364153 | ||||
| Mint Bored Elons | 15105431 | 1329 days ago | IN | 0.06 ETH | 0.00228666 | ||||
| Set Approval For... | 14828630 | 1376 days ago | IN | 0 ETH | 0.00059472 | ||||
| Set Approval For... | 14823478 | 1377 days ago | IN | 0 ETH | 0.00122469 | ||||
| Set Approval For... | 14715159 | 1394 days ago | IN | 0 ETH | 0.00266667 | ||||
| Flip Sale State | 14342444 | 1452 days ago | IN | 0 ETH | 0.0013759 | ||||
| Set Approval For... | 14236072 | 1469 days ago | IN | 0 ETH | 0.00169446 | ||||
| Flip Sale State | 14143273 | 1483 days ago | IN | 0 ETH | 0.00197305 | ||||
| Set Approval For... | 14127447 | 1485 days ago | IN | 0 ETH | 0.00585259 | ||||
| Set Approval For... | 13995620 | 1506 days ago | IN | 0 ETH | 0.00567441 | ||||
| Mint Bored Elons | 13539132 | 1577 days ago | IN | 0.06 ETH | 0.03163519 | ||||
| Mint Bored Elons | 13484163 | 1586 days ago | IN | 0.06 ETH | 0.01082142 | ||||
| Withdraw | 13481636 | 1586 days ago | IN | 0 ETH | 0.00822297 | ||||
| Transfer From | 13471460 | 1588 days ago | IN | 0 ETH | 0.00629122 | ||||
| Transfer From | 13457550 | 1590 days ago | IN | 0 ETH | 0.00903525 | ||||
| Mint Bored Elons | 13452212 | 1591 days ago | IN | 0.06 ETH | 0.01223073 | ||||
| Transfer From | 13445777 | 1592 days ago | IN | 0 ETH | 0.00511844 | ||||
| Transfer From | 13440633 | 1593 days ago | IN | 0 ETH | 0.00641581 | ||||
| Mint Bored Elons | 13440406 | 1593 days ago | IN | 0.06 ETH | 0.0085143 | ||||
| Mint Bored Elons | 13440297 | 1593 days ago | IN | 0.06 ETH | 0.00914917 | ||||
| Withdraw | 13440198 | 1593 days ago | IN | 0 ETH | 0.00654198 | ||||
| Transfer From | 13436098 | 1594 days ago | IN | 0 ETH | 0.00752928 | ||||
| Mint Bored Elons | 13430927 | 1594 days ago | IN | 0.06 ETH | 0.01129671 | ||||
| Transfer From | 13419727 | 1596 days ago | IN | 0 ETH | 0.0149462 |
Latest 20 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 13481636 | 1586 days ago | 0.018 ETH | ||||
| - | 13481636 | 1586 days ago | 0.027 ETH | ||||
| - | 13481636 | 1586 days ago | 0.045 ETH | ||||
| - | 13481636 | 1586 days ago | 0.045 ETH | ||||
| - | 13481636 | 1586 days ago | 0.045 ETH | ||||
| - | 13440198 | 1593 days ago | 0.09 ETH | ||||
| - | 13440198 | 1593 days ago | 0.135 ETH | ||||
| - | 13440198 | 1593 days ago | 0.225 ETH | ||||
| - | 13440198 | 1593 days ago | 0.225 ETH | ||||
| - | 13440198 | 1593 days ago | 0.225 ETH | ||||
| - | 13279534 | 1618 days ago | 0.226 ETH | ||||
| - | 13279534 | 1618 days ago | 0.339 ETH | ||||
| - | 13279534 | 1618 days ago | 0.565 ETH | ||||
| - | 13279534 | 1618 days ago | 0.565 ETH | ||||
| - | 13279534 | 1618 days ago | 0.565 ETH | ||||
| - | 13253322 | 1622 days ago | 0.02 ETH | ||||
| - | 13253322 | 1622 days ago | 0.03 ETH | ||||
| - | 13253322 | 1622 days ago | 0.05 ETH | ||||
| - | 13253322 | 1622 days ago | 0.05 ETH | ||||
| - | 13253322 | 1622 days ago | 0.05 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BoredElonUnicornClub
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-09-19
*/
/**
*Submitted for verification at Etherscan.io on 2021-06-29
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Context.sol
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/introspection/IERC165.sol
pragma solidity >=0.6.0 <0.8.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 <0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred 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: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
pragma solidity >=0.6.0 <0.8.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: @openzeppelin/contracts/introspection/ERC165.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
abstract contract ERC165 is IERC165 {
/*
* bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
*/
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
/**
* @dev Mapping of interface ids to whether or not it's supported.
*/
mapping(bytes4 => bool) private _supportedInterfaces;
constructor () internal {
// Derived contracts need only register support for their own interfaces,
// we register support for ERC165 itself here
_registerInterface(_INTERFACE_ID_ERC165);
}
/**
* @dev See {IERC165-supportsInterface}.
*
* Time complexity O(1), guaranteed to always use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return _supportedInterfaces[interfaceId];
}
/**
* @dev Registers the contract as an implementer of the interface defined by
* `interfaceId`. Support of the actual ERC165 interface is automatic and
* registering its interface id is not required.
*
* See {IERC165-supportsInterface}.
*
* Requirements:
*
* - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
*/
function _registerInterface(bytes4 interfaceId) internal virtual {
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
_supportedInterfaces[interfaceId] = true;
}
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
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) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
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, reverting 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) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* 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);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/utils/EnumerableSet.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
// File: @openzeppelin/contracts/utils/EnumerableMap.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Library for managing an enumerable variant of Solidity's
* https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
* type.
*
* Maps have the following properties:
*
* - Entries are added, removed, and checked for existence in constant time
* (O(1)).
* - Entries are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableMap for EnumerableMap.UintToAddressMap;
*
* // Declare a set state variable
* EnumerableMap.UintToAddressMap private myMap;
* }
* ```
*
* As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
* supported.
*/
library EnumerableMap {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Map type with
// bytes32 keys and values.
// The Map implementation uses private functions, and user-facing
// implementations (such as Uint256ToAddressMap) are just wrappers around
// the underlying Map.
// This means that we can only create new EnumerableMaps for types that fit
// in bytes32.
struct MapEntry {
bytes32 _key;
bytes32 _value;
}
struct Map {
// Storage of map keys and values
MapEntry[] _entries;
// Position of the entry defined by a key in the `entries` array, plus 1
// because index 0 means a key is not in the map.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Adds a key-value pair to a map, or updates the value for an existing
* key. O(1).
*
* Returns true if the key was added to the map, that is if it was not
* already present.
*/
function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
// We read and store the key's index to prevent multiple reads from the same storage slot
uint256 keyIndex = map._indexes[key];
if (keyIndex == 0) { // Equivalent to !contains(map, key)
map._entries.push(MapEntry({ _key: key, _value: value }));
// The entry is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
map._indexes[key] = map._entries.length;
return true;
} else {
map._entries[keyIndex - 1]._value = value;
return false;
}
}
/**
* @dev Removes a key-value pair from a map. O(1).
*
* Returns true if the key was removed from the map, that is if it was present.
*/
function _remove(Map storage map, bytes32 key) private returns (bool) {
// We read and store the key's index to prevent multiple reads from the same storage slot
uint256 keyIndex = map._indexes[key];
if (keyIndex != 0) { // Equivalent to contains(map, key)
// To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
// in the array, and then remove the last entry (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = keyIndex - 1;
uint256 lastIndex = map._entries.length - 1;
// When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
MapEntry storage lastEntry = map._entries[lastIndex];
// Move the last entry to the index where the entry to delete is
map._entries[toDeleteIndex] = lastEntry;
// Update the index for the moved entry
map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved entry was stored
map._entries.pop();
// Delete the index for the deleted slot
delete map._indexes[key];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the key is in the map. O(1).
*/
function _contains(Map storage map, bytes32 key) private view returns (bool) {
return map._indexes[key] != 0;
}
/**
* @dev Returns the number of key-value pairs in the map. O(1).
*/
function _length(Map storage map) private view returns (uint256) {
return map._entries.length;
}
/**
* @dev Returns the key-value pair stored at position `index` in the map. O(1).
*
* Note that there are no guarantees on the ordering of entries inside the
* array, and it may change when more entries are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
require(map._entries.length > index, "EnumerableMap: index out of bounds");
MapEntry storage entry = map._entries[index];
return (entry._key, entry._value);
}
/**
* @dev Tries to returns the value associated with `key`. O(1).
* Does not revert if `key` is not in the map.
*/
function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
uint256 keyIndex = map._indexes[key];
if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
}
/**
* @dev Returns the value associated with `key`. O(1).
*
* Requirements:
*
* - `key` must be in the map.
*/
function _get(Map storage map, bytes32 key) private view returns (bytes32) {
uint256 keyIndex = map._indexes[key];
require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
return map._entries[keyIndex - 1]._value; // All indexes are 1-based
}
/**
* @dev Same as {_get}, with a custom error message when `key` is not in the map.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {_tryGet}.
*/
function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
uint256 keyIndex = map._indexes[key];
require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
return map._entries[keyIndex - 1]._value; // All indexes are 1-based
}
// UintToAddressMap
struct UintToAddressMap {
Map _inner;
}
/**
* @dev Adds a key-value pair to a map, or updates the value for an existing
* key. O(1).
*
* Returns true if the key was added to the map, that is if it was not
* already present.
*/
function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the key was removed from the map, that is if it was present.
*/
function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
return _remove(map._inner, bytes32(key));
}
/**
* @dev Returns true if the key is in the map. O(1).
*/
function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
return _contains(map._inner, bytes32(key));
}
/**
* @dev Returns the number of elements in the map. O(1).
*/
function length(UintToAddressMap storage map) internal view returns (uint256) {
return _length(map._inner);
}
/**
* @dev Returns the element stored at position `index` in the set. O(1).
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
(bytes32 key, bytes32 value) = _at(map._inner, index);
return (uint256(key), address(uint160(uint256(value))));
}
/**
* @dev Tries to returns the value associated with `key`. O(1).
* Does not revert if `key` is not in the map.
*
* _Available since v3.4._
*/
function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
(bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
return (success, address(uint160(uint256(value))));
}
/**
* @dev Returns the value associated with `key`. O(1).
*
* Requirements:
*
* - `key` must be in the map.
*/
function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
return address(uint160(uint256(_get(map._inner, bytes32(key)))));
}
/**
* @dev Same as {get}, with a custom error message when `key` is not in the map.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryGet}.
*/
function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev String operations.
*/
library Strings {
/**
* @dev Converts a `uint256` to its ASCII `string` representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
uint256 index = digits - 1;
temp = value;
while (temp != 0) {
buffer[index--] = bytes1(uint8(48 + temp % 10));
temp /= 10;
}
return string(buffer);
}
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @title ERC721 Non-Fungible Token Standard basic implementation
* @dev see https://eips.ethereum.org/EIPS/eip-721
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
using SafeMath for uint256;
using Address for address;
using EnumerableSet for EnumerableSet.UintSet;
using EnumerableMap for EnumerableMap.UintToAddressMap;
using Strings for uint256;
// Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
// which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
// Mapping from holder address to their (enumerable) set of owned tokens
mapping (address => EnumerableSet.UintSet) private _holderTokens;
// Enumerable mapping from token ids to their owners
EnumerableMap.UintToAddressMap private _tokenOwners;
// Mapping from token ID to approved address
mapping (uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping (address => mapping (address => bool)) private _operatorApprovals;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Optional mapping for token URIs
mapping (uint256 => string) private _tokenURIs;
// Base URI
string private _baseURI;
/*
* bytes4(keccak256('balanceOf(address)')) == 0x70a08231
* bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
* bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
* bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
* bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
* bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
* bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
* bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
* bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
*
* => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
* 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
*/
bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
/*
* bytes4(keccak256('name()')) == 0x06fdde03
* bytes4(keccak256('symbol()')) == 0x95d89b41
* bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
*
* => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
*/
bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
/*
* bytes4(keccak256('totalSupply()')) == 0x18160ddd
* bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
* bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
*
* => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
*/
bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor (string memory name_, string memory symbol_) public {
_name = name_;
_symbol = symbol_;
// register the supported interfaces to conform to ERC721 via ERC165
_registerInterface(_INTERFACE_ID_ERC721);
_registerInterface(_INTERFACE_ID_ERC721_METADATA);
_registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _holderTokens[owner].length();
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory _tokenURI = _tokenURIs[tokenId];
string memory base = baseURI();
// If there is no base URI, return the token URI.
if (bytes(base).length == 0) {
return _tokenURI;
}
// If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
if (bytes(_tokenURI).length > 0) {
return string(abi.encodePacked(base, _tokenURI));
}
// If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
return string(abi.encodePacked(base, tokenId.toString()));
}
/**
* @dev Returns the base URI set via {_setBaseURI}. This will be
* automatically added as a prefix in {tokenURI} to each token's URI, or
* to the token ID if no specific URI is set for that token ID.
*/
function baseURI() public view virtual returns (string memory) {
return _baseURI;
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
return _holderTokens[owner].at(index);
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
// _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
return _tokenOwners.length();
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
(uint256 tokenId, ) = _tokenOwners.at(index);
return tokenId;
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(operator != _msgSender(), "ERC721: approve to caller");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(address from, address to, uint256 tokenId) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @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.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _tokenOwners.contains(tokenId);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
d*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
_mint(to, tokenId);
require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_holderTokens[to].add(tokenId);
_tokenOwners.set(tokenId, to);
emit Transfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId); // internal owner
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
// Clear metadata (if any)
if (bytes(_tokenURIs[tokenId]).length != 0) {
delete _tokenURIs[tokenId];
}
_holderTokens[owner].remove(tokenId);
_tokenOwners.remove(tokenId);
emit Transfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(address from, address to, uint256 tokenId) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_holderTokens[from].remove(tokenId);
_holderTokens[to].add(tokenId);
_tokenOwners.set(tokenId, to);
emit Transfer(from, to, tokenId);
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
/**
* @dev Internal function to set the base URI for all token IDs. It is
* automatically added as a prefix to the value returned in {tokenURI},
* or to the token ID if {tokenURI} is empty.
*/
function _setBaseURI(string memory baseURI_) internal virtual {
_baseURI = baseURI_;
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
private returns (bool)
{
if (!to.isContract()) {
return true;
}
bytes memory returndata = to.functionCall(abi.encodeWithSelector(
IERC721Receiver(to).onERC721Received.selector,
_msgSender(),
from,
tokenId,
_data
), "ERC721: transfer to non ERC721Receiver implementer");
bytes4 retval = abi.decode(returndata, (bytes4));
return (retval == _ERC721_RECEIVED);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}
// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity >=0.6.0 <0.8.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.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
pragma solidity ^0.7.0;
pragma abicoder v2;
contract BoredElonUnicornClub is ERC721, Ownable {
using SafeMath for uint256;
string public ELON_PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN ELON ARE ALL SOLD OUT
string public LICENSE_TEXT = "";
bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE
uint256 public constant elonPrice = 60000000000000000; // 0.06 ETH
uint public constant maxElonPurchase = 20;
uint256 public constant MAX_ELONS = 9999;
bool public saleIsActive = false;
mapping(uint => string) public elonNames;
mapping(uint256 => address) internal _shareholders;
mapping(uint256 => uint256) internal _shares;
uint public elonReserve = 100;
event elonNameChange(address _by, uint _tokenId, string _name);
event licenseisLocked(string _licenseText);
event PaymentReleased(address shareholder, uint256 amount);
constructor() ERC721("Bored Elon Unicorn Club.", "BEUC") {
_shareholders[0] = 0xa2b6d49516605639b96680B92e8f95385d957820; //Dino Metamask
_shareholders[1] = 0xAE20110f8Abf01383F6D303E8B7CeAaCeF321Bc7; //Rostyslav Trezor
_shareholders[2] = 0x8dE889d8Bea586dA42Aa2aB8a755808cac3e19CF; // Christian
_shareholders[3] = 0x150cEDe24e19bB4CFBD20BCaDF350ca127a081B5; //community Trezor
_shareholders[4] = 0xabF5d1a6781e7c2A68a6990BB3C05953d577Fa3A; //Elon expanses Metamask
_shares[0] = 2500;
_shares[1] = 2500;
_shares[2] = 2500;
_shares[3] = 1500;
_shares[4] = 1000;
}
function withdraw(uint256 amount) public onlyOwner {
require(address(this).balance >= amount, "Insufficient balance");
uint256 totalShares = 10000;
for (uint256 i = 0; i < 5; i++) {
uint256 payment = amount * _shares[i] / totalShares;
Address.sendValue(payable(_shareholders[i]), payment);
emit PaymentReleased(_shareholders[i],payment);
}
}
function reserveElons(address _to, uint256 _reserveAmount) public onlyOwner {
uint supply = totalSupply();
require(_reserveAmount > 0 && _reserveAmount <= elonReserve, "Not enough reserve left for team");
for (uint i = 0; i < _reserveAmount; i++) {
_safeMint(_to, supply + i);
}
elonReserve = elonReserve.sub(_reserveAmount);
}
function setProvenanceHash(string memory provenanceHash) public onlyOwner {
ELON_PROVENANCE = provenanceHash;
}
function setBaseURI(string memory baseURI) public onlyOwner {
_setBaseURI(baseURI);
}
function flipSaleState() public onlyOwner {
saleIsActive = !saleIsActive;
}
function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
uint256 tokenCount = balanceOf(_owner);
if (tokenCount == 0) {
// Return an empty array
return new uint256[](0);
} else {
uint256[] memory result = new uint256[](tokenCount);
uint256 index;
for (index = 0; index < tokenCount; index++) {
result[index] = tokenOfOwnerByIndex(_owner, index);
}
return result;
}
}
// Returns the license for tokens
function tokenLicense(uint _id) public view returns(string memory) {
require(_id < totalSupply(), "CHOOSE A ELON WITHIN RANGE");
return LICENSE_TEXT;
}
// Locks the license to prevent further changes
function lockLicense() public onlyOwner {
licenseLocked = true;
emit licenseisLocked(LICENSE_TEXT);
}
// Change the license
function changeLicense(string memory _license) public onlyOwner {
require(licenseLocked == false, "License already locked");
LICENSE_TEXT = _license;
}
function mintBoredElons(uint numberOfTokens) public payable {
require(saleIsActive, "Sale must be active to mint Elon");
require(numberOfTokens > 0 && numberOfTokens <= maxElonPurchase, "Can only mint 20 tokens at a time");
require(totalSupply().add(numberOfTokens) <= MAX_ELONS, "Purchase would exceed max supply of Elons");
require(msg.value >= elonPrice.mul(numberOfTokens), "Ether value sent is not correct");
for(uint i = 0; i < numberOfTokens; i++) {
uint mintIndex = totalSupply();
if (totalSupply() < MAX_ELONS) {
_safeMint(msg.sender, mintIndex);
}
}
}
function changeElonName(uint _tokenId, string memory _name) public {
require(ownerOf(_tokenId) == msg.sender, "Hey, your wallet doesn't own this elon!");
require(sha256(bytes(_name)) != sha256(bytes(elonNames[_tokenId])), "New name is same as the current one");
elonNames[_tokenId] = _name;
emit elonNameChange(msg.sender, _tokenId, _name);
}
function viewElonName(uint _tokenId) public view returns( string memory ){
require( _tokenId < totalSupply(), "Choose a elon within range" );
return elonNames[_tokenId];
}
// GET ALL ELONS OF A WALLET AS AN ARRAY OF STRINGS. WOULD BE BETTER MAYBE IF IT RETURNED A STRUCT WITH ID-NAME MATCH
function elonNamesOfOwner(address _owner) external view returns(string[] memory ) {
uint256 tokenCount = balanceOf(_owner);
if (tokenCount == 0) {
// Return an empty array
return new string[](0);
} else {
string[] memory result = new string[](tokenCount);
uint256 index;
for (index = 0; index < tokenCount; index++) {
result[index] = elonNames[ tokenOfOwnerByIndex(_owner, index) ] ;
}
return result;
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"shareholder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"elonNameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"inputs":[],"name":"ELON_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ELONS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeElonName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"elonNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"elonNamesOfOwner","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"elonPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"elonReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxElonPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintBoredElons","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveElons","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewElonName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260405180602001604052806000815250600b90805190602001906200002b929190620005bc565b5060405180602001604052806000815250600c908051906020019062000053929190620005bc565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff02191690831515021790555060646011553480156200009c57600080fd5b506040518060400160405280601881526020017f426f72656420456c6f6e20556e69636f726e20436c75622e00000000000000008152506040518060400160405280600481526020017f4245554300000000000000000000000000000000000000000000000000000000815250620001216301ffc9a760e01b620004dc60201b60201c565b816006908051906020019062000139929190620005bc565b50806007908051906020019062000152929190620005bc565b506200016b6380ac58cd60e01b620004dc60201b60201c565b62000183635b5e139f60e01b620004dc60201b60201c565b6200019b63780e9d6360e01b620004dc60201b60201c565b50506000620001af620005b460201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35073a2b6d49516605639b96680b92e8f95385d957820600f600080815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ae20110f8abf01383f6d303e8b7ceaacef321bc7600f60006001815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550738de889d8bea586da42aa2ab8a755808cac3e19cf600f60006002815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073150cede24e19bb4cfbd20bcadf350ca127a081b5600f60006003815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073abf5d1a6781e7c2a68a6990bb3c05953d577fa3a600f60006004815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506109c460106000808152602001908152602001600020819055506109c46010600060018152602001908152602001600020819055506109c46010600060028152602001908152602001600020819055506105dc6010600060038152602001908152602001600020819055506103e8601060006004815260200190815260200160002081905550620006e7565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000548576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200053f90620006b4565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620005f4576000855562000640565b82601f106200060f57805160ff191683800117855562000640565b8280016001018555821562000640579182015b828111156200063f57825182559160200191906001019062000622565b5b5090506200064f919062000653565b5090565b5b808211156200066e57600081600090555060010162000654565b5090565b600062000681601c83620006d6565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b60006020820190508181036000830152620006cf8162000672565b9050919050565b600082825260208201905092915050565b61572780620006f76000396000f3fe6080604052600436106102465760003560e01c80638462151c11610139578063c87b56dd116100b6578063e31f94971161007a578063e31f94971461087f578063e789b73c146108aa578063e985e9c5146108e7578063eb8d244414610924578063f2fde38b1461094f578063faa6d1191461097857610246565b8063c87b56dd14610795578063cd2d5247146107d2578063d1d94e48146107fd578063d7874beb14610826578063d9b137b21461084257610246565b8063a22cb465116100fd578063a22cb465146106da578063b09904b514610703578063b88d4fde1461072c578063bf4702fc14610755578063c02e81db1461076c57610246565b80638462151c146105f15780638b22b2b21461062e5780638da5cb5b1461065957806395d89b41146106845780639c3e72bd146106af57610246565b80632f745c59116101c757806355f804b31161018b57806355f804b31461050c5780636352211e146105355780636c0360eb1461057257806370a082311461059d578063715018a6146105da57610246565b80632f745c591461041557806334918dfd1461045257806342842e0e146104695780634cb2ef4a146104925780634f6ccce7146104cf57610246565b8063109695231161020e578063109695231461034457806318160ddd1461036d578063208fb0ab1461039857806323b872dd146103c35780632e1a7d4d146103ec57610246565b806301ffc9a71461024b578063036984ba1461028857806306fdde03146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613cc4565b6109b5565b60405161027f9190614ea2565b60405180910390f35b34801561029457600080fd5b5061029d610a1c565b6040516102aa9190614ebd565b60405180910390f35b3480156102bf57600080fd5b506102c8610aba565b6040516102d59190614ebd565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190613d57565b610b5c565b6040516103129190614d90565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613c5f565b610be1565b005b34801561035057600080fd5b5061036b60048036038101906103669190613d16565b610cf9565b005b34801561037957600080fd5b50610382610d8f565b60405161038f9190615361565b60405180910390f35b3480156103a457600080fd5b506103ad610da0565b6040516103ba9190615361565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190613b59565b610da6565b005b3480156103f857600080fd5b50610413600480360381019061040e9190613d57565b610e06565b005b34801561042157600080fd5b5061043c60048036038101906104379190613c5f565b610fb7565b6040516104499190615361565b60405180910390f35b34801561045e57600080fd5b50610467611012565b005b34801561047557600080fd5b50610490600480360381019061048b9190613b59565b6110ba565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613d57565b6110da565b6040516104c69190614ebd565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613d57565b61118a565b6040516105039190615361565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190613d16565b6111ad565b005b34801561054157600080fd5b5061055c60048036038101906105579190613d57565b611235565b6040516105699190614d90565b60405180910390f35b34801561057e57600080fd5b5061058761126c565b6040516105949190614ebd565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf9190613af4565b61130e565b6040516105d19190615361565b60405180910390f35b3480156105e657600080fd5b506105ef6113cd565b005b3480156105fd57600080fd5b5061061860048036038101906106139190613af4565b61150a565b6040516106259190614e80565b60405180910390f35b34801561063a57600080fd5b50610643611603565b6040516106509190615361565b60405180910390f35b34801561066557600080fd5b5061066e611608565b60405161067b9190614d90565b60405180910390f35b34801561069057600080fd5b50610699611632565b6040516106a69190614ebd565b60405180910390f35b3480156106bb57600080fd5b506106c46116d4565b6040516106d19190614ebd565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc9190613c23565b611772565b005b34801561070f57600080fd5b5061072a60048036038101906107259190613d16565b6118f3565b005b34801561073857600080fd5b50610753600480360381019061074e9190613ba8565b6119df565b005b34801561076157600080fd5b5061076a611a41565b005b34801561077857600080fd5b50610793600480360381019061078e9190613c5f565b611b12565b005b3480156107a157600080fd5b506107bc60048036038101906107b79190613d57565b611c30565b6040516107c99190614ebd565b60405180910390f35b3480156107de57600080fd5b506107e7611db3565b6040516107f49190615361565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f9190613d80565b611dbe565b005b610840600480360381019061083b9190613d57565b611f8e565b005b34801561084e57600080fd5b5061086960048036038101906108649190613d57565b61212c565b6040516108769190614ebd565b60405180910390f35b34801561088b57600080fd5b50610894612219565b6040516108a19190615361565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc9190613d57565b61221f565b6040516108de9190614ebd565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613b1d565b61231d565b60405161091b9190614ea2565b60405180910390f35b34801561093057600080fd5b506109396123b1565b6040516109469190614ea2565b60405180910390f35b34801561095b57600080fd5b5061097660048036038101906109719190613af4565b6123c4565b005b34801561098457600080fd5b5061099f600480360381019061099a9190613af4565b612570565b6040516109ac9190614e5e565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab25780601f10610a8757610100808354040283529160200191610ab2565b820191906000526020600020905b815481529060010190602001808311610a9557829003601f168201915b505050505081565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b525780601f10610b2757610100808354040283529160200191610b52565b820191906000526020600020905b815481529060010190602001808311610b3557829003601f168201915b5050505050905090565b6000610b678261271d565b610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d906151c1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bec82611235565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5490615261565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c7c61273a565b73ffffffffffffffffffffffffffffffffffffffff161480610cab5750610caa81610ca561273a565b61231d565b5b610cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce190615121565b60405180910390fd5b610cf48383612742565b505050565b610d0161273a565b73ffffffffffffffffffffffffffffffffffffffff16610d1f611608565b73ffffffffffffffffffffffffffffffffffffffff1614610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906151e1565b60405180910390fd5b80600b9080519060200190610d8b9291906138fb565b5050565b6000610d9b60026127fb565b905090565b61270f81565b610db7610db161273a565b82612810565b610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded906152c1565b60405180910390fd5b610e018383836128ee565b505050565b610e0e61273a565b73ffffffffffffffffffffffffffffffffffffffff16610e2c611608565b73ffffffffffffffffffffffffffffffffffffffff1614610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e79906151e1565b60405180910390fd5b80471015610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc90615001565b60405180910390fd5b6000612710905060005b6005811015610fb2576000826010600084815260200190815260200160002054850281610ef857fe5b049050610f38600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612b05565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051610f9c929190614e35565b60405180910390a1508080600101915050610ecf565b505050565b600061100a82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bf990919063ffffffff16565b905092915050565b61101a61273a565b73ffffffffffffffffffffffffffffffffffffffff16611038611608565b73ffffffffffffffffffffffffffffffffffffffff161461108e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611085906151e1565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6110d5838383604051806020016040528060008152506119df565b505050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111825780601f1061115757610100808354040283529160200191611182565b820191906000526020600020905b81548152906001019060200180831161116557829003601f168201915b505050505081565b6000806111a1836002612c1390919063ffffffff16565b50905080915050919050565b6111b561273a565b73ffffffffffffffffffffffffffffffffffffffff166111d3611608565b73ffffffffffffffffffffffffffffffffffffffff1614611229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611220906151e1565b60405180910390fd5b61123281612c3f565b50565b6000611265826040518060600160405280602981526020016156c9602991396002612c599092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113045780601f106112d957610100808354040283529160200191611304565b820191906000526020600020905b8154815290600101906020018083116112e757829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561137f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137690615141565b60405180910390fd5b6113c6600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c78565b9050919050565b6113d561273a565b73ffffffffffffffffffffffffffffffffffffffff166113f3611608565b73ffffffffffffffffffffffffffffffffffffffff1614611449576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611440906151e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606060006115178361130e565b9050600081141561157257600067ffffffffffffffff8111801561153a57600080fd5b506040519080825280602002602001820160405280156115695781602001602082028036833780820191505090505b509150506115fe565b60008167ffffffffffffffff8111801561158b57600080fd5b506040519080825280602002602001820160405280156115ba5781602001602082028036833780820191505090505b50905060005b828110156115f7576115d28582610fb7565b8282815181106115de57fe5b60200260200101818152505080806001019150506115c0565b8193505050505b919050565b601481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ca5780601f1061169f576101008083540402835291602001916116ca565b820191906000526020600020905b8154815290600101906020018083116116ad57829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561176a5780601f1061173f5761010080835404028352916020019161176a565b820191906000526020600020905b81548152906001019060200180831161174d57829003601f168201915b505050505081565b61177a61273a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90614fe1565b60405180910390fd5b80600560006117f561273a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118a261273a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118e79190614ea2565b60405180910390a35050565b6118fb61273a565b73ffffffffffffffffffffffffffffffffffffffff16611919611608565b73ffffffffffffffffffffffffffffffffffffffff161461196f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611966906151e1565b60405180910390fd5b60001515600d60009054906101000a900460ff161515146119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90615281565b60405180910390fd5b80600c90805190602001906119db9291906138fb565b5050565b6119f06119ea61273a565b83612810565b611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a26906152c1565b60405180910390fd5b611a3b84848484612c8d565b50505050565b611a4961273a565b73ffffffffffffffffffffffffffffffffffffffff16611a67611608565b73ffffffffffffffffffffffffffffffffffffffff1614611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab4906151e1565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611b089190614edf565b60405180910390a1565b611b1a61273a565b73ffffffffffffffffffffffffffffffffffffffff16611b38611608565b73ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b85906151e1565b60405180910390fd5b6000611b98610d8f565b9050600082118015611bac57506011548211155b611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290614fa1565b60405180910390fd5b60005b82811015611c0f57611c0284828401612ce9565b8080600101915050611bee565b50611c2582601154612d0790919063ffffffff16565b601181905550505050565b6060611c3b8261271d565b611c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7190615221565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d235780601f10611cf857610100808354040283529160200191611d23565b820191906000526020600020905b815481529060010190602001808311611d0657829003601f168201915b505050505090506000611d3461126c565b9050600081511415611d4a578192505050611dae565b600082511115611d7f578082604051602001611d67929190614d57565b60405160208183030381529060405292505050611dae565b80611d8985612d57565b604051602001611d9a929190614d57565b604051602081830303815290604052925050505b919050565b66d529ae9e86000081565b3373ffffffffffffffffffffffffffffffffffffffff16611dde83611235565b73ffffffffffffffffffffffffffffffffffffffff1614611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b90615301565b60405180910390fd5b6002600e6000848152602001908152602001600020604051611e569190614d40565b602060405180830381855afa158015611e73573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611e969190613c9b565b600282604051611ea69190614d29565b602060405180830381855afa158015611ec3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611ee69190613c9b565b1415611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e90615241565b60405180910390fd5b80600e60008481526020019081526020016000209080519060200190611f4e9291906138fb565b507f2aa95018cc5353ee2ed5c3bee07a023d59ec8403df0399246dca80804e8c2ab3338383604051611f8293929190614df7565b60405180910390a15050565b600d60019054906101000a900460ff16611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd4906152a1565b60405180910390fd5b600081118015611fee575060148111155b61202d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612024906150e1565b60405180910390fd5b61270f61204a8261203c610d8f565b612e9e90919063ffffffff16565b111561208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290615101565b60405180910390fd5b6120a58166d529ae9e860000612ef390919063ffffffff16565b3410156120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de90615021565b60405180910390fd5b60005b818110156121285760006120fc610d8f565b905061270f612109610d8f565b101561211a576121193382612ce9565b5b5080806001019150506120ea565b5050565b6060612136610d8f565b8210612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e90615321565b60405180910390fd5b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561220d5780601f106121e25761010080835404028352916020019161220d565b820191906000526020600020905b8154815290600101906020018083116121f057829003601f168201915b50505050509050919050565b60115481565b6060612229610d8f565b821061226a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226190615341565b60405180910390fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123115780601f106122e657610100808354040283529160200191612311565b820191906000526020600020905b8154815290600101906020018083116122f457829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b6123cc61273a565b73ffffffffffffffffffffffffffffffffffffffff166123ea611608565b73ffffffffffffffffffffffffffffffffffffffff1614612440576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612437906151e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a790614f41565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600061257d8361130e565b905060008114156125dd57600067ffffffffffffffff811180156125a057600080fd5b506040519080825280602002602001820160405280156125d457816020015b60608152602001906001900390816125bf5790505b50915050612718565b60008167ffffffffffffffff811180156125f657600080fd5b5060405190808252806020026020018201604052801561262a57816020015b60608152602001906001900390816126155790505b50905060005b8281101561271157600e60006126468784610fb7565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126e85780601f106126bd576101008083540402835291602001916126e8565b820191906000526020600020905b8154815290600101906020018083116126cb57829003601f168201915b50505050508282815181106126f957fe5b60200260200101819052508080600101915050612630565b8193505050505b919050565b6000612733826002612f6390919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127b583611235565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061280982600001612f7d565b9050919050565b600061281b8261271d565b61285a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612851906150c1565b60405180910390fd5b600061286583611235565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128d457508373ffffffffffffffffffffffffffffffffffffffff166128bc84610b5c565b73ffffffffffffffffffffffffffffffffffffffff16145b806128e557506128e4818561231d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661290e82611235565b73ffffffffffffffffffffffffffffffffffffffff1614612964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295b90615201565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cb90614fc1565b60405180910390fd5b6129df838383612f8e565b6129ea600082612742565b612a3b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612f9390919063ffffffff16565b50612a8d81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612fad90919063ffffffff16565b50612aa481836002612fc79092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015612b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3f90615081565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b6e90614d7b565b60006040518083038185875af1925050503d8060008114612bab576040519150601f19603f3d011682016040523d82523d6000602084013e612bb0565b606091505b5050905080612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb90615061565b60405180910390fd5b505050565b6000612c088360000183612ffc565b60001c905092915050565b600080600080612c268660000186613069565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612c559291906138fb565b5050565b6000612c6c846000018460001b846130ec565b60001c90509392505050565b6000612c868260000161317d565b9050919050565b612c988484846128ee565b612ca48484848461318e565b612ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cda90614f21565b60405180910390fd5b50505050565b612d038282604051806020016040528060008152506132f2565b5050565b600082821115612d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4390615041565b60405180910390fd5b818303905092915050565b60606000821415612d9f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e99565b600082905060005b60008214612dc9578080600101915050600a8281612dc157fe5b049150612da7565b60008167ffffffffffffffff81118015612de257600080fd5b506040519080825280601f01601f191660200182016040528015612e155781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612e9157600a8481612e3657fe5b0660300160f81b82828060019003935081518110612e5057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612e8957fe5b049350612e24565b819450505050505b919050565b600080828401905083811015612ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee090614f81565b60405180910390fd5b8091505092915050565b600080831415612f065760009050612f5d565b6000828402905082848281612f1757fe5b0414612f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4f906151a1565b60405180910390fd5b809150505b92915050565b6000612f75836000018360001b61334d565b905092915050565b600081600001805490509050919050565b505050565b6000612fa5836000018360001b613370565b905092915050565b6000612fbf836000018360001b613458565b905092915050565b6000612ff3846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6134c8565b90509392505050565b600081836000018054905011613047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303e90614f01565b60405180910390fd5b82600001828154811061305657fe5b9060005260206000200154905092915050565b600080828460000180549050116130b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ac90615161565b60405180910390fd5b60008460000184815481106130c657fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061314e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131459190614ebd565b60405180910390fd5b5084600001600182038154811061316157fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006131af8473ffffffffffffffffffffffffffffffffffffffff166135a4565b6131bc57600190506132ea565b600061328363150b7a0260e01b6131d161273a565b8887876040516024016131e79493929190614dab565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615697603291398773ffffffffffffffffffffffffffffffffffffffff166135b79092919063ffffffff16565b905060008180602001905181019061329b9190613ced565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6132fc83836135cf565b613309600084848461318e565b613348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333f90614f21565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461344c57600060018203905060006001866000018054905003905060008660000182815481106133bb57fe5b90600052602060002001549050808760000184815481106133d857fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061341057fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613452565b60009150505b92915050565b6000613464838361375d565b6134bd5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506134c2565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561356f5784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505061359d565b8285600001600183038154811061358257fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b60606135c68484600085613780565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561363f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363690615181565b60405180910390fd5b6136488161271d565b15613688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367f90614f61565b60405180910390fd5b61369460008383612f8e565b6136e581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612fad90919063ffffffff16565b506136fc81836002612fc79092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156137c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bc906150a1565b60405180910390fd5b6137ce856135a4565b61380d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613804906152e1565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138369190614d29565b60006040518083038185875af1925050503d8060008114613873576040519150601f19603f3d011682016040523d82523d6000602084013e613878565b606091505b5091509150613888828286613894565b92505050949350505050565b606083156138a4578290506138f4565b6000835111156138b75782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138eb9190614ebd565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826139315760008555613978565b82601f1061394a57805160ff1916838001178555613978565b82800160010185558215613978579182015b8281111561397757825182559160200191906001019061395c565b5b5090506139859190613989565b5090565b5b808211156139a257600081600090555060010161398a565b5090565b60006139b96139b4846153ad565b61537c565b9050828152602081018484840111156139d157600080fd5b6139dc8482856155ce565b509392505050565b60006139f76139f2846153dd565b61537c565b905082815260208101848484011115613a0f57600080fd5b613a1a8482856155ce565b509392505050565b600081359050613a3181615623565b92915050565b600081359050613a468161563a565b92915050565b600081519050613a5b81615651565b92915050565b600081359050613a7081615668565b92915050565b600081519050613a8581615668565b92915050565b600082601f830112613a9c57600080fd5b8135613aac8482602086016139a6565b91505092915050565b600082601f830112613ac657600080fd5b8135613ad68482602086016139e4565b91505092915050565b600081359050613aee8161567f565b92915050565b600060208284031215613b0657600080fd5b6000613b1484828501613a22565b91505092915050565b60008060408385031215613b3057600080fd5b6000613b3e85828601613a22565b9250506020613b4f85828601613a22565b9150509250929050565b600080600060608486031215613b6e57600080fd5b6000613b7c86828701613a22565b9350506020613b8d86828701613a22565b9250506040613b9e86828701613adf565b9150509250925092565b60008060008060808587031215613bbe57600080fd5b6000613bcc87828801613a22565b9450506020613bdd87828801613a22565b9350506040613bee87828801613adf565b925050606085013567ffffffffffffffff811115613c0b57600080fd5b613c1787828801613a8b565b91505092959194509250565b60008060408385031215613c3657600080fd5b6000613c4485828601613a22565b9250506020613c5585828601613a37565b9150509250929050565b60008060408385031215613c7257600080fd5b6000613c8085828601613a22565b9250506020613c9185828601613adf565b9150509250929050565b600060208284031215613cad57600080fd5b6000613cbb84828501613a4c565b91505092915050565b600060208284031215613cd657600080fd5b6000613ce484828501613a61565b91505092915050565b600060208284031215613cff57600080fd5b6000613d0d84828501613a76565b91505092915050565b600060208284031215613d2857600080fd5b600082013567ffffffffffffffff811115613d4257600080fd5b613d4e84828501613ab5565b91505092915050565b600060208284031215613d6957600080fd5b6000613d7784828501613adf565b91505092915050565b60008060408385031215613d9357600080fd5b6000613da185828601613adf565b925050602083013567ffffffffffffffff811115613dbe57600080fd5b613dca85828601613ab5565b9150509250929050565b6000613de08383614007565b905092915050565b6000613df48383614d0b565b60208301905092915050565b613e0981615598565b82525050565b613e188161551a565b82525050565b613e2781615508565b82525050565b6000613e3882615457565b613e42818561549d565b935083602082028501613e548561540d565b8060005b85811015613e905784840389528151613e718582613dd4565b9450613e7c83615483565b925060208a01995050600181019050613e58565b50829750879550505050505092915050565b6000613ead82615462565b613eb781856154ae565b9350613ec28361541d565b8060005b83811015613ef3578151613eda8882613de8565b9750613ee583615490565b925050600181019050613ec6565b5085935050505092915050565b613f098161552c565b82525050565b6000613f1a8261546d565b613f2481856154bf565b9350613f348185602086016155dd565b613f3d81615612565b840191505092915050565b6000613f538261546d565b613f5d81856154d0565b9350613f6d8185602086016155dd565b80840191505092915050565b600081546001811660008114613f965760018114613fbb57613fff565b607f6002830416613fa781876154d0565b955060ff1983168652808601935050613fff565b60028204613fc981876154d0565b9550613fd48561542d565b60005b82811015613ff657815481890152600182019150602081019050613fd7565b82880195505050505b505092915050565b600061401282615478565b61401c81856154db565b935061402c8185602086016155dd565b61403581615612565b840191505092915050565b600061404b82615478565b61405581856154ec565b93506140658185602086016155dd565b61406e81615612565b840191505092915050565b600061408482615478565b61408e81856154fd565b935061409e8185602086016155dd565b80840191505092915050565b6000815460018116600081146140c757600181146140ed57614131565b607f60028304166140d881876154ec565b955060ff198316865260208601935050614131565b600282046140fb81876154ec565b955061410685615442565b60005b8281101561412857815481890152600182019150602081019050614109565b80880195505050505b505092915050565b60006141466022836154ec565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141ac6032836154ec565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006142126026836154ec565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614278601c836154ec565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006142b8601b836154ec565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006142f86020836154ec565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b60006143386024836154ec565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061439e6019836154ec565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006143de6014836154ec565b91507f496e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b600061441e601f836154ec565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b600061445e601e836154ec565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061449e603a836154ec565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b6000614504601d836154ec565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006145446026836154ec565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145aa602c836154ec565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146106021836154ec565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146766029836154ec565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620456c6f6e7300000000000000000000000000000000000000000000006020830152604082019050919050565b60006146dc6038836154ec565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614742602a836154ec565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006147a86022836154ec565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061480e6020836154ec565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061484e6021836154ec565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148b4602c836154ec565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061491a6020836154ec565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061495a6029836154ec565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006149c0602f836154ec565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614a266023836154ec565b91507f4e6577206e616d652069732073616d65206173207468652063757272656e742060008301527f6f6e6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a8c6021836154ec565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614af26016836154ec565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b6000614b326020836154ec565b91507f53616c65206d7573742062652061637469766520746f206d696e7420456c6f6e6000830152602082019050919050565b6000614b726000836154d0565b9150600082019050919050565b6000614b8c6031836154ec565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614bf2601d836154ec565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614c326027836154ec565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f7320656c6f6e21000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c98601a836154ec565b91507f43484f4f5345204120454c4f4e2057495448494e2052414e47450000000000006000830152602082019050919050565b6000614cd8601a836154ec565b91507f43686f6f7365206120656c6f6e2077697468696e2072616e67650000000000006000830152602082019050919050565b614d148161558e565b82525050565b614d238161558e565b82525050565b6000614d358284613f48565b915081905092915050565b6000614d4c8284613f79565b915081905092915050565b6000614d638285614079565b9150614d6f8284614079565b91508190509392505050565b6000614d8682614b65565b9150819050919050565b6000602082019050614da56000830184613e1e565b92915050565b6000608082019050614dc06000830187613e0f565b614dcd6020830186613e1e565b614dda6040830185614d1a565b8181036060830152614dec8184613f0f565b905095945050505050565b6000606082019050614e0c6000830186613e00565b614e196020830185614d1a565b8181036040830152614e2b8184614040565b9050949350505050565b6000604082019050614e4a6000830185613e1e565b614e576020830184614d1a565b9392505050565b60006020820190508181036000830152614e788184613e2d565b905092915050565b60006020820190508181036000830152614e9a8184613ea2565b905092915050565b6000602082019050614eb76000830184613f00565b92915050565b60006020820190508181036000830152614ed78184614040565b905092915050565b60006020820190508181036000830152614ef981846140aa565b905092915050565b60006020820190508181036000830152614f1a81614139565b9050919050565b60006020820190508181036000830152614f3a8161419f565b9050919050565b60006020820190508181036000830152614f5a81614205565b9050919050565b60006020820190508181036000830152614f7a8161426b565b9050919050565b60006020820190508181036000830152614f9a816142ab565b9050919050565b60006020820190508181036000830152614fba816142eb565b9050919050565b60006020820190508181036000830152614fda8161432b565b9050919050565b60006020820190508181036000830152614ffa81614391565b9050919050565b6000602082019050818103600083015261501a816143d1565b9050919050565b6000602082019050818103600083015261503a81614411565b9050919050565b6000602082019050818103600083015261505a81614451565b9050919050565b6000602082019050818103600083015261507a81614491565b9050919050565b6000602082019050818103600083015261509a816144f7565b9050919050565b600060208201905081810360008301526150ba81614537565b9050919050565b600060208201905081810360008301526150da8161459d565b9050919050565b600060208201905081810360008301526150fa81614603565b9050919050565b6000602082019050818103600083015261511a81614669565b9050919050565b6000602082019050818103600083015261513a816146cf565b9050919050565b6000602082019050818103600083015261515a81614735565b9050919050565b6000602082019050818103600083015261517a8161479b565b9050919050565b6000602082019050818103600083015261519a81614801565b9050919050565b600060208201905081810360008301526151ba81614841565b9050919050565b600060208201905081810360008301526151da816148a7565b9050919050565b600060208201905081810360008301526151fa8161490d565b9050919050565b6000602082019050818103600083015261521a8161494d565b9050919050565b6000602082019050818103600083015261523a816149b3565b9050919050565b6000602082019050818103600083015261525a81614a19565b9050919050565b6000602082019050818103600083015261527a81614a7f565b9050919050565b6000602082019050818103600083015261529a81614ae5565b9050919050565b600060208201905081810360008301526152ba81614b25565b9050919050565b600060208201905081810360008301526152da81614b7f565b9050919050565b600060208201905081810360008301526152fa81614be5565b9050919050565b6000602082019050818103600083015261531a81614c25565b9050919050565b6000602082019050818103600083015261533a81614c8b565b9050919050565b6000602082019050818103600083015261535a81614ccb565b9050919050565b60006020820190506153766000830184614d1a565b92915050565b6000604051905081810181811067ffffffffffffffff821117156153a3576153a2615610565b5b8060405250919050565b600067ffffffffffffffff8211156153c8576153c7615610565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156153f8576153f7615610565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006155138261556e565b9050919050565b60006155258261556e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006155a3826155aa565b9050919050565b60006155b5826155bc565b9050919050565b60006155c78261556e565b9050919050565b82818337600083830152505050565b60005b838110156155fb5780820151818401526020810190506155e0565b8381111561560a576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b61562c81615508565b811461563757600080fd5b50565b6156438161552c565b811461564e57600080fd5b50565b61565a81615538565b811461566557600080fd5b50565b61567181615542565b811461567c57600080fd5b50565b6156888161558e565b811461569357600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212208dd674adf443fb9d7458d8812ddc3a858adba2f51fe3758dc0777f1c42dee67264736f6c63430007060033
Deployed Bytecode
0x6080604052600436106102465760003560e01c80638462151c11610139578063c87b56dd116100b6578063e31f94971161007a578063e31f94971461087f578063e789b73c146108aa578063e985e9c5146108e7578063eb8d244414610924578063f2fde38b1461094f578063faa6d1191461097857610246565b8063c87b56dd14610795578063cd2d5247146107d2578063d1d94e48146107fd578063d7874beb14610826578063d9b137b21461084257610246565b8063a22cb465116100fd578063a22cb465146106da578063b09904b514610703578063b88d4fde1461072c578063bf4702fc14610755578063c02e81db1461076c57610246565b80638462151c146105f15780638b22b2b21461062e5780638da5cb5b1461065957806395d89b41146106845780639c3e72bd146106af57610246565b80632f745c59116101c757806355f804b31161018b57806355f804b31461050c5780636352211e146105355780636c0360eb1461057257806370a082311461059d578063715018a6146105da57610246565b80632f745c591461041557806334918dfd1461045257806342842e0e146104695780634cb2ef4a146104925780634f6ccce7146104cf57610246565b8063109695231161020e578063109695231461034457806318160ddd1461036d578063208fb0ab1461039857806323b872dd146103c35780632e1a7d4d146103ec57610246565b806301ffc9a71461024b578063036984ba1461028857806306fdde03146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613cc4565b6109b5565b60405161027f9190614ea2565b60405180910390f35b34801561029457600080fd5b5061029d610a1c565b6040516102aa9190614ebd565b60405180910390f35b3480156102bf57600080fd5b506102c8610aba565b6040516102d59190614ebd565b60405180910390f35b3480156102ea57600080fd5b5061030560048036038101906103009190613d57565b610b5c565b6040516103129190614d90565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613c5f565b610be1565b005b34801561035057600080fd5b5061036b60048036038101906103669190613d16565b610cf9565b005b34801561037957600080fd5b50610382610d8f565b60405161038f9190615361565b60405180910390f35b3480156103a457600080fd5b506103ad610da0565b6040516103ba9190615361565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190613b59565b610da6565b005b3480156103f857600080fd5b50610413600480360381019061040e9190613d57565b610e06565b005b34801561042157600080fd5b5061043c60048036038101906104379190613c5f565b610fb7565b6040516104499190615361565b60405180910390f35b34801561045e57600080fd5b50610467611012565b005b34801561047557600080fd5b50610490600480360381019061048b9190613b59565b6110ba565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613d57565b6110da565b6040516104c69190614ebd565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613d57565b61118a565b6040516105039190615361565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190613d16565b6111ad565b005b34801561054157600080fd5b5061055c60048036038101906105579190613d57565b611235565b6040516105699190614d90565b60405180910390f35b34801561057e57600080fd5b5061058761126c565b6040516105949190614ebd565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf9190613af4565b61130e565b6040516105d19190615361565b60405180910390f35b3480156105e657600080fd5b506105ef6113cd565b005b3480156105fd57600080fd5b5061061860048036038101906106139190613af4565b61150a565b6040516106259190614e80565b60405180910390f35b34801561063a57600080fd5b50610643611603565b6040516106509190615361565b60405180910390f35b34801561066557600080fd5b5061066e611608565b60405161067b9190614d90565b60405180910390f35b34801561069057600080fd5b50610699611632565b6040516106a69190614ebd565b60405180910390f35b3480156106bb57600080fd5b506106c46116d4565b6040516106d19190614ebd565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc9190613c23565b611772565b005b34801561070f57600080fd5b5061072a60048036038101906107259190613d16565b6118f3565b005b34801561073857600080fd5b50610753600480360381019061074e9190613ba8565b6119df565b005b34801561076157600080fd5b5061076a611a41565b005b34801561077857600080fd5b50610793600480360381019061078e9190613c5f565b611b12565b005b3480156107a157600080fd5b506107bc60048036038101906107b79190613d57565b611c30565b6040516107c99190614ebd565b60405180910390f35b3480156107de57600080fd5b506107e7611db3565b6040516107f49190615361565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f9190613d80565b611dbe565b005b610840600480360381019061083b9190613d57565b611f8e565b005b34801561084e57600080fd5b5061086960048036038101906108649190613d57565b61212c565b6040516108769190614ebd565b60405180910390f35b34801561088b57600080fd5b50610894612219565b6040516108a19190615361565b60405180910390f35b3480156108b657600080fd5b506108d160048036038101906108cc9190613d57565b61221f565b6040516108de9190614ebd565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613b1d565b61231d565b60405161091b9190614ea2565b60405180910390f35b34801561093057600080fd5b506109396123b1565b6040516109469190614ea2565b60405180910390f35b34801561095b57600080fd5b5061097660048036038101906109719190613af4565b6123c4565b005b34801561098457600080fd5b5061099f600480360381019061099a9190613af4565b612570565b6040516109ac9190614e5e565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab25780601f10610a8757610100808354040283529160200191610ab2565b820191906000526020600020905b815481529060010190602001808311610a9557829003601f168201915b505050505081565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b525780601f10610b2757610100808354040283529160200191610b52565b820191906000526020600020905b815481529060010190602001808311610b3557829003601f168201915b5050505050905090565b6000610b678261271d565b610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d906151c1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bec82611235565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5490615261565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c7c61273a565b73ffffffffffffffffffffffffffffffffffffffff161480610cab5750610caa81610ca561273a565b61231d565b5b610cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce190615121565b60405180910390fd5b610cf48383612742565b505050565b610d0161273a565b73ffffffffffffffffffffffffffffffffffffffff16610d1f611608565b73ffffffffffffffffffffffffffffffffffffffff1614610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906151e1565b60405180910390fd5b80600b9080519060200190610d8b9291906138fb565b5050565b6000610d9b60026127fb565b905090565b61270f81565b610db7610db161273a565b82612810565b610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded906152c1565b60405180910390fd5b610e018383836128ee565b505050565b610e0e61273a565b73ffffffffffffffffffffffffffffffffffffffff16610e2c611608565b73ffffffffffffffffffffffffffffffffffffffff1614610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e79906151e1565b60405180910390fd5b80471015610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc90615001565b60405180910390fd5b6000612710905060005b6005811015610fb2576000826010600084815260200190815260200160002054850281610ef857fe5b049050610f38600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612b05565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056600f600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051610f9c929190614e35565b60405180910390a1508080600101915050610ecf565b505050565b600061100a82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bf990919063ffffffff16565b905092915050565b61101a61273a565b73ffffffffffffffffffffffffffffffffffffffff16611038611608565b73ffffffffffffffffffffffffffffffffffffffff161461108e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611085906151e1565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6110d5838383604051806020016040528060008152506119df565b505050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111825780601f1061115757610100808354040283529160200191611182565b820191906000526020600020905b81548152906001019060200180831161116557829003601f168201915b505050505081565b6000806111a1836002612c1390919063ffffffff16565b50905080915050919050565b6111b561273a565b73ffffffffffffffffffffffffffffffffffffffff166111d3611608565b73ffffffffffffffffffffffffffffffffffffffff1614611229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611220906151e1565b60405180910390fd5b61123281612c3f565b50565b6000611265826040518060600160405280602981526020016156c9602991396002612c599092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113045780601f106112d957610100808354040283529160200191611304565b820191906000526020600020905b8154815290600101906020018083116112e757829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561137f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137690615141565b60405180910390fd5b6113c6600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c78565b9050919050565b6113d561273a565b73ffffffffffffffffffffffffffffffffffffffff166113f3611608565b73ffffffffffffffffffffffffffffffffffffffff1614611449576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611440906151e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606060006115178361130e565b9050600081141561157257600067ffffffffffffffff8111801561153a57600080fd5b506040519080825280602002602001820160405280156115695781602001602082028036833780820191505090505b509150506115fe565b60008167ffffffffffffffff8111801561158b57600080fd5b506040519080825280602002602001820160405280156115ba5781602001602082028036833780820191505090505b50905060005b828110156115f7576115d28582610fb7565b8282815181106115de57fe5b60200260200101818152505080806001019150506115c0565b8193505050505b919050565b601481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ca5780601f1061169f576101008083540402835291602001916116ca565b820191906000526020600020905b8154815290600101906020018083116116ad57829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561176a5780601f1061173f5761010080835404028352916020019161176a565b820191906000526020600020905b81548152906001019060200180831161174d57829003601f168201915b505050505081565b61177a61273a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90614fe1565b60405180910390fd5b80600560006117f561273a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118a261273a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118e79190614ea2565b60405180910390a35050565b6118fb61273a565b73ffffffffffffffffffffffffffffffffffffffff16611919611608565b73ffffffffffffffffffffffffffffffffffffffff161461196f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611966906151e1565b60405180910390fd5b60001515600d60009054906101000a900460ff161515146119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90615281565b60405180910390fd5b80600c90805190602001906119db9291906138fb565b5050565b6119f06119ea61273a565b83612810565b611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a26906152c1565b60405180910390fd5b611a3b84848484612c8d565b50505050565b611a4961273a565b73ffffffffffffffffffffffffffffffffffffffff16611a67611608565b73ffffffffffffffffffffffffffffffffffffffff1614611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab4906151e1565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611b089190614edf565b60405180910390a1565b611b1a61273a565b73ffffffffffffffffffffffffffffffffffffffff16611b38611608565b73ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b85906151e1565b60405180910390fd5b6000611b98610d8f565b9050600082118015611bac57506011548211155b611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290614fa1565b60405180910390fd5b60005b82811015611c0f57611c0284828401612ce9565b8080600101915050611bee565b50611c2582601154612d0790919063ffffffff16565b601181905550505050565b6060611c3b8261271d565b611c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7190615221565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d235780601f10611cf857610100808354040283529160200191611d23565b820191906000526020600020905b815481529060010190602001808311611d0657829003601f168201915b505050505090506000611d3461126c565b9050600081511415611d4a578192505050611dae565b600082511115611d7f578082604051602001611d67929190614d57565b60405160208183030381529060405292505050611dae565b80611d8985612d57565b604051602001611d9a929190614d57565b604051602081830303815290604052925050505b919050565b66d529ae9e86000081565b3373ffffffffffffffffffffffffffffffffffffffff16611dde83611235565b73ffffffffffffffffffffffffffffffffffffffff1614611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b90615301565b60405180910390fd5b6002600e6000848152602001908152602001600020604051611e569190614d40565b602060405180830381855afa158015611e73573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611e969190613c9b565b600282604051611ea69190614d29565b602060405180830381855afa158015611ec3573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611ee69190613c9b565b1415611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e90615241565b60405180910390fd5b80600e60008481526020019081526020016000209080519060200190611f4e9291906138fb565b507f2aa95018cc5353ee2ed5c3bee07a023d59ec8403df0399246dca80804e8c2ab3338383604051611f8293929190614df7565b60405180910390a15050565b600d60019054906101000a900460ff16611fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd4906152a1565b60405180910390fd5b600081118015611fee575060148111155b61202d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612024906150e1565b60405180910390fd5b61270f61204a8261203c610d8f565b612e9e90919063ffffffff16565b111561208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290615101565b60405180910390fd5b6120a58166d529ae9e860000612ef390919063ffffffff16565b3410156120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de90615021565b60405180910390fd5b60005b818110156121285760006120fc610d8f565b905061270f612109610d8f565b101561211a576121193382612ce9565b5b5080806001019150506120ea565b5050565b6060612136610d8f565b8210612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e90615321565b60405180910390fd5b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561220d5780601f106121e25761010080835404028352916020019161220d565b820191906000526020600020905b8154815290600101906020018083116121f057829003601f168201915b50505050509050919050565b60115481565b6060612229610d8f565b821061226a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226190615341565b60405180910390fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123115780601f106122e657610100808354040283529160200191612311565b820191906000526020600020905b8154815290600101906020018083116122f457829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b6123cc61273a565b73ffffffffffffffffffffffffffffffffffffffff166123ea611608565b73ffffffffffffffffffffffffffffffffffffffff1614612440576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612437906151e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a790614f41565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600061257d8361130e565b905060008114156125dd57600067ffffffffffffffff811180156125a057600080fd5b506040519080825280602002602001820160405280156125d457816020015b60608152602001906001900390816125bf5790505b50915050612718565b60008167ffffffffffffffff811180156125f657600080fd5b5060405190808252806020026020018201604052801561262a57816020015b60608152602001906001900390816126155790505b50905060005b8281101561271157600e60006126468784610fb7565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126e85780601f106126bd576101008083540402835291602001916126e8565b820191906000526020600020905b8154815290600101906020018083116126cb57829003601f168201915b50505050508282815181106126f957fe5b60200260200101819052508080600101915050612630565b8193505050505b919050565b6000612733826002612f6390919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127b583611235565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061280982600001612f7d565b9050919050565b600061281b8261271d565b61285a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612851906150c1565b60405180910390fd5b600061286583611235565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128d457508373ffffffffffffffffffffffffffffffffffffffff166128bc84610b5c565b73ffffffffffffffffffffffffffffffffffffffff16145b806128e557506128e4818561231d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661290e82611235565b73ffffffffffffffffffffffffffffffffffffffff1614612964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295b90615201565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cb90614fc1565b60405180910390fd5b6129df838383612f8e565b6129ea600082612742565b612a3b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612f9390919063ffffffff16565b50612a8d81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612fad90919063ffffffff16565b50612aa481836002612fc79092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015612b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3f90615081565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b6e90614d7b565b60006040518083038185875af1925050503d8060008114612bab576040519150601f19603f3d011682016040523d82523d6000602084013e612bb0565b606091505b5050905080612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb90615061565b60405180910390fd5b505050565b6000612c088360000183612ffc565b60001c905092915050565b600080600080612c268660000186613069565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612c559291906138fb565b5050565b6000612c6c846000018460001b846130ec565b60001c90509392505050565b6000612c868260000161317d565b9050919050565b612c988484846128ee565b612ca48484848461318e565b612ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cda90614f21565b60405180910390fd5b50505050565b612d038282604051806020016040528060008152506132f2565b5050565b600082821115612d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4390615041565b60405180910390fd5b818303905092915050565b60606000821415612d9f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e99565b600082905060005b60008214612dc9578080600101915050600a8281612dc157fe5b049150612da7565b60008167ffffffffffffffff81118015612de257600080fd5b506040519080825280601f01601f191660200182016040528015612e155781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612e9157600a8481612e3657fe5b0660300160f81b82828060019003935081518110612e5057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612e8957fe5b049350612e24565b819450505050505b919050565b600080828401905083811015612ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee090614f81565b60405180910390fd5b8091505092915050565b600080831415612f065760009050612f5d565b6000828402905082848281612f1757fe5b0414612f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4f906151a1565b60405180910390fd5b809150505b92915050565b6000612f75836000018360001b61334d565b905092915050565b600081600001805490509050919050565b505050565b6000612fa5836000018360001b613370565b905092915050565b6000612fbf836000018360001b613458565b905092915050565b6000612ff3846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6134c8565b90509392505050565b600081836000018054905011613047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303e90614f01565b60405180910390fd5b82600001828154811061305657fe5b9060005260206000200154905092915050565b600080828460000180549050116130b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ac90615161565b60405180910390fd5b60008460000184815481106130c657fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061314e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131459190614ebd565b60405180910390fd5b5084600001600182038154811061316157fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006131af8473ffffffffffffffffffffffffffffffffffffffff166135a4565b6131bc57600190506132ea565b600061328363150b7a0260e01b6131d161273a565b8887876040516024016131e79493929190614dab565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615697603291398773ffffffffffffffffffffffffffffffffffffffff166135b79092919063ffffffff16565b905060008180602001905181019061329b9190613ced565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6132fc83836135cf565b613309600084848461318e565b613348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333f90614f21565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461344c57600060018203905060006001866000018054905003905060008660000182815481106133bb57fe5b90600052602060002001549050808760000184815481106133d857fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061341057fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613452565b60009150505b92915050565b6000613464838361375d565b6134bd5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506134c2565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561356f5784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505061359d565b8285600001600183038154811061358257fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b60606135c68484600085613780565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561363f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363690615181565b60405180910390fd5b6136488161271d565b15613688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367f90614f61565b60405180910390fd5b61369460008383612f8e565b6136e581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612fad90919063ffffffff16565b506136fc81836002612fc79092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156137c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bc906150a1565b60405180910390fd5b6137ce856135a4565b61380d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613804906152e1565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138369190614d29565b60006040518083038185875af1925050503d8060008114613873576040519150601f19603f3d011682016040523d82523d6000602084013e613878565b606091505b5091509150613888828286613894565b92505050949350505050565b606083156138a4578290506138f4565b6000835111156138b75782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138eb9190614ebd565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826139315760008555613978565b82601f1061394a57805160ff1916838001178555613978565b82800160010185558215613978579182015b8281111561397757825182559160200191906001019061395c565b5b5090506139859190613989565b5090565b5b808211156139a257600081600090555060010161398a565b5090565b60006139b96139b4846153ad565b61537c565b9050828152602081018484840111156139d157600080fd5b6139dc8482856155ce565b509392505050565b60006139f76139f2846153dd565b61537c565b905082815260208101848484011115613a0f57600080fd5b613a1a8482856155ce565b509392505050565b600081359050613a3181615623565b92915050565b600081359050613a468161563a565b92915050565b600081519050613a5b81615651565b92915050565b600081359050613a7081615668565b92915050565b600081519050613a8581615668565b92915050565b600082601f830112613a9c57600080fd5b8135613aac8482602086016139a6565b91505092915050565b600082601f830112613ac657600080fd5b8135613ad68482602086016139e4565b91505092915050565b600081359050613aee8161567f565b92915050565b600060208284031215613b0657600080fd5b6000613b1484828501613a22565b91505092915050565b60008060408385031215613b3057600080fd5b6000613b3e85828601613a22565b9250506020613b4f85828601613a22565b9150509250929050565b600080600060608486031215613b6e57600080fd5b6000613b7c86828701613a22565b9350506020613b8d86828701613a22565b9250506040613b9e86828701613adf565b9150509250925092565b60008060008060808587031215613bbe57600080fd5b6000613bcc87828801613a22565b9450506020613bdd87828801613a22565b9350506040613bee87828801613adf565b925050606085013567ffffffffffffffff811115613c0b57600080fd5b613c1787828801613a8b565b91505092959194509250565b60008060408385031215613c3657600080fd5b6000613c4485828601613a22565b9250506020613c5585828601613a37565b9150509250929050565b60008060408385031215613c7257600080fd5b6000613c8085828601613a22565b9250506020613c9185828601613adf565b9150509250929050565b600060208284031215613cad57600080fd5b6000613cbb84828501613a4c565b91505092915050565b600060208284031215613cd657600080fd5b6000613ce484828501613a61565b91505092915050565b600060208284031215613cff57600080fd5b6000613d0d84828501613a76565b91505092915050565b600060208284031215613d2857600080fd5b600082013567ffffffffffffffff811115613d4257600080fd5b613d4e84828501613ab5565b91505092915050565b600060208284031215613d6957600080fd5b6000613d7784828501613adf565b91505092915050565b60008060408385031215613d9357600080fd5b6000613da185828601613adf565b925050602083013567ffffffffffffffff811115613dbe57600080fd5b613dca85828601613ab5565b9150509250929050565b6000613de08383614007565b905092915050565b6000613df48383614d0b565b60208301905092915050565b613e0981615598565b82525050565b613e188161551a565b82525050565b613e2781615508565b82525050565b6000613e3882615457565b613e42818561549d565b935083602082028501613e548561540d565b8060005b85811015613e905784840389528151613e718582613dd4565b9450613e7c83615483565b925060208a01995050600181019050613e58565b50829750879550505050505092915050565b6000613ead82615462565b613eb781856154ae565b9350613ec28361541d565b8060005b83811015613ef3578151613eda8882613de8565b9750613ee583615490565b925050600181019050613ec6565b5085935050505092915050565b613f098161552c565b82525050565b6000613f1a8261546d565b613f2481856154bf565b9350613f348185602086016155dd565b613f3d81615612565b840191505092915050565b6000613f538261546d565b613f5d81856154d0565b9350613f6d8185602086016155dd565b80840191505092915050565b600081546001811660008114613f965760018114613fbb57613fff565b607f6002830416613fa781876154d0565b955060ff1983168652808601935050613fff565b60028204613fc981876154d0565b9550613fd48561542d565b60005b82811015613ff657815481890152600182019150602081019050613fd7565b82880195505050505b505092915050565b600061401282615478565b61401c81856154db565b935061402c8185602086016155dd565b61403581615612565b840191505092915050565b600061404b82615478565b61405581856154ec565b93506140658185602086016155dd565b61406e81615612565b840191505092915050565b600061408482615478565b61408e81856154fd565b935061409e8185602086016155dd565b80840191505092915050565b6000815460018116600081146140c757600181146140ed57614131565b607f60028304166140d881876154ec565b955060ff198316865260208601935050614131565b600282046140fb81876154ec565b955061410685615442565b60005b8281101561412857815481890152600182019150602081019050614109565b80880195505050505b505092915050565b60006141466022836154ec565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141ac6032836154ec565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006142126026836154ec565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614278601c836154ec565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006142b8601b836154ec565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006142f86020836154ec565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b60006143386024836154ec565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061439e6019836154ec565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006143de6014836154ec565b91507f496e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b600061441e601f836154ec565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b600061445e601e836154ec565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061449e603a836154ec565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b6000614504601d836154ec565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006145446026836154ec565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145aa602c836154ec565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146106021836154ec565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146766029836154ec565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620456c6f6e7300000000000000000000000000000000000000000000006020830152604082019050919050565b60006146dc6038836154ec565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614742602a836154ec565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006147a86022836154ec565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061480e6020836154ec565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061484e6021836154ec565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148b4602c836154ec565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061491a6020836154ec565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061495a6029836154ec565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006149c0602f836154ec565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614a266023836154ec565b91507f4e6577206e616d652069732073616d65206173207468652063757272656e742060008301527f6f6e6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a8c6021836154ec565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614af26016836154ec565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b6000614b326020836154ec565b91507f53616c65206d7573742062652061637469766520746f206d696e7420456c6f6e6000830152602082019050919050565b6000614b726000836154d0565b9150600082019050919050565b6000614b8c6031836154ec565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614bf2601d836154ec565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614c326027836154ec565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f7320656c6f6e21000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c98601a836154ec565b91507f43484f4f5345204120454c4f4e2057495448494e2052414e47450000000000006000830152602082019050919050565b6000614cd8601a836154ec565b91507f43686f6f7365206120656c6f6e2077697468696e2072616e67650000000000006000830152602082019050919050565b614d148161558e565b82525050565b614d238161558e565b82525050565b6000614d358284613f48565b915081905092915050565b6000614d4c8284613f79565b915081905092915050565b6000614d638285614079565b9150614d6f8284614079565b91508190509392505050565b6000614d8682614b65565b9150819050919050565b6000602082019050614da56000830184613e1e565b92915050565b6000608082019050614dc06000830187613e0f565b614dcd6020830186613e1e565b614dda6040830185614d1a565b8181036060830152614dec8184613f0f565b905095945050505050565b6000606082019050614e0c6000830186613e00565b614e196020830185614d1a565b8181036040830152614e2b8184614040565b9050949350505050565b6000604082019050614e4a6000830185613e1e565b614e576020830184614d1a565b9392505050565b60006020820190508181036000830152614e788184613e2d565b905092915050565b60006020820190508181036000830152614e9a8184613ea2565b905092915050565b6000602082019050614eb76000830184613f00565b92915050565b60006020820190508181036000830152614ed78184614040565b905092915050565b60006020820190508181036000830152614ef981846140aa565b905092915050565b60006020820190508181036000830152614f1a81614139565b9050919050565b60006020820190508181036000830152614f3a8161419f565b9050919050565b60006020820190508181036000830152614f5a81614205565b9050919050565b60006020820190508181036000830152614f7a8161426b565b9050919050565b60006020820190508181036000830152614f9a816142ab565b9050919050565b60006020820190508181036000830152614fba816142eb565b9050919050565b60006020820190508181036000830152614fda8161432b565b9050919050565b60006020820190508181036000830152614ffa81614391565b9050919050565b6000602082019050818103600083015261501a816143d1565b9050919050565b6000602082019050818103600083015261503a81614411565b9050919050565b6000602082019050818103600083015261505a81614451565b9050919050565b6000602082019050818103600083015261507a81614491565b9050919050565b6000602082019050818103600083015261509a816144f7565b9050919050565b600060208201905081810360008301526150ba81614537565b9050919050565b600060208201905081810360008301526150da8161459d565b9050919050565b600060208201905081810360008301526150fa81614603565b9050919050565b6000602082019050818103600083015261511a81614669565b9050919050565b6000602082019050818103600083015261513a816146cf565b9050919050565b6000602082019050818103600083015261515a81614735565b9050919050565b6000602082019050818103600083015261517a8161479b565b9050919050565b6000602082019050818103600083015261519a81614801565b9050919050565b600060208201905081810360008301526151ba81614841565b9050919050565b600060208201905081810360008301526151da816148a7565b9050919050565b600060208201905081810360008301526151fa8161490d565b9050919050565b6000602082019050818103600083015261521a8161494d565b9050919050565b6000602082019050818103600083015261523a816149b3565b9050919050565b6000602082019050818103600083015261525a81614a19565b9050919050565b6000602082019050818103600083015261527a81614a7f565b9050919050565b6000602082019050818103600083015261529a81614ae5565b9050919050565b600060208201905081810360008301526152ba81614b25565b9050919050565b600060208201905081810360008301526152da81614b7f565b9050919050565b600060208201905081810360008301526152fa81614be5565b9050919050565b6000602082019050818103600083015261531a81614c25565b9050919050565b6000602082019050818103600083015261533a81614c8b565b9050919050565b6000602082019050818103600083015261535a81614ccb565b9050919050565b60006020820190506153766000830184614d1a565b92915050565b6000604051905081810181811067ffffffffffffffff821117156153a3576153a2615610565b5b8060405250919050565b600067ffffffffffffffff8211156153c8576153c7615610565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156153f8576153f7615610565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006155138261556e565b9050919050565b60006155258261556e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006155a3826155aa565b9050919050565b60006155b5826155bc565b9050919050565b60006155c78261556e565b9050919050565b82818337600083830152505050565b60005b838110156155fb5780820151818401526020810190506155e0565b8381111561560a576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b61562c81615508565b811461563757600080fd5b50565b6156438161552c565b811461564e57600080fd5b50565b61565a81615538565b811461566557600080fd5b50565b61567181615542565b811461567c57600080fd5b50565b6156888161558e565b811461569357600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212208dd674adf443fb9d7458d8812ddc3a858adba2f51fe3758dc0777f1c42dee67264736f6c63430007060033
Deployed Bytecode Sourcemap
66912:6063:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10308:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67009:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51593:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54379:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53909:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69426:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53387:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67365:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55269:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68551:455;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53149:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69668:89;;;;;;;;;;;;;:::i;:::-;;55645:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67459:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53675:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69559:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51349:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52968:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51066:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66304:148;;;;;;;;;;;;;:::i;:::-;;69775:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67315:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65653:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51762:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67109:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54672:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70770:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55867:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70606:125;;;;;;;;;;;;;:::i;:::-;;69018:398;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51937:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67241:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71663:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70962:688;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70366:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67625:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72078:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55038:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67414:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66607:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72413:553;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10308:150;10393:4;10417:20;:33;10438:11;10417:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10410:40;;10308:150;;;:::o;67009:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51593:100::-;51647:13;51680:5;51673:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51593:100;:::o;54379:221::-;54455:7;54483:16;54491:7;54483;:16::i;:::-;54475:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54568:15;:24;54584:7;54568:24;;;;;;;;;;;;;;;;;;;;;54561:31;;54379:221;;;:::o;53909:404::-;53990:13;54006:23;54021:7;54006:14;:23::i;:::-;53990:39;;54054:5;54048:11;;:2;:11;;;;54040:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54134:5;54118:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;54143:44;54167:5;54174:12;:10;:12::i;:::-;54143:23;:44::i;:::-;54118:69;54110:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;54284:21;54293:2;54297:7;54284:8;:21::i;:::-;53909:404;;;:::o;69426:125::-;65884:12;:10;:12::i;:::-;65873:23;;:7;:5;:7::i;:::-;:23;;;65865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69529:14:::1;69511:15;:32;;;;;;;;;;;;:::i;:::-;;69426:125:::0;:::o;53387:211::-;53448:7;53569:21;:12;:19;:21::i;:::-;53562:28;;53387:211;:::o;67365:40::-;67401:4;67365:40;:::o;55269:305::-;55430:41;55449:12;:10;:12::i;:::-;55463:7;55430:18;:41::i;:::-;55422:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55538:28;55548:4;55554:2;55558:7;55538:9;:28::i;:::-;55269:305;;;:::o;68551:455::-;65884:12;:10;:12::i;:::-;65873:23;;:7;:5;:7::i;:::-;:23;;;65865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68646:6:::1;68621:21;:31;;68613:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;68708:19;68730:5;68708:27;;68751:9;68746:253;68770:1;68766;:5;68746:253;;;68793:15;68833:11;68820:7;:10;68828:1;68820:10;;;;;;;;;;;;68811:6;:19;:33;;;;;;68793:51;;68873:53;68899:13;:16;68913:1;68899:16;;;;;;;;;;;;;;;;;;;;;68918:7;68873:17;:53::i;:::-;68946:41;68962:13;:16;68976:1;68962:16;;;;;;;;;;;;;;;;;;;;;68979:7;68946:41;;;;;;;:::i;:::-;;;;;;;;68746:253;68773:3;;;;;;;68746:253;;;;65944:1;68551:455:::0;:::o;53149:162::-;53246:7;53273:30;53297:5;53273:13;:20;53287:5;53273:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53266:37;;53149:162;;;;:::o;69668:89::-;65884:12;:10;:12::i;:::-;65873:23;;:7;:5;:7::i;:::-;:23;;;65865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69737:12:::1;;;;;;;;;;;69736:13;69721:12;;:28;;;;;;;;;;;;;;;;;;69668:89::o:0;55645:151::-;55749:39;55766:4;55772:2;55776:7;55749:39;;;;;;;;;;;;:16;:39::i;:::-;55645:151;;;:::o;67459:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53675:172::-;53750:7;53771:15;53792:22;53808:5;53792:12;:15;;:22;;;;:::i;:::-;53770:44;;;53832:7;53825:14;;;53675:172;;;:::o;69559:99::-;65884:12;:10;:12::i;:::-;65873:23;;:7;:5;:7::i;:::-;:23;;;65865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69630:20:::1;69642:7;69630:11;:20::i;:::-;69559:99:::0;:::o;51349:177::-;51421:7;51448:70;51465:7;51448:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;51441:77;;51349:177;;;:::o;52968:97::-;53016:13;53049:8;53042:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52968:97;:::o;51066:221::-;51138:7;51183:1;51166:19;;:5;:19;;;;51158:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51250:29;:13;:20;51264:5;51250:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51243:36;;51066:221;;;:::o;66304:148::-;65884:12;:10;:12::i;:::-;65873:23;;:7;:5;:7::i;:::-;:23;;;65865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66411:1:::1;66374:40;;66395:6;;;;;;;;;;;66374:40;;;;;;;;;;;;66442:1;66425:6;;:19;;;;;;;;;;;;;;;;;;66304:148::o:0;69775:540::-;69836:16;69866:18;69887:17;69897:6;69887:9;:17::i;:::-;69866:38;;69933:1;69919:10;:15;69915:393;;;70010:1;69996:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69989:23;;;;;69915:393;70045:23;70085:10;70071:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70045:51;;70111:13;70139:130;70163:10;70155:5;:18;70139:130;;;70219:34;70239:6;70247:5;70219:19;:34::i;:::-;70203:6;70210:5;70203:13;;;;;;;;;;;;;:50;;;;;70175:7;;;;;;;70139:130;;;70290:6;70283:13;;;;;69775:540;;;;:::o;67315:41::-;67354:2;67315:41;:::o;65653:87::-;65699:7;65726:6;;;;;;;;;;;65719:13;;65653:87;:::o;51762:104::-;51818:13;51851:7;51844:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51762:104;:::o;67109:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54672:295::-;54787:12;:10;:12::i;:::-;54775:24;;:8;:24;;;;54767:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54887:8;54842:18;:32;54861:12;:10;:12::i;:::-;54842:32;;;;;;;;;;;;;;;:42;54875:8;54842:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;54940:8;54911:48;;54926:12;:10;:12::i;:::-;54911:48;;;54950:8;54911:48;;;;;;:::i;:::-;;;;;;;;54672:295;;:::o;70770:174::-;65884:12;:10;:12::i;:::-;65873:23;;:7;:5;:7::i;:::-;:23;;;65865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70870:5:::1;70853:22;;:13;;;;;;;;;;;:22;;;70845:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;70928:8;70913:12;:23;;;;;;;;;;;;:::i;:::-;;70770:174:::0;:::o;55867:285::-;55999:41;56018:12;:10;:12::i;:::-;56032:7;55999:18;:41::i;:::-;55991:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56105:39;56119:4;56125:2;56129:7;56138:5;56105:13;:39::i;:::-;55867:285;;;;:::o;70606:125::-;65884:12;:10;:12::i;:::-;65873:23;;:7;:5;:7::i;:::-;:23;;;65865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70674:4:::1;70657:13;;:21;;;;;;;;;;;;;;;;;;70694:29;70710:12;70694:29;;;;;;:::i;:::-;;;;;;;;70606:125::o:0;69018:398::-;65884:12;:10;:12::i;:::-;65873:23;;:7;:5;:7::i;:::-;:23;;;65865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69113:11:::1;69127:13;:11;:13::i;:::-;69113:27;;69176:1;69159:14;:18;:51;;;;;69199:11;;69181:14;:29;;69159:51;69151:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;69263:6;69258:95;69279:14;69275:1;:18;69258:95;;;69315:26;69325:3;69339:1;69330:6;:10;69315:9;:26::i;:::-;69295:3;;;;;;;69258:95;;;;69377:31;69393:14;69377:11;;:15;;:31;;;;:::i;:::-;69363:11;:45;;;;65944:1;69018:398:::0;;:::o;51937:792::-;52010:13;52044:16;52052:7;52044;:16::i;:::-;52036:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52125:23;52151:10;:19;52162:7;52151:19;;;;;;;;;;;52125:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52181:18;52202:9;:7;:9::i;:::-;52181:30;;52309:1;52293:4;52287:18;:23;52283:72;;;52334:9;52327:16;;;;;;52283:72;52485:1;52465:9;52459:23;:27;52455:108;;;52534:4;52540:9;52517:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52503:48;;;;;;52455:108;52695:4;52701:18;:7;:16;:18::i;:::-;52678:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52664:57;;;;51937:792;;;;:::o;67241:53::-;67277:17;67241:53;:::o;71663:403::-;71770:10;71749:31;;:17;71757:8;71749:7;:17::i;:::-;:31;;;71741:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;71867:34;71880:9;:19;71890:8;71880:19;;;;;;;;;;;71867:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71843:20;71856:5;71843:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;71835:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;71974:5;71952:9;:19;71962:8;71952:19;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;72005:43;72020:10;72032:8;72042:5;72005:43;;;;;;;;:::i;:::-;;;;;;;;71663:403;;:::o;70962:688::-;71041:12;;;;;;;;;;;71033:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;71126:1;71109:14;:18;:55;;;;;67354:2;71131:14;:33;;71109:55;71101:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;67401:4;71221:33;71239:14;71221:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:46;;71213:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;71345:29;71359:14;67277:17;71345:13;;:29;;;;:::i;:::-;71332:9;:42;;71324:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;71435:6;71431:210;71451:14;71447:1;:18;71431:210;;;71487:14;71504:13;:11;:13::i;:::-;71487:30;;67401:4;71536:13;:11;:13::i;:::-;:25;71532:98;;;71582:32;71592:10;71604:9;71582;:32::i;:::-;71532:98;71431:210;71467:3;;;;;;;71431:210;;;;70962:688;:::o;70366:174::-;70418:13;70458;:11;:13::i;:::-;70452:3;:19;70444:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;70520:12;70513:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70366:174;;;:::o;67625:29::-;;;;:::o;72078:194::-;72136:13;72182;:11;:13::i;:::-;72171:8;:24;72162:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;72245:9;:19;72255:8;72245:19;;;;;;;;;;;72238:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72078:194;;;:::o;55038:164::-;55135:4;55159:18;:25;55178:5;55159:25;;;;;;;;;;;;;;;:35;55185:8;55159:35;;;;;;;;;;;;;;;;;;;;;;;;;55152:42;;55038:164;;;;:::o;67414:32::-;;;;;;;;;;;;;:::o;66607:244::-;65884:12;:10;:12::i;:::-;65873:23;;:7;:5;:7::i;:::-;:23;;;65865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66716:1:::1;66696:22;;:8;:22;;;;66688:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66806:8;66777:38;;66798:6;;;;;;;;;;;66777:38;;;;;;;;;;;;66835:8;66826:6;;:17;;;;;;;;;;;;;;;;;;66607:244:::0;:::o;72413:553::-;72477:15;72506:18;72527:17;72537:6;72527:9;:17::i;:::-;72506:38;;72573:1;72559:10;:15;72555:404;;;72649:1;72636:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72629:22;;;;;72555:404;72684:22;72722:10;72709:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72684:49;;72748:13;72776:144;72800:10;72792:5;:18;72776:144;;;72856:9;:47;72867:34;72887:6;72895:5;72867:19;:34::i;:::-;72856:47;;;;;;;;;;;72840:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;72847:5;72840:13;;;;;;;;;;;;;:63;;;;72812:7;;;;;;;72776:144;;;72941:6;72934:13;;;;;72413:553;;;;:::o;57619:127::-;57684:4;57708:30;57730:7;57708:12;:21;;:30;;;;:::i;:::-;57701:37;;57619:127;;;:::o;740:106::-;793:15;828:10;821:17;;740:106;:::o;63637:192::-;63739:2;63712:15;:24;63728:7;63712:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63795:7;63791:2;63757:46;;63766:23;63781:7;63766:14;:23::i;:::-;63757:46;;;;;;;;;;;;63637:192;;:::o;44351:123::-;44420:7;44447:19;44455:3;:10;;44447:7;:19::i;:::-;44440:26;;44351:123;;;:::o;57913:355::-;58006:4;58031:16;58039:7;58031;:16::i;:::-;58023:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58107:13;58123:23;58138:7;58123:14;:23::i;:::-;58107:39;;58176:5;58165:16;;:7;:16;;;:51;;;;58209:7;58185:31;;:20;58197:7;58185:11;:20::i;:::-;:31;;;58165:51;:94;;;;58220:39;58244:5;58251:7;58220:23;:39::i;:::-;58165:94;58157:103;;;57913:355;;;;:::o;61049:599::-;61174:4;61147:31;;:23;61162:7;61147:14;:23::i;:::-;:31;;;61139:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61275:1;61261:16;;:2;:16;;;;61253:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61331:39;61352:4;61358:2;61362:7;61331:20;:39::i;:::-;61435:29;61452:1;61456:7;61435:8;:29::i;:::-;61477:35;61504:7;61477:13;:19;61491:4;61477:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;61523:30;61545:7;61523:13;:17;61537:2;61523:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;61566:29;61583:7;61592:2;61566:12;:16;;:29;;;;;:::i;:::-;;61632:7;61628:2;61613:27;;61622:4;61613:27;;;;;;;;;;;;61049:599;;;:::o;20668:397::-;20783:6;20758:21;:31;;20750:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20915:12;20933:9;:14;;20956:6;20933:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20914:54;;;20987:7;20979:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;20668:397;;;:::o;36142:137::-;36213:7;36248:22;36252:3;:10;;36264:5;36248:3;:22::i;:::-;36240:31;;36233:38;;36142:137;;;;:::o;44813:236::-;44893:7;44902;44923:11;44936:13;44953:22;44957:3;:10;;44969:5;44953:3;:22::i;:::-;44922:53;;;;45002:3;44994:12;;45032:5;45024:14;;44986:55;;;;;;44813:236;;;;;:::o;62249:100::-;62333:8;62322;:19;;;;;;;;;;;;:::i;:::-;;62249:100;:::o;46099:213::-;46206:7;46257:44;46262:3;:10;;46282:3;46274:12;;46288;46257:4;:44::i;:::-;46249:53;;46226:78;;46099:213;;;;;:::o;35684:114::-;35744:7;35771:19;35779:3;:10;;35771:7;:19::i;:::-;35764:26;;35684:114;;;:::o;57034:272::-;57148:28;57158:4;57164:2;57168:7;57148:9;:28::i;:::-;57195:48;57218:4;57224:2;57228:7;57237:5;57195:22;:48::i;:::-;57187:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;57034:272;;;;:::o;58611:110::-;58687:26;58697:2;58701:7;58687:26;;;;;;;;;;;;:9;:26::i;:::-;58611:110;;:::o;14332:158::-;14390:7;14423:1;14418;:6;;14410:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14481:1;14477;:5;14470:12;;14332:158;;;;:::o;46563:746::-;46619:13;46849:1;46840:5;:10;46836:53;;;46867:10;;;;;;;;;;;;;;;;;;;;;46836:53;46899:12;46914:5;46899:20;;46930:14;46955:78;46970:1;46962:4;:9;46955:78;;46988:8;;;;;;;47019:2;47011:10;;;;;;;;;46955:78;;;47043:19;47075:6;47065:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47043:39;;47093:13;47118:1;47109:6;:10;47093:26;;47137:5;47130:12;;47153:117;47168:1;47160:4;:9;47153:117;;47229:2;47222:4;:9;;;;;;47217:2;:14;47204:29;;47186:6;47193:7;;;;;;;47186:15;;;;;;;;;;;:47;;;;;;;;;;;47256:2;47248:10;;;;;;;;;47153:117;;;47294:6;47280:21;;;;;;46563:746;;;;:::o;13870:179::-;13928:7;13948:9;13964:1;13960;:5;13948:17;;13989:1;13984;:6;;13976:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;14040:1;14033:8;;;13870:179;;;;:::o;14749:220::-;14807:7;14836:1;14831;:6;14827:20;;;14846:1;14839:8;;;;14827:20;14858:9;14874:1;14870;:5;14858:17;;14903:1;14898;14894;:5;;;;;;:10;14886:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14960:1;14953:8;;;14749:220;;;;;:::o;44112:151::-;44196:4;44220:35;44230:3;:10;;44250:3;44242:12;;44220:9;:35::i;:::-;44213:42;;44112:151;;;;:::o;40930:110::-;40986:7;41013:3;:12;;:19;;;;41006:26;;40930:110;;;:::o;64442:93::-;;;;:::o;35229:137::-;35299:4;35323:35;35331:3;:10;;35351:5;35343:14;;35323:7;:35::i;:::-;35316:42;;35229:137;;;;:::o;34922:131::-;34989:4;35013:32;35018:3;:10;;35038:5;35030:14;;35013:4;:32::i;:::-;35006:39;;34922:131;;;;:::o;43535:185::-;43624:4;43648:64;43653:3;:10;;43673:3;43665:12;;43703:5;43687:23;;43679:32;;43648:4;:64::i;:::-;43641:71;;43535:185;;;;;:::o;31180:204::-;31247:7;31296:5;31275:3;:11;;:18;;;;:26;31267:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31358:3;:11;;31370:5;31358:18;;;;;;;;;;;;;;;;31351:25;;31180:204;;;;:::o;41395:279::-;41462:7;41471;41521:5;41499:3;:12;;:19;;;;:27;41491:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41578:22;41603:3;:12;;41616:5;41603:19;;;;;;;;;;;;;;;;;;41578:44;;41641:5;:10;;;41653:5;:12;;;41633:33;;;;;41395:279;;;;;:::o;42892:319::-;42986:7;43006:16;43025:3;:12;;:17;43038:3;43025:17;;;;;;;;;;;;43006:36;;43073:1;43061:8;:13;;43076:12;43053:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43143:3;:12;;43167:1;43156:8;:12;43143:26;;;;;;;;;;;;;;;;;;:33;;;43136:40;;;42892:319;;;;;:::o;30727:109::-;30783:7;30810:3;:11;;:18;;;;30803:25;;30727:109;;;:::o;62914:604::-;63035:4;63062:15;:2;:13;;;:15::i;:::-;63057:60;;63101:4;63094:11;;;;63057:60;63127:23;63153:252;63206:45;;;63266:12;:10;:12::i;:::-;63293:4;63312:7;63334:5;63169:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63153:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;63127:278;;63416:13;63443:10;63432:32;;;;;;;;;;;;:::i;:::-;63416:48;;48063:10;63493:16;;63483:26;;;:6;:26;;;;63475:35;;;;62914:604;;;;;;;:::o;58948:250::-;59044:18;59050:2;59054:7;59044:5;:18::i;:::-;59081:54;59112:1;59116:2;59120:7;59129:5;59081:22;:54::i;:::-;59073:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;58948:250;;;:::o;40710:125::-;40781:4;40826:1;40805:3;:12;;:17;40818:3;40805:17;;;;;;;;;;;;:22;;40798:29;;40710:125;;;;:::o;28882:1544::-;28948:4;29066:18;29087:3;:12;;:19;29100:5;29087:19;;;;;;;;;;;;29066:40;;29137:1;29123:10;:15;29119:1300;;29485:21;29522:1;29509:10;:14;29485:38;;29538:17;29579:1;29558:3;:11;;:18;;;;:22;29538:42;;29825:17;29845:3;:11;;29857:9;29845:22;;;;;;;;;;;;;;;;29825:42;;29991:9;29962:3;:11;;29974:13;29962:26;;;;;;;;;;;;;;;:38;;;;30110:1;30094:13;:17;30068:3;:12;;:23;30081:9;30068:23;;;;;;;;;;;:43;;;;30220:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30315:3;:12;;:19;30328:5;30315:19;;;;;;;;;;;30308:26;;;30358:4;30351:11;;;;;;;;29119:1300;30402:5;30395:12;;;28882:1544;;;;;:::o;28292:414::-;28355:4;28377:21;28387:3;28392:5;28377:9;:21::i;:::-;28372:327;;28415:3;:11;;28432:5;28415:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28598:3;:11;;:18;;;;28576:3;:12;;:19;28589:5;28576:19;;;;;;;;;;;:40;;;;28638:4;28631:11;;;;28372:327;28682:5;28675:12;;28292:414;;;;;:::o;38210:692::-;38286:4;38402:16;38421:3;:12;;:17;38434:3;38421:17;;;;;;;;;;;;38402:36;;38467:1;38455:8;:13;38451:444;;;38522:3;:12;;38540:38;;;;;;;;38557:3;38540:38;;;;38570:5;38540:38;;;38522:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38737:3;:12;;:19;;;;38717:3;:12;;:17;38730:3;38717:17;;;;;;;;;;;:39;;;;38778:4;38771:11;;;;;38451:444;38851:5;38815:3;:12;;38839:1;38828:8;:12;38815:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38878:5;38871:12;;;38210:692;;;;;;:::o;19311:422::-;19371:4;19579:12;19690:7;19678:20;19670:28;;19724:1;19717:4;:8;19710:15;;;19311:422;;;:::o;22229:195::-;22332:12;22364:52;22386:6;22394:4;22400:1;22403:12;22364:21;:52::i;:::-;22357:59;;22229:195;;;;;:::o;59534:404::-;59628:1;59614:16;;:2;:16;;;;59606:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59687:16;59695:7;59687;:16::i;:::-;59686:17;59678:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59749:45;59778:1;59782:2;59786:7;59749:20;:45::i;:::-;59807:30;59829:7;59807:13;:17;59821:2;59807:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;59850:29;59867:7;59876:2;59850:12;:16;;:29;;;;;:::i;:::-;;59922:7;59918:2;59897:33;;59914:1;59897:33;;;;;;;;;;;;59534:404;;:::o;30512:129::-;30585:4;30632:1;30609:3;:12;;:19;30622:5;30609:19;;;;;;;;;;;;:24;;30602:31;;30512:129;;;;:::o;23281:530::-;23408:12;23466:5;23441:21;:30;;23433:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23533:18;23544:6;23533:10;:18::i;:::-;23525:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23659:12;23673:23;23700:6;:11;;23720:5;23728:4;23700:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23658:75;;;;23751:52;23769:7;23778:10;23790:12;23751:17;:52::i;:::-;23744:59;;;;23281:530;;;;;;:::o;25821:742::-;25936:12;25965:7;25961:595;;;25996:10;25989:17;;;;25961:595;26130:1;26110:10;:17;:21;26106:439;;;26373:10;26367:17;26434:15;26421:10;26417:2;26413:19;26406:44;26321:148;26516:12;26509:20;;;;;;;;;;;:::i;:::-;;;;;;;;25821:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:143::-;;1077:6;1071:13;1062:22;;1093:33;1120:5;1093:33;:::i;:::-;1052:80;;;;:::o;1138:137::-;;1221:6;1208:20;1199:29;;1237:32;1263:5;1237:32;:::i;:::-;1189:86;;;;:::o;1281:141::-;;1368:6;1362:13;1353:22;;1384:32;1410:5;1384:32;:::i;:::-;1343:79;;;;:::o;1441:271::-;;1545:3;1538:4;1530:6;1526:17;1522:27;1512:2;;1563:1;1560;1553:12;1512:2;1603:6;1590:20;1628:78;1702:3;1694:6;1687:4;1679:6;1675:17;1628:78;:::i;:::-;1619:87;;1502:210;;;;;:::o;1732:273::-;;1837:3;1830:4;1822:6;1818:17;1814:27;1804:2;;1855:1;1852;1845:12;1804:2;1895:6;1882:20;1920:79;1995:3;1987:6;1980:4;1972:6;1968:17;1920:79;:::i;:::-;1911:88;;1794:211;;;;;:::o;2011:139::-;;2095:6;2082:20;2073:29;;2111:33;2138:5;2111:33;:::i;:::-;2063:87;;;;:::o;2156:262::-;;2264:2;2252:9;2243:7;2239:23;2235:32;2232:2;;;2280:1;2277;2270:12;2232:2;2323:1;2348:53;2393:7;2384:6;2373:9;2369:22;2348:53;:::i;:::-;2338:63;;2294:117;2222:196;;;;:::o;2424:407::-;;;2549:2;2537:9;2528:7;2524:23;2520:32;2517:2;;;2565:1;2562;2555:12;2517:2;2608:1;2633:53;2678:7;2669:6;2658:9;2654:22;2633:53;:::i;:::-;2623:63;;2579:117;2735:2;2761:53;2806:7;2797:6;2786:9;2782:22;2761:53;:::i;:::-;2751:63;;2706:118;2507:324;;;;;:::o;2837:552::-;;;;2979:2;2967:9;2958:7;2954:23;2950:32;2947:2;;;2995:1;2992;2985:12;2947:2;3038:1;3063:53;3108:7;3099:6;3088:9;3084:22;3063:53;:::i;:::-;3053:63;;3009:117;3165:2;3191:53;3236:7;3227:6;3216:9;3212:22;3191:53;:::i;:::-;3181:63;;3136:118;3293:2;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3264:118;2937:452;;;;;:::o;3395:809::-;;;;;3563:3;3551:9;3542:7;3538:23;3534:33;3531:2;;;3580:1;3577;3570:12;3531:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;4034:2;4023:9;4019:18;4006:32;4065:18;4057:6;4054:30;4051:2;;;4097:1;4094;4087:12;4051:2;4125:62;4179:7;4170:6;4159:9;4155:22;4125:62;:::i;:::-;4115:72;;3977:220;3521:683;;;;;;;:::o;4210:401::-;;;4332:2;4320:9;4311:7;4307:23;4303:32;4300:2;;;4348:1;4345;4338:12;4300:2;4391:1;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4362:117;4518:2;4544:50;4586:7;4577:6;4566:9;4562:22;4544:50;:::i;:::-;4534:60;;4489:115;4290:321;;;;;:::o;4617:407::-;;;4742:2;4730:9;4721:7;4717:23;4713:32;4710:2;;;4758:1;4755;4748:12;4710:2;4801:1;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4772:117;4928:2;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4899:118;4700:324;;;;;:::o;5030:284::-;;5149:2;5137:9;5128:7;5124:23;5120:32;5117:2;;;5165:1;5162;5155:12;5117:2;5208:1;5233:64;5289:7;5280:6;5269:9;5265:22;5233:64;:::i;:::-;5223:74;;5179:128;5107:207;;;;:::o;5320:260::-;;5427:2;5415:9;5406:7;5402:23;5398:32;5395:2;;;5443:1;5440;5433:12;5395:2;5486:1;5511:52;5555:7;5546:6;5535:9;5531:22;5511:52;:::i;:::-;5501:62;;5457:116;5385:195;;;;:::o;5586:282::-;;5704:2;5692:9;5683:7;5679:23;5675:32;5672:2;;;5720:1;5717;5710:12;5672:2;5763:1;5788:63;5843:7;5834:6;5823:9;5819:22;5788:63;:::i;:::-;5778:73;;5734:127;5662:206;;;;:::o;5874:375::-;;5992:2;5980:9;5971:7;5967:23;5963:32;5960:2;;;6008:1;6005;5998:12;5960:2;6079:1;6068:9;6064:17;6051:31;6109:18;6101:6;6098:30;6095:2;;;6141:1;6138;6131:12;6095:2;6169:63;6224:7;6215:6;6204:9;6200:22;6169:63;:::i;:::-;6159:73;;6022:220;5950:299;;;;:::o;6255:262::-;;6363:2;6351:9;6342:7;6338:23;6334:32;6331:2;;;6379:1;6376;6369:12;6331:2;6422:1;6447:53;6492:7;6483:6;6472:9;6468:22;6447:53;:::i;:::-;6437:63;;6393:117;6321:196;;;;:::o;6523:520::-;;;6658:2;6646:9;6637:7;6633:23;6629:32;6626:2;;;6674:1;6671;6664:12;6626:2;6717:1;6742:53;6787:7;6778:6;6767:9;6763:22;6742:53;:::i;:::-;6732:63;;6688:117;6872:2;6861:9;6857:18;6844:32;6903:18;6895:6;6892:30;6889:2;;;6935:1;6932;6925:12;6889:2;6963:63;7018:7;7009:6;6998:9;6994:22;6963:63;:::i;:::-;6953:73;;6815:221;6616:427;;;;;:::o;7049:196::-;;7173:66;7235:3;7227:6;7173:66;:::i;:::-;7159:80;;7149:96;;;;:::o;7251:179::-;;7341:46;7383:3;7375:6;7341:46;:::i;:::-;7419:4;7414:3;7410:14;7396:28;;7331:99;;;;:::o;7436:147::-;7531:45;7570:5;7531:45;:::i;:::-;7526:3;7519:58;7509:74;;:::o;7589:142::-;7692:32;7718:5;7692:32;:::i;:::-;7687:3;7680:45;7670:61;;:::o;7737:118::-;7824:24;7842:5;7824:24;:::i;:::-;7819:3;7812:37;7802:53;;:::o;7889:991::-;;8057:64;8115:5;8057:64;:::i;:::-;8137:96;8226:6;8221:3;8137:96;:::i;:::-;8130:103;;8259:3;8304:4;8296:6;8292:17;8287:3;8283:27;8334:66;8394:5;8334:66;:::i;:::-;8423:7;8454:1;8439:396;8464:6;8461:1;8458:13;8439:396;;;8535:9;8529:4;8525:20;8520:3;8513:33;8586:6;8580:13;8614:84;8693:4;8678:13;8614:84;:::i;:::-;8606:92;;8721:70;8784:6;8721:70;:::i;:::-;8711:80;;8820:4;8815:3;8811:14;8804:21;;8499:336;8486:1;8483;8479:9;8474:14;;8439:396;;;8443:14;8851:4;8844:11;;8871:3;8864:10;;8033:847;;;;;;;;;:::o;8916:732::-;;9064:54;9112:5;9064:54;:::i;:::-;9134:86;9213:6;9208:3;9134:86;:::i;:::-;9127:93;;9244:56;9294:5;9244:56;:::i;:::-;9323:7;9354:1;9339:284;9364:6;9361:1;9358:13;9339:284;;;9440:6;9434:13;9467:63;9526:3;9511:13;9467:63;:::i;:::-;9460:70;;9553:60;9606:6;9553:60;:::i;:::-;9543:70;;9399:224;9386:1;9383;9379:9;9374:14;;9339:284;;;9343:14;9639:3;9632:10;;9040:608;;;;;;;:::o;9654:109::-;9735:21;9750:5;9735:21;:::i;:::-;9730:3;9723:34;9713:50;;:::o;9769:360::-;;9883:38;9915:5;9883:38;:::i;:::-;9937:70;10000:6;9995:3;9937:70;:::i;:::-;9930:77;;10016:52;10061:6;10056:3;10049:4;10042:5;10038:16;10016:52;:::i;:::-;10093:29;10115:6;10093:29;:::i;:::-;10088:3;10084:39;10077:46;;9859:270;;;;;:::o;10135:373::-;;10267:38;10299:5;10267:38;:::i;:::-;10321:88;10402:6;10397:3;10321:88;:::i;:::-;10314:95;;10418:52;10463:6;10458:3;10451:4;10444:5;10440:16;10418:52;:::i;:::-;10495:6;10490:3;10486:16;10479:23;;10243:265;;;;;:::o;10536:1001::-;;10678:5;10672:12;10715:1;10704:9;10700:17;10731:1;10726:300;;;;11040:1;11035:496;;;;10693:838;;10726:300;10816:4;10812:1;10801:9;10797:17;10793:28;10841:88;10922:6;10917:3;10841:88;:::i;:::-;10834:95;;10973:4;10969:9;10958;10954:25;10949:3;10942:38;11009:6;11004:3;11000:16;10993:23;;10733:293;10726:300;;11035:496;11116:1;11105:9;11101:17;11138:88;11219:6;11214:3;11138:88;:::i;:::-;11131:95;;11254:41;11289:5;11254:41;:::i;:::-;11317:1;11331:154;11345:6;11342:1;11339:13;11331:154;;;11419:7;11413:14;11409:1;11404:3;11400:11;11393:35;11469:1;11460:7;11456:15;11445:26;;11367:4;11364:1;11360:12;11355:17;;11331:154;;;11514:6;11509:3;11505:16;11498:23;;11042:489;;;10693:838;;10645:892;;;;;:::o;11543:344::-;;11649:39;11682:5;11649:39;:::i;:::-;11704:61;11758:6;11753:3;11704:61;:::i;:::-;11697:68;;11774:52;11819:6;11814:3;11807:4;11800:5;11796:16;11774:52;:::i;:::-;11851:29;11873:6;11851:29;:::i;:::-;11846:3;11842:39;11835:46;;11625:262;;;;;:::o;11893:364::-;;12009:39;12042:5;12009:39;:::i;:::-;12064:71;12128:6;12123:3;12064:71;:::i;:::-;12057:78;;12144:52;12189:6;12184:3;12177:4;12170:5;12166:16;12144:52;:::i;:::-;12221:29;12243:6;12221:29;:::i;:::-;12216:3;12212:39;12205:46;;11985:272;;;;;:::o;12263:377::-;;12397:39;12430:5;12397:39;:::i;:::-;12452:89;12534:6;12529:3;12452:89;:::i;:::-;12445:96;;12550:52;12595:6;12590:3;12583:4;12576:5;12572:16;12550:52;:::i;:::-;12627:6;12622:3;12618:16;12611:23;;12373:267;;;;;:::o;12670:937::-;;12792:5;12786:12;12829:1;12818:9;12814:17;12845:1;12840:281;;;;13135:1;13130:471;;;;12807:794;;12840:281;12930:4;12926:1;12915:9;12911:17;12907:28;12955:71;13019:6;13014:3;12955:71;:::i;:::-;12948:78;;13070:4;13066:9;13055;13051:25;13046:3;13039:38;13106:4;13101:3;13097:14;13090:21;;12847:274;12840:281;;13130:471;13211:1;13200:9;13196:17;13233:71;13297:6;13292:3;13233:71;:::i;:::-;13226:78;;13332:38;13364:5;13332:38;:::i;:::-;13392:1;13406:154;13420:6;13417:1;13414:13;13406:154;;;13494:7;13488:14;13484:1;13479:3;13475:11;13468:35;13544:1;13535:7;13531:15;13520:26;;13442:4;13439:1;13435:12;13430:17;;13406:154;;;13589:1;13584:3;13580:11;13573:18;;13137:464;;;12807:794;;12759:848;;;;;:::o;13613:366::-;;13776:67;13840:2;13835:3;13776:67;:::i;:::-;13769:74;;13873:34;13869:1;13864:3;13860:11;13853:55;13939:4;13934:2;13929:3;13925:12;13918:26;13970:2;13965:3;13961:12;13954:19;;13759:220;;;:::o;13985:382::-;;14148:67;14212:2;14207:3;14148:67;:::i;:::-;14141:74;;14245:34;14241:1;14236:3;14232:11;14225:55;14311:20;14306:2;14301:3;14297:12;14290:42;14358:2;14353:3;14349:12;14342:19;;14131:236;;;:::o;14373:370::-;;14536:67;14600:2;14595:3;14536:67;:::i;:::-;14529:74;;14633:34;14629:1;14624:3;14620:11;14613:55;14699:8;14694:2;14689:3;14685:12;14678:30;14734:2;14729:3;14725:12;14718:19;;14519:224;;;:::o;14749:326::-;;14912:67;14976:2;14971:3;14912:67;:::i;:::-;14905:74;;15009:30;15005:1;15000:3;14996:11;14989:51;15066:2;15061:3;15057:12;15050:19;;14895:180;;;:::o;15081:325::-;;15244:67;15308:2;15303:3;15244:67;:::i;:::-;15237:74;;15341:29;15337:1;15332:3;15328:11;15321:50;15397:2;15392:3;15388:12;15381:19;;15227:179;;;:::o;15412:330::-;;15575:67;15639:2;15634:3;15575:67;:::i;:::-;15568:74;;15672:34;15668:1;15663:3;15659:11;15652:55;15733:2;15728:3;15724:12;15717:19;;15558:184;;;:::o;15748:368::-;;15911:67;15975:2;15970:3;15911:67;:::i;:::-;15904:74;;16008:34;16004:1;15999:3;15995:11;15988:55;16074:6;16069:2;16064:3;16060:12;16053:28;16107:2;16102:3;16098:12;16091:19;;15894:222;;;:::o;16122:323::-;;16285:67;16349:2;16344:3;16285:67;:::i;:::-;16278:74;;16382:27;16378:1;16373:3;16369:11;16362:48;16436:2;16431:3;16427:12;16420:19;;16268:177;;;:::o;16451:318::-;;16614:67;16678:2;16673:3;16614:67;:::i;:::-;16607:74;;16711:22;16707:1;16702:3;16698:11;16691:43;16760:2;16755:3;16751:12;16744:19;;16597:172;;;:::o;16775:329::-;;16938:67;17002:2;16997:3;16938:67;:::i;:::-;16931:74;;17035:33;17031:1;17026:3;17022:11;17015:54;17095:2;17090:3;17086:12;17079:19;;16921:183;;;:::o;17110:328::-;;17273:67;17337:2;17332:3;17273:67;:::i;:::-;17266:74;;17370:32;17366:1;17361:3;17357:11;17350:53;17429:2;17424:3;17420:12;17413:19;;17256:182;;;:::o;17444:390::-;;17607:67;17671:2;17666:3;17607:67;:::i;:::-;17600:74;;17704:34;17700:1;17695:3;17691:11;17684:55;17770:28;17765:2;17760:3;17756:12;17749:50;17825:2;17820:3;17816:12;17809:19;;17590:244;;;:::o;17840:327::-;;18003:67;18067:2;18062:3;18003:67;:::i;:::-;17996:74;;18100:31;18096:1;18091:3;18087:11;18080:52;18158:2;18153:3;18149:12;18142:19;;17986:181;;;:::o;18173:370::-;;18336:67;18400:2;18395:3;18336:67;:::i;:::-;18329:74;;18433:34;18429:1;18424:3;18420:11;18413:55;18499:8;18494:2;18489:3;18485:12;18478:30;18534:2;18529:3;18525:12;18518:19;;18319:224;;;:::o;18549:376::-;;18712:67;18776:2;18771:3;18712:67;:::i;:::-;18705:74;;18809:34;18805:1;18800:3;18796:11;18789:55;18875:14;18870:2;18865:3;18861:12;18854:36;18916:2;18911:3;18907:12;18900:19;;18695:230;;;:::o;18931:365::-;;19094:67;19158:2;19153:3;19094:67;:::i;:::-;19087:74;;19191:34;19187:1;19182:3;19178:11;19171:55;19257:3;19252:2;19247:3;19243:12;19236:25;19287:2;19282:3;19278:12;19271:19;;19077:219;;;:::o;19302:373::-;;19465:67;19529:2;19524:3;19465:67;:::i;:::-;19458:74;;19562:34;19558:1;19553:3;19549:11;19542:55;19628:11;19623:2;19618:3;19614:12;19607:33;19666:2;19661:3;19657:12;19650:19;;19448:227;;;:::o;19681:388::-;;19844:67;19908:2;19903:3;19844:67;:::i;:::-;19837:74;;19941:34;19937:1;19932:3;19928:11;19921:55;20007:26;20002:2;19997:3;19993:12;19986:48;20060:2;20055:3;20051:12;20044:19;;19827:242;;;:::o;20075:374::-;;20238:67;20302:2;20297:3;20238:67;:::i;:::-;20231:74;;20335:34;20331:1;20326:3;20322:11;20315:55;20401:12;20396:2;20391:3;20387:12;20380:34;20440:2;20435:3;20431:12;20424:19;;20221:228;;;:::o;20455:366::-;;20618:67;20682:2;20677:3;20618:67;:::i;:::-;20611:74;;20715:34;20711:1;20706:3;20702:11;20695:55;20781:4;20776:2;20771:3;20767:12;20760:26;20812:2;20807:3;20803:12;20796:19;;20601:220;;;:::o;20827:330::-;;20990:67;21054:2;21049:3;20990:67;:::i;:::-;20983:74;;21087:34;21083:1;21078:3;21074:11;21067:55;21148:2;21143:3;21139:12;21132:19;;20973:184;;;:::o;21163:365::-;;21326:67;21390:2;21385:3;21326:67;:::i;:::-;21319:74;;21423:34;21419:1;21414:3;21410:11;21403:55;21489:3;21484:2;21479:3;21475:12;21468:25;21519:2;21514:3;21510:12;21503:19;;21309:219;;;:::o;21534:376::-;;21697:67;21761:2;21756:3;21697:67;:::i;:::-;21690:74;;21794:34;21790:1;21785:3;21781:11;21774:55;21860:14;21855:2;21850:3;21846:12;21839:36;21901:2;21896:3;21892:12;21885:19;;21680:230;;;:::o;21916:330::-;;22079:67;22143:2;22138:3;22079:67;:::i;:::-;22072:74;;22176:34;22172:1;22167:3;22163:11;22156:55;22237:2;22232:3;22228:12;22221:19;;22062:184;;;:::o;22252:373::-;;22415:67;22479:2;22474:3;22415:67;:::i;:::-;22408:74;;22512:34;22508:1;22503:3;22499:11;22492:55;22578:11;22573:2;22568:3;22564:12;22557:33;22616:2;22611:3;22607:12;22600:19;;22398:227;;;:::o;22631:379::-;;22794:67;22858:2;22853:3;22794:67;:::i;:::-;22787:74;;22891:34;22887:1;22882:3;22878:11;22871:55;22957:17;22952:2;22947:3;22943:12;22936:39;23001:2;22996:3;22992:12;22985:19;;22777:233;;;:::o;23016:367::-;;23179:67;23243:2;23238:3;23179:67;:::i;:::-;23172:74;;23276:34;23272:1;23267:3;23263:11;23256:55;23342:5;23337:2;23332:3;23328:12;23321:27;23374:2;23369:3;23365:12;23358:19;;23162:221;;;:::o;23389:365::-;;23552:67;23616:2;23611:3;23552:67;:::i;:::-;23545:74;;23649:34;23645:1;23640:3;23636:11;23629:55;23715:3;23710:2;23705:3;23701:12;23694:25;23745:2;23740:3;23736:12;23729:19;;23535:219;;;:::o;23760:320::-;;23923:67;23987:2;23982:3;23923:67;:::i;:::-;23916:74;;24020:24;24016:1;24011:3;24007:11;24000:45;24071:2;24066:3;24062:12;24055:19;;23906:174;;;:::o;24086:330::-;;24249:67;24313:2;24308:3;24249:67;:::i;:::-;24242:74;;24346:34;24342:1;24337:3;24333:11;24326:55;24407:2;24402:3;24398:12;24391:19;;24232:184;;;:::o;24422:297::-;;24602:83;24683:1;24678:3;24602:83;:::i;:::-;24595:90;;24711:1;24706:3;24702:11;24695:18;;24585:134;;;:::o;24725:381::-;;24888:67;24952:2;24947:3;24888:67;:::i;:::-;24881:74;;24985:34;24981:1;24976:3;24972:11;24965:55;25051:19;25046:2;25041:3;25037:12;25030:41;25097:2;25092:3;25088:12;25081:19;;24871:235;;;:::o;25112:327::-;;25275:67;25339:2;25334:3;25275:67;:::i;:::-;25268:74;;25372:31;25368:1;25363:3;25359:11;25352:52;25430:2;25425:3;25421:12;25414:19;;25258:181;;;:::o;25445:371::-;;25608:67;25672:2;25667:3;25608:67;:::i;:::-;25601:74;;25705:34;25701:1;25696:3;25692:11;25685:55;25771:9;25766:2;25761:3;25757:12;25750:31;25807:2;25802:3;25798:12;25791:19;;25591:225;;;:::o;25822:324::-;;25985:67;26049:2;26044:3;25985:67;:::i;:::-;25978:74;;26082:28;26078:1;26073:3;26069:11;26062:49;26137:2;26132:3;26128:12;26121:19;;25968:178;;;:::o;26152:324::-;;26315:67;26379:2;26374:3;26315:67;:::i;:::-;26308:74;;26412:28;26408:1;26403:3;26399:11;26392:49;26467:2;26462:3;26458:12;26451:19;;26298:178;;;:::o;26482:108::-;26559:24;26577:5;26559:24;:::i;:::-;26554:3;26547:37;26537:53;;:::o;26596:118::-;26683:24;26701:5;26683:24;:::i;:::-;26678:3;26671:37;26661:53;;:::o;26720:271::-;;26872:93;26961:3;26952:6;26872:93;:::i;:::-;26865:100;;26982:3;26975:10;;26854:137;;;;:::o;26997:273::-;;27150:94;27240:3;27231:6;27150:94;:::i;:::-;27143:101;;27261:3;27254:10;;27132:138;;;;:::o;27276:435::-;;27478:95;27569:3;27560:6;27478:95;:::i;:::-;27471:102;;27590:95;27681:3;27672:6;27590:95;:::i;:::-;27583:102;;27702:3;27695:10;;27460:251;;;;;:::o;27717:379::-;;27923:147;28066:3;27923:147;:::i;:::-;27916:154;;28087:3;28080:10;;27905:191;;;:::o;28102:222::-;;28233:2;28222:9;28218:18;28210:26;;28246:71;28314:1;28303:9;28299:17;28290:6;28246:71;:::i;:::-;28200:124;;;;:::o;28330:672::-;;28579:3;28568:9;28564:19;28556:27;;28593:87;28677:1;28666:9;28662:17;28653:6;28593:87;:::i;:::-;28690:72;28758:2;28747:9;28743:18;28734:6;28690:72;:::i;:::-;28772;28840:2;28829:9;28825:18;28816:6;28772:72;:::i;:::-;28891:9;28885:4;28881:20;28876:2;28865:9;28861:18;28854:48;28919:76;28990:4;28981:6;28919:76;:::i;:::-;28911:84;;28546:456;;;;;;;:::o;29008:549::-;;29223:2;29212:9;29208:18;29200:26;;29236:79;29312:1;29301:9;29297:17;29288:6;29236:79;:::i;:::-;29325:72;29393:2;29382:9;29378:18;29369:6;29325:72;:::i;:::-;29444:9;29438:4;29434:20;29429:2;29418:9;29414:18;29407:48;29472:78;29545:4;29536:6;29472:78;:::i;:::-;29464:86;;29190:367;;;;;;:::o;29563:332::-;;29722:2;29711:9;29707:18;29699:26;;29735:71;29803:1;29792:9;29788:17;29779:6;29735:71;:::i;:::-;29816:72;29884:2;29873:9;29869:18;29860:6;29816:72;:::i;:::-;29689:206;;;;;:::o;29901:413::-;;30102:2;30091:9;30087:18;30079:26;;30151:9;30145:4;30141:20;30137:1;30126:9;30122:17;30115:47;30179:128;30302:4;30293:6;30179:128;:::i;:::-;30171:136;;30069:245;;;;:::o;30320:373::-;;30501:2;30490:9;30486:18;30478:26;;30550:9;30544:4;30540:20;30536:1;30525:9;30521:17;30514:47;30578:108;30681:4;30672:6;30578:108;:::i;:::-;30570:116;;30468:225;;;;:::o;30699:210::-;;30824:2;30813:9;30809:18;30801:26;;30837:65;30899:1;30888:9;30884:17;30875:6;30837:65;:::i;:::-;30791:118;;;;:::o;30915:313::-;;31066:2;31055:9;31051:18;31043:26;;31115:9;31109:4;31105:20;31101:1;31090:9;31086:17;31079:47;31143:78;31216:4;31207:6;31143:78;:::i;:::-;31135:86;;31033:195;;;;:::o;31234:307::-;;31382:2;31371:9;31367:18;31359:26;;31431:9;31425:4;31421:20;31417:1;31406:9;31402:17;31395:47;31459:75;31529:4;31520:6;31459:75;:::i;:::-;31451:83;;31349:192;;;;:::o;31547:419::-;;31751:2;31740:9;31736:18;31728:26;;31800:9;31794:4;31790:20;31786:1;31775:9;31771:17;31764:47;31828:131;31954:4;31828:131;:::i;:::-;31820:139;;31718:248;;;:::o;31972:419::-;;32176:2;32165:9;32161:18;32153:26;;32225:9;32219:4;32215:20;32211:1;32200:9;32196:17;32189:47;32253:131;32379:4;32253:131;:::i;:::-;32245:139;;32143:248;;;:::o;32397:419::-;;32601:2;32590:9;32586:18;32578:26;;32650:9;32644:4;32640:20;32636:1;32625:9;32621:17;32614:47;32678:131;32804:4;32678:131;:::i;:::-;32670:139;;32568:248;;;:::o;32822:419::-;;33026:2;33015:9;33011:18;33003:26;;33075:9;33069:4;33065:20;33061:1;33050:9;33046:17;33039:47;33103:131;33229:4;33103:131;:::i;:::-;33095:139;;32993:248;;;:::o;33247:419::-;;33451:2;33440:9;33436:18;33428:26;;33500:9;33494:4;33490:20;33486:1;33475:9;33471:17;33464:47;33528:131;33654:4;33528:131;:::i;:::-;33520:139;;33418:248;;;:::o;33672:419::-;;33876:2;33865:9;33861:18;33853:26;;33925:9;33919:4;33915:20;33911:1;33900:9;33896:17;33889:47;33953:131;34079:4;33953:131;:::i;:::-;33945:139;;33843:248;;;:::o;34097:419::-;;34301:2;34290:9;34286:18;34278:26;;34350:9;34344:4;34340:20;34336:1;34325:9;34321:17;34314:47;34378:131;34504:4;34378:131;:::i;:::-;34370:139;;34268:248;;;:::o;34522:419::-;;34726:2;34715:9;34711:18;34703:26;;34775:9;34769:4;34765:20;34761:1;34750:9;34746:17;34739:47;34803:131;34929:4;34803:131;:::i;:::-;34795:139;;34693:248;;;:::o;34947:419::-;;35151:2;35140:9;35136:18;35128:26;;35200:9;35194:4;35190:20;35186:1;35175:9;35171:17;35164:47;35228:131;35354:4;35228:131;:::i;:::-;35220:139;;35118:248;;;:::o;35372:419::-;;35576:2;35565:9;35561:18;35553:26;;35625:9;35619:4;35615:20;35611:1;35600:9;35596:17;35589:47;35653:131;35779:4;35653:131;:::i;:::-;35645:139;;35543:248;;;:::o;35797:419::-;;36001:2;35990:9;35986:18;35978:26;;36050:9;36044:4;36040:20;36036:1;36025:9;36021:17;36014:47;36078:131;36204:4;36078:131;:::i;:::-;36070:139;;35968:248;;;:::o;36222:419::-;;36426:2;36415:9;36411:18;36403:26;;36475:9;36469:4;36465:20;36461:1;36450:9;36446:17;36439:47;36503:131;36629:4;36503:131;:::i;:::-;36495:139;;36393:248;;;:::o;36647:419::-;;36851:2;36840:9;36836:18;36828:26;;36900:9;36894:4;36890:20;36886:1;36875:9;36871:17;36864:47;36928:131;37054:4;36928:131;:::i;:::-;36920:139;;36818:248;;;:::o;37072:419::-;;37276:2;37265:9;37261:18;37253:26;;37325:9;37319:4;37315:20;37311:1;37300:9;37296:17;37289:47;37353:131;37479:4;37353:131;:::i;:::-;37345:139;;37243:248;;;:::o;37497:419::-;;37701:2;37690:9;37686:18;37678:26;;37750:9;37744:4;37740:20;37736:1;37725:9;37721:17;37714:47;37778:131;37904:4;37778:131;:::i;:::-;37770:139;;37668:248;;;:::o;37922:419::-;;38126:2;38115:9;38111:18;38103:26;;38175:9;38169:4;38165:20;38161:1;38150:9;38146:17;38139:47;38203:131;38329:4;38203:131;:::i;:::-;38195:139;;38093:248;;;:::o;38347:419::-;;38551:2;38540:9;38536:18;38528:26;;38600:9;38594:4;38590:20;38586:1;38575:9;38571:17;38564:47;38628:131;38754:4;38628:131;:::i;:::-;38620:139;;38518:248;;;:::o;38772:419::-;;38976:2;38965:9;38961:18;38953:26;;39025:9;39019:4;39015:20;39011:1;39000:9;38996:17;38989:47;39053:131;39179:4;39053:131;:::i;:::-;39045:139;;38943:248;;;:::o;39197:419::-;;39401:2;39390:9;39386:18;39378:26;;39450:9;39444:4;39440:20;39436:1;39425:9;39421:17;39414:47;39478:131;39604:4;39478:131;:::i;:::-;39470:139;;39368:248;;;:::o;39622:419::-;;39826:2;39815:9;39811:18;39803:26;;39875:9;39869:4;39865:20;39861:1;39850:9;39846:17;39839:47;39903:131;40029:4;39903:131;:::i;:::-;39895:139;;39793:248;;;:::o;40047:419::-;;40251:2;40240:9;40236:18;40228:26;;40300:9;40294:4;40290:20;40286:1;40275:9;40271:17;40264:47;40328:131;40454:4;40328:131;:::i;:::-;40320:139;;40218:248;;;:::o;40472:419::-;;40676:2;40665:9;40661:18;40653:26;;40725:9;40719:4;40715:20;40711:1;40700:9;40696:17;40689:47;40753:131;40879:4;40753:131;:::i;:::-;40745:139;;40643:248;;;:::o;40897:419::-;;41101:2;41090:9;41086:18;41078:26;;41150:9;41144:4;41140:20;41136:1;41125:9;41121:17;41114:47;41178:131;41304:4;41178:131;:::i;:::-;41170:139;;41068:248;;;:::o;41322:419::-;;41526:2;41515:9;41511:18;41503:26;;41575:9;41569:4;41565:20;41561:1;41550:9;41546:17;41539:47;41603:131;41729:4;41603:131;:::i;:::-;41595:139;;41493:248;;;:::o;41747:419::-;;41951:2;41940:9;41936:18;41928:26;;42000:9;41994:4;41990:20;41986:1;41975:9;41971:17;41964:47;42028:131;42154:4;42028:131;:::i;:::-;42020:139;;41918:248;;;:::o;42172:419::-;;42376:2;42365:9;42361:18;42353:26;;42425:9;42419:4;42415:20;42411:1;42400:9;42396:17;42389:47;42453:131;42579:4;42453:131;:::i;:::-;42445:139;;42343:248;;;:::o;42597:419::-;;42801:2;42790:9;42786:18;42778:26;;42850:9;42844:4;42840:20;42836:1;42825:9;42821:17;42814:47;42878:131;43004:4;42878:131;:::i;:::-;42870:139;;42768:248;;;:::o;43022:419::-;;43226:2;43215:9;43211:18;43203:26;;43275:9;43269:4;43265:20;43261:1;43250:9;43246:17;43239:47;43303:131;43429:4;43303:131;:::i;:::-;43295:139;;43193:248;;;:::o;43447:419::-;;43651:2;43640:9;43636:18;43628:26;;43700:9;43694:4;43690:20;43686:1;43675:9;43671:17;43664:47;43728:131;43854:4;43728:131;:::i;:::-;43720:139;;43618:248;;;:::o;43872:419::-;;44076:2;44065:9;44061:18;44053:26;;44125:9;44119:4;44115:20;44111:1;44100:9;44096:17;44089:47;44153:131;44279:4;44153:131;:::i;:::-;44145:139;;44043:248;;;:::o;44297:419::-;;44501:2;44490:9;44486:18;44478:26;;44550:9;44544:4;44540:20;44536:1;44525:9;44521:17;44514:47;44578:131;44704:4;44578:131;:::i;:::-;44570:139;;44468:248;;;:::o;44722:419::-;;44926:2;44915:9;44911:18;44903:26;;44975:9;44969:4;44965:20;44961:1;44950:9;44946:17;44939:47;45003:131;45129:4;45003:131;:::i;:::-;44995:139;;44893:248;;;:::o;45147:419::-;;45351:2;45340:9;45336:18;45328:26;;45400:9;45394:4;45390:20;45386:1;45375:9;45371:17;45364:47;45428:131;45554:4;45428:131;:::i;:::-;45420:139;;45318:248;;;:::o;45572:419::-;;45776:2;45765:9;45761:18;45753:26;;45825:9;45819:4;45815:20;45811:1;45800:9;45796:17;45789:47;45853:131;45979:4;45853:131;:::i;:::-;45845:139;;45743:248;;;:::o;45997:419::-;;46201:2;46190:9;46186:18;46178:26;;46250:9;46244:4;46240:20;46236:1;46225:9;46221:17;46214:47;46278:131;46404:4;46278:131;:::i;:::-;46270:139;;46168:248;;;:::o;46422:222::-;;46553:2;46542:9;46538:18;46530:26;;46566:71;46634:1;46623:9;46619:17;46610:6;46566:71;:::i;:::-;46520:124;;;;:::o;46650:278::-;;46716:2;46710:9;46700:19;;46758:4;46750:6;46746:17;46865:6;46853:10;46850:22;46829:18;46817:10;46814:34;46811:62;46808:2;;;46876:13;;:::i;:::-;46808:2;46911:10;46907:2;46900:22;46690:238;;;;:::o;46934:326::-;;47085:18;47077:6;47074:30;47071:2;;;47107:13;;:::i;:::-;47071:2;47187:4;47183:9;47176:4;47168:6;47164:17;47160:33;47152:41;;47248:4;47242;47238:15;47230:23;;47000:260;;;:::o;47266:327::-;;47418:18;47410:6;47407:30;47404:2;;;47440:13;;:::i;:::-;47404:2;47520:4;47516:9;47509:4;47501:6;47497:17;47493:33;47485:41;;47581:4;47575;47571:15;47563:23;;47333:260;;;:::o;47599:142::-;;47699:3;47691:11;;47729:4;47724:3;47720:14;47712:22;;47681:60;;;:::o;47747:132::-;;47837:3;47829:11;;47867:4;47862:3;47858:14;47850:22;;47819:60;;;:::o;47885:144::-;;47960:3;47952:11;;47983:3;47980:1;47973:14;48017:4;48014:1;48004:18;47996:26;;47942:87;;;:::o;48035:141::-;;48107:3;48099:11;;48130:3;48127:1;48120:14;48164:4;48161:1;48151:18;48143:26;;48089:87;;;:::o;48182:124::-;;48293:5;48287:12;48277:22;;48266:40;;;:::o;48312:114::-;;48413:5;48407:12;48397:22;;48386:40;;;:::o;48432:98::-;;48517:5;48511:12;48501:22;;48490:40;;;:::o;48536:99::-;;48622:5;48616:12;48606:22;;48595:40;;;:::o;48641:123::-;;48753:4;48748:3;48744:14;48736:22;;48726:38;;;:::o;48770:113::-;;48872:4;48867:3;48863:14;48855:22;;48845:38;;;:::o;48889:194::-;;49032:6;49027:3;49020:19;49072:4;49067:3;49063:14;49048:29;;49010:73;;;;:::o;49089:184::-;;49222:6;49217:3;49210:19;49262:4;49257:3;49253:14;49238:29;;49200:73;;;;:::o;49279:168::-;;49396:6;49391:3;49384:19;49436:4;49431:3;49427:14;49412:29;;49374:73;;;;:::o;49453:147::-;;49591:3;49576:18;;49566:34;;;;:::o;49606:159::-;;49714:6;49709:3;49702:19;49754:4;49749:3;49745:14;49730:29;;49692:73;;;;:::o;49771:169::-;;49889:6;49884:3;49877:19;49929:4;49924:3;49920:14;49905:29;;49867:73;;;;:::o;49946:148::-;;50085:3;50070:18;;50060:34;;;;:::o;50100:96::-;;50166:24;50184:5;50166:24;:::i;:::-;50155:35;;50145:51;;;:::o;50202:104::-;;50276:24;50294:5;50276:24;:::i;:::-;50265:35;;50255:51;;;:::o;50312:90::-;;50389:5;50382:13;50375:21;50364:32;;50354:48;;;:::o;50408:77::-;;50474:5;50463:16;;50453:32;;;:::o;50491:149::-;;50567:66;50560:5;50556:78;50545:89;;50535:105;;;:::o;50646:126::-;;50723:42;50716:5;50712:54;50701:65;;50691:81;;;:::o;50778:77::-;;50844:5;50833:16;;50823:32;;;:::o;50861:134::-;;50952:37;50983:5;50952:37;:::i;:::-;50939:50;;50929:66;;;:::o;51001:126::-;;51084:37;51115:5;51084:37;:::i;:::-;51071:50;;51061:66;;;:::o;51133:113::-;;51216:24;51234:5;51216:24;:::i;:::-;51203:37;;51193:53;;;:::o;51252:154::-;51336:6;51331:3;51326;51313:30;51398:1;51389:6;51384:3;51380:16;51373:27;51303:103;;;:::o;51412:307::-;51480:1;51490:113;51504:6;51501:1;51498:13;51490:113;;;51589:1;51584:3;51580:11;51574:18;51570:1;51565:3;51561:11;51554:39;51526:2;51523:1;51519:10;51514:15;;51490:113;;;51621:6;51618:1;51615:13;51612:2;;;51701:1;51692:6;51687:3;51683:16;51676:27;51612:2;51461:258;;;;:::o;51725:48::-;51758:9;51779:102;;51871:2;51867:7;51862:2;51855:5;51851:14;51847:28;51837:38;;51827:54;;;:::o;51887:122::-;51960:24;51978:5;51960:24;:::i;:::-;51953:5;51950:35;51940:2;;51999:1;51996;51989:12;51940:2;51930:79;:::o;52015:116::-;52085:21;52100:5;52085:21;:::i;:::-;52078:5;52075:32;52065:2;;52121:1;52118;52111:12;52065:2;52055:76;:::o;52137:122::-;52210:24;52228:5;52210:24;:::i;:::-;52203:5;52200:35;52190:2;;52249:1;52246;52239:12;52190:2;52180:79;:::o;52265:120::-;52337:23;52354:5;52337:23;:::i;:::-;52330:5;52327:34;52317:2;;52375:1;52372;52365:12;52317:2;52307:78;:::o;52391:122::-;52464:24;52482:5;52464:24;:::i;:::-;52457:5;52454:35;52444:2;;52503:1;52500;52493:12;52444:2;52434:79;:::o
Swarm Source
ipfs://8dd674adf443fb9d7458d8812ddc3a858adba2f51fe3758dc0777f1c42dee672
Loading...
Loading
Loading...
Loading
Net Worth in USD
$466.11
Net Worth in ETH
0.24
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $1,942.14 | 0.24 | $466.11 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.