ETH Price: $3,253.27 (+2.45%)
Gas: 2 Gwei

Token

Naetion NFT (NaetionNFT)
 

Overview

Max Total Supply

90 NaetionNFT

Holders

49

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 NaetionNFT
0x1cbf65f389dd06733b5b5660cfccb0c3ae91f777
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:
NaetionNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-04
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.7; 
library MerkleProof {
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }
   function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}
abstract contract ReentrancyGuard { 
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
   _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    function toString(uint256 value) internal pure returns (string memory) { 
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
 
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }
 
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
 
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    } 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

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

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


}

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

    // Mapping from token ID to approved address.
    mapping(uint256 => address) private _tokenApprovals;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

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

contract NaetionNFT is ERC721A, Ownable {
    using Strings for uint256;
    using SafeMath for uint256;

    uint256 public collectionSize = 10000;

    string public uri_common = "https://bafybeifhw35n36bsbuhlxbamk53axfufvcgdewtuptgofzz22dbehw3wsm.ipfs.nftstorage.link/";
    function setBaseURI(string memory baseURI) public onlyOwner {
        uri_common = baseURI;
    }

    uint256 public price_Public = 0.05 ether;
    uint256 public price_WL = 0.05 ether;
    function setPrice_WL(uint256 number) public onlyOwner() {
        price_WL = number;
    }
    function setPrice_Public(uint256 number) public onlyOwner() {
        price_Public = number;
    }

    bool public status_Public = false;
    bool public status_WL = false;
    bool public status_Freemint = false;
    function switch_WL(bool s) public onlyOwner {
        status_WL = s;
    }
    function switch_Public(bool s) public onlyOwner {
        status_Public = s;
    }
    function switch_Freemint(bool s) public onlyOwner {
        status_Freemint = s;
    }

    uint256 public mint_perAdd = 3;
    function setMaxPerAdd(uint256 number) public onlyOwner {
        mint_perAdd = number;
    }

    uint256 public reserve = 50;
    function setReserve(uint256 number) public onlyOwner {
        reserve = number;
    }
    function giveaway(address recipient, uint256 quantity) public onlyOwner {
        require(totalSupply().add(quantity) <= collectionSize, "Giveaway exceeds current batch!!!");
        require(reserve - quantity >= 0, "No more reserved remaining!!");
        _safeMint(recipient, quantity);
        reserve -= quantity;
    }

    bytes32 public merkleRoot_WL = 0x11f30a2580e5ee774c926ab8a5f49203945b36b82105cdc90233ebaf06b196eb;
    bytes32 public merkleRoot_Free = 0xdc7610d4723665d6db6b3bd694ccc1ba7e4851d78f92c25276b6f7739e05a63b;
    function setMerkleRoot_WL(bytes32 m) public onlyOwner{
        merkleRoot_WL = m;
    }
    function setMerkleRoot_Free(bytes32 m) public onlyOwner{
        merkleRoot_Free = m;
    }

    uint256 public phase_Id = 1500;
    function setPhase_Id(uint256 number) public onlyOwner {
        require(number <= collectionSize, "Input exceeds max collection size");
        phase_Id = number;
    }

    constructor() ERC721A("Naetion NFT", "NaetionNFT")  {}

    function mint_WL(uint256 quantity, bytes32[] calldata merkleproof) public payable {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify( merkleproof, merkleRoot_WL, leaf),"Not whitelisted");
        
        require(status_WL, "Whitelist Minting not active!!");
        require(numberMinted(msg.sender).add(quantity) <= mint_perAdd && quantity > 0, "Invalid mint quantity!!");
        require(quantity.mul(price_WL) <= msg.value, "Insufficient eth sent for mint!!");
        require(totalSupply().add(quantity) <= phase_Id - reserve, "Mint exceeds Collection size!!");
        
        _safeMint(msg.sender, quantity);

        if(totalSupply() >= phase_Id) {
            status_WL = false;
            status_Public = false;
            status_Freemint = false;
        }
    }
    function mint_Public(uint256 quantity) public payable {
        require(status_Public, "Minting not active!!");
        require(numberMinted(msg.sender).add(quantity) <= mint_perAdd && quantity > 0, "Invalid mint quantity!!");
        require(quantity.mul(price_Public) <= msg.value, "Insufficient eth sent for mint!!");
        require(totalSupply().add(quantity) <= phase_Id - reserve, "Mint exceeds Collection size!!");
        
        _safeMint(msg.sender, quantity);
        
        if(totalSupply() >= phase_Id) {
            status_WL = false;
            status_Public = false;
            status_Freemint = false;
        }
    }
    function mint_Free(uint256 quantity, bytes32[] calldata merkleproof) public {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify( merkleproof, merkleRoot_Free, leaf),"Not whitelisted");

        require(status_Freemint, "Free Minting not active!!");
        require(numberMinted(msg.sender).add(quantity) <= mint_perAdd && quantity > 0, "Invalid mint quantity!!");
        require(totalSupply().add(quantity) <= phase_Id - reserve, "Mint exceeds Collection size!!");

        _safeMint(msg.sender, quantity);
        
        if(totalSupply() >= phase_Id) {
            status_WL = false;
            status_Public = false;
            status_Freemint = false;
        }
    }

    function withdraw() public onlyOwner {
        (bool response, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(response, "Reward distribution failed");
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(uri_common, (tokenId).toString(), ".json"));
    }
    function _startTokenId() pure internal override returns (uint256) {
        return 1;
    }
    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","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":"merkleRoot_Free","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot_WL","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleproof","type":"bytes32[]"}],"name":"mint_Free","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint_Public","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleproof","type":"bytes32[]"}],"name":"mint_WL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint_perAdd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","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":"phase_Id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price_Public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setMaxPerAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"m","type":"bytes32"}],"name":"setMerkleRoot_Free","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"m","type":"bytes32"}],"name":"setMerkleRoot_WL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setPhase_Id","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setPrice_Public","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setPrice_WL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status_Freemint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"status_Public","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"status_WL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"s","type":"bool"}],"name":"switch_Freemint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"s","type":"bool"}],"name":"switch_Public","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"s","type":"bool"}],"name":"switch_WL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri_common","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526127106009556040518060800160405280605981526020016200498360599139600a90805190602001906200003b929190620002c2565b5066b1a2bc2ec50000600b5566b1a2bc2ec50000600c556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055506003600e556032600f557f11f30a2580e5ee774c926ab8a5f49203945b36b82105cdc90233ebaf06b196eb60001b6010557fdc7610d4723665d6db6b3bd694ccc1ba7e4851d78f92c25276b6f7739e05a63b60001b6011556105dc6012553480156200010e57600080fd5b506040518060400160405280600b81526020017f4e616574696f6e204e46540000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f4e616574696f6e4e465400000000000000000000000000000000000000000000815250816002908051906020019062000193929190620002c2565b508060039080519060200190620001ac929190620002c2565b50620001bd620001eb60201b60201c565b6000819055505050620001e5620001d9620001f460201b60201c565b620001fc60201b60201c565b620003d7565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002d09062000372565b90600052602060002090601f016020900481019282620002f4576000855562000340565b82601f106200030f57805160ff191683800117855562000340565b8280016001018555821562000340579182015b828111156200033f57825182559160200191906001019062000322565b5b5090506200034f919062000353565b5090565b5b808211156200036e57600081600090555060010162000354565b5090565b600060028204905060018216806200038b57607f821691505b60208210811415620003a257620003a1620003a8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61459c80620003e76000396000f3fe60806040526004361061027d5760003560e01c806371b3056c1161014f578063c5175891116100c1578063e985e9c51161007a578063e985e9c514610940578063ec42b6681461097d578063f1224b54146109a6578063f2fde38b146109d1578063f63f0a2b146109fa578063f979b69314610a255761027d565b8063c51758911461082b578063c87b56dd14610847578063cd3293de14610884578063ce698883146108af578063dc33e681146108da578063df59d41e146109175761027d565b80639be70091116101135780639be7009114610740578063a22cb4651461075c578063a49b48fc14610785578063abff472d146107ae578063b88d4fde146107d9578063be0f4f4d146108025761027d565b806371b3056c146106695780638385e97a146106945780638da5cb5b146106bf57806391683e74146106ea57806395d89b41146107155761027d565b8063370e86d0116101f357806355f804b3116101ac57806355f804b31461055b57806358c76daf14610584578063622cd903146105ad5780636352211e146105d857806370a0823114610615578063715018a6146106525761027d565b8063370e86d0146104735780633ccfd60b1461049e5780634256dbe3146104b557806342842e0e146104de57806345c0f533146105075780634a0eaff6146105325761027d565b8063081812fc11610245578063081812fc14610365578063095ea7b3146103a257806317f8255e146103cb57806318160ddd146103f657806323b872dd146104215780633488f4d01461044a5761027d565b806301ffc9a714610282578063037bbbb9146102bf578063050225ea146102e857806306d7cbdf1461031157806306fdde031461033a575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a4919061353c565b610a4e565b6040516102b69190613ad7565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e191906135df565b610ae0565b005b3480156102f457600080fd5b5061030f600480360381019061030a91906134a2565b610b66565b005b34801561031d57600080fd5b50610338600480360381019061033391906134e2565b610cb8565b005b34801561034657600080fd5b5061034f610d51565b60405161035c9190613b0d565b60405180910390f35b34801561037157600080fd5b5061038c600480360381019061038791906135df565b610de3565b6040516103999190613a70565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906134a2565b610e5f565b005b3480156103d757600080fd5b506103e0610fa0565b6040516103ed9190613af2565b60405180910390f35b34801561040257600080fd5b5061040b610fa6565b6040516104189190613cef565b60405180910390f35b34801561042d57600080fd5b506104486004803603810190610443919061338c565b610fbd565b005b34801561045657600080fd5b50610471600480360381019061046c919061350f565b6112e2565b005b34801561047f57600080fd5b50610488611368565b6040516104959190613af2565b60405180910390f35b3480156104aa57600080fd5b506104b361136e565b005b3480156104c157600080fd5b506104dc60048036038101906104d791906135df565b611499565b005b3480156104ea57600080fd5b506105056004803603810190610500919061338c565b61151f565b005b34801561051357600080fd5b5061051c61153f565b6040516105299190613cef565b60405180910390f35b34801561053e57600080fd5b50610559600480360381019061055491906135df565b611545565b005b34801561056757600080fd5b50610582600480360381019061057d9190613596565b6115cb565b005b34801561059057600080fd5b506105ab60048036038101906105a691906135df565b611661565b005b3480156105b957600080fd5b506105c26116e7565b6040516105cf9190613cef565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa91906135df565b6116ed565b60405161060c9190613a70565b60405180910390f35b34801561062157600080fd5b5061063c6004803603810190610637919061331f565b6116ff565b6040516106499190613cef565b60405180910390f35b34801561065e57600080fd5b506106676117b8565b005b34801561067557600080fd5b5061067e611840565b60405161068b9190613cef565b60405180910390f35b3480156106a057600080fd5b506106a9611846565b6040516106b69190613ad7565b60405180910390f35b3480156106cb57600080fd5b506106d4611859565b6040516106e19190613a70565b60405180910390f35b3480156106f657600080fd5b506106ff611883565b60405161070c9190613ad7565b60405180910390f35b34801561072157600080fd5b5061072a611896565b6040516107379190613b0d565b60405180910390f35b61075a6004803603810190610755919061360c565b611928565b005b34801561076857600080fd5b50610783600480360381019061077e9190613462565b611bce565b005b34801561079157600080fd5b506107ac60048036038101906107a791906134e2565b611d46565b005b3480156107ba57600080fd5b506107c3611ddf565b6040516107d09190613b0d565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb91906133df565b611e6d565b005b34801561080e57600080fd5b506108296004803603810190610824919061360c565b611ee0565b005b610845600480360381019061084091906135df565b61212f565b005b34801561085357600080fd5b5061086e600480360381019061086991906135df565b61231a565b60405161087b9190613b0d565b60405180910390f35b34801561089057600080fd5b50610899612396565b6040516108a69190613cef565b60405180910390f35b3480156108bb57600080fd5b506108c461239c565b6040516108d19190613cef565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc919061331f565b6123a2565b60405161090e9190613cef565b60405180910390f35b34801561092357600080fd5b5061093e600480360381019061093991906134e2565b6123b4565b005b34801561094c57600080fd5b506109676004803603810190610962919061334c565b61244d565b6040516109749190613ad7565b60405180910390f35b34801561098957600080fd5b506109a4600480360381019061099f919061350f565b6124e1565b005b3480156109b257600080fd5b506109bb612567565b6040516109c89190613cef565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f3919061331f565b61256d565b005b348015610a0657600080fd5b50610a0f612665565b604051610a1c9190613ad7565b60405180910390f35b348015610a3157600080fd5b50610a4c6004803603810190610a4791906135df565b612678565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ad95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610ae8612743565b73ffffffffffffffffffffffffffffffffffffffff16610b06611859565b73ffffffffffffffffffffffffffffffffffffffff1614610b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5390613c6f565b60405180910390fd5b80600c8190555050565b610b6e612743565b73ffffffffffffffffffffffffffffffffffffffff16610b8c611859565b73ffffffffffffffffffffffffffffffffffffffff1614610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd990613c6f565b60405180910390fd5b600954610bff82610bf1610fa6565b61274b90919063ffffffff16565b1115610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790613b4f565b60405180910390fd5b600081600f54610c509190613ed5565b1015610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890613c0f565b60405180910390fd5b610c9b8282612761565b80600f6000828254610cad9190613ed5565b925050819055505050565b610cc0612743565b73ffffffffffffffffffffffffffffffffffffffff16610cde611859565b73ffffffffffffffffffffffffffffffffffffffff1614610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90613c6f565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b606060028054610d6090613fc9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8c90613fc9565b8015610dd95780601f10610dae57610100808354040283529160200191610dd9565b820191906000526020600020905b815481529060010190602001808311610dbc57829003601f168201915b5050505050905090565b6000610dee8261277f565b610e24576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e6a826116ed565b90508073ffffffffffffffffffffffffffffffffffffffff16610e8b6127de565b73ffffffffffffffffffffffffffffffffffffffff1614610eee57610eb781610eb26127de565b61244d565b610eed576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60115481565b6000610fb06127e6565b6001546000540303905090565b6000610fc8826127ef565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461102f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061103b846128cc565b91509150611051818761104c6127de565b6128ee565b61109d57611066866110616127de565b61244d565b61109c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611104576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111118686866001612932565b801561111c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111ea856111c6888887612938565b7c020000000000000000000000000000000000000000000000000000000017612960565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561127257600060018501905060006004600083815260200190815260200160002054141561127057600054811461126f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112da868686600161298b565b505050505050565b6112ea612743565b73ffffffffffffffffffffffffffffffffffffffff16611308611859565b73ffffffffffffffffffffffffffffffffffffffff161461135e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590613c6f565b60405180910390fd5b8060118190555050565b60105481565b611376612743565b73ffffffffffffffffffffffffffffffffffffffff16611394611859565b73ffffffffffffffffffffffffffffffffffffffff16146113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e190613c6f565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161141090613a5b565b60006040518083038185875af1925050503d806000811461144d576040519150601f19603f3d011682016040523d82523d6000602084013e611452565b606091505b5050905080611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d90613c4f565b60405180910390fd5b50565b6114a1612743565b73ffffffffffffffffffffffffffffffffffffffff166114bf611859565b73ffffffffffffffffffffffffffffffffffffffff1614611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c90613c6f565b60405180910390fd5b80600f8190555050565b61153a83838360405180602001604052806000815250611e6d565b505050565b60095481565b61154d612743565b73ffffffffffffffffffffffffffffffffffffffff1661156b611859565b73ffffffffffffffffffffffffffffffffffffffff16146115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b890613c6f565b60405180910390fd5b80600b8190555050565b6115d3612743565b73ffffffffffffffffffffffffffffffffffffffff166115f1611859565b73ffffffffffffffffffffffffffffffffffffffff1614611647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163e90613c6f565b60405180910390fd5b80600a908051906020019061165d9291906130c8565b5050565b611669612743565b73ffffffffffffffffffffffffffffffffffffffff16611687611859565b73ffffffffffffffffffffffffffffffffffffffff16146116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d490613c6f565b60405180910390fd5b80600e8190555050565b60125481565b60006116f8826127ef565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611767576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117c0612743565b73ffffffffffffffffffffffffffffffffffffffff166117de611859565b73ffffffffffffffffffffffffffffffffffffffff1614611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613c6f565b60405180910390fd5b61183e6000612991565b565b600e5481565b600d60029054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60009054906101000a900460ff1681565b6060600380546118a590613fc9565b80601f01602080910402602001604051908101604052809291908181526020018280546118d190613fc9565b801561191e5780601f106118f35761010080835404028352916020019161191e565b820191906000526020600020905b81548152906001019060200180831161190157829003601f168201915b5050505050905090565b60003360405160200161193b9190613a11565b6040516020818303038152906040528051906020012090506119a1838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483612a57565b6119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790613c2f565b60405180910390fd5b600d60019054906101000a900460ff16611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690613baf565b60405180910390fd5b600e54611a4d85611a3f336123a2565b61274b90919063ffffffff16565b11158015611a5b5750600084115b611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190613b6f565b60405180910390fd5b34611ab0600c5486612a6e90919063ffffffff16565b1115611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae890613b8f565b60405180910390fd5b600f54601254611b019190613ed5565b611b1b85611b0d610fa6565b61274b90919063ffffffff16565b1115611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5390613bef565b60405180910390fd5b611b663385612761565b601254611b71610fa6565b10611bc8576000600d60016101000a81548160ff0219169083151502179055506000600d60006101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055505b50505050565b611bd66127de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c3b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c486127de565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cf56127de565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d3a9190613ad7565b60405180910390a35050565b611d4e612743565b73ffffffffffffffffffffffffffffffffffffffff16611d6c611859565b73ffffffffffffffffffffffffffffffffffffffff1614611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db990613c6f565b60405180910390fd5b80600d60026101000a81548160ff02191690831515021790555050565b600a8054611dec90613fc9565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1890613fc9565b8015611e655780601f10611e3a57610100808354040283529160200191611e65565b820191906000526020600020905b815481529060010190602001808311611e4857829003601f168201915b505050505081565b611e78848484610fbd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611eda57611ea384848484612a84565b611ed9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600033604051602001611ef39190613a11565b604051602081830303815290604052805190602001209050611f59838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060115483612a57565b611f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8f90613c2f565b60405180910390fd5b600d60029054906101000a900460ff16611fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fde90613bcf565b60405180910390fd5b600e5461200585611ff7336123a2565b61274b90919063ffffffff16565b111580156120135750600084115b612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990613b6f565b60405180910390fd5b600f546012546120629190613ed5565b61207c8561206e610fa6565b61274b90919063ffffffff16565b11156120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490613bef565b60405180910390fd5b6120c73385612761565b6012546120d2610fa6565b10612129576000600d60016101000a81548160ff0219169083151502179055506000600d60006101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055505b50505050565b600d60009054906101000a900460ff1661217e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217590613ccf565b60405180910390fd5b600e5461219c8261218e336123a2565b61274b90919063ffffffff16565b111580156121aa5750600081115b6121e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e090613b6f565b60405180910390fd5b346121ff600b5483612a6e90919063ffffffff16565b1115612240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223790613b8f565b60405180910390fd5b600f546012546122509190613ed5565b61226a8261225c610fa6565b61274b90919063ffffffff16565b11156122ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a290613bef565b60405180910390fd5b6122b53382612761565b6012546122c0610fa6565b10612317576000600d60016101000a81548160ff0219169083151502179055506000600d60006101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055505b50565b60606123258261277f565b612364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235b90613c8f565b60405180910390fd5b600a61236f83612be4565b604051602001612380929190613a2c565b6040516020818303038152906040529050919050565b600f5481565b600b5481565b60006123ad82612d45565b9050919050565b6123bc612743565b73ffffffffffffffffffffffffffffffffffffffff166123da611859565b73ffffffffffffffffffffffffffffffffffffffff1614612430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242790613c6f565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124e9612743565b73ffffffffffffffffffffffffffffffffffffffff16612507611859565b73ffffffffffffffffffffffffffffffffffffffff161461255d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255490613c6f565b60405180910390fd5b8060108190555050565b600c5481565b612575612743565b73ffffffffffffffffffffffffffffffffffffffff16612593611859565b73ffffffffffffffffffffffffffffffffffffffff16146125e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e090613c6f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265090613b2f565b60405180910390fd5b61266281612991565b50565b600d60019054906101000a900460ff1681565b612680612743565b73ffffffffffffffffffffffffffffffffffffffff1661269e611859565b73ffffffffffffffffffffffffffffffffffffffff16146126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb90613c6f565b60405180910390fd5b600954811115612739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273090613caf565b60405180910390fd5b8060128190555050565b600033905090565b600081836127599190613df4565b905092915050565b61277b828260405180602001604052806000815250612d9c565b5050565b60008161278a6127e6565b11158015612799575060005482105b80156127d7575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806127fe6127e6565b11612895576000548110156128945760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612892575b60008114156128885761286b600183612e3990919063ffffffff16565b91506004600083815260200190815260200160002054905061284e565b80925050506128c7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861294f868684612e4f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612a648584612e58565b1490509392505050565b60008183612a7c9190613e7b565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612aaa6127de565b8786866040518563ffffffff1660e01b8152600401612acc9493929190613a8b565b602060405180830381600087803b158015612ae657600080fd5b505af1925050508015612b1757506040513d601f19601f82011682018060405250810190612b149190613569565b60015b612b91573d8060008114612b47576040519150601f19603f3d011682016040523d82523d6000602084013e612b4c565b606091505b50600081511415612b89576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612c2c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d40565b600082905060005b60008214612c5e578080612c479061402c565b915050600a82612c579190613e4a565b9150612c34565b60008167ffffffffffffffff811115612c7a57612c79614186565b5b6040519080825280601f01601f191660200182016040528015612cac5781602001600182028036833780820191505090505b5090505b60008514612d3957600182612cc59190613ed5565b9150600a85612cd49190614099565b6030612ce09190613df4565b60f81b818381518110612cf657612cf5614157565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d329190613e4a565b9450612cb0565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612da68383612ecd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612e3457600080549050600083820390505b612de66000868380600101945086612a84565b612e1c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612dd3578160005414612e3157600080fd5b50505b505050565b60008183612e479190613ed5565b905092915050565b60009392505050565b60008082905060005b8451811015612ec2576000858281518110612e7f57612e7e614157565b5b60200260200101519050808311612ea157612e9a83826130a1565b9250612eae565b612eab81846130a1565b92505b508080612eba9061402c565b915050612e61565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f3a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612f75576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f826000848385612932565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612ff983612fea6000866000612938565b612ff3856130b8565b17612960565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061301d5780600081905550505061309c600084838561298b565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546130d490613fc9565b90600052602060002090601f0160209004810192826130f6576000855561313d565b82601f1061310f57805160ff191683800117855561313d565b8280016001018555821561313d579182015b8281111561313c578251825591602001919060010190613121565b5b50905061314a919061314e565b5090565b5b8082111561316757600081600090555060010161314f565b5090565b600061317e61317984613d2f565b613d0a565b90508281526020810184848401111561319a576131996141c4565b5b6131a5848285613f87565b509392505050565b60006131c06131bb84613d60565b613d0a565b9050828152602081018484840111156131dc576131db6141c4565b5b6131e7848285613f87565b509392505050565b6000813590506131fe816144f3565b92915050565b60008083601f84011261321a576132196141ba565b5b8235905067ffffffffffffffff811115613237576132366141b5565b5b602083019150836020820283011115613253576132526141bf565b5b9250929050565b6000813590506132698161450a565b92915050565b60008135905061327e81614521565b92915050565b60008135905061329381614538565b92915050565b6000815190506132a881614538565b92915050565b600082601f8301126132c3576132c26141ba565b5b81356132d384826020860161316b565b91505092915050565b600082601f8301126132f1576132f06141ba565b5b81356133018482602086016131ad565b91505092915050565b6000813590506133198161454f565b92915050565b600060208284031215613335576133346141ce565b5b6000613343848285016131ef565b91505092915050565b60008060408385031215613363576133626141ce565b5b6000613371858286016131ef565b9250506020613382858286016131ef565b9150509250929050565b6000806000606084860312156133a5576133a46141ce565b5b60006133b3868287016131ef565b93505060206133c4868287016131ef565b92505060406133d58682870161330a565b9150509250925092565b600080600080608085870312156133f9576133f86141ce565b5b6000613407878288016131ef565b9450506020613418878288016131ef565b93505060406134298782880161330a565b925050606085013567ffffffffffffffff81111561344a576134496141c9565b5b613456878288016132ae565b91505092959194509250565b60008060408385031215613479576134786141ce565b5b6000613487858286016131ef565b92505060206134988582860161325a565b9150509250929050565b600080604083850312156134b9576134b86141ce565b5b60006134c7858286016131ef565b92505060206134d88582860161330a565b9150509250929050565b6000602082840312156134f8576134f76141ce565b5b60006135068482850161325a565b91505092915050565b600060208284031215613525576135246141ce565b5b60006135338482850161326f565b91505092915050565b600060208284031215613552576135516141ce565b5b600061356084828501613284565b91505092915050565b60006020828403121561357f5761357e6141ce565b5b600061358d84828501613299565b91505092915050565b6000602082840312156135ac576135ab6141ce565b5b600082013567ffffffffffffffff8111156135ca576135c96141c9565b5b6135d6848285016132dc565b91505092915050565b6000602082840312156135f5576135f46141ce565b5b60006136038482850161330a565b91505092915050565b600080600060408486031215613625576136246141ce565b5b60006136338682870161330a565b935050602084013567ffffffffffffffff811115613654576136536141c9565b5b61366086828701613204565b92509250509250925092565b61367581613f09565b82525050565b61368c61368782613f09565b614075565b82525050565b61369b81613f1b565b82525050565b6136aa81613f27565b82525050565b60006136bb82613da6565b6136c58185613dbc565b93506136d5818560208601613f96565b6136de816141d3565b840191505092915050565b60006136f482613db1565b6136fe8185613dd8565b935061370e818560208601613f96565b613717816141d3565b840191505092915050565b600061372d82613db1565b6137378185613de9565b9350613747818560208601613f96565b80840191505092915050565b6000815461376081613fc9565b61376a8186613de9565b945060018216600081146137855760018114613796576137c9565b60ff198316865281860193506137c9565b61379f85613d91565b60005b838110156137c1578154818901526001820191506020810190506137a2565b838801955050505b50505092915050565b60006137df602683613dd8565b91506137ea826141f1565b604082019050919050565b6000613802602183613dd8565b915061380d82614240565b604082019050919050565b6000613825601783613dd8565b91506138308261428f565b602082019050919050565b6000613848602083613dd8565b9150613853826142b8565b602082019050919050565b600061386b601e83613dd8565b9150613876826142e1565b602082019050919050565b600061388e601983613dd8565b91506138998261430a565b602082019050919050565b60006138b1601e83613dd8565b91506138bc82614333565b602082019050919050565b60006138d4601c83613dd8565b91506138df8261435c565b602082019050919050565b60006138f7600f83613dd8565b915061390282614385565b602082019050919050565b600061391a601a83613dd8565b9150613925826143ae565b602082019050919050565b600061393d600583613de9565b9150613948826143d7565b600582019050919050565b6000613960602083613dd8565b915061396b82614400565b602082019050919050565b6000613983602f83613dd8565b915061398e82614429565b604082019050919050565b60006139a6600083613dcd565b91506139b182614478565b600082019050919050565b60006139c9602183613dd8565b91506139d48261447b565b604082019050919050565b60006139ec601483613dd8565b91506139f7826144ca565b602082019050919050565b613a0b81613f7d565b82525050565b6000613a1d828461367b565b60148201915081905092915050565b6000613a388285613753565b9150613a448284613722565b9150613a4f82613930565b91508190509392505050565b6000613a6682613999565b9150819050919050565b6000602082019050613a85600083018461366c565b92915050565b6000608082019050613aa0600083018761366c565b613aad602083018661366c565b613aba6040830185613a02565b8181036060830152613acc81846136b0565b905095945050505050565b6000602082019050613aec6000830184613692565b92915050565b6000602082019050613b0760008301846136a1565b92915050565b60006020820190508181036000830152613b2781846136e9565b905092915050565b60006020820190508181036000830152613b48816137d2565b9050919050565b60006020820190508181036000830152613b68816137f5565b9050919050565b60006020820190508181036000830152613b8881613818565b9050919050565b60006020820190508181036000830152613ba88161383b565b9050919050565b60006020820190508181036000830152613bc88161385e565b9050919050565b60006020820190508181036000830152613be881613881565b9050919050565b60006020820190508181036000830152613c08816138a4565b9050919050565b60006020820190508181036000830152613c28816138c7565b9050919050565b60006020820190508181036000830152613c48816138ea565b9050919050565b60006020820190508181036000830152613c688161390d565b9050919050565b60006020820190508181036000830152613c8881613953565b9050919050565b60006020820190508181036000830152613ca881613976565b9050919050565b60006020820190508181036000830152613cc8816139bc565b9050919050565b60006020820190508181036000830152613ce8816139df565b9050919050565b6000602082019050613d046000830184613a02565b92915050565b6000613d14613d25565b9050613d208282613ffb565b919050565b6000604051905090565b600067ffffffffffffffff821115613d4a57613d49614186565b5b613d53826141d3565b9050602081019050919050565b600067ffffffffffffffff821115613d7b57613d7a614186565b5b613d84826141d3565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613dff82613f7d565b9150613e0a83613f7d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e3f57613e3e6140ca565b5b828201905092915050565b6000613e5582613f7d565b9150613e6083613f7d565b925082613e7057613e6f6140f9565b5b828204905092915050565b6000613e8682613f7d565b9150613e9183613f7d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613eca57613ec96140ca565b5b828202905092915050565b6000613ee082613f7d565b9150613eeb83613f7d565b925082821015613efe57613efd6140ca565b5b828203905092915050565b6000613f1482613f5d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613fb4578082015181840152602081019050613f99565b83811115613fc3576000848401525b50505050565b60006002820490506001821680613fe157607f821691505b60208210811415613ff557613ff4614128565b5b50919050565b614004826141d3565b810181811067ffffffffffffffff8211171561402357614022614186565b5b80604052505050565b600061403782613f7d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561406a576140696140ca565b5b600182019050919050565b600061408082614087565b9050919050565b6000614092826141e4565b9050919050565b60006140a482613f7d565b91506140af83613f7d565b9250826140bf576140be6140f9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f476976656177617920657863656564732063757272656e74206261746368212160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e74207175616e746974792121000000000000000000600082015250565b7f496e73756666696369656e74206574682073656e7420666f72206d696e742121600082015250565b7f57686974656c697374204d696e74696e67206e6f742061637469766521210000600082015250565b7f46726565204d696e74696e67206e6f7420616374697665212100000000000000600082015250565b7f4d696e74206578636565647320436f6c6c656374696f6e2073697a6521210000600082015250565b7f4e6f206d6f72652072657365727665642072656d61696e696e67212100000000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f52657761726420646973747269627574696f6e206661696c6564000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f496e7075742065786365656473206d617820636f6c6c656374696f6e2073697a60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67206e6f74206163746976652121000000000000000000000000600082015250565b6144fc81613f09565b811461450757600080fd5b50565b61451381613f1b565b811461451e57600080fd5b50565b61452a81613f27565b811461453557600080fd5b50565b61454181613f31565b811461454c57600080fd5b50565b61455881613f7d565b811461456357600080fd5b5056fea2646970667358221220256fd10108a008dd11a7f5f8be7a174362e9a8ecf1b126d22debd156b8c7206f64736f6c6343000807003368747470733a2f2f6261667962656966687733356e333662736275686c7862616d6b3533617866756676636764657774757074676f667a7a323264626568773377736d2e697066732e6e667473746f726167652e6c696e6b2f

