ETH Price: $3,338.78 (-2.54%)

Token

CryptoCollegeCohort2 (CCC2)
 

Overview

Max Total Supply

158 CCC2

Holders

108

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
supergrem.eth
0x0f03e5264108d7fcFc6963483d990C07Ff043B93
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A course in May 2022 and lifelong community for those who want to build thriving NFTs, DAOs and tokenized communities.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoCollegeCohort2

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity Multiple files format)

File 2 of 6: CryptoCollegeCohort2.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.11;

error NoEthBalance();

import {Ownable} from "./Ownable.sol";
import {SafeTransferLib} from "./SafeTransferLib.sol";

import {ERC1155} from "./ERC1155.sol";

/// @title CryptoCollegeCohort2
/// @author Julian <[email protected]>
contract CryptoCollegeCohort2 is ERC1155, Ownable {
    /*///////////////////////////////////////////////////////////////
                            TOKEN METADATA
    //////////////////////////////////////////////////////////////*/
    string public name;
    string public symbol;
    address public vaultAddress;

    /*///////////////////////////////////////////////////////////////
                            TOKEN DATA
    //////////////////////////////////////////////////////////////*/
    uint256 public immutable blackMaxSupply = 166;
    uint256 public immutable generalMaxSupply = 330;
    uint256 public immutable blackScholarshipTotal = 17;
    uint256 public immutable generalScholarshipTotal = 33;

    uint256 public immutable blackPrice = 0.75 ether;
    uint256 public immutable generalPrice = 0.15 ether;

    uint256 public immutable blackTokenId = 1;
    uint256 public immutable generalTokenId = 2;

    bool public hasSaleStarted = false;

    /*///////////////////////////////////////////////////////////////
                            STORAGE
    //////////////////////////////////////////////////////////////*/
    mapping(uint256 => uint256) private _totalSupply;
    mapping(uint256 => string) public tokenURI;
    mapping(address => uint256) public generalMinted;
    mapping(address => uint256) public blackMinted;

    /*///////////////////////////////////////////////////////////////
                            CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/
    constructor(
        string memory _name,
        string memory _symbol,
        address _vaultAddress,
        string memory _blackTokenUri,
        string memory _generalTokenUri
    ) {
        name = _name;
        symbol = _symbol;
        vaultAddress = _vaultAddress;
        tokenURI[generalTokenId] = _generalTokenUri;
        tokenURI[blackTokenId] = _blackTokenUri;
    }

    /// @notice totalSupply of a token ID
    /// @param id is the ID, either generalTokenId or blackTokenId
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /*///////////////////////////////////////////////////////////////
                            public mint
    //////////////////////////////////////////////////////////////*/
    /// @notice function to mint the black version of the token. can only mint 1 per transaction.
    function mintBlack() external payable {
        require(hasSaleStarted, "CCC2: Sale not started yet.");
        require(
            1 + totalSupply(blackTokenId) <=
                blackMaxSupply - blackScholarshipTotal,
            "CCC2: Black membership sold out."
        );
        require(blackMinted[msg.sender] < 5, "CCC2: you can only mint 5.");
        require(msg.value == blackPrice, "CCC2: Wrong ether value.");

        _mint(msg.sender, blackTokenId, 1, "");

        unchecked {
            blackMinted[msg.sender]++;
        }
    }

    /// @notice function to mint the general version of the token. can only mint 1 per transaction.
    function mintGeneral() external payable {
        require(hasSaleStarted, "CCC2: Sale not started yet.");
        require(
            1 + totalSupply(generalTokenId) <=
                generalMaxSupply - generalScholarshipTotal,
            "CCC2: General membership sold out."
        );
        require(generalMinted[msg.sender] < 5, "CCC2: You can only mint 5.");
        require(msg.value == generalPrice, "CCC2: Wrong ether value.");

        _mint(msg.sender, generalTokenId, 1, "");

        unchecked {
            generalMinted[msg.sender]++;
        }
    }

    /*///////////////////////////////////////////////////////////////
                        ownerOnly FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    /// @notice function to toggle sale state
    function startSale() external onlyOwner {
        hasSaleStarted = true;
    }

    function pauseSale() external onlyOwner {
        hasSaleStarted = false;
    }

    /// @notice function to change the tokenURI
    /// @param _newTokenURI this is the new token uri
    /// @param tokenId this is the token ID that will be set
    function setTokenURI(string memory _newTokenURI, uint256 tokenId)
        external
        onlyOwner
    {
        tokenURI[tokenId] = _newTokenURI;
    }

    /// @notice function for owner to mint (LC)
    /// @param to address to mint it to.
    function mintScholarship(address to) external onlyOwner {
        // mint black
        _mint(to, blackTokenId, blackScholarshipTotal, "");
        // mint general
        _mint(to, generalTokenId, generalScholarshipTotal, "");
    }

    /// @notice function for owner to mint the token,
    /// just in case it's needed, mintScholarship() will be used to mint all the scholarships
    /// @param to address to mint it to.
    /// @param amount the amount that the owner wants to mint.
    /// @param tokenId which token ID 1 for black 2 for general
    function ownerMint(
        address to,
        uint256 amount,
        uint256 tokenId
    ) external onlyOwner {
        require(
            tokenId == generalTokenId || tokenId == blackTokenId,
            "CCC2: Nonexistent token ID."
        );

        if (tokenId == generalTokenId) {
            require(
                amount + totalSupply(generalTokenId) <= generalMaxSupply,
                "CCC2: Amount is larger than totalSupply."
            );
            _mint(to, tokenId, amount, "");
        } else {
            require(
                amount + totalSupply(blackTokenId) <= blackMaxSupply,
                "CCC2: Amount is larger than totalSupply."
            );
            _mint(to, tokenId, amount, "");
        }
    }

    /*///////////////////////////////////////////////////////////////
                            ETH WITHDRAWAL
    //////////////////////////////////////////////////////////////*/

    /// @notice Withdraw all ETH from the contract to the vault addres.
    function withdraw() external onlyOwner {
        if (address(this).balance == 0) revert NoEthBalance();
        SafeTransferLib.safeTransferETH(vaultAddress, address(this).balance);
    }

    /// @notice changing vault address
    /// @param _vaultAddress is the new vaultAddress
    function setVault(address _vaultAddress) external onlyOwner {
        vaultAddress = _vaultAddress;
    }

    /// @notice returns the token URI
    /// @param tokenId which token ID to return 1 or 2.
    function uri(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (bytes(tokenURI[tokenId]).length == 0) {
            return "";
        }

        return tokenURI[tokenId];
    }

    /*///////////////////////////////////////////////////////////////
                    OVERRIDE INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/
    // override _mint to increase total supply of a token
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual override {
        super._mint(account, id, amount, data);

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            _totalSupply[id] += amount;
        }
    }

    function _batchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._batchMint(to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            _totalSupply[ids[i]] += amounts[i];
        }
    }

    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual override {
        super._burn(account, id, amount);

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            _totalSupply[id] -= amount;
        }
    }

    function _batchBurn(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual override {
        super._batchBurn(account, ids, amounts);

        for (uint256 i = 0; i < ids.length; ++i) {
            _totalSupply[ids[i]] -= amounts[i];
        }
    }
}

File 1 of 6: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 6: ERC1155.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Minimalist and gas efficient standard ERC1155 implementation.
/// @author Modified from Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC1155.sol)
abstract contract ERC1155 {
    /*///////////////////////////////////////////////////////////////
                                EVENTS
    //////////////////////////////////////////////////////////////*/

    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 amount
    );

    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] amounts
    );

    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    event URI(string value, uint256 indexed id);

    /*///////////////////////////////////////////////////////////////
                            ERC1155 STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(address => mapping(uint256 => uint256)) public balanceOf;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                             METADATA LOGIC
    //////////////////////////////////////////////////////////////*/

    function uri(uint256 id) public view virtual returns (string memory);

    /*///////////////////////////////////////////////////////////////
                             ERC1155 LOGIC
    //////////////////////////////////////////////////////////////*/

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual {
        require(
            msg.sender == from || isApprovedForAll[from][msg.sender],
            "NOT_AUTHORIZED"
        );

        balanceOf[from][id] -= amount;
        balanceOf[to][id] += amount;

        emit TransferSingle(msg.sender, from, to, id, amount);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155Received(
                    msg.sender,
                    from,
                    id,
                    amount,
                    data
                ) == ERC1155TokenReceiver.onERC1155Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender],
            "NOT_AUTHORIZED"
        );

        for (uint256 i = 0; i < idsLength; ) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            balanceOf[from][id] -= amount;
            balanceOf[to][id] += amount;

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                i++;
            }
        }

        emit TransferBatch(msg.sender, from, to, ids, amounts);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155BatchReceived(
                    msg.sender,
                    from,
                    ids,
                    amounts,
                    data
                ) == ERC1155TokenReceiver.onERC1155BatchReceived.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function balanceOfBatch(address[] memory owners, uint256[] memory ids)
        public
        view
        virtual
        returns (uint256[] memory balances)
    {
        uint256 ownersLength = owners.length; // Saves MLOADs.

        require(ownersLength == ids.length, "LENGTH_MISMATCH");

        balances = new uint256[](owners.length);

        // Unchecked because the only math done is incrementing
        // the array index counter which cannot possibly overflow.
        unchecked {
            for (uint256 i = 0; i < ownersLength; i++) {
                balances[i] = balanceOf[owners[i]][ids[i]];
            }
        }
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId)
        public
        pure
        virtual
        returns (bool)
    {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155
            interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI
    }

    /*///////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        balanceOf[to][id] += amount;

        emit TransferSingle(msg.sender, address(0), to, id, amount);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155Received(
                    msg.sender,
                    address(0),
                    id,
                    amount,
                    data
                ) == ERC1155TokenReceiver.onERC1155Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _batchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < idsLength; ) {
            balanceOf[to][ids[i]] += amounts[i];

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                i++;
            }
        }

        emit TransferBatch(msg.sender, address(0), to, ids, amounts);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155BatchReceived(
                    msg.sender,
                    address(0),
                    ids,
                    amounts,
                    data
                ) == ERC1155TokenReceiver.onERC1155BatchReceived.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _batchBurn(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < idsLength; ) {
            balanceOf[from][ids[i]] -= amounts[i];

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                i++;
            }
        }

        emit TransferBatch(msg.sender, from, address(0), ids, amounts);
    }

    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        balanceOf[from][id] -= amount;

        emit TransferSingle(msg.sender, from, address(0), id, amount);
    }
}

/// @notice A generic interface for a contract which properly accepts ERC1155 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC1155.sol)
interface ERC1155TokenReceiver {
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external returns (bytes4);

    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external returns (bytes4);
}

File 4 of 6: ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*///////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*///////////////////////////////////////////////////////////////
                             EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    bytes32 public constant PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*///////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                              EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                )
            );

            address recoveredAddress = ecrecover(digest, v, r, s);

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 5 of 6: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

