abstract contract ERC721Votes is ERC721, Votes {
    /**
     * @dev Adjusts votes when tokens are transferred.
     *
     * Emits a {Votes-DelegateVotesChanged} event.
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        _transferVotingUnits(from, to, 1);
        super._afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Returns the balance of `account`.
     */
    function _getVotingUnits(address account)
        internal
        virtual
        override
        returns (uint256)
    {
        return balanceOf(account);
    }
}
/**
 * @dev Extension of ERC721 to support voting and delegation as implemented by {Votes}, where each individual NFT counts
 * as 1 vote unit.
 *
 * Tokens do not count as votes until they are delegated, because votes must be tracked which incurs an additional cost
 * on every transfer. Token holders can either delegate to a trusted representative who will decide how to make use of
 * the votes in governance decisions, or they can delegate to themselves to be their own representative.
 *
 * _Available since v4.5._
 */
function _afterTokenTransfer(
    address from,
    address to,
    uint256 tokenId
) internal virtual override {
    _transferVotingUnits(from, to, 1);
    super._afterTokenTransfer(from, to, tokenId);
}

/**
 * @dev Adjusts votes when tokens are transferred.
 *
 * Emits a {Votes-DelegateVotesChanged} event.
 */