ETH Price: $2,490.01 (-2.54%)

Token

Aborted Babby (Aborted Babby)
 

Overview

Max Total Supply

100 Aborted Babby

Holders

68

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Aborted Babby
0xe5691dfc88e01c16f46560e1a5e6a5ebf0678bf9
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AbortBabby

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-27
*/

/* 
   On June 24, 2022 the Supreme Court of The United States overturned the landmark Roe v. Wade case, which granted women in the US the right to terminate a pregnancy. 
   For each of the first 100 Babby NFTs aborted, 0.1 ETH will be donated towards supporting safe abortions. 
*/


// File: IERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @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);

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: ERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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-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 {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred.
     * This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred.
     * This includes minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: babby.sol

pragma solidity ^0.8.4;


contract AbortBabby is ERC721A {
   address public constant charity = 0x83416faef4D62178afbE246F4a41f82DcA13Ae02;  // LegalAbortions.eth
   uint256 public constant donationAmount = 0.1 ether;
   IERC721A public constant babbys = IERC721A(0x9A4b320418544b4Da92C38d2a6E2de09d5B0287A);
   address public constant dead = 0xdeaDDeADDEaDdeaDdEAddEADDEAdDeadDEADDEaD;
   address public immutable deployer;
   uint256[] public abortedBabbys; //stores tokenId of aborted Babbys

   constructor() ERC721A("Aborted Babby", "Aborted Babby") {
      deployer=msg.sender;
   }

   //safe transfer callback handles receipt of Babby, issues abortion notice, and makes a donation
   function onERC721Received(address , address mother, uint256 socialSecurityNumber, bytes memory) external returns(bytes4) {
      require(msg.sender == address(babbys), "You can only abort a Babby");
      require(address(this).balance >= donationAmount, "Sorry, no more money is available to pay for abortions");

      _abort(socialSecurityNumber, mother);
      _donate(socialSecurityNumber);

      return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));
   }

   function _abort(uint256 socialSecurityNumber, address mother) internal {
      babbys.transferFrom(address(this), dead, socialSecurityNumber);
      _safeMint(mother, 1); 
      abortedBabbys.push(socialSecurityNumber);
   }

   function _donate(uint256 socialSecurityNumber) internal {
      (bool success, ) = charity.call{value: donationAmount}("");
      require (success, "Unable to send donation");
   }

   function donateBalance() external { //Any unused balance in the contract to be donated
      require(msg.sender == deployer);
      (bool success, ) = charity.call{value: address(this).balance}("");
      require (success, "Unable to send donation");
   }

   function _beforeTokenTransfers(address from, address, uint256, uint256) internal override {
      require (from==address(0), "Not transferable"); //Transfers are prohibited
   }

   function tokenURI(uint256 tokenId) public view override returns (string memory) {
      if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
      uint256 abortedBabby = abortedBabbys[tokenId -1];

      string memory URI = Base64.encode(
         bytes(
            string(
               abi.encodePacked(
                  '{"name": "Illegal Abortion Notice #', 
                     _toString(tokenId),
                  '","description": "The holder of this NFT has aborted Babby #',
                  _toString(abortedBabby),
                  '. A donation of 0.1 ETH has been sent to LegalAbortions.eth to support safe abortions.", "image": "ipfs://QmXcEEkuj1vvAdmponXFJ6b7DfLSJxzPFAx7JPuDkhpLxY"}'
               )
            )
         )
      );

      string memory output = string(abi.encodePacked("data:application/json;base64,", URI));
      return output;
   } 
   
   receive () external payable { //Only deployer can load up the contract with donation funds
      require (msg.sender == deployer);
   }
   
   function _startTokenId() internal pure override returns (uint256) {
      return 1;
   }
}

/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>