File 6 of 6: SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "./ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*///////////////////////////////////////////////////////////////
                            ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool callStatus;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            callStatus := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(callStatus, "ETH_TRANSFER_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                           ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 100 because the calldata length is 4 + 32 * 3.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "APPROVE_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                         INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) {
        assembly {
            // Get how many bytes the call returned.
            let returnDataSize := returndatasize()

            // If the call reverted:
            if iszero(callStatus) {
                // Copy the revert message into memory.
                returndatacopy(0, 0, returnDataSize)

                // Revert with the same message.
                revert(0, returnDataSize)
            }

            switch returnDataSize
            case 32 {
                // Copy the return data into memory.
                returndatacopy(0, 0, returnDataSize)

                // Set success to whether it returned true.
                success := iszero(iszero(mload(0)))
            }
            case 0 {
                // There was no return data.
                success := 1
            }
            default {
                // It returned some malformed input.
                success := 0
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_vaultAddress","type":"address"},{"internalType":"string","name":"_blackTokenUri","type":"string"},{"internalType":"string","name":"_generalTokenUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NoEthBalance","type":"error"},{"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":"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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blackMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blackMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blackPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blackScholarshipTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blackTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generalMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"generalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generalPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generalScholarshipTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generalTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintBlack","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintGeneral","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintScholarship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"_newTokenURI","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultAddress","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61018060405260a660809081525061014a60a090815250601160c090815250602160e090815250670a688906bd8b000061010090815250670214e8348c4f0000610120908152506001610140908152506002610160908152506000600560146101000a81548160ff0219169083151502179055503480156200008057600080fd5b5060405162004580380380620045808339818101604052810190620000a691906200051e565b620000c6620000ba6200019e60201b60201c565b620001a660201b60201c565b8460039080519060200190620000de9291906200026c565b508360049080519060200190620000f79291906200026c565b5082600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101605181526020019081526020016000209080519060200190620001659291906200026c565b5081600760006101405181526020019081526020016000209080519060200190620001929291906200026c565b50505050505062000687565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200027a9062000651565b90600052602060002090601f0160209004810192826200029e5760008555620002ea565b82601f10620002b957805160ff1916838001178555620002ea565b82800160010185558215620002ea579182015b82811115620002e9578251825591602001919060010190620002cc565b5b509050620002f99190620002fd565b5090565b5b8082111562000318576000816000905550600101620002fe565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000385826200033a565b810181811067ffffffffffffffff82111715620003a757620003a66200034b565b5b80604052505050565b6000620003bc6200031c565b9050620003ca82826200037a565b919050565b600067ffffffffffffffff821115620003ed57620003ec6200034b565b5b620003f8826200033a565b9050602081019050919050565b60005b838110156200042557808201518184015260208101905062000408565b8381111562000435576000848401525b50505050565b6000620004526200044c84620003cf565b620003b0565b90508281526020810184848401111562000471576200047062000335565b5b6200047e84828562000405565b509392505050565b600082601f8301126200049e576200049d62000330565b5b8151620004b08482602086016200043b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004e682620004b9565b9050919050565b620004f881620004d9565b81146200050457600080fd5b50565b6000815190506200051881620004ed565b92915050565b600080600080600060a086880312156200053d576200053c62000326565b5b600086015167ffffffffffffffff8111156200055e576200055d6200032b565b5b6200056c8882890162000486565b955050602086015167ffffffffffffffff81111562000590576200058f6200032b565b5b6200059e8882890162000486565b9450506040620005b18882890162000507565b935050606086015167ffffffffffffffff811115620005d557620005d46200032b565b5b620005e38882890162000486565b925050608086015167ffffffffffffffff8111156200060757620006066200032b565b5b620006158882890162000486565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200066a57607f821691505b6020821081141562000681576200068062000622565b5b50919050565b60805160a05160c05160e05161010051610120516101405161016051613e006200078060003960008181610bf201528181611152015281816111de0152818161122a01528181611429015281816115840152611718015260008181610b970152818161117b015281816112e001528181611b2d01528181611c880152611d3501526000818161151e0152611d11015260008181611c220152611fc4015260008181610c13015281816113da0152611fe8015260008181610bb801528181610c4c0152611ade015260008181611206015281816113fb01526120ac015260008181610af3015281816112bc0152611aff0152613e006000f3fe60806040526004361061020e5760003560e01c806362b705d611610118578063b66a0e5d116100a0578063c87b56dd1161006f578063c87b56dd14610728578063d747735014610765578063e985e9c514610790578063f242432a146107cd578063f2fde38b146107f65761020e565b8063b66a0e5d1461067e578063bd85b03914610695578063c492b021146106d2578063c5c29ce3146106fd5761020e565b806381e57eb6116100e757806381e57eb6146105a957806389e11d94146105d45780638da5cb5b146105ff57806395d89b411461062a578063a22cb465146106555761020e565b806362b705d6146105225780636817031b1461055f578063715018a614610588578063757210261461059f5761020e565b80632eb2c2d61161019b5780633ccfd60b1161016a5780633ccfd60b14610461578063430bf08a14610478578063469336ee146104a35780634e1273f4146104ce57806355367ba91461050b5761020e565b80632eb2c2d6146103c8578063388b9fe0146103f157806339786a551461041a57806339f53be8146104575761020e565b80630e89341c116101e25780630e89341c146102e1578063119507f01461031e57806316473cf714610349578063194e6c5e146103725780631c8b232d1461039d5761020e565b8062fdd58e1461021357806301ffc9a71461025057806306fdde031461028d57806309a3beef146102b8575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190612a90565b61081f565b6040516102479190612adf565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612b52565b610844565b6040516102849190612b9a565b60405180910390f35b34801561029957600080fd5b506102a26108d6565b6040516102af9190612c4e565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190612da5565b610964565b005b3480156102ed57600080fd5b5061030860048036038101906103039190612e01565b610a0c565b6040516103159190612c4e565b60405180910390f35b34801561032a57600080fd5b50610333610af1565b6040516103409190612adf565b60405180910390f35b34801561035557600080fd5b50610370600480360381019061036b9190612e2e565b610b15565b005b34801561037e57600080fd5b50610387610c4a565b6040516103949190612adf565b60405180910390f35b3480156103a957600080fd5b506103b2610c6e565b6040516103bf9190612b9a565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190612fc4565b610c81565b005b3480156103fd57600080fd5b5061041860048036038101906104139190613093565b6110d4565b005b34801561042657600080fd5b50610441600480360381019061043c9190612e2e565b611371565b60405161044e9190612adf565b60405180910390f35b61045f611389565b005b34801561046d57600080fd5b5061047661160b565b005b34801561048457600080fd5b5061048d6116f0565b60405161049a91906130f5565b60405180910390f35b3480156104af57600080fd5b506104b8611716565b6040516104c59190612adf565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f091906131d3565b61173a565b6040516105029190613309565b60405180910390f35b34801561051757600080fd5b50610520611894565b005b34801561052e57600080fd5b5061054960048036038101906105449190612e2e565b61192d565b6040516105569190612adf565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190612e2e565b611945565b005b34801561059457600080fd5b5061059d611a05565b005b6105a7611a8d565b005b3480156105b557600080fd5b506105be611d0f565b6040516105cb9190612adf565b60405180910390f35b3480156105e057600080fd5b506105e9611d33565b6040516105f69190612adf565b60405180910390f35b34801561060b57600080fd5b50610614611d57565b60405161062191906130f5565b60405180910390f35b34801561063657600080fd5b5061063f611d81565b60405161064c9190612c4e565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613357565b611e0f565b005b34801561068a57600080fd5b50610693611f0c565b005b3480156106a157600080fd5b506106bc60048036038101906106b79190612e01565b611fa5565b6040516106c99190612adf565b60405180910390f35b3480156106de57600080fd5b506106e7611fc2565b6040516106f49190612adf565b60405180910390f35b34801561070957600080fd5b50610712611fe6565b60405161071f9190612adf565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a9190612e01565b61200a565b60405161075c9190612c4e565b60405180910390f35b34801561077157600080fd5b5061077a6120aa565b6040516107879190612adf565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b29190613397565b6120ce565b6040516107c49190612b9a565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef91906133d7565b6120fd565b005b34801561080257600080fd5b5061081d60048036038101906108189190612e2e565b6124ad565b005b6000602052816000526040600020602052806000526040600020600091509150505481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089f575063d9b67a2660e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108cf5750630e89341c60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600380546108e39061349d565b80601f016020809104026020016040519081016040528092919081815260200182805461090f9061349d565b801561095c5780601f106109315761010080835404028352916020019161095c565b820191906000526020600020905b81548152906001019060200180831161093f57829003601f168201915b505050505081565b61096c6125a5565b73ffffffffffffffffffffffffffffffffffffffff1661098a611d57565b73ffffffffffffffffffffffffffffffffffffffff16146109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d79061351b565b60405180910390fd5b81600760008381526020019081526020016000209080519060200190610a07929190612945565b505050565b60606000600760008481526020019081526020016000208054610a2e9061349d565b90501415610a4d57604051806020016040528060008152509050610aec565b600760008381526020019081526020016000208054610a6b9061349d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a979061349d565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b505050505090505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610b1d6125a5565b73ffffffffffffffffffffffffffffffffffffffff16610b3b611d57565b73ffffffffffffffffffffffffffffffffffffffff1614610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b889061351b565b60405180910390fd5b610bec817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000604051806020016040528060008152506125ad565b610c47817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000604051806020016040528060008152506125ad565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b600560149054906101000a900460ff1681565b60008351905082518114610cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc190613587565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d8a5750600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc0906135f3565b60405180910390fd5b60005b81811015610eed576000858281518110610de957610de8613613565b5b602002602001015190506000858381518110610e0857610e07613613565b5b60200260200101519050806000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206000828254610e719190613671565b92505081905550806000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206000828254610ed791906136a5565b9250508190555082806001019350505050610dcc565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610f649291906136fb565b60405180910390a460008573ffffffffffffffffffffffffffffffffffffffff163b1461105b5763bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168573ffffffffffffffffffffffffffffffffffffffff1663bc197c8133898888886040518663ffffffff1660e01b8152600401610ff3959493929190613787565b6020604051808303816000875af1158015611012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110369190613804565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461108d565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b6110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c39061387d565b60405180910390fd5b505050505050565b6110dc6125a5565b73ffffffffffffffffffffffffffffffffffffffff166110fa611d57565b73ffffffffffffffffffffffffffffffffffffffff1614611150576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111479061351b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081148061119d57507f000000000000000000000000000000000000000000000000000000000000000081145b6111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d3906138e9565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008114156112ba577f000000000000000000000000000000000000000000000000000000000000000061124e7f0000000000000000000000000000000000000000000000000000000000000000611fa5565b8361125991906136a5565b111561129a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112919061397b565b60405180910390fd5b6112b5838284604051806020016040528060008152506125ad565b61136c565b7f00000000000000000000000000000000000000000000000000000000000000006113047f0000000000000000000000000000000000000000000000000000000000000000611fa5565b8361130f91906136a5565b1115611350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113479061397b565b60405180910390fd5b61136b838284604051806020016040528060008152506125ad565b5b505050565b60086020528060005260406000206000915090505481565b600560149054906101000a900460ff166113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf906139e7565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006114249190613671565b61144d7f0000000000000000000000000000000000000000000000000000000000000000611fa5565b600161145991906136a5565b111561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149190613a79565b60405180910390fd5b6005600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390613ae5565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000341461157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157590613b51565b60405180910390fd5b6115ba337f00000000000000000000000000000000000000000000000000000000000000006001604051806020016040528060008152506125ad565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550565b6116136125a5565b73ffffffffffffffffffffffffffffffffffffffff16611631611d57565b73ffffffffffffffffffffffffffffffffffffffff1614611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e9061351b565b60405180910390fd5b60004714156116c2576040517fa8088f3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116ee600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16476125e0565b565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060008351905082518114611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c90613587565b60405180910390fd5b835167ffffffffffffffff8111156117a05761179f612c7a565b5b6040519080825280602002602001820160405280156117ce5781602001602082028036833780820191505090505b50915060005b8181101561188c576000808683815181106117f2576117f1613613565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085838151811061184957611848613613565b5b602002602001015181526020019081526020016000205483828151811061187357611872613613565b5b60200260200101818152505080806001019150506117d4565b505092915050565b61189c6125a5565b73ffffffffffffffffffffffffffffffffffffffff166118ba611d57565b73ffffffffffffffffffffffffffffffffffffffff1614611910576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119079061351b565b60405180910390fd5b6000600560146101000a81548160ff021916908315150217905550565b60096020528060005260406000206000915090505481565b61194d6125a5565b73ffffffffffffffffffffffffffffffffffffffff1661196b611d57565b73ffffffffffffffffffffffffffffffffffffffff16146119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b89061351b565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a0d6125a5565b73ffffffffffffffffffffffffffffffffffffffff16611a2b611d57565b73ffffffffffffffffffffffffffffffffffffffff1614611a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a789061351b565b60405180910390fd5b611a8b6000612633565b565b600560149054906101000a900460ff16611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad3906139e7565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611b289190613671565b611b517f0000000000000000000000000000000000000000000000000000000000000000611fa5565b6001611b5d91906136a5565b1115611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9590613bbd565b60405180910390fd5b6005600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1790613c29565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000003414611c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7990613b51565b60405180910390fd5b611cbe337f00000000000000000000000000000000000000000000000000000000000000006001604051806020016040528060008152506125ad565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60048054611d8e9061349d565b80601f0160208091040260200160405190810160405280929190818152602001828054611dba9061349d565b8015611e075780601f10611ddc57610100808354040283529160200191611e07565b820191906000526020600020905b815481529060010190602001808311611dea57829003601f168201915b505050505081565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f009190612b9a565b60405180910390a35050565b611f146125a5565b73ffffffffffffffffffffffffffffffffffffffff16611f32611d57565b73ffffffffffffffffffffffffffffffffffffffff1614611f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7f9061351b565b60405180910390fd5b6001600560146101000a81548160ff021916908315150217905550565b600060066000838152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600760205280600052604060002060009150905080546120299061349d565b80601f01602080910402602001604051908101604052809291908181526020018280546120559061349d565b80156120a25780601f10612077576101008083540402835291602001916120a2565b820191906000526020600020905b81548152906001019060200180831161208557829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121bd5750600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6121fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f3906135f3565b60405180910390fd5b816000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600082825461225b9190613671565b92505081905550816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060008282546122c191906136a5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62868660405161233e929190613c49565b60405180910390a460008473ffffffffffffffffffffffffffffffffffffffff163b146124355763f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663f23a6e6133888787876040518663ffffffff1660e01b81526004016123cd959493929190613c72565b6020604051808303816000875af11580156123ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124109190613804565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612467565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b6124a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249d9061387d565b60405180910390fd5b5050505050565b6124b56125a5565b73ffffffffffffffffffffffffffffffffffffffff166124d3611d57565b73ffffffffffffffffffffffffffffffffffffffff1614612529576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125209061351b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259090613d3e565b60405180910390fd5b6125a281612633565b50565b600033905090565b6125b9848484846126f9565b81600660008581526020019081526020016000206000828254019250508190555050505050565b600080600080600085875af190508061262e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262590613daa565b60405180910390fd5b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600082825461275891906136a5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6286866040516127d6929190613c49565b60405180910390a460008473ffffffffffffffffffffffffffffffffffffffff163b146128ce5763f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663f23a6e613360008787876040518663ffffffff1660e01b8152600401612866959493929190613c72565b6020604051808303816000875af1158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a99190613804565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612900565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b61293f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129369061387d565b60405180910390fd5b50505050565b8280546129519061349d565b90600052602060002090601f01602090048101928261297357600085556129ba565b82601f1061298c57805160ff19168380011785556129ba565b828001600101855582156129ba579182015b828111156129b957825182559160200191906001019061299e565b5b5090506129c791906129cb565b5090565b5b808211156129e45760008160009055506001016129cc565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a27826129fc565b9050919050565b612a3781612a1c565b8114612a4257600080fd5b50565b600081359050612a5481612a2e565b92915050565b6000819050919050565b612a6d81612a5a565b8114612a7857600080fd5b50565b600081359050612a8a81612a64565b92915050565b60008060408385031215612aa757612aa66129f2565b5b6000612ab585828601612a45565b9250506020612ac685828601612a7b565b9150509250929050565b612ad981612a5a565b82525050565b6000602082019050612af46000830184612ad0565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b2f81612afa565b8114612b3a57600080fd5b50565b600081359050612b4c81612b26565b92915050565b600060208284031215612b6857612b676129f2565b5b6000612b7684828501612b3d565b91505092915050565b60008115159050919050565b612b9481612b7f565b82525050565b6000602082019050612baf6000830184612b8b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bef578082015181840152602081019050612bd4565b83811115612bfe576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c2082612bb5565b612c2a8185612bc0565b9350612c3a818560208601612bd1565b612c4381612c04565b840191505092915050565b60006020820190508181036000830152612c688184612c15565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cb282612c04565b810181811067ffffffffffffffff82111715612cd157612cd0612c7a565b5b80604052505050565b6000612ce46129e8565b9050612cf08282612ca9565b919050565b600067ffffffffffffffff821115612d1057612d0f612c7a565b5b612d1982612c04565b9050602081019050919050565b82818337600083830152505050565b6000612d48612d4384612cf5565b612cda565b905082815260208101848484011115612d6457612d63612c75565b5b612d6f848285612d26565b509392505050565b600082601f830112612d8c57612d8b612c70565b5b8135612d9c848260208601612d35565b91505092915050565b60008060408385031215612dbc57612dbb6129f2565b5b600083013567ffffffffffffffff811115612dda57612dd96129f7565b5b612de685828601612d77565b9250506020612df785828601612a7b565b9150509250929050565b600060208284031215612e1757612e166129f2565b5b6000612e2584828501612a7b565b91505092915050565b600060208284031215612e4457612e436129f2565b5b6000612e5284828501612a45565b91505092915050565b600067ffffffffffffffff821115612e7657612e75612c7a565b5b602082029050602081019050919050565b600080fd5b6000612e9f612e9a84612e5b565b612cda565b90508083825260208201905060208402830185811115612ec257612ec1612e87565b5b835b81811015612eeb5780612ed78882612a7b565b845260208401935050602081019050612ec4565b5050509392505050565b600082601f830112612f0a57612f09612c70565b5b8135612f1a848260208601612e8c565b91505092915050565b600067ffffffffffffffff821115612f3e57612f3d612c7a565b5b612f4782612c04565b9050602081019050919050565b6000612f67612f6284612f23565b612cda565b905082815260208101848484011115612f8357612f82612c75565b5b612f8e848285612d26565b509392505050565b600082601f830112612fab57612faa612c70565b5b8135612fbb848260208601612f54565b91505092915050565b600080600080600060a08688031215612fe057612fdf6129f2565b5b6000612fee88828901612a45565b9550506020612fff88828901612a45565b945050604086013567ffffffffffffffff8111156130205761301f6129f7565b5b61302c88828901612ef5565b935050606086013567ffffffffffffffff81111561304d5761304c6129f7565b5b61305988828901612ef5565b925050608086013567ffffffffffffffff81111561307a576130796129f7565b5b61308688828901612f96565b9150509295509295909350565b6000806000606084860312156130ac576130ab6129f2565b5b60006130ba86828701612a45565b93505060206130cb86828701612a7b565b92505060406130dc86828701612a7b565b9150509250925092565b6130ef81612a1c565b82525050565b600060208201905061310a60008301846130e6565b92915050565b600067ffffffffffffffff82111561312b5761312a612c7a565b5b602082029050602081019050919050565b600061314f61314a84613110565b612cda565b9050808382526020820190506020840283018581111561317257613171612e87565b5b835b8181101561319b57806131878882612a45565b845260208401935050602081019050613174565b5050509392505050565b600082601f8301126131ba576131b9612c70565b5b81356131ca84826020860161313c565b91505092915050565b600080604083850312156131ea576131e96129f2565b5b600083013567ffffffffffffffff811115613208576132076129f7565b5b613214858286016131a5565b925050602083013567ffffffffffffffff811115613235576132346129f7565b5b61324185828601612ef5565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61328081612a5a565b82525050565b60006132928383613277565b60208301905092915050565b6000602082019050919050565b60006132b68261324b565b6132c08185613256565b93506132cb83613267565b8060005b838110156132fc5781516132e38882613286565b97506132ee8361329e565b9250506001810190506132cf565b5085935050505092915050565b6000602082019050818103600083015261332381846132ab565b905092915050565b61333481612b7f565b811461333f57600080fd5b50565b6000813590506133518161332b565b92915050565b6000806040838503121561336e5761336d6129f2565b5b600061337c85828601612a45565b925050602061338d85828601613342565b9150509250929050565b600080604083850312156133ae576133ad6129f2565b5b60006133bc85828601612a45565b92505060206133cd85828601612a45565b9150509250929050565b600080600080600060a086880312156133f3576133f26129f2565b5b600061340188828901612a45565b955050602061341288828901612a45565b945050604061342388828901612a7b565b935050606061343488828901612a7b565b925050608086013567ffffffffffffffff811115613455576134546129f7565b5b61346188828901612f96565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806134b557607f821691505b602082108114156134c9576134c861346e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613505602083612bc0565b9150613510826134cf565b602082019050919050565b60006020820190508181036000830152613534816134f8565b9050919050565b7f4c454e4754485f4d49534d415443480000000000000000000000000000000000600082015250565b6000613571600f83612bc0565b915061357c8261353b565b602082019050919050565b600060208201905081810360008301526135a081613564565b9050919050565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b60006135dd600e83612bc0565b91506135e8826135a7565b602082019050919050565b6000602082019050818103600083015261360c816135d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061367c82612a5a565b915061368783612a5a565b92508282101561369a57613699613642565b5b828203905092915050565b60006136b082612a5a565b91506136bb83612a5a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136f0576136ef613642565b5b828201905092915050565b6000604082019050818103600083015261371581856132ab565b9050818103602083015261372981846132ab565b90509392505050565b600081519050919050565b600082825260208201905092915050565b600061375982613732565b613763818561373d565b9350613773818560208601612bd1565b61377c81612c04565b840191505092915050565b600060a08201905061379c60008301886130e6565b6137a960208301876130e6565b81810360408301526137bb81866132ab565b905081810360608301526137cf81856132ab565b905081810360808301526137e3818461374e565b90509695505050505050565b6000815190506137fe81612b26565b92915050565b60006020828403121561381a576138196129f2565b5b6000613828848285016137ef565b91505092915050565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b6000613867601083612bc0565b915061387282613831565b602082019050919050565b600060208201905081810360008301526138968161385a565b9050919050565b7f434343323a204e6f6e6578697374656e7420746f6b656e2049442e0000000000600082015250565b60006138d3601b83612bc0565b91506138de8261389d565b602082019050919050565b60006020820190508181036000830152613902816138c6565b9050919050565b7f434343323a20416d6f756e74206973206c6172676572207468616e20746f746160008201527f6c537570706c792e000000000000000000000000000000000000000000000000602082015250565b6000613965602883612bc0565b915061397082613909565b604082019050919050565b6000602082019050818103600083015261399481613958565b9050919050565b7f434343323a2053616c65206e6f742073746172746564207965742e0000000000600082015250565b60006139d1601b83612bc0565b91506139dc8261399b565b602082019050919050565b60006020820190508181036000830152613a00816139c4565b9050919050565b7f434343323a2047656e6572616c206d656d6265727368697020736f6c64206f7560008201527f742e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a63602283612bc0565b9150613a6e82613a07565b604082019050919050565b60006020820190508181036000830152613a9281613a56565b9050919050565b7f434343323a20596f752063616e206f6e6c79206d696e7420352e000000000000600082015250565b6000613acf601a83612bc0565b9150613ada82613a99565b602082019050919050565b60006020820190508181036000830152613afe81613ac2565b9050919050565b7f434343323a2057726f6e672065746865722076616c75652e0000000000000000600082015250565b6000613b3b601883612bc0565b9150613b4682613b05565b602082019050919050565b60006020820190508181036000830152613b6a81613b2e565b9050919050565b7f434343323a20426c61636b206d656d6265727368697020736f6c64206f75742e600082015250565b6000613ba7602083612bc0565b9150613bb282613b71565b602082019050919050565b60006020820190508181036000830152613bd681613b9a565b9050919050565b7f434343323a20796f752063616e206f6e6c79206d696e7420352e000000000000600082015250565b6000613c13601a83612bc0565b9150613c1e82613bdd565b602082019050919050565b60006020820190508181036000830152613c4281613c06565b9050919050565b6000604082019050613c5e6000830185612ad0565b613c6b6020830184612ad0565b9392505050565b600060a082019050613c8760008301886130e6565b613c9460208301876130e6565b613ca16040830186612ad0565b613cae6060830185612ad0565b8181036080830152613cc0818461374e565b90509695505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d28602683612bc0565b9150613d3382613ccc565b604082019050919050565b60006020820190508181036000830152613d5781613d1b565b9050919050565b7f4554485f5452414e534645525f4641494c454400000000000000000000000000600082015250565b6000613d94601383612bc0565b9150613d9f82613d5e565b602082019050919050565b60006020820190508181036000830152613dc381613d87565b905091905056fea2646970667358221220c5397f01e8b712de64b0f242cf554ce4c552c26fe323018e51da42fa776b088064736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000009f836913343c0b46771206de4018fcdd0d76a27100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000001443727970746f436f6c6c656765436f686f727432000000000000000000000000000000000000000000000000000000000000000000000000000000000000000443434332000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d594e437073446e634845717143374d7256356f63654d366f5657336d6a444b6d73324676726774634374536400000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d646d536a4857777446747042574b434e724b546e446f38774b794770313241436d47574d64316159485753610000000000000000000000

Deployed Bytecode

0x60806040526004361061020e5760003560e01c806362b705d611610118578063b66a0e5d116100a0578063c87b56dd1161006f578063c87b56dd14610728578063d747735014610765578063e985e9c514610790578063f242432a146107cd578063f2fde38b146107f65761020e565b8063b66a0e5d1461067e578063bd85b03914610695578063c492b021146106d2578063c5c29ce3146106fd5761020e565b806381e57eb6116100e757806381e57eb6146105a957806389e11d94146105d45780638da5cb5b146105ff57806395d89b411461062a578063a22cb465146106555761020e565b806362b705d6146105225780636817031b1461055f578063715018a614610588578063757210261461059f5761020e565b80632eb2c2d61161019b5780633ccfd60b1161016a5780633ccfd60b14610461578063430bf08a14610478578063469336ee146104a35780634e1273f4146104ce57806355367ba91461050b5761020e565b80632eb2c2d6146103c8578063388b9fe0146103f157806339786a551461041a57806339f53be8146104575761020e565b80630e89341c116101e25780630e89341c146102e1578063119507f01461031e57806316473cf714610349578063194e6c5e146103725780631c8b232d1461039d5761020e565b8062fdd58e1461021357806301ffc9a71461025057806306fdde031461028d57806309a3beef146102b8575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190612a90565b61081f565b6040516102479190612adf565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612b52565b610844565b6040516102849190612b9a565b60405180910390f35b34801561029957600080fd5b506102a26108d6565b6040516102af9190612c4e565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190612da5565b610964565b005b3480156102ed57600080fd5b5061030860048036038101906103039190612e01565b610a0c565b6040516103159190612c4e565b60405180910390f35b34801561032a57600080fd5b50610333610af1565b6040516103409190612adf565b60405180910390f35b34801561035557600080fd5b50610370600480360381019061036b9190612e2e565b610b15565b005b34801561037e57600080fd5b50610387610c4a565b6040516103949190612adf565b60405180910390f35b3480156103a957600080fd5b506103b2610c6e565b6040516103bf9190612b9a565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190612fc4565b610c81565b005b3480156103fd57600080fd5b5061041860048036038101906104139190613093565b6110d4565b005b34801561042657600080fd5b50610441600480360381019061043c9190612e2e565b611371565b60405161044e9190612adf565b60405180910390f35b61045f611389565b005b34801561046d57600080fd5b5061047661160b565b005b34801561048457600080fd5b5061048d6116f0565b60405161049a91906130f5565b60405180910390f35b3480156104af57600080fd5b506104b8611716565b6040516104c59190612adf565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f091906131d3565b61173a565b6040516105029190613309565b60405180910390f35b34801561051757600080fd5b50610520611894565b005b34801561052e57600080fd5b5061054960048036038101906105449190612e2e565b61192d565b6040516105569190612adf565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190612e2e565b611945565b005b34801561059457600080fd5b5061059d611a05565b005b6105a7611a8d565b005b3480156105b557600080fd5b506105be611d0f565b6040516105cb9190612adf565b60405180910390f35b3480156105e057600080fd5b506105e9611d33565b6040516105f69190612adf565b60405180910390f35b34801561060b57600080fd5b50610614611d57565b60405161062191906130f5565b60405180910390f35b34801561063657600080fd5b5061063f611d81565b60405161064c9190612c4e565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613357565b611e0f565b005b34801561068a57600080fd5b50610693611f0c565b005b3480156106a157600080fd5b506106bc60048036038101906106b79190612e01565b611fa5565b6040516106c99190612adf565b60405180910390f35b3480156106de57600080fd5b506106e7611fc2565b6040516106f49190612adf565b60405180910390f35b34801561070957600080fd5b50610712611fe6565b60405161071f9190612adf565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a9190612e01565b61200a565b60405161075c9190612c4e565b60405180910390f35b34801561077157600080fd5b5061077a6120aa565b6040516107879190612adf565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b29190613397565b6120ce565b6040516107c49190612b9a565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef91906133d7565b6120fd565b005b34801561080257600080fd5b5061081d60048036038101906108189190612e2e565b6124ad565b005b6000602052816000526040600020602052806000526040600020600091509150505481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089f575063d9b67a2660e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108cf5750630e89341c60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600380546108e39061349d565b80601f016020809104026020016040519081016040528092919081815260200182805461090f9061349d565b801561095c5780601f106109315761010080835404028352916020019161095c565b820191906000526020600020905b81548152906001019060200180831161093f57829003601f168201915b505050505081565b61096c6125a5565b73ffffffffffffffffffffffffffffffffffffffff1661098a611d57565b73ffffffffffffffffffffffffffffffffffffffff16146109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d79061351b565b60405180910390fd5b81600760008381526020019081526020016000209080519060200190610a07929190612945565b505050565b60606000600760008481526020019081526020016000208054610a2e9061349d565b90501415610a4d57604051806020016040528060008152509050610aec565b600760008381526020019081526020016000208054610a6b9061349d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a979061349d565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b505050505090505b919050565b7f00000000000000000000000000000000000000000000000000000000000000a681565b610b1d6125a5565b73ffffffffffffffffffffffffffffffffffffffff16610b3b611d57565b73ffffffffffffffffffffffffffffffffffffffff1614610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b889061351b565b60405180910390fd5b610bec817f00000000000000000000000000000000000000000000000000000000000000017f0000000000000000000000000000000000000000000000000000000000000011604051806020016040528060008152506125ad565b610c47817f00000000000000000000000000000000000000000000000000000000000000027f0000000000000000000000000000000000000000000000000000000000000021604051806020016040528060008152506125ad565b50565b7f000000000000000000000000000000000000000000000000000000000000001181565b600560149054906101000a900460ff1681565b60008351905082518114610cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc190613587565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d8a5750600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc0906135f3565b60405180910390fd5b60005b81811015610eed576000858281518110610de957610de8613613565b5b602002602001015190506000858381518110610e0857610e07613613565b5b60200260200101519050806000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206000828254610e719190613671565b92505081905550806000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206000828254610ed791906136a5565b9250508190555082806001019350505050610dcc565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610f649291906136fb565b60405180910390a460008573ffffffffffffffffffffffffffffffffffffffff163b1461105b5763bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168573ffffffffffffffffffffffffffffffffffffffff1663bc197c8133898888886040518663ffffffff1660e01b8152600401610ff3959493929190613787565b6020604051808303816000875af1158015611012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110369190613804565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461108d565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b6110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c39061387d565b60405180910390fd5b505050505050565b6110dc6125a5565b73ffffffffffffffffffffffffffffffffffffffff166110fa611d57565b73ffffffffffffffffffffffffffffffffffffffff1614611150576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111479061351b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000281148061119d57507f000000000000000000000000000000000000000000000000000000000000000181145b6111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d3906138e9565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000028114156112ba577f000000000000000000000000000000000000000000000000000000000000014a61124e7f0000000000000000000000000000000000000000000000000000000000000002611fa5565b8361125991906136a5565b111561129a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112919061397b565b60405180910390fd5b6112b5838284604051806020016040528060008152506125ad565b61136c565b7f00000000000000000000000000000000000000000000000000000000000000a66113047f0000000000000000000000000000000000000000000000000000000000000001611fa5565b8361130f91906136a5565b1115611350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113479061397b565b60405180910390fd5b61136b838284604051806020016040528060008152506125ad565b5b505050565b60086020528060005260406000206000915090505481565b600560149054906101000a900460ff166113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf906139e7565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000217f000000000000000000000000000000000000000000000000000000000000014a6114249190613671565b61144d7f0000000000000000000000000000000000000000000000000000000000000002611fa5565b600161145991906136a5565b111561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149190613a79565b60405180910390fd5b6005600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390613ae5565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000214e8348c4f0000341461157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157590613b51565b60405180910390fd5b6115ba337f00000000000000000000000000000000000000000000000000000000000000026001604051806020016040528060008152506125ad565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550565b6116136125a5565b73ffffffffffffffffffffffffffffffffffffffff16611631611d57565b73ffffffffffffffffffffffffffffffffffffffff1614611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e9061351b565b60405180910390fd5b60004714156116c2576040517fa8088f3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116ee600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16476125e0565b565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000281565b606060008351905082518114611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c90613587565b60405180910390fd5b835167ffffffffffffffff8111156117a05761179f612c7a565b5b6040519080825280602002602001820160405280156117ce5781602001602082028036833780820191505090505b50915060005b8181101561188c576000808683815181106117f2576117f1613613565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085838151811061184957611848613613565b5b602002602001015181526020019081526020016000205483828151811061187357611872613613565b5b60200260200101818152505080806001019150506117d4565b505092915050565b61189c6125a5565b73ffffffffffffffffffffffffffffffffffffffff166118ba611d57565b73ffffffffffffffffffffffffffffffffffffffff1614611910576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119079061351b565b60405180910390fd5b6000600560146101000a81548160ff021916908315150217905550565b60096020528060005260406000206000915090505481565b61194d6125a5565b73ffffffffffffffffffffffffffffffffffffffff1661196b611d57565b73ffffffffffffffffffffffffffffffffffffffff16146119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b89061351b565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611a0d6125a5565b73ffffffffffffffffffffffffffffffffffffffff16611a2b611d57565b73ffffffffffffffffffffffffffffffffffffffff1614611a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a789061351b565b60405180910390fd5b611a8b6000612633565b565b600560149054906101000a900460ff16611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad3906139e7565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000117f00000000000000000000000000000000000000000000000000000000000000a6611b289190613671565b611b517f0000000000000000000000000000000000000000000000000000000000000001611fa5565b6001611b5d91906136a5565b1115611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9590613bbd565b60405180910390fd5b6005600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1790613c29565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000a688906bd8b00003414611c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7990613b51565b60405180910390fd5b611cbe337f00000000000000000000000000000000000000000000000000000000000000016001604051806020016040528060008152506125ad565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550565b7f0000000000000000000000000000000000000000000000000214e8348c4f000081565b7f000000000000000000000000000000000000000000000000000000000000000181565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60048054611d8e9061349d565b80601f0160208091040260200160405190810160405280929190818152602001828054611dba9061349d565b8015611e075780601f10611ddc57610100808354040283529160200191611e07565b820191906000526020600020905b815481529060010190602001808311611dea57829003601f168201915b505050505081565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f009190612b9a565b60405180910390a35050565b611f146125a5565b73ffffffffffffffffffffffffffffffffffffffff16611f32611d57565b73ffffffffffffffffffffffffffffffffffffffff1614611f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7f9061351b565b60405180910390fd5b6001600560146101000a81548160ff021916908315150217905550565b600060066000838152602001908152602001600020549050919050565b7f0000000000000000000000000000000000000000000000000a688906bd8b000081565b7f000000000000000000000000000000000000000000000000000000000000002181565b600760205280600052604060002060009150905080546120299061349d565b80601f01602080910402602001604051908101604052809291908181526020018280546120559061349d565b80156120a25780601f10612077576101008083540402835291602001916120a2565b820191906000526020600020905b81548152906001019060200180831161208557829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000014a81565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121bd5750600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6121fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f3906135f3565b60405180910390fd5b816000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600082825461225b9190613671565b92505081905550816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060008282546122c191906136a5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62868660405161233e929190613c49565b60405180910390a460008473ffffffffffffffffffffffffffffffffffffffff163b146124355763f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663f23a6e6133888787876040518663ffffffff1660e01b81526004016123cd959493929190613c72565b6020604051808303816000875af11580156123ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124109190613804565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612467565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b6124a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249d9061387d565b60405180910390fd5b5050505050565b6124b56125a5565b73ffffffffffffffffffffffffffffffffffffffff166124d3611d57565b73ffffffffffffffffffffffffffffffffffffffff1614612529576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125209061351b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259090613d3e565b60405180910390fd5b6125a281612633565b50565b600033905090565b6125b9848484846126f9565b81600660008581526020019081526020016000206000828254019250508190555050505050565b600080600080600085875af190508061262e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262590613daa565b60405180910390fd5b505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600082825461275891906136a5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6286866040516127d6929190613c49565b60405180910390a460008473ffffffffffffffffffffffffffffffffffffffff163b146128ce5763f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663f23a6e613360008787876040518663ffffffff1660e01b8152600401612866959493929190613c72565b6020604051808303816000875af1158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a99190613804565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612900565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b61293f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129369061387d565b60405180910390fd5b50505050565b8280546129519061349d565b90600052602060002090601f01602090048101928261297357600085556129ba565b82601f1061298c57805160ff19168380011785556129ba565b828001600101855582156129ba579182015b828111156129b957825182559160200191906001019061299e565b5b5090506129c791906129cb565b5090565b5b808211156129e45760008160009055506001016129cc565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a27826129fc565b9050919050565b612a3781612a1c565b8114612a4257600080fd5b50565b600081359050612a5481612a2e565b92915050565b6000819050919050565b612a6d81612a5a565b8114612a7857600080fd5b50565b600081359050612a8a81612a64565b92915050565b60008060408385031215612aa757612aa66129f2565b5b6000612ab585828601612a45565b9250506020612ac685828601612a7b565b9150509250929050565b612ad981612a5a565b82525050565b6000602082019050612af46000830184612ad0565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b2f81612afa565b8114612b3a57600080fd5b50565b600081359050612b4c81612b26565b92915050565b600060208284031215612b6857612b676129f2565b5b6000612b7684828501612b3d565b91505092915050565b60008115159050919050565b612b9481612b7f565b82525050565b6000602082019050612baf6000830184612b8b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bef578082015181840152602081019050612bd4565b83811115612bfe576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c2082612bb5565b612c2a8185612bc0565b9350612c3a818560208601612bd1565b612c4381612c04565b840191505092915050565b60006020820190508181036000830152612c688184612c15565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cb282612c04565b810181811067ffffffffffffffff82111715612cd157612cd0612c7a565b5b80604052505050565b6000612ce46129e8565b9050612cf08282612ca9565b919050565b600067ffffffffffffffff821115612d1057612d0f612c7a565b5b612d1982612c04565b9050602081019050919050565b82818337600083830152505050565b6000612d48612d4384612cf5565b612cda565b905082815260208101848484011115612d6457612d63612c75565b5b612d6f848285612d26565b509392505050565b600082601f830112612d8c57612d8b612c70565b5b8135612d9c848260208601612d35565b91505092915050565b60008060408385031215612dbc57612dbb6129f2565b5b600083013567ffffffffffffffff811115612dda57612dd96129f7565b5b612de685828601612d77565b9250506020612df785828601612a7b565b9150509250929050565b600060208284031215612e1757612e166129f2565b5b6000612e2584828501612a7b565b91505092915050565b600060208284031215612e4457612e436129f2565b5b6000612e5284828501612a45565b91505092915050565b600067ffffffffffffffff821115612e7657612e75612c7a565b5b602082029050602081019050919050565b600080fd5b6000612e9f612e9a84612e5b565b612cda565b90508083825260208201905060208402830185811115612ec257612ec1612e87565b5b835b81811015612eeb5780612ed78882612a7b565b845260208401935050602081019050612ec4565b5050509392505050565b600082601f830112612f0a57612f09612c70565b5b8135612f1a848260208601612e8c565b91505092915050565b600067ffffffffffffffff821115612f3e57612f3d612c7a565b5b612f4782612c04565b9050602081019050919050565b6000612f67612f6284612f23565b612cda565b905082815260208101848484011115612f8357612f82612c75565b5b612f8e848285612d26565b509392505050565b600082601f830112612fab57612faa612c70565b5b8135612fbb848260208601612f54565b91505092915050565b600080600080600060a08688031215612fe057612fdf6129f2565b5b6000612fee88828901612a45565b9550506020612fff88828901612a45565b945050604086013567ffffffffffffffff8111156130205761301f6129f7565b5b61302c88828901612ef5565b935050606086013567ffffffffffffffff81111561304d5761304c6129f7565b5b61305988828901612ef5565b925050608086013567ffffffffffffffff81111561307a576130796129f7565b5b61308688828901612f96565b9150509295509295909350565b6000806000606084860312156130ac576130ab6129f2565b5b60006130ba86828701612a45565b93505060206130cb86828701612a7b565b92505060406130dc86828701612a7b565b9150509250925092565b6130ef81612a1c565b82525050565b600060208201905061310a60008301846130e6565b92915050565b600067ffffffffffffffff82111561312b5761312a612c7a565b5b602082029050602081019050919050565b600061314f61314a84613110565b612cda565b9050808382526020820190506020840283018581111561317257613171612e87565b5b835b8181101561319b57806131878882612a45565b845260208401935050602081019050613174565b5050509392505050565b600082601f8301126131ba576131b9612c70565b5b81356131ca84826020860161313c565b91505092915050565b600080604083850312156131ea576131e96129f2565b5b600083013567ffffffffffffffff811115613208576132076129f7565b5b613214858286016131a5565b925050602083013567ffffffffffffffff811115613235576132346129f7565b5b61324185828601612ef5565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61328081612a5a565b82525050565b60006132928383613277565b60208301905092915050565b6000602082019050919050565b60006132b68261324b565b6132c08185613256565b93506132cb83613267565b8060005b838110156132fc5781516132e38882613286565b97506132ee8361329e565b9250506001810190506132cf565b5085935050505092915050565b6000602082019050818103600083015261332381846132ab565b905092915050565b61333481612b7f565b811461333f57600080fd5b50565b6000813590506133518161332b565b92915050565b6000806040838503121561336e5761336d6129f2565b5b600061337c85828601612a45565b925050602061338d85828601613342565b9150509250929050565b600080604083850312156133ae576133ad6129f2565b5b60006133bc85828601612a45565b92505060206133cd85828601612a45565b9150509250929050565b600080600080600060a086880312156133f3576133f26129f2565b5b600061340188828901612a45565b955050602061341288828901612a45565b945050604061342388828901612a7b565b935050606061343488828901612a7b565b925050608086013567ffffffffffffffff811115613455576134546129f7565b5b61346188828901612f96565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806134b557607f821691505b602082108114156134c9576134c861346e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613505602083612bc0565b9150613510826134cf565b602082019050919050565b60006020820190508181036000830152613534816134f8565b9050919050565b7f4c454e4754485f4d49534d415443480000000000000000000000000000000000600082015250565b6000613571600f83612bc0565b915061357c8261353b565b602082019050919050565b600060208201905081810360008301526135a081613564565b9050919050565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b60006135dd600e83612bc0565b91506135e8826135a7565b602082019050919050565b6000602082019050818103600083015261360c816135d0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061367c82612a5a565b915061368783612a5a565b92508282101561369a57613699613642565b5b828203905092915050565b60006136b082612a5a565b91506136bb83612a5a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136f0576136ef613642565b5b828201905092915050565b6000604082019050818103600083015261371581856132ab565b9050818103602083015261372981846132ab565b90509392505050565b600081519050919050565b600082825260208201905092915050565b600061375982613732565b613763818561373d565b9350613773818560208601612bd1565b61377c81612c04565b840191505092915050565b600060a08201905061379c60008301886130e6565b6137a960208301876130e6565b81810360408301526137bb81866132ab565b905081810360608301526137cf81856132ab565b905081810360808301526137e3818461374e565b90509695505050505050565b6000815190506137fe81612b26565b92915050565b60006020828403121561381a576138196129f2565b5b6000613828848285016137ef565b91505092915050565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b6000613867601083612bc0565b915061387282613831565b602082019050919050565b600060208201905081810360008301526138968161385a565b9050919050565b7f434343323a204e6f6e6578697374656e7420746f6b656e2049442e0000000000600082015250565b60006138d3601b83612bc0565b91506138de8261389d565b602082019050919050565b60006020820190508181036000830152613902816138c6565b9050919050565b7f434343323a20416d6f756e74206973206c6172676572207468616e20746f746160008201527f6c537570706c792e000000000000000000000000000000000000000000000000602082015250565b6000613965602883612bc0565b915061397082613909565b604082019050919050565b6000602082019050818103600083015261399481613958565b9050919050565b7f434343323a2053616c65206e6f742073746172746564207965742e0000000000600082015250565b60006139d1601b83612bc0565b91506139dc8261399b565b602082019050919050565b60006020820190508181036000830152613a00816139c4565b9050919050565b7f434343323a2047656e6572616c206d656d6265727368697020736f6c64206f7560008201527f742e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a63602283612bc0565b9150613a6e82613a07565b604082019050919050565b60006020820190508181036000830152613a9281613a56565b9050919050565b7f434343323a20596f752063616e206f6e6c79206d696e7420352e000000000000600082015250565b6000613acf601a83612bc0565b9150613ada82613a99565b602082019050919050565b60006020820190508181036000830152613afe81613ac2565b9050919050565b7f434343323a2057726f6e672065746865722076616c75652e0000000000000000600082015250565b6000613b3b601883612bc0565b9150613b4682613b05565b602082019050919050565b60006020820190508181036000830152613b6a81613b2e565b9050919050565b7f434343323a20426c61636b206d656d6265727368697020736f6c64206f75742e600082015250565b6000613ba7602083612bc0565b9150613bb282613b71565b602082019050919050565b60006020820190508181036000830152613bd681613b9a565b9050919050565b7f434343323a20796f752063616e206f6e6c79206d696e7420352e000000000000600082015250565b6000613c13601a83612bc0565b9150613c1e82613bdd565b602082019050919050565b60006020820190508181036000830152613c4281613c06565b9050919050565b6000604082019050613c5e6000830185612ad0565b613c6b6020830184612ad0565b9392505050565b600060a082019050613c8760008301886130e6565b613c9460208301876130e6565b613ca16040830186612ad0565b613cae6060830185612ad0565b8181036080830152613cc0818461374e565b90509695505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d28602683612bc0565b9150613d3382613ccc565b604082019050919050565b60006020820190508181036000830152613d5781613d1b565b9050919050565b7f4554485f5452414e534645525f4641494c454400000000000000000000000000600082015250565b6000613d94601383612bc0565b9150613d9f82613d5e565b602082019050919050565b60006020820190508181036000830152613dc381613d87565b905091905056fea2646970667358221220c5397f01e8b712de64b0f242cf554ce4c552c26fe323018e51da42fa776b088064736f6c634300080b0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000009f836913343c0b46771206de4018fcdd0d76a27100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000001443727970746f436f6c6c656765436f686f727432000000000000000000000000000000000000000000000000000000000000000000000000000000000000000443434332000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d594e437073446e634845717143374d7256356f63654d366f5657336d6a444b6d73324676726774634374536400000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d646d536a4857777446747042574b434e724b546e446f38774b794770313241436d47574d64316159485753610000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): CryptoCollegeCohort2
Arg [1] : _symbol (string): CCC2
Arg [2] : _vaultAddress (address): 0x9F836913343C0B46771206De4018Fcdd0D76A271
Arg [3] : _blackTokenUri (string): ipfs://QmYNCpsDncHEqqC7MrV5oceM6oVW3mjDKms2FvrgtcCtSd
Arg [4] : _generalTokenUri (string): ipfs://QmdmSjHWwtFtpBWKCNrKTnDo8wKyGp12ACmGWMd1aYHWSa

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000009f836913343c0b46771206de4018fcdd0d76a271
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [6] : 43727970746f436f6c6c656765436f686f727432000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4343433200000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [10] : 697066733a2f2f516d594e437073446e634845717143374d7256356f63654d36
Arg [11] : 6f5657336d6a444b6d7332467672677463437453640000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [13] : 697066733a2f2f516d646d536a4857777446747042574b434e724b546e446f38
Arg [14] : 774b794770313241436d47574d64316159485753610000000000000000000000


Deployed Bytecode Sourcemap

305:8410:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1160:64:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4919:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;543:18:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4521:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6823:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;805:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4770:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;909:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1234:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2792:1291:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5325:747:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1552:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3385:568;;;:::i;:::-;;6333:187;;;;;;;;;;;;;:::i;:::-;;593:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1184:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4089:641:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4273:79:1;;;;;;;;;;;;;:::i;:::-;;1606:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6618:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1661:101:4;;;;;;;;;;;;;:::i;:::-;;2729:550:1;;;:::i;:::-;;1080:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1137:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;567:20:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1748:203:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4189:78:1;;;;;;;;;;;;;:::i;:::-;;2335:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1026:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;966:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1504:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;856:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1231:68:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1957:829;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1911:198:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1160:64:2;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4919:376::-;5027:4;5081:10;5066:25;;:11;:25;;;;:100;;;;5156:10;5141:25;;:11;:25;;;;5066:100;:176;;;;5232:10;5217:25;;:11;:25;;;;5066:176;5047:195;;4919:376;;;:::o;543:18:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4521:154::-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4656:12:1::1;4636:8;:17;4645:7;4636:17;;;;;;;;;;;:32;;;;;;;;;;;;:::i;:::-;;4521:154:::0;;:::o;6823:254::-;6931:13;6999:1;6970:8;:17;6979:7;6970:17;;;;;;;;;;;6964:31;;;;;:::i;:::-;;;:36;6960:76;;;7016:9;;;;;;;;;;;;;;;;6960:76;7053:8;:17;7062:7;7053:17;;;;;;;;;;;7046:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6823:254;;;;:::o;805:45::-;;;:::o;4770:233::-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4858:50:1::1;4864:2;4868:12;4882:21;4858:50;;;;;;;;;;;::::0;:5:::1;:50::i;:::-;4942:54;4948:2;4952:14;4968:23;4942:54;;;;;;;;;;;::::0;:5:::1;:54::i;:::-;4770:233:::0;:::o;909:51::-;;;:::o;1234:34::-;;;;;;;;;;;;;:::o;2792:1291:2:-;2987:17;3007:3;:10;2987:30;;3066:7;:14;3053:9;:27;3045:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3146:4;3132:18;;:10;:18;;;:56;;;;3154:16;:22;3171:4;3154:22;;;;;;;;;;;;;;;:34;3177:10;3154:34;;;;;;;;;;;;;;;;;;;;;;;;;3132:56;3111:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;3244:9;3239:367;3263:9;3259:1;:13;3239:367;;;3290:10;3303:3;3307:1;3303:6;;;;;;;;:::i;:::-;;;;;;;;3290:19;;3323:14;3340:7;3348:1;3340:10;;;;;;;;:::i;:::-;;;;;;;;3323:27;;3388:6;3365:9;:15;3375:4;3365:15;;;;;;;;;;;;;;;:19;3381:2;3365:19;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;3429:6;3408:9;:13;3418:2;3408:13;;;;;;;;;;;;;;;:17;3422:2;3408:17;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;3578:3;;;;;;;3276:330;;3239:367;;;;3653:2;3621:49;;3647:4;3621:49;;3635:10;3621:49;;;3657:3;3662:7;3621:49;;;;;;;:::i;:::-;;;;;;;;3720:1;3702:2;:14;;;:19;:332;;3982:52;;;3775:259;;;3796:2;3775:47;;;3844:10;3876:4;3902:3;3927:7;3956:4;3775:203;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:259;;;;3702:332;;;3754:1;3740:16;;:2;:16;;;;3702:332;3681:395;;;;;;;;;;;;:::i;:::-;;;;;;;;;2977:1106;2792:1291;;;;;:::o;5325:747:1:-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5480:14:1::1;5469:7;:25;:52;;;;5509:12;5498:7;:23;5469:52;5448:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;5600:14;5589:7;:25;5585:481;;;5695:16;5664:27;5676:14;5664:11;:27::i;:::-;5655:6;:36;;;;:::i;:::-;:56;;5630:155;;;;;;;;;;;;:::i;:::-;;;;;;;;;5799:30;5805:2;5809:7;5818:6;5799:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;5585:481;;;5923:14;5894:25;5906:12;5894:11;:25::i;:::-;5885:6;:34;;;;:::i;:::-;:52;;5860:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;6025:30;6031:2;6035:7;6044:6;6025:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;5585:481;5325:747:::0;;;:::o;1552:48::-;;;;;;;;;;;;;;;;;:::o;3385:568::-;3443:14;;;;;;;;;;;3435:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;3590:23;3571:16;:42;;;;:::i;:::-;3524:27;3536:14;3524:11;:27::i;:::-;3520:1;:31;;;;:::i;:::-;:93;;3499:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;3719:1;3691:13;:25;3705:10;3691:25;;;;;;;;;;;;;;;;:29;3683:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3782:12;3769:9;:25;3761:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;3834:40;3840:10;3852:14;3868:1;3834:40;;;;;;;;;;;;:5;:40::i;:::-;3909:13;:25;3923:10;3909:25;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;3385:568::o;6333:187::-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6411:1:1::1;6386:21;:26;6382:53;;;6421:14;;;;;;;;;;;;;;6382:53;6445:68;6477:12;;;;;;;;;;;6491:21;6445:31;:68::i;:::-;6333:187::o:0;593:27::-;;;;;;;;;;;;;:::o;1184:43::-;;;:::o;4089:641:2:-;4221:25;4262:20;4285:6;:13;4262:36;;4350:3;:10;4334:12;:26;4326:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;4416:6;:13;4402:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4391:39;;4601:9;4596:118;4620:12;4616:1;:16;4596:118;;;4671:9;:20;4681:6;4688:1;4681:9;;;;;;;;:::i;:::-;;;;;;;;4671:20;;;;;;;;;;;;;;;:28;4692:3;4696:1;4692:6;;;;;;;;:::i;:::-;;;;;;;;4671:28;;;;;;;;;;;;4657:8;4666:1;4657:11;;;;;;;;:::i;:::-;;;;;;;:42;;;;;4634:3;;;;;;;4596:118;;;;4252:478;4089:641;;;;:::o;4273:79:1:-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4340:5:1::1;4323:14;;:22;;;;;;;;;;;;;;;;;;4273:79::o:0;1606:46::-;;;;;;;;;;;;;;;;;:::o;6618:105::-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6703:13:1::1;6688:12;;:28;;;;;;;;;;;;;;;;;;6618:105:::0;:::o;1661:101:4:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;2729:550:1:-;2785:14;;;;;;;;;;;2777:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;2928:21;2911:14;:38;;;;:::i;:::-;2866:25;2878:12;2866:11;:25::i;:::-;2862:1;:29;;;;:::i;:::-;:87;;2841:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;3051:1;3025:11;:23;3037:10;3025:23;;;;;;;;;;;;;;;;:27;3017:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3114:10;3101:9;:23;3093:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;3164:38;3170:10;3182:12;3196:1;3164:38;;;;;;;;;;;;:5;:38::i;:::-;3237:11;:23;3249:10;3237:23;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;2729:550::o;1080:50::-;;;:::o;1137:41::-;;;:::o;1029:85:4:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;567:20:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1748:203:2:-;1874:8;1833:16;:28;1850:10;1833:28;;;;;;;;;;;;;;;:38;1862:8;1833:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;1925:8;1898:46;;1913:10;1898:46;;;1935:8;1898:46;;;;;;:::i;:::-;;;;;;;;1748:203;;:::o;4189:78:1:-;1252:12:4;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4256:4:1::1;4239:14;;:21;;;;;;;;;;;;;;;;;;4189:78::o:0;2335:111::-;2397:7;2423:12;:16;2436:2;2423:16;;;;;;;;;;;;2416:23;;2335:111;;;:::o;1026:48::-;;;:::o;966:53::-;;;:::o;1504:42::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;856:47::-;;;:::o;1231:68:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1957:829::-;2162:4;2148:18;;:10;:18;;;:56;;;;2170:16;:22;2187:4;2170:22;;;;;;;;;;;;;;;:34;2193:10;2170:34;;;;;;;;;;;;;;;;;;;;;;;;;2148:56;2127:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;2278:6;2255:9;:15;2265:4;2255:15;;;;;;;;;;;;;;;:19;2271:2;2255:19;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;2315:6;2294:9;:13;2304:2;2294:13;;;;;;;;;;;;;;;:17;2308:2;2294:17;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;2370:2;2337:48;;2364:4;2337:48;;2352:10;2337:48;;;2374:2;2378:6;2337:48;;;;;;;:::i;:::-;;;;;;;;2435:1;2417:2;:14;;;:19;:320;;2690:47;;;2490:247;;;2511:2;2490:42;;;2554:10;2586:4;2612:2;2636:6;2664:4;2490:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:247;;;;2417:320;;;2469:1;2455:16;;:2;:16;;;;2417:320;2396:383;;;;;;;;;;;;:::i;:::-;;;;;;;;;1957:829;;;;;:::o;1911:198:4:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;640:96:0:-;693:7;719:10;712:17;;640:96;:::o;7334:380:1:-;7487:38;7499:7;7508:2;7512:6;7520:4;7487:11;:38::i;:::-;7691:6;7671:12;:16;7684:2;7671:16;;;;;;;;;;;;:26;;;;;;;;;;;7334:380;;;;:::o;917:305:5:-;989:15;1151:1;1148;1145;1142;1134:6;1130:2;1123:5;1118:35;1104:49;;1181:10;1173:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;979:243;917:305;;:::o;2263:187:4:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;5490:643:2:-;5650:6;5629:9;:13;5639:2;5629:13;;;;;;;;;;;;;;;:17;5643:2;5629:17;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;5711:2;5672:54;;5707:1;5672:54;;5687:10;5672:54;;;5715:2;5719:6;5672:54;;;;;;;:::i;:::-;;;;;;;;5776:1;5758:2;:14;;;:19;:326;;6037:47;;;5831:253;;;5852:2;5831:42;;;5895:10;5935:1;5959:2;5983:6;6011:4;5831:202;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:253;;;;5758:326;;;5810:1;5796:16;;:2;:16;;;;5758:326;5737:389;;;;;;;;;;;;:::i;:::-;;;;;;;;;5490:643;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:6:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:99::-;3265:6;3299:5;3293:12;3283:22;;3213:99;;;:::o;3318:169::-;3402:11;3436:6;3431:3;3424:19;3476:4;3471:3;3467:14;3452:29;;3318:169;;;;:::o;3493:307::-;3561:1;3571:113;3585:6;3582:1;3579:13;3571:113;;;3670:1;3665:3;3661:11;3655:18;3651:1;3646:3;3642:11;3635:39;3607:2;3604:1;3600:10;3595:15;;3571:113;;;3702:6;3699:1;3696:13;3693:101;;;3782:1;3773:6;3768:3;3764:16;3757:27;3693:101;3542:258;3493:307;;;:::o;3806:102::-;3847:6;3898:2;3894:7;3889:2;3882:5;3878:14;3874:28;3864:38;;3806:102;;;:::o;3914:364::-;4002:3;4030:39;4063:5;4030:39;:::i;:::-;4085:71;4149:6;4144:3;4085:71;:::i;:::-;4078:78;;4165:52;4210:6;4205:3;4198:4;4191:5;4187:16;4165:52;:::i;:::-;4242:29;4264:6;4242:29;:::i;:::-;4237:3;4233:39;4226:46;;4006:272;3914:364;;;;:::o;4284:313::-;4397:4;4435:2;4424:9;4420:18;4412:26;;4484:9;4478:4;4474:20;4470:1;4459:9;4455:17;4448:47;4512:78;4585:4;4576:6;4512:78;:::i;:::-;4504:86;;4284:313;;;;:::o;4603:117::-;4712:1;4709;4702:12;4726:117;4835:1;4832;4825:12;4849:180;4897:77;4894:1;4887:88;4994:4;4991:1;4984:15;5018:4;5015:1;5008:15;5035:281;5118:27;5140:4;5118:27;:::i;:::-;5110:6;5106:40;5248:6;5236:10;5233:22;5212:18;5200:10;5197:34;5194:62;5191:88;;;5259:18;;:::i;:::-;5191:88;5299:10;5295:2;5288:22;5078:238;5035:281;;:::o;5322:129::-;5356:6;5383:20;;:::i;:::-;5373:30;;5412:33;5440:4;5432:6;5412:33;:::i;:::-;5322:129;;;:::o;5457:308::-;5519:4;5609:18;5601:6;5598:30;5595:56;;;5631:18;;:::i;:::-;5595:56;5669:29;5691:6;5669:29;:::i;:::-;5661:37;;5753:4;5747;5743:15;5735:23;;5457:308;;;:::o;5771:154::-;5855:6;5850:3;5845;5832:30;5917:1;5908:6;5903:3;5899:16;5892:27;5771:154;;;:::o;5931:412::-;6009:5;6034:66;6050:49;6092:6;6050:49;:::i;:::-;6034:66;:::i;:::-;6025:75;;6123:6;6116:5;6109:21;6161:4;6154:5;6150:16;6199:3;6190:6;6185:3;6181:16;6178:25;6175:112;;;6206:79;;:::i;:::-;6175:112;6296:41;6330:6;6325:3;6320;6296:41;:::i;:::-;6015:328;5931:412;;;;;:::o;6363:340::-;6419:5;6468:3;6461:4;6453:6;6449:17;6445:27;6435:122;;6476:79;;:::i;:::-;6435:122;6593:6;6580:20;6618:79;6693:3;6685:6;6678:4;6670:6;6666:17;6618:79;:::i;:::-;6609:88;;6425:278;6363:340;;;;:::o;6709:654::-;6787:6;6795;6844:2;6832:9;6823:7;6819:23;6815:32;6812:119;;;6850:79;;:::i;:::-;6812:119;6998:1;6987:9;6983:17;6970:31;7028:18;7020:6;7017:30;7014:117;;;7050:79;;:::i;:::-;7014:117;7155:63;7210:7;7201:6;7190:9;7186:22;7155:63;:::i;:::-;7145:73;;6941:287;7267:2;7293:53;7338:7;7329:6;7318:9;7314:22;7293:53;:::i;:::-;7283:63;;7238:118;6709:654;;;;;:::o;7369:329::-;7428:6;7477:2;7465:9;7456:7;7452:23;7448:32;7445:119;;;7483:79;;:::i;:::-;7445:119;7603:1;7628:53;7673:7;7664:6;7653:9;7649:22;7628:53;:::i;:::-;7618:63;;7574:117;7369:329;;;;:::o;7704:::-;7763:6;7812:2;7800:9;7791:7;7787:23;7783:32;7780:119;;;7818:79;;:::i;:::-;7780:119;7938:1;7963:53;8008:7;7999:6;7988:9;7984:22;7963:53;:::i;:::-;7953:63;;7909:117;7704:329;;;;:::o;8039:311::-;8116:4;8206:18;8198:6;8195:30;8192:56;;;8228:18;;:::i;:::-;8192:56;8278:4;8270:6;8266:17;8258:25;;8338:4;8332;8328:15;8320:23;;8039:311;;;:::o;8356:117::-;8465:1;8462;8455:12;8496:710;8592:5;8617:81;8633:64;8690:6;8633:64;:::i;:::-;8617:81;:::i;:::-;8608:90;;8718:5;8747:6;8740:5;8733:21;8781:4;8774:5;8770:16;8763:23;;8834:4;8826:6;8822:17;8814:6;8810:30;8863:3;8855:6;8852:15;8849:122;;;8882:79;;:::i;:::-;8849:122;8997:6;8980:220;9014:6;9009:3;9006:15;8980:220;;;9089:3;9118:37;9151:3;9139:10;9118:37;:::i;:::-;9113:3;9106:50;9185:4;9180:3;9176:14;9169:21;;9056:144;9040:4;9035:3;9031:14;9024:21;;8980:220;;;8984:21;8598:608;;8496:710;;;;;:::o;9229:370::-;9300:5;9349:3;9342:4;9334:6;9330:17;9326:27;9316:122;;9357:79;;:::i;:::-;9316:122;9474:6;9461:20;9499:94;9589:3;9581:6;9574:4;9566:6;9562:17;9499:94;:::i;:::-;9490:103;;9306:293;9229:370;;;;:::o;9605:307::-;9666:4;9756:18;9748:6;9745:30;9742:56;;;9778:18;;:::i;:::-;9742:56;9816:29;9838:6;9816:29;:::i;:::-;9808:37;;9900:4;9894;9890:15;9882:23;;9605:307;;;:::o;9918:410::-;9995:5;10020:65;10036:48;10077:6;10036:48;:::i;:::-;10020:65;:::i;:::-;10011:74;;10108:6;10101:5;10094:21;10146:4;10139:5;10135:16;10184:3;10175:6;10170:3;10166:16;10163:25;10160:112;;;10191:79;;:::i;:::-;10160:112;10281:41;10315:6;10310:3;10305;10281:41;:::i;:::-;10001:327;9918:410;;;;;:::o;10347:338::-;10402:5;10451:3;10444:4;10436:6;10432:17;10428:27;10418:122;;10459:79;;:::i;:::-;10418:122;10576:6;10563:20;10601:78;10675:3;10667:6;10660:4;10652:6;10648:17;10601:78;:::i;:::-;10592:87;;10408:277;10347:338;;;;:::o;10691:1509::-;10845:6;10853;10861;10869;10877;10926:3;10914:9;10905:7;10901:23;10897:33;10894:120;;;10933:79;;:::i;:::-;10894:120;11053:1;11078:53;11123:7;11114:6;11103:9;11099:22;11078:53;:::i;:::-;11068:63;;11024:117;11180:2;11206:53;11251:7;11242:6;11231:9;11227:22;11206:53;:::i;:::-;11196:63;;11151:118;11336:2;11325:9;11321:18;11308:32;11367:18;11359:6;11356:30;11353:117;;;11389:79;;:::i;:::-;11353:117;11494:78;11564:7;11555:6;11544:9;11540:22;11494:78;:::i;:::-;11484:88;;11279:303;11649:2;11638:9;11634:18;11621:32;11680:18;11672:6;11669:30;11666:117;;;11702:79;;:::i;:::-;11666:117;11807:78;11877:7;11868:6;11857:9;11853:22;11807:78;:::i;:::-;11797:88;;11592:303;11962:3;11951:9;11947:19;11934:33;11994:18;11986:6;11983:30;11980:117;;;12016:79;;:::i;:::-;11980:117;12121:62;12175:7;12166:6;12155:9;12151:22;12121:62;:::i;:::-;12111:72;;11905:288;10691:1509;;;;;;;;:::o;12206:619::-;12283:6;12291;12299;12348:2;12336:9;12327:7;12323:23;12319:32;12316:119;;;12354:79;;:::i;:::-;12316:119;12474:1;12499:53;12544:7;12535:6;12524:9;12520:22;12499:53;:::i;:::-;12489:63;;12445:117;12601:2;12627:53;12672:7;12663:6;12652:9;12648:22;12627:53;:::i;:::-;12617:63;;12572:118;12729:2;12755:53;12800:7;12791:6;12780:9;12776:22;12755:53;:::i;:::-;12745:63;;12700:118;12206:619;;;;;:::o;12831:118::-;12918:24;12936:5;12918:24;:::i;:::-;12913:3;12906:37;12831:118;;:::o;12955:222::-;13048:4;13086:2;13075:9;13071:18;13063:26;;13099:71;13167:1;13156:9;13152:17;13143:6;13099:71;:::i;:::-;12955:222;;;;:::o;13183:311::-;13260:4;13350:18;13342:6;13339:30;13336:56;;;13372:18;;:::i;:::-;13336:56;13422:4;13414:6;13410:17;13402:25;;13482:4;13476;13472:15;13464:23;;13183:311;;;:::o;13517:710::-;13613:5;13638:81;13654:64;13711:6;13654:64;:::i;:::-;13638:81;:::i;:::-;13629:90;;13739:5;13768:6;13761:5;13754:21;13802:4;13795:5;13791:16;13784:23;;13855:4;13847:6;13843:17;13835:6;13831:30;13884:3;13876:6;13873:15;13870:122;;;13903:79;;:::i;:::-;13870:122;14018:6;14001:220;14035:6;14030:3;14027:15;14001:220;;;14110:3;14139:37;14172:3;14160:10;14139:37;:::i;:::-;14134:3;14127:50;14206:4;14201:3;14197:14;14190:21;;14077:144;14061:4;14056:3;14052:14;14045:21;;14001:220;;;14005:21;13619:608;;13517:710;;;;;:::o;14250:370::-;14321:5;14370:3;14363:4;14355:6;14351:17;14347:27;14337:122;;14378:79;;:::i;:::-;14337:122;14495:6;14482:20;14520:94;14610:3;14602:6;14595:4;14587:6;14583:17;14520:94;:::i;:::-;14511:103;;14327:293;14250:370;;;;:::o;14626:894::-;14744:6;14752;14801:2;14789:9;14780:7;14776:23;14772:32;14769:119;;;14807:79;;:::i;:::-;14769:119;14955:1;14944:9;14940:17;14927:31;14985:18;14977:6;14974:30;14971:117;;;15007:79;;:::i;:::-;14971:117;15112:78;15182:7;15173:6;15162:9;15158:22;15112:78;:::i;:::-;15102:88;;14898:302;15267:2;15256:9;15252:18;15239:32;15298:18;15290:6;15287:30;15284:117;;;15320:79;;:::i;:::-;15284:117;15425:78;15495:7;15486:6;15475:9;15471:22;15425:78;:::i;:::-;15415:88;;15210:303;14626:894;;;;;:::o;15526:114::-;15593:6;15627:5;15621:12;15611:22;;15526:114;;;:::o;15646:184::-;15745:11;15779:6;15774:3;15767:19;15819:4;15814:3;15810:14;15795:29;;15646:184;;;;:::o;15836:132::-;15903:4;15926:3;15918:11;;15956:4;15951:3;15947:14;15939:22;;15836:132;;;:::o;15974:108::-;16051:24;16069:5;16051:24;:::i;:::-;16046:3;16039:37;15974:108;;:::o;16088:179::-;16157:10;16178:46;16220:3;16212:6;16178:46;:::i;:::-;16256:4;16251:3;16247:14;16233:28;;16088:179;;;;:::o;16273:113::-;16343:4;16375;16370:3;16366:14;16358:22;;16273:113;;;:::o;16422:732::-;16541:3;16570:54;16618:5;16570:54;:::i;:::-;16640:86;16719:6;16714:3;16640:86;:::i;:::-;16633:93;;16750:56;16800:5;16750:56;:::i;:::-;16829:7;16860:1;16845:284;16870:6;16867:1;16864:13;16845:284;;;16946:6;16940:13;16973:63;17032:3;17017:13;16973:63;:::i;:::-;16966:70;;17059:60;17112:6;17059:60;:::i;:::-;17049:70;;16905:224;16892:1;16889;16885:9;16880:14;;16845:284;;;16849:14;17145:3;17138:10;;16546:608;;;16422:732;;;;:::o;17160:373::-;17303:4;17341:2;17330:9;17326:18;17318:26;;17390:9;17384:4;17380:20;17376:1;17365:9;17361:17;17354:47;17418:108;17521:4;17512:6;17418:108;:::i;:::-;17410:116;;17160:373;;;;:::o;17539:116::-;17609:21;17624:5;17609:21;:::i;:::-;17602:5;17599:32;17589:60;;17645:1;17642;17635:12;17589:60;17539:116;:::o;17661:133::-;17704:5;17742:6;17729:20;17720:29;;17758:30;17782:5;17758:30;:::i;:::-;17661:133;;;;:::o;17800:468::-;17865:6;17873;17922:2;17910:9;17901:7;17897:23;17893:32;17890:119;;;17928:79;;:::i;:::-;17890:119;18048:1;18073:53;18118:7;18109:6;18098:9;18094:22;18073:53;:::i;:::-;18063:63;;18019:117;18175:2;18201:50;18243:7;18234:6;18223:9;18219:22;18201:50;:::i;:::-;18191:60;;18146:115;17800:468;;;;;:::o;18274:474::-;18342:6;18350;18399:2;18387:9;18378:7;18374:23;18370:32;18367:119;;;18405:79;;:::i;:::-;18367:119;18525:1;18550:53;18595:7;18586:6;18575:9;18571:22;18550:53;:::i;:::-;18540:63;;18496:117;18652:2;18678:53;18723:7;18714:6;18703:9;18699:22;18678:53;:::i;:::-;18668:63;;18623:118;18274:474;;;;;:::o;18754:1089::-;18858:6;18866;18874;18882;18890;18939:3;18927:9;18918:7;18914:23;18910:33;18907:120;;;18946:79;;:::i;:::-;18907:120;19066:1;19091:53;19136:7;19127:6;19116:9;19112:22;19091:53;:::i;:::-;19081:63;;19037:117;19193:2;19219:53;19264:7;19255:6;19244:9;19240:22;19219:53;:::i;:::-;19209:63;;19164:118;19321:2;19347:53;19392:7;19383:6;19372:9;19368:22;19347:53;:::i;:::-;19337:63;;19292:118;19449:2;19475:53;19520:7;19511:6;19500:9;19496:22;19475:53;:::i;:::-;19465:63;;19420:118;19605:3;19594:9;19590:19;19577:33;19637:18;19629:6;19626:30;19623:117;;;19659:79;;:::i;:::-;19623:117;19764:62;19818:7;19809:6;19798:9;19794:22;19764:62;:::i;:::-;19754:72;;19548:288;18754:1089;;;;;;;;:::o;19849:180::-;19897:77;19894:1;19887:88;19994:4;19991:1;19984:15;20018:4;20015:1;20008:15;20035:320;20079:6;20116:1;20110:4;20106:12;20096:22;;20163:1;20157:4;20153:12;20184:18;20174:81;;20240:4;20232:6;20228:17;20218:27;;20174:81;20302:2;20294:6;20291:14;20271:18;20268:38;20265:84;;;20321:18;;:::i;:::-;20265:84;20086:269;20035:320;;;:::o;20361:182::-;20501:34;20497:1;20489:6;20485:14;20478:58;20361:182;:::o;20549:366::-;20691:3;20712:67;20776:2;20771:3;20712:67;:::i;:::-;20705:74;;20788:93;20877:3;20788:93;:::i;:::-;20906:2;20901:3;20897:12;20890:19;;20549:366;;;:::o;20921:419::-;21087:4;21125:2;21114:9;21110:18;21102:26;;21174:9;21168:4;21164:20;21160:1;21149:9;21145:17;21138:47;21202:131;21328:4;21202:131;:::i;:::-;21194:139;;20921:419;;;:::o;21346:165::-;21486:17;21482:1;21474:6;21470:14;21463:41;21346:165;:::o;21517:366::-;21659:3;21680:67;21744:2;21739:3;21680:67;:::i;:::-;21673:74;;21756:93;21845:3;21756:93;:::i;:::-;21874:2;21869:3;21865:12;21858:19;;21517:366;;;:::o;21889:419::-;22055:4;22093:2;22082:9;22078:18;22070:26;;22142:9;22136:4;22132:20;22128:1;22117:9;22113:17;22106:47;22170:131;22296:4;22170:131;:::i;:::-;22162:139;;21889:419;;;:::o;22314:164::-;22454:16;22450:1;22442:6;22438:14;22431:40;22314:164;:::o;22484:366::-;22626:3;22647:67;22711:2;22706:3;22647:67;:::i;:::-;22640:74;;22723:93;22812:3;22723:93;:::i;:::-;22841:2;22836:3;22832:12;22825:19;;22484:366;;;:::o;22856:419::-;23022:4;23060:2;23049:9;23045:18;23037:26;;23109:9;23103:4;23099:20;23095:1;23084:9;23080:17;23073:47;23137:131;23263:4;23137:131;:::i;:::-;23129:139;;22856:419;;;:::o;23281:180::-;23329:77;23326:1;23319:88;23426:4;23423:1;23416:15;23450:4;23447:1;23440:15;23467:180;23515:77;23512:1;23505:88;23612:4;23609:1;23602:15;23636:4;23633:1;23626:15;23653:191;23693:4;23713:20;23731:1;23713:20;:::i;:::-;23708:25;;23747:20;23765:1;23747:20;:::i;:::-;23742:25;;23786:1;23783;23780:8;23777:34;;;23791:18;;:::i;:::-;23777:34;23836:1;23833;23829:9;23821:17;;23653:191;;;;:::o;23850:305::-;23890:3;23909:20;23927:1;23909:20;:::i;:::-;23904:25;;23943:20;23961:1;23943:20;:::i;:::-;23938:25;;24097:1;24029:66;24025:74;24022:1;24019:81;24016:107;;;24103:18;;:::i;:::-;24016:107;24147:1;24144;24140:9;24133:16;;23850:305;;;;:::o;24161:634::-;24382:4;24420:2;24409:9;24405:18;24397:26;;24469:9;24463:4;24459:20;24455:1;24444:9;24440:17;24433:47;24497:108;24600:4;24591:6;24497:108;:::i;:::-;24489:116;;24652:9;24646:4;24642:20;24637:2;24626:9;24622:18;24615:48;24680:108;24783:4;24774:6;24680:108;:::i;:::-;24672:116;;24161:634;;;;;:::o;24801:98::-;24852:6;24886:5;24880:12;24870:22;;24801:98;;;:::o;24905:168::-;24988:11;25022:6;25017:3;25010:19;25062:4;25057:3;25053:14;25038:29;;24905:168;;;;:::o;25079:360::-;25165:3;25193:38;25225:5;25193:38;:::i;:::-;25247:70;25310:6;25305:3;25247:70;:::i;:::-;25240:77;;25326:52;25371:6;25366:3;25359:4;25352:5;25348:16;25326:52;:::i;:::-;25403:29;25425:6;25403:29;:::i;:::-;25398:3;25394:39;25387:46;;25169:270;25079:360;;;;:::o;25445:1053::-;25768:4;25806:3;25795:9;25791:19;25783:27;;25820:71;25888:1;25877:9;25873:17;25864:6;25820:71;:::i;:::-;25901:72;25969:2;25958:9;25954:18;25945:6;25901:72;:::i;:::-;26020:9;26014:4;26010:20;26005:2;25994:9;25990:18;25983:48;26048:108;26151:4;26142:6;26048:108;:::i;:::-;26040:116;;26203:9;26197:4;26193:20;26188:2;26177:9;26173:18;26166:48;26231:108;26334:4;26325:6;26231:108;:::i;:::-;26223:116;;26387:9;26381:4;26377:20;26371:3;26360:9;26356:19;26349:49;26415:76;26486:4;26477:6;26415:76;:::i;:::-;26407:84;;25445:1053;;;;;;;;:::o;26504:141::-;26560:5;26591:6;26585:13;26576:22;;26607:32;26633:5;26607:32;:::i;:::-;26504:141;;;;:::o;26651:349::-;26720:6;26769:2;26757:9;26748:7;26744:23;26740:32;26737:119;;;26775:79;;:::i;:::-;26737:119;26895:1;26920:63;26975:7;26966:6;26955:9;26951:22;26920:63;:::i;:::-;26910:73;;26866:127;26651:349;;;;:::o;27006:166::-;27146:18;27142:1;27134:6;27130:14;27123:42;27006:166;:::o;27178:366::-;27320:3;27341:67;27405:2;27400:3;27341:67;:::i;:::-;27334:74;;27417:93;27506:3;27417:93;:::i;:::-;27535:2;27530:3;27526:12;27519:19;;27178:366;;;:::o;27550:419::-;27716:4;27754:2;27743:9;27739:18;27731:26;;27803:9;27797:4;27793:20;27789:1;27778:9;27774:17;27767:47;27831:131;27957:4;27831:131;:::i;:::-;27823:139;;27550:419;;;:::o;27975:177::-;28115:29;28111:1;28103:6;28099:14;28092:53;27975:177;:::o;28158:366::-;28300:3;28321:67;28385:2;28380:3;28321:67;:::i;:::-;28314:74;;28397:93;28486:3;28397:93;:::i;:::-;28515:2;28510:3;28506:12;28499:19;;28158:366;;;:::o;28530:419::-;28696:4;28734:2;28723:9;28719:18;28711:26;;28783:9;28777:4;28773:20;28769:1;28758:9;28754:17;28747:47;28811:131;28937:4;28811:131;:::i;:::-;28803:139;;28530:419;;;:::o;28955:227::-;29095:34;29091:1;29083:6;29079:14;29072:58;29164:10;29159:2;29151:6;29147:15;29140:35;28955:227;:::o;29188:366::-;29330:3;29351:67;29415:2;29410:3;29351:67;:::i;:::-;29344:74;;29427:93;29516:3;29427:93;:::i;:::-;29545:2;29540:3;29536:12;29529:19;;29188:366;;;:::o;29560:419::-;29726:4;29764:2;29753:9;29749:18;29741:26;;29813:9;29807:4;29803:20;29799:1;29788:9;29784:17;29777:47;29841:131;29967:4;29841:131;:::i;:::-;29833:139;;29560:419;;;:::o;29985:177::-;30125:29;30121:1;30113:6;30109:14;30102:53;29985:177;:::o;30168:366::-;30310:3;30331:67;30395:2;30390:3;30331:67;:::i;:::-;30324:74;;30407:93;30496:3;30407:93;:::i;:::-;30525:2;30520:3;30516:12;30509:19;;30168:366;;;:::o;30540:419::-;30706:4;30744:2;30733:9;30729:18;30721:26;;30793:9;30787:4;30783:20;30779:1;30768:9;30764:17;30757:47;30821:131;30947:4;30821:131;:::i;:::-;30813:139;;30540:419;;;:::o;30965:221::-;31105:34;31101:1;31093:6;31089:14;31082:58;31174:4;31169:2;31161:6;31157:15;31150:29;30965:221;:::o;31192:366::-;31334:3;31355:67;31419:2;31414:3;31355:67;:::i;:::-;31348:74;;31431:93;31520:3;31431:93;:::i;:::-;31549:2;31544:3;31540:12;31533:19;;31192:366;;;:::o;31564:419::-;31730:4;31768:2;31757:9;31753:18;31745:26;;31817:9;31811:4;31807:20;31803:1;31792:9;31788:17;31781:47;31845:131;31971:4;31845:131;:::i;:::-;31837:139;;31564:419;;;:::o;31989:176::-;32129:28;32125:1;32117:6;32113:14;32106:52;31989:176;:::o;32171:366::-;32313:3;32334:67;32398:2;32393:3;32334:67;:::i;:::-;32327:74;;32410:93;32499:3;32410:93;:::i;:::-;32528:2;32523:3;32519:12;32512:19;;32171:366;;;:::o;32543:419::-;32709:4;32747:2;32736:9;32732:18;32724:26;;32796:9;32790:4;32786:20;32782:1;32771:9;32767:17;32760:47;32824:131;32950:4;32824:131;:::i;:::-;32816:139;;32543:419;;;:::o;32968:174::-;33108:26;33104:1;33096:6;33092:14;33085:50;32968:174;:::o;33148:366::-;33290:3;33311:67;33375:2;33370:3;33311:67;:::i;:::-;33304:74;;33387:93;33476:3;33387:93;:::i;:::-;33505:2;33500:3;33496:12;33489:19;;33148:366;;;:::o;33520:419::-;33686:4;33724:2;33713:9;33709:18;33701:26;;33773:9;33767:4;33763:20;33759:1;33748:9;33744:17;33737:47;33801:131;33927:4;33801:131;:::i;:::-;33793:139;;33520:419;;;:::o;33945:182::-;34085:34;34081:1;34073:6;34069:14;34062:58;33945:182;:::o;34133:366::-;34275:3;34296:67;34360:2;34355:3;34296:67;:::i;:::-;34289:74;;34372:93;34461:3;34372:93;:::i;:::-;34490:2;34485:3;34481:12;34474:19;;34133:366;;;:::o;34505:419::-;34671:4;34709:2;34698:9;34694:18;34686:26;;34758:9;34752:4;34748:20;34744:1;34733:9;34729:17;34722:47;34786:131;34912:4;34786:131;:::i;:::-;34778:139;;34505:419;;;:::o;34930:176::-;35070:28;35066:1;35058:6;35054:14;35047:52;34930:176;:::o;35112:366::-;35254:3;35275:67;35339:2;35334:3;35275:67;:::i;:::-;35268:74;;35351:93;35440:3;35351:93;:::i;:::-;35469:2;35464:3;35460:12;35453:19;;35112:366;;;:::o;35484:419::-;35650:4;35688:2;35677:9;35673:18;35665:26;;35737:9;35731:4;35727:20;35723:1;35712:9;35708:17;35701:47;35765:131;35891:4;35765:131;:::i;:::-;35757:139;;35484:419;;;:::o;35909:332::-;36030:4;36068:2;36057:9;36053:18;36045:26;;36081:71;36149:1;36138:9;36134:17;36125:6;36081:71;:::i;:::-;36162:72;36230:2;36219:9;36215:18;36206:6;36162:72;:::i;:::-;35909:332;;;;;:::o;36247:751::-;36470:4;36508:3;36497:9;36493:19;36485:27;;36522:71;36590:1;36579:9;36575:17;36566:6;36522:71;:::i;:::-;36603:72;36671:2;36660:9;36656:18;36647:6;36603:72;:::i;:::-;36685;36753:2;36742:9;36738:18;36729:6;36685:72;:::i;:::-;36767;36835:2;36824:9;36820:18;36811:6;36767:72;:::i;:::-;36887:9;36881:4;36877:20;36871:3;36860:9;36856:19;36849:49;36915:76;36986:4;36977:6;36915:76;:::i;:::-;36907:84;;36247:751;;;;;;;;:::o;37004:225::-;37144:34;37140:1;37132:6;37128:14;37121:58;37213:8;37208:2;37200:6;37196:15;37189:33;37004:225;:::o;37235:366::-;37377:3;37398:67;37462:2;37457:3;37398:67;:::i;:::-;37391:74;;37474:93;37563:3;37474:93;:::i;:::-;37592:2;37587:3;37583:12;37576:19;;37235:366;;;:::o;37607:419::-;37773:4;37811:2;37800:9;37796:18;37788:26;;37860:9;37854:4;37850:20;37846:1;37835:9;37831:17;37824:47;37888:131;38014:4;37888:131;:::i;:::-;37880:139;;37607:419;;;:::o;38032:169::-;38172:21;38168:1;38160:6;38156:14;38149:45;38032:169;:::o;38207:366::-;38349:3;38370:67;38434:2;38429:3;38370:67;:::i;:::-;38363:74;;38446:93;38535:3;38446:93;:::i;:::-;38564:2;38559:3;38555:12;38548:19;;38207:366;;;:::o;38579:419::-;38745:4;38783:2;38772:9;38768:18;38760:26;;38832:9;38826:4;38822:20;38818:1;38807:9;38803:17;38796:47;38860:131;38986:4;38860:131;:::i;:::-;38852:139;;38579:419;;;:::o

Swarm Source

ipfs://c5397f01e8b712de64b0f242cf554ce4c552c26fe323018e51da42fa776b0880
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.