Deployed Bytecode

0x60806040526004361061027d5760003560e01c806371b3056c1161014f578063c5175891116100c1578063e985e9c51161007a578063e985e9c514610940578063ec42b6681461097d578063f1224b54146109a6578063f2fde38b146109d1578063f63f0a2b146109fa578063f979b69314610a255761027d565b8063c51758911461082b578063c87b56dd14610847578063cd3293de14610884578063ce698883146108af578063dc33e681146108da578063df59d41e146109175761027d565b80639be70091116101135780639be7009114610740578063a22cb4651461075c578063a49b48fc14610785578063abff472d146107ae578063b88d4fde146107d9578063be0f4f4d146108025761027d565b806371b3056c146106695780638385e97a146106945780638da5cb5b146106bf57806391683e74146106ea57806395d89b41146107155761027d565b8063370e86d0116101f357806355f804b3116101ac57806355f804b31461055b57806358c76daf14610584578063622cd903146105ad5780636352211e146105d857806370a0823114610615578063715018a6146106525761027d565b8063370e86d0146104735780633ccfd60b1461049e5780634256dbe3146104b557806342842e0e146104de57806345c0f533146105075780634a0eaff6146105325761027d565b8063081812fc11610245578063081812fc14610365578063095ea7b3146103a257806317f8255e146103cb57806318160ddd146103f657806323b872dd146104215780633488f4d01461044a5761027d565b806301ffc9a714610282578063037bbbb9146102bf578063050225ea146102e857806306d7cbdf1461031157806306fdde031461033a575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a4919061353c565b610a4e565b6040516102b69190613ad7565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e191906135df565b610ae0565b005b3480156102f457600080fd5b5061030f600480360381019061030a91906134a2565b610b66565b005b34801561031d57600080fd5b50610338600480360381019061033391906134e2565b610cb8565b005b34801561034657600080fd5b5061034f610d51565b60405161035c9190613b0d565b60405180910390f35b34801561037157600080fd5b5061038c600480360381019061038791906135df565b610de3565b6040516103999190613a70565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906134a2565b610e5f565b005b3480156103d757600080fd5b506103e0610fa0565b6040516103ed9190613af2565b60405180910390f35b34801561040257600080fd5b5061040b610fa6565b6040516104189190613cef565b60405180910390f35b34801561042d57600080fd5b506104486004803603810190610443919061338c565b610fbd565b005b34801561045657600080fd5b50610471600480360381019061046c919061350f565b6112e2565b005b34801561047f57600080fd5b50610488611368565b6040516104959190613af2565b60405180910390f35b3480156104aa57600080fd5b506104b361136e565b005b3480156104c157600080fd5b506104dc60048036038101906104d791906135df565b611499565b005b3480156104ea57600080fd5b506105056004803603810190610500919061338c565b61151f565b005b34801561051357600080fd5b5061051c61153f565b6040516105299190613cef565b60405180910390f35b34801561053e57600080fd5b50610559600480360381019061055491906135df565b611545565b005b34801561056757600080fd5b50610582600480360381019061057d9190613596565b6115cb565b005b34801561059057600080fd5b506105ab60048036038101906105a691906135df565b611661565b005b3480156105b957600080fd5b506105c26116e7565b6040516105cf9190613cef565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa91906135df565b6116ed565b60405161060c9190613a70565b60405180910390f35b34801561062157600080fd5b5061063c6004803603810190610637919061331f565b6116ff565b6040516106499190613cef565b60405180910390f35b34801561065e57600080fd5b506106676117b8565b005b34801561067557600080fd5b5061067e611840565b60405161068b9190613cef565b60405180910390f35b3480156106a057600080fd5b506106a9611846565b6040516106b69190613ad7565b60405180910390f35b3480156106cb57600080fd5b506106d4611859565b6040516106e19190613a70565b60405180910390f35b3480156106f657600080fd5b506106ff611883565b60405161070c9190613ad7565b60405180910390f35b34801561072157600080fd5b5061072a611896565b6040516107379190613b0d565b60405180910390f35b61075a6004803603810190610755919061360c565b611928565b005b34801561076857600080fd5b50610783600480360381019061077e9190613462565b611bce565b005b34801561079157600080fd5b506107ac60048036038101906107a791906134e2565b611d46565b005b3480156107ba57600080fd5b506107c3611ddf565b6040516107d09190613b0d565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb91906133df565b611e6d565b005b34801561080e57600080fd5b506108296004803603810190610824919061360c565b611ee0565b005b610845600480360381019061084091906135df565b61212f565b005b34801561085357600080fd5b5061086e600480360381019061086991906135df565b61231a565b60405161087b9190613b0d565b60405180910390f35b34801561089057600080fd5b50610899612396565b6040516108a69190613cef565b60405180910390f35b3480156108bb57600080fd5b506108c461239c565b6040516108d19190613cef565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc919061331f565b6123a2565b60405161090e9190613cef565b60405180910390f35b34801561092357600080fd5b5061093e600480360381019061093991906134e2565b6123b4565b005b34801561094c57600080fd5b506109676004803603810190610962919061334c565b61244d565b6040516109749190613ad7565b60405180910390f35b34801561098957600080fd5b506109a4600480360381019061099f919061350f565b6124e1565b005b3480156109b257600080fd5b506109bb612567565b6040516109c89190613cef565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f3919061331f565b61256d565b005b348015610a0657600080fd5b50610a0f612665565b604051610a1c9190613ad7565b60405180910390f35b348015610a3157600080fd5b50610a4c6004803603810190610a4791906135df565b612678565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ad95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610ae8612743565b73ffffffffffffffffffffffffffffffffffffffff16610b06611859565b73ffffffffffffffffffffffffffffffffffffffff1614610b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5390613c6f565b60405180910390fd5b80600c8190555050565b610b6e612743565b73ffffffffffffffffffffffffffffffffffffffff16610b8c611859565b73ffffffffffffffffffffffffffffffffffffffff1614610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd990613c6f565b60405180910390fd5b600954610bff82610bf1610fa6565b61274b90919063ffffffff16565b1115610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790613b4f565b60405180910390fd5b600081600f54610c509190613ed5565b1015610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890613c0f565b60405180910390fd5b610c9b8282612761565b80600f6000828254610cad9190613ed5565b925050819055505050565b610cc0612743565b73ffffffffffffffffffffffffffffffffffffffff16610cde611859565b73ffffffffffffffffffffffffffffffffffffffff1614610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90613c6f565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b606060028054610d6090613fc9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8c90613fc9565b8015610dd95780601f10610dae57610100808354040283529160200191610dd9565b820191906000526020600020905b815481529060010190602001808311610dbc57829003601f168201915b5050505050905090565b6000610dee8261277f565b610e24576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e6a826116ed565b90508073ffffffffffffffffffffffffffffffffffffffff16610e8b6127de565b73ffffffffffffffffffffffffffffffffffffffff1614610eee57610eb781610eb26127de565b61244d565b610eed576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60115481565b6000610fb06127e6565b6001546000540303905090565b6000610fc8826127ef565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461102f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061103b846128cc565b91509150611051818761104c6127de565b6128ee565b61109d57611066866110616127de565b61244d565b61109c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611104576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111118686866001612932565b801561111c57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111ea856111c6888887612938565b7c020000000000000000000000000000000000000000000000000000000017612960565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561127257600060018501905060006004600083815260200190815260200160002054141561127057600054811461126f578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46112da868686600161298b565b505050505050565b6112ea612743565b73ffffffffffffffffffffffffffffffffffffffff16611308611859565b73ffffffffffffffffffffffffffffffffffffffff161461135e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590613c6f565b60405180910390fd5b8060118190555050565b60105481565b611376612743565b73ffffffffffffffffffffffffffffffffffffffff16611394611859565b73ffffffffffffffffffffffffffffffffffffffff16146113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e190613c6f565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161141090613a5b565b60006040518083038185875af1925050503d806000811461144d576040519150601f19603f3d011682016040523d82523d6000602084013e611452565b606091505b5050905080611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d90613c4f565b60405180910390fd5b50565b6114a1612743565b73ffffffffffffffffffffffffffffffffffffffff166114bf611859565b73ffffffffffffffffffffffffffffffffffffffff1614611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c90613c6f565b60405180910390fd5b80600f8190555050565b61153a83838360405180602001604052806000815250611e6d565b505050565b60095481565b61154d612743565b73ffffffffffffffffffffffffffffffffffffffff1661156b611859565b73ffffffffffffffffffffffffffffffffffffffff16146115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b890613c6f565b60405180910390fd5b80600b8190555050565b6115d3612743565b73ffffffffffffffffffffffffffffffffffffffff166115f1611859565b73ffffffffffffffffffffffffffffffffffffffff1614611647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163e90613c6f565b60405180910390fd5b80600a908051906020019061165d9291906130c8565b5050565b611669612743565b73ffffffffffffffffffffffffffffffffffffffff16611687611859565b73ffffffffffffffffffffffffffffffffffffffff16146116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d490613c6f565b60405180910390fd5b80600e8190555050565b60125481565b60006116f8826127ef565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611767576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117c0612743565b73ffffffffffffffffffffffffffffffffffffffff166117de611859565b73ffffffffffffffffffffffffffffffffffffffff1614611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613c6f565b60405180910390fd5b61183e6000612991565b565b600e5481565b600d60029054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60009054906101000a900460ff1681565b6060600380546118a590613fc9565b80601f01602080910402602001604051908101604052809291908181526020018280546118d190613fc9565b801561191e5780601f106118f35761010080835404028352916020019161191e565b820191906000526020600020905b81548152906001019060200180831161190157829003601f168201915b5050505050905090565b60003360405160200161193b9190613a11565b6040516020818303038152906040528051906020012090506119a1838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483612a57565b6119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790613c2f565b60405180910390fd5b600d60019054906101000a900460ff16611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690613baf565b60405180910390fd5b600e54611a4d85611a3f336123a2565b61274b90919063ffffffff16565b11158015611a5b5750600084115b611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190613b6f565b60405180910390fd5b34611ab0600c5486612a6e90919063ffffffff16565b1115611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae890613b8f565b60405180910390fd5b600f54601254611b019190613ed5565b611b1b85611b0d610fa6565b61274b90919063ffffffff16565b1115611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5390613bef565b60405180910390fd5b611b663385612761565b601254611b71610fa6565b10611bc8576000600d60016101000a81548160ff0219169083151502179055506000600d60006101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055505b50505050565b611bd66127de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c3b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611c486127de565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cf56127de565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d3a9190613ad7565b60405180910390a35050565b611d4e612743565b73ffffffffffffffffffffffffffffffffffffffff16611d6c611859565b73ffffffffffffffffffffffffffffffffffffffff1614611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db990613c6f565b60405180910390fd5b80600d60026101000a81548160ff02191690831515021790555050565b600a8054611dec90613fc9565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1890613fc9565b8015611e655780601f10611e3a57610100808354040283529160200191611e65565b820191906000526020600020905b815481529060010190602001808311611e4857829003601f168201915b505050505081565b611e78848484610fbd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611eda57611ea384848484612a84565b611ed9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600033604051602001611ef39190613a11565b604051602081830303815290604052805190602001209050611f59838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060115483612a57565b611f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8f90613c2f565b60405180910390fd5b600d60029054906101000a900460ff16611fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fde90613bcf565b60405180910390fd5b600e5461200585611ff7336123a2565b61274b90919063ffffffff16565b111580156120135750600084115b612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990613b6f565b60405180910390fd5b600f546012546120629190613ed5565b61207c8561206e610fa6565b61274b90919063ffffffff16565b11156120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490613bef565b60405180910390fd5b6120c73385612761565b6012546120d2610fa6565b10612129576000600d60016101000a81548160ff0219169083151502179055506000600d60006101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055505b50505050565b600d60009054906101000a900460ff1661217e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217590613ccf565b60405180910390fd5b600e5461219c8261218e336123a2565b61274b90919063ffffffff16565b111580156121aa5750600081115b6121e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e090613b6f565b60405180910390fd5b346121ff600b5483612a6e90919063ffffffff16565b1115612240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223790613b8f565b60405180910390fd5b600f546012546122509190613ed5565b61226a8261225c610fa6565b61274b90919063ffffffff16565b11156122ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a290613bef565b60405180910390fd5b6122b53382612761565b6012546122c0610fa6565b10612317576000600d60016101000a81548160ff0219169083151502179055506000600d60006101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055505b50565b60606123258261277f565b612364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235b90613c8f565b60405180910390fd5b600a61236f83612be4565b604051602001612380929190613a2c565b6040516020818303038152906040529050919050565b600f5481565b600b5481565b60006123ad82612d45565b9050919050565b6123bc612743565b73ffffffffffffffffffffffffffffffffffffffff166123da611859565b73ffffffffffffffffffffffffffffffffffffffff1614612430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242790613c6f565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124e9612743565b73ffffffffffffffffffffffffffffffffffffffff16612507611859565b73ffffffffffffffffffffffffffffffffffffffff161461255d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255490613c6f565b60405180910390fd5b8060108190555050565b600c5481565b612575612743565b73ffffffffffffffffffffffffffffffffffffffff16612593611859565b73ffffffffffffffffffffffffffffffffffffffff16146125e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e090613c6f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265090613b2f565b60405180910390fd5b61266281612991565b50565b600d60019054906101000a900460ff1681565b612680612743565b73ffffffffffffffffffffffffffffffffffffffff1661269e611859565b73ffffffffffffffffffffffffffffffffffffffff16146126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb90613c6f565b60405180910390fd5b600954811115612739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273090613caf565b60405180910390fd5b8060128190555050565b600033905090565b600081836127599190613df4565b905092915050565b61277b828260405180602001604052806000815250612d9c565b5050565b60008161278a6127e6565b11158015612799575060005482105b80156127d7575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806127fe6127e6565b11612895576000548110156128945760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612892575b60008114156128885761286b600183612e3990919063ffffffff16565b91506004600083815260200190815260200160002054905061284e565b80925050506128c7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861294f868684612e4f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612a648584612e58565b1490509392505050565b60008183612a7c9190613e7b565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612aaa6127de565b8786866040518563ffffffff1660e01b8152600401612acc9493929190613a8b565b602060405180830381600087803b158015612ae657600080fd5b505af1925050508015612b1757506040513d601f19601f82011682018060405250810190612b149190613569565b60015b612b91573d8060008114612b47576040519150601f19603f3d011682016040523d82523d6000602084013e612b4c565b606091505b50600081511415612b89576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612c2c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d40565b600082905060005b60008214612c5e578080612c479061402c565b915050600a82612c579190613e4a565b9150612c34565b60008167ffffffffffffffff811115612c7a57612c79614186565b5b6040519080825280601f01601f191660200182016040528015612cac5781602001600182028036833780820191505090505b5090505b60008514612d3957600182612cc59190613ed5565b9150600a85612cd49190614099565b6030612ce09190613df4565b60f81b818381518110612cf657612cf5614157565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d329190613e4a565b9450612cb0565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612da68383612ecd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612e3457600080549050600083820390505b612de66000868380600101945086612a84565b612e1c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612dd3578160005414612e3157600080fd5b50505b505050565b60008183612e479190613ed5565b905092915050565b60009392505050565b60008082905060005b8451811015612ec2576000858281518110612e7f57612e7e614157565b5b60200260200101519050808311612ea157612e9a83826130a1565b9250612eae565b612eab81846130a1565b92505b508080612eba9061402c565b915050612e61565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f3a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612f75576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f826000848385612932565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612ff983612fea6000866000612938565b612ff3856130b8565b17612960565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061301d5780600081905550505061309c600084838561298b565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546130d490613fc9565b90600052602060002090601f0160209004810192826130f6576000855561313d565b82601f1061310f57805160ff191683800117855561313d565b8280016001018555821561313d579182015b8281111561313c578251825591602001919060010190613121565b5b50905061314a919061314e565b5090565b5b8082111561316757600081600090555060010161314f565b5090565b600061317e61317984613d2f565b613d0a565b90508281526020810184848401111561319a576131996141c4565b5b6131a5848285613f87565b509392505050565b60006131c06131bb84613d60565b613d0a565b9050828152602081018484840111156131dc576131db6141c4565b5b6131e7848285613f87565b509392505050565b6000813590506131fe816144f3565b92915050565b60008083601f84011261321a576132196141ba565b5b8235905067ffffffffffffffff811115613237576132366141b5565b5b602083019150836020820283011115613253576132526141bf565b5b9250929050565b6000813590506132698161450a565b92915050565b60008135905061327e81614521565b92915050565b60008135905061329381614538565b92915050565b6000815190506132a881614538565b92915050565b600082601f8301126132c3576132c26141ba565b5b81356132d384826020860161316b565b91505092915050565b600082601f8301126132f1576132f06141ba565b5b81356133018482602086016131ad565b91505092915050565b6000813590506133198161454f565b92915050565b600060208284031215613335576133346141ce565b5b6000613343848285016131ef565b91505092915050565b60008060408385031215613363576133626141ce565b5b6000613371858286016131ef565b9250506020613382858286016131ef565b9150509250929050565b6000806000606084860312156133a5576133a46141ce565b5b60006133b3868287016131ef565b93505060206133c4868287016131ef565b92505060406133d58682870161330a565b9150509250925092565b600080600080608085870312156133f9576133f86141ce565b5b6000613407878288016131ef565b9450506020613418878288016131ef565b93505060406134298782880161330a565b925050606085013567ffffffffffffffff81111561344a576134496141c9565b5b613456878288016132ae565b91505092959194509250565b60008060408385031215613479576134786141ce565b5b6000613487858286016131ef565b92505060206134988582860161325a565b9150509250929050565b600080604083850312156134b9576134b86141ce565b5b60006134c7858286016131ef565b92505060206134d88582860161330a565b9150509250929050565b6000602082840312156134f8576134f76141ce565b5b60006135068482850161325a565b91505092915050565b600060208284031215613525576135246141ce565b5b60006135338482850161326f565b91505092915050565b600060208284031215613552576135516141ce565b5b600061356084828501613284565b91505092915050565b60006020828403121561357f5761357e6141ce565b5b600061358d84828501613299565b91505092915050565b6000602082840312156135ac576135ab6141ce565b5b600082013567ffffffffffffffff8111156135ca576135c96141c9565b5b6135d6848285016132dc565b91505092915050565b6000602082840312156135f5576135f46141ce565b5b60006136038482850161330a565b91505092915050565b600080600060408486031215613625576136246141ce565b5b60006136338682870161330a565b935050602084013567ffffffffffffffff811115613654576136536141c9565b5b61366086828701613204565b92509250509250925092565b61367581613f09565b82525050565b61368c61368782613f09565b614075565b82525050565b61369b81613f1b565b82525050565b6136aa81613f27565b82525050565b60006136bb82613da6565b6136c58185613dbc565b93506136d5818560208601613f96565b6136de816141d3565b840191505092915050565b60006136f482613db1565b6136fe8185613dd8565b935061370e818560208601613f96565b613717816141d3565b840191505092915050565b600061372d82613db1565b6137378185613de9565b9350613747818560208601613f96565b80840191505092915050565b6000815461376081613fc9565b61376a8186613de9565b945060018216600081146137855760018114613796576137c9565b60ff198316865281860193506137c9565b61379f85613d91565b60005b838110156137c1578154818901526001820191506020810190506137a2565b838801955050505b50505092915050565b60006137df602683613dd8565b91506137ea826141f1565b604082019050919050565b6000613802602183613dd8565b915061380d82614240565b604082019050919050565b6000613825601783613dd8565b91506138308261428f565b602082019050919050565b6000613848602083613dd8565b9150613853826142b8565b602082019050919050565b600061386b601e83613dd8565b9150613876826142e1565b602082019050919050565b600061388e601983613dd8565b91506138998261430a565b602082019050919050565b60006138b1601e83613dd8565b91506138bc82614333565b602082019050919050565b60006138d4601c83613dd8565b91506138df8261435c565b602082019050919050565b60006138f7600f83613dd8565b915061390282614385565b602082019050919050565b600061391a601a83613dd8565b9150613925826143ae565b602082019050919050565b600061393d600583613de9565b9150613948826143d7565b600582019050919050565b6000613960602083613dd8565b915061396b82614400565b602082019050919050565b6000613983602f83613dd8565b915061398e82614429565b604082019050919050565b60006139a6600083613dcd565b91506139b182614478565b600082019050919050565b60006139c9602183613dd8565b91506139d48261447b565b604082019050919050565b60006139ec601483613dd8565b91506139f7826144ca565b602082019050919050565b613a0b81613f7d565b82525050565b6000613a1d828461367b565b60148201915081905092915050565b6000613a388285613753565b9150613a448284613722565b9150613a4f82613930565b91508190509392505050565b6000613a6682613999565b9150819050919050565b6000602082019050613a85600083018461366c565b92915050565b6000608082019050613aa0600083018761366c565b613aad602083018661366c565b613aba6040830185613a02565b8181036060830152613acc81846136b0565b905095945050505050565b6000602082019050613aec6000830184613692565b92915050565b6000602082019050613b0760008301846136a1565b92915050565b60006020820190508181036000830152613b2781846136e9565b905092915050565b60006020820190508181036000830152613b48816137d2565b9050919050565b60006020820190508181036000830152613b68816137f5565b9050919050565b60006020820190508181036000830152613b8881613818565b9050919050565b60006020820190508181036000830152613ba88161383b565b9050919050565b60006020820190508181036000830152613bc88161385e565b9050919050565b60006020820190508181036000830152613be881613881565b9050919050565b60006020820190508181036000830152613c08816138a4565b9050919050565b60006020820190508181036000830152613c28816138c7565b9050919050565b60006020820190508181036000830152613c48816138ea565b9050919050565b60006020820190508181036000830152613c688161390d565b9050919050565b60006020820190508181036000830152613c8881613953565b9050919050565b60006020820190508181036000830152613ca881613976565b9050919050565b60006020820190508181036000830152613cc8816139bc565b9050919050565b60006020820190508181036000830152613ce8816139df565b9050919050565b6000602082019050613d046000830184613a02565b92915050565b6000613d14613d25565b9050613d208282613ffb565b919050565b6000604051905090565b600067ffffffffffffffff821115613d4a57613d49614186565b5b613d53826141d3565b9050602081019050919050565b600067ffffffffffffffff821115613d7b57613d7a614186565b5b613d84826141d3565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613dff82613f7d565b9150613e0a83613f7d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e3f57613e3e6140ca565b5b828201905092915050565b6000613e5582613f7d565b9150613e6083613f7d565b925082613e7057613e6f6140f9565b5b828204905092915050565b6000613e8682613f7d565b9150613e9183613f7d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613eca57613ec96140ca565b5b828202905092915050565b6000613ee082613f7d565b9150613eeb83613f7d565b925082821015613efe57613efd6140ca565b5b828203905092915050565b6000613f1482613f5d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613fb4578082015181840152602081019050613f99565b83811115613fc3576000848401525b50505050565b60006002820490506001821680613fe157607f821691505b60208210811415613ff557613ff4614128565b5b50919050565b614004826141d3565b810181811067ffffffffffffffff8211171561402357614022614186565b5b80604052505050565b600061403782613f7d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561406a576140696140ca565b5b600182019050919050565b600061408082614087565b9050919050565b6000614092826141e4565b9050919050565b60006140a482613f7d565b91506140af83613f7d565b9250826140bf576140be6140f9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f476976656177617920657863656564732063757272656e74206261746368212160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e74207175616e746974792121000000000000000000600082015250565b7f496e73756666696369656e74206574682073656e7420666f72206d696e742121600082015250565b7f57686974656c697374204d696e74696e67206e6f742061637469766521210000600082015250565b7f46726565204d696e74696e67206e6f7420616374697665212100000000000000600082015250565b7f4d696e74206578636565647320436f6c6c656374696f6e2073697a6521210000600082015250565b7f4e6f206d6f72652072657365727665642072656d61696e696e67212100000000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f52657761726420646973747269627574696f6e206661696c6564000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f496e7075742065786365656473206d617820636f6c6c656374696f6e2073697a60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67206e6f74206163746976652121000000000000000000000000600082015250565b6144fc81613f09565b811461450757600080fd5b50565b61451381613f1b565b811461451e57600080fd5b50565b61452a81613f27565b811461453557600080fd5b50565b61454181613f31565b811461454c57600080fd5b50565b61455881613f7d565b811461456357600080fd5b5056fea2646970667358221220256fd10108a008dd11a7f5f8be7a174362e9a8ecf1b126d22debd156b8c7206f64736f6c63430008070033

