Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 38 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Claim Holdings | 14411418 | 1438 days ago | IN | 0 ETH | 0.00191257 | ||||
| Create NFT | 14365286 | 1445 days ago | IN | 0.02 ETH | 0.00334936 | ||||
| Transfer From | 14319714 | 1452 days ago | IN | 0 ETH | 0.00196355 | ||||
| Claim Holdings | 14295448 | 1456 days ago | IN | 0 ETH | 0.00233288 | ||||
| Create NFT | 14295431 | 1456 days ago | IN | 0.02 ETH | 0.01184339 | ||||
| Transfer From | 14287416 | 1457 days ago | IN | 0 ETH | 0.00203817 | ||||
| Create NFT | 14264192 | 1461 days ago | IN | 0.02 ETH | 0.00929984 | ||||
| Create NFT | 14244410 | 1464 days ago | IN | 0.02 ETH | 0.00855129 | ||||
| Claim Holdings | 14242045 | 1464 days ago | IN | 0 ETH | 0.00147875 | ||||
| Transfer From | 14241976 | 1464 days ago | IN | 0 ETH | 0.00414905 | ||||
| Create NFT | 14238758 | 1465 days ago | IN | 0.02 ETH | 0.00982296 | ||||
| Create NFT | 14238026 | 1465 days ago | IN | 0.02 ETH | 0.01128725 | ||||
| Create NFT | 14236216 | 1465 days ago | IN | 0.02 ETH | 0.00609135 | ||||
| Transfer From | 14218458 | 1468 days ago | IN | 0 ETH | 0.00792842 | ||||
| Claim Holdings | 14212193 | 1469 days ago | IN | 0 ETH | 0.00196276 | ||||
| Create NFT | 14212167 | 1469 days ago | IN | 0.02 ETH | 0.00846132 | ||||
| Transfer From | 14211479 | 1469 days ago | IN | 0 ETH | 0.00601112 | ||||
| Create NFT | 14211247 | 1469 days ago | IN | 0.02 ETH | 0.00274447 | ||||
| Claim Holdings | 14210693 | 1469 days ago | IN | 0 ETH | 0.00166062 | ||||
| Create NFT | 14210684 | 1469 days ago | IN | 0.02 ETH | 0.00741676 | ||||
| Transfer From | 14210330 | 1469 days ago | IN | 0 ETH | 0.00465295 | ||||
| Transfer From | 14209659 | 1469 days ago | IN | 0 ETH | 0.00381772 | ||||
| Create NFT | 14206958 | 1470 days ago | IN | 0.02 ETH | 0.01028563 | ||||
| Set Mint Cost | 14206765 | 1470 days ago | IN | 0 ETH | 0.00153975 | ||||
| Claim Holdings | 14206647 | 1470 days ago | IN | 0 ETH | 0.00195946 |
Latest 8 internal transactions
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
M4DScientistNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-02-13
*/
/**
*Submitted for verification at Etherscan.io on 2021-11-13
*/
pragma solidity ^0.8.0;
// File: @openzeppelin/contracts/utils/math/SafeMath.sol
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
pragma solidity ^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.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/extensions/IERC721Enumerable.sol
pragma solidity ^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/utils/introspection/ERC165.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal 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);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File: @openzeppelin/contracts/utils/Context.sol
pragma solidity ^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 meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/security/Pausable.sol
pragma solidity ^0.8.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity ^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;
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");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
pragma solidity ^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/IERC721Receiver.sol
pragma solidity ^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/access/Ownable.sol
pragma solidity ^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() {
_setOwner(_msgSender());
}
function setOwnableConstructor() internal {
_setOwner(_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 {
_setOwner(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");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// 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;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function proxyConstructor(string memory name_, string memory symbol_) internal {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @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 _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @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 baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @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 || 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 _owners[tokenId] != address(0);
}
/**
* @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 || isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `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);
_balances[to] += 1;
_owners[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);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[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");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @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()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @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` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
pragma solidity ^0.8.0;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @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 override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
contract Proxiable {
// Code position in storage is keccak256("PROXIABLE") = "0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7"
function updateCodeAddress(address newAddress) internal {
require(
bytes32(0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7) == Proxiable(newAddress).proxiableUUID(),
"Not compatible"
);
assembly { // solium-disable-line
sstore(0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7, newAddress)
}
}
function proxiableUUID() public pure returns (bytes32) {
return 0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7;
}
}
contract LibraryLockDataLayout {
bool public initialized = false;
}
contract LibraryLock is LibraryLockDataLayout {
// Ensures no one can manipulate the Logic Contract once it is deployed.
// PARITY WALLET HACK PREVENTION
modifier delegatedOnly() {
require(initialized == true, "The library is locked. No direct 'call' is allowed");
_;
}
function initialize() internal {
initialized = true;
}
}
contract DataLayout is LibraryLock {
address public ownerCopy;
string public gateWay;
uint256 public mintCost;
mapping(uint256=> string) public CIDMappings;
uint256 public _tokenIds;
address public developmentManager;
uint256 public mintLimit;
uint256 public launchTime;
bool public isLimiting;
string public baseURI;
mapping(address => bool) public mintWhitelist;
bool public inWhitelistMode;
}
contract M4DScientistNFT is ERC721Enumerable, DataLayout, Proxiable, Ownable {
using SafeMath for uint256;
constructor() ERC721("M4D Scientist", "M4D SCIENTIST") {
setOwnableConstructor();
}
receive() external payable {
}
function NFTConstructor(address _manager) public payable {
require(!initialized);
developmentManager = _manager;
gateWay = "https://m4dscientist.mypinata.cloud/ipfs/";
proxyConstructor("M4D Scientists", "M4D");
mintCost = 0.03 ether;
mintLimit = 2000;
launchTime = block.timestamp;
setOwnableConstructor();
ownerCopy = owner();
initialize();
}
function updateCode(address newCode) public onlyOwner delegatedOnly {
updateCodeAddress(newCode);
}
function syncOwner() public {
if (ownerCopy == msg.sender) {
setOwnableConstructor();
}
}
function setMintWhitelist(address[] memory _addresses, bool direction) public onlyOwner {
for(uint i; i < _addresses.length; i++) {
mintWhitelist[_addresses[i]] = direction;
}
}
function setWhitelistMode(bool _inWhitelistingOnly) public onlyOwner {
inWhitelistMode = _inWhitelistingOnly;
}
function setMintLimit(uint256 limit) public onlyOwner {
require(limit > _tokenIds, "Limit cannot be less than minted amount");
mintLimit = limit;
}
function setName(string memory _name, string memory _symbol) public onlyOwner {
proxyConstructor(_name, _symbol);
}
function setIsLimiting(bool _direction) public onlyOwner {
isLimiting = _direction;
}
function setBaseURI(string memory _baseURI) public onlyOwner {
baseURI = _baseURI;
}
function checkLimit() public view returns(bool) {
if (isLimiting) {
if (block.timestamp.sub(launchTime) < 24 hours) {
if (_tokenIds >= 1000) {
return true;
}
}
} else {
return false;
}
}
function setMintCost(uint256 cost) public onlyOwner {
mintCost = cost;
}
function createNFTs(string memory CID, uint256 startID, uint256 endID) public onlyOwner {
for(uint256 i = startID; i <= endID; i++) {
CIDMappings[i] = CID;
}
}
function setDevelopmentManager(address manager) public onlyOwner {
developmentManager = manager;
}
function setSpecificCID(uint256 _id, string memory _CID) public onlyOwner {
CIDMappings[_id] = _CID;
}
function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
if (_i == 0) {
return "0";
}
uint j = _i;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len;
while (_i != 0) {
k = k-1;
uint8 temp = (48 + uint8(_i - _i / 10 * 10));
bytes1 b1 = bytes1(temp);
bstr[k] = b1;
_i /= 10;
}
return string(bstr);
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
//use tokenId to determine NFT level
bytes memory tempEmptyStringTest = bytes(CIDMappings[tokenId]);
string memory dynamicCID;
if ((keccak256(abi.encodePacked((CIDMappings[tokenId]))) == keccak256(abi.encodePacked(("test")))) || (tempEmptyStringTest.length == 0)) {
dynamicCID = CIDMappings[1000000000000000000];
} else {
dynamicCID = CIDMappings[tokenId];
}
string memory URI = string(abi.encodePacked(baseURI, dynamicCID, "/", uint2str(uint(tokenId)), ".json"));
return URI;
}
function createNFT(uint amount, address claimer, bool ownerMint) public payable delegatedOnly {
require(!checkLimit(), "Daily mint limit reached");
if (inWhitelistMode) {
require(mintWhitelist[msg.sender], "Only whitelisted addresses can mint");
}
if (!ownerMint) {
require(amount > 0 && amount <= 10, "Invalid mint amount");
require(msg.value == mintCost.mul(amount), "Invalid message value");
} else {
require(msg.sender == owner());
}
for (uint256 i = 1; i <= amount; i++) {
_tokenIds = _tokenIds.add(1);
require(_tokenIds <= mintLimit, "Mint limit reached");
_mint(claimer, _tokenIds);
}
}
function claimHoldings() public {
require(msg.sender == developmentManager, "Unauthorized claim");
payable(msg.sender).transfer(address(this).balance);
}
}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":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"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"CIDMappings","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"NFTConstructor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_tokenIds","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":[],"name":"checkLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimHoldings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"claimer","type":"address"},{"internalType":"bool","name":"ownerMint","type":"bool"}],"name":"createNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"CID","type":"string"},{"internalType":"uint256","name":"startID","type":"uint256"},{"internalType":"uint256","name":"endID","type":"uint256"}],"name":"createNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gateWay","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inWhitelistMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isLimiting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"ownerCopy","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":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","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":[{"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":"address","name":"manager","type":"address"}],"name":"setDevelopmentManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_direction","type":"bool"}],"name":"setIsLimiting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cost","type":"uint256"}],"name":"setMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"bool","name":"direction","type":"bool"}],"name":"setMintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_CID","type":"string"}],"name":"setSpecificCID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_inWhitelistingOnly","type":"bool"}],"name":"setWhitelistMode","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":[],"name":"syncOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"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":"address","name":"newCode","type":"address"}],"name":"updateCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526000600a60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600d81526020017f4d344420536369656e74697374000000000000000000000000000000000000008152506040518060400160405280600d81526020017f4d344420534349454e54495354000000000000000000000000000000000000008152508160009080519060200190620000b1929190620001f3565b508060019080519060200190620000ca929190620001f3565b505050620000ed620000e16200010360201b60201c565b6200010b60201b60201c565b620000fd620001d160201b60201c565b62000308565b600033905090565b6000601560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081601560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001f1620001e56200010360201b60201c565b6200010b60201b60201c565b565b8280546200020190620002a3565b90600052602060002090601f01602090048101928262000225576000855562000271565b82601f106200024057805160ff191683800117855562000271565b8280016001018555821562000271579182015b828111156200027057825182559160200191906001019062000253565b5b50905062000280919062000284565b5090565b5b808211156200029f57600081600090555060010162000285565b5090565b60006002820490506001821680620002bc57607f821691505b60208210811415620002d357620002d2620002d9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61585a80620003186000396000f3fe6080604052600436106102b25760003560e01c80636c0360eb11610175578063996517cf116100dc578063c3a2710111610095578063e78e3ac81161006f578063e78e3ac814610a79578063e985e9c514610aa2578063e9cea2fb14610adf578063f2fde38b14610b08576102b9565b8063c3a27101146109fa578063c87b56dd14610a25578063e683029014610a62576102b9565b8063996517cf146108fe5780639e6a1d7d14610929578063a22cb46514610952578063aa46a4001461097b578063b88d4fde146109a6578063bdb4b848146109cf576102b9565b8063790ca4131161012e578063790ca413146108025780638545f4ea1461082d57806388eca516146108565780638a53ffff1461087f5780638da5cb5b146108a857806395d89b41146108d3576102b9565b80636c0360eb146106ff5780636f3d02e11461072a5780636f66adb51461076757806370a0823114610792578063715018a6146107cf5780637188897a146107e6576102b9565b80632f745c591161021957806352d1902d116101d257806352d1902d146105ef57806355f804b31461061a57806356f4720d146106435780635759ed891461066e5780635c707f07146106995780636352211e146106c2576102b9565b80632f745c59146104cf578063425bc1e91461050c57806342842e0e14610535578063469519541461055e5780634f6ccce7146105875780635052ab3c146105c4576102b9565b80630c598fc51161026b5780630c598fc5146103f2578063158ef93e1461040957806318160ddd1461043457806323b872dd1461045f5780632593626c14610488578063293d6987146104a4576102b9565b806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b3146103635780630a190db61461038c5780630ba84e85146103b5576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102e560048036038101906102e09190613f27565b610b31565b6040516102f291906147bc565b60405180910390f35b34801561030757600080fd5b50610310610bab565b60405161031d91906147f2565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906140b1565b610c3d565b60405161035a9190614755565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613e31565b610cc2565b005b34801561039857600080fd5b506103b360048036038101906103ae9190613cae565b610dda565b005b3480156103c157600080fd5b506103dc60048036038101906103d79190613cae565b610e9a565b6040516103e991906147bc565b60405180910390f35b3480156103fe57600080fd5b50610407610eba565b005b34801561041557600080fd5b5061041e610f1b565b60405161042b91906147bc565b60405180910390f35b34801561044057600080fd5b50610449610f2e565b6040516104569190614b54565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190613d1b565b610f3b565b005b6104a2600480360381019061049d9190613cae565b610f9b565b005b3480156104b057600080fd5b506104b9611112565b6040516104c691906147bc565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613e31565b611125565b6040516105039190614b54565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190613ecd565b6111ca565b005b34801561054157600080fd5b5061055c60048036038101906105579190613d1b565b611263565b005b34801561056a57600080fd5b5061058560048036038101906105809190613cae565b611283565b005b34801561059357600080fd5b506105ae60048036038101906105a991906140b1565b611361565b6040516105bb9190614b54565b60405180910390f35b3480156105d057600080fd5b506105d96113d2565b6040516105e69190614755565b60405180910390f35b3480156105fb57600080fd5b506106046113f8565b60405161061191906147d7565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613f81565b611423565b005b34801561064f57600080fd5b506106586114b9565b60405161066591906147bc565b60405180910390f35b34801561067a57600080fd5b50610683611516565b60405161069091906147bc565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190613fca565b611529565b005b3480156106ce57600080fd5b506106e960048036038101906106e491906140b1565b6115b3565b6040516106f69190614755565b60405180910390f35b34801561070b57600080fd5b50610714611665565b60405161072191906147f2565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c91906140b1565b6116f3565b60405161075e91906147f2565b60405180910390f35b34801561077357600080fd5b5061077c611793565b6040516107899190614755565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b49190613cae565b6117b9565b6040516107c69190614b54565b60405180910390f35b3480156107db57600080fd5b506107e4611871565b005b61080060048036038101906107fb91906140de565b6118f9565b005b34801561080e57600080fd5b50610817611bbf565b6040516108249190614b54565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f91906140b1565b611bc5565b005b34801561086257600080fd5b5061087d60048036038101906108789190613e71565b611c4b565b005b34801561088b57600080fd5b506108a660048036038101906108a19190614131565b611d5c565b005b3480156108b457600080fd5b506108bd611e04565b6040516108ca9190614755565b60405180910390f35b3480156108df57600080fd5b506108e8611e2e565b6040516108f591906147f2565b60405180910390f35b34801561090a57600080fd5b50610913611ec0565b6040516109209190614b54565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b91906140b1565b611ec6565b005b34801561095e57600080fd5b5061097960048036038101906109749190613df1565b611f90565b005b34801561098757600080fd5b50610990612111565b60405161099d9190614b54565b60405180910390f35b3480156109b257600080fd5b506109cd60048036038101906109c89190613d6e565b612117565b005b3480156109db57600080fd5b506109e4612179565b6040516109f19190614b54565b60405180910390f35b348015610a0657600080fd5b50610a0f61217f565b604051610a1c91906147f2565b60405180910390f35b348015610a3157600080fd5b50610a4c6004803603810190610a4791906140b1565b61220d565b604051610a5991906147f2565b60405180910390f35b348015610a6e57600080fd5b50610a776124a7565b005b348015610a8557600080fd5b50610aa06004803603810190610a9b9190613ecd565b612580565b005b348015610aae57600080fd5b50610ac96004803603810190610ac49190613cdb565b612619565b604051610ad691906147bc565b60405180910390f35b348015610aeb57600080fd5b50610b066004803603810190610b019190614042565b6126ad565b005b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190613cae565b612777565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba45750610ba38261286f565b5b9050919050565b606060008054610bba90614e93565b80601f0160208091040260200160405190810160405280929190818152602001828054610be690614e93565b8015610c335780601f10610c0857610100808354040283529160200191610c33565b820191906000526020600020905b815481529060010190602001808311610c1657829003601f168201915b5050505050905090565b6000610c4882612951565b610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e906149f4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ccd826115b3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590614a74565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d5d6129bd565b73ffffffffffffffffffffffffffffffffffffffff161480610d8c5750610d8b81610d866129bd565b612619565b5b610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc290614974565b60405180910390fd5b610dd583836129c5565b505050565b610de26129bd565b73ffffffffffffffffffffffffffffffffffffffff16610e00611e04565b73ffffffffffffffffffffffffffffffffffffffff1614610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d90614a14565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60146020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f1957610f18612a7e565b5b565b600a60009054906101000a900460ff1681565b6000600880549050905090565b610f4c610f466129bd565b82612a90565b610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8290614a94565b60405180910390fd5b610f96838383612b6e565b505050565b600a60009054906101000a900460ff1615610fb557600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060600160405280602981526020016157fc60299139600b9080519060200190611024929190613a0f565b506110996040518060400160405280600e81526020017f4d344420536369656e74697374730000000000000000000000000000000000008152506040518060400160405280600381526020017f4d34440000000000000000000000000000000000000000000000000000000000815250612dca565b666a94d74f430000600c819055506107d0601081905550426011819055506110bf612a7e565b6110c7611e04565b600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061110f612dfc565b50565b601560009054906101000a900460ff1681565b6000611130836117b9565b8210611171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116890614854565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6111d26129bd565b73ffffffffffffffffffffffffffffffffffffffff166111f0611e04565b73ffffffffffffffffffffffffffffffffffffffff1614611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d90614a14565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b61127e83838360405180602001604052806000815250612117565b505050565b61128b6129bd565b73ffffffffffffffffffffffffffffffffffffffff166112a9611e04565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690614a14565b60405180910390fd5b60011515600a60009054906101000a900460ff16151514611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90614b34565b60405180910390fd5b61135e81612e19565b50565b600061136b610f2e565b82106113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614ad4565b60405180910390fd5b600882815481106113c0576113bf614ffb565b5b90600052602060002001549050919050565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf760001b905090565b61142b6129bd565b73ffffffffffffffffffffffffffffffffffffffff16611449611e04565b73ffffffffffffffffffffffffffffffffffffffff161461149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690614a14565b60405180910390fd5b80601390805190602001906114b5929190613a0f565b5050565b6000601260009054906101000a900460ff161561150957620151806114e960115442612f2190919063ffffffff16565b1015611504576103e8600e54106115035760019050611513565b5b611512565b60009050611513565b5b90565b601260009054906101000a900460ff1681565b6115316129bd565b73ffffffffffffffffffffffffffffffffffffffff1661154f611e04565b73ffffffffffffffffffffffffffffffffffffffff16146115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90614a14565b60405180910390fd5b6115af8282612dca565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561165c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611653906149b4565b60405180910390fd5b80915050919050565b6013805461167290614e93565b80601f016020809104026020016040519081016040528092919081815260200182805461169e90614e93565b80156116eb5780601f106116c0576101008083540402835291602001916116eb565b820191906000526020600020905b8154815290600101906020018083116116ce57829003601f168201915b505050505081565b600d602052806000526040600020600091509050805461171290614e93565b80601f016020809104026020016040519081016040528092919081815260200182805461173e90614e93565b801561178b5780601f106117605761010080835404028352916020019161178b565b820191906000526020600020905b81548152906001019060200180831161176e57829003601f168201915b505050505081565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561182a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182190614994565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118796129bd565b73ffffffffffffffffffffffffffffffffffffffff16611897611e04565b73ffffffffffffffffffffffffffffffffffffffff16146118ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e490614a14565b60405180910390fd5b6118f76000612f37565b565b60011515600a60009054906101000a900460ff1615151461194f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194690614b34565b60405180910390fd5b6119576114b9565b15611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90614934565b60405180910390fd5b601560009054906101000a900460ff1615611a3957601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f90614a54565b60405180910390fd5b5b80611ae957600083118015611a4f5750600a8311155b611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8590614ab4565b60405180910390fd5b611aa383600c54612ffd90919063ffffffff16565b3414611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb90614b14565b60405180910390fd5b611b29565b611af1611e04565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b2857600080fd5b5b6000600190505b838111611bb957611b4d6001600e5461301390919063ffffffff16565b600e81905550601054600e541115611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9190614814565b60405180910390fd5b611ba683600e54613029565b8080611bb190614ef6565b915050611b30565b50505050565b60115481565b611bcd6129bd565b73ffffffffffffffffffffffffffffffffffffffff16611beb611e04565b73ffffffffffffffffffffffffffffffffffffffff1614611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3890614a14565b60405180910390fd5b80600c8190555050565b611c536129bd565b73ffffffffffffffffffffffffffffffffffffffff16611c71611e04565b73ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90614a14565b60405180910390fd5b60005b8251811015611d57578160146000858481518110611ceb57611cea614ffb565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611d4f90614ef6565b915050611cca565b505050565b611d646129bd565b73ffffffffffffffffffffffffffffffffffffffff16611d82611e04565b73ffffffffffffffffffffffffffffffffffffffff1614611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf90614a14565b60405180910390fd5b80600d60008481526020019081526020016000209080519060200190611dff929190613a0f565b505050565b6000601560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611e3d90614e93565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6990614e93565b8015611eb65780601f10611e8b57610100808354040283529160200191611eb6565b820191906000526020600020905b815481529060010190602001808311611e9957829003601f168201915b5050505050905090565b60105481565b611ece6129bd565b73ffffffffffffffffffffffffffffffffffffffff16611eec611e04565b73ffffffffffffffffffffffffffffffffffffffff1614611f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3990614a14565b60405180910390fd5b600e548111611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d90614914565b60405180910390fd5b8060108190555050565b611f986129bd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffd906148f4565b60405180910390fd5b80600560006120136129bd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120c06129bd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161210591906147bc565b60405180910390a35050565b600e5481565b6121286121226129bd565b83612a90565b612167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215e90614a94565b60405180910390fd5b612173848484846131f7565b50505050565b600c5481565b600b805461218c90614e93565b80601f01602080910402602001604051908101604052809291908181526020018280546121b890614e93565b80156122055780601f106121da57610100808354040283529160200191612205565b820191906000526020600020905b8154815290600101906020018083116121e857829003601f168201915b505050505081565b60606000600d6000848152602001908152602001600020805461222f90614e93565b80601f016020809104026020016040519081016040528092919081815260200182805461225b90614e93565b80156122a85780601f1061227d576101008083540402835291602001916122a8565b820191906000526020600020905b81548152906001019060200180831161228b57829003601f168201915b5050505050905060606040516020016122c090614740565b60405160208183030381529060405280519060200120600d60008681526020019081526020016000206040516020016122f991906146e2565b60405160208183030381529060405280519060200120148061231c575060008251145b156123cc57600d6000670de0b6b3a76400008152602001908152602001600020805461234790614e93565b80601f016020809104026020016040519081016040528092919081815260200182805461237390614e93565b80156123c05780601f10612395576101008083540402835291602001916123c0565b820191906000526020600020905b8154815290600101906020018083116123a357829003601f168201915b5050505050905061246b565b600d600085815260200190815260200160002080546123ea90614e93565b80601f016020809104026020016040519081016040528092919081815260200182805461241690614e93565b80156124635780601f1061243857610100808354040283529160200191612463565b820191906000526020600020905b81548152906001019060200180831161244657829003601f168201915b505050505090505b600060138261247987613253565b60405160200161248b939291906146f9565b6040516020818303038152906040529050809350505050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252e90614af4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561257d573d6000803e3d6000fd5b50565b6125886129bd565b73ffffffffffffffffffffffffffffffffffffffff166125a6611e04565b73ffffffffffffffffffffffffffffffffffffffff16146125fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f390614a14565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126b56129bd565b73ffffffffffffffffffffffffffffffffffffffff166126d3611e04565b73ffffffffffffffffffffffffffffffffffffffff1614612729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272090614a14565b60405180910390fd5b60008290505b8181116127715783600d6000838152602001908152602001600020908051906020019061275d929190613a0f565b50808061276990614ef6565b91505061272f565b50505050565b61277f6129bd565b73ffffffffffffffffffffffffffffffffffffffff1661279d611e04565b73ffffffffffffffffffffffffffffffffffffffff16146127f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ea90614a14565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285a90614894565b60405180910390fd5b61286c81612f37565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061293a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061294a5750612949826133dc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a38836115b3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612a8e612a896129bd565b612f37565b565b6000612a9b82612951565b612ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad190614954565b60405180910390fd5b6000612ae5836115b3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b5457508373ffffffffffffffffffffffffffffffffffffffff16612b3c84610c3d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b655750612b648185612619565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b8e826115b3565b73ffffffffffffffffffffffffffffffffffffffff1614612be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdb90614a34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4b906148d4565b60405180910390fd5b612c5f838383613446565b612c6a6000826129c5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cba9190614d92565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d119190614c7a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160009080519060200190612de0929190613a0f565b508060019080519060200190612df7929190613a0f565b505050565b6001600a60006101000a81548160ff021916908315150217905550565b8073ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e5f57600080fd5b505afa158015612e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e979190613efa565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf760001b14612efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef290614834565b60405180910390fd5b807fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf75550565b60008183612f2f9190614d92565b905092915050565b6000601560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081601560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361300b9190614d38565b905092915050565b600081836130219190614c7a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613099576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613090906149d4565b60405180910390fd5b6130a281612951565b156130e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d9906148b4565b60405180910390fd5b6130ee60008383613446565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461313e9190614c7a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b613202848484612b6e565b61320e8484848461355a565b61324d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324490614874565b60405180910390fd5b50505050565b6060600082141561329b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133d7565b600082905060005b600082146132cd5780806132b690614ef6565b915050600a826132c69190614d07565b91506132a3565b60008167ffffffffffffffff8111156132e9576132e861502a565b5b6040519080825280601f01601f19166020018201604052801561331b5781602001600182028036833780820191505090505b50905060008290505b600086146133cf576001816133399190614d92565b90506000600a808861334b9190614d07565b6133559190614d38565b876133609190614d92565b603061336c9190614cd0565b905060008160f81b90508084848151811061338a57613389614ffb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886133c69190614d07565b97505050613324565b819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134518383836136f1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134945761348f816136f6565b6134d3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134d2576134d1838261373f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561351657613511816138ac565b613555565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461355457613553828261397d565b5b5b505050565b600061357b8473ffffffffffffffffffffffffffffffffffffffff166139fc565b156136e4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135a46129bd565b8786866040518563ffffffff1660e01b81526004016135c69493929190614770565b602060405180830381600087803b1580156135e057600080fd5b505af192505050801561361157506040513d601f19601f8201168201806040525081019061360e9190613f54565b60015b613694573d8060008114613641576040519150601f19603f3d011682016040523d82523d6000602084013e613646565b606091505b5060008151141561368c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368390614874565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136e9565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161374c846117b9565b6137569190614d92565b905060006007600084815260200190815260200160002054905081811461383b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138c09190614d92565b90506000600960008481526020019081526020016000205490506000600883815481106138f0576138ef614ffb565b5b90600052602060002001549050806008838154811061391257613911614ffb565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061396157613960614fcc565b5b6001900381819060005260206000200160009055905550505050565b6000613988836117b9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613a1b90614e93565b90600052602060002090601f016020900481019282613a3d5760008555613a84565b82601f10613a5657805160ff1916838001178555613a84565b82800160010185558215613a84579182015b82811115613a83578251825591602001919060010190613a68565b5b509050613a919190613a95565b5090565b5b80821115613aae576000816000905550600101613a96565b5090565b6000613ac5613ac084614b94565b614b6f565b90508083825260208201905082856020860282011115613ae857613ae761505e565b5b60005b85811015613b185781613afe8882613ba6565b845260208401935060208301925050600181019050613aeb565b5050509392505050565b6000613b35613b3084614bc0565b614b6f565b905082815260208101848484011115613b5157613b50615063565b5b613b5c848285614e51565b509392505050565b6000613b77613b7284614bf1565b614b6f565b905082815260208101848484011115613b9357613b92615063565b5b613b9e848285614e51565b509392505050565b600081359050613bb581615788565b92915050565b600082601f830112613bd057613bcf615059565b5b8135613be0848260208601613ab2565b91505092915050565b600081359050613bf88161579f565b92915050565b600081519050613c0d816157b6565b92915050565b600081359050613c22816157cd565b92915050565b600081519050613c37816157cd565b92915050565b600082601f830112613c5257613c51615059565b5b8135613c62848260208601613b22565b91505092915050565b600082601f830112613c8057613c7f615059565b5b8135613c90848260208601613b64565b91505092915050565b600081359050613ca8816157e4565b92915050565b600060208284031215613cc457613cc361506d565b5b6000613cd284828501613ba6565b91505092915050565b60008060408385031215613cf257613cf161506d565b5b6000613d0085828601613ba6565b9250506020613d1185828601613ba6565b9150509250929050565b600080600060608486031215613d3457613d3361506d565b5b6000613d4286828701613ba6565b9350506020613d5386828701613ba6565b9250506040613d6486828701613c99565b9150509250925092565b60008060008060808587031215613d8857613d8761506d565b5b6000613d9687828801613ba6565b9450506020613da787828801613ba6565b9350506040613db887828801613c99565b925050606085013567ffffffffffffffff811115613dd957613dd8615068565b5b613de587828801613c3d565b91505092959194509250565b60008060408385031215613e0857613e0761506d565b5b6000613e1685828601613ba6565b9250506020613e2785828601613be9565b9150509250929050565b60008060408385031215613e4857613e4761506d565b5b6000613e5685828601613ba6565b9250506020613e6785828601613c99565b9150509250929050565b60008060408385031215613e8857613e8761506d565b5b600083013567ffffffffffffffff811115613ea657613ea5615068565b5b613eb285828601613bbb565b9250506020613ec385828601613be9565b9150509250929050565b600060208284031215613ee357613ee261506d565b5b6000613ef184828501613be9565b91505092915050565b600060208284031215613f1057613f0f61506d565b5b6000613f1e84828501613bfe565b91505092915050565b600060208284031215613f3d57613f3c61506d565b5b6000613f4b84828501613c13565b91505092915050565b600060208284031215613f6a57613f6961506d565b5b6000613f7884828501613c28565b91505092915050565b600060208284031215613f9757613f9661506d565b5b600082013567ffffffffffffffff811115613fb557613fb4615068565b5b613fc184828501613c6b565b91505092915050565b60008060408385031215613fe157613fe061506d565b5b600083013567ffffffffffffffff811115613fff57613ffe615068565b5b61400b85828601613c6b565b925050602083013567ffffffffffffffff81111561402c5761402b615068565b5b61403885828601613c6b565b9150509250929050565b60008060006060848603121561405b5761405a61506d565b5b600084013567ffffffffffffffff81111561407957614078615068565b5b61408586828701613c6b565b935050602061409686828701613c99565b92505060406140a786828701613c99565b9150509250925092565b6000602082840312156140c7576140c661506d565b5b60006140d584828501613c99565b91505092915050565b6000806000606084860312156140f7576140f661506d565b5b600061410586828701613c99565b935050602061411686828701613ba6565b925050604061412786828701613be9565b9150509250925092565b600080604083850312156141485761414761506d565b5b600061415685828601613c99565b925050602083013567ffffffffffffffff81111561417757614176615068565b5b61418385828601613c6b565b9150509250929050565b61419681614dc6565b82525050565b6141a581614dd8565b82525050565b6141b481614de4565b82525050565b60006141c582614c37565b6141cf8185614c4d565b93506141df818560208601614e60565b6141e881615072565b840191505092915050565b60006141fe82614c42565b6142088185614c5e565b9350614218818560208601614e60565b61422181615072565b840191505092915050565b600061423782614c42565b6142418185614c6f565b9350614251818560208601614e60565b80840191505092915050565b6000815461426a81614e93565b6142748186614c6f565b9450600182166000811461428f57600181146142a0576142d3565b60ff198316865281860193506142d3565b6142a985614c22565b60005b838110156142cb578154818901526001820191506020810190506142ac565b838801955050505b50505092915050565b60006142e9601283614c5e565b91506142f482615083565b602082019050919050565b600061430c600e83614c5e565b9150614317826150ac565b602082019050919050565b600061432f602b83614c5e565b915061433a826150d5565b604082019050919050565b6000614352603283614c5e565b915061435d82615124565b604082019050919050565b6000614375602683614c5e565b915061438082615173565b604082019050919050565b6000614398601c83614c5e565b91506143a3826151c2565b602082019050919050565b60006143bb602483614c5e565b91506143c6826151eb565b604082019050919050565b60006143de601983614c5e565b91506143e98261523a565b602082019050919050565b6000614401602783614c5e565b915061440c82615263565b604082019050919050565b6000614424601883614c5e565b915061442f826152b2565b602082019050919050565b6000614447602c83614c5e565b9150614452826152db565b604082019050919050565b600061446a603883614c5e565b91506144758261532a565b604082019050919050565b600061448d602a83614c5e565b915061449882615379565b604082019050919050565b60006144b0602983614c5e565b91506144bb826153c8565b604082019050919050565b60006144d3602083614c5e565b91506144de82615417565b602082019050919050565b60006144f6602c83614c5e565b915061450182615440565b604082019050919050565b6000614519600583614c6f565b91506145248261548f565b600582019050919050565b600061453c602083614c5e565b9150614547826154b8565b602082019050919050565b600061455f600483614c6f565b915061456a826154e1565b600482019050919050565b6000614582602983614c5e565b915061458d8261550a565b604082019050919050565b60006145a5602383614c5e565b91506145b082615559565b604082019050919050565b60006145c8602183614c5e565b91506145d3826155a8565b604082019050919050565b60006145eb603183614c5e565b91506145f6826155f7565b604082019050919050565b600061460e601383614c5e565b915061461982615646565b602082019050919050565b6000614631602c83614c5e565b915061463c8261566f565b604082019050919050565b6000614654601283614c5e565b915061465f826156be565b602082019050919050565b6000614677601583614c5e565b9150614682826156e7565b602082019050919050565b600061469a600183614c6f565b91506146a582615710565b600182019050919050565b60006146bd603283614c5e565b91506146c882615739565b604082019050919050565b6146dc81614e3a565b82525050565b60006146ee828461425d565b915081905092915050565b6000614705828661425d565b9150614711828561422c565b915061471c8261468d565b9150614728828461422c565b91506147338261450c565b9150819050949350505050565b600061474b82614552565b9150819050919050565b600060208201905061476a600083018461418d565b92915050565b6000608082019050614785600083018761418d565b614792602083018661418d565b61479f60408301856146d3565b81810360608301526147b181846141ba565b905095945050505050565b60006020820190506147d1600083018461419c565b92915050565b60006020820190506147ec60008301846141ab565b92915050565b6000602082019050818103600083015261480c81846141f3565b905092915050565b6000602082019050818103600083015261482d816142dc565b9050919050565b6000602082019050818103600083015261484d816142ff565b9050919050565b6000602082019050818103600083015261486d81614322565b9050919050565b6000602082019050818103600083015261488d81614345565b9050919050565b600060208201905081810360008301526148ad81614368565b9050919050565b600060208201905081810360008301526148cd8161438b565b9050919050565b600060208201905081810360008301526148ed816143ae565b9050919050565b6000602082019050818103600083015261490d816143d1565b9050919050565b6000602082019050818103600083015261492d816143f4565b9050919050565b6000602082019050818103600083015261494d81614417565b9050919050565b6000602082019050818103600083015261496d8161443a565b9050919050565b6000602082019050818103600083015261498d8161445d565b9050919050565b600060208201905081810360008301526149ad81614480565b9050919050565b600060208201905081810360008301526149cd816144a3565b9050919050565b600060208201905081810360008301526149ed816144c6565b9050919050565b60006020820190508181036000830152614a0d816144e9565b9050919050565b60006020820190508181036000830152614a2d8161452f565b9050919050565b60006020820190508181036000830152614a4d81614575565b9050919050565b60006020820190508181036000830152614a6d81614598565b9050919050565b60006020820190508181036000830152614a8d816145bb565b9050919050565b60006020820190508181036000830152614aad816145de565b9050919050565b60006020820190508181036000830152614acd81614601565b9050919050565b60006020820190508181036000830152614aed81614624565b9050919050565b60006020820190508181036000830152614b0d81614647565b9050919050565b60006020820190508181036000830152614b2d8161466a565b9050919050565b60006020820190508181036000830152614b4d816146b0565b9050919050565b6000602082019050614b6960008301846146d3565b92915050565b6000614b79614b8a565b9050614b858282614ec5565b919050565b6000604051905090565b600067ffffffffffffffff821115614baf57614bae61502a565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614bdb57614bda61502a565b5b614be482615072565b9050602081019050919050565b600067ffffffffffffffff821115614c0c57614c0b61502a565b5b614c1582615072565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c8582614e3a565b9150614c9083614e3a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cc557614cc4614f3f565b5b828201905092915050565b6000614cdb82614e44565b9150614ce683614e44565b92508260ff03821115614cfc57614cfb614f3f565b5b828201905092915050565b6000614d1282614e3a565b9150614d1d83614e3a565b925082614d2d57614d2c614f6e565b5b828204905092915050565b6000614d4382614e3a565b9150614d4e83614e3a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8757614d86614f3f565b5b828202905092915050565b6000614d9d82614e3a565b9150614da883614e3a565b925082821015614dbb57614dba614f3f565b5b828203905092915050565b6000614dd182614e1a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614e7e578082015181840152602081019050614e63565b83811115614e8d576000848401525b50505050565b60006002820490506001821680614eab57607f821691505b60208210811415614ebf57614ebe614f9d565b5b50919050565b614ece82615072565b810181811067ffffffffffffffff82111715614eed57614eec61502a565b5b80604052505050565b6000614f0182614e3a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f3457614f33614f3f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74206c696d697420726561636865640000000000000000000000000000600082015250565b7f4e6f7420636f6d70617469626c65000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4c696d69742063616e6e6f74206265206c657373207468616e206d696e74656460008201527f20616d6f756e7400000000000000000000000000000000000000000000000000602082015250565b7f4461696c79206d696e74206c696d697420726561636865640000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7465737400000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4f6e6c792077686974656c6973746564206164647265737365732063616e206d60008201527f696e740000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f556e617574686f72697a656420636c61696d0000000000000000000000000000600082015250565b7f496e76616c6964206d6573736167652076616c75650000000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b7f546865206c696272617279206973206c6f636b65642e204e6f2064697265637460008201527f202763616c6c2720697320616c6c6f7765640000000000000000000000000000602082015250565b61579181614dc6565b811461579c57600080fd5b50565b6157a881614dd8565b81146157b357600080fd5b50565b6157bf81614de4565b81146157ca57600080fd5b50565b6157d681614dee565b81146157e157600080fd5b50565b6157ed81614e3a565b81146157f857600080fd5b5056fe68747470733a2f2f6d3464736369656e746973742e6d7970696e6174612e636c6f75642f697066732fa2646970667358221220676dfd8f63ea2e399e56cd1f3573f0c7e0be405db93d07065ddc6d3747e972aa64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102b25760003560e01c80636c0360eb11610175578063996517cf116100dc578063c3a2710111610095578063e78e3ac81161006f578063e78e3ac814610a79578063e985e9c514610aa2578063e9cea2fb14610adf578063f2fde38b14610b08576102b9565b8063c3a27101146109fa578063c87b56dd14610a25578063e683029014610a62576102b9565b8063996517cf146108fe5780639e6a1d7d14610929578063a22cb46514610952578063aa46a4001461097b578063b88d4fde146109a6578063bdb4b848146109cf576102b9565b8063790ca4131161012e578063790ca413146108025780638545f4ea1461082d57806388eca516146108565780638a53ffff1461087f5780638da5cb5b146108a857806395d89b41146108d3576102b9565b80636c0360eb146106ff5780636f3d02e11461072a5780636f66adb51461076757806370a0823114610792578063715018a6146107cf5780637188897a146107e6576102b9565b80632f745c591161021957806352d1902d116101d257806352d1902d146105ef57806355f804b31461061a57806356f4720d146106435780635759ed891461066e5780635c707f07146106995780636352211e146106c2576102b9565b80632f745c59146104cf578063425bc1e91461050c57806342842e0e14610535578063469519541461055e5780634f6ccce7146105875780635052ab3c146105c4576102b9565b80630c598fc51161026b5780630c598fc5146103f2578063158ef93e1461040957806318160ddd1461043457806323b872dd1461045f5780632593626c14610488578063293d6987146104a4576102b9565b806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b3146103635780630a190db61461038c5780630ba84e85146103b5576102b9565b366102b957005b600080fd5b3480156102ca57600080fd5b506102e560048036038101906102e09190613f27565b610b31565b6040516102f291906147bc565b60405180910390f35b34801561030757600080fd5b50610310610bab565b60405161031d91906147f2565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906140b1565b610c3d565b60405161035a9190614755565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613e31565b610cc2565b005b34801561039857600080fd5b506103b360048036038101906103ae9190613cae565b610dda565b005b3480156103c157600080fd5b506103dc60048036038101906103d79190613cae565b610e9a565b6040516103e991906147bc565b60405180910390f35b3480156103fe57600080fd5b50610407610eba565b005b34801561041557600080fd5b5061041e610f1b565b60405161042b91906147bc565b60405180910390f35b34801561044057600080fd5b50610449610f2e565b6040516104569190614b54565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190613d1b565b610f3b565b005b6104a2600480360381019061049d9190613cae565b610f9b565b005b3480156104b057600080fd5b506104b9611112565b6040516104c691906147bc565b60405180910390f35b3480156104db57600080fd5b506104f660048036038101906104f19190613e31565b611125565b6040516105039190614b54565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190613ecd565b6111ca565b005b34801561054157600080fd5b5061055c60048036038101906105579190613d1b565b611263565b005b34801561056a57600080fd5b5061058560048036038101906105809190613cae565b611283565b005b34801561059357600080fd5b506105ae60048036038101906105a991906140b1565b611361565b6040516105bb9190614b54565b60405180910390f35b3480156105d057600080fd5b506105d96113d2565b6040516105e69190614755565b60405180910390f35b3480156105fb57600080fd5b506106046113f8565b60405161061191906147d7565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613f81565b611423565b005b34801561064f57600080fd5b506106586114b9565b60405161066591906147bc565b60405180910390f35b34801561067a57600080fd5b50610683611516565b60405161069091906147bc565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190613fca565b611529565b005b3480156106ce57600080fd5b506106e960048036038101906106e491906140b1565b6115b3565b6040516106f69190614755565b60405180910390f35b34801561070b57600080fd5b50610714611665565b60405161072191906147f2565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c91906140b1565b6116f3565b60405161075e91906147f2565b60405180910390f35b34801561077357600080fd5b5061077c611793565b6040516107899190614755565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b49190613cae565b6117b9565b6040516107c69190614b54565b60405180910390f35b3480156107db57600080fd5b506107e4611871565b005b61080060048036038101906107fb91906140de565b6118f9565b005b34801561080e57600080fd5b50610817611bbf565b6040516108249190614b54565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f91906140b1565b611bc5565b005b34801561086257600080fd5b5061087d60048036038101906108789190613e71565b611c4b565b005b34801561088b57600080fd5b506108a660048036038101906108a19190614131565b611d5c565b005b3480156108b457600080fd5b506108bd611e04565b6040516108ca9190614755565b60405180910390f35b3480156108df57600080fd5b506108e8611e2e565b6040516108f591906147f2565b60405180910390f35b34801561090a57600080fd5b50610913611ec0565b6040516109209190614b54565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b91906140b1565b611ec6565b005b34801561095e57600080fd5b5061097960048036038101906109749190613df1565b611f90565b005b34801561098757600080fd5b50610990612111565b60405161099d9190614b54565b60405180910390f35b3480156109b257600080fd5b506109cd60048036038101906109c89190613d6e565b612117565b005b3480156109db57600080fd5b506109e4612179565b6040516109f19190614b54565b60405180910390f35b348015610a0657600080fd5b50610a0f61217f565b604051610a1c91906147f2565b60405180910390f35b348015610a3157600080fd5b50610a4c6004803603810190610a4791906140b1565b61220d565b604051610a5991906147f2565b60405180910390f35b348015610a6e57600080fd5b50610a776124a7565b005b348015610a8557600080fd5b50610aa06004803603810190610a9b9190613ecd565b612580565b005b348015610aae57600080fd5b50610ac96004803603810190610ac49190613cdb565b612619565b604051610ad691906147bc565b60405180910390f35b348015610aeb57600080fd5b50610b066004803603810190610b019190614042565b6126ad565b005b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190613cae565b612777565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba45750610ba38261286f565b5b9050919050565b606060008054610bba90614e93565b80601f0160208091040260200160405190810160405280929190818152602001828054610be690614e93565b8015610c335780601f10610c0857610100808354040283529160200191610c33565b820191906000526020600020905b815481529060010190602001808311610c1657829003601f168201915b5050505050905090565b6000610c4882612951565b610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e906149f4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ccd826115b3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590614a74565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d5d6129bd565b73ffffffffffffffffffffffffffffffffffffffff161480610d8c5750610d8b81610d866129bd565b612619565b5b610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc290614974565b60405180910390fd5b610dd583836129c5565b505050565b610de26129bd565b73ffffffffffffffffffffffffffffffffffffffff16610e00611e04565b73ffffffffffffffffffffffffffffffffffffffff1614610e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4d90614a14565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60146020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f1957610f18612a7e565b5b565b600a60009054906101000a900460ff1681565b6000600880549050905090565b610f4c610f466129bd565b82612a90565b610f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8290614a94565b60405180910390fd5b610f96838383612b6e565b505050565b600a60009054906101000a900460ff1615610fb557600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060600160405280602981526020016157fc60299139600b9080519060200190611024929190613a0f565b506110996040518060400160405280600e81526020017f4d344420536369656e74697374730000000000000000000000000000000000008152506040518060400160405280600381526020017f4d34440000000000000000000000000000000000000000000000000000000000815250612dca565b666a94d74f430000600c819055506107d0601081905550426011819055506110bf612a7e565b6110c7611e04565b600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061110f612dfc565b50565b601560009054906101000a900460ff1681565b6000611130836117b9565b8210611171576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116890614854565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6111d26129bd565b73ffffffffffffffffffffffffffffffffffffffff166111f0611e04565b73ffffffffffffffffffffffffffffffffffffffff1614611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d90614a14565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b61127e83838360405180602001604052806000815250612117565b505050565b61128b6129bd565b73ffffffffffffffffffffffffffffffffffffffff166112a9611e04565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690614a14565b60405180910390fd5b60011515600a60009054906101000a900460ff16151514611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90614b34565b60405180910390fd5b61135e81612e19565b50565b600061136b610f2e565b82106113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614ad4565b60405180910390fd5b600882815481106113c0576113bf614ffb565b5b90600052602060002001549050919050565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf760001b905090565b61142b6129bd565b73ffffffffffffffffffffffffffffffffffffffff16611449611e04565b73ffffffffffffffffffffffffffffffffffffffff161461149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690614a14565b60405180910390fd5b80601390805190602001906114b5929190613a0f565b5050565b6000601260009054906101000a900460ff161561150957620151806114e960115442612f2190919063ffffffff16565b1015611504576103e8600e54106115035760019050611513565b5b611512565b60009050611513565b5b90565b601260009054906101000a900460ff1681565b6115316129bd565b73ffffffffffffffffffffffffffffffffffffffff1661154f611e04565b73ffffffffffffffffffffffffffffffffffffffff16146115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90614a14565b60405180910390fd5b6115af8282612dca565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561165c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611653906149b4565b60405180910390fd5b80915050919050565b6013805461167290614e93565b80601f016020809104026020016040519081016040528092919081815260200182805461169e90614e93565b80156116eb5780601f106116c0576101008083540402835291602001916116eb565b820191906000526020600020905b8154815290600101906020018083116116ce57829003601f168201915b505050505081565b600d602052806000526040600020600091509050805461171290614e93565b80601f016020809104026020016040519081016040528092919081815260200182805461173e90614e93565b801561178b5780601f106117605761010080835404028352916020019161178b565b820191906000526020600020905b81548152906001019060200180831161176e57829003601f168201915b505050505081565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561182a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182190614994565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118796129bd565b73ffffffffffffffffffffffffffffffffffffffff16611897611e04565b73ffffffffffffffffffffffffffffffffffffffff16146118ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e490614a14565b60405180910390fd5b6118f76000612f37565b565b60011515600a60009054906101000a900460ff1615151461194f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194690614b34565b60405180910390fd5b6119576114b9565b15611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90614934565b60405180910390fd5b601560009054906101000a900460ff1615611a3957601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f90614a54565b60405180910390fd5b5b80611ae957600083118015611a4f5750600a8311155b611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8590614ab4565b60405180910390fd5b611aa383600c54612ffd90919063ffffffff16565b3414611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb90614b14565b60405180910390fd5b611b29565b611af1611e04565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b2857600080fd5b5b6000600190505b838111611bb957611b4d6001600e5461301390919063ffffffff16565b600e81905550601054600e541115611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9190614814565b60405180910390fd5b611ba683600e54613029565b8080611bb190614ef6565b915050611b30565b50505050565b60115481565b611bcd6129bd565b73ffffffffffffffffffffffffffffffffffffffff16611beb611e04565b73ffffffffffffffffffffffffffffffffffffffff1614611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3890614a14565b60405180910390fd5b80600c8190555050565b611c536129bd565b73ffffffffffffffffffffffffffffffffffffffff16611c71611e04565b73ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90614a14565b60405180910390fd5b60005b8251811015611d57578160146000858481518110611ceb57611cea614ffb565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611d4f90614ef6565b915050611cca565b505050565b611d646129bd565b73ffffffffffffffffffffffffffffffffffffffff16611d82611e04565b73ffffffffffffffffffffffffffffffffffffffff1614611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf90614a14565b60405180910390fd5b80600d60008481526020019081526020016000209080519060200190611dff929190613a0f565b505050565b6000601560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611e3d90614e93565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6990614e93565b8015611eb65780601f10611e8b57610100808354040283529160200191611eb6565b820191906000526020600020905b815481529060010190602001808311611e9957829003601f168201915b5050505050905090565b60105481565b611ece6129bd565b73ffffffffffffffffffffffffffffffffffffffff16611eec611e04565b73ffffffffffffffffffffffffffffffffffffffff1614611f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3990614a14565b60405180910390fd5b600e548111611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d90614914565b60405180910390fd5b8060108190555050565b611f986129bd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffd906148f4565b60405180910390fd5b80600560006120136129bd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120c06129bd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161210591906147bc565b60405180910390a35050565b600e5481565b6121286121226129bd565b83612a90565b612167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215e90614a94565b60405180910390fd5b612173848484846131f7565b50505050565b600c5481565b600b805461218c90614e93565b80601f01602080910402602001604051908101604052809291908181526020018280546121b890614e93565b80156122055780601f106121da57610100808354040283529160200191612205565b820191906000526020600020905b8154815290600101906020018083116121e857829003601f168201915b505050505081565b60606000600d6000848152602001908152602001600020805461222f90614e93565b80601f016020809104026020016040519081016040528092919081815260200182805461225b90614e93565b80156122a85780601f1061227d576101008083540402835291602001916122a8565b820191906000526020600020905b81548152906001019060200180831161228b57829003601f168201915b5050505050905060606040516020016122c090614740565b60405160208183030381529060405280519060200120600d60008681526020019081526020016000206040516020016122f991906146e2565b60405160208183030381529060405280519060200120148061231c575060008251145b156123cc57600d6000670de0b6b3a76400008152602001908152602001600020805461234790614e93565b80601f016020809104026020016040519081016040528092919081815260200182805461237390614e93565b80156123c05780601f10612395576101008083540402835291602001916123c0565b820191906000526020600020905b8154815290600101906020018083116123a357829003601f168201915b5050505050905061246b565b600d600085815260200190815260200160002080546123ea90614e93565b80601f016020809104026020016040519081016040528092919081815260200182805461241690614e93565b80156124635780601f1061243857610100808354040283529160200191612463565b820191906000526020600020905b81548152906001019060200180831161244657829003601f168201915b505050505090505b600060138261247987613253565b60405160200161248b939291906146f9565b6040516020818303038152906040529050809350505050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252e90614af4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561257d573d6000803e3d6000fd5b50565b6125886129bd565b73ffffffffffffffffffffffffffffffffffffffff166125a6611e04565b73ffffffffffffffffffffffffffffffffffffffff16146125fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f390614a14565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126b56129bd565b73ffffffffffffffffffffffffffffffffffffffff166126d3611e04565b73ffffffffffffffffffffffffffffffffffffffff1614612729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272090614a14565b60405180910390fd5b60008290505b8181116127715783600d6000838152602001908152602001600020908051906020019061275d929190613a0f565b50808061276990614ef6565b91505061272f565b50505050565b61277f6129bd565b73ffffffffffffffffffffffffffffffffffffffff1661279d611e04565b73ffffffffffffffffffffffffffffffffffffffff16146127f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ea90614a14565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285a90614894565b60405180910390fd5b61286c81612f37565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061293a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061294a5750612949826133dc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a38836115b3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612a8e612a896129bd565b612f37565b565b6000612a9b82612951565b612ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad190614954565b60405180910390fd5b6000612ae5836115b3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b5457508373ffffffffffffffffffffffffffffffffffffffff16612b3c84610c3d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b655750612b648185612619565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b8e826115b3565b73ffffffffffffffffffffffffffffffffffffffff1614612be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdb90614a34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4b906148d4565b60405180910390fd5b612c5f838383613446565b612c6a6000826129c5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cba9190614d92565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d119190614c7a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160009080519060200190612de0929190613a0f565b508060019080519060200190612df7929190613a0f565b505050565b6001600a60006101000a81548160ff021916908315150217905550565b8073ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e5f57600080fd5b505afa158015612e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e979190613efa565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf760001b14612efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef290614834565b60405180910390fd5b807fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf75550565b60008183612f2f9190614d92565b905092915050565b6000601560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081601560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361300b9190614d38565b905092915050565b600081836130219190614c7a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613099576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613090906149d4565b60405180910390fd5b6130a281612951565b156130e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d9906148b4565b60405180910390fd5b6130ee60008383613446565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461313e9190614c7a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b613202848484612b6e565b61320e8484848461355a565b61324d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324490614874565b60405180910390fd5b50505050565b6060600082141561329b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133d7565b600082905060005b600082146132cd5780806132b690614ef6565b915050600a826132c69190614d07565b91506132a3565b60008167ffffffffffffffff8111156132e9576132e861502a565b5b6040519080825280601f01601f19166020018201604052801561331b5781602001600182028036833780820191505090505b50905060008290505b600086146133cf576001816133399190614d92565b90506000600a808861334b9190614d07565b6133559190614d38565b876133609190614d92565b603061336c9190614cd0565b905060008160f81b90508084848151811061338a57613389614ffb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886133c69190614d07565b97505050613324565b819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134518383836136f1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134945761348f816136f6565b6134d3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134d2576134d1838261373f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561351657613511816138ac565b613555565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461355457613553828261397d565b5b5b505050565b600061357b8473ffffffffffffffffffffffffffffffffffffffff166139fc565b156136e4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135a46129bd565b8786866040518563ffffffff1660e01b81526004016135c69493929190614770565b602060405180830381600087803b1580156135e057600080fd5b505af192505050801561361157506040513d601f19601f8201168201806040525081019061360e9190613f54565b60015b613694573d8060008114613641576040519150601f19603f3d011682016040523d82523d6000602084013e613646565b606091505b5060008151141561368c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368390614874565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136e9565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161374c846117b9565b6137569190614d92565b905060006007600084815260200190815260200160002054905081811461383b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138c09190614d92565b90506000600960008481526020019081526020016000205490506000600883815481106138f0576138ef614ffb565b5b90600052602060002001549050806008838154811061391257613911614ffb565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061396157613960614fcc565b5b6001900381819060005260206000200160009055905550505050565b6000613988836117b9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613a1b90614e93565b90600052602060002090601f016020900481019282613a3d5760008555613a84565b82601f10613a5657805160ff1916838001178555613a84565b82800160010185558215613a84579182015b82811115613a83578251825591602001919060010190613a68565b5b509050613a919190613a95565b5090565b5b80821115613aae576000816000905550600101613a96565b5090565b6000613ac5613ac084614b94565b614b6f565b90508083825260208201905082856020860282011115613ae857613ae761505e565b5b60005b85811015613b185781613afe8882613ba6565b845260208401935060208301925050600181019050613aeb565b5050509392505050565b6000613b35613b3084614bc0565b614b6f565b905082815260208101848484011115613b5157613b50615063565b5b613b5c848285614e51565b509392505050565b6000613b77613b7284614bf1565b614b6f565b905082815260208101848484011115613b9357613b92615063565b5b613b9e848285614e51565b509392505050565b600081359050613bb581615788565b92915050565b600082601f830112613bd057613bcf615059565b5b8135613be0848260208601613ab2565b91505092915050565b600081359050613bf88161579f565b92915050565b600081519050613c0d816157b6565b92915050565b600081359050613c22816157cd565b92915050565b600081519050613c37816157cd565b92915050565b600082601f830112613c5257613c51615059565b5b8135613c62848260208601613b22565b91505092915050565b600082601f830112613c8057613c7f615059565b5b8135613c90848260208601613b64565b91505092915050565b600081359050613ca8816157e4565b92915050565b600060208284031215613cc457613cc361506d565b5b6000613cd284828501613ba6565b91505092915050565b60008060408385031215613cf257613cf161506d565b5b6000613d0085828601613ba6565b9250506020613d1185828601613ba6565b9150509250929050565b600080600060608486031215613d3457613d3361506d565b5b6000613d4286828701613ba6565b9350506020613d5386828701613ba6565b9250506040613d6486828701613c99565b9150509250925092565b60008060008060808587031215613d8857613d8761506d565b5b6000613d9687828801613ba6565b9450506020613da787828801613ba6565b9350506040613db887828801613c99565b925050606085013567ffffffffffffffff811115613dd957613dd8615068565b5b613de587828801613c3d565b91505092959194509250565b60008060408385031215613e0857613e0761506d565b5b6000613e1685828601613ba6565b9250506020613e2785828601613be9565b9150509250929050565b60008060408385031215613e4857613e4761506d565b5b6000613e5685828601613ba6565b9250506020613e6785828601613c99565b9150509250929050565b60008060408385031215613e8857613e8761506d565b5b600083013567ffffffffffffffff811115613ea657613ea5615068565b5b613eb285828601613bbb565b9250506020613ec385828601613be9565b9150509250929050565b600060208284031215613ee357613ee261506d565b5b6000613ef184828501613be9565b91505092915050565b600060208284031215613f1057613f0f61506d565b5b6000613f1e84828501613bfe565b91505092915050565b600060208284031215613f3d57613f3c61506d565b5b6000613f4b84828501613c13565b91505092915050565b600060208284031215613f6a57613f6961506d565b5b6000613f7884828501613c28565b91505092915050565b600060208284031215613f9757613f9661506d565b5b600082013567ffffffffffffffff811115613fb557613fb4615068565b5b613fc184828501613c6b565b91505092915050565b60008060408385031215613fe157613fe061506d565b5b600083013567ffffffffffffffff811115613fff57613ffe615068565b5b61400b85828601613c6b565b925050602083013567ffffffffffffffff81111561402c5761402b615068565b5b61403885828601613c6b565b9150509250929050565b60008060006060848603121561405b5761405a61506d565b5b600084013567ffffffffffffffff81111561407957614078615068565b5b61408586828701613c6b565b935050602061409686828701613c99565b92505060406140a786828701613c99565b9150509250925092565b6000602082840312156140c7576140c661506d565b5b60006140d584828501613c99565b91505092915050565b6000806000606084860312156140f7576140f661506d565b5b600061410586828701613c99565b935050602061411686828701613ba6565b925050604061412786828701613be9565b9150509250925092565b600080604083850312156141485761414761506d565b5b600061415685828601613c99565b925050602083013567ffffffffffffffff81111561417757614176615068565b5b61418385828601613c6b565b9150509250929050565b61419681614dc6565b82525050565b6141a581614dd8565b82525050565b6141b481614de4565b82525050565b60006141c582614c37565b6141cf8185614c4d565b93506141df818560208601614e60565b6141e881615072565b840191505092915050565b60006141fe82614c42565b6142088185614c5e565b9350614218818560208601614e60565b61422181615072565b840191505092915050565b600061423782614c42565b6142418185614c6f565b9350614251818560208601614e60565b80840191505092915050565b6000815461426a81614e93565b6142748186614c6f565b9450600182166000811461428f57600181146142a0576142d3565b60ff198316865281860193506142d3565b6142a985614c22565b60005b838110156142cb578154818901526001820191506020810190506142ac565b838801955050505b50505092915050565b60006142e9601283614c5e565b91506142f482615083565b602082019050919050565b600061430c600e83614c5e565b9150614317826150ac565b602082019050919050565b600061432f602b83614c5e565b915061433a826150d5565b604082019050919050565b6000614352603283614c5e565b915061435d82615124565b604082019050919050565b6000614375602683614c5e565b915061438082615173565b604082019050919050565b6000614398601c83614c5e565b91506143a3826151c2565b602082019050919050565b60006143bb602483614c5e565b91506143c6826151eb565b604082019050919050565b60006143de601983614c5e565b91506143e98261523a565b602082019050919050565b6000614401602783614c5e565b915061440c82615263565b604082019050919050565b6000614424601883614c5e565b915061442f826152b2565b602082019050919050565b6000614447602c83614c5e565b9150614452826152db565b604082019050919050565b600061446a603883614c5e565b91506144758261532a565b604082019050919050565b600061448d602a83614c5e565b915061449882615379565b604082019050919050565b60006144b0602983614c5e565b91506144bb826153c8565b604082019050919050565b60006144d3602083614c5e565b91506144de82615417565b602082019050919050565b60006144f6602c83614c5e565b915061450182615440565b604082019050919050565b6000614519600583614c6f565b91506145248261548f565b600582019050919050565b600061453c602083614c5e565b9150614547826154b8565b602082019050919050565b600061455f600483614c6f565b915061456a826154e1565b600482019050919050565b6000614582602983614c5e565b915061458d8261550a565b604082019050919050565b60006145a5602383614c5e565b91506145b082615559565b604082019050919050565b60006145c8602183614c5e565b91506145d3826155a8565b604082019050919050565b60006145eb603183614c5e565b91506145f6826155f7565b604082019050919050565b600061460e601383614c5e565b915061461982615646565b602082019050919050565b6000614631602c83614c5e565b915061463c8261566f565b604082019050919050565b6000614654601283614c5e565b915061465f826156be565b602082019050919050565b6000614677601583614c5e565b9150614682826156e7565b602082019050919050565b600061469a600183614c6f565b91506146a582615710565b600182019050919050565b60006146bd603283614c5e565b91506146c882615739565b604082019050919050565b6146dc81614e3a565b82525050565b60006146ee828461425d565b915081905092915050565b6000614705828661425d565b9150614711828561422c565b915061471c8261468d565b9150614728828461422c565b91506147338261450c565b9150819050949350505050565b600061474b82614552565b9150819050919050565b600060208201905061476a600083018461418d565b92915050565b6000608082019050614785600083018761418d565b614792602083018661418d565b61479f60408301856146d3565b81810360608301526147b181846141ba565b905095945050505050565b60006020820190506147d1600083018461419c565b92915050565b60006020820190506147ec60008301846141ab565b92915050565b6000602082019050818103600083015261480c81846141f3565b905092915050565b6000602082019050818103600083015261482d816142dc565b9050919050565b6000602082019050818103600083015261484d816142ff565b9050919050565b6000602082019050818103600083015261486d81614322565b9050919050565b6000602082019050818103600083015261488d81614345565b9050919050565b600060208201905081810360008301526148ad81614368565b9050919050565b600060208201905081810360008301526148cd8161438b565b9050919050565b600060208201905081810360008301526148ed816143ae565b9050919050565b6000602082019050818103600083015261490d816143d1565b9050919050565b6000602082019050818103600083015261492d816143f4565b9050919050565b6000602082019050818103600083015261494d81614417565b9050919050565b6000602082019050818103600083015261496d8161443a565b9050919050565b6000602082019050818103600083015261498d8161445d565b9050919050565b600060208201905081810360008301526149ad81614480565b9050919050565b600060208201905081810360008301526149cd816144a3565b9050919050565b600060208201905081810360008301526149ed816144c6565b9050919050565b60006020820190508181036000830152614a0d816144e9565b9050919050565b60006020820190508181036000830152614a2d8161452f565b9050919050565b60006020820190508181036000830152614a4d81614575565b9050919050565b60006020820190508181036000830152614a6d81614598565b9050919050565b60006020820190508181036000830152614a8d816145bb565b9050919050565b60006020820190508181036000830152614aad816145de565b9050919050565b60006020820190508181036000830152614acd81614601565b9050919050565b60006020820190508181036000830152614aed81614624565b9050919050565b60006020820190508181036000830152614b0d81614647565b9050919050565b60006020820190508181036000830152614b2d8161466a565b9050919050565b60006020820190508181036000830152614b4d816146b0565b9050919050565b6000602082019050614b6960008301846146d3565b92915050565b6000614b79614b8a565b9050614b858282614ec5565b919050565b6000604051905090565b600067ffffffffffffffff821115614baf57614bae61502a565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614bdb57614bda61502a565b5b614be482615072565b9050602081019050919050565b600067ffffffffffffffff821115614c0c57614c0b61502a565b5b614c1582615072565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c8582614e3a565b9150614c9083614e3a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cc557614cc4614f3f565b5b828201905092915050565b6000614cdb82614e44565b9150614ce683614e44565b92508260ff03821115614cfc57614cfb614f3f565b5b828201905092915050565b6000614d1282614e3a565b9150614d1d83614e3a565b925082614d2d57614d2c614f6e565b5b828204905092915050565b6000614d4382614e3a565b9150614d4e83614e3a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8757614d86614f3f565b5b828202905092915050565b6000614d9d82614e3a565b9150614da883614e3a565b925082821015614dbb57614dba614f3f565b5b828203905092915050565b6000614dd182614e1a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614e7e578082015181840152602081019050614e63565b83811115614e8d576000848401525b50505050565b60006002820490506001821680614eab57607f821691505b60208210811415614ebf57614ebe614f9d565b5b50919050565b614ece82615072565b810181811067ffffffffffffffff82111715614eed57614eec61502a565b5b80604052505050565b6000614f0182614e3a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f3457614f33614f3f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74206c696d697420726561636865640000000000000000000000000000600082015250565b7f4e6f7420636f6d70617469626c65000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4c696d69742063616e6e6f74206265206c657373207468616e206d696e74656460008201527f20616d6f756e7400000000000000000000000000000000000000000000000000602082015250565b7f4461696c79206d696e74206c696d697420726561636865640000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7465737400000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4f6e6c792077686974656c6973746564206164647265737365732063616e206d60008201527f696e740000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f556e617574686f72697a656420636c61696d0000000000000000000000000000600082015250565b7f496e76616c6964206d6573736167652076616c75650000000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b7f546865206c696272617279206973206c6f636b65642e204e6f2064697265637460008201527f202763616c6c2720697320616c6c6f7765640000000000000000000000000000602082015250565b61579181614dc6565b811461579c57600080fd5b50565b6157a881614dd8565b81146157b357600080fd5b50565b6157bf81614de4565b81146157ca57600080fd5b50565b6157d681614dee565b81146157e157600080fd5b50565b6157ed81614e3a565b81146157f857600080fd5b5056fe68747470733a2f2f6d3464736369656e746973742e6d7970696e6174612e636c6f75642f697066732fa2646970667358221220676dfd8f63ea2e399e56cd1f3573f0c7e0be405db93d07065ddc6d3747e972aa64736f6c63430008070033
Deployed Bytecode Sourcemap
54368:5010:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46555:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34447:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36006:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35529:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56902:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54280:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55235:125;;;;;;;;;;;;;:::i;:::-;;53466:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47195:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36896:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54653:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54332:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46863:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55593:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37306:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55099:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47385:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53937:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53276:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56164:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56274:313;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54217:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55912:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34141:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54246:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54026:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54114:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33871:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31390:94;;;;;;;;;;;;;:::i;:::-;;58406:773;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54185:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56599:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55368:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57022:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30739:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34616:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54154:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55730:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36299:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54077:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37562:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53996:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53968:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57731:663;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59191:176;;;;;;;;;;;;;:::i;:::-;;56053:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36665:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56693:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31639:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46555:224;46657:4;46696:35;46681:50;;;:11;:50;;;;:90;;;;46735:36;46759:11;46735:23;:36::i;:::-;46681:90;46674:97;;46555:224;;;:::o;34447:100::-;34501:13;34534:5;34527:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34447:100;:::o;36006:221::-;36082:7;36110:16;36118:7;36110;:16::i;:::-;36102:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36195:15;:24;36211:7;36195:24;;;;;;;;;;;;;;;;;;;;;36188:31;;36006:221;;;:::o;35529:411::-;35610:13;35626:23;35641:7;35626:14;:23::i;:::-;35610:39;;35674:5;35668:11;;:2;:11;;;;35660:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35768:5;35752:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35777:37;35794:5;35801:12;:10;:12::i;:::-;35777:16;:37::i;:::-;35752:62;35730:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;35911:21;35920:2;35924:7;35911:8;:21::i;:::-;35599:341;35529:411;;:::o;56902:112::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56999:7:::1;56978:18;;:28;;;;;;;;;;;;;;;;;;56902:112:::0;:::o;54280:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;55235:125::-;55291:10;55278:23;;:9;;;;;;;;;;;:23;;;55274:79;;;55318:23;:21;:23::i;:::-;55274:79;55235:125::o;53466:31::-;;;;;;;;;;;;;:::o;47195:113::-;47256:7;47283:10;:17;;;;47276:24;;47195:113;:::o;36896:339::-;37091:41;37110:12;:10;:12::i;:::-;37124:7;37091:18;:41::i;:::-;37083:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37199:28;37209:4;37215:2;37219:7;37199:9;:28::i;:::-;36896:339;;;:::o;54653:438::-;54730:11;;;;;;;;;;;54729:12;54721:21;;;;;;54774:8;54753:18;;:29;;;;;;;;;;;;;;;;;;54793:53;;;;;;;;;;;;;;;;;:7;:53;;;;;;;;;;;;:::i;:::-;;54857:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:41::i;:::-;54920:10;54909:8;:21;;;;54953:4;54941:9;:16;;;;54981:15;54968:10;:28;;;;55007:23;:21;:23::i;:::-;55053:7;:5;:7::i;:::-;55041:9;;:19;;;;;;;;;;;;;;;;;;55071:12;:10;:12::i;:::-;54653:438;:::o;54332:27::-;;;;;;;;;;;;;:::o;46863:256::-;46960:7;46996:23;47013:5;46996:16;:23::i;:::-;46988:5;:31;46980:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;47085:12;:19;47098:5;47085:19;;;;;;;;;;;;;;;:26;47105:5;47085:26;;;;;;;;;;;;47078:33;;46863:256;;;;:::o;55593:125::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55691:19:::1;55673:15;;:37;;;;;;;;;;;;;;;;;;55593:125:::0;:::o;37306:185::-;37444:39;37461:4;37467:2;37471:7;37444:39;;;;;;;;;;;;:16;:39::i;:::-;37306:185;;;:::o;55099:124::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53735:4:::1;53720:19;;:11;;;;;;;;;;;:19;;;53712:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;55179:26:::2;55197:7;55179:17;:26::i;:::-;55099:124:::0;:::o;47385:233::-;47460:7;47496:30;:28;:30::i;:::-;47488:5;:38;47480:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47593:10;47604:5;47593:17;;;;;;;;:::i;:::-;;;;;;;;;;47586:24;;47385:233;;;:::o;53937:24::-;;;;;;;;;;;;;:::o;53276:147::-;53322:7;53349:66;53342:73;;;;53276:147;:::o;56164:98::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56246:8:::1;56236:7;:18;;;;;;;;;;;;:::i;:::-;;56164:98:::0;:::o;56274:313::-;56316:4;56337:10;;;;;;;;;;;56333:247;;;56402:8;56368:31;56388:10;;56368:15;:19;;:31;;;;:::i;:::-;:42;56364:159;;;56448:4;56435:9;;:17;56431:77;;56484:4;56477:11;;;;56431:77;56364:159;56333:247;;;56563:5;56556:12;;;;56333:247;56274:313;;:::o;54217:22::-;;;;;;;;;;;;;:::o;55912:129::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56001:32:::1;56018:5;56025:7;56001:16;:32::i;:::-;55912:129:::0;;:::o;34141:239::-;34213:7;34233:13;34249:7;:16;34257:7;34249:16;;;;;;;;;;;;;;;;;;;;;34233:32;;34301:1;34284:19;;:5;:19;;;;34276:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34367:5;34360:12;;;34141:239;;;:::o;54246:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54026:44::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54114:33::-;;;;;;;;;;;;;:::o;33871:208::-;33943:7;33988:1;33971:19;;:5;:19;;;;33963:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34055:9;:16;34065:5;34055:16;;;;;;;;;;;;;;;;34048:23;;33871:208;;;:::o;31390:94::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31455:21:::1;31473:1;31455:9;:21::i;:::-;31390:94::o:0;58406:773::-;53735:4;53720:19;;:11;;;;;;;;;;;:19;;;53712:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;58520:12:::1;:10;:12::i;:::-;58519:13;58511:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;58576:15;;;;;;;;;;;58572:121;;;58616:13;:25;58630:10;58616:25;;;;;;;;;;;;;;;;;;;;;;;;;58608:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58572:121;58708:9;58703:246;;58751:1;58742:6;:10;:26;;;;;58766:2;58756:6;:12;;58742:26;58734:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58828:20;58841:6;58828:8;;:12;;:20;;;;:::i;:::-;58815:9;:33;58807:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;58703:246;;;58929:7;:5;:7::i;:::-;58915:21;;:10;:21;;;58907:30;;;::::0;::::1;;58703:246;58974:9;58986:1;58974:13;;58969:201;58994:6;58989:1;:11;58969:201;;59034:16;59048:1;59034:9;;:13;;:16;;;;:::i;:::-;59022:9;:28;;;;59086:9;;59073;;:22;;59065:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59133:25;59139:7;59148:9;;59133:5;:25::i;:::-;59002:3;;;;;:::i;:::-;;;;58969:201;;;;58406:773:::0;;;:::o;54185:25::-;;;;:::o;56599:86::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56673:4:::1;56662:8;:15;;;;56599:86:::0;:::o;55368:213::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55471:6:::1;55467:107;55483:10;:17;55479:1;:21;55467:107;;;55553:9;55522:13;:28;55536:10;55547:1;55536:13;;;;;;;;:::i;:::-;;;;;;;;55522:28;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;55502:3;;;;;:::i;:::-;;;;55467:107;;;;55368:213:::0;;:::o;57022:116::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57126:4:::1;57107:11;:16;57119:3;57107:16;;;;;;;;;;;:23;;;;;;;;;;;;:::i;:::-;;57022:116:::0;;:::o;30739:87::-;30785:7;30812:6;;;;;;;;;;;30805:13;;30739:87;:::o;34616:104::-;34672:13;34705:7;34698:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34616:104;:::o;54154:24::-;;;;:::o;55730:170::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55811:9:::1;;55803:5;:17;55795:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;55887:5;55875:9;:17;;;;55730:170:::0;:::o;36299:295::-;36414:12;:10;:12::i;:::-;36402:24;;:8;:24;;;;36394:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;36514:8;36469:18;:32;36488:12;:10;:12::i;:::-;36469:32;;;;;;;;;;;;;;;:42;36502:8;36469:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36567:8;36538:48;;36553:12;:10;:12::i;:::-;36538:48;;;36577:8;36538:48;;;;;;:::i;:::-;;;;;;;;36299:295;;:::o;54077:24::-;;;;:::o;37562:328::-;37737:41;37756:12;:10;:12::i;:::-;37770:7;37737:18;:41::i;:::-;37729:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37843:39;37857:4;37863:2;37867:7;37876:5;37843:13;:39::i;:::-;37562:328;;;;:::o;53996:23::-;;;;:::o;53968:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57731:663::-;57796:13;57868:32;57909:11;:20;57921:7;57909:20;;;;;;;;;;;57868:62;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57941:24;58046:26;;;;;;;:::i;:::-;;;;;;;;;;;;;58036:37;;;;;;58009:11;:20;58021:7;58009:20;;;;;;;;;;;57991:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;57981:51;;;;;;:92;57980:131;;;;58109:1;58079:19;:26;:31;57980:131;57976:275;;;58141:11;:32;58153:19;58141:32;;;;;;;;;;;58128:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57976:275;;;58219:11;:20;58231:7;58219:20;;;;;;;;;;;58206:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57976:275;58261:17;58305:7;58314:10;58331:23;58345:7;58331:8;:23::i;:::-;58288:76;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58261:104;;58383:3;58376:10;;;;;57731:663;;;:::o;59191:176::-;59256:18;;;;;;;;;;;59242:32;;:10;:32;;;59234:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;59316:10;59308:28;;:51;59337:21;59308:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59191:176::o;56053:99::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56134:10:::1;56121;;:23;;;;;;;;;;;;;;;;;;56053:99:::0;:::o;36665:164::-;36762:4;36786:18;:25;36805:5;36786:25;;;;;;;;;;;;;;;:35;36812:8;36786:35;;;;;;;;;;;;;;;;;;;;;;;;;36779:42;;36665:164;;;;:::o;56693:195::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56796:9:::1;56808:7;56796:19;;56792:89;56822:5;56817:1;:10;56792:89;;56866:3;56849:11;:14;56861:1;56849:14;;;;;;;;;;;:20;;;;;;;;;;;;:::i;:::-;;56829:3;;;;;:::i;:::-;;;;56792:89;;;;56693:195:::0;;;:::o;31639:192::-;30970:12;:10;:12::i;:::-;30959:23;;:7;:5;:7::i;:::-;:23;;;30951:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31748:1:::1;31728:22;;:8;:22;;;;31720:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31804:19;31814:8;31804:9;:19::i;:::-;31639:192:::0;:::o;33502:305::-;33604:4;33656:25;33641:40;;;:11;:40;;;;:105;;;;33713:33;33698:48;;;:11;:48;;;;33641:105;:158;;;;33763:36;33787:11;33763:23;:36::i;:::-;33641:158;33621:178;;33502:305;;;:::o;39400:127::-;39465:4;39517:1;39489:30;;:7;:16;39497:7;39489:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39482:37;;39400:127;;;:::o;17369:98::-;17422:7;17449:10;17442:17;;17369:98;:::o;43382:174::-;43484:2;43457:15;:24;43473:7;43457:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43540:7;43536:2;43502:46;;43511:23;43526:7;43511:14;:23::i;:::-;43502:46;;;;;;;;;;;;43382:174;;:::o;30574:84::-;30627:23;30637:12;:10;:12::i;:::-;30627:9;:23::i;:::-;30574:84::o;39694:348::-;39787:4;39812:16;39820:7;39812;:16::i;:::-;39804:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39888:13;39904:23;39919:7;39904:14;:23::i;:::-;39888:39;;39957:5;39946:16;;:7;:16;;;:51;;;;39990:7;39966:31;;:20;39978:7;39966:11;:20::i;:::-;:31;;;39946:51;:87;;;;40001:32;40018:5;40025:7;40001:16;:32::i;:::-;39946:87;39938:96;;;39694:348;;;;:::o;42686:578::-;42845:4;42818:31;;:23;42833:7;42818:14;:23::i;:::-;:31;;;42810:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42928:1;42914:16;;:2;:16;;;;42906:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42984:39;43005:4;43011:2;43015:7;42984:20;:39::i;:::-;43088:29;43105:1;43109:7;43088:8;:29::i;:::-;43149:1;43130:9;:15;43140:4;43130:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43178:1;43161:9;:13;43171:2;43161:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43209:2;43190:7;:16;43198:7;43190:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43248:7;43244:2;43229:27;;43238:4;43229:27;;;;;;;;;;;;42686:578;;;:::o;33291:139::-;33389:5;33381;:13;;;;;;;;;;;;:::i;:::-;;33415:7;33405;:17;;;;;;;;;;;;:::i;:::-;;33291:139;;:::o;53820:68::-;53876:4;53862:11;;:18;;;;;;;;;;;;;;;;;;53820:68::o;52861:409::-;53039:10;53029:35;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52958:66;52950:75;;:116;52928:180;;;;;;;;;;;;:::i;:::-;;;;;;;;;53241:10;53173:66;53166:86;52861:409;:::o;3273:98::-;3331:7;3362:1;3358;:5;;;;:::i;:::-;3351:12;;3273:98;;;;:::o;31839:173::-;31895:16;31914:6;;;;;;;;;;;31895:25;;31940:8;31931:6;;:17;;;;;;;;;;;;;;;;;;31995:8;31964:40;;31985:8;31964:40;;;;;;;;;;;;31884:128;31839:173;:::o;3630:98::-;3688:7;3719:1;3715;:5;;;;:::i;:::-;3708:12;;3630:98;;;;:::o;2892:::-;2950:7;2981:1;2977;:5;;;;:::i;:::-;2970:12;;2892:98;;;;:::o;41378:382::-;41472:1;41458:16;;:2;:16;;;;41450:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41531:16;41539:7;41531;:16::i;:::-;41530:17;41522:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41593:45;41622:1;41626:2;41630:7;41593:20;:45::i;:::-;41668:1;41651:9;:13;41661:2;41651:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41699:2;41680:7;:16;41688:7;41680:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41744:7;41740:2;41719:33;;41736:1;41719:33;;;;;;;;;;;;41378:382;;:::o;38772:315::-;38929:28;38939:4;38945:2;38949:7;38929:9;:28::i;:::-;38976:48;38999:4;39005:2;39009:7;39018:5;38976:22;:48::i;:::-;38968:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38772:315;;;;:::o;57150:573::-;57200:27;57250:1;57244:2;:7;57240:50;;;57268:10;;;;;;;;;;;;;;;;;;;;;57240:50;57300:6;57309:2;57300:11;;57322:8;57341:69;57353:1;57348;:6;57341:69;;57371:5;;;;;:::i;:::-;;;;57396:2;57391:7;;;;;:::i;:::-;;;57341:69;;;57420:17;57450:3;57440:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57420:34;;57465:6;57474:3;57465:12;;57488:198;57501:1;57495:2;:7;57488:198;;57525:1;57523;:3;;;;:::i;:::-;57519:7;;57541:10;57581:2;57576;57571;:7;;;;:::i;:::-;:12;;;;:::i;:::-;57566:2;:17;;;;:::i;:::-;57555:2;:29;;;;:::i;:::-;57541:44;;57600:9;57619:4;57612:12;;57600:24;;57649:2;57639:4;57644:1;57639:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;57672:2;57666:8;;;;;:::i;:::-;;;57504:182;;57488:198;;;57710:4;57696:19;;;;;;57150:573;;;;:::o;14510:157::-;14595:4;14634:25;14619:40;;;:11;:40;;;;14612:47;;14510:157;;;:::o;48231:589::-;48375:45;48402:4;48408:2;48412:7;48375:26;:45::i;:::-;48453:1;48437:18;;:4;:18;;;48433:187;;;48472:40;48504:7;48472:31;:40::i;:::-;48433:187;;;48542:2;48534:10;;:4;:10;;;48530:90;;48561:47;48594:4;48600:7;48561:32;:47::i;:::-;48530:90;48433:187;48648:1;48634:16;;:2;:16;;;48630:183;;;48667:45;48704:7;48667:36;:45::i;:::-;48630:183;;;48740:4;48734:10;;:2;:10;;;48730:83;;48761:40;48789:2;48793:7;48761:27;:40::i;:::-;48730:83;48630:183;48231:589;;;:::o;44121:799::-;44276:4;44297:15;:2;:13;;;:15::i;:::-;44293:620;;;44349:2;44333:36;;;44370:12;:10;:12::i;:::-;44384:4;44390:7;44399:5;44333:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44329:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44592:1;44575:6;:13;:18;44571:272;;;44618:60;;;;;;;;;;:::i;:::-;;;;;;;;44571:272;44793:6;44787:13;44778:6;44774:2;44770:15;44763:38;44329:529;44466:41;;;44456:51;;;:6;:51;;;;44449:58;;;;;44293:620;44897:4;44890:11;;44121:799;;;;;;;:::o;45492:126::-;;;;:::o;49543:164::-;49647:10;:17;;;;49620:15;:24;49636:7;49620:24;;;;;;;;;;;:44;;;;49675:10;49691:7;49675:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49543:164;:::o;50334:988::-;50600:22;50650:1;50625:22;50642:4;50625:16;:22::i;:::-;:26;;;;:::i;:::-;50600:51;;50662:18;50683:17;:26;50701:7;50683:26;;;;;;;;;;;;50662:47;;50830:14;50816:10;:28;50812:328;;50861:19;50883:12;:18;50896:4;50883:18;;;;;;;;;;;;;;;:34;50902:14;50883:34;;;;;;;;;;;;50861:56;;50967:11;50934:12;:18;50947:4;50934:18;;;;;;;;;;;;;;;:30;50953:10;50934:30;;;;;;;;;;;:44;;;;51084:10;51051:17;:30;51069:11;51051:30;;;;;;;;;;;:43;;;;50846:294;50812:328;51236:17;:26;51254:7;51236:26;;;;;;;;;;;51229:33;;;51280:12;:18;51293:4;51280:18;;;;;;;;;;;;;;;:34;51299:14;51280:34;;;;;;;;;;;51273:41;;;50415:907;;50334:988;;:::o;51617:1079::-;51870:22;51915:1;51895:10;:17;;;;:21;;;;:::i;:::-;51870:46;;51927:18;51948:15;:24;51964:7;51948:24;;;;;;;;;;;;51927:45;;52299:19;52321:10;52332:14;52321:26;;;;;;;;:::i;:::-;;;;;;;;;;52299:48;;52385:11;52360:10;52371;52360:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;52496:10;52465:15;:28;52481:11;52465:28;;;;;;;;;;;:41;;;;52637:15;:24;52653:7;52637:24;;;;;;;;;;;52630:31;;;52672:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51688:1008;;;51617:1079;:::o;49121:221::-;49206:14;49223:20;49240:2;49223:16;:20::i;:::-;49206:37;;49281:7;49254:12;:16;49267:2;49254:16;;;;;;;;;;;;;;;:24;49271:6;49254:24;;;;;;;;;;;:34;;;;49328:6;49299:17;:26;49317:7;49299:26;;;;;;;;;;;:35;;;;49195:147;49121:221;;:::o;20611:387::-;20671:4;20879:12;20946:7;20934:20;20926:28;;20989:1;20982:4;:8;20975:15;;;20611:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:143::-;2320:5;2351:6;2345:13;2336:22;;2367:33;2394:5;2367:33;:::i;:::-;2263:143;;;;:::o;2412:137::-;2457:5;2495:6;2482:20;2473:29;;2511:32;2537:5;2511:32;:::i;:::-;2412:137;;;;:::o;2555:141::-;2611:5;2642:6;2636:13;2627:22;;2658:32;2684:5;2658:32;:::i;:::-;2555:141;;;;:::o;2715:338::-;2770:5;2819:3;2812:4;2804:6;2800:17;2796:27;2786:122;;2827:79;;:::i;:::-;2786:122;2944:6;2931:20;2969:78;3043:3;3035:6;3028:4;3020:6;3016:17;2969:78;:::i;:::-;2960:87;;2776:277;2715:338;;;;:::o;3073:340::-;3129:5;3178:3;3171:4;3163:6;3159:17;3155:27;3145:122;;3186:79;;:::i;:::-;3145:122;3303:6;3290:20;3328:79;3403:3;3395:6;3388:4;3380:6;3376:17;3328:79;:::i;:::-;3319:88;;3135:278;3073:340;;;;:::o;3419:139::-;3465:5;3503:6;3490:20;3481:29;;3519:33;3546:5;3519:33;:::i;:::-;3419:139;;;;:::o;3564:329::-;3623:6;3672:2;3660:9;3651:7;3647:23;3643:32;3640:119;;;3678:79;;:::i;:::-;3640:119;3798:1;3823:53;3868:7;3859:6;3848:9;3844:22;3823:53;:::i;:::-;3813:63;;3769:117;3564:329;;;;:::o;3899:474::-;3967:6;3975;4024:2;4012:9;4003:7;3999:23;3995:32;3992:119;;;4030:79;;:::i;:::-;3992:119;4150:1;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4121:117;4277:2;4303:53;4348:7;4339:6;4328:9;4324:22;4303:53;:::i;:::-;4293:63;;4248:118;3899:474;;;;;:::o;4379:619::-;4456:6;4464;4472;4521:2;4509:9;4500:7;4496:23;4492:32;4489:119;;;4527:79;;:::i;:::-;4489:119;4647:1;4672:53;4717:7;4708:6;4697:9;4693:22;4672:53;:::i;:::-;4662:63;;4618:117;4774:2;4800:53;4845:7;4836:6;4825:9;4821:22;4800:53;:::i;:::-;4790:63;;4745:118;4902:2;4928:53;4973:7;4964:6;4953:9;4949:22;4928:53;:::i;:::-;4918:63;;4873:118;4379:619;;;;;:::o;5004:943::-;5099:6;5107;5115;5123;5172:3;5160:9;5151:7;5147:23;5143:33;5140:120;;;5179:79;;:::i;:::-;5140:120;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5554:2;5580:53;5625:7;5616:6;5605:9;5601:22;5580:53;:::i;:::-;5570:63;;5525:118;5710:2;5699:9;5695:18;5682:32;5741:18;5733:6;5730:30;5727:117;;;5763:79;;:::i;:::-;5727:117;5868:62;5922:7;5913:6;5902:9;5898:22;5868:62;:::i;:::-;5858:72;;5653:287;5004:943;;;;;;;:::o;5953:468::-;6018:6;6026;6075:2;6063:9;6054:7;6050:23;6046:32;6043:119;;;6081:79;;:::i;:::-;6043:119;6201:1;6226:53;6271:7;6262:6;6251:9;6247:22;6226:53;:::i;:::-;6216:63;;6172:117;6328:2;6354:50;6396:7;6387:6;6376:9;6372:22;6354:50;:::i;:::-;6344:60;;6299:115;5953:468;;;;;:::o;6427:474::-;6495:6;6503;6552:2;6540:9;6531:7;6527:23;6523:32;6520:119;;;6558:79;;:::i;:::-;6520:119;6678:1;6703:53;6748:7;6739:6;6728:9;6724:22;6703:53;:::i;:::-;6693:63;;6649:117;6805:2;6831:53;6876:7;6867:6;6856:9;6852:22;6831:53;:::i;:::-;6821:63;;6776:118;6427:474;;;;;:::o;6907:678::-;6997:6;7005;7054:2;7042:9;7033:7;7029:23;7025:32;7022:119;;;7060:79;;:::i;:::-;7022:119;7208:1;7197:9;7193:17;7180:31;7238:18;7230:6;7227:30;7224:117;;;7260:79;;:::i;:::-;7224:117;7365:78;7435:7;7426:6;7415:9;7411:22;7365:78;:::i;:::-;7355:88;;7151:302;7492:2;7518:50;7560:7;7551:6;7540:9;7536:22;7518:50;:::i;:::-;7508:60;;7463:115;6907:678;;;;;:::o;7591:323::-;7647:6;7696:2;7684:9;7675:7;7671:23;7667:32;7664:119;;;7702:79;;:::i;:::-;7664:119;7822:1;7847:50;7889:7;7880:6;7869:9;7865:22;7847:50;:::i;:::-;7837:60;;7793:114;7591:323;;;;:::o;7920:351::-;7990:6;8039:2;8027:9;8018:7;8014:23;8010:32;8007:119;;;8045:79;;:::i;:::-;8007:119;8165:1;8190:64;8246:7;8237:6;8226:9;8222:22;8190:64;:::i;:::-;8180:74;;8136:128;7920:351;;;;:::o;8277:327::-;8335:6;8384:2;8372:9;8363:7;8359:23;8355:32;8352:119;;;8390:79;;:::i;:::-;8352:119;8510:1;8535:52;8579:7;8570:6;8559:9;8555:22;8535:52;:::i;:::-;8525:62;;8481:116;8277:327;;;;:::o;8610:349::-;8679:6;8728:2;8716:9;8707:7;8703:23;8699:32;8696:119;;;8734:79;;:::i;:::-;8696:119;8854:1;8879:63;8934:7;8925:6;8914:9;8910:22;8879:63;:::i;:::-;8869:73;;8825:127;8610:349;;;;:::o;8965:509::-;9034:6;9083:2;9071:9;9062:7;9058:23;9054:32;9051:119;;;9089:79;;:::i;:::-;9051:119;9237:1;9226:9;9222:17;9209:31;9267:18;9259:6;9256:30;9253:117;;;9289:79;;:::i;:::-;9253:117;9394:63;9449:7;9440:6;9429:9;9425:22;9394:63;:::i;:::-;9384:73;;9180:287;8965:509;;;;:::o;9480:834::-;9568:6;9576;9625:2;9613:9;9604:7;9600:23;9596:32;9593:119;;;9631:79;;:::i;:::-;9593:119;9779:1;9768:9;9764:17;9751:31;9809:18;9801:6;9798:30;9795:117;;;9831:79;;:::i;:::-;9795:117;9936:63;9991:7;9982:6;9971:9;9967:22;9936:63;:::i;:::-;9926:73;;9722:287;10076:2;10065:9;10061:18;10048:32;10107:18;10099:6;10096:30;10093:117;;;10129:79;;:::i;:::-;10093:117;10234:63;10289:7;10280:6;10269:9;10265:22;10234:63;:::i;:::-;10224:73;;10019:288;9480:834;;;;;:::o;10320:799::-;10407:6;10415;10423;10472:2;10460:9;10451:7;10447:23;10443:32;10440:119;;;10478:79;;:::i;:::-;10440:119;10626:1;10615:9;10611:17;10598:31;10656:18;10648:6;10645:30;10642:117;;;10678:79;;:::i;:::-;10642:117;10783:63;10838:7;10829:6;10818:9;10814:22;10783:63;:::i;:::-;10773:73;;10569:287;10895:2;10921:53;10966:7;10957:6;10946:9;10942:22;10921:53;:::i;:::-;10911:63;;10866:118;11023:2;11049:53;11094:7;11085:6;11074:9;11070:22;11049:53;:::i;:::-;11039:63;;10994:118;10320:799;;;;;:::o;11125:329::-;11184:6;11233:2;11221:9;11212:7;11208:23;11204:32;11201:119;;;11239:79;;:::i;:::-;11201:119;11359:1;11384:53;11429:7;11420:6;11409:9;11405:22;11384:53;:::i;:::-;11374:63;;11330:117;11125:329;;;;:::o;11460:613::-;11534:6;11542;11550;11599:2;11587:9;11578:7;11574:23;11570:32;11567:119;;;11605:79;;:::i;:::-;11567:119;11725:1;11750:53;11795:7;11786:6;11775:9;11771:22;11750:53;:::i;:::-;11740:63;;11696:117;11852:2;11878:53;11923:7;11914:6;11903:9;11899:22;11878:53;:::i;:::-;11868:63;;11823:118;11980:2;12006:50;12048:7;12039:6;12028:9;12024:22;12006:50;:::i;:::-;11996:60;;11951:115;11460:613;;;;;:::o;12079:654::-;12157:6;12165;12214:2;12202:9;12193:7;12189:23;12185:32;12182:119;;;12220:79;;:::i;:::-;12182:119;12340:1;12365:53;12410:7;12401:6;12390:9;12386:22;12365:53;:::i;:::-;12355:63;;12311:117;12495:2;12484:9;12480:18;12467:32;12526:18;12518:6;12515:30;12512:117;;;12548:79;;:::i;:::-;12512:117;12653:63;12708:7;12699:6;12688:9;12684:22;12653:63;:::i;:::-;12643:73;;12438:288;12079:654;;;;;:::o;12739:118::-;12826:24;12844:5;12826:24;:::i;:::-;12821:3;12814:37;12739:118;;:::o;12863:109::-;12944:21;12959:5;12944:21;:::i;:::-;12939:3;12932:34;12863:109;;:::o;12978:118::-;13065:24;13083:5;13065:24;:::i;:::-;13060:3;13053:37;12978:118;;:::o;13102:360::-;13188:3;13216:38;13248:5;13216:38;:::i;:::-;13270:70;13333:6;13328:3;13270:70;:::i;:::-;13263:77;;13349:52;13394:6;13389:3;13382:4;13375:5;13371:16;13349:52;:::i;:::-;13426:29;13448:6;13426:29;:::i;:::-;13421:3;13417:39;13410:46;;13192:270;13102:360;;;;:::o;13468:364::-;13556:3;13584:39;13617:5;13584:39;:::i;:::-;13639:71;13703:6;13698:3;13639:71;:::i;:::-;13632:78;;13719:52;13764:6;13759:3;13752:4;13745:5;13741:16;13719:52;:::i;:::-;13796:29;13818:6;13796:29;:::i;:::-;13791:3;13787:39;13780:46;;13560:272;13468:364;;;;:::o;13838:377::-;13944:3;13972:39;14005:5;13972:39;:::i;:::-;14027:89;14109:6;14104:3;14027:89;:::i;:::-;14020:96;;14125:52;14170:6;14165:3;14158:4;14151:5;14147:16;14125:52;:::i;:::-;14202:6;14197:3;14193:16;14186:23;;13948:267;13838:377;;;;:::o;14245:845::-;14348:3;14385:5;14379:12;14414:36;14440:9;14414:36;:::i;:::-;14466:89;14548:6;14543:3;14466:89;:::i;:::-;14459:96;;14586:1;14575:9;14571:17;14602:1;14597:137;;;;14748:1;14743:341;;;;14564:520;;14597:137;14681:4;14677:9;14666;14662:25;14657:3;14650:38;14717:6;14712:3;14708:16;14701:23;;14597:137;;14743:341;14810:38;14842:5;14810:38;:::i;:::-;14870:1;14884:154;14898:6;14895:1;14892:13;14884:154;;;14972:7;14966:14;14962:1;14957:3;14953:11;14946:35;15022:1;15013:7;15009:15;14998:26;;14920:4;14917:1;14913:12;14908:17;;14884:154;;;15067:6;15062:3;15058:16;15051:23;;14750:334;;14564:520;;14352:738;;14245:845;;;;:::o;15096:366::-;15238:3;15259:67;15323:2;15318:3;15259:67;:::i;:::-;15252:74;;15335:93;15424:3;15335:93;:::i;:::-;15453:2;15448:3;15444:12;15437:19;;15096:366;;;:::o;15468:::-;15610:3;15631:67;15695:2;15690:3;15631:67;:::i;:::-;15624:74;;15707:93;15796:3;15707:93;:::i;:::-;15825:2;15820:3;15816:12;15809:19;;15468:366;;;:::o;15840:::-;15982:3;16003:67;16067:2;16062:3;16003:67;:::i;:::-;15996:74;;16079:93;16168:3;16079:93;:::i;:::-;16197:2;16192:3;16188:12;16181:19;;15840:366;;;:::o;16212:::-;16354:3;16375:67;16439:2;16434:3;16375:67;:::i;:::-;16368:74;;16451:93;16540:3;16451:93;:::i;:::-;16569:2;16564:3;16560:12;16553:19;;16212:366;;;:::o;16584:::-;16726:3;16747:67;16811:2;16806:3;16747:67;:::i;:::-;16740:74;;16823:93;16912:3;16823:93;:::i;:::-;16941:2;16936:3;16932:12;16925:19;;16584:366;;;:::o;16956:::-;17098:3;17119:67;17183:2;17178:3;17119:67;:::i;:::-;17112:74;;17195:93;17284:3;17195:93;:::i;:::-;17313:2;17308:3;17304:12;17297:19;;16956:366;;;:::o;17328:::-;17470:3;17491:67;17555:2;17550:3;17491:67;:::i;:::-;17484:74;;17567:93;17656:3;17567:93;:::i;:::-;17685:2;17680:3;17676:12;17669:19;;17328:366;;;:::o;17700:::-;17842:3;17863:67;17927:2;17922:3;17863:67;:::i;:::-;17856:74;;17939:93;18028:3;17939:93;:::i;:::-;18057:2;18052:3;18048:12;18041:19;;17700:366;;;:::o;18072:::-;18214:3;18235:67;18299:2;18294:3;18235:67;:::i;:::-;18228:74;;18311:93;18400:3;18311:93;:::i;:::-;18429:2;18424:3;18420:12;18413:19;;18072:366;;;:::o;18444:::-;18586:3;18607:67;18671:2;18666:3;18607:67;:::i;:::-;18600:74;;18683:93;18772:3;18683:93;:::i;:::-;18801:2;18796:3;18792:12;18785:19;;18444:366;;;:::o;18816:::-;18958:3;18979:67;19043:2;19038:3;18979:67;:::i;:::-;18972:74;;19055:93;19144:3;19055:93;:::i;:::-;19173:2;19168:3;19164:12;19157:19;;18816:366;;;:::o;19188:::-;19330:3;19351:67;19415:2;19410:3;19351:67;:::i;:::-;19344:74;;19427:93;19516:3;19427:93;:::i;:::-;19545:2;19540:3;19536:12;19529:19;;19188:366;;;:::o;19560:::-;19702:3;19723:67;19787:2;19782:3;19723:67;:::i;:::-;19716:74;;19799:93;19888:3;19799:93;:::i;:::-;19917:2;19912:3;19908:12;19901:19;;19560:366;;;:::o;19932:::-;20074:3;20095:67;20159:2;20154:3;20095:67;:::i;:::-;20088:74;;20171:93;20260:3;20171:93;:::i;:::-;20289:2;20284:3;20280:12;20273:19;;19932:366;;;:::o;20304:::-;20446:3;20467:67;20531:2;20526:3;20467:67;:::i;:::-;20460:74;;20543:93;20632:3;20543:93;:::i;:::-;20661:2;20656:3;20652:12;20645:19;;20304:366;;;:::o;20676:::-;20818:3;20839:67;20903:2;20898:3;20839:67;:::i;:::-;20832:74;;20915:93;21004:3;20915:93;:::i;:::-;21033:2;21028:3;21024:12;21017:19;;20676:366;;;:::o;21048:400::-;21208:3;21229:84;21311:1;21306:3;21229:84;:::i;:::-;21222:91;;21322:93;21411:3;21322:93;:::i;:::-;21440:1;21435:3;21431:11;21424:18;;21048:400;;;:::o;21454:366::-;21596:3;21617:67;21681:2;21676:3;21617:67;:::i;:::-;21610:74;;21693:93;21782:3;21693:93;:::i;:::-;21811:2;21806:3;21802:12;21795:19;;21454:366;;;:::o;21826:400::-;21986:3;22007:84;22089:1;22084:3;22007:84;:::i;:::-;22000:91;;22100:93;22189:3;22100:93;:::i;:::-;22218:1;22213:3;22209:11;22202:18;;21826:400;;;:::o;22232:366::-;22374:3;22395:67;22459:2;22454:3;22395:67;:::i;:::-;22388:74;;22471:93;22560:3;22471:93;:::i;:::-;22589:2;22584:3;22580:12;22573:19;;22232:366;;;:::o;22604:::-;22746:3;22767:67;22831:2;22826:3;22767:67;:::i;:::-;22760:74;;22843:93;22932:3;22843:93;:::i;:::-;22961:2;22956:3;22952:12;22945:19;;22604:366;;;:::o;22976:::-;23118:3;23139:67;23203:2;23198:3;23139:67;:::i;:::-;23132:74;;23215:93;23304:3;23215:93;:::i;:::-;23333:2;23328:3;23324:12;23317:19;;22976:366;;;:::o;23348:::-;23490:3;23511:67;23575:2;23570:3;23511:67;:::i;:::-;23504:74;;23587:93;23676:3;23587:93;:::i;:::-;23705:2;23700:3;23696:12;23689:19;;23348:366;;;:::o;23720:::-;23862:3;23883:67;23947:2;23942:3;23883:67;:::i;:::-;23876:74;;23959:93;24048:3;23959:93;:::i;:::-;24077:2;24072:3;24068:12;24061:19;;23720:366;;;:::o;24092:::-;24234:3;24255:67;24319:2;24314:3;24255:67;:::i;:::-;24248:74;;24331:93;24420:3;24331:93;:::i;:::-;24449:2;24444:3;24440:12;24433:19;;24092:366;;;:::o;24464:::-;24606:3;24627:67;24691:2;24686:3;24627:67;:::i;:::-;24620:74;;24703:93;24792:3;24703:93;:::i;:::-;24821:2;24816:3;24812:12;24805:19;;24464:366;;;:::o;24836:::-;24978:3;24999:67;25063:2;25058:3;24999:67;:::i;:::-;24992:74;;25075:93;25164:3;25075:93;:::i;:::-;25193:2;25188:3;25184:12;25177:19;;24836:366;;;:::o;25208:400::-;25368:3;25389:84;25471:1;25466:3;25389:84;:::i;:::-;25382:91;;25482:93;25571:3;25482:93;:::i;:::-;25600:1;25595:3;25591:11;25584:18;;25208:400;;;:::o;25614:366::-;25756:3;25777:67;25841:2;25836:3;25777:67;:::i;:::-;25770:74;;25853:93;25942:3;25853:93;:::i;:::-;25971:2;25966:3;25962:12;25955:19;;25614:366;;;:::o;25986:118::-;26073:24;26091:5;26073:24;:::i;:::-;26068:3;26061:37;25986:118;;:::o;26110:269::-;26239:3;26261:92;26349:3;26340:6;26261:92;:::i;:::-;26254:99;;26370:3;26363:10;;26110:269;;;;:::o;26385:1121::-;26812:3;26834:92;26922:3;26913:6;26834:92;:::i;:::-;26827:99;;26943:95;27034:3;27025:6;26943:95;:::i;:::-;26936:102;;27055:148;27199:3;27055:148;:::i;:::-;27048:155;;27220:95;27311:3;27302:6;27220:95;:::i;:::-;27213:102;;27332:148;27476:3;27332:148;:::i;:::-;27325:155;;27497:3;27490:10;;26385:1121;;;;;;:::o;27512:381::-;27697:3;27719:148;27863:3;27719:148;:::i;:::-;27712:155;;27884:3;27877:10;;27512:381;;;:::o;27899:222::-;27992:4;28030:2;28019:9;28015:18;28007:26;;28043:71;28111:1;28100:9;28096:17;28087:6;28043:71;:::i;:::-;27899:222;;;;:::o;28127:640::-;28322:4;28360:3;28349:9;28345:19;28337:27;;28374:71;28442:1;28431:9;28427:17;28418:6;28374:71;:::i;:::-;28455:72;28523:2;28512:9;28508:18;28499:6;28455:72;:::i;:::-;28537;28605:2;28594:9;28590:18;28581:6;28537:72;:::i;:::-;28656:9;28650:4;28646:20;28641:2;28630:9;28626:18;28619:48;28684:76;28755:4;28746:6;28684:76;:::i;:::-;28676:84;;28127:640;;;;;;;:::o;28773:210::-;28860:4;28898:2;28887:9;28883:18;28875:26;;28911:65;28973:1;28962:9;28958:17;28949:6;28911:65;:::i;:::-;28773:210;;;;:::o;28989:222::-;29082:4;29120:2;29109:9;29105:18;29097:26;;29133:71;29201:1;29190:9;29186:17;29177:6;29133:71;:::i;:::-;28989:222;;;;:::o;29217:313::-;29330:4;29368:2;29357:9;29353:18;29345:26;;29417:9;29411:4;29407:20;29403:1;29392:9;29388:17;29381:47;29445:78;29518:4;29509:6;29445:78;:::i;:::-;29437:86;;29217:313;;;;:::o;29536:419::-;29702:4;29740:2;29729:9;29725:18;29717:26;;29789:9;29783:4;29779:20;29775:1;29764:9;29760:17;29753:47;29817:131;29943:4;29817:131;:::i;:::-;29809:139;;29536:419;;;:::o;29961:::-;30127:4;30165:2;30154:9;30150:18;30142:26;;30214:9;30208:4;30204:20;30200:1;30189:9;30185:17;30178:47;30242:131;30368:4;30242:131;:::i;:::-;30234:139;;29961:419;;;:::o;30386:::-;30552:4;30590:2;30579:9;30575:18;30567:26;;30639:9;30633:4;30629:20;30625:1;30614:9;30610:17;30603:47;30667:131;30793:4;30667:131;:::i;:::-;30659:139;;30386:419;;;:::o;30811:::-;30977:4;31015:2;31004:9;31000:18;30992:26;;31064:9;31058:4;31054:20;31050:1;31039:9;31035:17;31028:47;31092:131;31218:4;31092:131;:::i;:::-;31084:139;;30811:419;;;:::o;31236:::-;31402:4;31440:2;31429:9;31425:18;31417:26;;31489:9;31483:4;31479:20;31475:1;31464:9;31460:17;31453:47;31517:131;31643:4;31517:131;:::i;:::-;31509:139;;31236:419;;;:::o;31661:::-;31827:4;31865:2;31854:9;31850:18;31842:26;;31914:9;31908:4;31904:20;31900:1;31889:9;31885:17;31878:47;31942:131;32068:4;31942:131;:::i;:::-;31934:139;;31661:419;;;:::o;32086:::-;32252:4;32290:2;32279:9;32275:18;32267:26;;32339:9;32333:4;32329:20;32325:1;32314:9;32310:17;32303:47;32367:131;32493:4;32367:131;:::i;:::-;32359:139;;32086:419;;;:::o;32511:::-;32677:4;32715:2;32704:9;32700:18;32692:26;;32764:9;32758:4;32754:20;32750:1;32739:9;32735:17;32728:47;32792:131;32918:4;32792:131;:::i;:::-;32784:139;;32511:419;;;:::o;32936:::-;33102:4;33140:2;33129:9;33125:18;33117:26;;33189:9;33183:4;33179:20;33175:1;33164:9;33160:17;33153:47;33217:131;33343:4;33217:131;:::i;:::-;33209:139;;32936:419;;;:::o;33361:::-;33527:4;33565:2;33554:9;33550:18;33542:26;;33614:9;33608:4;33604:20;33600:1;33589:9;33585:17;33578:47;33642:131;33768:4;33642:131;:::i;:::-;33634:139;;33361:419;;;:::o;33786:::-;33952:4;33990:2;33979:9;33975:18;33967:26;;34039:9;34033:4;34029:20;34025:1;34014:9;34010:17;34003:47;34067:131;34193:4;34067:131;:::i;:::-;34059:139;;33786:419;;;:::o;34211:::-;34377:4;34415:2;34404:9;34400:18;34392:26;;34464:9;34458:4;34454:20;34450:1;34439:9;34435:17;34428:47;34492:131;34618:4;34492:131;:::i;:::-;34484:139;;34211:419;;;:::o;34636:::-;34802:4;34840:2;34829:9;34825:18;34817:26;;34889:9;34883:4;34879:20;34875:1;34864:9;34860:17;34853:47;34917:131;35043:4;34917:131;:::i;:::-;34909:139;;34636:419;;;:::o;35061:::-;35227:4;35265:2;35254:9;35250:18;35242:26;;35314:9;35308:4;35304:20;35300:1;35289:9;35285:17;35278:47;35342:131;35468:4;35342:131;:::i;:::-;35334:139;;35061:419;;;:::o;35486:::-;35652:4;35690:2;35679:9;35675:18;35667:26;;35739:9;35733:4;35729:20;35725:1;35714:9;35710:17;35703:47;35767:131;35893:4;35767:131;:::i;:::-;35759:139;;35486:419;;;:::o;35911:::-;36077:4;36115:2;36104:9;36100:18;36092:26;;36164:9;36158:4;36154:20;36150:1;36139:9;36135:17;36128:47;36192:131;36318:4;36192:131;:::i;:::-;36184:139;;35911:419;;;:::o;36336:::-;36502:4;36540:2;36529:9;36525:18;36517:26;;36589:9;36583:4;36579:20;36575:1;36564:9;36560:17;36553:47;36617:131;36743:4;36617:131;:::i;:::-;36609:139;;36336:419;;;:::o;36761:::-;36927:4;36965:2;36954:9;36950:18;36942:26;;37014:9;37008:4;37004:20;37000:1;36989:9;36985:17;36978:47;37042:131;37168:4;37042:131;:::i;:::-;37034:139;;36761:419;;;:::o;37186:::-;37352:4;37390:2;37379:9;37375:18;37367:26;;37439:9;37433:4;37429:20;37425:1;37414:9;37410:17;37403:47;37467:131;37593:4;37467:131;:::i;:::-;37459:139;;37186:419;;;:::o;37611:::-;37777:4;37815:2;37804:9;37800:18;37792:26;;37864:9;37858:4;37854:20;37850:1;37839:9;37835:17;37828:47;37892:131;38018:4;37892:131;:::i;:::-;37884:139;;37611:419;;;:::o;38036:::-;38202:4;38240:2;38229:9;38225:18;38217:26;;38289:9;38283:4;38279:20;38275:1;38264:9;38260:17;38253:47;38317:131;38443:4;38317:131;:::i;:::-;38309:139;;38036:419;;;:::o;38461:::-;38627:4;38665:2;38654:9;38650:18;38642:26;;38714:9;38708:4;38704:20;38700:1;38689:9;38685:17;38678:47;38742:131;38868:4;38742:131;:::i;:::-;38734:139;;38461:419;;;:::o;38886:::-;39052:4;39090:2;39079:9;39075:18;39067:26;;39139:9;39133:4;39129:20;39125:1;39114:9;39110:17;39103:47;39167:131;39293:4;39167:131;:::i;:::-;39159:139;;38886:419;;;:::o;39311:::-;39477:4;39515:2;39504:9;39500:18;39492:26;;39564:9;39558:4;39554:20;39550:1;39539:9;39535:17;39528:47;39592:131;39718:4;39592:131;:::i;:::-;39584:139;;39311:419;;;:::o;39736:::-;39902:4;39940:2;39929:9;39925:18;39917:26;;39989:9;39983:4;39979:20;39975:1;39964:9;39960:17;39953:47;40017:131;40143:4;40017:131;:::i;:::-;40009:139;;39736:419;;;:::o;40161:::-;40327:4;40365:2;40354:9;40350:18;40342:26;;40414:9;40408:4;40404:20;40400:1;40389:9;40385:17;40378:47;40442:131;40568:4;40442:131;:::i;:::-;40434:139;;40161:419;;;:::o;40586:222::-;40679:4;40717:2;40706:9;40702:18;40694:26;;40730:71;40798:1;40787:9;40783:17;40774:6;40730:71;:::i;:::-;40586:222;;;;:::o;40814:129::-;40848:6;40875:20;;:::i;:::-;40865:30;;40904:33;40932:4;40924:6;40904:33;:::i;:::-;40814:129;;;:::o;40949:75::-;40982:6;41015:2;41009:9;40999:19;;40949:75;:::o;41030:311::-;41107:4;41197:18;41189:6;41186:30;41183:56;;;41219:18;;:::i;:::-;41183:56;41269:4;41261:6;41257:17;41249:25;;41329:4;41323;41319:15;41311:23;;41030:311;;;:::o;41347:307::-;41408:4;41498:18;41490:6;41487:30;41484:56;;;41520:18;;:::i;:::-;41484:56;41558:29;41580:6;41558:29;:::i;:::-;41550:37;;41642:4;41636;41632:15;41624:23;;41347:307;;;:::o;41660:308::-;41722:4;41812:18;41804:6;41801:30;41798:56;;;41834:18;;:::i;:::-;41798:56;41872:29;41894:6;41872:29;:::i;:::-;41864:37;;41956:4;41950;41946:15;41938:23;;41660:308;;;:::o;41974:141::-;42023:4;42046:3;42038:11;;42069:3;42066:1;42059:14;42103:4;42100:1;42090:18;42082:26;;41974:141;;;:::o;42121:98::-;42172:6;42206:5;42200:12;42190:22;;42121:98;;;:::o;42225:99::-;42277:6;42311:5;42305:12;42295:22;;42225:99;;;:::o;42330:168::-;42413:11;42447:6;42442:3;42435:19;42487:4;42482:3;42478:14;42463:29;;42330:168;;;;:::o;42504:169::-;42588:11;42622:6;42617:3;42610:19;42662:4;42657:3;42653:14;42638:29;;42504:169;;;;:::o;42679:148::-;42781:11;42818:3;42803:18;;42679:148;;;;:::o;42833:305::-;42873:3;42892:20;42910:1;42892:20;:::i;:::-;42887:25;;42926:20;42944:1;42926:20;:::i;:::-;42921:25;;43080:1;43012:66;43008:74;43005:1;43002:81;42999:107;;;43086:18;;:::i;:::-;42999:107;43130:1;43127;43123:9;43116:16;;42833:305;;;;:::o;43144:237::-;43182:3;43201:18;43217:1;43201:18;:::i;:::-;43196:23;;43233:18;43249:1;43233:18;:::i;:::-;43228:23;;43323:1;43317:4;43313:12;43310:1;43307:19;43304:45;;;43329:18;;:::i;:::-;43304:45;43373:1;43370;43366:9;43359:16;;43144:237;;;;:::o;43387:185::-;43427:1;43444:20;43462:1;43444:20;:::i;:::-;43439:25;;43478:20;43496:1;43478:20;:::i;:::-;43473:25;;43517:1;43507:35;;43522:18;;:::i;:::-;43507:35;43564:1;43561;43557:9;43552:14;;43387:185;;;;:::o;43578:348::-;43618:7;43641:20;43659:1;43641:20;:::i;:::-;43636:25;;43675:20;43693:1;43675:20;:::i;:::-;43670:25;;43863:1;43795:66;43791:74;43788:1;43785:81;43780:1;43773:9;43766:17;43762:105;43759:131;;;43870:18;;:::i;:::-;43759:131;43918:1;43915;43911:9;43900:20;;43578:348;;;;:::o;43932:191::-;43972:4;43992:20;44010:1;43992:20;:::i;:::-;43987:25;;44026:20;44044:1;44026:20;:::i;:::-;44021:25;;44065:1;44062;44059:8;44056:34;;;44070:18;;:::i;:::-;44056:34;44115:1;44112;44108:9;44100:17;;43932:191;;;;:::o;44129:96::-;44166:7;44195:24;44213:5;44195:24;:::i;:::-;44184:35;;44129:96;;;:::o;44231:90::-;44265:7;44308:5;44301:13;44294:21;44283:32;;44231:90;;;:::o;44327:77::-;44364:7;44393:5;44382:16;;44327:77;;;:::o;44410:149::-;44446:7;44486:66;44479:5;44475:78;44464:89;;44410:149;;;:::o;44565:126::-;44602:7;44642:42;44635:5;44631:54;44620:65;;44565:126;;;:::o;44697:77::-;44734:7;44763:5;44752:16;;44697:77;;;:::o;44780:86::-;44815:7;44855:4;44848:5;44844:16;44833:27;;44780:86;;;:::o;44872:154::-;44956:6;44951:3;44946;44933:30;45018:1;45009:6;45004:3;45000:16;44993:27;44872:154;;;:::o;45032:307::-;45100:1;45110:113;45124:6;45121:1;45118:13;45110:113;;;45209:1;45204:3;45200:11;45194:18;45190:1;45185:3;45181:11;45174:39;45146:2;45143:1;45139:10;45134:15;;45110:113;;;45241:6;45238:1;45235:13;45232:101;;;45321:1;45312:6;45307:3;45303:16;45296:27;45232:101;45081:258;45032:307;;;:::o;45345:320::-;45389:6;45426:1;45420:4;45416:12;45406:22;;45473:1;45467:4;45463:12;45494:18;45484:81;;45550:4;45542:6;45538:17;45528:27;;45484:81;45612:2;45604:6;45601:14;45581:18;45578:38;45575:84;;;45631:18;;:::i;:::-;45575:84;45396:269;45345:320;;;:::o;45671:281::-;45754:27;45776:4;45754:27;:::i;:::-;45746:6;45742:40;45884:6;45872:10;45869:22;45848:18;45836:10;45833:34;45830:62;45827:88;;;45895:18;;:::i;:::-;45827:88;45935:10;45931:2;45924:22;45714:238;45671:281;;:::o;45958:233::-;45997:3;46020:24;46038:5;46020:24;:::i;:::-;46011:33;;46066:66;46059:5;46056:77;46053:103;;;46136:18;;:::i;:::-;46053:103;46183:1;46176:5;46172:13;46165:20;;45958:233;;;:::o;46197:180::-;46245:77;46242:1;46235:88;46342:4;46339:1;46332:15;46366:4;46363:1;46356:15;46383:180;46431:77;46428:1;46421:88;46528:4;46525:1;46518:15;46552:4;46549:1;46542:15;46569:180;46617:77;46614:1;46607:88;46714:4;46711:1;46704:15;46738:4;46735:1;46728:15;46755:180;46803:77;46800:1;46793:88;46900:4;46897:1;46890:15;46924:4;46921:1;46914:15;46941:180;46989:77;46986:1;46979:88;47086:4;47083:1;47076:15;47110:4;47107:1;47100:15;47127:180;47175:77;47172:1;47165:88;47272:4;47269:1;47262:15;47296:4;47293:1;47286:15;47313:117;47422:1;47419;47412:12;47436:117;47545:1;47542;47535:12;47559:117;47668:1;47665;47658:12;47682:117;47791:1;47788;47781:12;47805:117;47914:1;47911;47904:12;47928:102;47969:6;48020:2;48016:7;48011:2;48004:5;48000:14;47996:28;47986:38;;47928:102;;;:::o;48036:168::-;48176:20;48172:1;48164:6;48160:14;48153:44;48036:168;:::o;48210:164::-;48350:16;48346:1;48338:6;48334:14;48327:40;48210:164;:::o;48380:230::-;48520:34;48516:1;48508:6;48504:14;48497:58;48589:13;48584:2;48576:6;48572:15;48565:38;48380:230;:::o;48616:237::-;48756:34;48752:1;48744:6;48740:14;48733:58;48825:20;48820:2;48812:6;48808:15;48801:45;48616:237;:::o;48859:225::-;48999:34;48995:1;48987:6;48983:14;48976:58;49068:8;49063:2;49055:6;49051:15;49044:33;48859:225;:::o;49090:178::-;49230:30;49226:1;49218:6;49214:14;49207:54;49090:178;:::o;49274:223::-;49414:34;49410:1;49402:6;49398:14;49391:58;49483:6;49478:2;49470:6;49466:15;49459:31;49274:223;:::o;49503:175::-;49643:27;49639:1;49631:6;49627:14;49620:51;49503:175;:::o;49684:226::-;49824:34;49820:1;49812:6;49808:14;49801:58;49893:9;49888:2;49880:6;49876:15;49869:34;49684:226;:::o;49916:174::-;50056:26;50052:1;50044:6;50040:14;50033:50;49916:174;:::o;50096:231::-;50236:34;50232:1;50224:6;50220:14;50213:58;50305:14;50300:2;50292:6;50288:15;50281:39;50096:231;:::o;50333:243::-;50473:34;50469:1;50461:6;50457:14;50450:58;50542:26;50537:2;50529:6;50525:15;50518:51;50333:243;:::o;50582:229::-;50722:34;50718:1;50710:6;50706:14;50699:58;50791:12;50786:2;50778:6;50774:15;50767:37;50582:229;:::o;50817:228::-;50957:34;50953:1;50945:6;50941:14;50934:58;51026:11;51021:2;51013:6;51009:15;51002:36;50817:228;:::o;51051:182::-;51191:34;51187:1;51179:6;51175:14;51168:58;51051:182;:::o;51239:231::-;51379:34;51375:1;51367:6;51363:14;51356:58;51448:14;51443:2;51435:6;51431:15;51424:39;51239:231;:::o;51476:155::-;51616:7;51612:1;51604:6;51600:14;51593:31;51476:155;:::o;51637:182::-;51777:34;51773:1;51765:6;51761:14;51754:58;51637:182;:::o;51825:154::-;51965:6;51961:1;51953:6;51949:14;51942:30;51825:154;:::o;51985:228::-;52125:34;52121:1;52113:6;52109:14;52102:58;52194:11;52189:2;52181:6;52177:15;52170:36;51985:228;:::o;52219:222::-;52359:34;52355:1;52347:6;52343:14;52336:58;52428:5;52423:2;52415:6;52411:15;52404:30;52219:222;:::o;52447:220::-;52587:34;52583:1;52575:6;52571:14;52564:58;52656:3;52651:2;52643:6;52639:15;52632:28;52447:220;:::o;52673:236::-;52813:34;52809:1;52801:6;52797:14;52790:58;52882:19;52877:2;52869:6;52865:15;52858:44;52673:236;:::o;52915:169::-;53055:21;53051:1;53043:6;53039:14;53032:45;52915:169;:::o;53090:231::-;53230:34;53226:1;53218:6;53214:14;53207:58;53299:14;53294:2;53286:6;53282:15;53275:39;53090:231;:::o;53327:168::-;53467:20;53463:1;53455:6;53451:14;53444:44;53327:168;:::o;53501:171::-;53641:23;53637:1;53629:6;53625:14;53618:47;53501:171;:::o;53678:151::-;53818:3;53814:1;53806:6;53802:14;53795:27;53678:151;:::o;53835:237::-;53975:34;53971:1;53963:6;53959:14;53952:58;54044:20;54039:2;54031:6;54027:15;54020:45;53835:237;:::o;54078:122::-;54151:24;54169:5;54151:24;:::i;:::-;54144:5;54141:35;54131:63;;54190:1;54187;54180:12;54131:63;54078:122;:::o;54206:116::-;54276:21;54291:5;54276:21;:::i;:::-;54269:5;54266:32;54256:60;;54312:1;54309;54302:12;54256:60;54206:116;:::o;54328:122::-;54401:24;54419:5;54401:24;:::i;:::-;54394:5;54391:35;54381:63;;54440:1;54437;54430:12;54381:63;54328:122;:::o;54456:120::-;54528:23;54545:5;54528:23;:::i;:::-;54521:5;54518:34;54508:62;;54566:1;54563;54556:12;54508:62;54456:120;:::o;54582:122::-;54655:24;54673:5;54655:24;:::i;:::-;54648:5;54645:35;54635:63;;54694:1;54691;54684:12;54635:63;54582:122;:::o
Swarm Source
ipfs://676dfd8f63ea2e399e56cd1f3573f0c7e0be405db93d07065ddc6d3747e972aa
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.