Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 27 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Safe Transfer Fr... | 17981341 | 918 days ago | IN | 0 ETH | 0.00128127 | ||||
| Withdraw All | 15846713 | 1218 days ago | IN | 0 ETH | 0.00029979 | ||||
| Mint | 15846708 | 1218 days ago | IN | 0.02 ETH | 0.00170356 | ||||
| Withdraw All | 15846703 | 1218 days ago | IN | 0 ETH | 0.00034973 | ||||
| Mint | 15846699 | 1218 days ago | IN | 0.02 ETH | 0.00178972 | ||||
| Withdraw All | 15846695 | 1218 days ago | IN | 0 ETH | 0.00037979 | ||||
| Mint | 15846690 | 1218 days ago | IN | 0.02 ETH | 0.00201793 | ||||
| Withdraw All | 15846685 | 1218 days ago | IN | 0 ETH | 0.00036761 | ||||
| Mint | 15846680 | 1218 days ago | IN | 0.02 ETH | 0.00170227 | ||||
| Withdraw All | 15846674 | 1218 days ago | IN | 0 ETH | 0.00034807 | ||||
| Mint | 15846575 | 1218 days ago | IN | 0.02 ETH | 0.0022152 | ||||
| Safe Transfer Fr... | 15469337 | 1272 days ago | IN | 0 ETH | 0.00051438 | ||||
| Withdraw All | 15469230 | 1272 days ago | IN | 0 ETH | 0.00017271 | ||||
| Mint | 15469208 | 1272 days ago | IN | 0.02 ETH | 0.00115259 | ||||
| Set Approval For... | 15466197 | 1273 days ago | IN | 0 ETH | 0.00026463 | ||||
| Mint | 15466185 | 1273 days ago | IN | 0.02 ETH | 0.00106981 | ||||
| Mint | 15465881 | 1273 days ago | IN | 0.02 ETH | 0.00125415 | ||||
| Mint | 15463703 | 1273 days ago | IN | 0.02 ETH | 0.00147277 | ||||
| Set Approval For... | 15462664 | 1273 days ago | IN | 0 ETH | 0.00041412 | ||||
| Mint | 15462642 | 1273 days ago | IN | 0.02 ETH | 0.00116718 | ||||
| Set Approval For... | 15462626 | 1273 days ago | IN | 0 ETH | 0.00035698 | ||||
| Mint | 15462591 | 1273 days ago | IN | 0.02 ETH | 0.00106956 | ||||
| Mint | 15462584 | 1273 days ago | IN | 0.02 ETH | 0.00112928 | ||||
| Withdraw All | 15425148 | 1279 days ago | IN | 0 ETH | 0.00022189 | ||||
| Mint | 15425055 | 1279 days ago | IN | 0.02 ETH | 0.00080773 |
Latest 7 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 15846713 | 1218 days ago | 0.02 ETH | ||||
| Transfer | 15846703 | 1218 days ago | 0.02 ETH | ||||
| Transfer | 15846695 | 1218 days ago | 0.02 ETH | ||||
| Transfer | 15846685 | 1218 days ago | 0.02 ETH | ||||
| Transfer | 15846674 | 1218 days ago | 0.02 ETH | ||||
| Transfer | 15469230 | 1272 days ago | 0.14 ETH | ||||
| Transfer | 15425148 | 1279 days ago | 0.02 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BBCToken
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-09-02
*/
// File: @openzeppelin/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts v4.4.1 (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 generally not needed starting with Solidity 0.8, since 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/Strings.sol
// OpenZeppelin Contracts v4.4.1 (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
// OpenZeppelin Contracts v4.4.1 (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/access/Ownable.sol
// OpenZeppelin Contracts v4.4.1 (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() {
_transferOwnership(_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 {
_transferOwnership(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");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/security/Pausable.sol
// OpenZeppelin Contracts v4.4.1 (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
// OpenZeppelin Contracts v4.4.1 (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/IERC721Receiver.sol
// OpenZeppelin Contracts v4.4.1 (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/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (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/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (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/token/ERC721/IERC721.sol
// OpenZeppelin Contracts v4.4.1 (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
// OpenZeppelin Contracts v4.4.1 (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/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (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/ERC721.sol
// OpenZeppelin Contracts v4.4.1 (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_;
}
/**
* @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 {
_setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
*
* Emits a {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @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/ERC721Pausable.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC721 token with pausable token transfers, minting and burning.
*
* Useful for scenarios such as preventing trades until the end of an evaluation
* period, or having an emergency switch for freezing all token transfers in the
* event of a large bug.
*/
abstract contract ERC721Pausable is ERC721, Pausable {
/**
* @dev See {ERC721-_beforeTokenTransfer}.
*
* Requirements:
*
* - the contract must not be paused.
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
require(!paused(), "ERC721Pausable: token transfer while paused");
}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 Burnable Token
* @dev ERC721 Token that can be irreversibly burned (destroyed).
*/
abstract contract ERC721Burnable is Context, ERC721 {
/**
* @dev Burns `tokenId`. See {ERC721-_burn}.
*
* Requirements:
*
* - The caller must own `tokenId` or be an approved operator.
*/
function burn(uint256 tokenId) public virtual {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
_burn(tokenId);
}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
// OpenZeppelin Contracts v4.4.1 (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();
}
}
// File: contracts/contract.sol
pragma solidity ^0.8.0;
contract BBCToken is ERC721Enumerable, ERC721Burnable, ERC721Pausable, Ownable {
using SafeMath for uint256;
using Strings for uint256;
uint256 public constant MAX_SUPPLY = 5001;
uint256 public constant PRICE = 0.02 ether;
uint256 public constant PURCHASE_LIMIT = 1;
string private tokenBaseURI = '';
string private baseExtension = ".json";
event CreateToken(uint256 indexed id);
constructor(string memory baseURI) ERC721("Bottles, Buckets & Cans", "BBC") {
setBaseURI(baseURI);
pause(true);
}
modifier saleIsOpen {
require(totalSupply() <= MAX_SUPPLY, "Sale has ended");
if (_msgSender() != owner()) {
require(!paused(), "Contract is paused");
}
_;
}
function mint(address to, uint256 amount) public payable saleIsOpen {
uint256 total = totalSupply();
require(total + amount <= MAX_SUPPLY, "Max token supply exceeded");
require(total <= MAX_SUPPLY, "Sale has ended");
require(amount <= PURCHASE_LIMIT, "Maximum mint per transaction exceeded");
require(msg.value >= PRICE.mul(amount), "Ether sent less than price");
for (uint256 i = 0; i < amount; i++) {
uint id = totalSupply();
_safeMint(to, id);
emit CreateToken(id);
}
}
function _baseURI() internal view virtual override returns (string memory) {
return tokenBaseURI;
}
function setBaseURI(string memory baseURI) public onlyOwner {
tokenBaseURI = baseURI;
}
function pause(bool pauseContract) public onlyOwner {
pauseContract ? _pause() : _unpause();
}
function withdrawAll() external payable onlyOwner {
uint256 amount = address(this).balance;
require(amount > 0);
(bool success, ) = _msgSender().call{value: amount}('');
require(success, 'Transfer failed.');
}
function walletOfOwner(address _owner) external view returns (uint256[] memory) {
uint256 tokenCount = balanceOf(_owner);
uint256[] memory tokensId = new uint256[](tokenCount);
for (uint256 i = 0; i < tokenCount; i++) {
tokensId[i] = tokenOfOwnerByIndex(_owner, i);
}
return tokensId;
}
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(), baseExtension)) : "";
}
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) {
super._beforeTokenTransfer(from, to, tokenId);
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
return super.supportsInterface(interfaceId);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"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":"uint256","name":"id","type":"uint256"}],"name":"CreateToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PURCHASE_LIMIT","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"pauseContract","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
608060405260405180602001604052806000815250600b90805190602001906200002b9291906200059a565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c9080519060200190620000799291906200059a565b503480156200008757600080fd5b5060405162005225380380620052258339818101604052810190620000ad9190620006c8565b6040518060400160405280601781526020017f426f74746c65732c204275636b65747320262043616e730000000000000000008152506040518060400160405280600381526020017f42424300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001319291906200059a565b5080600190805190602001906200014a9291906200059a565b5050506000600a60006101000a81548160ff021916908315150217905550620001886200017c620001b260201b60201c565b620001ba60201b60201c565b62000199816200028060201b60201c565b620001ab60016200032b60201b60201c565b5062000a66565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000290620001b260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002b6620003ea60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200030f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003069062000800565b60405180910390fd5b80600b9080519060200190620003279291906200059a565b5050565b6200033b620001b260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000361620003ea60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b19062000800565b60405180910390fd5b80620003d657620003d06200041460201b60201c565b620003e7565b620003e6620004cb60201b60201c565b5b50565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620004246200058360201b60201c565b62000466576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200045d90620007bc565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa620004b2620001b260201b60201c565b604051620004c191906200079f565b60405180910390a1565b620004db6200058360201b60201c565b156200051e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200051590620007de565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200056a620001b260201b60201c565b6040516200057991906200079f565b60405180910390a1565b6000600a60009054906101000a900460ff16905090565b828054620005a890620008fc565b90600052602060002090601f016020900481019282620005cc576000855562000618565b82601f10620005e757805160ff191683800117855562000618565b8280016001018555821562000618579182015b8281111562000617578251825591602001919060010190620005fa565b5b5090506200062791906200062b565b5090565b5b80821115620006465760008160009055506001016200062c565b5090565b6000620006616200065b846200084b565b62000822565b90508281526020810184848401111562000680576200067f620009cb565b5b6200068d848285620008c6565b509392505050565b600082601f830112620006ad57620006ac620009c6565b5b8151620006bf8482602086016200064a565b91505092915050565b600060208284031215620006e157620006e0620009d5565b5b600082015167ffffffffffffffff811115620007025762000701620009d0565b5b620007108482850162000695565b91505092915050565b620007248162000892565b82525050565b60006200073960148362000881565b91506200074682620009eb565b602082019050919050565b60006200076060108362000881565b91506200076d8262000a14565b602082019050919050565b60006200078760208362000881565b9150620007948262000a3d565b602082019050919050565b6000602082019050620007b6600083018462000719565b92915050565b60006020820190508181036000830152620007d7816200072a565b9050919050565b60006020820190508181036000830152620007f98162000751565b9050919050565b600060208201905081810360008301526200081b8162000778565b9050919050565b60006200082e62000841565b90506200083c828262000932565b919050565b6000604051905090565b600067ffffffffffffffff82111562000869576200086862000997565b5b6200087482620009da565b9050602081019050919050565b600082825260208201905092915050565b60006200089f82620008a6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620008e6578082015181840152602081019050620008c9565b83811115620008f6576000848401525b50505050565b600060028204905060018216806200091557607f821691505b602082108114156200092c576200092b62000968565b5b50919050565b6200093d82620009da565b810181811067ffffffffffffffff821117156200095f576200095e62000997565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6147af8062000a766000396000f3fe6080604052600436106101c25760003560e01c806355f804b3116100f75780638da5cb5b11610095578063c87b56dd11610064578063c87b56dd14610624578063d75e611014610661578063e985e9c51461068c578063f2fde38b146106c9576101c2565b80638da5cb5b1461057c57806395d89b41146105a7578063a22cb465146105d2578063b88d4fde146105fb576101c2565b806370a08231116100d157806370a08231146104f3578063715018a614610530578063853828b6146105475780638d859f3e14610551576101c2565b806355f804b3146104625780635c975abb1461048b5780636352211e146104b6576101c2565b80632f745c591161016457806342842e0e1161013e57806342842e0e1461039657806342966c68146103bf578063438b6300146103e85780634f6ccce714610425576101c2565b80632f745c591461031257806332cb6b0c1461034f57806340c10f191461037a576101c2565b8063081812fc116101a0578063081812fc14610258578063095ea7b31461029557806318160ddd146102be57806323b872dd146102e9576101c2565b806301ffc9a7146101c757806302329a291461020457806306fdde031461022d575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612fcc565b6106f2565b6040516101fb9190613736565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190612f9f565b610704565b005b34801561023957600080fd5b5061024261079e565b60405161024f9190613751565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a919061306f565b610830565b60405161028c91906136ad565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190612f5f565b6108b5565b005b3480156102ca57600080fd5b506102d36109cd565b6040516102e09190613af3565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e49565b6109da565b005b34801561031e57600080fd5b5061033960048036038101906103349190612f5f565b610a3a565b6040516103469190613af3565b60405180910390f35b34801561035b57600080fd5b50610364610adf565b6040516103719190613af3565b60405180910390f35b610394600480360381019061038f9190612f5f565b610ae5565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190612e49565b610d64565b005b3480156103cb57600080fd5b506103e660048036038101906103e1919061306f565b610d84565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190612ddc565b610de0565b60405161041c9190613714565b60405180910390f35b34801561043157600080fd5b5061044c6004803603810190610447919061306f565b610e8e565b6040516104599190613af3565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613026565b610eff565b005b34801561049757600080fd5b506104a0610f95565b6040516104ad9190613736565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d8919061306f565b610fac565b6040516104ea91906136ad565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190612ddc565b61105e565b6040516105279190613af3565b60405180910390f35b34801561053c57600080fd5b50610545611116565b005b61054f61119e565b005b34801561055d57600080fd5b506105666112e3565b6040516105739190613af3565b60405180910390f35b34801561058857600080fd5b506105916112ee565b60405161059e91906136ad565b60405180910390f35b3480156105b357600080fd5b506105bc611318565b6040516105c99190613751565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190612f1f565b6113aa565b005b34801561060757600080fd5b50610622600480360381019061061d9190612e9c565b6113c0565b005b34801561063057600080fd5b5061064b6004803603810190610646919061306f565b611422565b6040516106589190613751565b60405180910390f35b34801561066d57600080fd5b506106766114cc565b6040516106839190613af3565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190612e09565b6114d1565b6040516106c09190613736565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190612ddc565b611565565b005b60006106fd8261165d565b9050919050565b61070c6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661072a6112ee565b73ffffffffffffffffffffffffffffffffffffffff1614610780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077790613993565b60405180910390fd5b806107925761078d6116df565b61079b565b61079a611781565b5b50565b6060600080546107ad90613dfc565b80601f01602080910402602001604051908101604052809291908181526020018280546107d990613dfc565b80156108265780601f106107fb57610100808354040283529160200191610826565b820191906000526020600020905b81548152906001019060200180831161080957829003601f168201915b5050505050905090565b600061083b82611824565b61087a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087190613973565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c082610fac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092890613a13565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109506116d7565b73ffffffffffffffffffffffffffffffffffffffff16148061097f575061097e816109796116d7565b6114d1565b5b6109be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b5906138f3565b60405180910390fd5b6109c88383611890565b505050565b6000600880549050905090565b6109eb6109e56116d7565b82611949565b610a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2190613a53565b60405180910390fd5b610a35838383611a27565b505050565b6000610a458361105e565b8210610a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7d906137b3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61138981565b611389610af06109cd565b1115610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890613833565b60405180910390fd5b610b396112ee565b73ffffffffffffffffffffffffffffffffffffffff16610b576116d7565b73ffffffffffffffffffffffffffffffffffffffff1614610bbb57610b7a610f95565b15610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb190613a93565b60405180910390fd5b5b6000610bc56109cd565b90506113898282610bd69190613c31565b1115610c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0e906139f3565b60405180910390fd5b611389811115610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390613833565b60405180910390fd5b6001821115610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790613893565b60405180910390fd5b610cba8266470de4df820000611c8390919063ffffffff16565b341015610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390613ad3565b60405180910390fd5b60005b82811015610d5e576000610d116109cd565b9050610d1d8582611c99565b807f9c0e4c917c5a85a068b952248cbde09f1a91e0c60faa6744178ac4e82029bd5560405160405180910390a2508080610d5690613e5f565b915050610cff565b50505050565b610d7f838383604051806020016040528060008152506113c0565b505050565b610d95610d8f6116d7565b82611949565b610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90613ab3565b60405180910390fd5b610ddd81611cb7565b50565b60606000610ded8361105e565b905060008167ffffffffffffffff811115610e0b57610e0a613fc4565b5b604051908082528060200260200182016040528015610e395781602001602082028036833780820191505090505b50905060005b82811015610e8357610e518582610a3a565b828281518110610e6457610e63613f95565b5b6020026020010181815250508080610e7b90613e5f565b915050610e3f565b508092505050919050565b6000610e986109cd565b8210610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090613a73565b60405180910390fd5b60088281548110610eed57610eec613f95565b5b90600052602060002001549050919050565b610f076116d7565b73ffffffffffffffffffffffffffffffffffffffff16610f256112ee565b73ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290613993565b60405180910390fd5b80600b9080519060200190610f91929190612bf0565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c90613933565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690613913565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61111e6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661113c6112ee565b73ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990613993565b60405180910390fd5b61119c6000611dc8565b565b6111a66116d7565b73ffffffffffffffffffffffffffffffffffffffff166111c46112ee565b73ffffffffffffffffffffffffffffffffffffffff161461121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121190613993565b60405180910390fd5b60004790506000811161122c57600080fd5b60006112366116d7565b73ffffffffffffffffffffffffffffffffffffffff168260405161125990613698565b60006040518083038185875af1925050503d8060008114611296576040519150601f19603f3d011682016040523d82523d6000602084013e61129b565b606091505b50509050806112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d690613a33565b60405180910390fd5b5050565b66470de4df82000081565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461132790613dfc565b80601f016020809104026020016040519081016040528092919081815260200182805461135390613dfc565b80156113a05780601f10611375576101008083540402835291602001916113a0565b820191906000526020600020905b81548152906001019060200180831161138357829003601f168201915b5050505050905090565b6113bc6113b56116d7565b8383611e8e565b5050565b6113d16113cb6116d7565b83611949565b611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790613a53565b60405180910390fd5b61141c84848484611ffb565b50505050565b606061142d82611824565b61146c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611463906139d3565b60405180910390fd5b6000611476612057565b9050600081511161149657604051806020016040528060008152506114c4565b806114a0846120e9565b600c6040516020016114b493929190613667565b6040516020818303038152906040525b915050919050565b600181565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61156d6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661158b6112ee565b73ffffffffffffffffffffffffffffffffffffffff16146115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890613993565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906137f3565b60405180910390fd5b61165a81611dc8565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116d057506116cf8261224a565b5b9050919050565b600033905090565b6116e7610f95565b611726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171d90613793565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61176a6116d7565b60405161177791906136ad565b60405180910390a1565b611789610f95565b156117c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c0906138d3565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861180d6116d7565b60405161181a91906136ad565b60405180910390a1565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661190383610fac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061195482611824565b611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a906138b3565b60405180910390fd5b600061199e83610fac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a0d57508373ffffffffffffffffffffffffffffffffffffffff166119f584610830565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a1e5750611a1d81856114d1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a4782610fac565b73ffffffffffffffffffffffffffffffffffffffff1614611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a94906139b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490613853565b60405180910390fd5b611b1883838361232c565b611b23600082611890565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b739190613d12565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bca9190613c31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611c919190613cb8565b905092915050565b611cb382826040518060200160405280600081525061233c565b5050565b6000611cc282610fac565b9050611cd08160008461232c565b611cdb600083611890565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2b9190613d12565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490613873565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fee9190613736565b60405180910390a3505050565b612006848484611a27565b61201284848484612397565b612051576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612048906137d3565b60405180910390fd5b50505050565b6060600b805461206690613dfc565b80601f016020809104026020016040519081016040528092919081815260200182805461209290613dfc565b80156120df5780601f106120b4576101008083540402835291602001916120df565b820191906000526020600020905b8154815290600101906020018083116120c257829003601f168201915b5050505050905090565b60606000821415612131576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612245565b600082905060005b6000821461216357808061214c90613e5f565b915050600a8261215c9190613c87565b9150612139565b60008167ffffffffffffffff81111561217f5761217e613fc4565b5b6040519080825280601f01601f1916602001820160405280156121b15781602001600182028036833780820191505090505b5090505b6000851461223e576001826121ca9190613d12565b9150600a856121d99190613ea8565b60306121e59190613c31565b60f81b8183815181106121fb576121fa613f95565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122379190613c87565b94506121b5565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061231557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061232557506123248261252e565b5b9050919050565b612337838383612598565b505050565b61234683836125f0565b6123536000848484612397565b612392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612389906137d3565b60405180910390fd5b505050565b60006123b88473ffffffffffffffffffffffffffffffffffffffff166127be565b15612521578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123e16116d7565b8786866040518563ffffffff1660e01b815260040161240394939291906136c8565b602060405180830381600087803b15801561241d57600080fd5b505af192505050801561244e57506040513d601f19601f8201168201806040525081019061244b9190612ff9565b60015b6124d1573d806000811461247e576040519150601f19603f3d011682016040523d82523d6000602084013e612483565b606091505b506000815114156124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c0906137d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612526565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125a38383836127d1565b6125ab610f95565b156125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e290613773565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265790613953565b60405180910390fd5b61266981611824565b156126a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a090613813565b60405180910390fd5b6126b56000838361232c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127059190613c31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6127dc8383836128e5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561281f5761281a816128ea565b61285e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461285d5761285c8382612933565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128a15761289c81612aa0565b6128e0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146128df576128de8282612b71565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129408461105e565b61294a9190613d12565b9050600060076000848152602001908152602001600020549050818114612a2f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ab49190613d12565b9050600060096000848152602001908152602001600020549050600060088381548110612ae457612ae3613f95565b5b906000526020600020015490508060088381548110612b0657612b05613f95565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b5557612b54613f66565b5b6001900381819060005260206000200160009055905550505050565b6000612b7c8361105e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612bfc90613dfc565b90600052602060002090601f016020900481019282612c1e5760008555612c65565b82601f10612c3757805160ff1916838001178555612c65565b82800160010185558215612c65579182015b82811115612c64578251825591602001919060010190612c49565b5b509050612c729190612c76565b5090565b5b80821115612c8f576000816000905550600101612c77565b5090565b6000612ca6612ca184613b33565b613b0e565b905082815260208101848484011115612cc257612cc1613ff8565b5b612ccd848285613dba565b509392505050565b6000612ce8612ce384613b64565b613b0e565b905082815260208101848484011115612d0457612d03613ff8565b5b612d0f848285613dba565b509392505050565b600081359050612d268161471d565b92915050565b600081359050612d3b81614734565b92915050565b600081359050612d508161474b565b92915050565b600081519050612d658161474b565b92915050565b600082601f830112612d8057612d7f613ff3565b5b8135612d90848260208601612c93565b91505092915050565b600082601f830112612dae57612dad613ff3565b5b8135612dbe848260208601612cd5565b91505092915050565b600081359050612dd681614762565b92915050565b600060208284031215612df257612df1614002565b5b6000612e0084828501612d17565b91505092915050565b60008060408385031215612e2057612e1f614002565b5b6000612e2e85828601612d17565b9250506020612e3f85828601612d17565b9150509250929050565b600080600060608486031215612e6257612e61614002565b5b6000612e7086828701612d17565b9350506020612e8186828701612d17565b9250506040612e9286828701612dc7565b9150509250925092565b60008060008060808587031215612eb657612eb5614002565b5b6000612ec487828801612d17565b9450506020612ed587828801612d17565b9350506040612ee687828801612dc7565b925050606085013567ffffffffffffffff811115612f0757612f06613ffd565b5b612f1387828801612d6b565b91505092959194509250565b60008060408385031215612f3657612f35614002565b5b6000612f4485828601612d17565b9250506020612f5585828601612d2c565b9150509250929050565b60008060408385031215612f7657612f75614002565b5b6000612f8485828601612d17565b9250506020612f9585828601612dc7565b9150509250929050565b600060208284031215612fb557612fb4614002565b5b6000612fc384828501612d2c565b91505092915050565b600060208284031215612fe257612fe1614002565b5b6000612ff084828501612d41565b91505092915050565b60006020828403121561300f5761300e614002565b5b600061301d84828501612d56565b91505092915050565b60006020828403121561303c5761303b614002565b5b600082013567ffffffffffffffff81111561305a57613059613ffd565b5b61306684828501612d99565b91505092915050565b60006020828403121561308557613084614002565b5b600061309384828501612dc7565b91505092915050565b60006130a88383613649565b60208301905092915050565b6130bd81613d46565b82525050565b60006130ce82613bba565b6130d88185613be8565b93506130e383613b95565b8060005b838110156131145781516130fb888261309c565b975061310683613bdb565b9250506001810190506130e7565b5085935050505092915050565b61312a81613d58565b82525050565b600061313b82613bc5565b6131458185613bf9565b9350613155818560208601613dc9565b61315e81614007565b840191505092915050565b600061317482613bd0565b61317e8185613c15565b935061318e818560208601613dc9565b61319781614007565b840191505092915050565b60006131ad82613bd0565b6131b78185613c26565b93506131c7818560208601613dc9565b80840191505092915050565b600081546131e081613dfc565b6131ea8186613c26565b94506001821660008114613205576001811461321657613249565b60ff19831686528186019350613249565b61321f85613ba5565b60005b8381101561324157815481890152600182019150602081019050613222565b838801955050505b50505092915050565b600061325f602b83613c15565b915061326a82614018565b604082019050919050565b6000613282601483613c15565b915061328d82614067565b602082019050919050565b60006132a5602b83613c15565b91506132b082614090565b604082019050919050565b60006132c8603283613c15565b91506132d3826140df565b604082019050919050565b60006132eb602683613c15565b91506132f68261412e565b604082019050919050565b600061330e601c83613c15565b91506133198261417d565b602082019050919050565b6000613331600e83613c15565b915061333c826141a6565b602082019050919050565b6000613354602483613c15565b915061335f826141cf565b604082019050919050565b6000613377601983613c15565b91506133828261421e565b602082019050919050565b600061339a602583613c15565b91506133a582614247565b604082019050919050565b60006133bd602c83613c15565b91506133c882614296565b604082019050919050565b60006133e0601083613c15565b91506133eb826142e5565b602082019050919050565b6000613403603883613c15565b915061340e8261430e565b604082019050919050565b6000613426602a83613c15565b91506134318261435d565b604082019050919050565b6000613449602983613c15565b9150613454826143ac565b604082019050919050565b600061346c602083613c15565b9150613477826143fb565b602082019050919050565b600061348f602c83613c15565b915061349a82614424565b604082019050919050565b60006134b2602083613c15565b91506134bd82614473565b602082019050919050565b60006134d5602983613c15565b91506134e08261449c565b604082019050919050565b60006134f8602f83613c15565b9150613503826144eb565b604082019050919050565b600061351b601983613c15565b91506135268261453a565b602082019050919050565b600061353e602183613c15565b915061354982614563565b604082019050919050565b6000613561600083613c0a565b915061356c826145b2565b600082019050919050565b6000613584601083613c15565b915061358f826145b5565b602082019050919050565b60006135a7603183613c15565b91506135b2826145de565b604082019050919050565b60006135ca602c83613c15565b91506135d58261462d565b604082019050919050565b60006135ed601283613c15565b91506135f88261467c565b602082019050919050565b6000613610603083613c15565b915061361b826146a5565b604082019050919050565b6000613633601a83613c15565b915061363e826146f4565b602082019050919050565b61365281613db0565b82525050565b61366181613db0565b82525050565b600061367382866131a2565b915061367f82856131a2565b915061368b82846131d3565b9150819050949350505050565b60006136a382613554565b9150819050919050565b60006020820190506136c260008301846130b4565b92915050565b60006080820190506136dd60008301876130b4565b6136ea60208301866130b4565b6136f76040830185613658565b81810360608301526137098184613130565b905095945050505050565b6000602082019050818103600083015261372e81846130c3565b905092915050565b600060208201905061374b6000830184613121565b92915050565b6000602082019050818103600083015261376b8184613169565b905092915050565b6000602082019050818103600083015261378c81613252565b9050919050565b600060208201905081810360008301526137ac81613275565b9050919050565b600060208201905081810360008301526137cc81613298565b9050919050565b600060208201905081810360008301526137ec816132bb565b9050919050565b6000602082019050818103600083015261380c816132de565b9050919050565b6000602082019050818103600083015261382c81613301565b9050919050565b6000602082019050818103600083015261384c81613324565b9050919050565b6000602082019050818103600083015261386c81613347565b9050919050565b6000602082019050818103600083015261388c8161336a565b9050919050565b600060208201905081810360008301526138ac8161338d565b9050919050565b600060208201905081810360008301526138cc816133b0565b9050919050565b600060208201905081810360008301526138ec816133d3565b9050919050565b6000602082019050818103600083015261390c816133f6565b9050919050565b6000602082019050818103600083015261392c81613419565b9050919050565b6000602082019050818103600083015261394c8161343c565b9050919050565b6000602082019050818103600083015261396c8161345f565b9050919050565b6000602082019050818103600083015261398c81613482565b9050919050565b600060208201905081810360008301526139ac816134a5565b9050919050565b600060208201905081810360008301526139cc816134c8565b9050919050565b600060208201905081810360008301526139ec816134eb565b9050919050565b60006020820190508181036000830152613a0c8161350e565b9050919050565b60006020820190508181036000830152613a2c81613531565b9050919050565b60006020820190508181036000830152613a4c81613577565b9050919050565b60006020820190508181036000830152613a6c8161359a565b9050919050565b60006020820190508181036000830152613a8c816135bd565b9050919050565b60006020820190508181036000830152613aac816135e0565b9050919050565b60006020820190508181036000830152613acc81613603565b9050919050565b60006020820190508181036000830152613aec81613626565b9050919050565b6000602082019050613b086000830184613658565b92915050565b6000613b18613b29565b9050613b248282613e2e565b919050565b6000604051905090565b600067ffffffffffffffff821115613b4e57613b4d613fc4565b5b613b5782614007565b9050602081019050919050565b600067ffffffffffffffff821115613b7f57613b7e613fc4565b5b613b8882614007565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c3c82613db0565b9150613c4783613db0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c7c57613c7b613ed9565b5b828201905092915050565b6000613c9282613db0565b9150613c9d83613db0565b925082613cad57613cac613f08565b5b828204905092915050565b6000613cc382613db0565b9150613cce83613db0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d0757613d06613ed9565b5b828202905092915050565b6000613d1d82613db0565b9150613d2883613db0565b925082821015613d3b57613d3a613ed9565b5b828203905092915050565b6000613d5182613d90565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613de7578082015181840152602081019050613dcc565b83811115613df6576000848401525b50505050565b60006002820490506001821680613e1457607f821691505b60208210811415613e2857613e27613f37565b5b50919050565b613e3782614007565b810181811067ffffffffffffffff82111715613e5657613e55613fc4565b5b80604052505050565b6000613e6a82613db0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e9d57613e9c613ed9565b5b600182019050919050565b6000613eb382613db0565b9150613ebe83613db0565b925082613ece57613ecd613f08565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c652068617320656e646564000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178696d756d206d696e7420706572207472616e73616374696f6e2065786360008201527f6565646564000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d617820746f6b656e20737570706c7920657863656564656400000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f45746865722073656e74206c657373207468616e207072696365000000000000600082015250565b61472681613d46565b811461473157600080fd5b50565b61473d81613d58565b811461474857600080fd5b50565b61475481613d64565b811461475f57600080fd5b50565b61476b81613db0565b811461477657600080fd5b5056fea2646970667358221220008687e5242b5ea0b4f659a184c0a2ad8b84e148db8a4d700c40c70347dcb1a564736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f626166796265696762366d676c6371786f656a74326d646361326a6966776d6972673677686b797533677a707077706a376a6e743572366d75646d2e697066732e6e667473746f726167652e6c696e6b2f00000000000000
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806355f804b3116100f75780638da5cb5b11610095578063c87b56dd11610064578063c87b56dd14610624578063d75e611014610661578063e985e9c51461068c578063f2fde38b146106c9576101c2565b80638da5cb5b1461057c57806395d89b41146105a7578063a22cb465146105d2578063b88d4fde146105fb576101c2565b806370a08231116100d157806370a08231146104f3578063715018a614610530578063853828b6146105475780638d859f3e14610551576101c2565b806355f804b3146104625780635c975abb1461048b5780636352211e146104b6576101c2565b80632f745c591161016457806342842e0e1161013e57806342842e0e1461039657806342966c68146103bf578063438b6300146103e85780634f6ccce714610425576101c2565b80632f745c591461031257806332cb6b0c1461034f57806340c10f191461037a576101c2565b8063081812fc116101a0578063081812fc14610258578063095ea7b31461029557806318160ddd146102be57806323b872dd146102e9576101c2565b806301ffc9a7146101c757806302329a291461020457806306fdde031461022d575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612fcc565b6106f2565b6040516101fb9190613736565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190612f9f565b610704565b005b34801561023957600080fd5b5061024261079e565b60405161024f9190613751565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a919061306f565b610830565b60405161028c91906136ad565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190612f5f565b6108b5565b005b3480156102ca57600080fd5b506102d36109cd565b6040516102e09190613af3565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e49565b6109da565b005b34801561031e57600080fd5b5061033960048036038101906103349190612f5f565b610a3a565b6040516103469190613af3565b60405180910390f35b34801561035b57600080fd5b50610364610adf565b6040516103719190613af3565b60405180910390f35b610394600480360381019061038f9190612f5f565b610ae5565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190612e49565b610d64565b005b3480156103cb57600080fd5b506103e660048036038101906103e1919061306f565b610d84565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190612ddc565b610de0565b60405161041c9190613714565b60405180910390f35b34801561043157600080fd5b5061044c6004803603810190610447919061306f565b610e8e565b6040516104599190613af3565b60405180910390f35b34801561046e57600080fd5b5061048960048036038101906104849190613026565b610eff565b005b34801561049757600080fd5b506104a0610f95565b6040516104ad9190613736565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d8919061306f565b610fac565b6040516104ea91906136ad565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190612ddc565b61105e565b6040516105279190613af3565b60405180910390f35b34801561053c57600080fd5b50610545611116565b005b61054f61119e565b005b34801561055d57600080fd5b506105666112e3565b6040516105739190613af3565b60405180910390f35b34801561058857600080fd5b506105916112ee565b60405161059e91906136ad565b60405180910390f35b3480156105b357600080fd5b506105bc611318565b6040516105c99190613751565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190612f1f565b6113aa565b005b34801561060757600080fd5b50610622600480360381019061061d9190612e9c565b6113c0565b005b34801561063057600080fd5b5061064b6004803603810190610646919061306f565b611422565b6040516106589190613751565b60405180910390f35b34801561066d57600080fd5b506106766114cc565b6040516106839190613af3565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190612e09565b6114d1565b6040516106c09190613736565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb9190612ddc565b611565565b005b60006106fd8261165d565b9050919050565b61070c6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661072a6112ee565b73ffffffffffffffffffffffffffffffffffffffff1614610780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077790613993565b60405180910390fd5b806107925761078d6116df565b61079b565b61079a611781565b5b50565b6060600080546107ad90613dfc565b80601f01602080910402602001604051908101604052809291908181526020018280546107d990613dfc565b80156108265780601f106107fb57610100808354040283529160200191610826565b820191906000526020600020905b81548152906001019060200180831161080957829003601f168201915b5050505050905090565b600061083b82611824565b61087a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087190613973565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c082610fac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092890613a13565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109506116d7565b73ffffffffffffffffffffffffffffffffffffffff16148061097f575061097e816109796116d7565b6114d1565b5b6109be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b5906138f3565b60405180910390fd5b6109c88383611890565b505050565b6000600880549050905090565b6109eb6109e56116d7565b82611949565b610a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2190613a53565b60405180910390fd5b610a35838383611a27565b505050565b6000610a458361105e565b8210610a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7d906137b3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61138981565b611389610af06109cd565b1115610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890613833565b60405180910390fd5b610b396112ee565b73ffffffffffffffffffffffffffffffffffffffff16610b576116d7565b73ffffffffffffffffffffffffffffffffffffffff1614610bbb57610b7a610f95565b15610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb190613a93565b60405180910390fd5b5b6000610bc56109cd565b90506113898282610bd69190613c31565b1115610c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0e906139f3565b60405180910390fd5b611389811115610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390613833565b60405180910390fd5b6001821115610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790613893565b60405180910390fd5b610cba8266470de4df820000611c8390919063ffffffff16565b341015610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390613ad3565b60405180910390fd5b60005b82811015610d5e576000610d116109cd565b9050610d1d8582611c99565b807f9c0e4c917c5a85a068b952248cbde09f1a91e0c60faa6744178ac4e82029bd5560405160405180910390a2508080610d5690613e5f565b915050610cff565b50505050565b610d7f838383604051806020016040528060008152506113c0565b505050565b610d95610d8f6116d7565b82611949565b610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90613ab3565b60405180910390fd5b610ddd81611cb7565b50565b60606000610ded8361105e565b905060008167ffffffffffffffff811115610e0b57610e0a613fc4565b5b604051908082528060200260200182016040528015610e395781602001602082028036833780820191505090505b50905060005b82811015610e8357610e518582610a3a565b828281518110610e6457610e63613f95565b5b6020026020010181815250508080610e7b90613e5f565b915050610e3f565b508092505050919050565b6000610e986109cd565b8210610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090613a73565b60405180910390fd5b60088281548110610eed57610eec613f95565b5b90600052602060002001549050919050565b610f076116d7565b73ffffffffffffffffffffffffffffffffffffffff16610f256112ee565b73ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290613993565b60405180910390fd5b80600b9080519060200190610f91929190612bf0565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c90613933565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690613913565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61111e6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661113c6112ee565b73ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990613993565b60405180910390fd5b61119c6000611dc8565b565b6111a66116d7565b73ffffffffffffffffffffffffffffffffffffffff166111c46112ee565b73ffffffffffffffffffffffffffffffffffffffff161461121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121190613993565b60405180910390fd5b60004790506000811161122c57600080fd5b60006112366116d7565b73ffffffffffffffffffffffffffffffffffffffff168260405161125990613698565b60006040518083038185875af1925050503d8060008114611296576040519150601f19603f3d011682016040523d82523d6000602084013e61129b565b606091505b50509050806112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d690613a33565b60405180910390fd5b5050565b66470de4df82000081565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461132790613dfc565b80601f016020809104026020016040519081016040528092919081815260200182805461135390613dfc565b80156113a05780601f10611375576101008083540402835291602001916113a0565b820191906000526020600020905b81548152906001019060200180831161138357829003601f168201915b5050505050905090565b6113bc6113b56116d7565b8383611e8e565b5050565b6113d16113cb6116d7565b83611949565b611410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140790613a53565b60405180910390fd5b61141c84848484611ffb565b50505050565b606061142d82611824565b61146c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611463906139d3565b60405180910390fd5b6000611476612057565b9050600081511161149657604051806020016040528060008152506114c4565b806114a0846120e9565b600c6040516020016114b493929190613667565b6040516020818303038152906040525b915050919050565b600181565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61156d6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661158b6112ee565b73ffffffffffffffffffffffffffffffffffffffff16146115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890613993565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906137f3565b60405180910390fd5b61165a81611dc8565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116d057506116cf8261224a565b5b9050919050565b600033905090565b6116e7610f95565b611726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171d90613793565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61176a6116d7565b60405161177791906136ad565b60405180910390a1565b611789610f95565b156117c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c0906138d3565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861180d6116d7565b60405161181a91906136ad565b60405180910390a1565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661190383610fac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061195482611824565b611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198a906138b3565b60405180910390fd5b600061199e83610fac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a0d57508373ffffffffffffffffffffffffffffffffffffffff166119f584610830565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a1e5750611a1d81856114d1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a4782610fac565b73ffffffffffffffffffffffffffffffffffffffff1614611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a94906139b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490613853565b60405180910390fd5b611b1883838361232c565b611b23600082611890565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b739190613d12565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bca9190613c31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611c919190613cb8565b905092915050565b611cb382826040518060200160405280600081525061233c565b5050565b6000611cc282610fac565b9050611cd08160008461232c565b611cdb600083611890565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2b9190613d12565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490613873565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fee9190613736565b60405180910390a3505050565b612006848484611a27565b61201284848484612397565b612051576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612048906137d3565b60405180910390fd5b50505050565b6060600b805461206690613dfc565b80601f016020809104026020016040519081016040528092919081815260200182805461209290613dfc565b80156120df5780601f106120b4576101008083540402835291602001916120df565b820191906000526020600020905b8154815290600101906020018083116120c257829003601f168201915b5050505050905090565b60606000821415612131576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612245565b600082905060005b6000821461216357808061214c90613e5f565b915050600a8261215c9190613c87565b9150612139565b60008167ffffffffffffffff81111561217f5761217e613fc4565b5b6040519080825280601f01601f1916602001820160405280156121b15781602001600182028036833780820191505090505b5090505b6000851461223e576001826121ca9190613d12565b9150600a856121d99190613ea8565b60306121e59190613c31565b60f81b8183815181106121fb576121fa613f95565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122379190613c87565b94506121b5565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061231557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061232557506123248261252e565b5b9050919050565b612337838383612598565b505050565b61234683836125f0565b6123536000848484612397565b612392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612389906137d3565b60405180910390fd5b505050565b60006123b88473ffffffffffffffffffffffffffffffffffffffff166127be565b15612521578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123e16116d7565b8786866040518563ffffffff1660e01b815260040161240394939291906136c8565b602060405180830381600087803b15801561241d57600080fd5b505af192505050801561244e57506040513d601f19601f8201168201806040525081019061244b9190612ff9565b60015b6124d1573d806000811461247e576040519150601f19603f3d011682016040523d82523d6000602084013e612483565b606091505b506000815114156124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c0906137d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612526565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125a38383836127d1565b6125ab610f95565b156125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e290613773565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265790613953565b60405180910390fd5b61266981611824565b156126a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a090613813565b60405180910390fd5b6126b56000838361232c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127059190613c31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6127dc8383836128e5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561281f5761281a816128ea565b61285e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461285d5761285c8382612933565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128a15761289c81612aa0565b6128e0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146128df576128de8282612b71565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129408461105e565b61294a9190613d12565b9050600060076000848152602001908152602001600020549050818114612a2f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ab49190613d12565b9050600060096000848152602001908152602001600020549050600060088381548110612ae457612ae3613f95565b5b906000526020600020015490508060088381548110612b0657612b05613f95565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b5557612b54613f66565b5b6001900381819060005260206000200160009055905550505050565b6000612b7c8361105e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612bfc90613dfc565b90600052602060002090601f016020900481019282612c1e5760008555612c65565b82601f10612c3757805160ff1916838001178555612c65565b82800160010185558215612c65579182015b82811115612c64578251825591602001919060010190612c49565b5b509050612c729190612c76565b5090565b5b80821115612c8f576000816000905550600101612c77565b5090565b6000612ca6612ca184613b33565b613b0e565b905082815260208101848484011115612cc257612cc1613ff8565b5b612ccd848285613dba565b509392505050565b6000612ce8612ce384613b64565b613b0e565b905082815260208101848484011115612d0457612d03613ff8565b5b612d0f848285613dba565b509392505050565b600081359050612d268161471d565b92915050565b600081359050612d3b81614734565b92915050565b600081359050612d508161474b565b92915050565b600081519050612d658161474b565b92915050565b600082601f830112612d8057612d7f613ff3565b5b8135612d90848260208601612c93565b91505092915050565b600082601f830112612dae57612dad613ff3565b5b8135612dbe848260208601612cd5565b91505092915050565b600081359050612dd681614762565b92915050565b600060208284031215612df257612df1614002565b5b6000612e0084828501612d17565b91505092915050565b60008060408385031215612e2057612e1f614002565b5b6000612e2e85828601612d17565b9250506020612e3f85828601612d17565b9150509250929050565b600080600060608486031215612e6257612e61614002565b5b6000612e7086828701612d17565b9350506020612e8186828701612d17565b9250506040612e9286828701612dc7565b9150509250925092565b60008060008060808587031215612eb657612eb5614002565b5b6000612ec487828801612d17565b9450506020612ed587828801612d17565b9350506040612ee687828801612dc7565b925050606085013567ffffffffffffffff811115612f0757612f06613ffd565b5b612f1387828801612d6b565b91505092959194509250565b60008060408385031215612f3657612f35614002565b5b6000612f4485828601612d17565b9250506020612f5585828601612d2c565b9150509250929050565b60008060408385031215612f7657612f75614002565b5b6000612f8485828601612d17565b9250506020612f9585828601612dc7565b9150509250929050565b600060208284031215612fb557612fb4614002565b5b6000612fc384828501612d2c565b91505092915050565b600060208284031215612fe257612fe1614002565b5b6000612ff084828501612d41565b91505092915050565b60006020828403121561300f5761300e614002565b5b600061301d84828501612d56565b91505092915050565b60006020828403121561303c5761303b614002565b5b600082013567ffffffffffffffff81111561305a57613059613ffd565b5b61306684828501612d99565b91505092915050565b60006020828403121561308557613084614002565b5b600061309384828501612dc7565b91505092915050565b60006130a88383613649565b60208301905092915050565b6130bd81613d46565b82525050565b60006130ce82613bba565b6130d88185613be8565b93506130e383613b95565b8060005b838110156131145781516130fb888261309c565b975061310683613bdb565b9250506001810190506130e7565b5085935050505092915050565b61312a81613d58565b82525050565b600061313b82613bc5565b6131458185613bf9565b9350613155818560208601613dc9565b61315e81614007565b840191505092915050565b600061317482613bd0565b61317e8185613c15565b935061318e818560208601613dc9565b61319781614007565b840191505092915050565b60006131ad82613bd0565b6131b78185613c26565b93506131c7818560208601613dc9565b80840191505092915050565b600081546131e081613dfc565b6131ea8186613c26565b94506001821660008114613205576001811461321657613249565b60ff19831686528186019350613249565b61321f85613ba5565b60005b8381101561324157815481890152600182019150602081019050613222565b838801955050505b50505092915050565b600061325f602b83613c15565b915061326a82614018565b604082019050919050565b6000613282601483613c15565b915061328d82614067565b602082019050919050565b60006132a5602b83613c15565b91506132b082614090565b604082019050919050565b60006132c8603283613c15565b91506132d3826140df565b604082019050919050565b60006132eb602683613c15565b91506132f68261412e565b604082019050919050565b600061330e601c83613c15565b91506133198261417d565b602082019050919050565b6000613331600e83613c15565b915061333c826141a6565b602082019050919050565b6000613354602483613c15565b915061335f826141cf565b604082019050919050565b6000613377601983613c15565b91506133828261421e565b602082019050919050565b600061339a602583613c15565b91506133a582614247565b604082019050919050565b60006133bd602c83613c15565b91506133c882614296565b604082019050919050565b60006133e0601083613c15565b91506133eb826142e5565b602082019050919050565b6000613403603883613c15565b915061340e8261430e565b604082019050919050565b6000613426602a83613c15565b91506134318261435d565b604082019050919050565b6000613449602983613c15565b9150613454826143ac565b604082019050919050565b600061346c602083613c15565b9150613477826143fb565b602082019050919050565b600061348f602c83613c15565b915061349a82614424565b604082019050919050565b60006134b2602083613c15565b91506134bd82614473565b602082019050919050565b60006134d5602983613c15565b91506134e08261449c565b604082019050919050565b60006134f8602f83613c15565b9150613503826144eb565b604082019050919050565b600061351b601983613c15565b91506135268261453a565b602082019050919050565b600061353e602183613c15565b915061354982614563565b604082019050919050565b6000613561600083613c0a565b915061356c826145b2565b600082019050919050565b6000613584601083613c15565b915061358f826145b5565b602082019050919050565b60006135a7603183613c15565b91506135b2826145de565b604082019050919050565b60006135ca602c83613c15565b91506135d58261462d565b604082019050919050565b60006135ed601283613c15565b91506135f88261467c565b602082019050919050565b6000613610603083613c15565b915061361b826146a5565b604082019050919050565b6000613633601a83613c15565b915061363e826146f4565b602082019050919050565b61365281613db0565b82525050565b61366181613db0565b82525050565b600061367382866131a2565b915061367f82856131a2565b915061368b82846131d3565b9150819050949350505050565b60006136a382613554565b9150819050919050565b60006020820190506136c260008301846130b4565b92915050565b60006080820190506136dd60008301876130b4565b6136ea60208301866130b4565b6136f76040830185613658565b81810360608301526137098184613130565b905095945050505050565b6000602082019050818103600083015261372e81846130c3565b905092915050565b600060208201905061374b6000830184613121565b92915050565b6000602082019050818103600083015261376b8184613169565b905092915050565b6000602082019050818103600083015261378c81613252565b9050919050565b600060208201905081810360008301526137ac81613275565b9050919050565b600060208201905081810360008301526137cc81613298565b9050919050565b600060208201905081810360008301526137ec816132bb565b9050919050565b6000602082019050818103600083015261380c816132de565b9050919050565b6000602082019050818103600083015261382c81613301565b9050919050565b6000602082019050818103600083015261384c81613324565b9050919050565b6000602082019050818103600083015261386c81613347565b9050919050565b6000602082019050818103600083015261388c8161336a565b9050919050565b600060208201905081810360008301526138ac8161338d565b9050919050565b600060208201905081810360008301526138cc816133b0565b9050919050565b600060208201905081810360008301526138ec816133d3565b9050919050565b6000602082019050818103600083015261390c816133f6565b9050919050565b6000602082019050818103600083015261392c81613419565b9050919050565b6000602082019050818103600083015261394c8161343c565b9050919050565b6000602082019050818103600083015261396c8161345f565b9050919050565b6000602082019050818103600083015261398c81613482565b9050919050565b600060208201905081810360008301526139ac816134a5565b9050919050565b600060208201905081810360008301526139cc816134c8565b9050919050565b600060208201905081810360008301526139ec816134eb565b9050919050565b60006020820190508181036000830152613a0c8161350e565b9050919050565b60006020820190508181036000830152613a2c81613531565b9050919050565b60006020820190508181036000830152613a4c81613577565b9050919050565b60006020820190508181036000830152613a6c8161359a565b9050919050565b60006020820190508181036000830152613a8c816135bd565b9050919050565b60006020820190508181036000830152613aac816135e0565b9050919050565b60006020820190508181036000830152613acc81613603565b9050919050565b60006020820190508181036000830152613aec81613626565b9050919050565b6000602082019050613b086000830184613658565b92915050565b6000613b18613b29565b9050613b248282613e2e565b919050565b6000604051905090565b600067ffffffffffffffff821115613b4e57613b4d613fc4565b5b613b5782614007565b9050602081019050919050565b600067ffffffffffffffff821115613b7f57613b7e613fc4565b5b613b8882614007565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c3c82613db0565b9150613c4783613db0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c7c57613c7b613ed9565b5b828201905092915050565b6000613c9282613db0565b9150613c9d83613db0565b925082613cad57613cac613f08565b5b828204905092915050565b6000613cc382613db0565b9150613cce83613db0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d0757613d06613ed9565b5b828202905092915050565b6000613d1d82613db0565b9150613d2883613db0565b925082821015613d3b57613d3a613ed9565b5b828203905092915050565b6000613d5182613d90565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613de7578082015181840152602081019050613dcc565b83811115613df6576000848401525b50505050565b60006002820490506001821680613e1457607f821691505b60208210811415613e2857613e27613f37565b5b50919050565b613e3782614007565b810181811067ffffffffffffffff82111715613e5657613e55613fc4565b5b80604052505050565b6000613e6a82613db0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e9d57613e9c613ed9565b5b600182019050919050565b6000613eb382613db0565b9150613ebe83613db0565b925082613ece57613ecd613f08565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c652068617320656e646564000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178696d756d206d696e7420706572207472616e73616374696f6e2065786360008201527f6565646564000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d617820746f6b656e20737570706c7920657863656564656400000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f45746865722073656e74206c657373207468616e207072696365000000000000600082015250565b61472681613d46565b811461473157600080fd5b50565b61473d81613d58565b811461474857600080fd5b50565b61475481613d64565b811461475f57600080fd5b50565b61476b81613db0565b811461477657600080fd5b5056fea2646970667358221220008687e5242b5ea0b4f659a184c0a2ad8b84e148db8a4d700c40c70347dcb1a564736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005968747470733a2f2f626166796265696762366d676c6371786f656a74326d646361326a6966776d6972673677686b797533677a707077706a376a6e743572366d75646d2e697066732e6e667473746f726167652e6c696e6b2f00000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://bafybeigb6mglcqxoejt2mdca2jifwmirg6whkyu3gzppwpj7jnt5r6mudm.ipfs.nftstorage.link/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000059
Arg [2] : 68747470733a2f2f626166796265696762366d676c6371786f656a74326d6463
Arg [3] : 61326a6966776d6972673677686b797533677a707077706a376a6e743572366d
Arg [4] : 75646d2e697066732e6e667473746f726167652e6c696e6b2f00000000000000
Deployed Bytecode Sourcemap
55583:3150:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58545:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57206:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35105:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36664:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36187:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49999:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37414:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49667:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55740:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56387:581;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37824:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48096:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57580:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50189:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57097:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13706:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34799:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34529:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11757:103;;;;;;;;;;;;;:::i;:::-;;57322:250;;;:::i;:::-;;55788:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11106:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35274:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36957:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38080:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57941:349;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55837:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37183:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12015:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58545:179;58656:4;58680:36;58704:11;58680:23;:36::i;:::-;58673:43;;58545:179;;;:::o;57206:108::-;11337:12;:10;:12::i;:::-;11326:23;;:7;:5;:7::i;:::-;:23;;;11318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57269:13:::1;:37;;57296:10;:8;:10::i;:::-;57269:37;;;57285:8;:6;:8::i;:::-;57269:37;57206:108:::0;:::o;35105:100::-;35159:13;35192:5;35185:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35105:100;:::o;36664:221::-;36740:7;36768:16;36776:7;36768;:16::i;:::-;36760:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36853:15;:24;36869:7;36853:24;;;;;;;;;;;;;;;;;;;;;36846:31;;36664:221;;;:::o;36187:411::-;36268:13;36284:23;36299:7;36284:14;:23::i;:::-;36268:39;;36332:5;36326:11;;:2;:11;;;;36318:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36426:5;36410:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36435:37;36452:5;36459:12;:10;:12::i;:::-;36435:16;:37::i;:::-;36410:62;36388:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36569:21;36578:2;36582:7;36569:8;:21::i;:::-;36257:341;36187:411;;:::o;49999:113::-;50060:7;50087:10;:17;;;;50080:24;;49999:113;:::o;37414:339::-;37609:41;37628:12;:10;:12::i;:::-;37642:7;37609:18;:41::i;:::-;37601:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37717:28;37727:4;37733:2;37737:7;37717:9;:28::i;:::-;37414:339;;;:::o;49667:256::-;49764:7;49800:23;49817:5;49800:16;:23::i;:::-;49792:5;:31;49784:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;49889:12;:19;49902:5;49889:19;;;;;;;;;;;;;;;:26;49909:5;49889:26;;;;;;;;;;;;49882:33;;49667:256;;;;:::o;55740:41::-;55777:4;55740:41;:::o;56387:581::-;55777:4;56207:13;:11;:13::i;:::-;:27;;56199:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;56284:7;:5;:7::i;:::-;56268:23;;:12;:10;:12::i;:::-;:23;;;56264:96;;56317:8;:6;:8::i;:::-;56316:9;56308:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;56264:96;56466:13:::1;56482;:11;:13::i;:::-;56466:29;;55777:4;56522:6;56514:5;:14;;;;:::i;:::-;:28;;56506:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55777:4;56591:5;:19;;56583:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;55878:1;56648:6;:24;;56640:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56746:17;56756:6;55820:10;56746:9;;:17;;;;:::i;:::-;56733:9;:30;;56725:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;56812:9;56807:154;56831:6;56827:1;:10;56807:154;;;56859:7;56869:13;:11;:13::i;:::-;56859:23;;56897:17;56907:2;56911;56897:9;:17::i;:::-;56946:2;56934:15;;;;;;;;;;56844:117;56839:3;;;;;:::i;:::-;;;;56807:154;;;;56455:513;56387:581:::0;;:::o;37824:185::-;37962:39;37979:4;37985:2;37989:7;37962:39;;;;;;;;;;;;:16;:39::i;:::-;37824:185;;;:::o;48096:245::-;48214:41;48233:12;:10;:12::i;:::-;48247:7;48214:18;:41::i;:::-;48206:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;48319:14;48325:7;48319:5;:14::i;:::-;48096:245;:::o;57580:353::-;57642:16;57671:18;57692:17;57702:6;57692:9;:17::i;:::-;57671:38;;57722:25;57764:10;57750:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57722:53;;57791:9;57786:112;57810:10;57806:1;:14;57786:112;;;57856:30;57876:6;57884:1;57856:19;:30::i;:::-;57842:8;57851:1;57842:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;57822:3;;;;;:::i;:::-;;;;57786:112;;;;57917:8;57910:15;;;;57580:353;;;:::o;50189:233::-;50264:7;50300:30;:28;:30::i;:::-;50292:5;:38;50284:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;50397:10;50408:5;50397:17;;;;;;;;:::i;:::-;;;;;;;;;;50390:24;;50189:233;;;:::o;57097:101::-;11337:12;:10;:12::i;:::-;11326:23;;:7;:5;:7::i;:::-;:23;;;11318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57183:7:::1;57168:12;:22;;;;;;;;;;;;:::i;:::-;;57097:101:::0;:::o;13706:86::-;13753:4;13777:7;;;;;;;;;;;13770:14;;13706:86;:::o;34799:239::-;34871:7;34891:13;34907:7;:16;34915:7;34907:16;;;;;;;;;;;;;;;;;;;;;34891:32;;34959:1;34942:19;;:5;:19;;;;34934:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35025:5;35018:12;;;34799:239;;;:::o;34529:208::-;34601:7;34646:1;34629:19;;:5;:19;;;;34621:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34713:9;:16;34723:5;34713:16;;;;;;;;;;;;;;;;34706:23;;34529:208;;;:::o;11757:103::-;11337:12;:10;:12::i;:::-;11326:23;;:7;:5;:7::i;:::-;:23;;;11318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11822:30:::1;11849:1;11822:18;:30::i;:::-;11757:103::o:0;57322:250::-;11337:12;:10;:12::i;:::-;11326:23;;:7;:5;:7::i;:::-;:23;;;11318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57383:14:::1;57400:21;57383:38;;57449:1;57440:6;:10;57432:19;;;::::0;::::1;;57463:12;57481;:10;:12::i;:::-;:17;;57506:6;57481:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57462:55;;;57536:7;57528:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;57372:200;;57322:250::o:0;55788:42::-;55820:10;55788:42;:::o;11106:87::-;11152:7;11179:6;;;;;;;;;;;11172:13;;11106:87;:::o;35274:104::-;35330:13;35363:7;35356:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35274:104;:::o;36957:155::-;37052:52;37071:12;:10;:12::i;:::-;37085:8;37095;37052:18;:52::i;:::-;36957:155;;:::o;38080:328::-;38255:41;38274:12;:10;:12::i;:::-;38288:7;38255:18;:41::i;:::-;38247:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38361:39;38375:4;38381:2;38385:7;38394:5;38361:13;:39::i;:::-;38080:328;;;;:::o;57941:349::-;58014:13;58048:16;58056:7;58048;:16::i;:::-;58040:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;58129:21;58153:10;:8;:10::i;:::-;58129:34;;58205:1;58187:7;58181:21;:25;:101;;;;;;;;;;;;;;;;;58233:7;58242:18;:7;:16;:18::i;:::-;58262:13;58216:60;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58181:101;58174:108;;;57941:349;;;:::o;55837:42::-;55878:1;55837:42;:::o;37183:164::-;37280:4;37304:18;:25;37323:5;37304:25;;;;;;;;;;;;;;;:35;37330:8;37304:35;;;;;;;;;;;;;;;;;;;;;;;;;37297:42;;37183:164;;;;:::o;12015:201::-;11337:12;:10;:12::i;:::-;11326:23;;:7;:5;:7::i;:::-;:23;;;11318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12124:1:::1;12104:22;;:8;:22;;;;12096:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12180:28;12199:8;12180:18;:28::i;:::-;12015:201:::0;:::o;49359:224::-;49461:4;49500:35;49485:50;;;:11;:50;;;;:90;;;;49539:36;49563:11;49539:23;:36::i;:::-;49485:90;49478:97;;49359:224;;;:::o;9830:98::-;9883:7;9910:10;9903:17;;9830:98;:::o;14765:120::-;14309:8;:6;:8::i;:::-;14301:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;14834:5:::1;14824:7;;:15;;;;;;;;;;;;;;;;;;14855:22;14864:12;:10;:12::i;:::-;14855:22;;;;;;:::i;:::-;;;;;;;;14765:120::o:0;14506:118::-;14032:8;:6;:8::i;:::-;14031:9;14023:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;14576:4:::1;14566:7;;:14;;;;;;;;;;;;;;;;;;14596:20;14603:12;:10;:12::i;:::-;14596:20;;;;;;:::i;:::-;;;;;;;;14506:118::o:0;39918:127::-;39983:4;40035:1;40007:30;;:7;:16;40015:7;40007:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40000:37;;39918:127;;;:::o;43900:174::-;44002:2;43975:15;:24;43991:7;43975:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44058:7;44054:2;44020:46;;44029:23;44044:7;44029:14;:23::i;:::-;44020:46;;;;;;;;;;;;43900:174;;:::o;40212:348::-;40305:4;40330:16;40338:7;40330;:16::i;:::-;40322:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40406:13;40422:23;40437:7;40422:14;:23::i;:::-;40406:39;;40475:5;40464:16;;:7;:16;;;:51;;;;40508:7;40484:31;;:20;40496:7;40484:11;:20::i;:::-;:31;;;40464:51;:87;;;;40519:32;40536:5;40543:7;40519:16;:32::i;:::-;40464:87;40456:96;;;40212:348;;;;:::o;43204:578::-;43363:4;43336:31;;:23;43351:7;43336:14;:23::i;:::-;:31;;;43328:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;43446:1;43432:16;;:2;:16;;;;43424:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43502:39;43523:4;43529:2;43533:7;43502:20;:39::i;:::-;43606:29;43623:1;43627:7;43606:8;:29::i;:::-;43667:1;43648:9;:15;43658:4;43648:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43696:1;43679:9;:13;43689:2;43679:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43727:2;43708:7;:16;43716:7;43708:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43766:7;43762:2;43747:27;;43756:4;43747:27;;;;;;;;;;;;43204:578;;;:::o;3600:98::-;3658:7;3689:1;3685;:5;;;;:::i;:::-;3678:12;;3600:98;;;;:::o;40902:110::-;40978:26;40988:2;40992:7;40978:26;;;;;;;;;;;;:9;:26::i;:::-;40902:110;;:::o;42507:360::-;42567:13;42583:23;42598:7;42583:14;:23::i;:::-;42567:39;;42619:48;42640:5;42655:1;42659:7;42619:20;:48::i;:::-;42708:29;42725:1;42729:7;42708:8;:29::i;:::-;42770:1;42750:9;:16;42760:5;42750:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;42789:7;:16;42797:7;42789:16;;;;;;;;;;;;42782:23;;;;;;;;;;;42851:7;42847:1;42823:36;;42832:5;42823:36;;;;;;;;;;;;42556:311;42507:360;:::o;12376:191::-;12450:16;12469:6;;;;;;;;;;;12450:25;;12495:8;12486:6;;:17;;;;;;;;;;;;;;;;;;12550:8;12519:40;;12540:8;12519:40;;;;;;;;;;;;12439:128;12376:191;:::o;44216:315::-;44371:8;44362:17;;:5;:17;;;;44354:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44458:8;44420:18;:25;44439:5;44420:25;;;;;;;;;;;;;;;:35;44446:8;44420:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44504:8;44482:41;;44497:5;44482:41;;;44514:8;44482:41;;;;;;:::i;:::-;;;;;;;;44216:315;;;:::o;39290:::-;39447:28;39457:4;39463:2;39467:7;39447:9;:28::i;:::-;39494:48;39517:4;39523:2;39527:7;39536:5;39494:22;:48::i;:::-;39486:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39290:315;;;;:::o;56976:113::-;57036:13;57069:12;57062:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56976:113;:::o;7392:723::-;7448:13;7678:1;7669:5;:10;7665:53;;;7696:10;;;;;;;;;;;;;;;;;;;;;7665:53;7728:12;7743:5;7728:20;;7759:14;7784:78;7799:1;7791:4;:9;7784:78;;7817:8;;;;;:::i;:::-;;;;7848:2;7840:10;;;;;:::i;:::-;;;7784:78;;;7872:19;7904:6;7894:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7872:39;;7922:154;7938:1;7929:5;:10;7922:154;;7966:1;7956:11;;;;;:::i;:::-;;;8033:2;8025:5;:10;;;;:::i;:::-;8012:2;:24;;;;:::i;:::-;7999:39;;7982:6;7989;7982:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8062:2;8053:11;;;;;:::i;:::-;;;7922:154;;;8100:6;8086:21;;;;;7392:723;;;;:::o;34160:305::-;34262:4;34314:25;34299:40;;;:11;:40;;;;:105;;;;34371:33;34356:48;;;:11;:48;;;;34299:105;:158;;;;34421:36;34445:11;34421:23;:36::i;:::-;34299:158;34279:178;;34160:305;;;:::o;58298:239::-;58484:45;58511:4;58517:2;58521:7;58484:26;:45::i;:::-;58298:239;;;:::o;41239:321::-;41369:18;41375:2;41379:7;41369:5;:18::i;:::-;41420:54;41451:1;41455:2;41459:7;41468:5;41420:22;:54::i;:::-;41398:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41239:321;;;:::o;45096:799::-;45251:4;45272:15;:2;:13;;;:15::i;:::-;45268:620;;;45324:2;45308:36;;;45345:12;:10;:12::i;:::-;45359:4;45365:7;45374:5;45308:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45304:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45567:1;45550:6;:13;:18;45546:272;;;45593:60;;;;;;;;;;:::i;:::-;;;;;;;;45546:272;45768:6;45762:13;45753:6;45749:2;45745:15;45738:38;45304:529;45441:41;;;45431:51;;;:6;:51;;;;45424:58;;;;;45268:620;45872:4;45865:11;;45096:799;;;;;;;:::o;25856:157::-;25941:4;25980:25;25965:40;;;:11;:40;;;;25958:47;;25856:157;;;:::o;47278:275::-;47422:45;47449:4;47455:2;47459:7;47422:26;:45::i;:::-;47489:8;:6;:8::i;:::-;47488:9;47480:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;47278:275;;;:::o;41896:382::-;41990:1;41976:16;;:2;:16;;;;41968:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42049:16;42057:7;42049;:16::i;:::-;42048:17;42040:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42111:45;42140:1;42144:2;42148:7;42111:20;:45::i;:::-;42186:1;42169:9;:13;42179:2;42169:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42217:2;42198:7;:16;42206:7;42198:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42262:7;42258:2;42237:33;;42254:1;42237:33;;;;;;;;;;;;41896:382;;:::o;15712:387::-;15772:4;15980:12;16047:7;16035:20;16027:28;;16090:1;16083:4;:8;16076:15;;;15712:387;;;:::o;51035:589::-;51179:45;51206:4;51212:2;51216:7;51179:26;:45::i;:::-;51257:1;51241:18;;:4;:18;;;51237:187;;;51276:40;51308:7;51276:31;:40::i;:::-;51237:187;;;51346:2;51338:10;;:4;:10;;;51334:90;;51365:47;51398:4;51404:7;51365:32;:47::i;:::-;51334:90;51237:187;51452:1;51438:16;;:2;:16;;;51434:183;;;51471:45;51508:7;51471:36;:45::i;:::-;51434:183;;;51544:4;51538:10;;:2;:10;;;51534:83;;51565:40;51593:2;51597:7;51565:27;:40::i;:::-;51534:83;51434:183;51035:589;;;:::o;46467:126::-;;;;:::o;52347:164::-;52451:10;:17;;;;52424:15;:24;52440:7;52424:24;;;;;;;;;;;:44;;;;52479:10;52495:7;52479:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52347:164;:::o;53138:988::-;53404:22;53454:1;53429:22;53446:4;53429:16;:22::i;:::-;:26;;;;:::i;:::-;53404:51;;53466:18;53487:17;:26;53505:7;53487:26;;;;;;;;;;;;53466:47;;53634:14;53620:10;:28;53616:328;;53665:19;53687:12;:18;53700:4;53687:18;;;;;;;;;;;;;;;:34;53706:14;53687:34;;;;;;;;;;;;53665:56;;53771:11;53738:12;:18;53751:4;53738:18;;;;;;;;;;;;;;;:30;53757:10;53738:30;;;;;;;;;;;:44;;;;53888:10;53855:17;:30;53873:11;53855:30;;;;;;;;;;;:43;;;;53650:294;53616:328;54040:17;:26;54058:7;54040:26;;;;;;;;;;;54033:33;;;54084:12;:18;54097:4;54084:18;;;;;;;;;;;;;;;:34;54103:14;54084:34;;;;;;;;;;;54077:41;;;53219:907;;53138:988;;:::o;54421:1079::-;54674:22;54719:1;54699:10;:17;;;;:21;;;;:::i;:::-;54674:46;;54731:18;54752:15;:24;54768:7;54752:24;;;;;;;;;;;;54731:45;;55103:19;55125:10;55136:14;55125:26;;;;;;;;:::i;:::-;;;;;;;;;;55103:48;;55189:11;55164:10;55175;55164:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;55300:10;55269:15;:28;55285:11;55269:28;;;;;;;;;;;:41;;;;55441:15;:24;55457:7;55441:24;;;;;;;;;;;55434:31;;;55476:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54492:1008;;;54421:1079;:::o;51925:221::-;52010:14;52027:20;52044:2;52027:16;:20::i;:::-;52010:37;;52085:7;52058:12;:16;52071:2;52058:16;;;;;;;;;;;;;;;:24;52075:6;52058:24;;;;;;;;;;;:34;;;;52132:6;52103:17;:26;52121:7;52103:26;;;;;;;;;;;:35;;;;51999:147;51925:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:179::-;7556:10;7577:46;7619:3;7611:6;7577:46;:::i;:::-;7655:4;7650:3;7646:14;7632:28;;7487:179;;;;:::o;7672:118::-;7759:24;7777:5;7759:24;:::i;:::-;7754:3;7747:37;7672:118;;:::o;7826:732::-;7945:3;7974:54;8022:5;7974:54;:::i;:::-;8044:86;8123:6;8118:3;8044:86;:::i;:::-;8037:93;;8154:56;8204:5;8154:56;:::i;:::-;8233:7;8264:1;8249:284;8274:6;8271:1;8268:13;8249:284;;;8350:6;8344:13;8377:63;8436:3;8421:13;8377:63;:::i;:::-;8370:70;;8463:60;8516:6;8463:60;:::i;:::-;8453:70;;8309:224;8296:1;8293;8289:9;8284:14;;8249:284;;;8253:14;8549:3;8542:10;;7950:608;;;7826:732;;;;:::o;8564:109::-;8645:21;8660:5;8645:21;:::i;:::-;8640:3;8633:34;8564:109;;:::o;8679:360::-;8765:3;8793:38;8825:5;8793:38;:::i;:::-;8847:70;8910:6;8905:3;8847:70;:::i;:::-;8840:77;;8926:52;8971:6;8966:3;8959:4;8952:5;8948:16;8926:52;:::i;:::-;9003:29;9025:6;9003:29;:::i;:::-;8998:3;8994:39;8987:46;;8769:270;8679:360;;;;:::o;9045:364::-;9133:3;9161:39;9194:5;9161:39;:::i;:::-;9216:71;9280:6;9275:3;9216:71;:::i;:::-;9209:78;;9296:52;9341:6;9336:3;9329:4;9322:5;9318:16;9296:52;:::i;:::-;9373:29;9395:6;9373:29;:::i;:::-;9368:3;9364:39;9357:46;;9137:272;9045:364;;;;:::o;9415:377::-;9521:3;9549:39;9582:5;9549:39;:::i;:::-;9604:89;9686:6;9681:3;9604:89;:::i;:::-;9597:96;;9702:52;9747:6;9742:3;9735:4;9728:5;9724:16;9702:52;:::i;:::-;9779:6;9774:3;9770:16;9763:23;;9525:267;9415:377;;;;:::o;9822:845::-;9925:3;9962:5;9956:12;9991:36;10017:9;9991:36;:::i;:::-;10043:89;10125:6;10120:3;10043:89;:::i;:::-;10036:96;;10163:1;10152:9;10148:17;10179:1;10174:137;;;;10325:1;10320:341;;;;10141:520;;10174:137;10258:4;10254:9;10243;10239:25;10234:3;10227:38;10294:6;10289:3;10285:16;10278:23;;10174:137;;10320:341;10387:38;10419:5;10387:38;:::i;:::-;10447:1;10461:154;10475:6;10472:1;10469:13;10461:154;;;10549:7;10543:14;10539:1;10534:3;10530:11;10523:35;10599:1;10590:7;10586:15;10575:26;;10497:4;10494:1;10490:12;10485:17;;10461:154;;;10644:6;10639:3;10635:16;10628:23;;10327:334;;10141:520;;9929:738;;9822:845;;;;:::o;10673:366::-;10815:3;10836:67;10900:2;10895:3;10836:67;:::i;:::-;10829:74;;10912:93;11001:3;10912:93;:::i;:::-;11030:2;11025:3;11021:12;11014:19;;10673:366;;;:::o;11045:::-;11187:3;11208:67;11272:2;11267:3;11208:67;:::i;:::-;11201:74;;11284:93;11373:3;11284:93;:::i;:::-;11402:2;11397:3;11393:12;11386:19;;11045:366;;;:::o;11417:::-;11559:3;11580:67;11644:2;11639:3;11580:67;:::i;:::-;11573:74;;11656:93;11745:3;11656:93;:::i;:::-;11774:2;11769:3;11765:12;11758:19;;11417:366;;;:::o;11789:::-;11931:3;11952:67;12016:2;12011:3;11952:67;:::i;:::-;11945:74;;12028:93;12117:3;12028:93;:::i;:::-;12146:2;12141:3;12137:12;12130:19;;11789:366;;;:::o;12161:::-;12303:3;12324:67;12388:2;12383:3;12324:67;:::i;:::-;12317:74;;12400:93;12489:3;12400:93;:::i;:::-;12518:2;12513:3;12509:12;12502:19;;12161:366;;;:::o;12533:::-;12675:3;12696:67;12760:2;12755:3;12696:67;:::i;:::-;12689:74;;12772:93;12861:3;12772:93;:::i;:::-;12890:2;12885:3;12881:12;12874:19;;12533:366;;;:::o;12905:::-;13047:3;13068:67;13132:2;13127:3;13068:67;:::i;:::-;13061:74;;13144:93;13233:3;13144:93;:::i;:::-;13262:2;13257:3;13253:12;13246:19;;12905:366;;;:::o;13277:::-;13419:3;13440:67;13504:2;13499:3;13440:67;:::i;:::-;13433:74;;13516:93;13605:3;13516:93;:::i;:::-;13634:2;13629:3;13625:12;13618:19;;13277:366;;;:::o;13649:::-;13791:3;13812:67;13876:2;13871:3;13812:67;:::i;:::-;13805:74;;13888:93;13977:3;13888:93;:::i;:::-;14006:2;14001:3;13997:12;13990:19;;13649:366;;;:::o;14021:::-;14163:3;14184:67;14248:2;14243:3;14184:67;:::i;:::-;14177:74;;14260:93;14349:3;14260:93;:::i;:::-;14378:2;14373:3;14369:12;14362:19;;14021:366;;;:::o;14393:::-;14535:3;14556:67;14620:2;14615:3;14556:67;:::i;:::-;14549:74;;14632:93;14721:3;14632:93;:::i;:::-;14750:2;14745:3;14741:12;14734:19;;14393:366;;;:::o;14765:::-;14907:3;14928:67;14992:2;14987:3;14928:67;:::i;:::-;14921:74;;15004:93;15093:3;15004:93;:::i;:::-;15122:2;15117:3;15113:12;15106:19;;14765:366;;;:::o;15137:::-;15279:3;15300:67;15364:2;15359:3;15300:67;:::i;:::-;15293:74;;15376:93;15465:3;15376:93;:::i;:::-;15494:2;15489:3;15485:12;15478:19;;15137:366;;;:::o;15509:::-;15651:3;15672:67;15736:2;15731:3;15672:67;:::i;:::-;15665:74;;15748:93;15837:3;15748:93;:::i;:::-;15866:2;15861:3;15857:12;15850:19;;15509:366;;;:::o;15881:::-;16023:3;16044:67;16108:2;16103:3;16044:67;:::i;:::-;16037:74;;16120:93;16209:3;16120:93;:::i;:::-;16238:2;16233:3;16229:12;16222:19;;15881:366;;;:::o;16253:::-;16395:3;16416:67;16480:2;16475:3;16416:67;:::i;:::-;16409:74;;16492:93;16581:3;16492:93;:::i;:::-;16610:2;16605:3;16601:12;16594:19;;16253:366;;;:::o;16625:::-;16767:3;16788:67;16852:2;16847:3;16788:67;:::i;:::-;16781:74;;16864:93;16953:3;16864:93;:::i;:::-;16982:2;16977:3;16973:12;16966:19;;16625:366;;;:::o;16997:::-;17139:3;17160:67;17224:2;17219:3;17160:67;:::i;:::-;17153:74;;17236:93;17325:3;17236:93;:::i;:::-;17354:2;17349:3;17345:12;17338:19;;16997:366;;;:::o;17369:::-;17511:3;17532:67;17596:2;17591:3;17532:67;:::i;:::-;17525:74;;17608:93;17697:3;17608:93;:::i;:::-;17726:2;17721:3;17717:12;17710:19;;17369:366;;;:::o;17741:::-;17883:3;17904:67;17968:2;17963:3;17904:67;:::i;:::-;17897:74;;17980:93;18069:3;17980:93;:::i;:::-;18098:2;18093:3;18089:12;18082:19;;17741:366;;;:::o;18113:::-;18255:3;18276:67;18340:2;18335:3;18276:67;:::i;:::-;18269:74;;18352:93;18441:3;18352:93;:::i;:::-;18470:2;18465:3;18461:12;18454:19;;18113:366;;;:::o;18485:::-;18627:3;18648:67;18712:2;18707:3;18648:67;:::i;:::-;18641:74;;18724:93;18813:3;18724:93;:::i;:::-;18842:2;18837:3;18833:12;18826:19;;18485:366;;;:::o;18857:398::-;19016:3;19037:83;19118:1;19113:3;19037:83;:::i;:::-;19030:90;;19129:93;19218:3;19129:93;:::i;:::-;19247:1;19242:3;19238:11;19231:18;;18857:398;;;:::o;19261:366::-;19403:3;19424:67;19488:2;19483:3;19424:67;:::i;:::-;19417:74;;19500:93;19589:3;19500:93;:::i;:::-;19618:2;19613:3;19609:12;19602:19;;19261:366;;;:::o;19633:::-;19775:3;19796:67;19860:2;19855:3;19796:67;:::i;:::-;19789:74;;19872:93;19961:3;19872:93;:::i;:::-;19990:2;19985:3;19981:12;19974:19;;19633:366;;;:::o;20005:::-;20147:3;20168:67;20232:2;20227:3;20168:67;:::i;:::-;20161:74;;20244:93;20333:3;20244:93;:::i;:::-;20362:2;20357:3;20353:12;20346:19;;20005:366;;;:::o;20377:::-;20519:3;20540:67;20604:2;20599:3;20540:67;:::i;:::-;20533:74;;20616:93;20705:3;20616:93;:::i;:::-;20734:2;20729:3;20725:12;20718:19;;20377:366;;;:::o;20749:::-;20891:3;20912:67;20976:2;20971:3;20912:67;:::i;:::-;20905:74;;20988:93;21077:3;20988:93;:::i;:::-;21106:2;21101:3;21097:12;21090:19;;20749:366;;;:::o;21121:::-;21263:3;21284:67;21348:2;21343:3;21284:67;:::i;:::-;21277:74;;21360:93;21449:3;21360:93;:::i;:::-;21478:2;21473:3;21469:12;21462:19;;21121:366;;;:::o;21493:108::-;21570:24;21588:5;21570:24;:::i;:::-;21565:3;21558:37;21493:108;;:::o;21607:118::-;21694:24;21712:5;21694:24;:::i;:::-;21689:3;21682:37;21607:118;;:::o;21731:589::-;21956:3;21978:95;22069:3;22060:6;21978:95;:::i;:::-;21971:102;;22090:95;22181:3;22172:6;22090:95;:::i;:::-;22083:102;;22202:92;22290:3;22281:6;22202:92;:::i;:::-;22195:99;;22311:3;22304:10;;21731:589;;;;;;:::o;22326:379::-;22510:3;22532:147;22675:3;22532:147;:::i;:::-;22525:154;;22696:3;22689:10;;22326:379;;;:::o;22711:222::-;22804:4;22842:2;22831:9;22827:18;22819:26;;22855:71;22923:1;22912:9;22908:17;22899:6;22855:71;:::i;:::-;22711:222;;;;:::o;22939:640::-;23134:4;23172:3;23161:9;23157:19;23149:27;;23186:71;23254:1;23243:9;23239:17;23230:6;23186:71;:::i;:::-;23267:72;23335:2;23324:9;23320:18;23311:6;23267:72;:::i;:::-;23349;23417:2;23406:9;23402:18;23393:6;23349:72;:::i;:::-;23468:9;23462:4;23458:20;23453:2;23442:9;23438:18;23431:48;23496:76;23567:4;23558:6;23496:76;:::i;:::-;23488:84;;22939:640;;;;;;;:::o;23585:373::-;23728:4;23766:2;23755:9;23751:18;23743:26;;23815:9;23809:4;23805:20;23801:1;23790:9;23786:17;23779:47;23843:108;23946:4;23937:6;23843:108;:::i;:::-;23835:116;;23585:373;;;;:::o;23964:210::-;24051:4;24089:2;24078:9;24074:18;24066:26;;24102:65;24164:1;24153:9;24149:17;24140:6;24102:65;:::i;:::-;23964:210;;;;:::o;24180:313::-;24293:4;24331:2;24320:9;24316:18;24308:26;;24380:9;24374:4;24370:20;24366:1;24355:9;24351:17;24344:47;24408:78;24481:4;24472:6;24408:78;:::i;:::-;24400:86;;24180:313;;;;:::o;24499:419::-;24665:4;24703:2;24692:9;24688:18;24680:26;;24752:9;24746:4;24742:20;24738:1;24727:9;24723:17;24716:47;24780:131;24906:4;24780:131;:::i;:::-;24772:139;;24499:419;;;:::o;24924:::-;25090:4;25128:2;25117:9;25113:18;25105:26;;25177:9;25171:4;25167:20;25163:1;25152:9;25148:17;25141:47;25205:131;25331:4;25205:131;:::i;:::-;25197:139;;24924:419;;;:::o;25349:::-;25515:4;25553:2;25542:9;25538:18;25530:26;;25602:9;25596:4;25592:20;25588:1;25577:9;25573:17;25566:47;25630:131;25756:4;25630:131;:::i;:::-;25622:139;;25349:419;;;:::o;25774:::-;25940:4;25978:2;25967:9;25963:18;25955:26;;26027:9;26021:4;26017:20;26013:1;26002:9;25998:17;25991:47;26055:131;26181:4;26055:131;:::i;:::-;26047:139;;25774:419;;;:::o;26199:::-;26365:4;26403:2;26392:9;26388:18;26380:26;;26452:9;26446:4;26442:20;26438:1;26427:9;26423:17;26416:47;26480:131;26606:4;26480:131;:::i;:::-;26472:139;;26199:419;;;:::o;26624:::-;26790:4;26828:2;26817:9;26813:18;26805:26;;26877:9;26871:4;26867:20;26863:1;26852:9;26848:17;26841:47;26905:131;27031:4;26905:131;:::i;:::-;26897:139;;26624:419;;;:::o;27049:::-;27215:4;27253:2;27242:9;27238:18;27230:26;;27302:9;27296:4;27292:20;27288:1;27277:9;27273:17;27266:47;27330:131;27456:4;27330:131;:::i;:::-;27322:139;;27049:419;;;:::o;27474:::-;27640:4;27678:2;27667:9;27663:18;27655:26;;27727:9;27721:4;27717:20;27713:1;27702:9;27698:17;27691:47;27755:131;27881:4;27755:131;:::i;:::-;27747:139;;27474:419;;;:::o;27899:::-;28065:4;28103:2;28092:9;28088:18;28080:26;;28152:9;28146:4;28142:20;28138:1;28127:9;28123:17;28116:47;28180:131;28306:4;28180:131;:::i;:::-;28172:139;;27899:419;;;:::o;28324:::-;28490:4;28528:2;28517:9;28513:18;28505:26;;28577:9;28571:4;28567:20;28563:1;28552:9;28548:17;28541:47;28605:131;28731:4;28605:131;:::i;:::-;28597:139;;28324:419;;;:::o;28749:::-;28915:4;28953:2;28942:9;28938:18;28930:26;;29002:9;28996:4;28992:20;28988:1;28977:9;28973:17;28966:47;29030:131;29156:4;29030:131;:::i;:::-;29022:139;;28749:419;;;:::o;29174:::-;29340:4;29378:2;29367:9;29363:18;29355:26;;29427:9;29421:4;29417:20;29413:1;29402:9;29398:17;29391:47;29455:131;29581:4;29455:131;:::i;:::-;29447:139;;29174:419;;;:::o;29599:::-;29765:4;29803:2;29792:9;29788:18;29780:26;;29852:9;29846:4;29842:20;29838:1;29827:9;29823:17;29816:47;29880:131;30006:4;29880:131;:::i;:::-;29872:139;;29599:419;;;:::o;30024:::-;30190:4;30228:2;30217:9;30213:18;30205:26;;30277:9;30271:4;30267:20;30263:1;30252:9;30248:17;30241:47;30305:131;30431:4;30305:131;:::i;:::-;30297:139;;30024:419;;;:::o;30449:::-;30615:4;30653:2;30642:9;30638:18;30630:26;;30702:9;30696:4;30692:20;30688:1;30677:9;30673:17;30666:47;30730:131;30856:4;30730:131;:::i;:::-;30722:139;;30449:419;;;:::o;30874:::-;31040:4;31078:2;31067:9;31063:18;31055:26;;31127:9;31121:4;31117:20;31113:1;31102:9;31098:17;31091:47;31155:131;31281:4;31155:131;:::i;:::-;31147:139;;30874:419;;;:::o;31299:::-;31465:4;31503:2;31492:9;31488:18;31480:26;;31552:9;31546:4;31542:20;31538:1;31527:9;31523:17;31516:47;31580:131;31706:4;31580:131;:::i;:::-;31572:139;;31299:419;;;:::o;31724:::-;31890:4;31928:2;31917:9;31913:18;31905:26;;31977:9;31971:4;31967:20;31963:1;31952:9;31948:17;31941:47;32005:131;32131:4;32005:131;:::i;:::-;31997:139;;31724:419;;;:::o;32149:::-;32315:4;32353:2;32342:9;32338:18;32330:26;;32402:9;32396:4;32392:20;32388:1;32377:9;32373:17;32366:47;32430:131;32556:4;32430:131;:::i;:::-;32422:139;;32149:419;;;:::o;32574:::-;32740:4;32778:2;32767:9;32763:18;32755:26;;32827:9;32821:4;32817:20;32813:1;32802:9;32798:17;32791:47;32855:131;32981:4;32855:131;:::i;:::-;32847:139;;32574:419;;;:::o;32999:::-;33165:4;33203:2;33192:9;33188:18;33180:26;;33252:9;33246:4;33242:20;33238:1;33227:9;33223:17;33216:47;33280:131;33406:4;33280:131;:::i;:::-;33272:139;;32999:419;;;:::o;33424:::-;33590:4;33628:2;33617:9;33613:18;33605:26;;33677:9;33671:4;33667:20;33663:1;33652:9;33648:17;33641:47;33705:131;33831:4;33705:131;:::i;:::-;33697:139;;33424:419;;;:::o;33849:::-;34015:4;34053:2;34042:9;34038:18;34030:26;;34102:9;34096:4;34092:20;34088:1;34077:9;34073:17;34066:47;34130:131;34256:4;34130:131;:::i;:::-;34122:139;;33849:419;;;:::o;34274:::-;34440:4;34478:2;34467:9;34463:18;34455:26;;34527:9;34521:4;34517:20;34513:1;34502:9;34498:17;34491:47;34555:131;34681:4;34555:131;:::i;:::-;34547:139;;34274:419;;;:::o;34699:::-;34865:4;34903:2;34892:9;34888:18;34880:26;;34952:9;34946:4;34942:20;34938:1;34927:9;34923:17;34916:47;34980:131;35106:4;34980:131;:::i;:::-;34972:139;;34699:419;;;:::o;35124:::-;35290:4;35328:2;35317:9;35313:18;35305:26;;35377:9;35371:4;35367:20;35363:1;35352:9;35348:17;35341:47;35405:131;35531:4;35405:131;:::i;:::-;35397:139;;35124:419;;;:::o;35549:::-;35715:4;35753:2;35742:9;35738:18;35730:26;;35802:9;35796:4;35792:20;35788:1;35777:9;35773:17;35766:47;35830:131;35956:4;35830:131;:::i;:::-;35822:139;;35549:419;;;:::o;35974:::-;36140:4;36178:2;36167:9;36163:18;36155:26;;36227:9;36221:4;36217:20;36213:1;36202:9;36198:17;36191:47;36255:131;36381:4;36255:131;:::i;:::-;36247:139;;35974:419;;;:::o;36399:222::-;36492:4;36530:2;36519:9;36515:18;36507:26;;36543:71;36611:1;36600:9;36596:17;36587:6;36543:71;:::i;:::-;36399:222;;;;:::o;36627:129::-;36661:6;36688:20;;:::i;:::-;36678:30;;36717:33;36745:4;36737:6;36717:33;:::i;:::-;36627:129;;;:::o;36762:75::-;36795:6;36828:2;36822:9;36812:19;;36762:75;:::o;36843:307::-;36904:4;36994:18;36986:6;36983:30;36980:56;;;37016:18;;:::i;:::-;36980:56;37054:29;37076:6;37054:29;:::i;:::-;37046:37;;37138:4;37132;37128:15;37120:23;;36843:307;;;:::o;37156:308::-;37218:4;37308:18;37300:6;37297:30;37294:56;;;37330:18;;:::i;:::-;37294:56;37368:29;37390:6;37368:29;:::i;:::-;37360:37;;37452:4;37446;37442:15;37434:23;;37156:308;;;:::o;37470:132::-;37537:4;37560:3;37552:11;;37590:4;37585:3;37581:14;37573:22;;37470:132;;;:::o;37608:141::-;37657:4;37680:3;37672:11;;37703:3;37700:1;37693:14;37737:4;37734:1;37724:18;37716:26;;37608:141;;;:::o;37755:114::-;37822:6;37856:5;37850:12;37840:22;;37755:114;;;:::o;37875:98::-;37926:6;37960:5;37954:12;37944:22;;37875:98;;;:::o;37979:99::-;38031:6;38065:5;38059:12;38049:22;;37979:99;;;:::o;38084:113::-;38154:4;38186;38181:3;38177:14;38169:22;;38084:113;;;:::o;38203:184::-;38302:11;38336:6;38331:3;38324:19;38376:4;38371:3;38367:14;38352:29;;38203:184;;;;:::o;38393:168::-;38476:11;38510:6;38505:3;38498:19;38550:4;38545:3;38541:14;38526:29;;38393:168;;;;:::o;38567:147::-;38668:11;38705:3;38690:18;;38567:147;;;;:::o;38720:169::-;38804:11;38838:6;38833:3;38826:19;38878:4;38873:3;38869:14;38854:29;;38720:169;;;;:::o;38895:148::-;38997:11;39034:3;39019:18;;38895:148;;;;:::o;39049:305::-;39089:3;39108:20;39126:1;39108:20;:::i;:::-;39103:25;;39142:20;39160:1;39142:20;:::i;:::-;39137:25;;39296:1;39228:66;39224:74;39221:1;39218:81;39215:107;;;39302:18;;:::i;:::-;39215:107;39346:1;39343;39339:9;39332:16;;39049:305;;;;:::o;39360:185::-;39400:1;39417:20;39435:1;39417:20;:::i;:::-;39412:25;;39451:20;39469:1;39451:20;:::i;:::-;39446:25;;39490:1;39480:35;;39495:18;;:::i;:::-;39480:35;39537:1;39534;39530:9;39525:14;;39360:185;;;;:::o;39551:348::-;39591:7;39614:20;39632:1;39614:20;:::i;:::-;39609:25;;39648:20;39666:1;39648:20;:::i;:::-;39643:25;;39836:1;39768:66;39764:74;39761:1;39758:81;39753:1;39746:9;39739:17;39735:105;39732:131;;;39843:18;;:::i;:::-;39732:131;39891:1;39888;39884:9;39873:20;;39551:348;;;;:::o;39905:191::-;39945:4;39965:20;39983:1;39965:20;:::i;:::-;39960:25;;39999:20;40017:1;39999:20;:::i;:::-;39994:25;;40038:1;40035;40032:8;40029:34;;;40043:18;;:::i;:::-;40029:34;40088:1;40085;40081:9;40073:17;;39905:191;;;;:::o;40102:96::-;40139:7;40168:24;40186:5;40168:24;:::i;:::-;40157:35;;40102:96;;;:::o;40204:90::-;40238:7;40281:5;40274:13;40267:21;40256:32;;40204:90;;;:::o;40300:149::-;40336:7;40376:66;40369:5;40365:78;40354:89;;40300:149;;;:::o;40455:126::-;40492:7;40532:42;40525:5;40521:54;40510:65;;40455:126;;;:::o;40587:77::-;40624:7;40653:5;40642:16;;40587:77;;;:::o;40670:154::-;40754:6;40749:3;40744;40731:30;40816:1;40807:6;40802:3;40798:16;40791:27;40670:154;;;:::o;40830:307::-;40898:1;40908:113;40922:6;40919:1;40916:13;40908:113;;;41007:1;41002:3;40998:11;40992:18;40988:1;40983:3;40979:11;40972:39;40944:2;40941:1;40937:10;40932:15;;40908:113;;;41039:6;41036:1;41033:13;41030:101;;;41119:1;41110:6;41105:3;41101:16;41094:27;41030:101;40879:258;40830:307;;;:::o;41143:320::-;41187:6;41224:1;41218:4;41214:12;41204:22;;41271:1;41265:4;41261:12;41292:18;41282:81;;41348:4;41340:6;41336:17;41326:27;;41282:81;41410:2;41402:6;41399:14;41379:18;41376:38;41373:84;;;41429:18;;:::i;:::-;41373:84;41194:269;41143:320;;;:::o;41469:281::-;41552:27;41574:4;41552:27;:::i;:::-;41544:6;41540:40;41682:6;41670:10;41667:22;41646:18;41634:10;41631:34;41628:62;41625:88;;;41693:18;;:::i;:::-;41625:88;41733:10;41729:2;41722:22;41512:238;41469:281;;:::o;41756:233::-;41795:3;41818:24;41836:5;41818:24;:::i;:::-;41809:33;;41864:66;41857:5;41854:77;41851:103;;;41934:18;;:::i;:::-;41851:103;41981:1;41974:5;41970:13;41963:20;;41756:233;;;:::o;41995:176::-;42027:1;42044:20;42062:1;42044:20;:::i;:::-;42039:25;;42078:20;42096:1;42078:20;:::i;:::-;42073:25;;42117:1;42107:35;;42122:18;;:::i;:::-;42107:35;42163:1;42160;42156:9;42151:14;;41995:176;;;;:::o;42177:180::-;42225:77;42222:1;42215:88;42322:4;42319:1;42312:15;42346:4;42343:1;42336:15;42363:180;42411:77;42408:1;42401:88;42508:4;42505:1;42498:15;42532:4;42529:1;42522:15;42549:180;42597:77;42594:1;42587:88;42694:4;42691:1;42684:15;42718:4;42715:1;42708:15;42735:180;42783:77;42780:1;42773:88;42880:4;42877:1;42870:15;42904:4;42901:1;42894:15;42921:180;42969:77;42966:1;42959:88;43066:4;43063:1;43056:15;43090:4;43087:1;43080:15;43107:180;43155:77;43152:1;43145:88;43252:4;43249:1;43242:15;43276:4;43273:1;43266:15;43293:117;43402:1;43399;43392:12;43416:117;43525:1;43522;43515:12;43539:117;43648:1;43645;43638:12;43662:117;43771:1;43768;43761:12;43785:102;43826:6;43877:2;43873:7;43868:2;43861:5;43857:14;43853:28;43843:38;;43785:102;;;:::o;43893:230::-;44033:34;44029:1;44021:6;44017:14;44010:58;44102:13;44097:2;44089:6;44085:15;44078:38;43893:230;:::o;44129:170::-;44269:22;44265:1;44257:6;44253:14;44246:46;44129:170;:::o;44305:230::-;44445:34;44441:1;44433:6;44429:14;44422:58;44514:13;44509:2;44501:6;44497:15;44490:38;44305:230;:::o;44541:237::-;44681:34;44677:1;44669:6;44665:14;44658:58;44750:20;44745:2;44737:6;44733:15;44726:45;44541:237;:::o;44784:225::-;44924:34;44920:1;44912:6;44908:14;44901:58;44993:8;44988:2;44980:6;44976:15;44969:33;44784:225;:::o;45015:178::-;45155:30;45151:1;45143:6;45139:14;45132:54;45015:178;:::o;45199:164::-;45339:16;45335:1;45327:6;45323:14;45316:40;45199:164;:::o;45369:223::-;45509:34;45505:1;45497:6;45493:14;45486:58;45578:6;45573:2;45565:6;45561:15;45554:31;45369:223;:::o;45598:175::-;45738:27;45734:1;45726:6;45722:14;45715:51;45598:175;:::o;45779:224::-;45919:34;45915:1;45907:6;45903:14;45896:58;45988:7;45983:2;45975:6;45971:15;45964:32;45779:224;:::o;46009:231::-;46149:34;46145:1;46137:6;46133:14;46126:58;46218:14;46213:2;46205:6;46201:15;46194:39;46009:231;:::o;46246:166::-;46386:18;46382:1;46374:6;46370:14;46363:42;46246:166;:::o;46418:243::-;46558:34;46554:1;46546:6;46542:14;46535:58;46627:26;46622:2;46614:6;46610:15;46603:51;46418:243;:::o;46667:229::-;46807:34;46803:1;46795:6;46791:14;46784:58;46876:12;46871:2;46863:6;46859:15;46852:37;46667:229;:::o;46902:228::-;47042:34;47038:1;47030:6;47026:14;47019:58;47111:11;47106:2;47098:6;47094:15;47087:36;46902:228;:::o;47136:182::-;47276:34;47272:1;47264:6;47260:14;47253:58;47136:182;:::o;47324:231::-;47464:34;47460:1;47452:6;47448:14;47441:58;47533:14;47528:2;47520:6;47516:15;47509:39;47324:231;:::o;47561:182::-;47701:34;47697:1;47689:6;47685:14;47678:58;47561:182;:::o;47749:228::-;47889:34;47885:1;47877:6;47873:14;47866:58;47958:11;47953:2;47945:6;47941:15;47934:36;47749:228;:::o;47983:234::-;48123:34;48119:1;48111:6;48107:14;48100:58;48192:17;48187:2;48179:6;48175:15;48168:42;47983:234;:::o;48223:175::-;48363:27;48359:1;48351:6;48347:14;48340:51;48223:175;:::o;48404:220::-;48544:34;48540:1;48532:6;48528:14;48521:58;48613:3;48608:2;48600:6;48596:15;48589:28;48404:220;:::o;48630:114::-;;:::o;48750:166::-;48890:18;48886:1;48878:6;48874:14;48867:42;48750:166;:::o;48922:236::-;49062:34;49058:1;49050:6;49046:14;49039:58;49131:19;49126:2;49118:6;49114:15;49107:44;48922:236;:::o;49164:231::-;49304:34;49300:1;49292:6;49288:14;49281:58;49373:14;49368:2;49360:6;49356:15;49349:39;49164:231;:::o;49401:168::-;49541:20;49537:1;49529:6;49525:14;49518:44;49401:168;:::o;49575:235::-;49715:34;49711:1;49703:6;49699:14;49692:58;49784:18;49779:2;49771:6;49767:15;49760:43;49575:235;:::o;49816:176::-;49956:28;49952:1;49944:6;49940:14;49933:52;49816:176;:::o;49998:122::-;50071:24;50089:5;50071:24;:::i;:::-;50064:5;50061:35;50051:63;;50110:1;50107;50100:12;50051:63;49998:122;:::o;50126:116::-;50196:21;50211:5;50196:21;:::i;:::-;50189:5;50186:32;50176:60;;50232:1;50229;50222:12;50176:60;50126:116;:::o;50248:120::-;50320:23;50337:5;50320:23;:::i;:::-;50313:5;50310:34;50300:62;;50358:1;50355;50348:12;50300:62;50248:120;:::o;50374:122::-;50447:24;50465:5;50447:24;:::i;:::-;50440:5;50437:35;50427:63;;50486:1;50483;50476:12;50427:63;50374:122;:::o
Swarm Source
ipfs://008687e5242b5ea0b4f659a184c0a2ad8b84e148db8a4d700c40c70347dcb1a5
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.