Deployed Bytecode Sourcemap

54563:5295:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24353:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55045:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55904:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55369:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30078:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32024:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31572:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56344:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23407:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41289:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56545:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56240:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59177:192;;;;;;;;;;;;;:::i;:::-;;55810:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32914:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54677:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55143:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54848:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55674:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56646:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29867:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25032:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10114:103;;;;;;;;;;;;;:::i;:::-;;55637:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55327:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9891:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55251:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30247:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56924:841;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32300:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55541:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54723:118;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33170:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58430:739;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57771:653;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59377:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55776:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54955:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59742:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55451:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32679:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56450:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55002:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10226:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55291:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56683:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24353:615;24438:4;24753:10;24738:25;;:11;:25;;;;:102;;;;24830:10;24815:25;;:11;:25;;;;24738:102;:179;;;;24907:10;24892:25;;:11;:25;;;;24738:179;24718:199;;24353:615;;;:::o;55045:92::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55123:6:::1;55112:8;:17;;;;55045:92:::0;:::o;55904:328::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56026:14:::1;;55995:27;56013:8;55995:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:45;;55987:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;56119:1;56107:8;56097:7;;:18;;;;:::i;:::-;:23;;56089:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56164:30;56174:9;56185:8;56164:9;:30::i;:::-;56216:8;56205:7;;:19;;;;;;;:::i;:::-;;;;;;;;55904:328:::0;;:::o;55369:76::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55436:1:::1;55424:9;;:13;;;;;;;;;;;;;;;;;;55369:76:::0;:::o;30078:100::-;30132:13;30165:5;30158:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30078:100;:::o;32024:204::-;32092:7;32117:16;32125:7;32117;:16::i;:::-;32112:64;;32142:34;;;;;;;;;;;;;;32112:64;32196:15;:24;32212:7;32196:24;;;;;;;;;;;;;;;;;;;;;32189:31;;32024:204;;;:::o;31572:386::-;31645:13;31661:16;31669:7;31661;:16::i;:::-;31645:32;;31717:5;31694:28;;:19;:17;:19::i;:::-;:28;;;31690:175;;31742:44;31759:5;31766:19;:17;:19::i;:::-;31742:16;:44::i;:::-;31737:128;;31814:35;;;;;;;;;;;;;;31737:128;31690:175;31904:2;31877:15;:24;31893:7;31877:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31942:7;31938:2;31922:28;;31931:5;31922:28;;;;;;;;;;;;31634:324;31572:386;;:::o;56344:99::-;;;;:::o;23407:315::-;23460:7;23688:15;:13;:15::i;:::-;23673:12;;23657:13;;:28;:46;23650:53;;23407:315;:::o;41289:2800::-;41423:27;41453;41472:7;41453:18;:27::i;:::-;41423:57;;41538:4;41497:45;;41513:19;41497:45;;;41493:86;;41551:28;;;;;;;;;;;;;;41493:86;41593:27;41622:23;41649:28;41669:7;41649:19;:28::i;:::-;41592:85;;;;41777:62;41796:15;41813:4;41819:19;:17;:19::i;:::-;41777:18;:62::i;:::-;41772:174;;41859:43;41876:4;41882:19;:17;:19::i;:::-;41859:16;:43::i;:::-;41854:92;;41911:35;;;;;;;;;;;;;;41854:92;41772:174;41977:1;41963:16;;:2;:16;;;41959:52;;;41988:23;;;;;;;;;;;;;;41959:52;42024:43;42046:4;42052:2;42056:7;42065:1;42024:21;:43::i;:::-;42160:15;42157:160;;;42300:1;42279:19;42272:30;42157:160;42695:18;:24;42714:4;42695:24;;;;;;;;;;;;;;;;42693:26;;;;;;;;;;;;42764:18;:22;42783:2;42764:22;;;;;;;;;;;;;;;;42762:24;;;;;;;;;;;43086:145;43123:2;43171:45;43186:4;43192:2;43196:19;43171:14;:45::i;:::-;20635:8;43144:72;43086:18;:145::i;:::-;43057:17;:26;43075:7;43057:26;;;;;;;;;;;:174;;;;43401:1;20635:8;43351:19;:46;:51;43347:626;;;43423:19;43455:1;43445:7;:11;43423:33;;43612:1;43578:17;:30;43596:11;43578:30;;;;;;;;;;;;:35;43574:384;;;43716:13;;43701:11;:28;43697:242;;43896:19;43863:17;:30;43881:11;43863:30;;;;;;;;;;;:52;;;;43697:242;43574:384;43404:569;43347:626;44020:7;44016:2;44001:27;;44010:4;44001:27;;;;;;;;;;;;44039:42;44060:4;44066:2;44070:7;44079:1;44039:20;:42::i;:::-;41412:2677;;;41289:2800;;;:::o;56545:93::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56629:1:::1;56611:15;:19;;;;56545:93:::0;:::o;56240:97::-;;;;:::o;59177:192::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59226:13:::1;59253:10;59245:24;;59277:21;59245:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59225:78;;;59322:8;59314:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;59214:155;59177:192::o:0;55810:88::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55884:6:::1;55874:7;:16;;;;55810:88:::0;:::o;32914:185::-;33052:39;33069:4;33075:2;33079:7;33052:39;;;;;;;;;;;;:16;:39::i;:::-;32914:185;;;:::o;54677:37::-;;;;:::o;55143:100::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55229:6:::1;55214:12;:21;;;;55143:100:::0;:::o;54848:99::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54932:7:::1;54919:10;:20;;;;;;;;;;;;:::i;:::-;;54848:99:::0;:::o;55674:94::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55754:6:::1;55740:11;:20;;;;55674:94:::0;:::o;56646:30::-;;;;:::o;29867:144::-;29931:7;29974:27;29993:7;29974:18;:27::i;:::-;29951:52;;29867:144;;;:::o;25032:224::-;25096:7;25137:1;25120:19;;:5;:19;;;25116:60;;;25148:28;;;;;;;;;;;;;;25116:60;19587:13;25194:18;:25;25213:5;25194:25;;;;;;;;;;;;;;;;:54;25187:61;;25032:224;;;:::o;10114:103::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10179:30:::1;10206:1;10179:18;:30::i;:::-;10114:103::o:0;55637:30::-;;;;:::o;55327:35::-;;;;;;;;;;;;;:::o;9891:87::-;9937:7;9964:6;;;;;;;;;;;9957:13;;9891:87;:::o;55251:33::-;;;;;;;;;;;;;:::o;30247:104::-;30303:13;30336:7;30329:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30247:104;:::o;56924:841::-;57017:12;57059:10;57042:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;57032:39;;;;;;57017:54;;57090:53;57110:11;;57090:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57123:13;;57138:4;57090:18;:53::i;:::-;57082:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;57191:9;;;;;;;;;;;57183:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;57296:11;;57254:38;57283:8;57254:24;57267:10;57254:12;:24::i;:::-;:28;;:38;;;;:::i;:::-;:53;;:69;;;;;57322:1;57311:8;:12;57254:69;57246:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;57396:9;57370:22;57383:8;;57370;:12;;:22;;;;:::i;:::-;:35;;57362:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;57503:7;;57492:8;;:18;;;;:::i;:::-;57461:27;57479:8;57461:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:49;;57453:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;57566:31;57576:10;57588:8;57566:9;:31::i;:::-;57630:8;;57613:13;:11;:13::i;:::-;:25;57610:148;;57667:5;57655:9;;:17;;;;;;;;;;;;;;;;;;57703:5;57687:13;;:21;;;;;;;;;;;;;;;;;;57741:5;57723:15;;:23;;;;;;;;;;;;;;;;;;57610:148;57006:759;56924:841;;;:::o;32300:308::-;32411:19;:17;:19::i;:::-;32399:31;;:8;:31;;;32395:61;;;32439:17;;;;;;;;;;;;;;32395:61;32521:8;32469:18;:39;32488:19;:17;:19::i;:::-;32469:39;;;;;;;;;;;;;;;:49;32509:8;32469:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32581:8;32545:55;;32560:19;:17;:19::i;:::-;32545:55;;;32591:8;32545:55;;;;;;:::i;:::-;;;;;;;;32300:308;;:::o;55541:88::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55620:1:::1;55602:15;;:19;;;;;;;;;;;;;;;;;;55541:88:::0;:::o;54723:118::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33170:399::-;33337:31;33350:4;33356:2;33360:7;33337:12;:31::i;:::-;33401:1;33383:2;:14;;;:19;33379:183;;33422:56;33453:4;33459:2;33463:7;33472:5;33422:30;:56::i;:::-;33417:145;;33506:40;;;;;;;;;;;;;;33417:145;33379:183;33170:399;;;;:::o;58430:739::-;58517:12;58559:10;58542:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;58532:39;;;;;;58517:54;;58590:55;58610:11;;58590:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58623:15;;58640:4;58590:18;:55::i;:::-;58582:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;58685:15;;;;;;;;;;;58677:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;58791:11;;58749:38;58778:8;58749:24;58762:10;58749:12;:24::i;:::-;:28;;:38;;;;:::i;:::-;:53;;:69;;;;;58817:1;58806:8;:12;58749:69;58741:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;58907:7;;58896:8;;:18;;;;:::i;:::-;58865:27;58883:8;58865:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:49;;58857:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;58962:31;58972:10;58984:8;58962:9;:31::i;:::-;59034:8;;59017:13;:11;:13::i;:::-;:25;59014:148;;59071:5;59059:9;;:17;;;;;;;;;;;;;;;;;;59107:5;59091:13;;:21;;;;;;;;;;;;;;;;;;59145:5;59127:15;;:23;;;;;;;;;;;;;;;;;;59014:148;58506:663;58430:739;;;:::o;57771:653::-;57844:13;;;;;;;;;;;57836:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;57943:11;;57901:38;57930:8;57901:24;57914:10;57901:12;:24::i;:::-;:28;;:38;;;;:::i;:::-;:53;;:69;;;;;57969:1;57958:8;:12;57901:69;57893:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;58047:9;58017:26;58030:12;;58017:8;:12;;:26;;;;:::i;:::-;:39;;58009:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;58154:7;;58143:8;;:18;;;;:::i;:::-;58112:27;58130:8;58112:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:49;;58104:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;58217:31;58227:10;58239:8;58217:9;:31::i;:::-;58289:8;;58272:13;:11;:13::i;:::-;:25;58269:148;;58326:5;58314:9;;:17;;;;;;;;;;;;;;;;;;58362:5;58346:13;;:21;;;;;;;;;;;;;;;;;;58400:5;58382:15;;:23;;;;;;;;;;;;;;;;;;58269:148;57771:653;:::o;59377:260::-;59442:13;59476:16;59484:7;59476;:16::i;:::-;59468:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;59586:10;59598:20;59599:7;59598:18;:20::i;:::-;59569:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59555:74;;59377:260;;;:::o;55776:27::-;;;;:::o;54955:40::-;;;;:::o;59742:113::-;59800:7;59827:20;59841:5;59827:13;:20::i;:::-;59820:27;;59742:113;;;:::o;55451:84::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55526:1:::1;55510:13;;:17;;;;;;;;;;;;;;;;;;55451:84:::0;:::o;32679:164::-;32776:4;32800:18;:25;32819:5;32800:25;;;;;;;;;;;;;;;:35;32826:8;32800:35;;;;;;;;;;;;;;;;;;;;;;;;;32793:42;;32679:164;;;;:::o;56450:89::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56530:1:::1;56514:13;:17;;;;56450:89:::0;:::o;55002:36::-;;;;:::o;10226:201::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10335:1:::1;10315:22;;:8;:22;;;;10307:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10391:28;10410:8;10391:18;:28::i;:::-;10226:201:::0;:::o;55291:29::-;;;;;;;;;;;;;:::o;56683:171::-;10036:12;:10;:12::i;:::-;10025:23;;:7;:5;:7::i;:::-;:23;;;10017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56766:14:::1;;56756:6;:24;;56748:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;56840:6;56829:8;:17;;;;56683:171:::0;:::o;9434:98::-;9487:7;9514:10;9507:17;;9434:98;:::o;3384:::-;3442:7;3473:1;3469;:5;;;;:::i;:::-;3462:12;;3384:98;;;;:::o;34181:104::-;34250:27;34260:2;34264:8;34250:27;;;;;;;;;;;;:9;:27::i;:::-;34181:104;;:::o;33824:273::-;33881:4;33937:7;33918:15;:13;:15::i;:::-;:26;;:66;;;;;33971:13;;33961:7;:23;33918:66;:152;;;;;34069:1;20357:8;34022:17;:26;34040:7;34022:26;;;;;;;;;;;;:43;:48;33918:152;33898:172;;33824:273;;;:::o;52385:105::-;52445:7;52472:10;52465:17;;52385:105;:::o;59643:93::-;59700:7;59727:1;59720:8;;59643:93;:::o;26739:1174::-;26806:7;26826:12;26841:7;26826:22;;26909:4;26890:15;:13;:15::i;:::-;:23;26886:960;;26943:13;;26936:4;:20;26932:914;;;26981:14;26998:17;:23;27016:4;26998:23;;;;;;;;;;;;26981:40;;27114:1;20357:8;27087:6;:23;:28;27083:744;;;27606:158;27623:1;27613:6;:11;27606:158;;;27662:11;27671:1;27662:4;:8;;:11;;;;:::i;:::-;27657:16;;27713:17;:23;27731:4;27713:23;;;;;;;;;;;;27704:32;;27606:158;;;27797:6;27790:13;;;;;;27083:744;26958:888;26932:914;26886:960;27874:31;;;;;;;;;;;;;;26739:1174;;;;:::o;39625:652::-;39720:27;39749:23;39790:53;39846:15;39790:71;;40032:7;40026:4;40019:21;40067:22;40061:4;40054:36;40143:4;40137;40127:21;40104:44;;40239:19;40233:26;40214:45;;39970:300;39625:652;;;:::o;40390:645::-;40532:11;40694:15;40688:4;40684:26;40676:34;;40853:15;40842:9;40838:31;40825:44;;41000:15;40989:9;40986:30;40979:4;40968:9;40965:19;40962:55;40952:65;;40390:645;;;;;:::o;51218:159::-;;;;;:::o;49530:309::-;49665:7;49685:16;20758:3;49711:19;:40;;49685:67;;20758:3;49778:31;49789:4;49795:2;49799:9;49778:10;:31::i;:::-;49770:40;;:61;;49763:68;;;49530:309;;;;;:::o;29358:447::-;29438:14;29606:15;29599:5;29595:27;29586:36;;29780:5;29766:11;29742:22;29738:40;29735:51;29728:5;29725:62;29715:72;;29358:447;;;;:::o;52036:158::-;;;;;:::o;10436:191::-;10510:16;10529:6;;;;;;;;;;;10510:25;;10555:8;10546:6;;:17;;;;;;;;;;;;;;;;;;10610:8;10579:40;;10600:8;10579:40;;;;;;;;;;;;10499:128;10436:191;:::o;85:190::-;210:4;263;234:25;247:5;254:4;234:12;:25::i;:::-;:33;227:40;;85:190;;;;;:::o;4122:98::-;4180:7;4211:1;4207;:5;;;;:::i;:::-;4200:12;;4122:98;;;;:::o;48040:716::-;48203:4;48249:2;48224:45;;;48270:19;:17;:19::i;:::-;48291:4;48297:7;48306:5;48224:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48220:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48524:1;48507:6;:13;:18;48503:235;;;48553:40;;;;;;;;;;;;;;48503:235;48696:6;48690:13;48681:6;48677:2;48673:15;48666:38;48220:529;48393:54;;;48383:64;;;:6;:64;;;;48376:71;;;48040:716;;;;;;:::o;8051:533::-;8107:13;8147:1;8138:5;:10;8134:53;;;8165:10;;;;;;;;;;;;;;;;;;;;;8134:53;8197:12;8212:5;8197:20;;8228:14;8253:78;8268:1;8260:4;:9;8253:78;;8286:8;;;;;:::i;:::-;;;;8317:2;8309:10;;;;;:::i;:::-;;;8253:78;;;8341:19;8373:6;8363:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8341:39;;8391:154;8407:1;8398:5;:10;8391:154;;8435:1;8425:11;;;;;:::i;:::-;;;8502:2;8494:5;:10;;;;:::i;:::-;8481:2;:24;;;;:::i;:::-;8468:39;;8451:6;8458;8451:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8531:2;8522:11;;;;;:::i;:::-;;;8391:154;;;8569:6;8555:21;;;;;8051:533;;;;:::o;25338:176::-;25399:7;19587:13;19724:2;25427:18;:25;25446:5;25427:25;;;;;;;;;;;;;;;;:49;;25426:80;25419:87;;25338:176;;;:::o;34701:681::-;34824:19;34830:2;34834:8;34824:5;:19::i;:::-;34903:1;34885:2;:14;;;:19;34881:483;;34925:11;34939:13;;34925:27;;34971:13;34993:8;34987:3;:14;34971:30;;35020:233;35051:62;35090:1;35094:2;35098:7;;;;;;35107:5;35051:30;:62::i;:::-;35046:167;;35149:40;;;;;;;;;;;;;;35046:167;35248:3;35240:5;:11;35020:233;;35335:3;35318:13;;:20;35314:34;;35340:8;;;35314:34;34906:458;;34881:483;34701:681;;;:::o;3765:98::-;3823:7;3854:1;3850;:5;;;;:::i;:::-;3843:12;;3765:98;;;;:::o;50415:147::-;50552:6;50415:147;;;;;:::o;280:517::-;363:7;383:20;406:4;383:27;;426:9;421:339;445:5;:12;441:1;:16;421:339;;;479:20;502:5;508:1;502:8;;;;;;;;:::i;:::-;;;;;;;;479:31;;545:12;529;:28;525:224;;593:42;608:12;622;593:14;:42::i;:::-;578:57;;525:224;;;691:42;706:12;720;691:14;:42::i;:::-;676:57;;525:224;464:296;459:3;;;;;:::i;:::-;;;;421:339;;;;777:12;770:19;;;280:517;;;;:::o;35655:1529::-;35720:20;35743:13;;35720:36;;35785:1;35771:16;;:2;:16;;;35767:48;;;35796:19;;;;;;;;;;;;;;35767:48;35842:1;35830:8;:13;35826:44;;;35852:18;;;;;;;;;;;;;;35826:44;35883:61;35913:1;35917:2;35921:12;35935:8;35883:21;:61::i;:::-;36426:1;19724:2;36397:1;:25;;36396:31;36384:8;:44;36358:18;:22;36377:2;36358:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;36705:139;36742:2;36796:33;36819:1;36823:2;36827:1;36796:14;:33::i;:::-;36763:30;36784:8;36763:20;:30::i;:::-;:66;36705:18;:139::i;:::-;36671:17;:31;36689:12;36671:31;;;;;;;;;;;:173;;;;36861:15;36879:12;36861:30;;36906:11;36935:8;36920:12;:23;36906:37;;36958:101;37010:9;;;;;;37006:2;36985:35;;37002:1;36985:35;;;;;;;;;;;;37054:3;37044:7;:13;36958:101;;37091:3;37075:13;:19;;;;36132:974;;37116:60;37145:1;37149:2;37153:12;37167:8;37116:20;:60::i;:::-;35709:1475;35655:1529;;:::o;805:224::-;873:13;936:1;930:4;923:15;965:1;959:4;952:15;1006:4;1000;990:21;981:30;;805:224;;;;:::o;31188:322::-;31258:14;31489:1;31479:8;31476:15;31451:23;31447:45;31437:55;;31188:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:323::-;6412:6;6461:2;6449:9;6440:7;6436:23;6432:32;6429:119;;;6467:79;;:::i;:::-;6429:119;6587:1;6612:50;6654:7;6645:6;6634:9;6630:22;6612:50;:::i;:::-;6602:60;;6558:114;6356:323;;;;:::o;6685:329::-;6744:6;6793:2;6781:9;6772:7;6768:23;6764:32;6761:119;;;6799:79;;:::i;:::-;6761:119;6919:1;6944:53;6989:7;6980:6;6969:9;6965:22;6944:53;:::i;:::-;6934:63;;6890:117;6685:329;;;;:::o;7020:327::-;7078:6;7127:2;7115:9;7106:7;7102:23;7098:32;7095:119;;;7133:79;;:::i;:::-;7095:119;7253:1;7278:52;7322:7;7313:6;7302:9;7298:22;7278:52;:::i;:::-;7268:62;;7224:116;7020:327;;;;:::o;7353:349::-;7422:6;7471:2;7459:9;7450:7;7446:23;7442:32;7439:119;;;7477:79;;:::i;:::-;7439:119;7597:1;7622:63;7677:7;7668:6;7657:9;7653:22;7622:63;:::i;:::-;7612:73;;7568:127;7353:349;;;;:::o;7708:509::-;7777:6;7826:2;7814:9;7805:7;7801:23;7797:32;7794:119;;;7832:79;;:::i;:::-;7794:119;7980:1;7969:9;7965:17;7952:31;8010:18;8002:6;7999:30;7996:117;;;8032:79;;:::i;:::-;7996:117;8137:63;8192:7;8183:6;8172:9;8168:22;8137:63;:::i;:::-;8127:73;;7923:287;7708:509;;;;:::o;8223:329::-;8282:6;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;8223:329;;;;:::o;8558:704::-;8653:6;8661;8669;8718:2;8706:9;8697:7;8693:23;8689:32;8686:119;;;8724:79;;:::i;:::-;8686:119;8844:1;8869:53;8914:7;8905:6;8894:9;8890:22;8869:53;:::i;:::-;8859:63;;8815:117;8999:2;8988:9;8984:18;8971:32;9030:18;9022:6;9019:30;9016:117;;;9052:79;;:::i;:::-;9016:117;9165:80;9237:7;9228:6;9217:9;9213:22;9165:80;:::i;:::-;9147:98;;;;8942:313;8558:704;;;;;:::o;9268:118::-;9355:24;9373:5;9355:24;:::i;:::-;9350:3;9343:37;9268:118;;:::o;9392:157::-;9497:45;9517:24;9535:5;9517:24;:::i;:::-;9497:45;:::i;:::-;9492:3;9485:58;9392:157;;:::o;9555:109::-;9636:21;9651:5;9636:21;:::i;:::-;9631:3;9624:34;9555:109;;:::o;9670:118::-;9757:24;9775:5;9757:24;:::i;:::-;9752:3;9745:37;9670:118;;:::o;9794:360::-;9880:3;9908:38;9940:5;9908:38;:::i;:::-;9962:70;10025:6;10020:3;9962:70;:::i;:::-;9955:77;;10041:52;10086:6;10081:3;10074:4;10067:5;10063:16;10041:52;:::i;:::-;10118:29;10140:6;10118:29;:::i;:::-;10113:3;10109:39;10102:46;;9884:270;9794:360;;;;:::o;10160:364::-;10248:3;10276:39;10309:5;10276:39;:::i;:::-;10331:71;10395:6;10390:3;10331:71;:::i;:::-;10324:78;;10411:52;10456:6;10451:3;10444:4;10437:5;10433:16;10411:52;:::i;:::-;10488:29;10510:6;10488:29;:::i;:::-;10483:3;10479:39;10472:46;;10252:272;10160:364;;;;:::o;10530:377::-;10636:3;10664:39;10697:5;10664:39;:::i;:::-;10719:89;10801:6;10796:3;10719:89;:::i;:::-;10712:96;;10817:52;10862:6;10857:3;10850:4;10843:5;10839:16;10817:52;:::i;:::-;10894:6;10889:3;10885:16;10878:23;;10640:267;10530:377;;;;:::o;10937:845::-;11040:3;11077:5;11071:12;11106:36;11132:9;11106:36;:::i;:::-;11158:89;11240:6;11235:3;11158:89;:::i;:::-;11151:96;;11278:1;11267:9;11263:17;11294:1;11289:137;;;;11440:1;11435:341;;;;11256:520;;11289:137;11373:4;11369:9;11358;11354:25;11349:3;11342:38;11409:6;11404:3;11400:16;11393:23;;11289:137;;11435:341;11502:38;11534:5;11502:38;:::i;:::-;11562:1;11576:154;11590:6;11587:1;11584:13;11576:154;;;11664:7;11658:14;11654:1;11649:3;11645:11;11638:35;11714:1;11705:7;11701:15;11690:26;;11612:4;11609:1;11605:12;11600:17;;11576:154;;;11759:6;11754:3;11750:16;11743:23;;11442:334;;11256:520;;11044:738;;10937:845;;;;:::o;11788:366::-;11930:3;11951:67;12015:2;12010:3;11951:67;:::i;:::-;11944:74;;12027:93;12116:3;12027:93;:::i;:::-;12145:2;12140:3;12136:12;12129:19;;11788:366;;;:::o;12160:::-;12302:3;12323:67;12387:2;12382:3;12323:67;:::i;:::-;12316:74;;12399:93;12488:3;12399:93;:::i;:::-;12517:2;12512:3;12508:12;12501:19;;12160:366;;;:::o;12532:::-;12674:3;12695:67;12759:2;12754:3;12695:67;:::i;:::-;12688:74;;12771:93;12860:3;12771:93;:::i;:::-;12889:2;12884:3;12880:12;12873:19;;12532:366;;;:::o;12904:::-;13046:3;13067:67;13131:2;13126:3;13067:67;:::i;:::-;13060:74;;13143:93;13232:3;13143:93;:::i;:::-;13261:2;13256:3;13252:12;13245:19;;12904:366;;;:::o;13276:::-;13418:3;13439:67;13503:2;13498:3;13439:67;:::i;:::-;13432:74;;13515:93;13604:3;13515:93;:::i;:::-;13633:2;13628:3;13624:12;13617:19;;13276:366;;;:::o;13648:::-;13790:3;13811:67;13875:2;13870:3;13811:67;:::i;:::-;13804:74;;13887:93;13976:3;13887:93;:::i;:::-;14005:2;14000:3;13996:12;13989:19;;13648:366;;;:::o;14020:::-;14162:3;14183:67;14247:2;14242:3;14183:67;:::i;:::-;14176:74;;14259:93;14348:3;14259:93;:::i;:::-;14377:2;14372:3;14368:12;14361:19;;14020:366;;;:::o;14392:::-;14534:3;14555:67;14619:2;14614:3;14555:67;:::i;:::-;14548:74;;14631:93;14720:3;14631:93;:::i;:::-;14749:2;14744:3;14740:12;14733:19;;14392:366;;;:::o;14764:::-;14906:3;14927:67;14991:2;14986:3;14927:67;:::i;:::-;14920:74;;15003:93;15092:3;15003:93;:::i;:::-;15121:2;15116:3;15112:12;15105:19;;14764:366;;;:::o;15136:::-;15278:3;15299:67;15363:2;15358:3;15299:67;:::i;:::-;15292:74;;15375:93;15464:3;15375:93;:::i;:::-;15493:2;15488:3;15484:12;15477:19;;15136:366;;;:::o;15508:400::-;15668:3;15689:84;15771:1;15766:3;15689:84;:::i;:::-;15682:91;;15782:93;15871:3;15782:93;:::i;:::-;15900:1;15895:3;15891:11;15884:18;;15508:400;;;:::o;15914:366::-;16056:3;16077:67;16141:2;16136:3;16077:67;:::i;:::-;16070:74;;16153:93;16242:3;16153:93;:::i;:::-;16271:2;16266:3;16262:12;16255:19;;15914:366;;;:::o;16286:::-;16428:3;16449:67;16513:2;16508:3;16449:67;:::i;:::-;16442:74;;16525:93;16614:3;16525:93;:::i;:::-;16643:2;16638:3;16634:12;16627:19;;16286:366;;;:::o;16658:398::-;16817:3;16838:83;16919:1;16914:3;16838:83;:::i;:::-;16831:90;;16930:93;17019:3;16930:93;:::i;:::-;17048:1;17043:3;17039:11;17032:18;;16658:398;;;:::o;17062:366::-;17204:3;17225:67;17289:2;17284:3;17225:67;:::i;:::-;17218:74;;17301:93;17390:3;17301:93;:::i;:::-;17419:2;17414:3;17410:12;17403:19;;17062:366;;;:::o;17434:::-;17576:3;17597:67;17661:2;17656:3;17597:67;:::i;:::-;17590:74;;17673:93;17762:3;17673:93;:::i;:::-;17791:2;17786:3;17782:12;17775:19;;17434:366;;;:::o;17806:118::-;17893:24;17911:5;17893:24;:::i;:::-;17888:3;17881:37;17806:118;;:::o;17930:256::-;18042:3;18057:75;18128:3;18119:6;18057:75;:::i;:::-;18157:2;18152:3;18148:12;18141:19;;18177:3;18170:10;;17930:256;;;;:::o;18192:695::-;18470:3;18492:92;18580:3;18571:6;18492:92;:::i;:::-;18485:99;;18601:95;18692:3;18683:6;18601:95;:::i;:::-;18594:102;;18713:148;18857:3;18713:148;:::i;:::-;18706:155;;18878:3;18871:10;;18192:695;;;;;:::o;18893:379::-;19077:3;19099:147;19242:3;19099:147;:::i;:::-;19092:154;;19263:3;19256:10;;18893:379;;;:::o;19278:222::-;19371:4;19409:2;19398:9;19394:18;19386:26;;19422:71;19490:1;19479:9;19475:17;19466:6;19422:71;:::i;:::-;19278:222;;;;:::o;19506:640::-;19701:4;19739:3;19728:9;19724:19;19716:27;;19753:71;19821:1;19810:9;19806:17;19797:6;19753:71;:::i;:::-;19834:72;19902:2;19891:9;19887:18;19878:6;19834:72;:::i;:::-;19916;19984:2;19973:9;19969:18;19960:6;19916:72;:::i;:::-;20035:9;20029:4;20025:20;20020:2;20009:9;20005:18;19998:48;20063:76;20134:4;20125:6;20063:76;:::i;:::-;20055:84;;19506:640;;;;;;;:::o;20152:210::-;20239:4;20277:2;20266:9;20262:18;20254:26;;20290:65;20352:1;20341:9;20337:17;20328:6;20290:65;:::i;:::-;20152:210;;;;:::o;20368:222::-;20461:4;20499:2;20488:9;20484:18;20476:26;;20512:71;20580:1;20569:9;20565:17;20556:6;20512:71;:::i;:::-;20368:222;;;;:::o;20596:313::-;20709:4;20747:2;20736:9;20732:18;20724:26;;20796:9;20790:4;20786:20;20782:1;20771:9;20767:17;20760:47;20824:78;20897:4;20888:6;20824:78;:::i;:::-;20816:86;;20596:313;;;;:::o;20915:419::-;21081:4;21119:2;21108:9;21104:18;21096:26;;21168:9;21162:4;21158:20;21154:1;21143:9;21139:17;21132:47;21196:131;21322:4;21196:131;:::i;:::-;21188:139;;20915:419;;;:::o;21340:::-;21506:4;21544:2;21533:9;21529:18;21521:26;;21593:9;21587:4;21583:20;21579:1;21568:9;21564:17;21557:47;21621:131;21747:4;21621:131;:::i;:::-;21613:139;;21340:419;;;:::o;21765:::-;21931:4;21969:2;21958:9;21954:18;21946:26;;22018:9;22012:4;22008:20;22004:1;21993:9;21989:17;21982:47;22046:131;22172:4;22046:131;:::i;:::-;22038:139;;21765:419;;;:::o;22190:::-;22356:4;22394:2;22383:9;22379:18;22371:26;;22443:9;22437:4;22433:20;22429:1;22418:9;22414:17;22407:47;22471:131;22597:4;22471:131;:::i;:::-;22463:139;;22190:419;;;:::o;22615:::-;22781:4;22819:2;22808:9;22804:18;22796:26;;22868:9;22862:4;22858:20;22854:1;22843:9;22839:17;22832:47;22896:131;23022:4;22896:131;:::i;:::-;22888:139;;22615:419;;;:::o;23040:::-;23206:4;23244:2;23233:9;23229:18;23221:26;;23293:9;23287:4;23283:20;23279:1;23268:9;23264:17;23257:47;23321:131;23447:4;23321:131;:::i;:::-;23313:139;;23040:419;;;:::o;23465:::-;23631:4;23669:2;23658:9;23654:18;23646:26;;23718:9;23712:4;23708:20;23704:1;23693:9;23689:17;23682:47;23746:131;23872:4;23746:131;:::i;:::-;23738:139;;23465:419;;;:::o;23890:::-;24056:4;24094:2;24083:9;24079:18;24071:26;;24143:9;24137:4;24133:20;24129:1;24118:9;24114:17;24107:47;24171:131;24297:4;24171:131;:::i;:::-;24163:139;;23890:419;;;:::o;24315:::-;24481:4;24519:2;24508:9;24504:18;24496:26;;24568:9;24562:4;24558:20;24554:1;24543:9;24539:17;24532:47;24596:131;24722:4;24596:131;:::i;:::-;24588:139;;24315:419;;;:::o;24740:::-;24906:4;24944:2;24933:9;24929:18;24921:26;;24993:9;24987:4;24983:20;24979:1;24968:9;24964:17;24957:47;25021:131;25147:4;25021:131;:::i;:::-;25013:139;;24740:419;;;:::o;25165:::-;25331:4;25369:2;25358:9;25354:18;25346:26;;25418:9;25412:4;25408:20;25404:1;25393:9;25389:17;25382:47;25446:131;25572:4;25446:131;:::i;:::-;25438:139;;25165:419;;;:::o;25590:::-;25756:4;25794:2;25783:9;25779:18;25771:26;;25843:9;25837:4;25833:20;25829:1;25818:9;25814:17;25807:47;25871:131;25997:4;25871:131;:::i;:::-;25863:139;;25590:419;;;:::o;26015:::-;26181:4;26219:2;26208:9;26204:18;26196:26;;26268:9;26262:4;26258:20;26254:1;26243:9;26239:17;26232:47;26296:131;26422:4;26296:131;:::i;:::-;26288:139;;26015:419;;;:::o;26440:::-;26606:4;26644:2;26633:9;26629:18;26621:26;;26693:9;26687:4;26683:20;26679:1;26668:9;26664:17;26657:47;26721:131;26847:4;26721:131;:::i;:::-;26713:139;;26440:419;;;:::o;26865:222::-;26958:4;26996:2;26985:9;26981:18;26973:26;;27009:71;27077:1;27066:9;27062:17;27053:6;27009:71;:::i;:::-;26865:222;;;;:::o;27093:129::-;27127:6;27154:20;;:::i;:::-;27144:30;;27183:33;27211:4;27203:6;27183:33;:::i;:::-;27093:129;;;:::o;27228:75::-;27261:6;27294:2;27288:9;27278:19;;27228:75;:::o;27309:307::-;27370:4;27460:18;27452:6;27449:30;27446:56;;;27482:18;;:::i;:::-;27446:56;27520:29;27542:6;27520:29;:::i;:::-;27512:37;;27604:4;27598;27594:15;27586:23;;27309:307;;;:::o;27622:308::-;27684:4;27774:18;27766:6;27763:30;27760:56;;;27796:18;;:::i;:::-;27760:56;27834:29;27856:6;27834:29;:::i;:::-;27826:37;;27918:4;27912;27908:15;27900:23;;27622:308;;;:::o;27936:141::-;27985:4;28008:3;28000:11;;28031:3;28028:1;28021:14;28065:4;28062:1;28052:18;28044:26;;27936:141;;;:::o;28083:98::-;28134:6;28168:5;28162:12;28152:22;;28083:98;;;:::o;28187:99::-;28239:6;28273:5;28267:12;28257:22;;28187:99;;;:::o;28292:168::-;28375:11;28409:6;28404:3;28397:19;28449:4;28444:3;28440:14;28425:29;;28292:168;;;;:::o;28466:147::-;28567:11;28604:3;28589:18;;28466:147;;;;:::o;28619:169::-;28703:11;28737:6;28732:3;28725:19;28777:4;28772:3;28768:14;28753:29;;28619:169;;;;:::o;28794:148::-;28896:11;28933:3;28918:18;;28794:148;;;;:::o;28948:305::-;28988:3;29007:20;29025:1;29007:20;:::i;:::-;29002:25;;29041:20;29059:1;29041:20;:::i;:::-;29036:25;;29195:1;29127:66;29123:74;29120:1;29117:81;29114:107;;;29201:18;;:::i;:::-;29114:107;29245:1;29242;29238:9;29231:16;;28948:305;;;;:::o;29259:185::-;29299:1;29316:20;29334:1;29316:20;:::i;:::-;29311:25;;29350:20;29368:1;29350:20;:::i;:::-;29345:25;;29389:1;29379:35;;29394:18;;:::i;:::-;29379:35;29436:1;29433;29429:9;29424:14;;29259:185;;;;:::o;29450:348::-;29490:7;29513:20;29531:1;29513:20;:::i;:::-;29508:25;;29547:20;29565:1;29547:20;:::i;:::-;29542:25;;29735:1;29667:66;29663:74;29660:1;29657:81;29652:1;29645:9;29638:17;29634:105;29631:131;;;29742:18;;:::i;:::-;29631:131;29790:1;29787;29783:9;29772:20;;29450:348;;;;:::o;29804:191::-;29844:4;29864:20;29882:1;29864:20;:::i;:::-;29859:25;;29898:20;29916:1;29898:20;:::i;:::-;29893:25;;29937:1;29934;29931:8;29928:34;;;29942:18;;:::i;:::-;29928:34;29987:1;29984;29980:9;29972:17;;29804:191;;;;:::o;30001:96::-;30038:7;30067:24;30085:5;30067:24;:::i;:::-;30056:35;;30001:96;;;:::o;30103:90::-;30137:7;30180:5;30173:13;30166:21;30155:32;;30103:90;;;:::o;30199:77::-;30236:7;30265:5;30254:16;;30199:77;;;:::o;30282:149::-;30318:7;30358:66;30351:5;30347:78;30336:89;;30282:149;;;:::o;30437:126::-;30474:7;30514:42;30507:5;30503:54;30492:65;;30437:126;;;:::o;30569:77::-;30606:7;30635:5;30624:16;;30569:77;;;:::o;30652:154::-;30736:6;30731:3;30726;30713:30;30798:1;30789:6;30784:3;30780:16;30773:27;30652:154;;;:::o;30812:307::-;30880:1;30890:113;30904:6;30901:1;30898:13;30890:113;;;30989:1;30984:3;30980:11;30974:18;30970:1;30965:3;30961:11;30954:39;30926:2;30923:1;30919:10;30914:15;;30890:113;;;31021:6;31018:1;31015:13;31012:101;;;31101:1;31092:6;31087:3;31083:16;31076:27;31012:101;30861:258;30812:307;;;:::o;31125:320::-;31169:6;31206:1;31200:4;31196:12;31186:22;;31253:1;31247:4;31243:12;31274:18;31264:81;;31330:4;31322:6;31318:17;31308:27;;31264:81;31392:2;31384:6;31381:14;31361:18;31358:38;31355:84;;;31411:18;;:::i;:::-;31355:84;31176:269;31125:320;;;:::o;31451:281::-;31534:27;31556:4;31534:27;:::i;:::-;31526:6;31522:40;31664:6;31652:10;31649:22;31628:18;31616:10;31613:34;31610:62;31607:88;;;31675:18;;:::i;:::-;31607:88;31715:10;31711:2;31704:22;31494:238;31451:281;;:::o;31738:233::-;31777:3;31800:24;31818:5;31800:24;:::i;:::-;31791:33;;31846:66;31839:5;31836:77;31833:103;;;31916:18;;:::i;:::-;31833:103;31963:1;31956:5;31952:13;31945:20;;31738:233;;;:::o;31977:100::-;32016:7;32045:26;32065:5;32045:26;:::i;:::-;32034:37;;31977:100;;;:::o;32083:94::-;32122:7;32151:20;32165:5;32151:20;:::i;:::-;32140:31;;32083:94;;;:::o;32183:176::-;32215:1;32232:20;32250:1;32232:20;:::i;:::-;32227:25;;32266:20;32284:1;32266:20;:::i;:::-;32261:25;;32305:1;32295:35;;32310:18;;:::i;:::-;32295:35;32351:1;32348;32344:9;32339:14;;32183:176;;;;:::o;32365:180::-;32413:77;32410:1;32403:88;32510:4;32507:1;32500:15;32534:4;32531:1;32524:15;32551:180;32599:77;32596:1;32589:88;32696:4;32693:1;32686:15;32720:4;32717:1;32710:15;32737:180;32785:77;32782:1;32775:88;32882:4;32879:1;32872:15;32906:4;32903:1;32896:15;32923:180;32971:77;32968:1;32961:88;33068:4;33065:1;33058:15;33092:4;33089:1;33082:15;33109:180;33157:77;33154:1;33147:88;33254:4;33251:1;33244:15;33278:4;33275:1;33268:15;33295:117;33404:1;33401;33394:12;33418:117;33527:1;33524;33517:12;33541:117;33650:1;33647;33640:12;33664:117;33773:1;33770;33763:12;33787:117;33896:1;33893;33886:12;33910:117;34019:1;34016;34009:12;34033:102;34074:6;34125:2;34121:7;34116:2;34109:5;34105:14;34101:28;34091:38;;34033:102;;;:::o;34141:94::-;34174:8;34222:5;34218:2;34214:14;34193:35;;34141:94;;;:::o;34241:225::-;34381:34;34377:1;34369:6;34365:14;34358:58;34450:8;34445:2;34437:6;34433:15;34426:33;34241:225;:::o;34472:220::-;34612:34;34608:1;34600:6;34596:14;34589:58;34681:3;34676:2;34668:6;34664:15;34657:28;34472:220;:::o;34698:173::-;34838:25;34834:1;34826:6;34822:14;34815:49;34698:173;:::o;34877:182::-;35017:34;35013:1;35005:6;35001:14;34994:58;34877:182;:::o;35065:180::-;35205:32;35201:1;35193:6;35189:14;35182:56;35065:180;:::o;35251:175::-;35391:27;35387:1;35379:6;35375:14;35368:51;35251:175;:::o;35432:180::-;35572:32;35568:1;35560:6;35556:14;35549:56;35432:180;:::o;35618:178::-;35758:30;35754:1;35746:6;35742:14;35735:54;35618:178;:::o;35802:165::-;35942:17;35938:1;35930:6;35926:14;35919:41;35802:165;:::o;35973:176::-;36113:28;36109:1;36101:6;36097:14;36090:52;35973:176;:::o;36155:155::-;36295:7;36291:1;36283:6;36279:14;36272:31;36155:155;:::o;36316:182::-;36456:34;36452:1;36444:6;36440:14;36433:58;36316:182;:::o;36504:234::-;36644:34;36640:1;36632:6;36628:14;36621:58;36713:17;36708:2;36700:6;36696:15;36689:42;36504:234;:::o;36744:114::-;;:::o;36864:220::-;37004:34;37000:1;36992:6;36988:14;36981:58;37073:3;37068:2;37060:6;37056:15;37049:28;36864:220;:::o;37090:170::-;37230:22;37226:1;37218:6;37214:14;37207:46;37090:170;:::o;37266:122::-;37339:24;37357:5;37339:24;:::i;:::-;37332:5;37329:35;37319:63;;37378:1;37375;37368:12;37319:63;37266:122;:::o;37394:116::-;37464:21;37479:5;37464:21;:::i;:::-;37457:5;37454:32;37444:60;;37500:1;37497;37490:12;37444:60;37394:116;:::o;37516:122::-;37589:24;37607:5;37589:24;:::i;:::-;37582:5;37579:35;37569:63;;37628:1;37625;37618:12;37569:63;37516:122;:::o;37644:120::-;37716:23;37733:5;37716:23;:::i;:::-;37709:5;37706:34;37696:62;;37754:1;37751;37744:12;37696:62;37644:120;:::o;37770:122::-;37843:24;37861:5;37843:24;:::i;:::-;37836:5;37833:35;37823:63;;37882:1;37879;37872:12;37823:63;37770:122;:::o

Swarm Source

ipfs://256fd10108a008dd11a7f5f8be7a174362e9a8ecf1b126d22debd156b8c7206f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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