ETH Price: $3,836.30 (+5.51%)

Token

ERC-20: FUDibles Season 2 (FUDibles-S2)
 

Overview

Max Total Supply

292 FUDibles-S2

Holders

0

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Filtered by Token Holder
reeferboyz.eth
Balance
1 FUDibles-S2

Value
$0.00
0x87dd9f96fff4027599203d04d3bd5aeac8845716
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:
FUDiblesS2

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-14
*/

// File: filterer/IOperatorFilterRegistry.sol


pragma solidity ^0.8.17;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: filterer/OperatorFilterer.sol


pragma solidity ^0.8.17;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: filterer/DefaultOperatorFilterer.sol


pragma solidity ^0.8.17;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores 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 via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @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() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 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`,
     * 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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

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

    /**
     * @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](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // 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 `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID 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 => TokenApprovalRef) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual 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 virtual {
        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;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    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: [ERC165](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.
    }

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

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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 '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

    /**
     * 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 initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

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

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(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 `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns 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))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 virtual {
        uint256 startTokenId = _currentIndex;
        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 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _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 virtual {
        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 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 virtual {
        _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 Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @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) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(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++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        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 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 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;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @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 virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: FUDibles-S2.sol


pragma solidity 0.8.17;

/// @author Viv_0002






contract FUDiblesS2 is ERC721A, ERC2981, Ownable, DefaultOperatorFilterer{

    enum MintState {
        PAUSED,
        S1ROYALTY,
        ALLOWLIST,
        PUBLIC,
        ENDED
    }
    
    MintState public state = MintState.PAUSED;

    uint256 mintcost = 0.03 ether;
    uint256 public maxSupply = 801;
    bytes32 public whitelistMerkleRoot;
    string public tokenUriBase = "http://metadata.mintfud.com:3333/season2/";
    mapping(address => bool) public freeminted;
    uint256[] public round1tokens = new uint256[](400);
    uint256[] public round2tokens = new uint256[](150);
    uint256[] public round3tokens = new uint256[](75);
    uint256[] public round4tokens = new uint256[](10);
    uint256 public winner;
    address public lotteryPicker = 0x7DE56813aF4D33555B44dd6C5A542cedb59B761E;
    uint256[] ids = new uint256[](150);
    uint256[] ids2 = new uint256[](75);
    uint256 public round = 0;

    constructor() ERC721A("FUDibles Season 2", "FUDibles-S2") {
             _setDefaultRoyalty(owner(), 690);
    }

    // OVERRIDES
    function _startTokenId() internal view virtual override returns (uint256) {
        return 0;
    }

    // MODIFIERS
    modifier mintCompliance(uint256 _mintAmount, uint256 _freemints) {
        require(
            _mintAmount > 0,"Invalid mint amount");
        
        require(
            totalSupply() + _mintAmount <= maxSupply,
            "Max supply exceeded"
        );
        _;
    }

    modifier authz(){
        require(msg.sender == owner() || msg.sender == lotteryPicker, "Not authorized");
        _;
    }

    // MERKLE TREE
    function _verify(bytes32 leaf, bytes32[] memory proof)
        internal
        view
        returns (bool)
    {
        return MerkleProof.verify(proof, whitelistMerkleRoot, leaf);
    }

    function _leaf(address account, uint256 freemints, uint256 maxMint, uint256 level)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(bytes.concat(keccak256(abi.encode(account, freemints, maxMint, level))));
    }

    // MINTING FUNCTIONS

    function mint(uint256 amount) public payable mintCompliance(amount, 0) {
        require(state == MintState.PUBLIC, "Public mint is not available yet");
        require (amount <= 5, "Too many mints per transaction requested");
        require(msg.value >= mintcost * amount, "Insufficient funds");

        _safeMint(msg.sender, amount);
    }

    function ALMint(
        uint256 amount,
        uint256 freemints,
        uint256 maxMint,
        uint256 level,
        bytes32[] calldata proof
        ) public payable mintCompliance(amount, freemints) {
    if (level==1){
    require(state == MintState.S1ROYALTY || state == MintState.ALLOWLIST , "S1Royalty mint is not available right now");
    }
    else{
    require(state == MintState.ALLOWLIST , "AllowList mint is not available right now");
    require(freemints == 0, "AllowList cannot have freemints");
    }

    require(
            numberMinted(msg.sender) + amount <= (maxMint + freemints),
            "Exceeds allowed number of mints"
        );
    
    require(_verify(_leaf(msg.sender, freemints, maxMint, level), proof), "Invalid proof");

    if (freemints > 0){
        if (freeminted[msg.sender]!=true){
            require(msg.value >= mintcost * (amount - freemints), "Insufficient funds");
        }
        else {
            require(msg.value >= mintcost * amount, "Insufficient funds");
        }
    }
    else {
            require(msg.value >= mintcost * amount, "Insufficient funds");
    }

    if (freemints > 0 && msg.value < (amount * mintcost)) {
        require (freeminted[msg.sender]!=true, "Free mint already claimed");
        freeminted[msg.sender] = true;
    }

    _safeMint(msg.sender, amount);
    }

    function mintForAddress(uint256 amount, address _receiver)
        public
        onlyOwner
    {
        require(totalSupply() + amount <= maxSupply, "Max supply exceeded");
        _safeMint(_receiver, amount);
    }

    // GETTERS
    function numberMinted(address _minter) public view returns (uint256) {
        return _numberMinted(_minter);
    }

    function getcost() public view returns (uint256){
        return mintcost;
    }

    function tokenURI(
        uint256 tokenId
    ) public view override returns (string memory) {
        return string(abi.encodePacked(tokenUriBase, _toString(tokenId), ".json"));
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownerTokens = new uint256[](ownerTokenCount);
        uint256 ownerTokenIdx = 0;
        for (
            uint256 tokenIdx = _startTokenId();
            tokenIdx < totalSupply();
            tokenIdx++
        ) {
            if (ownerOf(tokenIdx) == _owner) {
                ownerTokens[ownerTokenIdx] = tokenIdx;
                ownerTokenIdx++;
            }
        }
        return ownerTokens;
    }

    // SETTERS
    function setState(MintState _state) public onlyOwner {
        state = _state;
    }

    function changeCost(uint256 _newcost) public onlyOwner {
        mintcost = _newcost;
    }

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    function setWhitelistMerkleRoot(bytes32 _whitelistMerkleRoot)
        external
        onlyOwner
    {
        whitelistMerkleRoot = _whitelistMerkleRoot;
    }

    function setTokenURI(string memory newUriBase) external onlyOwner {
        tokenUriBase = newUriBase;
    }

    function changeLotteryAddr(address _newLotAdd) external onlyOwner {
        lotteryPicker = _newLotAdd;
    }

    // RAFFLE

    function setR1tokens(uint256[] calldata _tokens) public authz {
        require(_tokens.length == round1tokens.length, "Bad Data");
        round1tokens = _tokens;
        round = 1;
    }

    function setR2tokens(uint256[] calldata _tokens) public authz {
        require(_tokens.length == round2tokens.length, "Bad Data");
        round2tokens = _tokens;
        round = 2;
    }

    function round3pick(string calldata _random) public authz{
        uint256 randomhash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _random)));
        uint256 id;
        for (uint i = 0; i < 75; i++){
            uint256 randomIndex = randomhash % ids.length;
            if (ids[randomIndex] != 0) {
            id = ids[randomIndex];
            } else {
            id = randomIndex;
            }

            if (ids[ids.length - 1] == 0) {
            ids[randomIndex] = ids.length - 1;
            } else {
            ids[randomIndex] = ids[ids.length - 1];
            }
            ids.pop();
            round3tokens[i] = round2tokens[id];
        round = 3;
    }
    }

    function round4pick(string calldata _random) public authz{
        uint256 randomhash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _random)));
        uint256 id;
        for (uint i = 0; i < 10; i++){
            uint256 randomIndex = randomhash % ids2.length;
            if (ids2[randomIndex] != 0) {
            id = ids2[randomIndex];
            } else {
            id = randomIndex;
            }

            if (ids2[ids2.length - 1] == 0) {
            ids2[randomIndex] = ids2.length - 1;
            } else {
            ids2[randomIndex] = ids2[ids2.length - 1];
            }
            ids2.pop();
            round4tokens[i] = round3tokens[id];
        round = 4;
    }
    }

    function round5pick(string calldata _random) public authz{
        uint256 maxStatValue = 10;
        uint256 randomHash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _random)));
        uint256 _pick = randomHash % maxStatValue;
        winner = round4tokens[_pick];
        round = 5;
    }

    function getR1tokens() public view returns(uint256[] memory){
        return round1tokens;
    }

    function getR2tokens() public view returns(uint256[] memory){
        return round2tokens;
    }

    function getR3tokens() public view returns(uint256[] memory){
        return round3tokens;
    }

    function getR4tokens() public view returns(uint256[] memory){
        return round4tokens;
    }

    // 2981

    function setDefaultRoyalty(address receiver, uint96 feeNumerator)
    external
    onlyOwner
    {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

   function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721A, ERC2981)
    returns (bool)
     {
        return super.supportsInterface(interfaceId);
    }   


   // OS

   function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        payable
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    // WITHDRAW

    function withdraw() public onlyOwner {
        uint256 contractBalance = address(this).balance;
        bool success = true;

        (success, ) = payable(owner()).call{
            value: contractBalance}("");
        require(success, "Transfer failed");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"freemints","type":"uint256"},{"internalType":"uint256","name":"maxMint","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"ALMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newcost","type":"uint256"}],"name":"changeCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newLotAdd","type":"address"}],"name":"changeLotteryAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeminted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR1tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR2tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR3tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR4tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getcost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"lotteryPicker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"round","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round1tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round2tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_random","type":"string"}],"name":"round3pick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round3tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_random","type":"string"}],"name":"round4pick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round4tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_random","type":"string"}],"name":"round5pick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokens","type":"uint256[]"}],"name":"setR1tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokens","type":"uint256[]"}],"name":"setR2tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FUDiblesS2.MintState","name":"_state","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUriBase","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum FUDiblesS2.MintState","name":"","type":"uint8"}],"stateMutability":"view","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":"tokenUriBase","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"winner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60146101000a81548160ff021916908360048111156200002d576200002c62000955565b5b0217905550666a94d74f430000600b55610321600c5560405180606001604052806029815260200162006a8760299139600e90816200006d919062000bfe565b5061019067ffffffffffffffff8111156200008d576200008c6200098f565b5b604051908082528060200260200182016040528015620000bc5781602001602082028036833780820191505090505b5060109080519060200190620000d4929190620008e4565b50609667ffffffffffffffff811115620000f357620000f26200098f565b5b604051908082528060200260200182016040528015620001225781602001602082028036833780820191505090505b50601190805190602001906200013a929190620008e4565b50604b67ffffffffffffffff8111156200015957620001586200098f565b5b604051908082528060200260200182016040528015620001885781602001602082028036833780820191505090505b5060129080519060200190620001a0929190620008e4565b50600a67ffffffffffffffff811115620001bf57620001be6200098f565b5b604051908082528060200260200182016040528015620001ee5781602001602082028036833780820191505090505b506013908051906020019062000206929190620008e4565b50737de56813af4d33555b44dd6c5a542cedb59b761e601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550609667ffffffffffffffff8111156200027a57620002796200098f565b5b604051908082528060200260200182016040528015620002a95781602001602082028036833780820191505090505b5060169080519060200190620002c1929190620008e4565b50604b67ffffffffffffffff811115620002e057620002df6200098f565b5b6040519080825280602002602001820160405280156200030f5781602001602082028036833780820191505090505b506017908051906020019062000327929190620008e4565b5060006018553480156200033a57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601181526020017f46554469626c657320536561736f6e20320000000000000000000000000000008152506040518060400160405280600b81526020017f46554469626c65732d53320000000000000000000000000000000000000000008152508160029081620003cf919062000bfe565b508060039081620003e1919062000bfe565b50620003f26200063a60201b60201c565b60008190555050506200041a6200040e6200063f60201b60201c565b6200064760201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200060f578015620004d5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200049b92919062000d2a565b600060405180830381600087803b158015620004b657600080fd5b505af1158015620004cb573d6000803e3d6000fd5b505050506200060e565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200058f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200055592919062000d2a565b600060405180830381600087803b1580156200057057600080fd5b505af115801562000585573d6000803e3d6000fd5b505050506200060d565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620005d8919062000d57565b600060405180830381600087803b158015620005f357600080fd5b505af115801562000608573d6000803e3d6000fd5b505050505b5b5b505062000634620006256200070d60201b60201c565b6102b26200073760201b60201c565b62000e8f565b600090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000747620008da60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620007a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200079f9062000dfb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200081a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008119062000e6d565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b82805482825590600052602060002090810192821562000923579160200282015b828111156200092257825182559160200191906001019062000905565b5b50905062000932919062000936565b5090565b5b808211156200095157600081600090555060010162000937565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a0657607f821691505b60208210810362000a1c5762000a1b620009be565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a47565b62000a92868362000a47565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000adf62000ad962000ad38462000aaa565b62000ab4565b62000aaa565b9050919050565b6000819050919050565b62000afb8362000abe565b62000b1362000b0a8262000ae6565b84845462000a54565b825550505050565b600090565b62000b2a62000b1b565b62000b3781848462000af0565b505050565b5b8181101562000b5f5762000b5360008262000b20565b60018101905062000b3d565b5050565b601f82111562000bae5762000b788162000a22565b62000b838462000a37565b8101602085101562000b93578190505b62000bab62000ba28562000a37565b83018262000b3c565b50505b505050565b600082821c905092915050565b600062000bd36000198460080262000bb3565b1980831691505092915050565b600062000bee838362000bc0565b9150826002028217905092915050565b62000c098262000984565b67ffffffffffffffff81111562000c255762000c246200098f565b5b62000c318254620009ed565b62000c3e82828562000b63565b600060209050601f83116001811462000c76576000841562000c61578287015190505b62000c6d858262000be0565b86555062000cdd565b601f19841662000c868662000a22565b60005b8281101562000cb05784890151825560018201915060208501945060208101905062000c89565b8683101562000cd0578489015162000ccc601f89168262000bc0565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000d128262000ce5565b9050919050565b62000d248162000d05565b82525050565b600060408201905062000d41600083018562000d19565b62000d50602083018462000d19565b9392505050565b600060208201905062000d6e600083018462000d19565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000de3602a8362000d74565b915062000df08262000d85565b604082019050919050565b6000602082019050818103600083015262000e168162000dd4565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000e5560198362000d74565b915062000e628262000e1d565b602082019050919050565b6000602082019050818103600083015262000e888162000e46565b9050919050565b615be88062000e9f6000396000f3fe6080604052600436106103355760003560e01c806385ef3e1c116101ab578063d5abeb01116100f7578063ef56267e11610095578063f2fde38b1161006f578063f2fde38b14610bed578063fc7e264a14610c16578063fd90002514610c53578063fe4ac90614610c7e57610335565b8063ef56267e14610b5c578063efbd73f414610b99578063f1a2096d14610bc257610335565b8063dfbf53ae116100d1578063dfbf53ae14610a8e578063e074753d14610ab9578063e0df5b6f14610af6578063e985e9c514610b1f57610335565b8063d5abeb01146109fd578063d6cbd04f14610a28578063dc33e68114610a5157610335565b8063a3723f4e11610164578063b88d4fde1161013e578063b88d4fde14610950578063bd32fb661461096c578063c19d93fb14610995578063c87b56dd146109c057610335565b8063a3723f4e146108e0578063a7f62d86146108fc578063aa98e0c61461092557610335565b806385ef3e1c146107dd5780638da5cb5b14610808578063930405871461083357806395d89b4114610870578063a0712d681461089b578063a22cb465146108b757610335565b806342842e0e116102855780636352211e116102235780636f8b44b0116101fd5780636f8b44b01461073557806370a082311461075e578063715018a61461079b5780638583ff24146107b257610335565b80636352211e146106a65780636af843b1146106e35780636dfd90ea1461070c57610335565b8063500a2d161161025f578063500a2d16146105ec578063540c2a971461062957806356de96db146106545780635cb85cd21461067d57610335565b806342842e0e1461056a578063438b6300146105865780634bbd7e3c146105c357610335565b8063146ca531116102f257806323b872dd116102cc57806323b872dd146104ce5780632a55205a146104ea5780633ccfd60b1461052857806341f434341461053f57610335565b8063146ca5311461044f57806318160ddd1461047a5780631b7b6aed146104a557610335565b806301ffc9a71461033a57806304634d8d1461037757806304bccf7a146103a057806306fdde03146103cb578063081812fc146103f6578063095ea7b314610433575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613df0565b610ca9565b60405161036e9190613e38565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613ef5565b610cbb565b005b3480156103ac57600080fd5b506103b5610cd1565b6040516103c29190613f44565b60405180910390f35b3480156103d757600080fd5b506103e0610cf7565b6040516103ed9190613fef565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190614047565b610d89565b60405161042a9190613f44565b60405180910390f35b61044d60048036038101906104489190614074565b610e08565b005b34801561045b57600080fd5b50610464610e21565b60405161047191906140c3565b60405180910390f35b34801561048657600080fd5b5061048f610e27565b60405161049c91906140c3565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190614143565b610e3e565b005b6104e860048036038101906104e39190614190565b611104565b005b3480156104f657600080fd5b50610511600480360381019061050c91906141e3565b611153565b60405161051f929190614223565b60405180910390f35b34801561053457600080fd5b5061053d61133d565b005b34801561054b57600080fd5b50610554611407565b60405161056191906142ab565b60405180910390f35b610584600480360381019061057f9190614190565b611419565b005b34801561059257600080fd5b506105ad60048036038101906105a891906142c6565b611468565b6040516105ba91906143b1565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e59190614143565b61156a565b005b3480156105f857600080fd5b50610613600480360381019061060e9190614047565b6116b5565b60405161062091906140c3565b60405180910390f35b34801561063557600080fd5b5061063e6116d9565b60405161064b9190613fef565b60405180910390f35b34801561066057600080fd5b5061067b600480360381019061067691906143f8565b611767565b005b34801561068957600080fd5b506106a4600480360381019061069f9190614047565b61179c565b005b3480156106b257600080fd5b506106cd60048036038101906106c89190614047565b6117ae565b6040516106da9190613f44565b60405180910390f35b3480156106ef57600080fd5b5061070a60048036038101906107059190614143565b6117c0565b005b34801561071857600080fd5b50610733600480360381019061072e919061447b565b611a86565b005b34801561074157600080fd5b5061075c60048036038101906107579190614047565b611bbb565b005b34801561076a57600080fd5b50610785600480360381019061078091906142c6565b611bcd565b60405161079291906140c3565b60405180910390f35b3480156107a757600080fd5b506107b0611c85565b005b3480156107be57600080fd5b506107c7611c99565b6040516107d491906140c3565b60405180910390f35b3480156107e957600080fd5b506107f2611ca3565b6040516107ff91906143b1565b60405180910390f35b34801561081457600080fd5b5061081d611cfb565b60405161082a9190613f44565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190614047565b611d25565b60405161086791906140c3565b60405180910390f35b34801561087c57600080fd5b50610885611d49565b6040516108929190613fef565b60405180910390f35b6108b560048036038101906108b09190614047565b611ddb565b005b3480156108c357600080fd5b506108de60048036038101906108d991906144f4565b611f90565b005b6108fa60048036038101906108f5919061458a565b611fa9565b005b34801561090857600080fd5b50610923600480360381019061091e919061447b565b61253f565b005b34801561093157600080fd5b5061093a612674565b604051610947919061463d565b60405180910390f35b61096a60048036038101906109659190614788565b61267a565b005b34801561097857600080fd5b50610993600480360381019061098e9190614837565b6126cb565b005b3480156109a157600080fd5b506109aa6126dd565b6040516109b791906148db565b60405180910390f35b3480156109cc57600080fd5b506109e760048036038101906109e29190614047565b6126f0565b6040516109f49190613fef565b60405180910390f35b348015610a0957600080fd5b50610a12612724565b604051610a1f91906140c3565b60405180910390f35b348015610a3457600080fd5b50610a4f6004803603810190610a4a91906142c6565b61272a565b005b348015610a5d57600080fd5b50610a786004803603810190610a7391906142c6565b612776565b604051610a8591906140c3565b60405180910390f35b348015610a9a57600080fd5b50610aa3612788565b604051610ab091906140c3565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb9190614047565b61278e565b604051610aed91906140c3565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b189190614997565b6127b2565b005b348015610b2b57600080fd5b50610b466004803603810190610b4191906149e0565b6127cd565b604051610b539190613e38565b60405180910390f35b348015610b6857600080fd5b50610b836004803603810190610b7e91906142c6565b612861565b604051610b909190613e38565b60405180910390f35b348015610ba557600080fd5b50610bc06004803603810190610bbb9190614a20565b612881565b005b348015610bce57600080fd5b50610bd76128ee565b604051610be491906143b1565b60405180910390f35b348015610bf957600080fd5b50610c146004803603810190610c0f91906142c6565b612946565b005b348015610c2257600080fd5b50610c3d6004803603810190610c389190614047565b6129c9565b604051610c4a91906140c3565b60405180910390f35b348015610c5f57600080fd5b50610c686129ed565b604051610c7591906143b1565b60405180910390f35b348015610c8a57600080fd5b50610c93612a45565b604051610ca091906143b1565b60405180910390f35b6000610cb482612a9d565b9050919050565b610cc3612b17565b610ccd8282612b95565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610d0690614a8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3290614a8f565b8015610d7f5780601f10610d5457610100808354040283529160200191610d7f565b820191906000526020600020905b815481529060010190602001808311610d6257829003601f168201915b5050505050905090565b6000610d9482612d2a565b610dca576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610e1281612d89565b610e1c8383612e86565b505050565b60185481565b6000610e31612fca565b6001546000540303905090565b610e46611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ecc5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0290614b0c565b60405180910390fd5b600042338484604051602001610f249493929190614bc5565b6040516020818303038152906040528051906020012060001c9050600080600090505b604b8110156110fd57600060168054905084610f639190614c2f565b9050600060168281548110610f7b57610f7a614c60565b5b906000526020600020015414610fb15760168181548110610f9f57610f9e614c60565b5b90600052602060002001549250610fb5565b8092505b600060166001601680549050610fcb9190614cbe565b81548110610fdc57610fdb614c60565b5b906000526020600020015403611025576001601680549050610ffe9190614cbe565b6016828154811061101257611011614c60565b5b9060005260206000200181905550611078565b601660016016805490506110399190614cbe565b8154811061104a57611049614c60565b5b90600052602060002001546016828154811061106957611068614c60565b5b90600052602060002001819055505b601680548061108a57611089614cf2565b5b60019003818190600052602060002001600090559055601183815481106110b4576110b3614c60565b5b9060005260206000200154601283815481106110d3576110d2614c60565b5b906000526020600020018190555060036018819055505080806110f590614d21565b915050610f47565b5050505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111425761114133612d89565b5b61114d848484612fcf565b50505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112e85760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112f26132f1565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661131e9190614d69565b6113289190614dab565b90508160000151819350935050509250929050565b611345612b17565b6000479050600060019050611358611cfb565b73ffffffffffffffffffffffffffffffffffffffff168260405161137b90614e0d565b60006040518083038185875af1925050503d80600081146113b8576040519150601f19603f3d011682016040523d82523d6000602084013e6113bd565b606091505b50508091505080611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa90614e6e565b60405180910390fd5b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114575761145633612d89565b5b6114628484846132fb565b50505050565b6060600061147583611bcd565b905060008167ffffffffffffffff8111156114935761149261465d565b5b6040519080825280602002602001820160405280156114c15781602001602082028036833780820191505090505b5090506000806114cf612fca565b90505b6114da610e27565b81101561155e578573ffffffffffffffffffffffffffffffffffffffff16611501826117ae565b73ffffffffffffffffffffffffffffffffffffffff160361154b57808383815181106115305761152f614c60565b5b602002602001018181525050818061154790614d21565b9250505b808061155690614d21565b9150506114d2565b50819350505050919050565b611572611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115f85750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e90614b0c565b60405180910390fd5b6000600a90506000423385856040516020016116569493929190614bc5565b6040516020818303038152906040528051906020012060001c90506000828261167f9190614c2f565b90506013818154811061169557611694614c60565b5b906000526020600020015460148190555060056018819055505050505050565b601181815481106116c557600080fd5b906000526020600020016000915090505481565b600e80546116e690614a8f565b80601f016020809104026020016040519081016040528092919081815260200182805461171290614a8f565b801561175f5780601f106117345761010080835404028352916020019161175f565b820191906000526020600020905b81548152906001019060200180831161174257829003601f168201915b505050505081565b61176f612b17565b80600a60146101000a81548160ff0219169083600481111561179457611793614864565b5b021790555050565b6117a4612b17565b80600b8190555050565b60006117b98261331b565b9050919050565b6117c8611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061184e5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490614b0c565b60405180910390fd5b6000423384846040516020016118a69493929190614bc5565b6040516020818303038152906040528051906020012060001c9050600080600090505b600a811015611a7f576000601780549050846118e59190614c2f565b90506000601782815481106118fd576118fc614c60565b5b906000526020600020015414611933576017818154811061192157611920614c60565b5b90600052602060002001549250611937565b8092505b60006017600160178054905061194d9190614cbe565b8154811061195e5761195d614c60565b5b9060005260206000200154036119a75760016017805490506119809190614cbe565b6017828154811061199457611993614c60565b5b90600052602060002001819055506119fa565b601760016017805490506119bb9190614cbe565b815481106119cc576119cb614c60565b5b9060005260206000200154601782815481106119eb576119ea614c60565b5b90600052602060002001819055505b6017805480611a0c57611a0b614cf2565b5b6001900381819060005260206000200160009055905560128381548110611a3657611a35614c60565b5b906000526020600020015460138381548110611a5557611a54614c60565b5b90600052602060002001819055506004601881905550508080611a7790614d21565b9150506118c9565b5050505050565b611a8e611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b145750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a90614b0c565b60405180910390fd5b6010805490508282905014611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9490614eda565b60405180910390fd5b818160109190611bae929190613d1a565b5060016018819055505050565b611bc3612b17565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c34576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611c8d612b17565b611c9760006133e7565b565b6000600b54905090565b60606010805480602002602001604051908101604052809291908181526020018280548015611cf157602002820191906000526020600020905b815481526020019060010190808311611cdd575b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60128181548110611d3557600080fd5b906000526020600020016000915090505481565b606060038054611d5890614a8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8490614a8f565b8015611dd15780601f10611da657610100808354040283529160200191611dd1565b820191906000526020600020905b815481529060010190602001808311611db457829003601f168201915b5050505050905090565b806000808211611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1790614f46565b60405180910390fd5b600c5482611e2c610e27565b611e369190614f66565b1115611e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6e90614fe6565b60405180910390fd5b60036004811115611e8b57611e8a614864565b5b600a60149054906101000a900460ff166004811115611ead57611eac614864565b5b14611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee490615052565b60405180910390fd5b6005831115611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f28906150e4565b60405180910390fd5b82600b54611f3f9190614d69565b341015611f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7890615150565b60405180910390fd5b611f8b33846134ad565b505050565b81611f9a81612d89565b611fa483836134cb565b505050565b858560008211611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe590614f46565b60405180910390fd5b600c5482611ffa610e27565b6120049190614f66565b1115612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c90614fe6565b60405180910390fd5b60018503612106576001600481111561206157612060614864565b5b600a60149054906101000a900460ff16600481111561208357612082614864565b5b14806120c257506002600481111561209e5761209d614864565b5b600a60149054906101000a900460ff1660048111156120c0576120bf614864565b5b145b612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f8906151e2565b60405180910390fd5b6121c0565b6002600481111561211a57612119614864565b5b600a60149054906101000a900460ff16600481111561213c5761213b614864565b5b1461217c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217390615274565b60405180910390fd5b600087146121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b6906152e0565b60405180910390fd5b5b86866121cc9190614f66565b886121d633612776565b6121e09190614f66565b1115612221576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122189061534c565b60405180910390fd5b612277612230338989896135d6565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050613635565b6122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad906153b8565b60405180910390fd5b60008711156123cd5760011515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146123775786886123239190614cbe565b600b546123309190614d69565b341015612372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236990615150565b60405180910390fd5b6123c8565b87600b546123859190614d69565b3410156123c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123be90615150565b60405180910390fd5b5b61241e565b87600b546123db9190614d69565b34101561241d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241490615150565b60405180910390fd5b5b60008711801561243a5750600b54886124379190614d69565b34105b1561252b5760011515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036124d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c990615424565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61253533896134ad565b5050505050505050565b612547611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125cd5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61260c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260390614b0c565b60405180910390fd5b6011805490508282905014612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d90614eda565b60405180910390fd5b818160119190612667929190613d1a565b5060026018819055505050565b600d5481565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126b8576126b733612d89565b5b6126c48585858561364c565b5050505050565b6126d3612b17565b80600d8190555050565b600a60149054906101000a900460ff1681565b6060600e6126fd836136bf565b60405160200161270e929190615559565b6040516020818303038152906040529050919050565b600c5481565b612732612b17565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006127818261370f565b9050919050565b60145481565b6013818154811061279e57600080fd5b906000526020600020016000915090505481565b6127ba612b17565b80600e90816127c99190615715565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b612889612b17565b600c5482612895610e27565b61289f9190614f66565b11156128e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d790614fe6565b60405180910390fd5b6128ea81836134ad565b5050565b6060601380548060200260200160405190810160405280929190818152602001828054801561293c57602002820191906000526020600020905b815481526020019060010190808311612928575b5050505050905090565b61294e612b17565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b490615859565b60405180910390fd5b6129c6816133e7565b50565b601081815481106129d957600080fd5b906000526020600020016000915090505481565b60606012805480602002602001604051908101604052809291908181526020018280548015612a3b57602002820191906000526020600020905b815481526020019060010190808311612a27575b5050505050905090565b60606011805480602002602001604051908101604052809291908181526020018280548015612a9357602002820191906000526020600020905b815481526020019060010190808311612a7f575b5050505050905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b105750612b0f82613766565b5b9050919050565b612b1f6137d0565b73ffffffffffffffffffffffffffffffffffffffff16612b3d611cfb565b73ffffffffffffffffffffffffffffffffffffffff1614612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a906158c5565b60405180910390fd5b565b612b9d6132f1565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf290615957565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c61906159c3565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081612d35612fca565b11158015612d44575060005482105b8015612d82575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612e83576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612e009291906159e3565b602060405180830381865afa158015612e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e419190615a21565b612e8257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612e799190613f44565b60405180910390fd5b5b50565b6000612e91826117ae565b90508073ffffffffffffffffffffffffffffffffffffffff16612eb26137d8565b73ffffffffffffffffffffffffffffffffffffffff1614612f1557612ede81612ed96137d8565b6127cd565b612f14576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000612fda8261331b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613041576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061304d846137e0565b91509150613063818761305e6137d8565b613807565b6130af57613078866130736137d8565b6127cd565b6130ae576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613115576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613122868686600161384b565b801561312d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506131fb856131d7888887613851565b7c020000000000000000000000000000000000000000000000000000000017613879565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603613281576000600185019050600060046000838152602001908152602001600020540361327f57600054811461327e578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132e986868660016138a4565b505050505050565b6000612710905090565b6133168383836040518060200160405280600081525061267a565b505050565b6000808290508061332a612fca565b116133b0576000548110156133af5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036133ad575b600081036133a3576004600083600190039350838152602001908152602001600020549050613379565b80925050506133e2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6134c78282604051806020016040528060008152506138aa565b5050565b80600760006134d86137d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166135856137d8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135ca9190613e38565b60405180910390a35050565b6000848484846040516020016135ef9493929190615a4e565b604051602081830303815290604052805190602001206040516020016136159190615ab4565b604051602081830303815290604052805190602001209050949350505050565b600061364482600d5485613947565b905092915050565b613657848484611104565b60008373ffffffffffffffffffffffffffffffffffffffff163b146136b9576136828484848461395e565b6136b8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b6001156136fa57600184039350600a81066030018453600a81049050806136d8575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613868868684613aae565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6138b48383613ab7565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461394257600080549050600083820390505b6138f4600086838060010194508661395e565b61392a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106138e157816000541461393f57600080fd5b50505b505050565b6000826139548584613c72565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139846137d8565b8786866040518563ffffffff1660e01b81526004016139a69493929190615b24565b6020604051808303816000875af19250505080156139e257506040513d601f19601f820116820180604052508101906139df9190615b85565b60015b613a5b573d8060008114613a12576040519150601f19603f3d011682016040523d82523d6000602084013e613a17565b606091505b506000815103613a53576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203613af7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b04600084838561384b565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613b7b83613b6c6000866000613851565b613b7585613cc8565b17613879565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613c1c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613be1565b5060008203613c57576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613c6d60008483856138a4565b505050565b60008082905060005b8451811015613cbd57613ca882868381518110613c9b57613c9a614c60565b5b6020026020010151613cd8565b91508080613cb590614d21565b915050613c7b565b508091505092915050565b60006001821460e11b9050919050565b6000818310613cf057613ceb8284613d03565b613cfb565b613cfa8383613d03565b5b905092915050565b600082600052816020526040600020905092915050565b828054828255906000526020600020908101928215613d56579160200282015b82811115613d55578235825591602001919060010190613d3a565b5b509050613d639190613d67565b5090565b5b80821115613d80576000816000905550600101613d68565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dcd81613d98565b8114613dd857600080fd5b50565b600081359050613dea81613dc4565b92915050565b600060208284031215613e0657613e05613d8e565b5b6000613e1484828501613ddb565b91505092915050565b60008115159050919050565b613e3281613e1d565b82525050565b6000602082019050613e4d6000830184613e29565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e7e82613e53565b9050919050565b613e8e81613e73565b8114613e9957600080fd5b50565b600081359050613eab81613e85565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613ed281613eb1565b8114613edd57600080fd5b50565b600081359050613eef81613ec9565b92915050565b60008060408385031215613f0c57613f0b613d8e565b5b6000613f1a85828601613e9c565b9250506020613f2b85828601613ee0565b9150509250929050565b613f3e81613e73565b82525050565b6000602082019050613f596000830184613f35565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f99578082015181840152602081019050613f7e565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fc182613f5f565b613fcb8185613f6a565b9350613fdb818560208601613f7b565b613fe481613fa5565b840191505092915050565b600060208201905081810360008301526140098184613fb6565b905092915050565b6000819050919050565b61402481614011565b811461402f57600080fd5b50565b6000813590506140418161401b565b92915050565b60006020828403121561405d5761405c613d8e565b5b600061406b84828501614032565b91505092915050565b6000806040838503121561408b5761408a613d8e565b5b600061409985828601613e9c565b92505060206140aa85828601614032565b9150509250929050565b6140bd81614011565b82525050565b60006020820190506140d860008301846140b4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112614103576141026140de565b5b8235905067ffffffffffffffff8111156141205761411f6140e3565b5b60208301915083600182028301111561413c5761413b6140e8565b5b9250929050565b6000806020838503121561415a57614159613d8e565b5b600083013567ffffffffffffffff81111561417857614177613d93565b5b614184858286016140ed565b92509250509250929050565b6000806000606084860312156141a9576141a8613d8e565b5b60006141b786828701613e9c565b93505060206141c886828701613e9c565b92505060406141d986828701614032565b9150509250925092565b600080604083850312156141fa576141f9613d8e565b5b600061420885828601614032565b925050602061421985828601614032565b9150509250929050565b60006040820190506142386000830185613f35565b61424560208301846140b4565b9392505050565b6000819050919050565b600061427161426c61426784613e53565b61424c565b613e53565b9050919050565b600061428382614256565b9050919050565b600061429582614278565b9050919050565b6142a58161428a565b82525050565b60006020820190506142c0600083018461429c565b92915050565b6000602082840312156142dc576142db613d8e565b5b60006142ea84828501613e9c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61432881614011565b82525050565b600061433a838361431f565b60208301905092915050565b6000602082019050919050565b600061435e826142f3565b61436881856142fe565b93506143738361430f565b8060005b838110156143a457815161438b888261432e565b975061439683614346565b925050600181019050614377565b5085935050505092915050565b600060208201905081810360008301526143cb8184614353565b905092915050565b600581106143e057600080fd5b50565b6000813590506143f2816143d3565b92915050565b60006020828403121561440e5761440d613d8e565b5b600061441c848285016143e3565b91505092915050565b60008083601f84011261443b5761443a6140de565b5b8235905067ffffffffffffffff811115614458576144576140e3565b5b602083019150836020820283011115614474576144736140e8565b5b9250929050565b6000806020838503121561449257614491613d8e565b5b600083013567ffffffffffffffff8111156144b0576144af613d93565b5b6144bc85828601614425565b92509250509250929050565b6144d181613e1d565b81146144dc57600080fd5b50565b6000813590506144ee816144c8565b92915050565b6000806040838503121561450b5761450a613d8e565b5b600061451985828601613e9c565b925050602061452a858286016144df565b9150509250929050565b60008083601f84011261454a576145496140de565b5b8235905067ffffffffffffffff811115614567576145666140e3565b5b602083019150836020820283011115614583576145826140e8565b5b9250929050565b60008060008060008060a087890312156145a7576145a6613d8e565b5b60006145b589828a01614032565b96505060206145c689828a01614032565b95505060406145d789828a01614032565b94505060606145e889828a01614032565b935050608087013567ffffffffffffffff81111561460957614608613d93565b5b61461589828a01614534565b92509250509295509295509295565b6000819050919050565b61463781614624565b82525050565b6000602082019050614652600083018461462e565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61469582613fa5565b810181811067ffffffffffffffff821117156146b4576146b361465d565b5b80604052505050565b60006146c7613d84565b90506146d3828261468c565b919050565b600067ffffffffffffffff8211156146f3576146f261465d565b5b6146fc82613fa5565b9050602081019050919050565b82818337600083830152505050565b600061472b614726846146d8565b6146bd565b90508281526020810184848401111561474757614746614658565b5b614752848285614709565b509392505050565b600082601f83011261476f5761476e6140de565b5b813561477f848260208601614718565b91505092915050565b600080600080608085870312156147a2576147a1613d8e565b5b60006147b087828801613e9c565b94505060206147c187828801613e9c565b93505060406147d287828801614032565b925050606085013567ffffffffffffffff8111156147f3576147f2613d93565b5b6147ff8782880161475a565b91505092959194509250565b61481481614624565b811461481f57600080fd5b50565b6000813590506148318161480b565b92915050565b60006020828403121561484d5761484c613d8e565b5b600061485b84828501614822565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581106148a4576148a3614864565b5b50565b60008190506148b582614893565b919050565b60006148c5826148a7565b9050919050565b6148d5816148ba565b82525050565b60006020820190506148f060008301846148cc565b92915050565b600067ffffffffffffffff8211156149115761491061465d565b5b61491a82613fa5565b9050602081019050919050565b600061493a614935846148f6565b6146bd565b90508281526020810184848401111561495657614955614658565b5b614961848285614709565b509392505050565b600082601f83011261497e5761497d6140de565b5b813561498e848260208601614927565b91505092915050565b6000602082840312156149ad576149ac613d8e565b5b600082013567ffffffffffffffff8111156149cb576149ca613d93565b5b6149d784828501614969565b91505092915050565b600080604083850312156149f7576149f6613d8e565b5b6000614a0585828601613e9c565b9250506020614a1685828601613e9c565b9150509250929050565b60008060408385031215614a3757614a36613d8e565b5b6000614a4585828601614032565b9250506020614a5685828601613e9c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614aa757607f821691505b602082108103614aba57614ab9614a60565b5b50919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614af6600e83613f6a565b9150614b0182614ac0565b602082019050919050565b60006020820190508181036000830152614b2581614ae9565b9050919050565b6000819050919050565b614b47614b4282614011565b614b2c565b82525050565b60008160601b9050919050565b6000614b6582614b4d565b9050919050565b6000614b7782614b5a565b9050919050565b614b8f614b8a82613e73565b614b6c565b82525050565b600081905092915050565b6000614bac8385614b95565b9350614bb9838584614709565b82840190509392505050565b6000614bd18287614b36565b602082019150614be18286614b7e565b601482019150614bf2828486614ba0565b915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c3a82614011565b9150614c4583614011565b925082614c5557614c54614c00565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cc982614011565b9150614cd483614011565b9250828203905081811115614cec57614ceb614c8f565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000614d2c82614011565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d5e57614d5d614c8f565b5b600182019050919050565b6000614d7482614011565b9150614d7f83614011565b9250828202614d8d81614011565b91508282048414831517614da457614da3614c8f565b5b5092915050565b6000614db682614011565b9150614dc183614011565b925082614dd157614dd0614c00565b5b828204905092915050565b600081905092915050565b50565b6000614df7600083614ddc565b9150614e0282614de7565b600082019050919050565b6000614e1882614dea565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614e58600f83613f6a565b9150614e6382614e22565b602082019050919050565b60006020820190508181036000830152614e8781614e4b565b9050919050565b7f4261642044617461000000000000000000000000000000000000000000000000600082015250565b6000614ec4600883613f6a565b9150614ecf82614e8e565b602082019050919050565b60006020820190508181036000830152614ef381614eb7565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b6000614f30601383613f6a565b9150614f3b82614efa565b602082019050919050565b60006020820190508181036000830152614f5f81614f23565b9050919050565b6000614f7182614011565b9150614f7c83614011565b9250828201905080821115614f9457614f93614c8f565b5b92915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000614fd0601383613f6a565b9150614fdb82614f9a565b602082019050919050565b60006020820190508181036000830152614fff81614fc3565b9050919050565b7f5075626c6963206d696e74206973206e6f7420617661696c61626c6520796574600082015250565b600061503c602083613f6a565b915061504782615006565b602082019050919050565b6000602082019050818103600083015261506b8161502f565b9050919050565b7f546f6f206d616e79206d696e747320706572207472616e73616374696f6e207260008201527f6571756573746564000000000000000000000000000000000000000000000000602082015250565b60006150ce602883613f6a565b91506150d982615072565b604082019050919050565b600060208201905081810360008301526150fd816150c1565b9050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061513a601283613f6a565b915061514582615104565b602082019050919050565b600060208201905081810360008301526151698161512d565b9050919050565b7f5331526f79616c7479206d696e74206973206e6f7420617661696c61626c652060008201527f7269676874206e6f770000000000000000000000000000000000000000000000602082015250565b60006151cc602983613f6a565b91506151d782615170565b604082019050919050565b600060208201905081810360008301526151fb816151bf565b9050919050565b7f416c6c6f774c697374206d696e74206973206e6f7420617661696c61626c652060008201527f7269676874206e6f770000000000000000000000000000000000000000000000602082015250565b600061525e602983613f6a565b915061526982615202565b604082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b7f416c6c6f774c6973742063616e6e6f74206861766520667265656d696e747300600082015250565b60006152ca601f83613f6a565b91506152d582615294565b602082019050919050565b600060208201905081810360008301526152f9816152bd565b9050919050565b7f4578636565647320616c6c6f776564206e756d626572206f66206d696e747300600082015250565b6000615336601f83613f6a565b915061534182615300565b602082019050919050565b6000602082019050818103600083015261536581615329565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b60006153a2600d83613f6a565b91506153ad8261536c565b602082019050919050565b600060208201905081810360008301526153d181615395565b9050919050565b7f46726565206d696e7420616c726561647920636c61696d656400000000000000600082015250565b600061540e601983613f6a565b9150615419826153d8565b602082019050919050565b6000602082019050818103600083015261543d81615401565b9050919050565b60008190508160005260206000209050919050565b6000815461546681614a8f565b6154708186614b95565b9450600182166000811461548b57600181146154a0576154d3565b60ff19831686528115158202860193506154d3565b6154a985615444565b60005b838110156154cb578154818901526001820191506020810190506154ac565b838801955050505b50505092915050565b60006154e782613f5f565b6154f18185614b95565b9350615501818560208601613f7b565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000615543600583614b95565b915061554e8261550d565b600582019050919050565b60006155658285615459565b915061557182846154dc565b915061557c82615536565b91508190509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026155d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615598565b6155df8683615598565b95508019841693508086168417925050509392505050565b600061561261560d61560884614011565b61424c565b614011565b9050919050565b6000819050919050565b61562c836155f7565b61564061563882615619565b8484546155a5565b825550505050565b600090565b615655615648565b615660818484615623565b505050565b5b818110156156845761567960008261564d565b600181019050615666565b5050565b601f8211156156c95761569a81615444565b6156a384615588565b810160208510156156b2578190505b6156c66156be85615588565b830182615665565b50505b505050565b600082821c905092915050565b60006156ec600019846008026156ce565b1980831691505092915050565b600061570583836156db565b9150826002028217905092915050565b61571e82613f5f565b67ffffffffffffffff8111156157375761573661465d565b5b6157418254614a8f565b61574c828285615688565b600060209050601f83116001811461577f576000841561576d578287015190505b61577785826156f9565b8655506157df565b601f19841661578d86615444565b60005b828110156157b557848901518255600182019150602085019450602081019050615790565b868310156157d257848901516157ce601f8916826156db565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615843602683613f6a565b915061584e826157e7565b604082019050919050565b6000602082019050818103600083015261587281615836565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006158af602083613f6a565b91506158ba82615879565b602082019050919050565b600060208201905081810360008301526158de816158a2565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615941602a83613f6a565b915061594c826158e5565b604082019050919050565b6000602082019050818103600083015261597081615934565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006159ad601983613f6a565b91506159b882615977565b602082019050919050565b600060208201905081810360008301526159dc816159a0565b9050919050565b60006040820190506159f86000830185613f35565b615a056020830184613f35565b9392505050565b600081519050615a1b816144c8565b92915050565b600060208284031215615a3757615a36613d8e565b5b6000615a4584828501615a0c565b91505092915050565b6000608082019050615a636000830187613f35565b615a7060208301866140b4565b615a7d60408301856140b4565b615a8a60608301846140b4565b95945050505050565b6000819050919050565b615aae615aa982614624565b615a93565b82525050565b6000615ac08284615a9d565b60208201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000615af682615acf565b615b008185615ada565b9350615b10818560208601613f7b565b615b1981613fa5565b840191505092915050565b6000608082019050615b396000830187613f35565b615b466020830186613f35565b615b5360408301856140b4565b8181036060830152615b658184615aeb565b905095945050505050565b600081519050615b7f81613dc4565b92915050565b600060208284031215615b9b57615b9a613d8e565b5b6000615ba984828501615b70565b9150509291505056fea26469706673582212207627f2d495de670af6ed7477494856ac6464217445e4481698068227bfc1e5fe64736f6c63430008110033687474703a2f2f6d657461646174612e6d696e746675642e636f6d3a333333332f736561736f6e322f

Deployed Bytecode

0x6080604052600436106103355760003560e01c806385ef3e1c116101ab578063d5abeb01116100f7578063ef56267e11610095578063f2fde38b1161006f578063f2fde38b14610bed578063fc7e264a14610c16578063fd90002514610c53578063fe4ac90614610c7e57610335565b8063ef56267e14610b5c578063efbd73f414610b99578063f1a2096d14610bc257610335565b8063dfbf53ae116100d1578063dfbf53ae14610a8e578063e074753d14610ab9578063e0df5b6f14610af6578063e985e9c514610b1f57610335565b8063d5abeb01146109fd578063d6cbd04f14610a28578063dc33e68114610a5157610335565b8063a3723f4e11610164578063b88d4fde1161013e578063b88d4fde14610950578063bd32fb661461096c578063c19d93fb14610995578063c87b56dd146109c057610335565b8063a3723f4e146108e0578063a7f62d86146108fc578063aa98e0c61461092557610335565b806385ef3e1c146107dd5780638da5cb5b14610808578063930405871461083357806395d89b4114610870578063a0712d681461089b578063a22cb465146108b757610335565b806342842e0e116102855780636352211e116102235780636f8b44b0116101fd5780636f8b44b01461073557806370a082311461075e578063715018a61461079b5780638583ff24146107b257610335565b80636352211e146106a65780636af843b1146106e35780636dfd90ea1461070c57610335565b8063500a2d161161025f578063500a2d16146105ec578063540c2a971461062957806356de96db146106545780635cb85cd21461067d57610335565b806342842e0e1461056a578063438b6300146105865780634bbd7e3c146105c357610335565b8063146ca531116102f257806323b872dd116102cc57806323b872dd146104ce5780632a55205a146104ea5780633ccfd60b1461052857806341f434341461053f57610335565b8063146ca5311461044f57806318160ddd1461047a5780631b7b6aed146104a557610335565b806301ffc9a71461033a57806304634d8d1461037757806304bccf7a146103a057806306fdde03146103cb578063081812fc146103f6578063095ea7b314610433575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613df0565b610ca9565b60405161036e9190613e38565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613ef5565b610cbb565b005b3480156103ac57600080fd5b506103b5610cd1565b6040516103c29190613f44565b60405180910390f35b3480156103d757600080fd5b506103e0610cf7565b6040516103ed9190613fef565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190614047565b610d89565b60405161042a9190613f44565b60405180910390f35b61044d60048036038101906104489190614074565b610e08565b005b34801561045b57600080fd5b50610464610e21565b60405161047191906140c3565b60405180910390f35b34801561048657600080fd5b5061048f610e27565b60405161049c91906140c3565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190614143565b610e3e565b005b6104e860048036038101906104e39190614190565b611104565b005b3480156104f657600080fd5b50610511600480360381019061050c91906141e3565b611153565b60405161051f929190614223565b60405180910390f35b34801561053457600080fd5b5061053d61133d565b005b34801561054b57600080fd5b50610554611407565b60405161056191906142ab565b60405180910390f35b610584600480360381019061057f9190614190565b611419565b005b34801561059257600080fd5b506105ad60048036038101906105a891906142c6565b611468565b6040516105ba91906143b1565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e59190614143565b61156a565b005b3480156105f857600080fd5b50610613600480360381019061060e9190614047565b6116b5565b60405161062091906140c3565b60405180910390f35b34801561063557600080fd5b5061063e6116d9565b60405161064b9190613fef565b60405180910390f35b34801561066057600080fd5b5061067b600480360381019061067691906143f8565b611767565b005b34801561068957600080fd5b506106a4600480360381019061069f9190614047565b61179c565b005b3480156106b257600080fd5b506106cd60048036038101906106c89190614047565b6117ae565b6040516106da9190613f44565b60405180910390f35b3480156106ef57600080fd5b5061070a60048036038101906107059190614143565b6117c0565b005b34801561071857600080fd5b50610733600480360381019061072e919061447b565b611a86565b005b34801561074157600080fd5b5061075c60048036038101906107579190614047565b611bbb565b005b34801561076a57600080fd5b50610785600480360381019061078091906142c6565b611bcd565b60405161079291906140c3565b60405180910390f35b3480156107a757600080fd5b506107b0611c85565b005b3480156107be57600080fd5b506107c7611c99565b6040516107d491906140c3565b60405180910390f35b3480156107e957600080fd5b506107f2611ca3565b6040516107ff91906143b1565b60405180910390f35b34801561081457600080fd5b5061081d611cfb565b60405161082a9190613f44565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190614047565b611d25565b60405161086791906140c3565b60405180910390f35b34801561087c57600080fd5b50610885611d49565b6040516108929190613fef565b60405180910390f35b6108b560048036038101906108b09190614047565b611ddb565b005b3480156108c357600080fd5b506108de60048036038101906108d991906144f4565b611f90565b005b6108fa60048036038101906108f5919061458a565b611fa9565b005b34801561090857600080fd5b50610923600480360381019061091e919061447b565b61253f565b005b34801561093157600080fd5b5061093a612674565b604051610947919061463d565b60405180910390f35b61096a60048036038101906109659190614788565b61267a565b005b34801561097857600080fd5b50610993600480360381019061098e9190614837565b6126cb565b005b3480156109a157600080fd5b506109aa6126dd565b6040516109b791906148db565b60405180910390f35b3480156109cc57600080fd5b506109e760048036038101906109e29190614047565b6126f0565b6040516109f49190613fef565b60405180910390f35b348015610a0957600080fd5b50610a12612724565b604051610a1f91906140c3565b60405180910390f35b348015610a3457600080fd5b50610a4f6004803603810190610a4a91906142c6565b61272a565b005b348015610a5d57600080fd5b50610a786004803603810190610a7391906142c6565b612776565b604051610a8591906140c3565b60405180910390f35b348015610a9a57600080fd5b50610aa3612788565b604051610ab091906140c3565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb9190614047565b61278e565b604051610aed91906140c3565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b189190614997565b6127b2565b005b348015610b2b57600080fd5b50610b466004803603810190610b4191906149e0565b6127cd565b604051610b539190613e38565b60405180910390f35b348015610b6857600080fd5b50610b836004803603810190610b7e91906142c6565b612861565b604051610b909190613e38565b60405180910390f35b348015610ba557600080fd5b50610bc06004803603810190610bbb9190614a20565b612881565b005b348015610bce57600080fd5b50610bd76128ee565b604051610be491906143b1565b60405180910390f35b348015610bf957600080fd5b50610c146004803603810190610c0f91906142c6565b612946565b005b348015610c2257600080fd5b50610c3d6004803603810190610c389190614047565b6129c9565b604051610c4a91906140c3565b60405180910390f35b348015610c5f57600080fd5b50610c686129ed565b604051610c7591906143b1565b60405180910390f35b348015610c8a57600080fd5b50610c93612a45565b604051610ca091906143b1565b60405180910390f35b6000610cb482612a9d565b9050919050565b610cc3612b17565b610ccd8282612b95565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610d0690614a8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3290614a8f565b8015610d7f5780601f10610d5457610100808354040283529160200191610d7f565b820191906000526020600020905b815481529060010190602001808311610d6257829003601f168201915b5050505050905090565b6000610d9482612d2a565b610dca576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610e1281612d89565b610e1c8383612e86565b505050565b60185481565b6000610e31612fca565b6001546000540303905090565b610e46611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ecc5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0290614b0c565b60405180910390fd5b600042338484604051602001610f249493929190614bc5565b6040516020818303038152906040528051906020012060001c9050600080600090505b604b8110156110fd57600060168054905084610f639190614c2f565b9050600060168281548110610f7b57610f7a614c60565b5b906000526020600020015414610fb15760168181548110610f9f57610f9e614c60565b5b90600052602060002001549250610fb5565b8092505b600060166001601680549050610fcb9190614cbe565b81548110610fdc57610fdb614c60565b5b906000526020600020015403611025576001601680549050610ffe9190614cbe565b6016828154811061101257611011614c60565b5b9060005260206000200181905550611078565b601660016016805490506110399190614cbe565b8154811061104a57611049614c60565b5b90600052602060002001546016828154811061106957611068614c60565b5b90600052602060002001819055505b601680548061108a57611089614cf2565b5b60019003818190600052602060002001600090559055601183815481106110b4576110b3614c60565b5b9060005260206000200154601283815481106110d3576110d2614c60565b5b906000526020600020018190555060036018819055505080806110f590614d21565b915050610f47565b5050505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111425761114133612d89565b5b61114d848484612fcf565b50505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112e85760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112f26132f1565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661131e9190614d69565b6113289190614dab565b90508160000151819350935050509250929050565b611345612b17565b6000479050600060019050611358611cfb565b73ffffffffffffffffffffffffffffffffffffffff168260405161137b90614e0d565b60006040518083038185875af1925050503d80600081146113b8576040519150601f19603f3d011682016040523d82523d6000602084013e6113bd565b606091505b50508091505080611403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fa90614e6e565b60405180910390fd5b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114575761145633612d89565b5b6114628484846132fb565b50505050565b6060600061147583611bcd565b905060008167ffffffffffffffff8111156114935761149261465d565b5b6040519080825280602002602001820160405280156114c15781602001602082028036833780820191505090505b5090506000806114cf612fca565b90505b6114da610e27565b81101561155e578573ffffffffffffffffffffffffffffffffffffffff16611501826117ae565b73ffffffffffffffffffffffffffffffffffffffff160361154b57808383815181106115305761152f614c60565b5b602002602001018181525050818061154790614d21565b9250505b808061155690614d21565b9150506114d2565b50819350505050919050565b611572611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115f85750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e90614b0c565b60405180910390fd5b6000600a90506000423385856040516020016116569493929190614bc5565b6040516020818303038152906040528051906020012060001c90506000828261167f9190614c2f565b90506013818154811061169557611694614c60565b5b906000526020600020015460148190555060056018819055505050505050565b601181815481106116c557600080fd5b906000526020600020016000915090505481565b600e80546116e690614a8f565b80601f016020809104026020016040519081016040528092919081815260200182805461171290614a8f565b801561175f5780601f106117345761010080835404028352916020019161175f565b820191906000526020600020905b81548152906001019060200180831161174257829003601f168201915b505050505081565b61176f612b17565b80600a60146101000a81548160ff0219169083600481111561179457611793614864565b5b021790555050565b6117a4612b17565b80600b8190555050565b60006117b98261331b565b9050919050565b6117c8611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061184e5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490614b0c565b60405180910390fd5b6000423384846040516020016118a69493929190614bc5565b6040516020818303038152906040528051906020012060001c9050600080600090505b600a811015611a7f576000601780549050846118e59190614c2f565b90506000601782815481106118fd576118fc614c60565b5b906000526020600020015414611933576017818154811061192157611920614c60565b5b90600052602060002001549250611937565b8092505b60006017600160178054905061194d9190614cbe565b8154811061195e5761195d614c60565b5b9060005260206000200154036119a75760016017805490506119809190614cbe565b6017828154811061199457611993614c60565b5b90600052602060002001819055506119fa565b601760016017805490506119bb9190614cbe565b815481106119cc576119cb614c60565b5b9060005260206000200154601782815481106119eb576119ea614c60565b5b90600052602060002001819055505b6017805480611a0c57611a0b614cf2565b5b6001900381819060005260206000200160009055905560128381548110611a3657611a35614c60565b5b906000526020600020015460138381548110611a5557611a54614c60565b5b90600052602060002001819055506004601881905550508080611a7790614d21565b9150506118c9565b5050505050565b611a8e611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b145750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a90614b0c565b60405180910390fd5b6010805490508282905014611b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9490614eda565b60405180910390fd5b818160109190611bae929190613d1a565b5060016018819055505050565b611bc3612b17565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c34576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611c8d612b17565b611c9760006133e7565b565b6000600b54905090565b60606010805480602002602001604051908101604052809291908181526020018280548015611cf157602002820191906000526020600020905b815481526020019060010190808311611cdd575b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60128181548110611d3557600080fd5b906000526020600020016000915090505481565b606060038054611d5890614a8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8490614a8f565b8015611dd15780601f10611da657610100808354040283529160200191611dd1565b820191906000526020600020905b815481529060010190602001808311611db457829003601f168201915b5050505050905090565b806000808211611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1790614f46565b60405180910390fd5b600c5482611e2c610e27565b611e369190614f66565b1115611e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6e90614fe6565b60405180910390fd5b60036004811115611e8b57611e8a614864565b5b600a60149054906101000a900460ff166004811115611ead57611eac614864565b5b14611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee490615052565b60405180910390fd5b6005831115611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f28906150e4565b60405180910390fd5b82600b54611f3f9190614d69565b341015611f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7890615150565b60405180910390fd5b611f8b33846134ad565b505050565b81611f9a81612d89565b611fa483836134cb565b505050565b858560008211611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe590614f46565b60405180910390fd5b600c5482611ffa610e27565b6120049190614f66565b1115612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c90614fe6565b60405180910390fd5b60018503612106576001600481111561206157612060614864565b5b600a60149054906101000a900460ff16600481111561208357612082614864565b5b14806120c257506002600481111561209e5761209d614864565b5b600a60149054906101000a900460ff1660048111156120c0576120bf614864565b5b145b612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f8906151e2565b60405180910390fd5b6121c0565b6002600481111561211a57612119614864565b5b600a60149054906101000a900460ff16600481111561213c5761213b614864565b5b1461217c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217390615274565b60405180910390fd5b600087146121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b6906152e0565b60405180910390fd5b5b86866121cc9190614f66565b886121d633612776565b6121e09190614f66565b1115612221576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122189061534c565b60405180910390fd5b612277612230338989896135d6565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050613635565b6122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad906153b8565b60405180910390fd5b60008711156123cd5760011515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146123775786886123239190614cbe565b600b546123309190614d69565b341015612372576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236990615150565b60405180910390fd5b6123c8565b87600b546123859190614d69565b3410156123c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123be90615150565b60405180910390fd5b5b61241e565b87600b546123db9190614d69565b34101561241d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241490615150565b60405180910390fd5b5b60008711801561243a5750600b54886124379190614d69565b34105b1561252b5760011515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036124d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c990615424565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61253533896134ad565b5050505050505050565b612547611cfb565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125cd5750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61260c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260390614b0c565b60405180910390fd5b6011805490508282905014612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d90614eda565b60405180910390fd5b818160119190612667929190613d1a565b5060026018819055505050565b600d5481565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126b8576126b733612d89565b5b6126c48585858561364c565b5050505050565b6126d3612b17565b80600d8190555050565b600a60149054906101000a900460ff1681565b6060600e6126fd836136bf565b60405160200161270e929190615559565b6040516020818303038152906040529050919050565b600c5481565b612732612b17565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006127818261370f565b9050919050565b60145481565b6013818154811061279e57600080fd5b906000526020600020016000915090505481565b6127ba612b17565b80600e90816127c99190615715565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b612889612b17565b600c5482612895610e27565b61289f9190614f66565b11156128e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d790614fe6565b60405180910390fd5b6128ea81836134ad565b5050565b6060601380548060200260200160405190810160405280929190818152602001828054801561293c57602002820191906000526020600020905b815481526020019060010190808311612928575b5050505050905090565b61294e612b17565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b490615859565b60405180910390fd5b6129c6816133e7565b50565b601081815481106129d957600080fd5b906000526020600020016000915090505481565b60606012805480602002602001604051908101604052809291908181526020018280548015612a3b57602002820191906000526020600020905b815481526020019060010190808311612a27575b5050505050905090565b60606011805480602002602001604051908101604052809291908181526020018280548015612a9357602002820191906000526020600020905b815481526020019060010190808311612a7f575b5050505050905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b105750612b0f82613766565b5b9050919050565b612b1f6137d0565b73ffffffffffffffffffffffffffffffffffffffff16612b3d611cfb565b73ffffffffffffffffffffffffffffffffffffffff1614612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a906158c5565b60405180910390fd5b565b612b9d6132f1565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf290615957565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c61906159c3565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081612d35612fca565b11158015612d44575060005482105b8015612d82575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612e83576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612e009291906159e3565b602060405180830381865afa158015612e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e419190615a21565b612e8257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612e799190613f44565b60405180910390fd5b5b50565b6000612e91826117ae565b90508073ffffffffffffffffffffffffffffffffffffffff16612eb26137d8565b73ffffffffffffffffffffffffffffffffffffffff1614612f1557612ede81612ed96137d8565b6127cd565b612f14576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000612fda8261331b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613041576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061304d846137e0565b91509150613063818761305e6137d8565b613807565b6130af57613078866130736137d8565b6127cd565b6130ae576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613115576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613122868686600161384b565b801561312d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506131fb856131d7888887613851565b7c020000000000000000000000000000000000000000000000000000000017613879565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603613281576000600185019050600060046000838152602001908152602001600020540361327f57600054811461327e578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132e986868660016138a4565b505050505050565b6000612710905090565b6133168383836040518060200160405280600081525061267a565b505050565b6000808290508061332a612fca565b116133b0576000548110156133af5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036133ad575b600081036133a3576004600083600190039350838152602001908152602001600020549050613379565b80925050506133e2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6134c78282604051806020016040528060008152506138aa565b5050565b80600760006134d86137d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166135856137d8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135ca9190613e38565b60405180910390a35050565b6000848484846040516020016135ef9493929190615a4e565b604051602081830303815290604052805190602001206040516020016136159190615ab4565b604051602081830303815290604052805190602001209050949350505050565b600061364482600d5485613947565b905092915050565b613657848484611104565b60008373ffffffffffffffffffffffffffffffffffffffff163b146136b9576136828484848461395e565b6136b8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b6001156136fa57600184039350600a81066030018453600a81049050806136d8575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613868868684613aae565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6138b48383613ab7565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461394257600080549050600083820390505b6138f4600086838060010194508661395e565b61392a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106138e157816000541461393f57600080fd5b50505b505050565b6000826139548584613c72565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139846137d8565b8786866040518563ffffffff1660e01b81526004016139a69493929190615b24565b6020604051808303816000875af19250505080156139e257506040513d601f19601f820116820180604052508101906139df9190615b85565b60015b613a5b573d8060008114613a12576040519150601f19603f3d011682016040523d82523d6000602084013e613a17565b606091505b506000815103613a53576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203613af7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b04600084838561384b565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613b7b83613b6c6000866000613851565b613b7585613cc8565b17613879565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613c1c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613be1565b5060008203613c57576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613c6d60008483856138a4565b505050565b60008082905060005b8451811015613cbd57613ca882868381518110613c9b57613c9a614c60565b5b6020026020010151613cd8565b91508080613cb590614d21565b915050613c7b565b508091505092915050565b60006001821460e11b9050919050565b6000818310613cf057613ceb8284613d03565b613cfb565b613cfa8383613d03565b5b905092915050565b600082600052816020526040600020905092915050565b828054828255906000526020600020908101928215613d56579160200282015b82811115613d55578235825591602001919060010190613d3a565b5b509050613d639190613d67565b5090565b5b80821115613d80576000816000905550600101613d68565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dcd81613d98565b8114613dd857600080fd5b50565b600081359050613dea81613dc4565b92915050565b600060208284031215613e0657613e05613d8e565b5b6000613e1484828501613ddb565b91505092915050565b60008115159050919050565b613e3281613e1d565b82525050565b6000602082019050613e4d6000830184613e29565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e7e82613e53565b9050919050565b613e8e81613e73565b8114613e9957600080fd5b50565b600081359050613eab81613e85565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613ed281613eb1565b8114613edd57600080fd5b50565b600081359050613eef81613ec9565b92915050565b60008060408385031215613f0c57613f0b613d8e565b5b6000613f1a85828601613e9c565b9250506020613f2b85828601613ee0565b9150509250929050565b613f3e81613e73565b82525050565b6000602082019050613f596000830184613f35565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f99578082015181840152602081019050613f7e565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fc182613f5f565b613fcb8185613f6a565b9350613fdb818560208601613f7b565b613fe481613fa5565b840191505092915050565b600060208201905081810360008301526140098184613fb6565b905092915050565b6000819050919050565b61402481614011565b811461402f57600080fd5b50565b6000813590506140418161401b565b92915050565b60006020828403121561405d5761405c613d8e565b5b600061406b84828501614032565b91505092915050565b6000806040838503121561408b5761408a613d8e565b5b600061409985828601613e9c565b92505060206140aa85828601614032565b9150509250929050565b6140bd81614011565b82525050565b60006020820190506140d860008301846140b4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112614103576141026140de565b5b8235905067ffffffffffffffff8111156141205761411f6140e3565b5b60208301915083600182028301111561413c5761413b6140e8565b5b9250929050565b6000806020838503121561415a57614159613d8e565b5b600083013567ffffffffffffffff81111561417857614177613d93565b5b614184858286016140ed565b92509250509250929050565b6000806000606084860312156141a9576141a8613d8e565b5b60006141b786828701613e9c565b93505060206141c886828701613e9c565b92505060406141d986828701614032565b9150509250925092565b600080604083850312156141fa576141f9613d8e565b5b600061420885828601614032565b925050602061421985828601614032565b9150509250929050565b60006040820190506142386000830185613f35565b61424560208301846140b4565b9392505050565b6000819050919050565b600061427161426c61426784613e53565b61424c565b613e53565b9050919050565b600061428382614256565b9050919050565b600061429582614278565b9050919050565b6142a58161428a565b82525050565b60006020820190506142c0600083018461429c565b92915050565b6000602082840312156142dc576142db613d8e565b5b60006142ea84828501613e9c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61432881614011565b82525050565b600061433a838361431f565b60208301905092915050565b6000602082019050919050565b600061435e826142f3565b61436881856142fe565b93506143738361430f565b8060005b838110156143a457815161438b888261432e565b975061439683614346565b925050600181019050614377565b5085935050505092915050565b600060208201905081810360008301526143cb8184614353565b905092915050565b600581106143e057600080fd5b50565b6000813590506143f2816143d3565b92915050565b60006020828403121561440e5761440d613d8e565b5b600061441c848285016143e3565b91505092915050565b60008083601f84011261443b5761443a6140de565b5b8235905067ffffffffffffffff811115614458576144576140e3565b5b602083019150836020820283011115614474576144736140e8565b5b9250929050565b6000806020838503121561449257614491613d8e565b5b600083013567ffffffffffffffff8111156144b0576144af613d93565b5b6144bc85828601614425565b92509250509250929050565b6144d181613e1d565b81146144dc57600080fd5b50565b6000813590506144ee816144c8565b92915050565b6000806040838503121561450b5761450a613d8e565b5b600061451985828601613e9c565b925050602061452a858286016144df565b9150509250929050565b60008083601f84011261454a576145496140de565b5b8235905067ffffffffffffffff811115614567576145666140e3565b5b602083019150836020820283011115614583576145826140e8565b5b9250929050565b60008060008060008060a087890312156145a7576145a6613d8e565b5b60006145b589828a01614032565b96505060206145c689828a01614032565b95505060406145d789828a01614032565b94505060606145e889828a01614032565b935050608087013567ffffffffffffffff81111561460957614608613d93565b5b61461589828a01614534565b92509250509295509295509295565b6000819050919050565b61463781614624565b82525050565b6000602082019050614652600083018461462e565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61469582613fa5565b810181811067ffffffffffffffff821117156146b4576146b361465d565b5b80604052505050565b60006146c7613d84565b90506146d3828261468c565b919050565b600067ffffffffffffffff8211156146f3576146f261465d565b5b6146fc82613fa5565b9050602081019050919050565b82818337600083830152505050565b600061472b614726846146d8565b6146bd565b90508281526020810184848401111561474757614746614658565b5b614752848285614709565b509392505050565b600082601f83011261476f5761476e6140de565b5b813561477f848260208601614718565b91505092915050565b600080600080608085870312156147a2576147a1613d8e565b5b60006147b087828801613e9c565b94505060206147c187828801613e9c565b93505060406147d287828801614032565b925050606085013567ffffffffffffffff8111156147f3576147f2613d93565b5b6147ff8782880161475a565b91505092959194509250565b61481481614624565b811461481f57600080fd5b50565b6000813590506148318161480b565b92915050565b60006020828403121561484d5761484c613d8e565b5b600061485b84828501614822565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600581106148a4576148a3614864565b5b50565b60008190506148b582614893565b919050565b60006148c5826148a7565b9050919050565b6148d5816148ba565b82525050565b60006020820190506148f060008301846148cc565b92915050565b600067ffffffffffffffff8211156149115761491061465d565b5b61491a82613fa5565b9050602081019050919050565b600061493a614935846148f6565b6146bd565b90508281526020810184848401111561495657614955614658565b5b614961848285614709565b509392505050565b600082601f83011261497e5761497d6140de565b5b813561498e848260208601614927565b91505092915050565b6000602082840312156149ad576149ac613d8e565b5b600082013567ffffffffffffffff8111156149cb576149ca613d93565b5b6149d784828501614969565b91505092915050565b600080604083850312156149f7576149f6613d8e565b5b6000614a0585828601613e9c565b9250506020614a1685828601613e9c565b9150509250929050565b60008060408385031215614a3757614a36613d8e565b5b6000614a4585828601614032565b9250506020614a5685828601613e9c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614aa757607f821691505b602082108103614aba57614ab9614a60565b5b50919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614af6600e83613f6a565b9150614b0182614ac0565b602082019050919050565b60006020820190508181036000830152614b2581614ae9565b9050919050565b6000819050919050565b614b47614b4282614011565b614b2c565b82525050565b60008160601b9050919050565b6000614b6582614b4d565b9050919050565b6000614b7782614b5a565b9050919050565b614b8f614b8a82613e73565b614b6c565b82525050565b600081905092915050565b6000614bac8385614b95565b9350614bb9838584614709565b82840190509392505050565b6000614bd18287614b36565b602082019150614be18286614b7e565b601482019150614bf2828486614ba0565b915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c3a82614011565b9150614c4583614011565b925082614c5557614c54614c00565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cc982614011565b9150614cd483614011565b9250828203905081811115614cec57614ceb614c8f565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000614d2c82614011565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d5e57614d5d614c8f565b5b600182019050919050565b6000614d7482614011565b9150614d7f83614011565b9250828202614d8d81614011565b91508282048414831517614da457614da3614c8f565b5b5092915050565b6000614db682614011565b9150614dc183614011565b925082614dd157614dd0614c00565b5b828204905092915050565b600081905092915050565b50565b6000614df7600083614ddc565b9150614e0282614de7565b600082019050919050565b6000614e1882614dea565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614e58600f83613f6a565b9150614e6382614e22565b602082019050919050565b60006020820190508181036000830152614e8781614e4b565b9050919050565b7f4261642044617461000000000000000000000000000000000000000000000000600082015250565b6000614ec4600883613f6a565b9150614ecf82614e8e565b602082019050919050565b60006020820190508181036000830152614ef381614eb7565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b6000614f30601383613f6a565b9150614f3b82614efa565b602082019050919050565b60006020820190508181036000830152614f5f81614f23565b9050919050565b6000614f7182614011565b9150614f7c83614011565b9250828201905080821115614f9457614f93614c8f565b5b92915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000614fd0601383613f6a565b9150614fdb82614f9a565b602082019050919050565b60006020820190508181036000830152614fff81614fc3565b9050919050565b7f5075626c6963206d696e74206973206e6f7420617661696c61626c6520796574600082015250565b600061503c602083613f6a565b915061504782615006565b602082019050919050565b6000602082019050818103600083015261506b8161502f565b9050919050565b7f546f6f206d616e79206d696e747320706572207472616e73616374696f6e207260008201527f6571756573746564000000000000000000000000000000000000000000000000602082015250565b60006150ce602883613f6a565b91506150d982615072565b604082019050919050565b600060208201905081810360008301526150fd816150c1565b9050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061513a601283613f6a565b915061514582615104565b602082019050919050565b600060208201905081810360008301526151698161512d565b9050919050565b7f5331526f79616c7479206d696e74206973206e6f7420617661696c61626c652060008201527f7269676874206e6f770000000000000000000000000000000000000000000000602082015250565b60006151cc602983613f6a565b91506151d782615170565b604082019050919050565b600060208201905081810360008301526151fb816151bf565b9050919050565b7f416c6c6f774c697374206d696e74206973206e6f7420617661696c61626c652060008201527f7269676874206e6f770000000000000000000000000000000000000000000000602082015250565b600061525e602983613f6a565b915061526982615202565b604082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b7f416c6c6f774c6973742063616e6e6f74206861766520667265656d696e747300600082015250565b60006152ca601f83613f6a565b91506152d582615294565b602082019050919050565b600060208201905081810360008301526152f9816152bd565b9050919050565b7f4578636565647320616c6c6f776564206e756d626572206f66206d696e747300600082015250565b6000615336601f83613f6a565b915061534182615300565b602082019050919050565b6000602082019050818103600083015261536581615329565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b60006153a2600d83613f6a565b91506153ad8261536c565b602082019050919050565b600060208201905081810360008301526153d181615395565b9050919050565b7f46726565206d696e7420616c726561647920636c61696d656400000000000000600082015250565b600061540e601983613f6a565b9150615419826153d8565b602082019050919050565b6000602082019050818103600083015261543d81615401565b9050919050565b60008190508160005260206000209050919050565b6000815461546681614a8f565b6154708186614b95565b9450600182166000811461548b57600181146154a0576154d3565b60ff19831686528115158202860193506154d3565b6154a985615444565b60005b838110156154cb578154818901526001820191506020810190506154ac565b838801955050505b50505092915050565b60006154e782613f5f565b6154f18185614b95565b9350615501818560208601613f7b565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000615543600583614b95565b915061554e8261550d565b600582019050919050565b60006155658285615459565b915061557182846154dc565b915061557c82615536565b91508190509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026155d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615598565b6155df8683615598565b95508019841693508086168417925050509392505050565b600061561261560d61560884614011565b61424c565b614011565b9050919050565b6000819050919050565b61562c836155f7565b61564061563882615619565b8484546155a5565b825550505050565b600090565b615655615648565b615660818484615623565b505050565b5b818110156156845761567960008261564d565b600181019050615666565b5050565b601f8211156156c95761569a81615444565b6156a384615588565b810160208510156156b2578190505b6156c66156be85615588565b830182615665565b50505b505050565b600082821c905092915050565b60006156ec600019846008026156ce565b1980831691505092915050565b600061570583836156db565b9150826002028217905092915050565b61571e82613f5f565b67ffffffffffffffff8111156157375761573661465d565b5b6157418254614a8f565b61574c828285615688565b600060209050601f83116001811461577f576000841561576d578287015190505b61577785826156f9565b8655506157df565b601f19841661578d86615444565b60005b828110156157b557848901518255600182019150602085019450602081019050615790565b868310156157d257848901516157ce601f8916826156db565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615843602683613f6a565b915061584e826157e7565b604082019050919050565b6000602082019050818103600083015261587281615836565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006158af602083613f6a565b91506158ba82615879565b602082019050919050565b600060208201905081810360008301526158de816158a2565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615941602a83613f6a565b915061594c826158e5565b604082019050919050565b6000602082019050818103600083015261597081615934565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006159ad601983613f6a565b91506159b882615977565b602082019050919050565b600060208201905081810360008301526159dc816159a0565b9050919050565b60006040820190506159f86000830185613f35565b615a056020830184613f35565b9392505050565b600081519050615a1b816144c8565b92915050565b600060208284031215615a3757615a36613d8e565b5b6000615a4584828501615a0c565b91505092915050565b6000608082019050615a636000830187613f35565b615a7060208301866140b4565b615a7d60408301856140b4565b615a8a60608301846140b4565b95945050505050565b6000819050919050565b615aae615aa982614624565b615a93565b82525050565b6000615ac08284615a9d565b60208201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000615af682615acf565b615b008185615ada565b9350615b10818560208601613f7b565b615b1981613fa5565b840191505092915050565b6000608082019050615b396000830187613f35565b615b466020830186613f35565b615b5360408301856140b4565b8181036060830152615b658184615aeb565b905095945050505050565b600081519050615b7f81613dc4565b92915050565b600060208284031215615b9b57615b9a613d8e565b5b6000615ba984828501615b70565b9150509291505056fea26469706673582212207627f2d495de670af6ed7477494856ac6464217445e4481698068227bfc1e5fe64736f6c63430008110033

Deployed Bytecode Sourcemap

77040:10228:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85788:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85620:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77792:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35259:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41750:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86185:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77954:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31010:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83382:723;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86358:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13456:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;86996:269;;;;;;;;;;;;;:::i;:::-;;2887:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86537:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81615:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84855:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77595:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77410:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82252:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82346:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36652:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84113:734;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82982:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82447:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32194:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8139:103;;;;;;;;;;;;;:::i;:::-;;81328:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85181:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7491:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77652:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35435:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79195:350;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86001:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79553:1394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83182:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77369:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86724:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82555:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77246:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81418:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77332:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82846:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81203:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77764:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77708:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82728:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42699:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77489:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80955:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85499:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8397:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77538:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85393:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85287;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85788:189;85903:4;85933:36;85957:11;85933:23;:36::i;:::-;85926:43;;85788:189;;;:::o;85620:161::-;7377:13;:11;:13::i;:::-;85731:42:::1;85750:8;85760:12;85731:18;:42::i;:::-;85620:161:::0;;:::o;77792:73::-;;;;;;;;;;;;;:::o;35259:100::-;35313:13;35346:5;35339:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35259:100;:::o;41750:218::-;41826:7;41851:16;41859:7;41851;:16::i;:::-;41846:64;;41876:34;;;;;;;;;;;;;;41846:64;41930:15;:24;41946:7;41930:24;;;;;;;;;;;:30;;;;;;;;;;;;41923:37;;41750:218;;;:::o;86185:165::-;86289:8;4408:30;4429:8;4408:20;:30::i;:::-;86310:32:::1;86324:8;86334:7;86310:13;:32::i;:::-;86185:165:::0;;;:::o;77954:24::-;;;;:::o;31010:323::-;31071:7;31299:15;:13;:15::i;:::-;31284:12;;31268:13;;:28;:46;31261:53;;31010:323;:::o;83382:723::-;78597:7;:5;:7::i;:::-;78583:21;;:10;:21;;;:52;;;;78622:13;;;;;;;;;;;78608:27;;:10;:27;;;78583:52;78575:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;83450:18:::1;83506:15;83523:10;83535:7;;83489:54;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83479:65;;;;;;83471:74;;83450:95;;83556:10;83582:6:::0;83591:1:::1;83582:10;;83577:521;83598:2;83594:1;:6;83577:521;;;83621:19;83656:3;:10;;;;83643;:23;;;;:::i;:::-;83621:45;;83705:1;83685:3;83689:11;83685:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;83681:132;;83728:3;83732:11;83728:16;;;;;;;;:::i;:::-;;;;;;;;;;83723:21;;83681:132;;;83786:11;83781:16;;83681:132;83856:1;83833:3;83850:1;83837:3;:10;;;;:14;;;;:::i;:::-;83833:19;;;;;;;;:::i;:::-;;;;;;;;;;:24:::0;83829:169:::1;;83906:1;83893:3;:10;;;;:14;;;;:::i;:::-;83874:3;83878:11;83874:16;;;;;;;;:::i;:::-;;;;;;;;;:33;;;;83829:169;;;83963:3;83980:1;83967:3;:10;;;;:14;;;;:::i;:::-;83963:19;;;;;;;;:::i;:::-;;;;;;;;;;83944:3;83948:11;83944:16;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;83829:169;84012:3;:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;84054:12;84067:2;84054:16;;;;;;;;:::i;:::-;;;;;;;;;;84036:12;84049:1;84036:15;;;;;;;;:::i;:::-;;;;;;;;;:34;;;;84089:1;84081:5;:9;;;;83606:492;83602:3;;;;;:::i;:::-;;;;83577:521;;;;83439:666;;83382:723:::0;;:::o;86358:171::-;86467:4;4236:10;4228:18;;:4;:18;;;4224:83;;4263:32;4284:10;4263:20;:32::i;:::-;4224:83;86484:37:::1;86503:4;86509:2;86513:7;86484:18;:37::i;:::-;86358:171:::0;;;;:::o;13456:442::-;13553:7;13562;13582:26;13611:17;:27;13629:8;13611:27;;;;;;;;;;;13582:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13683:1;13655:30;;:7;:16;;;:30;;;13651:92;;13712:19;13702:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13651:92;13755:21;13820:17;:15;:17::i;:::-;13779:58;;13793:7;:23;;;13780:36;;:10;:36;;;;:::i;:::-;13779:58;;;;:::i;:::-;13755:82;;13858:7;:16;;;13876:13;13850:40;;;;;;13456:442;;;;;:::o;86996:269::-;7377:13;:11;:13::i;:::-;87044:23:::1;87070:21;87044:47;;87102:12;87117:4;87102:19;;87156:7;:5;:7::i;:::-;87148:21;;87191:15;87148:63;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87134:77;;;;;87230:7;87222:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;87033:232;;86996:269::o:0;2887:143::-;2987:42;2887:143;:::o;86537:179::-;86650:4;4236:10;4228:18;;:4;:18;;;4224:83;;4263:32;4284:10;4263:20;:32::i;:::-;4224:83;86667:41:::1;86690:4;86696:2;86700:7;86667:22;:41::i;:::-;86537:179:::0;;;;:::o;81615:613::-;81702:16;81736:23;81762:17;81772:6;81762:9;:17::i;:::-;81736:43;;81790:28;81835:15;81821:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81790:61;;81862:21;81917:16;81936:15;:13;:15::i;:::-;81917:34;;81898:294;81977:13;:11;:13::i;:::-;81966:8;:24;81898:294;;;82067:6;82046:27;;:17;82054:8;82046:7;:17::i;:::-;:27;;;82042:139;;82123:8;82094:11;82106:13;82094:26;;;;;;;;:::i;:::-;;;;;;;:37;;;;;82150:15;;;;;:::i;:::-;;;;82042:139;82005:10;;;;;:::i;:::-;;;;81898:294;;;;82209:11;82202:18;;;;;81615:613;;;:::o;84855:318::-;78597:7;:5;:7::i;:::-;78583:21;;:10;:21;;;:52;;;;78622:13;;;;;;;;;;;78608:27;;:10;:27;;;78583:52;78575:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;84923:20:::1;84946:2;84923:25;;84959:18;85015:15;85032:10;85044:7;;84998:54;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84988:65;;;;;;84980:74;;84959:95;;85065:13;85094:12;85081:10;:25;;;;:::i;:::-;85065:41;;85126:12;85139:5;85126:19;;;;;;;;:::i;:::-;;;;;;;;;;85117:6;:28;;;;85164:1;85156:5;:9;;;;84912:261;;;84855:318:::0;;:::o;77595:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77410:72::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;82252:86::-;7377:13;:11;:13::i;:::-;82324:6:::1;82316:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;82252:86:::0;:::o;82346:93::-;7377:13;:11;:13::i;:::-;82423:8:::1;82412;:19;;;;82346:93:::0;:::o;36652:152::-;36724:7;36767:27;36786:7;36767:18;:27::i;:::-;36744:52;;36652:152;;;:::o;84113:734::-;78597:7;:5;:7::i;:::-;78583:21;;:10;:21;;;:52;;;;78622:13;;;;;;;;;;;78608:27;;:10;:27;;;78583:52;78575:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;84181:18:::1;84237:15;84254:10;84266:7;;84220:54;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84210:65;;;;;;84202:74;;84181:95;;84287:10;84313:6:::0;84322:1:::1;84313:10;;84308:532;84329:2;84325:1;:6;84308:532;;;84352:19;84387:4;:11;;;;84374:10;:24;;;;:::i;:::-;84352:46;;84438:1;84417:4;84422:11;84417:17;;;;;;;;:::i;:::-;;;;;;;;;;:22;84413:134;;84461:4;84466:11;84461:17;;;;;;;;:::i;:::-;;;;;;;;;;84456:22;;84413:134;;;84520:11;84515:16;;84413:134;84592:1;84567:4;84586:1;84572:4;:11;;;;:15;;;;:::i;:::-;84567:21;;;;;;;;:::i;:::-;;;;;;;;;;:26:::0;84563:176:::1;;84644:1;84630:4;:11;;;;:15;;;;:::i;:::-;84610:4;84615:11;84610:17;;;;;;;;:::i;:::-;;;;;;;;;:35;;;;84563:176;;;84702:4;84721:1;84707:4;:11;;;;:15;;;;:::i;:::-;84702:21;;;;;;;;:::i;:::-;;;;;;;;;;84682:4;84687:11;84682:17;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;84563:176;84753:4;:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;84796:12;84809:2;84796:16;;;;;;;;:::i;:::-;;;;;;;;;;84778:12;84791:1;84778:15;;;;;;;;:::i;:::-;;;;;;;;;:34;;;;84831:1;84823:5;:9;;;;84337:503;84333:3;;;;;:::i;:::-;;;;84308:532;;;;84170:677;;84113:734:::0;;:::o;82982:192::-;78597:7;:5;:7::i;:::-;78583:21;;:10;:21;;;:52;;;;78622:13;;;;;;;;;;;78608:27;;:10;:27;;;78583:52;78575:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;83081:12:::1;:19;;;;83063:7;;:14;;:37;83055:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;83139:7;;83124:12;:22;;;;;;;:::i;:::-;;83165:1;83157:5;:9;;;;82982:192:::0;;:::o;82447:100::-;7377:13;:11;:13::i;:::-;82529:10:::1;82517:9;:22;;;;82447:100:::0;:::o;32194:233::-;32266:7;32307:1;32290:19;;:5;:19;;;32286:60;;32318:28;;;;;;;;;;;;;;32286:60;26353:13;32364:18;:25;32383:5;32364:25;;;;;;;;;;;;;;;;:55;32357:62;;32194:233;;;:::o;8139:103::-;7377:13;:11;:13::i;:::-;8204:30:::1;8231:1;8204:18;:30::i;:::-;8139:103::o:0;81328:82::-;81368:7;81394:8;;81387:15;;81328:82;:::o;85181:98::-;85224:16;85259:12;85252:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85181:98;:::o;7491:87::-;7537:7;7564:6;;;;;;;;;;;7557:13;;7491:87;:::o;77652:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35435:104::-;35491:13;35524:7;35517:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35435:104;:::o;79195:350::-;79255:6;79263:1;78366;78352:11;:15;78330:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;78464:9;;78449:11;78433:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;78411:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;79294:16:::1;79285:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;79277:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;79377:1;79367:6;:11;;79358:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;79466:6;79455:8;;:17;;;;:::i;:::-;79442:9;:30;;79434:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;79508:29;79518:10;79530:6;79508:9;:29::i;:::-;79195:350:::0;;;:::o;86001:176::-;86105:8;4408:30;4429:8;4408:20;:30::i;:::-;86126:43:::1;86150:8;86160;86126:23;:43::i;:::-;86001:176:::0;;;:::o;79553:1394::-;79748:6;79756:9;78366:1;78352:11;:15;78330:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;78464:9;;78449:11;78433:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;78411:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;79785:1:::1;79778:5;:8:::0;79774:316:::1;;79811:19;79802:28;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;:60;;;;79843:19;79834:28;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;79802:60;79794:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;79774:316;;;79951:19;79942:28;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;79934:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;80045:1;80032:9;:14;80024:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;79774:316;80168:9;80158:7;:19;;;;:::i;:::-;80147:6;80120:24;80133:10;80120:12;:24::i;:::-;:33;;;;:::i;:::-;:58;;80098:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;80258:60;80266:44;80272:10;80284:9;80295:7;80304:5;80266;:44::i;:::-;80312:5;;80258:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:60::i;:::-;80250:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;80361:1;80349:9;:13;80345:369;;;80402:4;80378:28;;:10;:22;80389:10;80378:22;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;80374:238;;80464:9;80455:6;:18;;;;:::i;:::-;80443:8;;:31;;;;:::i;:::-;80430:9;:44;;80422:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;80374:238;;;80571:6;80560:8;;:17;;;;:::i;:::-;80547:9;:30;;80539:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;80374:238;80345:369;;;80677:6;80666:8;;:17;;;;:::i;:::-;80653:9;:30;;80645:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;80345:369;80738:1;80726:9;:13;:48;;;;;80765:8;;80756:6;:17;;;;:::i;:::-;80743:9;:31;80726:48;80722:180;;;80820:4;80796:28;;:10;:22;80807:10;80796:22;;;;;;;;;;;;;;;;;;;;;;;;;:28;;::::0;80787:67:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;80890:4;80865:10;:22;80876:10;80865:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;80722:180;80910:29;80920:10;80932:6;80910:9;:29::i;:::-;79553:1394:::0;;;;;;;;:::o;83182:192::-;78597:7;:5;:7::i;:::-;78583:21;;:10;:21;;;:52;;;;78622:13;;;;;;;;;;;78608:27;;:10;:27;;;78583:52;78575:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;83281:12:::1;:19;;;;83263:7;;:14;;:37;83255:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;83339:7;;83324:12;:22;;;;;;;:::i;:::-;;83365:1;83357:5;:9;;;;83182:192:::0;;:::o;77369:34::-;;;;:::o;86724:245::-;86892:4;4236:10;4228:18;;:4;:18;;;4224:83;;4263:32;4284:10;4263:20;:32::i;:::-;4224:83;86914:47:::1;86937:4;86943:2;86947:7;86956:4;86914:22;:47::i;:::-;86724:245:::0;;;;;:::o;82555:165::-;7377:13;:11;:13::i;:::-;82692:20:::1;82670:19;:42;;;;82555:165:::0;:::o;77246:41::-;;;;;;;;;;;;;:::o;81418:189::-;81499:13;81556:12;81570:18;81580:7;81570:9;:18::i;:::-;81539:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81525:74;;81418:189;;;:::o;77332:30::-;;;;:::o;82846:111::-;7377:13;:11;:13::i;:::-;82939:10:::1;82923:13;;:26;;;;;;;;;;;;;;;;;;82846:111:::0;:::o;81203:117::-;81263:7;81290:22;81304:7;81290:13;:22::i;:::-;81283:29;;81203:117;;;:::o;77764:21::-;;;;:::o;77708:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;82728:110::-;7377:13;:11;:13::i;:::-;82820:10:::1;82805:12;:25;;;;;;:::i;:::-;;82728:110:::0;:::o;42699:164::-;42796:4;42820:18;:25;42839:5;42820:25;;;;;;;;;;;;;;;:35;42846:8;42820:35;;;;;;;;;;;;;;;;;;;;;;;;;42813:42;;42699:164;;;;:::o;77489:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;80955:224::-;7377:13;:11;:13::i;:::-;81099:9:::1;;81089:6;81073:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;81065:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;81143:28;81153:9;81164:6;81143:9;:28::i;:::-;80955:224:::0;;:::o;85499:98::-;85542:16;85577:12;85570:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85499:98;:::o;8397:201::-;7377:13;:11;:13::i;:::-;8506:1:::1;8486:22;;:8;:22;;::::0;8478:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8562:28;8581:8;8562:18;:28::i;:::-;8397:201:::0;:::o;77538:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;85393:98::-;85436:16;85471:12;85464:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85393:98;:::o;85287:::-;85330:16;85365:12;85358:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85287:98;:::o;13186:215::-;13288:4;13327:26;13312:41;;;:11;:41;;;;:81;;;;13357:36;13381:11;13357:23;:36::i;:::-;13312:81;13305:88;;13186:215;;;:::o;7656:132::-;7731:12;:10;:12::i;:::-;7720:23;;:7;:5;:7::i;:::-;:23;;;7712:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7656:132::o;14548:332::-;14667:17;:15;:17::i;:::-;14651:33;;:12;:33;;;;14643:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;14770:1;14750:22;;:8;:22;;;14742:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14837:35;;;;;;;;14849:8;14837:35;;;;;;14859:12;14837:35;;;;;14815:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14548:332;;:::o;43121:282::-;43186:4;43242:7;43223:15;:13;:15::i;:::-;:26;;:66;;;;;43276:13;;43266:7;:23;43223:66;:153;;;;;43375:1;27129:8;43327:17;:26;43345:7;43327:26;;;;;;;;;;;;:44;:49;43223:153;43203:173;;43121:282;;;:::o;4466:419::-;4705:1;2987:42;4657:45;;;:49;4653:225;;;2987:42;4728;;;4779:4;4786:8;4728:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4723:144;;4842:8;4823:28;;;;;;;;;;;:::i;:::-;;;;;;;;4723:144;4653:225;4466:419;:::o;41183:408::-;41272:13;41288:16;41296:7;41288;:16::i;:::-;41272:32;;41344:5;41321:28;;:19;:17;:19::i;:::-;:28;;;41317:175;;41369:44;41386:5;41393:19;:17;:19::i;:::-;41369:16;:44::i;:::-;41364:128;;41441:35;;;;;;;;;;;;;;41364:128;41317:175;41537:2;41504:15;:24;41520:7;41504:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41575:7;41571:2;41555:28;;41564:5;41555:28;;;;;;;;;;;;41261:330;41183:408;;:::o;78127:101::-;78192:7;78127:101;:::o;45389:2825::-;45531:27;45561;45580:7;45561:18;:27::i;:::-;45531:57;;45646:4;45605:45;;45621:19;45605:45;;;45601:86;;45659:28;;;;;;;;;;;;;;45601:86;45701:27;45730:23;45757:35;45784:7;45757:26;:35::i;:::-;45700:92;;;;45892:68;45917:15;45934:4;45940:19;:17;:19::i;:::-;45892:24;:68::i;:::-;45887:180;;45980:43;45997:4;46003:19;:17;:19::i;:::-;45980:16;:43::i;:::-;45975:92;;46032:35;;;;;;;;;;;;;;45975:92;45887:180;46098:1;46084:16;;:2;:16;;;46080:52;;46109:23;;;;;;;;;;;;;;46080:52;46145:43;46167:4;46173:2;46177:7;46186:1;46145:21;:43::i;:::-;46281:15;46278:160;;;46421:1;46400:19;46393:30;46278:160;46818:18;:24;46837:4;46818:24;;;;;;;;;;;;;;;;46816:26;;;;;;;;;;;;46887:18;:22;46906:2;46887:22;;;;;;;;;;;;;;;;46885:24;;;;;;;;;;;47209:146;47246:2;47295:45;47310:4;47316:2;47320:19;47295:14;:45::i;:::-;27409:8;47267:73;47209:18;:146::i;:::-;47180:17;:26;47198:7;47180:26;;;;;;;;;;;:175;;;;47526:1;27409:8;47475:19;:47;:52;47471:627;;47548:19;47580:1;47570:7;:11;47548:33;;47737:1;47703:17;:30;47721:11;47703:30;;;;;;;;;;;;:35;47699:384;;47841:13;;47826:11;:28;47822:242;;48021:19;47988:17;:30;48006:11;47988:30;;;;;;;;;;;:52;;;;47822:242;47699:384;47529:569;47471:627;48145:7;48141:2;48126:27;;48135:4;48126:27;;;;;;;;;;;;48164:42;48185:4;48191:2;48195:7;48204:1;48164:20;:42::i;:::-;45520:2694;;;45389:2825;;;:::o;14180:97::-;14238:6;14264:5;14257:12;;14180:97;:::o;48310:193::-;48456:39;48473:4;48479:2;48483:7;48456:39;;;;;;;;;;;;:16;:39::i;:::-;48310:193;;;:::o;37807:1275::-;37874:7;37894:12;37909:7;37894:22;;37977:4;37958:15;:13;:15::i;:::-;:23;37954:1061;;38011:13;;38004:4;:20;38000:1015;;;38049:14;38066:17;:23;38084:4;38066:23;;;;;;;;;;;;38049:40;;38183:1;27129:8;38155:6;:24;:29;38151:845;;38820:113;38837:1;38827:6;:11;38820:113;;38880:17;:25;38898:6;;;;;;;38880:25;;;;;;;;;;;;38871:34;;38820:113;;;38966:6;38959:13;;;;;;38151:845;38026:989;38000:1015;37954:1061;39043:31;;;;;;;;;;;;;;37807:1275;;;;:::o;8758:191::-;8832:16;8851:6;;;;;;;;;;;8832:25;;8877:8;8868:6;;:17;;;;;;;;;;;;;;;;;;8932:8;8901:40;;8922:8;8901:40;;;;;;;;;;;;8821:128;8758:191;:::o;59261:112::-;59338:27;59348:2;59352:8;59338:27;;;;;;;;;;;;:9;:27::i;:::-;59261:112;;:::o;42308:234::-;42455:8;42403:18;:39;42422:19;:17;:19::i;:::-;42403:39;;;;;;;;;;;;;;;:49;42443:8;42403:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;42515:8;42479:55;;42494:19;:17;:19::i;:::-;42479:55;;;42525:8;42479:55;;;;;;:::i;:::-;;;;;;;;42308:234;;:::o;78904:255::-;79037:7;79113;79122:9;79133:7;79142:5;79102:46;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79092:57;;;;;;79079:71;;;;;;;;:::i;:::-;;;;;;;;;;;;;79069:82;;;;;;79062:89;;78904:255;;;;;;:::o;78702:194::-;78807:4;78836:52;78855:5;78862:19;;78883:4;78836:18;:52::i;:::-;78829:59;;78702:194;;;;:::o;49101:407::-;49276:31;49289:4;49295:2;49299:7;49276:12;:31::i;:::-;49340:1;49322:2;:14;;;:19;49318:183;;49361:56;49392:4;49398:2;49402:7;49411:5;49361:30;:56::i;:::-;49356:145;;49445:40;;;;;;;;;;;;;;49356:145;49318:183;49101:407;;;;:::o;65636:1745::-;65701:17;66135:4;66128;66122:11;66118:22;66227:1;66221:4;66214:15;66302:4;66299:1;66295:12;66288:19;;66384:1;66379:3;66372:14;66488:3;66727:5;66709:428;66735:1;66709:428;;;66775:1;66770:3;66766:11;66759:18;;66946:2;66940:4;66936:13;66932:2;66928:22;66923:3;66915:36;67040:2;67034:4;67030:13;67022:21;;67107:4;66709:428;67097:25;66709:428;66713:21;67176:3;67171;67167:13;67291:4;67286:3;67282:14;67275:21;;67356:6;67351:3;67344:19;65740:1634;;;65636:1745;;;:::o;32509:178::-;32570:7;26353:13;26491:2;32598:18;:25;32617:5;32598:25;;;;;;;;;;;;;;;;:50;;32597:82;32590:89;;32509:178;;;:::o;10738:157::-;10823:4;10862:25;10847:40;;;:11;:40;;;;10840:47;;10738:157;;;:::o;6042:98::-;6095:7;6122:10;6115:17;;6042:98;:::o;65429:105::-;65489:7;65516:10;65509:17;;65429:105;:::o;44284:485::-;44386:27;44415:23;44456:38;44497:15;:24;44513:7;44497:24;;;;;;;;;;;44456:65;;44674:18;44651:41;;44731:19;44725:26;44706:45;;44636:126;44284:485;;;:::o;43512:659::-;43661:11;43826:16;43819:5;43815:28;43806:37;;43986:16;43975:9;43971:32;43958:45;;44136:15;44125:9;44122:30;44114:5;44103:9;44100:20;44097:56;44087:66;;43512:659;;;;;:::o;50170:159::-;;;;;:::o;64738:311::-;64873:7;64893:16;27533:3;64919:19;:41;;64893:68;;27533:3;64987:31;64998:4;65004:2;65008:9;64987:10;:31::i;:::-;64979:40;;:62;;64972:69;;;64738:311;;;;;:::o;39630:450::-;39710:14;39878:16;39871:5;39867:28;39858:37;;40055:5;40041:11;40016:23;40012:41;40009:52;40002:5;39999:63;39989:73;;39630:450;;;;:::o;50994:158::-;;;;;:::o;58488:689::-;58619:19;58625:2;58629:8;58619:5;:19::i;:::-;58698:1;58680:2;:14;;;:19;58676:483;;58720:11;58734:13;;58720:27;;58766:13;58788:8;58782:3;:14;58766:30;;58815:233;58846:62;58885:1;58889:2;58893:7;;;;;;58902:5;58846:30;:62::i;:::-;58841:167;;58944:40;;;;;;;;;;;;;;58841:167;59043:3;59035:5;:11;58815:233;;59130:3;59113:13;;:20;59109:34;;59135:8;;;59109:34;58701:458;;58676:483;58488:689;;;:::o;68610:190::-;68735:4;68788;68759:25;68772:5;68779:4;68759:12;:25::i;:::-;:33;68752:40;;68610:190;;;;;:::o;51592:716::-;51755:4;51801:2;51776:45;;;51822:19;:17;:19::i;:::-;51843:4;51849:7;51858:5;51776:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51772:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52076:1;52059:6;:13;:18;52055:235;;52105:40;;;;;;;;;;;;;;52055:235;52248:6;52242:13;52233:6;52229:2;52225:15;52218:38;51772:529;51945:54;;;51935:64;;;:6;:64;;;;51928:71;;;51592:716;;;;;;:::o;64439:147::-;64576:6;64439:147;;;;;:::o;52770:2966::-;52843:20;52866:13;;52843:36;;52906:1;52894:8;:13;52890:44;;52916:18;;;;;;;;;;;;;;52890:44;52947:61;52977:1;52981:2;52985:12;52999:8;52947:21;:61::i;:::-;53491:1;26491:2;53461:1;:26;;53460:32;53448:8;:45;53422:18;:22;53441:2;53422:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;53770:139;53807:2;53861:33;53884:1;53888:2;53892:1;53861:14;:33::i;:::-;53828:30;53849:8;53828:20;:30::i;:::-;:66;53770:18;:139::i;:::-;53736:17;:31;53754:12;53736:31;;;;;;;;;;;:173;;;;53926:16;53957:11;53986:8;53971:12;:23;53957:37;;54507:16;54503:2;54499:25;54487:37;;54879:12;54839:8;54798:1;54736:25;54677:1;54616;54589:335;55250:1;55236:12;55232:20;55190:346;55291:3;55282:7;55279:16;55190:346;;55509:7;55499:8;55496:1;55469:25;55466:1;55463;55458:59;55344:1;55335:7;55331:15;55320:26;;55190:346;;;55194:77;55581:1;55569:8;:13;55565:45;;55591:19;;;;;;;;;;;;;;55565:45;55643:3;55627:13;:19;;;;53196:2462;;55668:60;55697:1;55701:2;55705:12;55719:8;55668:20;:60::i;:::-;52832:2904;52770:2966;;:::o;69477:296::-;69560:7;69580:20;69603:4;69580:27;;69623:9;69618:118;69642:5;:12;69638:1;:16;69618:118;;;69691:33;69701:12;69715:5;69721:1;69715:8;;;;;;;;:::i;:::-;;;;;;;;69691:9;:33::i;:::-;69676:48;;69656:3;;;;;:::i;:::-;;;;69618:118;;;;69753:12;69746:19;;;69477:296;;;;:::o;40182:324::-;40252:14;40485:1;40475:8;40472:15;40446:24;40442:46;40432:56;;40182:324;;;:::o;76517:149::-;76580:7;76611:1;76607;:5;:51;;76638:20;76653:1;76656;76638:14;:20::i;:::-;76607:51;;;76615:20;76630:1;76633;76615:14;:20::i;:::-;76607:51;76600:58;;76517:149;;;;:::o;76674:268::-;76742:13;76849:1;76843:4;76836:15;76878:1;76872:4;76865:15;76919:4;76913;76903:21;76894:30;;76674:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:118::-;2974:24;2992:5;2974:24;:::i;:::-;2969:3;2962:37;2887:118;;:::o;3011:222::-;3104:4;3142:2;3131:9;3127:18;3119:26;;3155:71;3223:1;3212:9;3208:17;3199:6;3155:71;:::i;:::-;3011:222;;;;:::o;3239:99::-;3291:6;3325:5;3319:12;3309:22;;3239:99;;;:::o;3344:169::-;3428:11;3462:6;3457:3;3450:19;3502:4;3497:3;3493:14;3478:29;;3344:169;;;;:::o;3519:246::-;3600:1;3610:113;3624:6;3621:1;3618:13;3610:113;;;3709:1;3704:3;3700:11;3694:18;3690:1;3685:3;3681:11;3674:39;3646:2;3643:1;3639:10;3634:15;;3610:113;;;3757:1;3748:6;3743:3;3739:16;3732:27;3581:184;3519:246;;;:::o;3771:102::-;3812:6;3863:2;3859:7;3854:2;3847:5;3843:14;3839:28;3829:38;;3771:102;;;:::o;3879:377::-;3967:3;3995:39;4028:5;3995:39;:::i;:::-;4050:71;4114:6;4109:3;4050:71;:::i;:::-;4043:78;;4130:65;4188:6;4183:3;4176:4;4169:5;4165:16;4130:65;:::i;:::-;4220:29;4242:6;4220:29;:::i;:::-;4215:3;4211:39;4204:46;;3971:285;3879:377;;;;:::o;4262:313::-;4375:4;4413:2;4402:9;4398:18;4390:26;;4462:9;4456:4;4452:20;4448:1;4437:9;4433:17;4426:47;4490:78;4563:4;4554:6;4490:78;:::i;:::-;4482:86;;4262:313;;;;:::o;4581:77::-;4618:7;4647:5;4636:16;;4581:77;;;:::o;4664:122::-;4737:24;4755:5;4737:24;:::i;:::-;4730:5;4727:35;4717:63;;4776:1;4773;4766:12;4717:63;4664:122;:::o;4792:139::-;4838:5;4876:6;4863:20;4854:29;;4892:33;4919:5;4892:33;:::i;:::-;4792:139;;;;:::o;4937:329::-;4996:6;5045:2;5033:9;5024:7;5020:23;5016:32;5013:119;;;5051:79;;:::i;:::-;5013:119;5171:1;5196:53;5241:7;5232:6;5221:9;5217:22;5196:53;:::i;:::-;5186:63;;5142:117;4937:329;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:118::-;5839:24;5857:5;5839:24;:::i;:::-;5834:3;5827:37;5752:118;;:::o;5876:222::-;5969:4;6007:2;5996:9;5992:18;5984:26;;6020:71;6088:1;6077:9;6073:17;6064:6;6020:71;:::i;:::-;5876:222;;;;:::o;6104:117::-;6213:1;6210;6203:12;6227:117;6336:1;6333;6326:12;6350:117;6459:1;6456;6449:12;6487:553;6545:8;6555:6;6605:3;6598:4;6590:6;6586:17;6582:27;6572:122;;6613:79;;:::i;:::-;6572:122;6726:6;6713:20;6703:30;;6756:18;6748:6;6745:30;6742:117;;;6778:79;;:::i;:::-;6742:117;6892:4;6884:6;6880:17;6868:29;;6946:3;6938:4;6930:6;6926:17;6916:8;6912:32;6909:41;6906:128;;;6953:79;;:::i;:::-;6906:128;6487:553;;;;;:::o;7046:529::-;7117:6;7125;7174:2;7162:9;7153:7;7149:23;7145:32;7142:119;;;7180:79;;:::i;:::-;7142:119;7328:1;7317:9;7313:17;7300:31;7358:18;7350:6;7347:30;7344:117;;;7380:79;;:::i;:::-;7344:117;7493:65;7550:7;7541:6;7530:9;7526:22;7493:65;:::i;:::-;7475:83;;;;7271:297;7046:529;;;;;:::o;7581:619::-;7658:6;7666;7674;7723:2;7711:9;7702:7;7698:23;7694:32;7691:119;;;7729:79;;:::i;:::-;7691:119;7849:1;7874:53;7919:7;7910:6;7899:9;7895:22;7874:53;:::i;:::-;7864:63;;7820:117;7976:2;8002:53;8047:7;8038:6;8027:9;8023:22;8002:53;:::i;:::-;7992:63;;7947:118;8104:2;8130:53;8175:7;8166:6;8155:9;8151:22;8130:53;:::i;:::-;8120:63;;8075:118;7581:619;;;;;:::o;8206:474::-;8274:6;8282;8331:2;8319:9;8310:7;8306:23;8302:32;8299:119;;;8337:79;;:::i;:::-;8299:119;8457:1;8482:53;8527:7;8518:6;8507:9;8503:22;8482:53;:::i;:::-;8472:63;;8428:117;8584:2;8610:53;8655:7;8646:6;8635:9;8631:22;8610:53;:::i;:::-;8600:63;;8555:118;8206:474;;;;;:::o;8686:332::-;8807:4;8845:2;8834:9;8830:18;8822:26;;8858:71;8926:1;8915:9;8911:17;8902:6;8858:71;:::i;:::-;8939:72;9007:2;8996:9;8992:18;8983:6;8939:72;:::i;:::-;8686:332;;;;;:::o;9024:60::-;9052:3;9073:5;9066:12;;9024:60;;;:::o;9090:142::-;9140:9;9173:53;9191:34;9200:24;9218:5;9200:24;:::i;:::-;9191:34;:::i;:::-;9173:53;:::i;:::-;9160:66;;9090:142;;;:::o;9238:126::-;9288:9;9321:37;9352:5;9321:37;:::i;:::-;9308:50;;9238:126;;;:::o;9370:157::-;9451:9;9484:37;9515:5;9484:37;:::i;:::-;9471:50;;9370:157;;;:::o;9533:193::-;9651:68;9713:5;9651:68;:::i;:::-;9646:3;9639:81;9533:193;;:::o;9732:284::-;9856:4;9894:2;9883:9;9879:18;9871:26;;9907:102;10006:1;9995:9;9991:17;9982:6;9907:102;:::i;:::-;9732:284;;;;:::o;10022:329::-;10081:6;10130:2;10118:9;10109:7;10105:23;10101:32;10098:119;;;10136:79;;:::i;:::-;10098:119;10256:1;10281:53;10326:7;10317:6;10306:9;10302:22;10281:53;:::i;:::-;10271:63;;10227:117;10022:329;;;;:::o;10357:114::-;10424:6;10458:5;10452:12;10442:22;;10357:114;;;:::o;10477:184::-;10576:11;10610:6;10605:3;10598:19;10650:4;10645:3;10641:14;10626:29;;10477:184;;;;:::o;10667:132::-;10734:4;10757:3;10749:11;;10787:4;10782:3;10778:14;10770:22;;10667:132;;;:::o;10805:108::-;10882:24;10900:5;10882:24;:::i;:::-;10877:3;10870:37;10805:108;;:::o;10919:179::-;10988:10;11009:46;11051:3;11043:6;11009:46;:::i;:::-;11087:4;11082:3;11078:14;11064:28;;10919:179;;;;:::o;11104:113::-;11174:4;11206;11201:3;11197:14;11189:22;;11104:113;;;:::o;11253:732::-;11372:3;11401:54;11449:5;11401:54;:::i;:::-;11471:86;11550:6;11545:3;11471:86;:::i;:::-;11464:93;;11581:56;11631:5;11581:56;:::i;:::-;11660:7;11691:1;11676:284;11701:6;11698:1;11695:13;11676:284;;;11777:6;11771:13;11804:63;11863:3;11848:13;11804:63;:::i;:::-;11797:70;;11890:60;11943:6;11890:60;:::i;:::-;11880:70;;11736:224;11723:1;11720;11716:9;11711:14;;11676:284;;;11680:14;11976:3;11969:10;;11377:608;;;11253:732;;;;:::o;11991:373::-;12134:4;12172:2;12161:9;12157:18;12149:26;;12221:9;12215:4;12211:20;12207:1;12196:9;12192:17;12185:47;12249:108;12352:4;12343:6;12249:108;:::i;:::-;12241:116;;11991:373;;;;:::o;12370:113::-;12457:1;12450:5;12447:12;12437:40;;12473:1;12470;12463:12;12437:40;12370:113;:::o;12489:167::-;12549:5;12587:6;12574:20;12565:29;;12603:47;12644:5;12603:47;:::i;:::-;12489:167;;;;:::o;12662:357::-;12735:6;12784:2;12772:9;12763:7;12759:23;12755:32;12752:119;;;12790:79;;:::i;:::-;12752:119;12910:1;12935:67;12994:7;12985:6;12974:9;12970:22;12935:67;:::i;:::-;12925:77;;12881:131;12662:357;;;;:::o;13042:568::-;13115:8;13125:6;13175:3;13168:4;13160:6;13156:17;13152:27;13142:122;;13183:79;;:::i;:::-;13142:122;13296:6;13283:20;13273:30;;13326:18;13318:6;13315:30;13312:117;;;13348:79;;:::i;:::-;13312:117;13462:4;13454:6;13450:17;13438:29;;13516:3;13508:4;13500:6;13496:17;13486:8;13482:32;13479:41;13476:128;;;13523:79;;:::i;:::-;13476:128;13042:568;;;;;:::o;13616:559::-;13702:6;13710;13759:2;13747:9;13738:7;13734:23;13730:32;13727:119;;;13765:79;;:::i;:::-;13727:119;13913:1;13902:9;13898:17;13885:31;13943:18;13935:6;13932:30;13929:117;;;13965:79;;:::i;:::-;13929:117;14078:80;14150:7;14141:6;14130:9;14126:22;14078:80;:::i;:::-;14060:98;;;;13856:312;13616:559;;;;;:::o;14181:116::-;14251:21;14266:5;14251:21;:::i;:::-;14244:5;14241:32;14231:60;;14287:1;14284;14277:12;14231:60;14181:116;:::o;14303:133::-;14346:5;14384:6;14371:20;14362:29;;14400:30;14424:5;14400:30;:::i;:::-;14303:133;;;;:::o;14442:468::-;14507:6;14515;14564:2;14552:9;14543:7;14539:23;14535:32;14532:119;;;14570:79;;:::i;:::-;14532:119;14690:1;14715:53;14760:7;14751:6;14740:9;14736:22;14715:53;:::i;:::-;14705:63;;14661:117;14817:2;14843:50;14885:7;14876:6;14865:9;14861:22;14843:50;:::i;:::-;14833:60;;14788:115;14442:468;;;;;:::o;14933:568::-;15006:8;15016:6;15066:3;15059:4;15051:6;15047:17;15043:27;15033:122;;15074:79;;:::i;:::-;15033:122;15187:6;15174:20;15164:30;;15217:18;15209:6;15206:30;15203:117;;;15239:79;;:::i;:::-;15203:117;15353:4;15345:6;15341:17;15329:29;;15407:3;15399:4;15391:6;15387:17;15377:8;15373:32;15370:41;15367:128;;;15414:79;;:::i;:::-;15367:128;14933:568;;;;;:::o;15507:1141::-;15629:6;15637;15645;15653;15661;15669;15718:3;15706:9;15697:7;15693:23;15689:33;15686:120;;;15725:79;;:::i;:::-;15686:120;15845:1;15870:53;15915:7;15906:6;15895:9;15891:22;15870:53;:::i;:::-;15860:63;;15816:117;15972:2;15998:53;16043:7;16034:6;16023:9;16019:22;15998:53;:::i;:::-;15988:63;;15943:118;16100:2;16126:53;16171:7;16162:6;16151:9;16147:22;16126:53;:::i;:::-;16116:63;;16071:118;16228:2;16254:53;16299:7;16290:6;16279:9;16275:22;16254:53;:::i;:::-;16244:63;;16199:118;16384:3;16373:9;16369:19;16356:33;16416:18;16408:6;16405:30;16402:117;;;16438:79;;:::i;:::-;16402:117;16551:80;16623:7;16614:6;16603:9;16599:22;16551:80;:::i;:::-;16533:98;;;;16327:314;15507:1141;;;;;;;;:::o;16654:77::-;16691:7;16720:5;16709:16;;16654:77;;;:::o;16737:118::-;16824:24;16842:5;16824:24;:::i;:::-;16819:3;16812:37;16737:118;;:::o;16861:222::-;16954:4;16992:2;16981:9;16977:18;16969:26;;17005:71;17073:1;17062:9;17058:17;17049:6;17005:71;:::i;:::-;16861:222;;;;:::o;17089:117::-;17198:1;17195;17188:12;17212:180;17260:77;17257:1;17250:88;17357:4;17354:1;17347:15;17381:4;17378:1;17371:15;17398:281;17481:27;17503:4;17481:27;:::i;:::-;17473:6;17469:40;17611:6;17599:10;17596:22;17575:18;17563:10;17560:34;17557:62;17554:88;;;17622:18;;:::i;:::-;17554:88;17662:10;17658:2;17651:22;17441:238;17398:281;;:::o;17685:129::-;17719:6;17746:20;;:::i;:::-;17736:30;;17775:33;17803:4;17795:6;17775:33;:::i;:::-;17685:129;;;:::o;17820:307::-;17881:4;17971:18;17963:6;17960:30;17957:56;;;17993:18;;:::i;:::-;17957:56;18031:29;18053:6;18031:29;:::i;:::-;18023:37;;18115:4;18109;18105:15;18097:23;;17820:307;;;:::o;18133:146::-;18230:6;18225:3;18220;18207:30;18271:1;18262:6;18257:3;18253:16;18246:27;18133:146;;;:::o;18285:423::-;18362:5;18387:65;18403:48;18444:6;18403:48;:::i;:::-;18387:65;:::i;:::-;18378:74;;18475:6;18468:5;18461:21;18513:4;18506:5;18502:16;18551:3;18542:6;18537:3;18533:16;18530:25;18527:112;;;18558:79;;:::i;:::-;18527:112;18648:54;18695:6;18690:3;18685;18648:54;:::i;:::-;18368:340;18285:423;;;;;:::o;18727:338::-;18782:5;18831:3;18824:4;18816:6;18812:17;18808:27;18798:122;;18839:79;;:::i;:::-;18798:122;18956:6;18943:20;18981:78;19055:3;19047:6;19040:4;19032:6;19028:17;18981:78;:::i;:::-;18972:87;;18788:277;18727:338;;;;:::o;19071:943::-;19166:6;19174;19182;19190;19239:3;19227:9;19218:7;19214:23;19210:33;19207:120;;;19246:79;;:::i;:::-;19207:120;19366:1;19391:53;19436:7;19427:6;19416:9;19412:22;19391:53;:::i;:::-;19381:63;;19337:117;19493:2;19519:53;19564:7;19555:6;19544:9;19540:22;19519:53;:::i;:::-;19509:63;;19464:118;19621:2;19647:53;19692:7;19683:6;19672:9;19668:22;19647:53;:::i;:::-;19637:63;;19592:118;19777:2;19766:9;19762:18;19749:32;19808:18;19800:6;19797:30;19794:117;;;19830:79;;:::i;:::-;19794:117;19935:62;19989:7;19980:6;19969:9;19965:22;19935:62;:::i;:::-;19925:72;;19720:287;19071:943;;;;;;;:::o;20020:122::-;20093:24;20111:5;20093:24;:::i;:::-;20086:5;20083:35;20073:63;;20132:1;20129;20122:12;20073:63;20020:122;:::o;20148:139::-;20194:5;20232:6;20219:20;20210:29;;20248:33;20275:5;20248:33;:::i;:::-;20148:139;;;;:::o;20293:329::-;20352:6;20401:2;20389:9;20380:7;20376:23;20372:32;20369:119;;;20407:79;;:::i;:::-;20369:119;20527:1;20552:53;20597:7;20588:6;20577:9;20573:22;20552:53;:::i;:::-;20542:63;;20498:117;20293:329;;;;:::o;20628:180::-;20676:77;20673:1;20666:88;20773:4;20770:1;20763:15;20797:4;20794:1;20787:15;20814:119;20901:1;20894:5;20891:12;20881:46;;20907:18;;:::i;:::-;20881:46;20814:119;:::o;20939:139::-;20990:7;21019:5;21008:16;;21025:47;21066:5;21025:47;:::i;:::-;20939:139;;;:::o;21084:::-;21146:9;21179:38;21211:5;21179:38;:::i;:::-;21166:51;;21084:139;;;:::o;21229:155::-;21328:49;21371:5;21328:49;:::i;:::-;21323:3;21316:62;21229:155;;:::o;21390:246::-;21495:4;21533:2;21522:9;21518:18;21510:26;;21546:83;21626:1;21615:9;21611:17;21602:6;21546:83;:::i;:::-;21390:246;;;;:::o;21642:308::-;21704:4;21794:18;21786:6;21783:30;21780:56;;;21816:18;;:::i;:::-;21780:56;21854:29;21876:6;21854:29;:::i;:::-;21846:37;;21938:4;21932;21928:15;21920:23;;21642:308;;;:::o;21956:425::-;22034:5;22059:66;22075:49;22117:6;22075:49;:::i;:::-;22059:66;:::i;:::-;22050:75;;22148:6;22141:5;22134:21;22186:4;22179:5;22175:16;22224:3;22215:6;22210:3;22206:16;22203:25;22200:112;;;22231:79;;:::i;:::-;22200:112;22321:54;22368:6;22363:3;22358;22321:54;:::i;:::-;22040:341;21956:425;;;;;:::o;22401:340::-;22457:5;22506:3;22499:4;22491:6;22487:17;22483:27;22473:122;;22514:79;;:::i;:::-;22473:122;22631:6;22618:20;22656:79;22731:3;22723:6;22716:4;22708:6;22704:17;22656:79;:::i;:::-;22647:88;;22463:278;22401:340;;;;:::o;22747:509::-;22816:6;22865:2;22853:9;22844:7;22840:23;22836:32;22833:119;;;22871:79;;:::i;:::-;22833:119;23019:1;23008:9;23004:17;22991:31;23049:18;23041:6;23038:30;23035:117;;;23071:79;;:::i;:::-;23035:117;23176:63;23231:7;23222:6;23211:9;23207:22;23176:63;:::i;:::-;23166:73;;22962:287;22747:509;;;;:::o;23262:474::-;23330:6;23338;23387:2;23375:9;23366:7;23362:23;23358:32;23355:119;;;23393:79;;:::i;:::-;23355:119;23513:1;23538:53;23583:7;23574:6;23563:9;23559:22;23538:53;:::i;:::-;23528:63;;23484:117;23640:2;23666:53;23711:7;23702:6;23691:9;23687:22;23666:53;:::i;:::-;23656:63;;23611:118;23262:474;;;;;:::o;23742:::-;23810:6;23818;23867:2;23855:9;23846:7;23842:23;23838:32;23835:119;;;23873:79;;:::i;:::-;23835:119;23993:1;24018:53;24063:7;24054:6;24043:9;24039:22;24018:53;:::i;:::-;24008:63;;23964:117;24120:2;24146:53;24191:7;24182:6;24171:9;24167:22;24146:53;:::i;:::-;24136:63;;24091:118;23742:474;;;;;:::o;24222:180::-;24270:77;24267:1;24260:88;24367:4;24364:1;24357:15;24391:4;24388:1;24381:15;24408:320;24452:6;24489:1;24483:4;24479:12;24469:22;;24536:1;24530:4;24526:12;24557:18;24547:81;;24613:4;24605:6;24601:17;24591:27;;24547:81;24675:2;24667:6;24664:14;24644:18;24641:38;24638:84;;24694:18;;:::i;:::-;24638:84;24459:269;24408:320;;;:::o;24734:164::-;24874:16;24870:1;24862:6;24858:14;24851:40;24734:164;:::o;24904:366::-;25046:3;25067:67;25131:2;25126:3;25067:67;:::i;:::-;25060:74;;25143:93;25232:3;25143:93;:::i;:::-;25261:2;25256:3;25252:12;25245:19;;24904:366;;;:::o;25276:419::-;25442:4;25480:2;25469:9;25465:18;25457:26;;25529:9;25523:4;25519:20;25515:1;25504:9;25500:17;25493:47;25557:131;25683:4;25557:131;:::i;:::-;25549:139;;25276:419;;;:::o;25701:79::-;25740:7;25769:5;25758:16;;25701:79;;;:::o;25786:157::-;25891:45;25911:24;25929:5;25911:24;:::i;:::-;25891:45;:::i;:::-;25886:3;25879:58;25786:157;;:::o;25949:94::-;25982:8;26030:5;26026:2;26022:14;26001:35;;25949:94;;;:::o;26049:::-;26088:7;26117:20;26131:5;26117:20;:::i;:::-;26106:31;;26049:94;;;:::o;26149:100::-;26188:7;26217:26;26237:5;26217:26;:::i;:::-;26206:37;;26149:100;;;:::o;26255:157::-;26360:45;26380:24;26398:5;26380:24;:::i;:::-;26360:45;:::i;:::-;26355:3;26348:58;26255:157;;:::o;26418:148::-;26520:11;26557:3;26542:18;;26418:148;;;;:::o;26596:330::-;26712:3;26733:89;26815:6;26810:3;26733:89;:::i;:::-;26726:96;;26832:56;26881:6;26876:3;26869:5;26832:56;:::i;:::-;26913:6;26908:3;26904:16;26897:23;;26596:330;;;;;:::o;26932:577::-;27130:3;27145:75;27216:3;27207:6;27145:75;:::i;:::-;27245:2;27240:3;27236:12;27229:19;;27258:75;27329:3;27320:6;27258:75;:::i;:::-;27358:2;27353:3;27349:12;27342:19;;27378:105;27479:3;27470:6;27462;27378:105;:::i;:::-;27371:112;;27500:3;27493:10;;26932:577;;;;;;;:::o;27515:180::-;27563:77;27560:1;27553:88;27660:4;27657:1;27650:15;27684:4;27681:1;27674:15;27701:176;27733:1;27750:20;27768:1;27750:20;:::i;:::-;27745:25;;27784:20;27802:1;27784:20;:::i;:::-;27779:25;;27823:1;27813:35;;27828:18;;:::i;:::-;27813:35;27869:1;27866;27862:9;27857:14;;27701:176;;;;:::o;27883:180::-;27931:77;27928:1;27921:88;28028:4;28025:1;28018:15;28052:4;28049:1;28042:15;28069:180;28117:77;28114:1;28107:88;28214:4;28211:1;28204:15;28238:4;28235:1;28228:15;28255:194;28295:4;28315:20;28333:1;28315:20;:::i;:::-;28310:25;;28349:20;28367:1;28349:20;:::i;:::-;28344:25;;28393:1;28390;28386:9;28378:17;;28417:1;28411:4;28408:11;28405:37;;;28422:18;;:::i;:::-;28405:37;28255:194;;;;:::o;28455:180::-;28503:77;28500:1;28493:88;28600:4;28597:1;28590:15;28624:4;28621:1;28614:15;28641:233;28680:3;28703:24;28721:5;28703:24;:::i;:::-;28694:33;;28749:66;28742:5;28739:77;28736:103;;28819:18;;:::i;:::-;28736:103;28866:1;28859:5;28855:13;28848:20;;28641:233;;;:::o;28880:410::-;28920:7;28943:20;28961:1;28943:20;:::i;:::-;28938:25;;28977:20;28995:1;28977:20;:::i;:::-;28972:25;;29032:1;29029;29025:9;29054:30;29072:11;29054:30;:::i;:::-;29043:41;;29233:1;29224:7;29220:15;29217:1;29214:22;29194:1;29187:9;29167:83;29144:139;;29263:18;;:::i;:::-;29144:139;28928:362;28880:410;;;;:::o;29296:185::-;29336:1;29353:20;29371:1;29353:20;:::i;:::-;29348:25;;29387:20;29405:1;29387:20;:::i;:::-;29382:25;;29426:1;29416:35;;29431:18;;:::i;:::-;29416:35;29473:1;29470;29466:9;29461:14;;29296:185;;;;:::o;29487:147::-;29588:11;29625:3;29610:18;;29487:147;;;;:::o;29640:114::-;;:::o;29760:398::-;29919:3;29940:83;30021:1;30016:3;29940:83;:::i;:::-;29933:90;;30032:93;30121:3;30032:93;:::i;:::-;30150:1;30145:3;30141:11;30134:18;;29760:398;;;:::o;30164:379::-;30348:3;30370:147;30513:3;30370:147;:::i;:::-;30363:154;;30534:3;30527:10;;30164:379;;;:::o;30549:165::-;30689:17;30685:1;30677:6;30673:14;30666:41;30549:165;:::o;30720:366::-;30862:3;30883:67;30947:2;30942:3;30883:67;:::i;:::-;30876:74;;30959:93;31048:3;30959:93;:::i;:::-;31077:2;31072:3;31068:12;31061:19;;30720:366;;;:::o;31092:419::-;31258:4;31296:2;31285:9;31281:18;31273:26;;31345:9;31339:4;31335:20;31331:1;31320:9;31316:17;31309:47;31373:131;31499:4;31373:131;:::i;:::-;31365:139;;31092:419;;;:::o;31517:158::-;31657:10;31653:1;31645:6;31641:14;31634:34;31517:158;:::o;31681:365::-;31823:3;31844:66;31908:1;31903:3;31844:66;:::i;:::-;31837:73;;31919:93;32008:3;31919:93;:::i;:::-;32037:2;32032:3;32028:12;32021:19;;31681:365;;;:::o;32052:419::-;32218:4;32256:2;32245:9;32241:18;32233:26;;32305:9;32299:4;32295:20;32291:1;32280:9;32276:17;32269:47;32333:131;32459:4;32333:131;:::i;:::-;32325:139;;32052:419;;;:::o;32477:169::-;32617:21;32613:1;32605:6;32601:14;32594:45;32477:169;:::o;32652:366::-;32794:3;32815:67;32879:2;32874:3;32815:67;:::i;:::-;32808:74;;32891:93;32980:3;32891:93;:::i;:::-;33009:2;33004:3;33000:12;32993:19;;32652:366;;;:::o;33024:419::-;33190:4;33228:2;33217:9;33213:18;33205:26;;33277:9;33271:4;33267:20;33263:1;33252:9;33248:17;33241:47;33305:131;33431:4;33305:131;:::i;:::-;33297:139;;33024:419;;;:::o;33449:191::-;33489:3;33508:20;33526:1;33508:20;:::i;:::-;33503:25;;33542:20;33560:1;33542:20;:::i;:::-;33537:25;;33585:1;33582;33578:9;33571:16;;33606:3;33603:1;33600:10;33597:36;;;33613:18;;:::i;:::-;33597:36;33449:191;;;;:::o;33646:169::-;33786:21;33782:1;33774:6;33770:14;33763:45;33646:169;:::o;33821:366::-;33963:3;33984:67;34048:2;34043:3;33984:67;:::i;:::-;33977:74;;34060:93;34149:3;34060:93;:::i;:::-;34178:2;34173:3;34169:12;34162:19;;33821:366;;;:::o;34193:419::-;34359:4;34397:2;34386:9;34382:18;34374:26;;34446:9;34440:4;34436:20;34432:1;34421:9;34417:17;34410:47;34474:131;34600:4;34474:131;:::i;:::-;34466:139;;34193:419;;;:::o;34618:182::-;34758:34;34754:1;34746:6;34742:14;34735:58;34618:182;:::o;34806:366::-;34948:3;34969:67;35033:2;35028:3;34969:67;:::i;:::-;34962:74;;35045:93;35134:3;35045:93;:::i;:::-;35163:2;35158:3;35154:12;35147:19;;34806:366;;;:::o;35178:419::-;35344:4;35382:2;35371:9;35367:18;35359:26;;35431:9;35425:4;35421:20;35417:1;35406:9;35402:17;35395:47;35459:131;35585:4;35459:131;:::i;:::-;35451:139;;35178:419;;;:::o;35603:227::-;35743:34;35739:1;35731:6;35727:14;35720:58;35812:10;35807:2;35799:6;35795:15;35788:35;35603:227;:::o;35836:366::-;35978:3;35999:67;36063:2;36058:3;35999:67;:::i;:::-;35992:74;;36075:93;36164:3;36075:93;:::i;:::-;36193:2;36188:3;36184:12;36177:19;;35836:366;;;:::o;36208:419::-;36374:4;36412:2;36401:9;36397:18;36389:26;;36461:9;36455:4;36451:20;36447:1;36436:9;36432:17;36425:47;36489:131;36615:4;36489:131;:::i;:::-;36481:139;;36208:419;;;:::o;36633:168::-;36773:20;36769:1;36761:6;36757:14;36750:44;36633:168;:::o;36807:366::-;36949:3;36970:67;37034:2;37029:3;36970:67;:::i;:::-;36963:74;;37046:93;37135:3;37046:93;:::i;:::-;37164:2;37159:3;37155:12;37148:19;;36807:366;;;:::o;37179:419::-;37345:4;37383:2;37372:9;37368:18;37360:26;;37432:9;37426:4;37422:20;37418:1;37407:9;37403:17;37396:47;37460:131;37586:4;37460:131;:::i;:::-;37452:139;;37179:419;;;:::o;37604:228::-;37744:34;37740:1;37732:6;37728:14;37721:58;37813:11;37808:2;37800:6;37796:15;37789:36;37604:228;:::o;37838:366::-;37980:3;38001:67;38065:2;38060:3;38001:67;:::i;:::-;37994:74;;38077:93;38166:3;38077:93;:::i;:::-;38195:2;38190:3;38186:12;38179:19;;37838:366;;;:::o;38210:419::-;38376:4;38414:2;38403:9;38399:18;38391:26;;38463:9;38457:4;38453:20;38449:1;38438:9;38434:17;38427:47;38491:131;38617:4;38491:131;:::i;:::-;38483:139;;38210:419;;;:::o;38635:228::-;38775:34;38771:1;38763:6;38759:14;38752:58;38844:11;38839:2;38831:6;38827:15;38820:36;38635:228;:::o;38869:366::-;39011:3;39032:67;39096:2;39091:3;39032:67;:::i;:::-;39025:74;;39108:93;39197:3;39108:93;:::i;:::-;39226:2;39221:3;39217:12;39210:19;;38869:366;;;:::o;39241:419::-;39407:4;39445:2;39434:9;39430:18;39422:26;;39494:9;39488:4;39484:20;39480:1;39469:9;39465:17;39458:47;39522:131;39648:4;39522:131;:::i;:::-;39514:139;;39241:419;;;:::o;39666:181::-;39806:33;39802:1;39794:6;39790:14;39783:57;39666:181;:::o;39853:366::-;39995:3;40016:67;40080:2;40075:3;40016:67;:::i;:::-;40009:74;;40092:93;40181:3;40092:93;:::i;:::-;40210:2;40205:3;40201:12;40194:19;;39853:366;;;:::o;40225:419::-;40391:4;40429:2;40418:9;40414:18;40406:26;;40478:9;40472:4;40468:20;40464:1;40453:9;40449:17;40442:47;40506:131;40632:4;40506:131;:::i;:::-;40498:139;;40225:419;;;:::o;40650:181::-;40790:33;40786:1;40778:6;40774:14;40767:57;40650:181;:::o;40837:366::-;40979:3;41000:67;41064:2;41059:3;41000:67;:::i;:::-;40993:74;;41076:93;41165:3;41076:93;:::i;:::-;41194:2;41189:3;41185:12;41178:19;;40837:366;;;:::o;41209:419::-;41375:4;41413:2;41402:9;41398:18;41390:26;;41462:9;41456:4;41452:20;41448:1;41437:9;41433:17;41426:47;41490:131;41616:4;41490:131;:::i;:::-;41482:139;;41209:419;;;:::o;41634:163::-;41774:15;41770:1;41762:6;41758:14;41751:39;41634:163;:::o;41803:366::-;41945:3;41966:67;42030:2;42025:3;41966:67;:::i;:::-;41959:74;;42042:93;42131:3;42042:93;:::i;:::-;42160:2;42155:3;42151:12;42144:19;;41803:366;;;:::o;42175:419::-;42341:4;42379:2;42368:9;42364:18;42356:26;;42428:9;42422:4;42418:20;42414:1;42403:9;42399:17;42392:47;42456:131;42582:4;42456:131;:::i;:::-;42448:139;;42175:419;;;:::o;42600:175::-;42740:27;42736:1;42728:6;42724:14;42717:51;42600:175;:::o;42781:366::-;42923:3;42944:67;43008:2;43003:3;42944:67;:::i;:::-;42937:74;;43020:93;43109:3;43020:93;:::i;:::-;43138:2;43133:3;43129:12;43122:19;;42781:366;;;:::o;43153:419::-;43319:4;43357:2;43346:9;43342:18;43334:26;;43406:9;43400:4;43396:20;43392:1;43381:9;43377:17;43370:47;43434:131;43560:4;43434:131;:::i;:::-;43426:139;;43153:419;;;:::o;43578:141::-;43627:4;43650:3;43642:11;;43673:3;43670:1;43663:14;43707:4;43704:1;43694:18;43686:26;;43578:141;;;:::o;43749:874::-;43852:3;43889:5;43883:12;43918:36;43944:9;43918:36;:::i;:::-;43970:89;44052:6;44047:3;43970:89;:::i;:::-;43963:96;;44090:1;44079:9;44075:17;44106:1;44101:166;;;;44281:1;44276:341;;;;44068:549;;44101:166;44185:4;44181:9;44170;44166:25;44161:3;44154:38;44247:6;44240:14;44233:22;44225:6;44221:35;44216:3;44212:45;44205:52;;44101:166;;44276:341;44343:38;44375:5;44343:38;:::i;:::-;44403:1;44417:154;44431:6;44428:1;44425:13;44417:154;;;44505:7;44499:14;44495:1;44490:3;44486:11;44479:35;44555:1;44546:7;44542:15;44531:26;;44453:4;44450:1;44446:12;44441:17;;44417:154;;;44600:6;44595:3;44591:16;44584:23;;44283:334;;44068:549;;43856:767;;43749:874;;;;:::o;44629:390::-;44735:3;44763:39;44796:5;44763:39;:::i;:::-;44818:89;44900:6;44895:3;44818:89;:::i;:::-;44811:96;;44916:65;44974:6;44969:3;44962:4;44955:5;44951:16;44916:65;:::i;:::-;45006:6;45001:3;44997:16;44990:23;;44739:280;44629:390;;;;:::o;45025:155::-;45165:7;45161:1;45153:6;45149:14;45142:31;45025:155;:::o;45186:400::-;45346:3;45367:84;45449:1;45444:3;45367:84;:::i;:::-;45360:91;;45460:93;45549:3;45460:93;:::i;:::-;45578:1;45573:3;45569:11;45562:18;;45186:400;;;:::o;45592:695::-;45870:3;45892:92;45980:3;45971:6;45892:92;:::i;:::-;45885:99;;46001:95;46092:3;46083:6;46001:95;:::i;:::-;45994:102;;46113:148;46257:3;46113:148;:::i;:::-;46106:155;;46278:3;46271:10;;45592:695;;;;;:::o;46293:93::-;46330:6;46377:2;46372;46365:5;46361:14;46357:23;46347:33;;46293:93;;;:::o;46392:107::-;46436:8;46486:5;46480:4;46476:16;46455:37;;46392:107;;;;:::o;46505:393::-;46574:6;46624:1;46612:10;46608:18;46647:97;46677:66;46666:9;46647:97;:::i;:::-;46765:39;46795:8;46784:9;46765:39;:::i;:::-;46753:51;;46837:4;46833:9;46826:5;46822:21;46813:30;;46886:4;46876:8;46872:19;46865:5;46862:30;46852:40;;46581:317;;46505:393;;;;;:::o;46904:142::-;46954:9;46987:53;47005:34;47014:24;47032:5;47014:24;:::i;:::-;47005:34;:::i;:::-;46987:53;:::i;:::-;46974:66;;46904:142;;;:::o;47052:75::-;47095:3;47116:5;47109:12;;47052:75;;;:::o;47133:269::-;47243:39;47274:7;47243:39;:::i;:::-;47304:91;47353:41;47377:16;47353:41;:::i;:::-;47345:6;47338:4;47332:11;47304:91;:::i;:::-;47298:4;47291:105;47209:193;47133:269;;;:::o;47408:73::-;47453:3;47408:73;:::o;47487:189::-;47564:32;;:::i;:::-;47605:65;47663:6;47655;47649:4;47605:65;:::i;:::-;47540:136;47487:189;;:::o;47682:186::-;47742:120;47759:3;47752:5;47749:14;47742:120;;;47813:39;47850:1;47843:5;47813:39;:::i;:::-;47786:1;47779:5;47775:13;47766:22;;47742:120;;;47682:186;;:::o;47874:543::-;47975:2;47970:3;47967:11;47964:446;;;48009:38;48041:5;48009:38;:::i;:::-;48093:29;48111:10;48093:29;:::i;:::-;48083:8;48079:44;48276:2;48264:10;48261:18;48258:49;;;48297:8;48282:23;;48258:49;48320:80;48376:22;48394:3;48376:22;:::i;:::-;48366:8;48362:37;48349:11;48320:80;:::i;:::-;47979:431;;47964:446;47874:543;;;:::o;48423:117::-;48477:8;48527:5;48521:4;48517:16;48496:37;;48423:117;;;;:::o;48546:169::-;48590:6;48623:51;48671:1;48667:6;48659:5;48656:1;48652:13;48623:51;:::i;:::-;48619:56;48704:4;48698;48694:15;48684:25;;48597:118;48546:169;;;;:::o;48720:295::-;48796:4;48942:29;48967:3;48961:4;48942:29;:::i;:::-;48934:37;;49004:3;49001:1;48997:11;48991:4;48988:21;48980:29;;48720:295;;;;:::o;49020:1395::-;49137:37;49170:3;49137:37;:::i;:::-;49239:18;49231:6;49228:30;49225:56;;;49261:18;;:::i;:::-;49225:56;49305:38;49337:4;49331:11;49305:38;:::i;:::-;49390:67;49450:6;49442;49436:4;49390:67;:::i;:::-;49484:1;49508:4;49495:17;;49540:2;49532:6;49529:14;49557:1;49552:618;;;;50214:1;50231:6;50228:77;;;50280:9;50275:3;50271:19;50265:26;50256:35;;50228:77;50331:67;50391:6;50384:5;50331:67;:::i;:::-;50325:4;50318:81;50187:222;49522:887;;49552:618;49604:4;49600:9;49592:6;49588:22;49638:37;49670:4;49638:37;:::i;:::-;49697:1;49711:208;49725:7;49722:1;49719:14;49711:208;;;49804:9;49799:3;49795:19;49789:26;49781:6;49774:42;49855:1;49847:6;49843:14;49833:24;;49902:2;49891:9;49887:18;49874:31;;49748:4;49745:1;49741:12;49736:17;;49711:208;;;49947:6;49938:7;49935:19;49932:179;;;50005:9;50000:3;49996:19;49990:26;50048:48;50090:4;50082:6;50078:17;50067:9;50048:48;:::i;:::-;50040:6;50033:64;49955:156;49932:179;50157:1;50153;50145:6;50141:14;50137:22;50131:4;50124:36;49559:611;;;49522:887;;49112:1303;;;49020:1395;;:::o;50421:225::-;50561:34;50557:1;50549:6;50545:14;50538:58;50630:8;50625:2;50617:6;50613:15;50606:33;50421:225;:::o;50652:366::-;50794:3;50815:67;50879:2;50874:3;50815:67;:::i;:::-;50808:74;;50891:93;50980:3;50891:93;:::i;:::-;51009:2;51004:3;51000:12;50993:19;;50652:366;;;:::o;51024:419::-;51190:4;51228:2;51217:9;51213:18;51205:26;;51277:9;51271:4;51267:20;51263:1;51252:9;51248:17;51241:47;51305:131;51431:4;51305:131;:::i;:::-;51297:139;;51024:419;;;:::o;51449:182::-;51589:34;51585:1;51577:6;51573:14;51566:58;51449:182;:::o;51637:366::-;51779:3;51800:67;51864:2;51859:3;51800:67;:::i;:::-;51793:74;;51876:93;51965:3;51876:93;:::i;:::-;51994:2;51989:3;51985:12;51978:19;;51637:366;;;:::o;52009:419::-;52175:4;52213:2;52202:9;52198:18;52190:26;;52262:9;52256:4;52252:20;52248:1;52237:9;52233:17;52226:47;52290:131;52416:4;52290:131;:::i;:::-;52282:139;;52009:419;;;:::o;52434:229::-;52574:34;52570:1;52562:6;52558:14;52551:58;52643:12;52638:2;52630:6;52626:15;52619:37;52434:229;:::o;52669:366::-;52811:3;52832:67;52896:2;52891:3;52832:67;:::i;:::-;52825:74;;52908:93;52997:3;52908:93;:::i;:::-;53026:2;53021:3;53017:12;53010:19;;52669:366;;;:::o;53041:419::-;53207:4;53245:2;53234:9;53230:18;53222:26;;53294:9;53288:4;53284:20;53280:1;53269:9;53265:17;53258:47;53322:131;53448:4;53322:131;:::i;:::-;53314:139;;53041:419;;;:::o;53466:175::-;53606:27;53602:1;53594:6;53590:14;53583:51;53466:175;:::o;53647:366::-;53789:3;53810:67;53874:2;53869:3;53810:67;:::i;:::-;53803:74;;53886:93;53975:3;53886:93;:::i;:::-;54004:2;53999:3;53995:12;53988:19;;53647:366;;;:::o;54019:419::-;54185:4;54223:2;54212:9;54208:18;54200:26;;54272:9;54266:4;54262:20;54258:1;54247:9;54243:17;54236:47;54300:131;54426:4;54300:131;:::i;:::-;54292:139;;54019:419;;;:::o;54444:332::-;54565:4;54603:2;54592:9;54588:18;54580:26;;54616:71;54684:1;54673:9;54669:17;54660:6;54616:71;:::i;:::-;54697:72;54765:2;54754:9;54750:18;54741:6;54697:72;:::i;:::-;54444:332;;;;;:::o;54782:137::-;54836:5;54867:6;54861:13;54852:22;;54883:30;54907:5;54883:30;:::i;:::-;54782:137;;;;:::o;54925:345::-;54992:6;55041:2;55029:9;55020:7;55016:23;55012:32;55009:119;;;55047:79;;:::i;:::-;55009:119;55167:1;55192:61;55245:7;55236:6;55225:9;55221:22;55192:61;:::i;:::-;55182:71;;55138:125;54925:345;;;;:::o;55276:553::-;55453:4;55491:3;55480:9;55476:19;55468:27;;55505:71;55573:1;55562:9;55558:17;55549:6;55505:71;:::i;:::-;55586:72;55654:2;55643:9;55639:18;55630:6;55586:72;:::i;:::-;55668;55736:2;55725:9;55721:18;55712:6;55668:72;:::i;:::-;55750;55818:2;55807:9;55803:18;55794:6;55750:72;:::i;:::-;55276:553;;;;;;;:::o;55835:79::-;55874:7;55903:5;55892:16;;55835:79;;;:::o;55920:157::-;56025:45;56045:24;56063:5;56045:24;:::i;:::-;56025:45;:::i;:::-;56020:3;56013:58;55920:157;;:::o;56083:256::-;56195:3;56210:75;56281:3;56272:6;56210:75;:::i;:::-;56310:2;56305:3;56301:12;56294:19;;56330:3;56323:10;;56083:256;;;;:::o;56345:98::-;56396:6;56430:5;56424:12;56414:22;;56345:98;;;:::o;56449:168::-;56532:11;56566:6;56561:3;56554:19;56606:4;56601:3;56597:14;56582:29;;56449:168;;;;:::o;56623:373::-;56709:3;56737:38;56769:5;56737:38;:::i;:::-;56791:70;56854:6;56849:3;56791:70;:::i;:::-;56784:77;;56870:65;56928:6;56923:3;56916:4;56909:5;56905:16;56870:65;:::i;:::-;56960:29;56982:6;56960:29;:::i;:::-;56955:3;56951:39;56944:46;;56713:283;56623:373;;;;:::o;57002:640::-;57197:4;57235:3;57224:9;57220:19;57212:27;;57249:71;57317:1;57306:9;57302:17;57293:6;57249:71;:::i;:::-;57330:72;57398:2;57387:9;57383:18;57374:6;57330:72;:::i;:::-;57412;57480:2;57469:9;57465:18;57456:6;57412:72;:::i;:::-;57531:9;57525:4;57521:20;57516:2;57505:9;57501:18;57494:48;57559:76;57630:4;57621:6;57559:76;:::i;:::-;57551:84;;57002:640;;;;;;;:::o;57648:141::-;57704:5;57735:6;57729:13;57720:22;;57751:32;57777:5;57751:32;:::i;:::-;57648:141;;;;:::o;57795:349::-;57864:6;57913:2;57901:9;57892:7;57888:23;57884:32;57881:119;;;57919:79;;:::i;:::-;57881:119;58039:1;58064:63;58119:7;58110:6;58099:9;58095:22;58064:63;:::i;:::-;58054:73;;58010:127;57795:349;;;;:::o

Swarm Source

ipfs://7627f2d495de670af6ed7477494856ac6464217445e4481698068227bfc1e5fe
Loading...
Loading
Loading...
Loading
[ 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.