library Base64 {
   string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

   function encode(bytes memory data) internal pure returns (string memory) {
      if (data.length == 0) return "";

      // load the table into memory
      string memory table = TABLE;

      // multiply by 4/3 rounded up
      uint256 encodedLen = 4 * ((data.length + 2) / 3);

      // add some extra buffer at the end required for the writing
      string memory result = new string(encodedLen + 32);

      assembly {
         // set the actual output length
         mstore(result, encodedLen)

         // prepare the lookup table
         let tablePtr := add(table, 1)

         // input ptr
         let dataPtr := data
         let endPtr := add(dataPtr, mload(data))

         // result ptr, jump over length
         let resultPtr := add(result, 32)

         // run over the input, 3 bytes at a time
         for {

         } lt(dataPtr, endPtr) {

         } {
            dataPtr := add(dataPtr, 3)

            // read 3 bytes
            let input := mload(dataPtr)

            // write 4 characters
            mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
            resultPtr := add(resultPtr, 1)
            mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
            resultPtr := add(resultPtr, 1)
            mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))))
            resultPtr := add(resultPtr, 1)
            mstore(resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))))
            resultPtr := add(resultPtr, 1)
         }

         // padding with '='
         switch mod(mload(data), 3)
         case 1 {
            mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
         }
         case 2 {
            mstore(sub(resultPtr, 1), shl(248, 0x3d))
         }
      }

      return result;
   }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"abortedBabbys","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":[],"name":"babbys","outputs":[{"internalType":"contract IERC721A","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dead","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donateBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"donationAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"mother","type":"address"},{"internalType":"uint256","name":"socialSecurityNumber","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"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":"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"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b506040518060400160405280600d81526020017f41626f72746564204261626279000000000000000000000000000000000000008152506040518060400160405280600d81526020017f41626f72746564204261626279000000000000000000000000000000000000008152508160029080519060200190620000969291906200010e565b508060039080519060200190620000af9291906200010e565b50620000c06200010560201b60201c565b60008190555050503373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505062000223565b60006001905090565b8280546200011c90620001be565b90600052602060002090601f0160209004810192826200014057600085556200018c565b82601f106200015b57805160ff19168380011785556200018c565b828001600101855582156200018c579182015b828111156200018b5782518255916020019190600101906200016e565b5b5090506200019b91906200019f565b5090565b5b80821115620001ba576000816000905550600101620001a0565b5090565b60006002820490506001821680620001d757607f821691505b60208210811415620001ee57620001ed620001f4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160601c612c226200025060003960008181610140015281816109c801526112c50152612c226000f3fe6080604052600436106101395760003560e01c80634bed6c23116100ab578063a22cb4651161006f578063a22cb4651461049f578063a473fe26146104c8578063b88d4fde146104f3578063c87b56dd1461051c578063d5f3948814610559578063e985e9c51461058457610198565b80634bed6c23146103a45780636352211e146103cf57806370a082311461040c578063934aa0231461044957806395d89b411461047457610198565b806318160ddd116100fd57806318160ddd146102a857806318cd05d0146102d357806323b872dd146102ea57806336cf7c87146103135780633d2dc3061461033e57806342842e0e1461037b57610198565b806301ffc9a71461019d57806306fdde03146101da578063081812fc14610205578063095ea7b314610242578063150b7a021461026b57610198565b36610198577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461019657600080fd5b005b600080fd5b3480156101a957600080fd5b506101c460048036038101906101bf919061200b565b6105c1565b6040516101d191906123d5565b60405180910390f35b3480156101e657600080fd5b506101ef610653565b6040516101fc9190612426565b60405180910390f35b34801561021157600080fd5b5061022c60048036038101906102279190612065565b6106e5565b6040516102399190612337565b60405180910390f35b34801561024e57600080fd5b5061026960048036038101906102649190611fcb565b610761565b005b34801561027757600080fd5b50610292600480360381019061028d9190611f08565b6108a2565b60405161029f91906123f0565b60405180910390f35b3480156102b457600080fd5b506102bd6109af565b6040516102ca91906124c8565b60405180910390f35b3480156102df57600080fd5b506102e86109c6565b005b3480156102f657600080fd5b50610311600480360381019061030c9190611eb5565b610ae1565b005b34801561031f57600080fd5b50610328610e06565b6040516103359190612337565b60405180910390f35b34801561034a57600080fd5b5061036560048036038101906103609190612065565b610e1e565b60405161037291906124c8565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d9190611eb5565b610e42565b005b3480156103b057600080fd5b506103b9610e62565b6040516103c691906124c8565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190612065565b610e6e565b6040516104039190612337565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190611e48565b610e80565b60405161044091906124c8565b60405180910390f35b34801561045557600080fd5b5061045e610f39565b60405161046b9190612337565b60405180910390f35b34801561048057600080fd5b50610489610f51565b6040516104969190612426565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190611f8b565b610fe3565b005b3480156104d457600080fd5b506104dd61115b565b6040516104ea919061240b565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190611f08565b611173565b005b34801561052857600080fd5b50610543600480360381019061053e9190612065565b6111e6565b6040516105509190612426565b60405180910390f35b34801561056557600080fd5b5061056e6112c3565b60405161057b9190612337565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190611e75565b6112e7565b6040516105b891906123d5565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061061c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061064c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461066290612788565b80601f016020809104026020016040519081016040528092919081815260200182805461068e90612788565b80156106db5780601f106106b0576101008083540402835291602001916106db565b820191906000526020600020905b8154815290600101906020018083116106be57829003601f168201915b5050505050905090565b60006106f08261137b565b610726576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076c82610e6e565b90508073ffffffffffffffffffffffffffffffffffffffff1661078d6113da565b73ffffffffffffffffffffffffffffffffffffffff16146107f0576107b9816107b46113da565b6112e7565b6107ef576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000739a4b320418544b4da92c38d2a6e2de09d5b0287a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091d906124a8565b60405180910390fd5b67016345785d8a0000471015610971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096890612488565b60405180910390fd5b61097b83856113e2565b610984836114b1565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f9050949350505050565b60006109b961157d565b6001546000540303905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a1e57600080fd5b60007383416faef4d62178afbe246f4a41f82dca13ae0273ffffffffffffffffffffffffffffffffffffffff1647604051610a5890612322565b60006040518083038185875af1925050503d8060008114610a95576040519150601f19603f3d011682016040523d82523d6000602084013e610a9a565b606091505b5050905080610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590612468565b60405180910390fd5b50565b6000610aec82611586565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b53576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b5f84611654565b91509150610b758187610b706113da565b611676565b610bc157610b8a86610b856113da565b6112e7565b610bc0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c28576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3586868660016116ba565b8015610c4057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d0e85610cea88888761172f565b7c020000000000000000000000000000000000000000000000000000000017611757565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d96576000600185019050600060046000838152602001908152602001600020541415610d94576000548114610d93578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dfe8686866001611782565b505050505050565b73deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b60088181548110610e2e57600080fd5b906000526020600020016000915090505481565b610e5d83838360405180602001604052806000815250611173565b505050565b67016345785d8a000081565b6000610e7982611586565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b7383416faef4d62178afbe246f4a41f82dca13ae0281565b606060038054610f6090612788565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8c90612788565b8015610fd95780601f10610fae57610100808354040283529160200191610fd9565b820191906000526020600020905b815481529060010190602001808311610fbc57829003601f168201915b5050505050905090565b610feb6113da565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611050576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061105d6113da565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661110a6113da565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161114f91906123d5565b60405180910390a35050565b739a4b320418544b4da92c38d2a6e2de09d5b0287a81565b61117e848484610ae1565b60008373ffffffffffffffffffffffffffffffffffffffff163b146111e0576111a984848484611788565b6111df576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606111f18261137b565b611227576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060086001846112389190612668565b8154811061124957611248612878565b5b906000526020600020015490506000611292611264856118e8565b61126d846118e8565b60405160200161127e9291906122bb565b604051602081830303815290604052611942565b90506000816040516020016112a79190612300565b6040516020818303038152906040529050809350505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008161138661157d565b11158015611395575060005482105b80156113d3575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b739a4b320418544b4da92c38d2a6e2de09d5b0287a73ffffffffffffffffffffffffffffffffffffffff166323b872dd3073deaddeaddeaddeaddeaddeaddeaddeaddeaddead856040518463ffffffff1660e01b815260040161144793929190612352565b600060405180830381600087803b15801561146157600080fd5b505af1158015611475573d6000803e3d6000fd5b50505050611484816001611ac7565b60088290806001815401808255809150506001900390600052602060002001600090919091909150555050565b60007383416faef4d62178afbe246f4a41f82dca13ae0273ffffffffffffffffffffffffffffffffffffffff1667016345785d8a00006040516114f390612322565b60006040518083038185875af1925050503d8060008114611530576040519150601f19603f3d011682016040523d82523d6000602084013e611535565b606091505b5050905080611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090612468565b60405180910390fd5b5050565b60006001905090565b6000808290508061159561157d565b1161161d5760005481101561161c5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561161a575b60008114156116105760046000836001900393508381526020019081526020016000205490506115e5565b809250505061164f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090612448565b60405180910390fd5b50505050565b60008060e883901c905060e8611746868684611ae5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026117ae6113da565b8786866040518563ffffffff1660e01b81526004016117d09493929190612389565b602060405180830381600087803b1580156117ea57600080fd5b505af192505050801561181b57506040513d601f19601f820116820180604052508101906118189190612038565b60015b611895573d806000811461184b576040519150601f19603f3d011682016040523d82523d6000602084013e611850565b606091505b5060008151141561188d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561192e57600183039250600a81066030018353600a8104905061190e565b508181036020830392508083525050919050565b606060008251141561196557604051806020016040528060008152509050611ac2565b6000604051806060016040528060408152602001612bad60409139905060006003600285516119949190612587565b61199e91906125dd565b60046119aa919061260e565b905060006020826119bb9190612587565b67ffffffffffffffff8111156119d4576119d36128a7565b5b6040519080825280601f01601f191660200182016040528015611a065781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015611a81576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050611a1a565b600389510660018114611a9b5760028114611aab57611ab6565b613d3d60f01b6002830352611ab6565b603d60f81b60018303525b50505050508093505050505b919050565b611ae1828260405180602001604052806000815250611aee565b5050565b60009392505050565b611af88383611b8b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b8657600080549050600083820390505b611b386000868380600101945086611788565b611b6e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611b25578160005414611b8357600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611bf8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415611c33576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c4060008483856116ba565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611cb783611ca8600086600061172f565b611cb185611d5f565b17611757565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611cdb57806000819055505050611d5a6000848385611782565b505050565b60006001821460e11b9050919050565b6000611d82611d7d84612508565b6124e3565b905082815260208101848484011115611d9e57611d9d6128db565b5b611da9848285612746565b509392505050565b600081359050611dc081612b50565b92915050565b600081359050611dd581612b67565b92915050565b600081359050611dea81612b7e565b92915050565b600081519050611dff81612b7e565b92915050565b600082601f830112611e1a57611e196128d6565b5b8135611e2a848260208601611d6f565b91505092915050565b600081359050611e4281612b95565b92915050565b600060208284031215611e5e57611e5d6128e5565b5b6000611e6c84828501611db1565b91505092915050565b60008060408385031215611e8c57611e8b6128e5565b5b6000611e9a85828601611db1565b9250506020611eab85828601611db1565b9150509250929050565b600080600060608486031215611ece57611ecd6128e5565b5b6000611edc86828701611db1565b9350506020611eed86828701611db1565b9250506040611efe86828701611e33565b9150509250925092565b60008060008060808587031215611f2257611f216128e5565b5b6000611f3087828801611db1565b9450506020611f4187828801611db1565b9350506040611f5287828801611e33565b925050606085013567ffffffffffffffff811115611f7357611f726128e0565b5b611f7f87828801611e05565b91505092959194509250565b60008060408385031215611fa257611fa16128e5565b5b6000611fb085828601611db1565b9250506020611fc185828601611dc6565b9150509250929050565b60008060408385031215611fe257611fe16128e5565b5b6000611ff085828601611db1565b925050602061200185828601611e33565b9150509250929050565b600060208284031215612021576120206128e5565b5b600061202f84828501611ddb565b91505092915050565b60006020828403121561204e5761204d6128e5565b5b600061205c84828501611df0565b91505092915050565b60006020828403121561207b5761207a6128e5565b5b600061208984828501611e33565b91505092915050565b61209b8161269c565b82525050565b6120aa816126ae565b82525050565b6120b9816126ba565b82525050565b60006120ca82612539565b6120d4818561254f565b93506120e4818560208601612755565b6120ed816128ea565b840191505092915050565b61210181612710565b82525050565b600061211282612544565b61211c818561256b565b935061212c818560208601612755565b612135816128ea565b840191505092915050565b600061214b82612544565b612155818561257c565b9350612165818560208601612755565b80840191505092915050565b600061217e609a8361257c565b9150612189826128fb565b609a82019050919050565b60006121a1603c8361257c565b91506121ac826129bc565b603c82019050919050565b60006121c460238361257c565b91506121cf82612a0b565b602382019050919050565b60006121e760108361256b565b91506121f282612a5a565b602082019050919050565b600061220a60178361256b565b915061221582612a83565b602082019050919050565b600061222d601d8361257c565b915061223882612aac565b601d82019050919050565b6000612250600083612560565b915061225b82612ad5565b600082019050919050565b600061227360368361256b565b915061227e82612ad8565b604082019050919050565b6000612296601a8361256b565b91506122a182612b27565b602082019050919050565b6122b581612706565b82525050565b60006122c6826121b7565b91506122d28285612140565b91506122dd82612194565b91506122e98284612140565b91506122f482612171565b91508190509392505050565b600061230b82612220565b91506123178284612140565b915081905092915050565b600061232d82612243565b9150819050919050565b600060208201905061234c6000830184612092565b92915050565b60006060820190506123676000830186612092565b6123746020830185612092565b61238160408301846122ac565b949350505050565b600060808201905061239e6000830187612092565b6123ab6020830186612092565b6123b860408301856122ac565b81810360608301526123ca81846120bf565b905095945050505050565b60006020820190506123ea60008301846120a1565b92915050565b600060208201905061240560008301846120b0565b92915050565b600060208201905061242060008301846120f8565b92915050565b600060208201905081810360008301526124408184612107565b905092915050565b60006020820190508181036000830152612461816121da565b9050919050565b60006020820190508181036000830152612481816121fd565b9050919050565b600060208201905081810360008301526124a181612266565b9050919050565b600060208201905081810360008301526124c181612289565b9050919050565b60006020820190506124dd60008301846122ac565b92915050565b60006124ed6124fe565b90506124f982826127ba565b919050565b6000604051905090565b600067ffffffffffffffff821115612523576125226128a7565b5b61252c826128ea565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061259282612706565b915061259d83612706565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156125d2576125d16127eb565b5b828201905092915050565b60006125e882612706565b91506125f383612706565b9250826126035761260261281a565b5b828204905092915050565b600061261982612706565b915061262483612706565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561265d5761265c6127eb565b5b828202905092915050565b600061267382612706565b915061267e83612706565b925082821015612691576126906127eb565b5b828203905092915050565b60006126a7826126e6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061271b82612722565b9050919050565b600061272d82612734565b9050919050565b600061273f826126e6565b9050919050565b82818337600083830152505050565b60005b83811015612773578082015181840152602081019050612758565b83811115612782576000848401525b50505050565b600060028204905060018216806127a057607f821691505b602082108114156127b4576127b3612849565b5b50919050565b6127c3826128ea565b810181811067ffffffffffffffff821117156127e2576127e16128a7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f2e204120646f6e6174696f6e206f6620302e312045544820686173206265656e60008201527f2073656e7420746f204c6567616c41626f7274696f6e732e65746820746f207360208201527f7570706f727420736166652061626f7274696f6e732e222c2022696d6167652260408201527f3a2022697066733a2f2f516d586345456b756a31767641646d706f6e58464a3660608201527f623744664c534a787a50464178374a5075446b68704c7859227d000000000000608082015250565b7f222c226465736372697074696f6e223a202254686520686f6c646572206f662060008201527f74686973204e4654206861732061626f72746564204261626279202300000000602082015250565b7f7b226e616d65223a2022496c6c6567616c2041626f7274696f6e204e6f74696360008201527f6520230000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74207472616e7366657261626c6500000000000000000000000000000000600082015250565b7f556e61626c6520746f2073656e6420646f6e6174696f6e000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b50565b7f536f7272792c206e6f206d6f7265206d6f6e657920697320617661696c61626c60008201527f6520746f2070617920666f722061626f7274696f6e7300000000000000000000602082015250565b7f596f752063616e206f6e6c792061626f72742061204261626279000000000000600082015250565b612b598161269c565b8114612b6457600080fd5b50565b612b70816126ae565b8114612b7b57600080fd5b50565b612b87816126ba565b8114612b9257600080fd5b50565b612b9e81612706565b8114612ba957600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200c15344ba34896f0311b18441163bddbee40a775d5b84d63efd639facd88103064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101395760003560e01c80634bed6c23116100ab578063a22cb4651161006f578063a22cb4651461049f578063a473fe26146104c8578063b88d4fde146104f3578063c87b56dd1461051c578063d5f3948814610559578063e985e9c51461058457610198565b80634bed6c23146103a45780636352211e146103cf57806370a082311461040c578063934aa0231461044957806395d89b411461047457610198565b806318160ddd116100fd57806318160ddd146102a857806318cd05d0146102d357806323b872dd146102ea57806336cf7c87146103135780633d2dc3061461033e57806342842e0e1461037b57610198565b806301ffc9a71461019d57806306fdde03146101da578063081812fc14610205578063095ea7b314610242578063150b7a021461026b57610198565b36610198577f0000000000000000000000000b949995992f6d0325257da916b72c532b6ab1ba73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461019657600080fd5b005b600080fd5b3480156101a957600080fd5b506101c460048036038101906101bf919061200b565b6105c1565b6040516101d191906123d5565b60405180910390f35b3480156101e657600080fd5b506101ef610653565b6040516101fc9190612426565b60405180910390f35b34801561021157600080fd5b5061022c60048036038101906102279190612065565b6106e5565b6040516102399190612337565b60405180910390f35b34801561024e57600080fd5b5061026960048036038101906102649190611fcb565b610761565b005b34801561027757600080fd5b50610292600480360381019061028d9190611f08565b6108a2565b60405161029f91906123f0565b60405180910390f35b3480156102b457600080fd5b506102bd6109af565b6040516102ca91906124c8565b60405180910390f35b3480156102df57600080fd5b506102e86109c6565b005b3480156102f657600080fd5b50610311600480360381019061030c9190611eb5565b610ae1565b005b34801561031f57600080fd5b50610328610e06565b6040516103359190612337565b60405180910390f35b34801561034a57600080fd5b5061036560048036038101906103609190612065565b610e1e565b60405161037291906124c8565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d9190611eb5565b610e42565b005b3480156103b057600080fd5b506103b9610e62565b6040516103c691906124c8565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190612065565b610e6e565b6040516104039190612337565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190611e48565b610e80565b60405161044091906124c8565b60405180910390f35b34801561045557600080fd5b5061045e610f39565b60405161046b9190612337565b60405180910390f35b34801561048057600080fd5b50610489610f51565b6040516104969190612426565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190611f8b565b610fe3565b005b3480156104d457600080fd5b506104dd61115b565b6040516104ea919061240b565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190611f08565b611173565b005b34801561052857600080fd5b50610543600480360381019061053e9190612065565b6111e6565b6040516105509190612426565b60405180910390f35b34801561056557600080fd5b5061056e6112c3565b60405161057b9190612337565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190611e75565b6112e7565b6040516105b891906123d5565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061061c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061064c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461066290612788565b80601f016020809104026020016040519081016040528092919081815260200182805461068e90612788565b80156106db5780601f106106b0576101008083540402835291602001916106db565b820191906000526020600020905b8154815290600101906020018083116106be57829003601f168201915b5050505050905090565b60006106f08261137b565b610726576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076c82610e6e565b90508073ffffffffffffffffffffffffffffffffffffffff1661078d6113da565b73ffffffffffffffffffffffffffffffffffffffff16146107f0576107b9816107b46113da565b6112e7565b6107ef576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000739a4b320418544b4da92c38d2a6e2de09d5b0287a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091d906124a8565b60405180910390fd5b67016345785d8a0000471015610971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096890612488565b60405180910390fd5b61097b83856113e2565b610984836114b1565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f9050949350505050565b60006109b961157d565b6001546000540303905090565b7f0000000000000000000000000b949995992f6d0325257da916b72c532b6ab1ba73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a1e57600080fd5b60007383416faef4d62178afbe246f4a41f82dca13ae0273ffffffffffffffffffffffffffffffffffffffff1647604051610a5890612322565b60006040518083038185875af1925050503d8060008114610a95576040519150601f19603f3d011682016040523d82523d6000602084013e610a9a565b606091505b5050905080610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590612468565b60405180910390fd5b50565b6000610aec82611586565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b53576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b5f84611654565b91509150610b758187610b706113da565b611676565b610bc157610b8a86610b856113da565b6112e7565b610bc0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c28576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3586868660016116ba565b8015610c4057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d0e85610cea88888761172f565b7c020000000000000000000000000000000000000000000000000000000017611757565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d96576000600185019050600060046000838152602001908152602001600020541415610d94576000548114610d93578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dfe8686866001611782565b505050505050565b73deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b60088181548110610e2e57600080fd5b906000526020600020016000915090505481565b610e5d83838360405180602001604052806000815250611173565b505050565b67016345785d8a000081565b6000610e7982611586565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b7383416faef4d62178afbe246f4a41f82dca13ae0281565b606060038054610f6090612788565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8c90612788565b8015610fd95780601f10610fae57610100808354040283529160200191610fd9565b820191906000526020600020905b815481529060010190602001808311610fbc57829003601f168201915b5050505050905090565b610feb6113da565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611050576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061105d6113da565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661110a6113da565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161114f91906123d5565b60405180910390a35050565b739a4b320418544b4da92c38d2a6e2de09d5b0287a81565b61117e848484610ae1565b60008373ffffffffffffffffffffffffffffffffffffffff163b146111e0576111a984848484611788565b6111df576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606111f18261137b565b611227576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060086001846112389190612668565b8154811061124957611248612878565b5b906000526020600020015490506000611292611264856118e8565b61126d846118e8565b60405160200161127e9291906122bb565b604051602081830303815290604052611942565b90506000816040516020016112a79190612300565b6040516020818303038152906040529050809350505050919050565b7f0000000000000000000000000b949995992f6d0325257da916b72c532b6ab1ba81565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008161138661157d565b11158015611395575060005482105b80156113d3575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b739a4b320418544b4da92c38d2a6e2de09d5b0287a73ffffffffffffffffffffffffffffffffffffffff166323b872dd3073deaddeaddeaddeaddeaddeaddeaddeaddeaddead856040518463ffffffff1660e01b815260040161144793929190612352565b600060405180830381600087803b15801561146157600080fd5b505af1158015611475573d6000803e3d6000fd5b50505050611484816001611ac7565b60088290806001815401808255809150506001900390600052602060002001600090919091909150555050565b60007383416faef4d62178afbe246f4a41f82dca13ae0273ffffffffffffffffffffffffffffffffffffffff1667016345785d8a00006040516114f390612322565b60006040518083038185875af1925050503d8060008114611530576040519150601f19603f3d011682016040523d82523d6000602084013e611535565b606091505b5050905080611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090612468565b60405180910390fd5b5050565b60006001905090565b6000808290508061159561157d565b1161161d5760005481101561161c5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561161a575b60008114156116105760046000836001900393508381526020019081526020016000205490506115e5565b809250505061164f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090612448565b60405180910390fd5b50505050565b60008060e883901c905060e8611746868684611ae5565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026117ae6113da565b8786866040518563ffffffff1660e01b81526004016117d09493929190612389565b602060405180830381600087803b1580156117ea57600080fd5b505af192505050801561181b57506040513d601f19601f820116820180604052508101906118189190612038565b60015b611895573d806000811461184b576040519150601f19603f3d011682016040523d82523d6000602084013e611850565b606091505b5060008151141561188d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561192e57600183039250600a81066030018353600a8104905061190e565b508181036020830392508083525050919050565b606060008251141561196557604051806020016040528060008152509050611ac2565b6000604051806060016040528060408152602001612bad60409139905060006003600285516119949190612587565b61199e91906125dd565b60046119aa919061260e565b905060006020826119bb9190612587565b67ffffffffffffffff8111156119d4576119d36128a7565b5b6040519080825280601f01601f191660200182016040528015611a065781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015611a81576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050611a1a565b600389510660018114611a9b5760028114611aab57611ab6565b613d3d60f01b6002830352611ab6565b603d60f81b60018303525b50505050508093505050505b919050565b611ae1828260405180602001604052806000815250611aee565b5050565b60009392505050565b611af88383611b8b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b8657600080549050600083820390505b611b386000868380600101945086611788565b611b6e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611b25578160005414611b8357600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611bf8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415611c33576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c4060008483856116ba565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611cb783611ca8600086600061172f565b611cb185611d5f565b17611757565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611cdb57806000819055505050611d5a6000848385611782565b505050565b60006001821460e11b9050919050565b6000611d82611d7d84612508565b6124e3565b905082815260208101848484011115611d9e57611d9d6128db565b5b611da9848285612746565b509392505050565b600081359050611dc081612b50565b92915050565b600081359050611dd581612b67565b92915050565b600081359050611dea81612b7e565b92915050565b600081519050611dff81612b7e565b92915050565b600082601f830112611e1a57611e196128d6565b5b8135611e2a848260208601611d6f565b91505092915050565b600081359050611e4281612b95565b92915050565b600060208284031215611e5e57611e5d6128e5565b5b6000611e6c84828501611db1565b91505092915050565b60008060408385031215611e8c57611e8b6128e5565b5b6000611e9a85828601611db1565b9250506020611eab85828601611db1565b9150509250929050565b600080600060608486031215611ece57611ecd6128e5565b5b6000611edc86828701611db1565b9350506020611eed86828701611db1565b9250506040611efe86828701611e33565b9150509250925092565b60008060008060808587031215611f2257611f216128e5565b5b6000611f3087828801611db1565b9450506020611f4187828801611db1565b9350506040611f5287828801611e33565b925050606085013567ffffffffffffffff811115611f7357611f726128e0565b5b611f7f87828801611e05565b91505092959194509250565b60008060408385031215611fa257611fa16128e5565b5b6000611fb085828601611db1565b9250506020611fc185828601611dc6565b9150509250929050565b60008060408385031215611fe257611fe16128e5565b5b6000611ff085828601611db1565b925050602061200185828601611e33565b9150509250929050565b600060208284031215612021576120206128e5565b5b600061202f84828501611ddb565b91505092915050565b60006020828403121561204e5761204d6128e5565b5b600061205c84828501611df0565b91505092915050565b60006020828403121561207b5761207a6128e5565b5b600061208984828501611e33565b91505092915050565b61209b8161269c565b82525050565b6120aa816126ae565b82525050565b6120b9816126ba565b82525050565b60006120ca82612539565b6120d4818561254f565b93506120e4818560208601612755565b6120ed816128ea565b840191505092915050565b61210181612710565b82525050565b600061211282612544565b61211c818561256b565b935061212c818560208601612755565b612135816128ea565b840191505092915050565b600061214b82612544565b612155818561257c565b9350612165818560208601612755565b80840191505092915050565b600061217e609a8361257c565b9150612189826128fb565b609a82019050919050565b60006121a1603c8361257c565b91506121ac826129bc565b603c82019050919050565b60006121c460238361257c565b91506121cf82612a0b565b602382019050919050565b60006121e760108361256b565b91506121f282612a5a565b602082019050919050565b600061220a60178361256b565b915061221582612a83565b602082019050919050565b600061222d601d8361257c565b915061223882612aac565b601d82019050919050565b6000612250600083612560565b915061225b82612ad5565b600082019050919050565b600061227360368361256b565b915061227e82612ad8565b604082019050919050565b6000612296601a8361256b565b91506122a182612b27565b602082019050919050565b6122b581612706565b82525050565b60006122c6826121b7565b91506122d28285612140565b91506122dd82612194565b91506122e98284612140565b91506122f482612171565b91508190509392505050565b600061230b82612220565b91506123178284612140565b915081905092915050565b600061232d82612243565b9150819050919050565b600060208201905061234c6000830184612092565b92915050565b60006060820190506123676000830186612092565b6123746020830185612092565b61238160408301846122ac565b949350505050565b600060808201905061239e6000830187612092565b6123ab6020830186612092565b6123b860408301856122ac565b81810360608301526123ca81846120bf565b905095945050505050565b60006020820190506123ea60008301846120a1565b92915050565b600060208201905061240560008301846120b0565b92915050565b600060208201905061242060008301846120f8565b92915050565b600060208201905081810360008301526124408184612107565b905092915050565b60006020820190508181036000830152612461816121da565b9050919050565b60006020820190508181036000830152612481816121fd565b9050919050565b600060208201905081810360008301526124a181612266565b9050919050565b600060208201905081810360008301526124c181612289565b9050919050565b60006020820190506124dd60008301846122ac565b92915050565b60006124ed6124fe565b90506124f982826127ba565b919050565b6000604051905090565b600067ffffffffffffffff821115612523576125226128a7565b5b61252c826128ea565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061259282612706565b915061259d83612706565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156125d2576125d16127eb565b5b828201905092915050565b60006125e882612706565b91506125f383612706565b9250826126035761260261281a565b5b828204905092915050565b600061261982612706565b915061262483612706565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561265d5761265c6127eb565b5b828202905092915050565b600061267382612706565b915061267e83612706565b925082821015612691576126906127eb565b5b828203905092915050565b60006126a7826126e6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061271b82612722565b9050919050565b600061272d82612734565b9050919050565b600061273f826126e6565b9050919050565b82818337600083830152505050565b60005b83811015612773578082015181840152602081019050612758565b83811115612782576000848401525b50505050565b600060028204905060018216806127a057607f821691505b602082108114156127b4576127b3612849565b5b50919050565b6127c3826128ea565b810181811067ffffffffffffffff821117156127e2576127e16128a7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f2e204120646f6e6174696f6e206f6620302e312045544820686173206265656e60008201527f2073656e7420746f204c6567616c41626f7274696f6e732e65746820746f207360208201527f7570706f727420736166652061626f7274696f6e732e222c2022696d6167652260408201527f3a2022697066733a2f2f516d586345456b756a31767641646d706f6e58464a3660608201527f623744664c534a787a50464178374a5075446b68704c7859227d000000000000608082015250565b7f222c226465736372697074696f6e223a202254686520686f6c646572206f662060008201527f74686973204e4654206861732061626f72746564204261626279202300000000602082015250565b7f7b226e616d65223a2022496c6c6567616c2041626f7274696f6e204e6f74696360008201527f6520230000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74207472616e7366657261626c6500000000000000000000000000000000600082015250565b7f556e61626c6520746f2073656e6420646f6e6174696f6e000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b50565b7f536f7272792c206e6f206d6f7265206d6f6e657920697320617661696c61626c60008201527f6520746f2070617920666f722061626f7274696f6e7300000000000000000000602082015250565b7f596f752063616e206f6e6c792061626f72742061204261626279000000000000600082015250565b612b598161269c565b8114612b6457600080fd5b50565b612b70816126ae565b8114612b7b57600080fd5b50565b612b87816126ba565b8114612b9257600080fd5b50565b612b9e81612706565b8114612ba957600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200c15344ba34896f0311b18441163bddbee40a775d5b84d63efd639facd88103064736f6c63430008070033

Deployed Bytecode Sourcemap

45031:3210:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48122:8;48108:22;;:10;:22;;;48099:32;;;;;;45031:3210;;;;;14848:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20495:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22441:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21989:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45710:491;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13902:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46633:259;;;;;;;;;;;;;:::i;:::-;;31706:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45321:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45439:30;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23331:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45173:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20284:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15527:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45068:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20664:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22717:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45229:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23587:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47085:905;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45400:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23096:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14848:615;14933:4;15248:10;15233:25;;:11;:25;;;;:102;;;;15325:10;15310:25;;:11;:25;;;;15233:102;:179;;;;15402:10;15387:25;;:11;:25;;;;15233:179;15213:199;;14848:615;;;:::o;20495:100::-;20549:13;20582:5;20575:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20495:100;:::o;22441:204::-;22509:7;22534:16;22542:7;22534;:16::i;:::-;22529:64;;22559:34;;;;;;;;;;;;;;22529:64;22613:15;:24;22629:7;22613:24;;;;;;;;;;;;;;;;;;;;;22606:31;;22441:204;;;:::o;21989:386::-;22062:13;22078:16;22086:7;22078;:16::i;:::-;22062:32;;22134:5;22111:28;;:19;:17;:19::i;:::-;:28;;;22107:175;;22159:44;22176:5;22183:19;:17;:19::i;:::-;22159:16;:44::i;:::-;22154:128;;22231:35;;;;;;;;;;;;;;22154:128;22107:175;22321:2;22294:15;:24;22310:7;22294:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22359:7;22355:2;22339:28;;22348:5;22339:28;;;;;;;;;;;;22051:324;21989:386;;:::o;45710:491::-;45823:6;45272:42;45848:29;;:10;:29;;;45840:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45214:9;45925:21;:39;;45917:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;46034:36;46041:20;46063:6;46034;:36::i;:::-;46079:29;46087:20;46079:7;:29::i;:::-;46133:60;46119:75;;45710:491;;;;;;:::o;13902:315::-;13955:7;14183:15;:13;:15::i;:::-;14168:12;;14152:13;;:28;:46;14145:53;;13902:315;:::o;46633:259::-;46749:8;46735:22;;:10;:22;;;46727:31;;;;;;46768:12;45102:42;46786:12;;46806:21;46786:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46767:65;;;46850:7;46841:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;46667:225;46633:259::o;31706:2800::-;31840:27;31870;31889:7;31870:18;:27::i;:::-;31840:57;;31955:4;31914:45;;31930:19;31914:45;;;31910:86;;31968:28;;;;;;;;;;;;;;31910:86;32010:27;32039:23;32066:28;32086:7;32066:19;:28::i;:::-;32009:85;;;;32194:62;32213:15;32230:4;32236:19;:17;:19::i;:::-;32194:18;:62::i;:::-;32189:174;;32276:43;32293:4;32299:19;:17;:19::i;:::-;32276:16;:43::i;:::-;32271:92;;32328:35;;;;;;;;;;;;;;32271:92;32189:174;32394:1;32380:16;;:2;:16;;;32376:52;;;32405:23;;;;;;;;;;;;;;32376:52;32441:43;32463:4;32469:2;32473:7;32482:1;32441:21;:43::i;:::-;32577:15;32574:160;;;32717:1;32696:19;32689:30;32574:160;33112:18;:24;33131:4;33112:24;;;;;;;;;;;;;;;;33110:26;;;;;;;;;;;;33181:18;:22;33200:2;33181:22;;;;;;;;;;;;;;;;33179:24;;;;;;;;;;;33503:145;33540:2;33588:45;33603:4;33609:2;33613:19;33588:14;:45::i;:::-;11130:8;33561:72;33503:18;:145::i;:::-;33474:17;:26;33492:7;33474:26;;;;;;;;;;;:174;;;;33818:1;11130:8;33768:19;:46;:51;33764:626;;;33840:19;33872:1;33862:7;:11;33840:33;;34029:1;33995:17;:30;34013:11;33995:30;;;;;;;;;;;;:35;33991:384;;;34133:13;;34118:11;:28;34114:242;;34313:19;34280:17;:30;34298:11;34280:30;;;;;;;;;;;:52;;;;34114:242;33991:384;33821:569;33764:626;34437:7;34433:2;34418:27;;34427:4;34418:27;;;;;;;;;;;;34456:42;34477:4;34483:2;34487:7;34496:1;34456:20;:42::i;:::-;31829:2677;;;31706:2800;;;:::o;45321:73::-;45352:42;45321:73;:::o;45439:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23331:185::-;23469:39;23486:4;23492:2;23496:7;23469:39;;;;;;;;;;;;:16;:39::i;:::-;23331:185;;;:::o;45173:50::-;45214:9;45173:50;:::o;20284:144::-;20348:7;20391:27;20410:7;20391:18;:27::i;:::-;20368:52;;20284:144;;;:::o;15527:224::-;15591:7;15632:1;15615:19;;:5;:19;;;15611:60;;;15643:28;;;;;;;;;;;;;;15611:60;10082:13;15689:18;:25;15708:5;15689:25;;;;;;;;;;;;;;;;:54;15682:61;;15527:224;;;:::o;45068:76::-;45102:42;45068:76;:::o;20664:104::-;20720:13;20753:7;20746:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20664:104;:::o;22717:308::-;22828:19;:17;:19::i;:::-;22816:31;;:8;:31;;;22812:61;;;22856:17;;;;;;;;;;;;;;22812:61;22938:8;22886:18;:39;22905:19;:17;:19::i;:::-;22886:39;;;;;;;;;;;;;;;:49;22926:8;22886:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;22998:8;22962:55;;22977:19;:17;:19::i;:::-;22962:55;;;23008:8;22962:55;;;;;;:::i;:::-;;;;;;;;22717:308;;:::o;45229:86::-;45272:42;45229:86;:::o;23587:399::-;23754:31;23767:4;23773:2;23777:7;23754:12;:31::i;:::-;23818:1;23800:2;:14;;;:19;23796:183;;23839:56;23870:4;23876:2;23880:7;23889:5;23839:30;:56::i;:::-;23834:145;;23923:40;;;;;;;;;;;;;;23834:145;23796:183;23587:399;;;;:::o;47085:905::-;47150:13;47179:16;47187:7;47179;:16::i;:::-;47174:59;;47204:29;;;;;;;;;;;;;;47174:59;47242:20;47265:13;47288:1;47279:7;:10;;;;:::i;:::-;47265:25;;;;;;;;:::i;:::-;;;;;;;;;;47242:48;;47301:17;47321:544;47489:18;47499:7;47489:9;:18::i;:::-;47611:23;47621:12;47611:9;:23::i;:::-;47390:439;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47321:13;:544::i;:::-;47301:564;;47876:20;47956:3;47906:54;;;;;;;;:::i;:::-;;;;;;;;;;;;;47876:85;;47977:6;47970:13;;;;;47085:905;;;:::o;45400:33::-;;;:::o;23096:164::-;23193:4;23217:18;:25;23236:5;23217:25;;;;;;;;;;;;;;;:35;23243:8;23217:35;;;;;;;;;;;;;;;;;;;;;;;;;23210:42;;23096:164;;;;:::o;24241:273::-;24298:4;24354:7;24335:15;:13;:15::i;:::-;:26;;:66;;;;;24388:13;;24378:7;:23;24335:66;:152;;;;;24486:1;10852:8;24439:17;:26;24457:7;24439:26;;;;;;;;;;;;:43;:48;24335:152;24315:172;;24241:273;;;:::o;42802:105::-;42862:7;42889:10;42882:17;;42802:105;:::o;46208:228::-;45272:42;46288:19;;;46316:4;45352:42;46329:20;46288:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46359:20;46369:6;46377:1;46359:9;:20::i;:::-;46389:13;46408:20;46389:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46208:228;;:::o;46443:183::-;46509:12;45102:42;46527:12;;45214:9;46527:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46508:58;;;46584:7;46575:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;46499:127;46443:183;:::o;48148:90::-;48205:7;48230:1;48223:8;;48148:90;:::o;17201:1129::-;17268:7;17288:12;17303:7;17288:22;;17371:4;17352:15;:13;:15::i;:::-;:23;17348:915;;17405:13;;17398:4;:20;17394:869;;;17443:14;17460:17;:23;17478:4;17460:23;;;;;;;;;;;;17443:40;;17576:1;10852:8;17549:6;:23;:28;17545:699;;;18068:113;18085:1;18075:6;:11;18068:113;;;18128:17;:25;18146:6;;;;;;;18128:25;;;;;;;;;;;;18119:34;;18068:113;;;18214:6;18207:13;;;;;;17545:699;17420:843;17394:869;17348:915;18291:31;;;;;;;;;;;;;;17201:1129;;;;:::o;30042:652::-;30137:27;30166:23;30207:53;30263:15;30207:71;;30449:7;30443:4;30436:21;30484:22;30478:4;30471:36;30560:4;30554;30544:21;30521:44;;30656:19;30650:26;30631:45;;30387:300;30042:652;;;:::o;30807:645::-;30949:11;31111:15;31105:4;31101:26;31093:34;;31270:15;31259:9;31255:31;31242:44;;31417:15;31406:9;31403:30;31396:4;31385:9;31382:19;31379:55;31369:65;;30807:645;;;;;:::o;46899:179::-;47021:1;47007:16;;:4;:16;;;46998:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;46899:179;;;;:::o;39947:309::-;40082:7;40102:16;11253:3;40128:19;:40;;40102:67;;11253:3;40195:31;40206:4;40212:2;40216:9;40195:10;:31::i;:::-;40187:40;;:61;;40180:68;;;39947:309;;;;;:::o;19775:447::-;19855:14;20023:15;20016:5;20012:27;20003:36;;20197:5;20183:11;20159:22;20155:40;20152:51;20145:5;20142:62;20132:72;;19775:447;;;;:::o;42453:158::-;;;;;:::o;38457:716::-;38620:4;38666:2;38641:45;;;38687:19;:17;:19::i;:::-;38708:4;38714:7;38723:5;38641:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38637:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38941:1;38924:6;:13;:18;38920:235;;;38970:40;;;;;;;;;;;;;;38920:235;39113:6;39107:13;39098:6;39094:2;39090:15;39083:38;38637:529;38810:54;;;38800:64;;;:6;:64;;;;38793:71;;;38457:716;;;;;;:::o;43013:1960::-;43070:17;43489:3;43482:4;43476:11;43472:21;43465:28;;43580:3;43574:4;43567:17;43686:3;44142:5;44272:1;44267:3;44263:11;44256:18;;44409:2;44403:4;44399:13;44395:2;44391:22;44386:3;44378:36;44450:2;44444:4;44440:13;44432:21;;44034:697;44469:4;44034:697;;;44660:1;44655:3;44651:11;44644:18;;44711:2;44705:4;44701:13;44697:2;44693:22;44688:3;44680:36;44564:2;44558:4;44554:13;44546:21;;44034:697;;;44038:430;44770:3;44765;44761:13;44885:2;44880:3;44876:12;44869:19;;44948:6;44943:3;44936:19;43109:1857;;43013:1960;;;:::o;48509:1875::-;48567:13;48610:1;48595:4;:11;:16;48591:31;;;48613:9;;;;;;;;;;;;;;;;48591:31;48670:19;48692:5;;;;;;;;;;;;;;;;;48670:27;;48745:18;48791:1;48786;48772:4;:11;:15;;;;:::i;:::-;48771:21;;;;:::i;:::-;48766:1;:27;;;;:::i;:::-;48745:48;;48872:20;48919:2;48906:10;:15;;;;:::i;:::-;48895:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48872:50;;49011:10;49003:6;48996:26;49100:1;49093:5;49089:13;49153:4;49201;49195:11;49186:7;49182:25;49291:2;49283:6;49279:15;49358:744;49390:6;49381:7;49378:19;49358:744;;;49453:1;49444:7;49440:15;49429:26;;49519:7;49513:14;49645:4;49637:5;49633:2;49629:14;49625:25;49615:8;49611:40;49605:47;49600:3;49596:57;49585:9;49578:76;49696:1;49685:9;49681:17;49668:30;;49779:4;49771:5;49767:2;49763:14;49759:25;49749:8;49745:40;49739:47;49734:3;49730:57;49719:9;49712:76;49830:1;49819:9;49815:17;49802:30;;49912:4;49904:5;49901:1;49897:13;49893:24;49883:8;49879:39;49873:46;49868:3;49864:56;49853:9;49846:75;49963:1;49952:9;49948:17;49935:30;;50037:4;50030:5;50026:16;50016:8;50012:31;50006:38;50001:3;49997:48;49986:9;49979:67;50088:1;50077:9;50073:17;50060:30;;49414:688;49358:744;;;50169:1;50162:4;50156:11;50152:19;50187:1;50182:77;;;;50275:1;50270:75;;;;50145:200;;50182:77;50239:6;50234:3;50230:16;50226:1;50215:9;50211:17;50204:43;50182:77;;50270:75;50327:4;50322:3;50318:14;50314:1;50303:9;50299:17;50292:41;50145:200;;48942:1412;;;;50371:6;50364:13;;;;;48509:1875;;;;:::o;24598:104::-;24667:27;24677:2;24681:8;24667:27;;;;;;;;;;;;:9;:27::i;:::-;24598:104;;:::o;40832:147::-;40969:6;40832:147;;;;;:::o;25118:681::-;25241:19;25247:2;25251:8;25241:5;:19::i;:::-;25320:1;25302:2;:14;;;:19;25298:483;;25342:11;25356:13;;25342:27;;25388:13;25410:8;25404:3;:14;25388:30;;25437:233;25468:62;25507:1;25511:2;25515:7;;;;;;25524:5;25468:30;:62::i;:::-;25463:167;;25566:40;;;;;;;;;;;;;;25463:167;25665:3;25657:5;:11;25437:233;;25752:3;25735:13;;:20;25731:34;;25757:8;;;25731:34;25323:458;;25298:483;25118:681;;;:::o;26072:1529::-;26137:20;26160:13;;26137:36;;26202:1;26188:16;;:2;:16;;;26184:48;;;26213:19;;;;;;;;;;;;;;26184:48;26259:1;26247:8;:13;26243:44;;;26269:18;;;;;;;;;;;;;;26243:44;26300:61;26330:1;26334:2;26338:12;26352:8;26300:21;:61::i;:::-;26843:1;10219:2;26814:1;:25;;26813:31;26801:8;:44;26775:18;:22;26794:2;26775:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;27122:139;27159:2;27213:33;27236:1;27240:2;27244:1;27213:14;:33::i;:::-;27180:30;27201:8;27180:20;:30::i;:::-;:66;27122:18;:139::i;:::-;27088:17;:31;27106:12;27088:31;;;;;;;;;;;:173;;;;27278:15;27296:12;27278:30;;27323:11;27352:8;27337:12;:23;27323:37;;27375:101;27427:9;;;;;;27423:2;27402:35;;27419:1;27402:35;;;;;;;;;;;;27471:3;27461:7;:13;27375:101;;27508:3;27492:13;:19;;;;26549:974;;27533:60;27562:1;27566:2;27570:12;27584:8;27533:20;:60::i;:::-;26126:1475;26072:1529;;:::o;21605:322::-;21675:14;21906:1;21896:8;21893:15;21868:23;21864:45;21854:55;;21605:322;;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:115::-;6189:23;6206:5;6189:23;:::i;:::-;6184:3;6177:36;6104:115;;:::o;6225:360::-;6311:3;6339:38;6371:5;6339:38;:::i;:::-;6393:70;6456:6;6451:3;6393:70;:::i;:::-;6386:77;;6472:52;6517:6;6512:3;6505:4;6498:5;6494:16;6472:52;:::i;:::-;6549:29;6571:6;6549:29;:::i;:::-;6544:3;6540:39;6533:46;;6315:270;6225:360;;;;:::o;6591:163::-;6694:53;6741:5;6694:53;:::i;:::-;6689:3;6682:66;6591:163;;:::o;6760:364::-;6848:3;6876:39;6909:5;6876:39;:::i;:::-;6931:71;6995:6;6990:3;6931:71;:::i;:::-;6924:78;;7011:52;7056:6;7051:3;7044:4;7037:5;7033:16;7011:52;:::i;:::-;7088:29;7110:6;7088:29;:::i;:::-;7083:3;7079:39;7072:46;;6852:272;6760:364;;;;:::o;7130:377::-;7236:3;7264:39;7297:5;7264:39;:::i;:::-;7319:89;7401:6;7396:3;7319:89;:::i;:::-;7312:96;;7417:52;7462:6;7457:3;7450:4;7443:5;7439:16;7417:52;:::i;:::-;7494:6;7489:3;7485:16;7478:23;;7240:267;7130:377;;;;:::o;7513:404::-;7673:3;7694:86;7776:3;7771;7694:86;:::i;:::-;7687:93;;7789;7878:3;7789:93;:::i;:::-;7907:3;7902;7898:13;7891:20;;7513:404;;;:::o;7923:402::-;8083:3;8104:85;8186:2;8181:3;8104:85;:::i;:::-;8097:92;;8198:93;8287:3;8198:93;:::i;:::-;8316:2;8311:3;8307:12;8300:19;;7923:402;;;:::o;8331:::-;8491:3;8512:85;8594:2;8589:3;8512:85;:::i;:::-;8505:92;;8606:93;8695:3;8606:93;:::i;:::-;8724:2;8719:3;8715:12;8708:19;;8331:402;;;:::o;8739:366::-;8881:3;8902:67;8966:2;8961:3;8902:67;:::i;:::-;8895:74;;8978:93;9067:3;8978:93;:::i;:::-;9096:2;9091:3;9087:12;9080:19;;8739:366;;;:::o;9111:::-;9253:3;9274:67;9338:2;9333:3;9274:67;:::i;:::-;9267:74;;9350:93;9439:3;9350:93;:::i;:::-;9468:2;9463:3;9459:12;9452:19;;9111:366;;;:::o;9483:402::-;9643:3;9664:85;9746:2;9741:3;9664:85;:::i;:::-;9657:92;;9758:93;9847:3;9758:93;:::i;:::-;9876:2;9871:3;9867:12;9860:19;;9483:402;;;:::o;9891:398::-;10050:3;10071:83;10152:1;10147:3;10071:83;:::i;:::-;10064:90;;10163:93;10252:3;10163:93;:::i;:::-;10281:1;10276:3;10272:11;10265:18;;9891:398;;;:::o;10295:366::-;10437:3;10458:67;10522:2;10517:3;10458:67;:::i;:::-;10451:74;;10534:93;10623:3;10534:93;:::i;:::-;10652:2;10647:3;10643:12;10636:19;;10295:366;;;:::o;10667:::-;10809:3;10830:67;10894:2;10889:3;10830:67;:::i;:::-;10823:74;;10906:93;10995:3;10906:93;:::i;:::-;11024:2;11019:3;11015:12;11008:19;;10667:366;;;:::o;11039:118::-;11126:24;11144:5;11126:24;:::i;:::-;11121:3;11114:37;11039:118;;:::o;11163:1233::-;11646:3;11668:148;11812:3;11668:148;:::i;:::-;11661:155;;11833:95;11924:3;11915:6;11833:95;:::i;:::-;11826:102;;11945:148;12089:3;11945:148;:::i;:::-;11938:155;;12110:95;12201:3;12192:6;12110:95;:::i;:::-;12103:102;;12222:148;12366:3;12222:148;:::i;:::-;12215:155;;12387:3;12380:10;;11163:1233;;;;;:::o;12402:541::-;12635:3;12657:148;12801:3;12657:148;:::i;:::-;12650:155;;12822:95;12913:3;12904:6;12822:95;:::i;:::-;12815:102;;12934:3;12927:10;;12402:541;;;;:::o;12949:379::-;13133:3;13155:147;13298:3;13155:147;:::i;:::-;13148:154;;13319:3;13312:10;;12949:379;;;:::o;13334:222::-;13427:4;13465:2;13454:9;13450:18;13442:26;;13478:71;13546:1;13535:9;13531:17;13522:6;13478:71;:::i;:::-;13334:222;;;;:::o;13562:442::-;13711:4;13749:2;13738:9;13734:18;13726:26;;13762:71;13830:1;13819:9;13815:17;13806:6;13762:71;:::i;:::-;13843:72;13911:2;13900:9;13896:18;13887:6;13843:72;:::i;:::-;13925;13993:2;13982:9;13978:18;13969:6;13925:72;:::i;:::-;13562:442;;;;;;:::o;14010:640::-;14205:4;14243:3;14232:9;14228:19;14220:27;;14257:71;14325:1;14314:9;14310:17;14301:6;14257:71;:::i;:::-;14338:72;14406:2;14395:9;14391:18;14382:6;14338:72;:::i;:::-;14420;14488:2;14477:9;14473:18;14464:6;14420:72;:::i;:::-;14539:9;14533:4;14529:20;14524:2;14513:9;14509:18;14502:48;14567:76;14638:4;14629:6;14567:76;:::i;:::-;14559:84;;14010:640;;;;;;;:::o;14656:210::-;14743:4;14781:2;14770:9;14766:18;14758:26;;14794:65;14856:1;14845:9;14841:17;14832:6;14794:65;:::i;:::-;14656:210;;;;:::o;14872:218::-;14963:4;15001:2;14990:9;14986:18;14978:26;;15014:69;15080:1;15069:9;15065:17;15056:6;15014:69;:::i;:::-;14872:218;;;;:::o;15096:254::-;15205:4;15243:2;15232:9;15228:18;15220:26;;15256:87;15340:1;15329:9;15325:17;15316:6;15256:87;:::i;:::-;15096:254;;;;:::o;15356:313::-;15469:4;15507:2;15496:9;15492:18;15484:26;;15556:9;15550:4;15546:20;15542:1;15531:9;15527:17;15520:47;15584:78;15657:4;15648:6;15584:78;:::i;:::-;15576:86;;15356:313;;;;:::o;15675:419::-;15841:4;15879:2;15868:9;15864:18;15856:26;;15928:9;15922:4;15918:20;15914:1;15903:9;15899:17;15892:47;15956:131;16082:4;15956:131;:::i;:::-;15948:139;;15675:419;;;:::o;16100:::-;16266:4;16304:2;16293:9;16289:18;16281:26;;16353:9;16347:4;16343:20;16339:1;16328:9;16324:17;16317:47;16381:131;16507:4;16381:131;:::i;:::-;16373:139;;16100:419;;;:::o;16525:::-;16691:4;16729:2;16718:9;16714:18;16706:26;;16778:9;16772:4;16768:20;16764:1;16753:9;16749:17;16742:47;16806:131;16932:4;16806:131;:::i;:::-;16798:139;;16525:419;;;:::o;16950:::-;17116:4;17154:2;17143:9;17139:18;17131:26;;17203:9;17197:4;17193:20;17189:1;17178:9;17174:17;17167:47;17231:131;17357:4;17231:131;:::i;:::-;17223:139;;16950:419;;;:::o;17375:222::-;17468:4;17506:2;17495:9;17491:18;17483:26;;17519:71;17587:1;17576:9;17572:17;17563:6;17519:71;:::i;:::-;17375:222;;;;:::o;17603:129::-;17637:6;17664:20;;:::i;:::-;17654:30;;17693:33;17721:4;17713:6;17693:33;:::i;:::-;17603:129;;;:::o;17738:75::-;17771:6;17804:2;17798:9;17788:19;;17738:75;:::o;17819:307::-;17880:4;17970:18;17962:6;17959:30;17956:56;;;17992:18;;:::i;:::-;17956:56;18030:29;18052:6;18030:29;:::i;:::-;18022:37;;18114:4;18108;18104:15;18096:23;;17819:307;;;:::o;18132:98::-;18183:6;18217:5;18211:12;18201:22;;18132:98;;;:::o;18236:99::-;18288:6;18322:5;18316:12;18306:22;;18236:99;;;:::o;18341:168::-;18424:11;18458:6;18453:3;18446:19;18498:4;18493:3;18489:14;18474:29;;18341:168;;;;:::o;18515:147::-;18616:11;18653:3;18638:18;;18515:147;;;;:::o;18668:169::-;18752:11;18786:6;18781:3;18774:19;18826:4;18821:3;18817:14;18802:29;;18668:169;;;;:::o;18843:148::-;18945:11;18982:3;18967:18;;18843:148;;;;:::o;18997:305::-;19037:3;19056:20;19074:1;19056:20;:::i;:::-;19051:25;;19090:20;19108:1;19090:20;:::i;:::-;19085:25;;19244:1;19176:66;19172:74;19169:1;19166:81;19163:107;;;19250:18;;:::i;:::-;19163:107;19294:1;19291;19287:9;19280:16;;18997:305;;;;:::o;19308:185::-;19348:1;19365:20;19383:1;19365:20;:::i;:::-;19360:25;;19399:20;19417:1;19399:20;:::i;:::-;19394:25;;19438:1;19428:35;;19443:18;;:::i;:::-;19428:35;19485:1;19482;19478:9;19473:14;;19308:185;;;;:::o;19499:348::-;19539:7;19562:20;19580:1;19562:20;:::i;:::-;19557:25;;19596:20;19614:1;19596:20;:::i;:::-;19591:25;;19784:1;19716:66;19712:74;19709:1;19706:81;19701:1;19694:9;19687:17;19683:105;19680:131;;;19791:18;;:::i;:::-;19680:131;19839:1;19836;19832:9;19821:20;;19499:348;;;;:::o;19853:191::-;19893:4;19913:20;19931:1;19913:20;:::i;:::-;19908:25;;19947:20;19965:1;19947:20;:::i;:::-;19942:25;;19986:1;19983;19980:8;19977:34;;;19991:18;;:::i;:::-;19977:34;20036:1;20033;20029:9;20021:17;;19853:191;;;;:::o;20050:96::-;20087:7;20116:24;20134:5;20116:24;:::i;:::-;20105:35;;20050:96;;;:::o;20152:90::-;20186:7;20229:5;20222:13;20215:21;20204:32;;20152:90;;;:::o;20248:149::-;20284:7;20324:66;20317:5;20313:78;20302:89;;20248:149;;;:::o;20403:126::-;20440:7;20480:42;20473:5;20469:54;20458:65;;20403:126;;;:::o;20535:77::-;20572:7;20601:5;20590:16;;20535:77;;;:::o;20618:142::-;20684:9;20717:37;20748:5;20717:37;:::i;:::-;20704:50;;20618:142;;;:::o;20766:126::-;20816:9;20849:37;20880:5;20849:37;:::i;:::-;20836:50;;20766:126;;;:::o;20898:113::-;20948:9;20981:24;20999:5;20981:24;:::i;:::-;20968:37;;20898:113;;;:::o;21017:154::-;21101:6;21096:3;21091;21078:30;21163:1;21154:6;21149:3;21145:16;21138:27;21017:154;;;:::o;21177:307::-;21245:1;21255:113;21269:6;21266:1;21263:13;21255:113;;;21354:1;21349:3;21345:11;21339:18;21335:1;21330:3;21326:11;21319:39;21291:2;21288:1;21284:10;21279:15;;21255:113;;;21386:6;21383:1;21380:13;21377:101;;;21466:1;21457:6;21452:3;21448:16;21441:27;21377:101;21226:258;21177:307;;;:::o;21490:320::-;21534:6;21571:1;21565:4;21561:12;21551:22;;21618:1;21612:4;21608:12;21639:18;21629:81;;21695:4;21687:6;21683:17;21673:27;;21629:81;21757:2;21749:6;21746:14;21726:18;21723:38;21720:84;;;21776:18;;:::i;:::-;21720:84;21541:269;21490:320;;;:::o;21816:281::-;21899:27;21921:4;21899:27;:::i;:::-;21891:6;21887:40;22029:6;22017:10;22014:22;21993:18;21981:10;21978:34;21975:62;21972:88;;;22040:18;;:::i;:::-;21972:88;22080:10;22076:2;22069:22;21859:238;21816:281;;:::o;22103:180::-;22151:77;22148:1;22141:88;22248:4;22245:1;22238:15;22272:4;22269:1;22262:15;22289:180;22337:77;22334:1;22327:88;22434:4;22431:1;22424:15;22458:4;22455:1;22448:15;22475:180;22523:77;22520:1;22513:88;22620:4;22617:1;22610:15;22644:4;22641:1;22634:15;22661:180;22709:77;22706:1;22699:88;22806:4;22803:1;22796:15;22830:4;22827:1;22820:15;22847:180;22895:77;22892:1;22885:88;22992:4;22989:1;22982:15;23016:4;23013:1;23006:15;23033:117;23142:1;23139;23132:12;23156:117;23265:1;23262;23255:12;23279:117;23388:1;23385;23378:12;23402:117;23511:1;23508;23501:12;23525:102;23566:6;23617:2;23613:7;23608:2;23601:5;23597:14;23593:28;23583:38;;23525:102;;;:::o;23633:555::-;23773:34;23769:1;23761:6;23757:14;23750:58;23842:34;23837:2;23829:6;23825:15;23818:59;23911:66;23906:2;23898:6;23894:15;23887:91;24012:66;24007:2;23999:6;23995:15;23988:91;24114:66;24108:3;24100:6;24096:16;24089:92;23633:555;:::o;24194:279::-;24334:66;24330:1;24322:6;24318:14;24311:90;24435:30;24430:2;24422:6;24418:15;24411:55;24194:279;:::o;24479:254::-;24619:66;24615:1;24607:6;24603:14;24596:90;24720:5;24715:2;24707:6;24703:15;24696:30;24479:254;:::o;24739:166::-;24879:18;24875:1;24867:6;24863:14;24856:42;24739:166;:::o;24911:173::-;25051:25;25047:1;25039:6;25035:14;25028:49;24911:173;:::o;25090:179::-;25230:31;25226:1;25218:6;25214:14;25207:55;25090:179;:::o;25275:114::-;;:::o;25395:241::-;25535:34;25531:1;25523:6;25519:14;25512:58;25604:24;25599:2;25591:6;25587:15;25580:49;25395:241;:::o;25642:176::-;25782:28;25778:1;25770:6;25766:14;25759:52;25642:176;:::o;25824:122::-;25897:24;25915:5;25897:24;:::i;:::-;25890:5;25887:35;25877:63;;25936:1;25933;25926:12;25877:63;25824:122;:::o;25952:116::-;26022:21;26037:5;26022:21;:::i;:::-;26015:5;26012:32;26002:60;;26058:1;26055;26048:12;26002:60;25952:116;:::o;26074:120::-;26146:23;26163:5;26146:23;:::i;:::-;26139:5;26136:34;26126:62;;26184:1;26181;26174:12;26126:62;26074:120;:::o;26200:122::-;26273:24;26291:5;26273:24;:::i;:::-;26266:5;26263:35;26253:63;;26312:1;26309;26302:12;26253:63;26200:122;:::o

Swarm Source

ipfs://0c15344ba34896f0311b18441163bddbee40a775d5b84d63efd639facd881030
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.