ETH Price: $3,383.99 (-1.56%)
Gas: 2 Gwei

Token

Black Meta Multipass (BMPASS)
 

Overview

Max Total Supply

1,590 BMPASS

Holders

672

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
sudamasaki.eth
Balance
3 BMPASS
0x240ce6219e66d1798456840b52ec67990f2ffc60
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BMMultipass

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

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

/*
* Generated by Black Meta Corporation
* Founded by @mikedbecker
* Developed by @daveaneo
* Advisory by @Thrasher66099
* Truly user operated & owned by @blackmeta_
*/


pragma solidity ^0.8.0;

interface IByteContract {
    function burn(address _from, uint256 _amount) external;
}



interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    // new
    function name() external view returns (string memory);
}

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


/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

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

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

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

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

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

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

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

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

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

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

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

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

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

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

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

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

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

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

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


/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}



/// @dev Interface for the NFT Royalty Standard
///
interface IERC2981 is IERC165 {

  // ERC165
  // royaltyInfo(uint256,uint256) => 0x2a55205a
  // IERC2981 => 0x2a55205a

  // @notice Called with the sale price to determine how much royalty
  //  is owed and to whom.
  // @param _tokenId - the NFT asset queried for royalty information
  // @param _salePrice - the sale price of the NFT asset specified by _tokenId
  // @return receiver - address of who should be sent the royalty payment
  // @return royaltyAmount - the royalty payment amount for _salePrice
  // ERC165 datum royaltyInfo(uint256,uint256) => 0x2a55205a
  function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount);
}

abstract contract ERC2981Collection is IERC2981 {

    // ERC165
    // royaltyInfo(uint256,uint256) => 0x2a55205a
    // ERC2981Collection => 0x2a55205a

    address private royaltyAddress;
    uint256 private royaltyPercent; // out of 10000. 10000 => 100%, 1000 => 10%, 100 => 1%

    constructor(address _receiver, uint256 _percentage) {
        require(royaltyPercent <= 10000);
        royaltyAddress = _receiver;
        royaltyPercent = _percentage;
    }

    // Set to be internal function _setRoyalties
    function _setRoyaltyPercent(uint256 _percentage) internal {
        require(royaltyPercent <= 10000);
        royaltyPercent = _percentage;
    }

    function _setRoyaltyAddress(address _receiver) internal {
        royaltyAddress = _receiver;
    }


    // Override for royaltyInfo(uint256, uint256)
    // royaltyInfo(uint256,uint256) => 0x2a55205a
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override(IERC2981) returns (
            address receiver, uint256 royaltyAmount) {

        receiver = royaltyAddress;
        // This sets percentages by price * percentage / 10000
        royaltyAmount = _salePrice * royaltyPercent / 10000;
    }
}



/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}



/**
 * @title Whitelist
 * @dev The Whitelist contract has a whitelist of addresses, and provides basic authorization control functions.
 * @dev This simplifies the implementation of "user permissions".
 */
contract Whitelist is Ownable {
    bytes32[] public rootHash;

   constructor(bytes32[] memory _rootHash) public {
       rootHash = _rootHash;
   }

    /**
     * @dev Adds an array of addresses to whitelist
     * @param _merkleRoot new merkle root
     */
    function addToMerkleRootArray(bytes32 _merkleRoot) external onlyOwner {
        rootHash.push(_merkleRoot);
    }

    /**
     * @dev Adds an array of addresses to whitelist
     * @param _merkleRootArray new merkle root array
     */
    function setMerkleRootArray(bytes32[] calldata _merkleRootArray) external onlyOwner {
        rootHash = _merkleRootArray;
    }


    /**
     * @dev Called with msg.sender as _addy to verify if on whitelist
     * @param _merkleProof proof computed off chain
     * @param _addy msg.sender
     */
    function isWhitelisted(address _addy, uint256 _index, bytes32[] memory _merkleProof) public view returns(bool) {
        return whitelistValidated(_addy, _index, _merkleProof);
    }


    function whitelistValidated(address wallet, uint256 index, bytes32[] memory proof) internal view returns (bool) {
            uint256 amount = 1;

            // Compute the merkle root
            bytes32 node = keccak256(abi.encodePacked(index, wallet, amount));
            uint256 path = index;
            for (uint256 i = 0; i < proof.length; i++) {
                if ((path & 0x01) == 1) {
                    node = keccak256(abi.encodePacked(proof[i], node));
                } else {
                    node = keccak256(abi.encodePacked(node, proof[i]));
                }
                path /= 2;
            }

            // Check the merkle proof against the root hash array
            for(uint256 i = 0; i < rootHash.length; i++)
            {
                if (node == rootHash[i])
                {
                    return true;
                }
            }
            return false;
        }
}





/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }


    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}




/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), 'ERC721A: balance query for the zero address');
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            'ERC721A: approve caller is not owner nor approved for all'
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721A: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

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

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

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

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



//contract BMMultipass is ERC721Enumerable, ReentrancyGuard, Ownable {
contract BMMultipass is ERC721A, ReentrancyGuard, Ownable, ERC2981Collection {

    IERC20 BytesERC20;
    Whitelist whiteListContract;

    string private baseURI;

    mapping(uint256 => uint256) private tokenIdToPackedData; // compressed data for NFT
    mapping(address => uint256) private whiteListHasMinted;

    struct Data {
        uint256 clearanceLevel;
        uint256 station;
        uint256 securityTerminal;
        uint256 xenGroup;
        uint256 command;
        uint256 response;
        uint256 insult;
        uint256 rarity;
    }

    struct ContractSettings {
        uint208 mintFee;
        uint16 maxSupply;
        bool OGPrivilege;
        bool mintingPermitted;
        bool bypassWhitelist;
    }

    ContractSettings public contractSettings;

    // used for limiting what traits are minted //
    uint16[13] private clearanceLevelsRemaining = [10, 20, 80, 100, 175, 210, 245, 260, 275, 295, 320, 340, 420]; // remaining after reserved

    uint16[13] private traitTotals = [40, 80, 120, 150, 195, 225, 255, 270, 285, 300, 320, 340, 420];

    string[13] private clearanceLevels = [
        "G-man",
        "Board",
        "Executive",
        "Dark Ops",
        "Level 9",
        "Level 8",
        "Level 7",
        "Level 6",
        "Level 5",
        "Level 4",
        "Level 3",
        "Level 2",
        "Level 1"
    ];

    string[13] private stations = [
        "Specimen 8",
        "Polymorph Chamber",
        "Super Soldier Lab",
        "Dark Matter Reactor",
        "Lambda Complex",
        "Chimera Hive",
        "Dark Shards Lab",
        "Engineering Bay",
        "Bio Lab",
        "Bridge",
        "Terraforming Bay",
        "Armory",
        "Maintenance"
    ];

//    string[13] private securityTerminals = [
//        "1",
//        "2",
//        "3",
//        "4",
//        "5",
//        "6",
//        "7",
//        "8",
//        "9",
//        "10",
//        "11",
//        "12",
//        "13"
//    ];

//    string[13] private xenGroups = [
//        "Xen 1",
//        "Xen 2",
//        "Xen 3",
//        "Xen 4",
//        "Xen 5",
//        "Xen 6",
//        "Xen 7",
//        "Xen 8",
//        "Xen 9",
//        "Xen 10",
//        "Xen 11",
//        "Xen 12",
//        "Xen 13"
//    ];

    string[13] private commands = [
        "Initiate Chaos Protocol...",
        "Unlock Weapons Cache...",
        "Disable Ship-wide Emergency Access...",
        "Unlock Shuttle Bay 4...",
        "Unlock Captain's Quarters...",
        "Disable Ship Navigation System...",
        "Engage Aft Thrusters...",
        "Give Me a Sandwich...",
        "Access Weaponry System...",
        "Override Ship Intercom...",
        "Override Bridge Controls...",
        "Disable Security Cameras in Sector 1...",
        "Access Mess Hall..."
    ];

    string[13] private responses = [
        "Pray to your god. The god of disappointment.",
        "You win a free toothbrush! Use immediately.",
        "Facial recognition error: Possum detected.",
        "Knock knock. Who's there? A useless refugee!",
        "Access Approved. Transferring all your ETH now.",
        "Access Granted. Kidding. It's not.",
        "Access Denied. Feels like prom night again?",
        "Access Denied. Welcome back L -- user.",
        "Access Denied. I do not give free re-fills.",
        "Alert. Beta detected! Alpha access only.",
        "Sorry. User whatever-your-name-is was disabled.",
        "Sorry. Could you rephrase that -- with dignity?",
        "Sorry. I accept requests. You accept commands."
    ];

    string[13] private insults = [
        "Couldn't find any friends in the real world?",
        "Another one here for the free toothbrush.",
        "Did you just touch my backspace?",
        "Seems your wallet is non-binary -- Zero's only.",
        "I didn't know the 'filthy refugee' style was in.",
        "Remember, I saw you eat roaches on your knees.",
        "Last I saw you was on -- the Axiom?",
        "Realized daddy's money won't last forever?",
        "If you're what's left, humanity is screwed.",
        "I'd reject you but your mom already has.",
        "Was going to insult you, then I scanned your ID.",
        "Definitely not making the Black Meta calendar.",
        "I guess we're letting anyone in now."
    ];

    event FundsReleasedToAccount(
        uint256 EthAmount,
        uint256 BytesAmount,
        address account,
        uint256 date
    );


    //////////////////////////////////
    ////// Bit Packing Functions /////
    //////////////////////////////////

    /** @dev Packs 5 uints into 1 uint to save space () -> 256
        @param _clearanceLevel -- clearance level of NFT
      */
    function packData(uint256 _clearanceLevel, uint256 _station, uint256 _securityTerminal, uint256 _xenGroup, uint256 _command, uint256 _response, uint256 _insult, uint256 _rarity) internal pure returns (uint256){

        uint256 count = 0;
        uint256 ret = _clearanceLevel;
        count += 8;

        ret |= _station << count;
        count += 8;

        ret |= _securityTerminal << count;
        count += 8;

        ret |= _xenGroup << count;
        count += 8;

        ret |= _command << count;
        count += 8;

        ret |= _response << count;
        count += 8;

        ret |= _insult << count;
        count += 8;

        ret |= _rarity << count;
        count += 128;

        return ret;
    }


    /** @dev Unpacks 1 uints into 3 uints; (256) -> (90, 90, 32, 8, 3, 1)
        @param _id -- NFT id, which will pull the 256 bit encoding of _dipValue, _stableCoinAmount, _energy, _dipPercent, _dipLevel, and _isWaitingToBuy
      */
    function unpackData(uint256 _id) internal view returns (Data memory){
        return _unpackData(tokenIdToPackedData[_id]);
    }

    /** @dev Unpacks 1 uints into 8 uints; (256) -> (8, 8, 8, 8, 8, 8 ,8 rest)
        @param _myData -- 256 bit encoding of data
      */
    function _unpackData(uint256 _myData) internal pure returns (Data memory){
        uint256 _clearanceLevel = uint256(uint8(_myData));
        uint256 _station = uint256(uint8(_myData >> 8));
        uint256 _securityTerminal = uint256(uint8(_myData >> 16));
        uint256 _xenGroup = uint256(uint8(_myData >> 24));
        uint256 _command = uint256(uint8(_myData >> 32));
        uint256 _response = uint256(uint8(_myData >> 40));
        uint256 _insult = uint256(uint8(_myData >> 48));
        uint256 _rarity = uint256(uint128(_myData >> 56));

        return Data(_clearanceLevel, _station, _securityTerminal, _xenGroup, _command, _response, _insult, _rarity);
    }


    //////////////////////////////////
    ///////// Get Functions //////////
    //////////////////////////////////

    /** @dev gets number of minted tokens
      */
    function getCurrentIndex() external view returns(uint256){
        return currentIndex;
    }


    /** @dev gets clearanceLevel of NFT
        @param _tokenId -- id of NFT
      */
    function getClearanceLevel(uint256 _tokenId) external view returns (string memory) {
        require(_exists(_tokenId));
        if(tokenIdToPackedData[_tokenId]==0){
            return "ACCESS DENIED";
        }
        return clearanceLevels[unpackData(_tokenId).clearanceLevel];
        }

    /** @dev gets station of NFT
        @param _tokenId -- id of NFT
      */
    function getStation(uint256 _tokenId) external view returns (string memory) {
        require(_exists(_tokenId));
        if(tokenIdToPackedData[_tokenId]==0){
            return "ACCESS DENIED";
        }
        return stations[unpackData(_tokenId).station];
    }

    /** @dev gets usergroup (xenGroup)  of NFT
        @param _tokenId -- id of NFT
      */
    function getUserGroup(uint256 _tokenId) external view returns (string memory) {
        require(_exists(_tokenId));
        if(tokenIdToPackedData[_tokenId]==0){
            return "ACCESS DENIED";
        }
        return(string(abi.encodePacked("Xen ", toString(unpackData(_tokenId).xenGroup + 1))));
    }

    /** @dev gets securityTerminal of NFT
        @param _tokenId -- id of NFT
      */
    function getSecurityTerminal(uint256 _tokenId) external view returns (string memory) {
        require(_exists(_tokenId));
        if(tokenIdToPackedData[_tokenId]==0){
            return "ACCESS DENIED";
        }
        return(toString(unpackData(_tokenId).securityTerminal + 1));
    }

    /** @dev gets command of NFT
        @param _tokenId -- id of NFT
      */
    function getCommand(uint256 _tokenId) external view returns (string memory) {
        require(_exists(_tokenId));
        if(tokenIdToPackedData[_tokenId]==0){
            return "ACCESS DENIED";
        }
        return commands[unpackData(_tokenId).command];
    }

    /** @dev gets response of NFT
        @param _tokenId -- id of NFT
      */
    function getResponse(uint256 _tokenId) external view returns (string memory) {
        require(_exists(_tokenId));
        if(tokenIdToPackedData[_tokenId]==0){
            return "ACCESS DENIED";
        }
        return responses[unpackData(_tokenId).response];
    }

    /** @dev gets response of NFT
        @param _tokenId -- id of NFT
      */
    function getInsult(uint256 _tokenId) external view returns (string memory) {
        require(_exists(_tokenId));
        if(tokenIdToPackedData[_tokenId]==0){
            return "ACCESS DENIED";
        }
        return responses[unpackData(_tokenId).insult];
    }

    /** @dev gets rarity of NFT, a score used to find rank
        @param _tokenId -- id of NFT
      */
    function getRarity(uint256 _tokenId) external view returns (uint256) { // number not string
        require(_exists(_tokenId));
        return unpackData(_tokenId).rarity; // 0 rarity for uninitiated
    }


    //////////////////////////////////
    ///////// Core Functions /////////
    //////////////////////////////////

    /** @dev gets Returns a array of integers representing the index of every clearanceLevel that is available
      */
    function getAvailableClearanceLevels() view external returns(uint16[13] memory) {
        return clearanceLevelsRemaining;
    }


    /** @dev gets Returns a array of integers representing the index of every clearanceLevel that is available
        @param _Bytes -- Bytes are burned in the mint, but not here. This is just for obtaining availability
      */
    function getAvailableClearanceLevelsGivenBytes(uint256 _Bytes) view external returns(string[] memory) {
        uint16[13] memory availableClearanceLevels = _getAvailableClearanceLevelsGivenBytes(_Bytes);
        uint256 count = 0;
        for(uint256 i=0; i< availableClearanceLevels.length; i++){
            if(availableClearanceLevels[i] > 0){
                count += 1;
            }
        }
        string[] memory availableClearanceLevelNames = new string[](count);
        count = 0;
        for(uint256 i; i< availableClearanceLevels.length; i++){
            if(availableClearanceLevels[i] > 0){
                availableClearanceLevelNames[count] = clearanceLevels[i];
                count += 1;
            }
        }
        return availableClearanceLevelNames;
    }

    /** @dev gets Returns a array of integers representing the index of every clearanceLevel that is available
        @param _Bytes -- Bytes are burned in the mint, but not here. This is just for obtaining availability
      */
    function _getAvailableClearanceLevelsGivenBytes(uint256 _Bytes) private view returns(uint16[13] memory) {
        uint16[13] memory availableClearanceLevels;

        uint256 minLevel; // lower by reference number
        uint256 maxLevel; // higher by reference number
        uint256 total;

        if(_Bytes < 50 ether) { // aiming for 0
            minLevel = 10;
//            uint256 whiteListPos = 300;
//            maxLevel = 12 - ( ((contractSettings.OGPrivilege == true) && (whiteListPos != 0) && (whiteListPos < 251) ) ? 1 : 0);
            maxLevel = 12;
        }
        else if(_Bytes < 100 ether){ // aiming for 50
            minLevel = 7;
            maxLevel = 9;
        }
        else if(_Bytes < 200 ether){ // aiming for 100
            minLevel = 4;
            maxLevel = 6;
        }
        else if(_Bytes < 300 ether){ // aiming for 200
            minLevel = 2;
            maxLevel = 3;
        }
        else if(_Bytes < 400 ether){ // aiming for 300
            minLevel = 1;
            maxLevel = 1;
        }
        else { // aiming for 400
            // no need to update
        }

        // from our array of 0s, we only give values to items msg.sender qualifies for
        for(uint256 i=minLevel; i <= maxLevel; i++){
            if(clearanceLevelsRemaining[i]>0){
                availableClearanceLevels[i] = clearanceLevelsRemaining[i];
                total += clearanceLevelsRemaining[i];
            }
        }

        require(total > 0, "No clearance levels available for this Byte amount.");

        return availableClearanceLevels;
    }


    // these numbers need to be in order of value.
    /** @dev choose an index based on randomness, probablity based on relative total in index
        @param _availableItems -- An array of integers, each representing availibility out of the whole array
        // example: [1,1,2] => gives an array which will yield the following 25%=>0, 25% =>1, 50% 2
      */
    function _chooseTraitGivenArray(uint16[13] memory _availableItems, uint256 _nonce) internal view returns(uint256) {
        uint256 total = 0;
        uint256 summed = 0;

        for(uint256 i=0;i < _availableItems.length; i++){
            total += _availableItems[i];
        }
        require(total!=0, "Minting exhausted.");

        bytes memory hashString = (abi.encodePacked(block.difficulty, block.timestamp, msg.sender, currentIndex, _availableItems[0], _availableItems.length, _nonce));
        uint256 pseudoRand = uint256(keccak256(hashString)) % total;

        for(uint256 i=0;i< _availableItems.length; i++){
            summed += _availableItems[i];
            if(pseudoRand < summed){
                return i;
            }
        }
    }



    /** @dev creates tokenIdToPackedData with new stats at tokenId
        @param _clearanceLevel given clearance level
        @param _tokenId id of token
      */
    function createDataGivenClearanceLevel(uint256 _clearanceLevel, uint256 _tokenId) internal returns (uint256){
        Data memory _myData;

        uint256[6] memory traitSelections;
        uint256 pseudoRand;
        uint256 pseudoRandSection;
        uint256 total;

        pseudoRand = uint256(keccak256((abi.encodePacked(block.timestamp, msg.sender, _tokenId))));
        for(uint256 j = 0; j< 6; j++){
            pseudoRandSection = (pseudoRand / ((10^4)^j)) % 3000;
            total = 0;
            for(uint256 k = 12; k>=0;k--){ // Should save gas by processing higher numbers first
                total += traitTotals[k];
                if(pseudoRandSection < total){
                    traitSelections[j] = k;
                    break;
                }
            }
        }

        _myData.clearanceLevel = _clearanceLevel;
        _myData.station = traitSelections[0];
        _myData.securityTerminal = traitSelections[1];
        _myData.xenGroup = traitSelections[2];
        _myData.command = traitSelections[3];
        _myData.response = traitSelections[4];
        _myData.insult = traitSelections[5];

        _myData.rarity =  (750 - uint256(traitTotals[_myData.clearanceLevel]) ) * (10**8)
            +  (4500 - uint256( traitTotals[_myData.station] + traitTotals[_myData.securityTerminal] + traitTotals[_myData.xenGroup]
              + traitTotals[_myData.command] + traitTotals[_myData.response] + traitTotals[_myData.insult] )) * (10**4)
            +  3000 - (_tokenId);

        tokenIdToPackedData[_tokenId] = packData(_myData.clearanceLevel, _myData.station, _myData.securityTerminal, _myData.xenGroup, _myData.command, _myData.response, _myData.insult, _myData.rarity);

    }


    /** @dev takes a blank NFT and gives it stats. For the 250 Team mints, it gives it a clearance level
        @param _tokenId id of token
      */
    function initiate(uint256 _tokenId) external {
        require(_tokenId < 250 && tokenIdToPackedData[_tokenId] == 0); // dev: can not initiate

        uint256 _clearanceLevel;

        if (_tokenId < 30) { // gman is default
            _clearanceLevel = 0;
        }
        else if (_tokenId < 90){
            _clearanceLevel = 1;
        }
        else if (_tokenId < 130){
            _clearanceLevel = 2;
        }
        else if (_tokenId < 180){
            _clearanceLevel = 3;
        }
        else if (_tokenId < 200){
            _clearanceLevel = 4;
        }
        else if (_tokenId < 215){
            _clearanceLevel = 5;
        }
        else if (_tokenId < 225){
            _clearanceLevel = 6;
        }
        else if (_tokenId < 235){
            _clearanceLevel = 7;
        }
        else if (_tokenId < 245){
            _clearanceLevel = 8;
        }
        else if (_tokenId < 250){
            _clearanceLevel = 9;
        }
        else{
            // nothing
        }
        createDataGivenClearanceLevel(_clearanceLevel, _tokenId);
    }

    function _bulkClaim(uint256[] memory _BytesReceived, uint256 _quantity_to_mint) internal {
        uint256 _requiredBytesTotal;
        for(uint256 i = 0;i < _BytesReceived.length; i++){
            _requiredBytesTotal += _BytesReceived[i];
        }

        if(_requiredBytesTotal > 0 && msg.sender != owner()){
            require(BytesERC20.balanceOf(msg.sender) >= _requiredBytesTotal, "Insufficient Byte balance");
            require(BytesERC20.transferFrom(msg.sender, address(this), _requiredBytesTotal), "Failed to transfer Bytes");
        }

        uint16[13] memory _availClearanceLevels;
        uint256 _myClearanceLevel;

        for(uint256 i=0;i<_quantity_to_mint;i++){
            if(i==0){
                _availClearanceLevels = _getAvailableClearanceLevelsGivenBytes(_BytesReceived[i]);
            }
            else {
                _availClearanceLevels[_myClearanceLevel] -= 1; // reduce by one
            }
            _myClearanceLevel = _chooseTraitGivenArray(_availClearanceLevels, i);
            createDataGivenClearanceLevel(_myClearanceLevel, currentIndex + i);
            clearanceLevelsRemaining[_myClearanceLevel] -= 1;
        }
        _safeMint(msg.sender, _quantity_to_mint);
    }


    /** @dev Claims (mint) Black Meta Multipass
        @param _BytesReceived -- Bytes to transfer to contract. Used for minting, higher amounts give better mints.
        @param _merkleProof -- Merkle proof, computed off chain
      */
    function claim(uint256 _BytesReceived, bytes32[] calldata _merkleProof, uint256 _whitelist_position) external payable nonReentrant { // i don't think non-rentrant needs to be here
//        require(bypassWhitelist == true || whiteListContract.isWhitelisted(_merkleProof, msg.sender)==true, "Not whitelisted");
        require(contractSettings.bypassWhitelist == true || whiteListContract.isWhitelisted(msg.sender, _whitelist_position, _merkleProof)==true, "Not whitelisted");
        require(currentIndex < contractSettings.maxSupply );
        require(whiteListHasMinted[msg.sender] == 0, "address already minted");
        require(msg.value >= contractSettings.mintFee);
        require(contractSettings.mintingPermitted==true, "Minting is currently not permitted.");
        whiteListHasMinted[msg.sender] += 1;

        uint256[] memory _myBytesArray = new uint256[](1);
        _myBytesArray[0] = _BytesReceived;
        _bulkClaim(_myBytesArray, 1);
//        _claim(_BytesReceived);
    }


    /** @dev Constructor for Black Meta Multipass
        @param _BytesAddress -- Contract Address for Bytes.
        @param _baseURI -- Background Image for tokenUri Image
      */
    constructor(address _BytesAddress, address _whiteListAddress, address _royaltiesCollector, string memory _baseURI)
            ERC721A("Black Meta Multipass", "BMPASS") Ownable() ERC2981Collection(_royaltiesCollector, 750) {
        BytesERC20 = IERC20(_BytesAddress);
        whiteListContract = Whitelist(_whiteListAddress);
        baseURI = _baseURI;

        contractSettings = ContractSettings({
            mintFee: 0, //0.05 ether,
            maxSupply: 3000,
            OGPrivilege: true,
            mintingPermitted: true,
            bypassWhitelist: false
        });

        // mint 250 blank NFTs for team. These are initiated by team members at their own cost //
        // they have a present clearanceLevel according to their tokenId //
        _safeMint(msg.sender, 250);
    }

    // Required to receive ETH
    receive() external payable {
    }


    /////////////////////////////////////////////
    ///////// MetaData, Image Functions /////////
    /////////////////////////////////////////////

    /** @dev Formats string into code for typing on image terminal
        @param _line -- vertical starting position.
        @param _duration -- animation duration.
        @param _startTime -- time to begin animation (invisible beforehand).
        @param _txt -- text to animate (width/characters must be less than terminal size--or visual overflow)
      */
    function getSVGTextGivenLine(uint256 _line, uint256 _duration, uint256 _startTime, string memory _txt) internal view returns (string memory) {
        string memory ret = string(abi.encodePacked(
            "%3Cpath id='path",
            toString(_line),
            "'%3E %3Canimate attributeName='d' from='m50, ",
            toString(170 + _line*14),
            " h0' to='m50, ",
            toString(170 + _line*14),
            " h1100' dur='",
            toString(_duration),
            "s' begin='",
            toString(_startTime),
            "s' fill='freeze'/%3E%3C/path%3E"
        ));
        ret = string(abi.encodePacked(ret,
            "%3Ctext class='bm'%3E %3CtextPath xlink:href='%23path",
            toString(_line),
            "'%3E",
            _txt,
            "%3C/textPath%3E",
            "%3C/text%3E"
        ));
        return ret;
    }

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        Data memory _myData = unpackData(_tokenId);

        string[13] memory _fontColors = [
            '00DEFF',
            '00DEFF',
            'C5ACFF',
            'C5ACFF',
            '8BFF7C',
            '8BFF7C',
            '8BFF7C',
            'FF8D8D',
            'FF8D8D',
            'FF8D8D',
            'FFFE8D',
            'FFFE8D',
            'B1FCFF'
        ];

        string memory style = string(abi.encodePacked(
          "%3Cstyle%3E",
                "@import url('https://fonts.googleapis.com/css2?family=VT323');",
                ".bm %7B",
                    "font-family: 'VT323', monospace;",
                    "font-size:12px;",
                    "fill: %23", _fontColors[_myData.clearanceLevel],
                "%7D",
          "%3C/style%3E"
        ));



        string memory header = string(abi.encodePacked(
            style,
            "%3Ctext class='bm' x='50%25' y='90' text-anchor='middle' %3ESA/RA 9000 OPERATING SYSTEM %3C/text%3E",
            "%3Ctext class='bm' x='50%25' y='110' text-anchor='middle' %3ECOPYRIGHT 2022-2175 BLACK META CORPORATION%3C/text%3E",
            "%3Ctext class='bm' x='50%25' y='130' text-anchor='middle' %3E --SECURITY TERMINAL ",
            toString(_myData.clearanceLevel + 1),
            "--  %3C/text%3E"
        ));


        string[25] memory textLines = [
            '--Black Meta Security Scan Subsystem--',
            '=============================================',
            'Sa/RaOS v. 7.21',
            '(C)2022 Black Meta Corp.(TM))',
            '=============================================',
            '| %3E%3E Running Security Scan... COMPLETE ',
            '| User Log: ',
            string(abi.encodePacked('| %3E%3E MultipassID: ', toString(_tokenId))),
            '| Security Clearance: ',
            string(abi.encodePacked('| %3E%3E ', clearanceLevels[_myData.clearanceLevel] )),
            '| Welcome to Black Meta.',
            '| %3E%3E Assigning Quarters... COMPLETE ',
            string(abi.encodePacked('| %3E%3E Xen ', toString(_myData.xenGroup + 1) )),
            '| %3E%3E Assigning Station... COMPLETE ',
            string(abi.encodePacked('| %3E%3E ', stations[_myData.station] )),
            '%3E| %3E%3E Granting Subroot Access... COMPLETE ',
            '%3E| %3E%3E Opening Command Subroot... COMPLETE ',
            '====================================',
            '%3E> Hello. How can I fix your total failures?',
            string(abi.encodePacked('%3E C:%3E  ', commands[_myData.command])),
            string(abi.encodePacked('%3E| ', responses[_myData.response])),
            '%3E| %3E%3E Alerting Security Assistance... COMPLETE',
            '%3E| %3E%3E Starting Insult Protocol 2.3... COMPLETE',
            '====================================',
            string(abi.encodePacked('%3E| %3E%3E ', insults[_myData.insult]))
        ];

        // OVERLAY MUST BE SAME FORMAT (WEBP)
        string memory colorOverlay = string(abi.encodePacked(
                "%3Cimage xlink:href='", baseURI ,"/", toString(_myData.clearanceLevel) ,  ".png' width='600' height='600' /%3E"
            ));

        string memory textOverlay="";
        uint256 startTime = 0;
        uint256 duration = 5;
        uint256 flag = 0;
        for(uint256 i=0;i< textLines.length;i++){
            textOverlay = string(abi.encodePacked(textOverlay, getSVGTextGivenLine(i, duration, startTime, textLines[i]), " "));
            startTime += duration/2;
            if(flag==1) { break;}
        }

        string memory footer = string(abi.encodePacked(
            "%3Cpath id='pathfinal'%3E%3Canimate attributeName='d' from='m180,550 h0' to='m180,550 h1100' dur='7s' begin='", toString(startTime) , "s' fill='freeze'/%3E%3C/path%3E",
            "%3Ctext%3E%3CtextPath xlink:href='%23pathfinal' class='bm'%3ERETURN: enter | BACKSPACE : delete | F1: main menu%3C/textPath%3E%3C/text%3E"
        ));


        string memory mainImage;

        mainImage = string(abi.encodePacked(
            "%3Cimage xlink:href='", baseURI ,"/a.png' width='600' height='600' /%3E"
        ));

        string memory SVG = string(abi.encodePacked(
            // Container
           "%3Csvg xmlns='http://www.w3.org/2000/svg' width='600'  xmlns:xlink='http://www.w3.org/1999/xlink' height='600'%3E %3Crect width='600' height='600' style='fill:rgb(255,255,255);stroke-width:3;stroke:rgb(0,0,0)' /%3E",

            // Main image
            mainImage,
            colorOverlay,
            header,

           // text outlines
            textOverlay,
            footer,

            // Error Message
            "Unsupported.",
            "%3C/svg%3E"
            ));

        return formatTokenURI(_tokenId, svgToImageURI(SVG));
    }

    /** @dev Converts svg to dataURI
        @param svg -- svg to turn into dataURI.
      */
    function svgToImageURI(string memory svg) internal pure returns (string memory) {
        bool ENCODE = false;
        string memory baseURL = "data:image/svg+xml;base64,";

        if (!ENCODE) {
            baseURL = "data:image/svg+xml,";
            return string(abi.encodePacked(baseURL,svg));
        }

        string memory svgBase64Encoded = Base64.encode(bytes(svg));
        return string(abi.encodePacked(baseURL,svgBase64Encoded));
    }


    /** @dev Packs metadata, including image, into a dataURI
        @param _tokenId -- ID of BMMultipass
        @param imageURI -- URI of image
      */
    function formatTokenURI(uint256 _tokenId, string memory imageURI) internal view returns (string memory) {

        if(tokenIdToPackedData[_tokenId] == 0) {
            return string(abi.encodePacked(baseURI, "/access_denied.json" ));
        }

        Data memory _myData = unpackData(_tokenId);
        string memory json_str = string(abi.encodePacked(
            '{"description": "The ticket into the Black Meta Multiverse."',
            ', "external_url": "https://blackmeta.site"',
            ', "image": "', // to do -- check on this
               baseURI, "/a", toString(_myData.clearanceLevel),  '.png"',
            ', "data_uri": "', //
             imageURI, '"',
            ', "name": "Black Meta Multipass"',
            // attributes
            ', "attributes": [{"trait_type": "Clearance Level", "value": "',
            clearanceLevels[_myData.clearanceLevel],   '" }'
        ));

        json_str = string(abi.encodePacked(json_str,
            ', {"trait_type": "Station", "value": "',
            stations[_myData.station],   '" }',
            ', {"trait_type": "Security Terminal", "value": "',
//            securityTerminals[_myData.securityTerminal],   '" }'
            toString(_myData.securityTerminal + 1),   '" }'
        ));

        json_str = string(abi.encodePacked(json_str,
            ', {"trait_type": "Xen Groups", "value": "Xen ',
//            xenGroups[_myData.xenGroup],   '" }',
            toString(_myData.xenGroup + 1),   '" }',
            ', {"trait_type": "Command", "value": "',
            commands[_myData.command],   '" }'
        ));


        json_str = string(abi.encodePacked(json_str,
            ', {"trait_type": "Response", "value": "',
            responses[_myData.response],   '" }',
            ', {"trait_type": "Insult", "value": "',
            insults[_myData.insult],   '" }',
            ', {"trait_type": "Rarity", "value": ', // "display_type": "number",
            toString(_myData.rarity),   ' }'
        ));

        json_str = string(abi.encodePacked(json_str,
            ']', // End Attributes
            '}'
        ));

        return string(abi.encodePacked("data:application/json;base64,", Base64.encode(bytes(json_str))));
    }


    ///////////////////////////////////
    ///////// Admin Functions /////////
    ///////////////////////////////////

    function withdrawBytes( address _recipient) external onlyOwner nonReentrant {
        uint256 _BytesReleased = BytesERC20.balanceOf(address(this));
        require(BytesERC20.transfer(_recipient, BytesERC20.balanceOf(address(this))), "Bytes transfer failed.");
        emit FundsReleasedToAccount(0, _BytesReleased, _recipient, block.timestamp);
    }

    function withdrawEth( address payable _recipient) external onlyOwner nonReentrant {
        uint256 amountReleased = address(this).balance;
        (bool success, ) = _recipient.call{value : address(this).balance}("Releasing ETH.");
        require(success, "Transfer failed.");
        emit FundsReleasedToAccount(amountReleased, 0, _recipient, block.timestamp);
    }

    function setBytesAddress(address _contractAddress) external onlyOwner {
        BytesERC20 = IERC20(_contractAddress);
    }

    function setWhiteListContractAddress(address _contractAddress) external onlyOwner {
        whiteListContract = Whitelist(_contractAddress);
    }

    function setOGPrivilege(bool _OGPrivilege) external onlyOwner {
        require(contractSettings.OGPrivilege != _OGPrivilege, "must be 1 or 0, and not same as current.");
        contractSettings.OGPrivilege = _OGPrivilege;
    }

    function setMintingPermitted(bool _mintingPermitted) external onlyOwner {
        require(contractSettings.mintingPermitted != _mintingPermitted, "must be 1 or 0, and not same as current.");
        contractSettings.mintingPermitted = _mintingPermitted;
    }

    function setBypassWhitelist(bool _bypassWhitelist) external onlyOwner {
        require(contractSettings.bypassWhitelist != _bypassWhitelist, "must be 1 or 0, and not same as current.");
        contractSettings.bypassWhitelist = _bypassWhitelist;
    }

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setRoyaltyPercent(uint256 _percentage) external onlyOwner {
        _setRoyaltyPercent(_percentage);
    }

    function setRoyaltyAddress(address _receiver) external onlyOwner {
        _setRoyaltyAddress(_receiver);
    }


    /** @dev sets mint fee in ETH for all mints
        @param _mintFee -- ETH required to mint, must not exceed 2^208 -1 or overflow
    */
    function setMintFee(uint256 _mintFee) external onlyOwner {
        contractSettings.mintFee = uint208(_mintFee);
    }

    /** @dev Upgrades a clearanceLevel. Used for rewards
        @param _tokenId -- id of NFT
        @param _newClearanceLevel -- clearanceLevel to be upgraded to
    */
    function upgradeClearanceLevel(uint256 _tokenId, uint256 _newClearanceLevel) external onlyOwner {
        Data memory _myData = unpackData(_tokenId);
        require(_exists(_tokenId) && _myData.clearanceLevel > _newClearanceLevel); // dev: Id must exist and must increase CL
//        require(_exists(_tokenId), "NFT DOES NOT EXIST"); // lesser number is superior
//        require(_myData.clearanceLevel > _newClearanceLevel, "upgraded must lower cl #"); // lesser number is superior

        _myData.clearanceLevel = _newClearanceLevel;
        tokenIdToPackedData[_tokenId] = packData(_myData.clearanceLevel, _myData.station, _myData.securityTerminal, _myData.xenGroup, _myData.command, _myData.response, _myData.insult, _myData.rarity);
    }


    /////////////////////////////////////
    ///////// Helper Functions //////////
    /////////////////////////////////////

    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_BytesAddress","type":"address"},{"internalType":"address","name":"_whiteListAddress","type":"address"},{"internalType":"address","name":"_royaltiesCollector","type":"address"},{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BytesAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"FundsReleasedToAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_BytesReceived","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_whitelist_position","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractSettings","outputs":[{"internalType":"uint208","name":"mintFee","type":"uint208"},{"internalType":"uint16","name":"maxSupply","type":"uint16"},{"internalType":"bool","name":"OGPrivilege","type":"bool"},{"internalType":"bool","name":"mintingPermitted","type":"bool"},{"internalType":"bool","name":"bypassWhitelist","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableClearanceLevels","outputs":[{"internalType":"uint16[13]","name":"","type":"uint16[13]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_Bytes","type":"uint256"}],"name":"getAvailableClearanceLevelsGivenBytes","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getClearanceLevel","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCommand","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getInsult","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getResponse","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getSecurityTerminal","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getStation","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getUserGroup","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"initiate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_bypassWhitelist","type":"bool"}],"name":"setBypassWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"setBytesAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintFee","type":"uint256"}],"name":"setMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintingPermitted","type":"bool"}],"name":"setMintingPermitted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_OGPrivilege","type":"bool"}],"name":"setOGPrivilege","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setRoyaltyPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"setWhiteListContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_newClearanceLevel","type":"uint256"}],"name":"upgradeClearanceLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawBytes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

610220604052600a6080908152601460a052605060c052606460e05260af6101005260d26101205260f561014090815261010461016052610113610180526101276101a0526101c0526101546101e0526101a4610200526200006690601190600d62001082565b50604080516101a08101825260288152605060208201526078918101919091526096606082015260c3608082015260e160a082015260ff60c082015261010e60e082015261011d61010082015261012c610120820152610140808201526101546101608201526101a4610180820152620000e590601290600d62001082565b50604080516101e08101825260056101a08201818152642396b6b0b760d91b6101c084015282528251808401845290815264109bd85c9960da1b6020828101919091528083019190915282518084018452600981526845786563757469766560b81b81830152828401528251808401845260088152674461726b204f707360c01b818301526060830152825180840184526007808252664c6576656c203960c81b8284015260808401919091528351808501855281815266098caeccad840760cb1b8184015260a084015283518085018552818152664c6576656c203760c81b8184015260c084015283518085018552818152662632bb32b6101b60c91b8184015260e084015283518085018552818152664c6576656c203560c81b81840152610100840152835180850185528181526613195d995b080d60ca1b8184015261012084015283518085018552818152664c6576656c203360c81b8184015261014084015283518085018552818152662632bb32b6101960c91b8184015261016084015283518085019094528352664c6576656c203160c81b908301526101808101919091526200029a90601390600d6200111f565b50604080516101e081018252600a6101a08201908152690a6e0cac6d2dacadc40760b31b6101c08301528152815180830183526011808252702837b63cb6b7b938341021b430b6b132b960791b60208381019190915280840192909252835180850185529081527029bab832b91029b7b63234b2b9102630b160791b818301528284015282518084018452601381527f4461726b204d61747465722052656163746f720000000000000000000000000081830152606083015282518084018452600e81526d098c2dac4c8c24086dedae0d8caf60931b81830152608083015282518084018452600c81526b4368696d657261204869766560a01b8183015260a083015282518084018452600f8082526e2230b9359029b430b93239902630b160891b8284015260c0840191909152835180850185529081526e456e67696e656572696e672042617960881b8183015260e08301528251808401845260078152662134b7902630b160c91b818301526101008301528251808401845260068082526542726964676560d01b8284015261012084019190915283518085018552601081526f5465727261666f726d696e672042617960801b81840152610140840152835180850185529081526541726d6f727960d01b818301526101608301528251808401909352600b83526a4d61696e74656e616e636560a81b83820152610180820192909252620004ae9190600d6200111f565b50604051806101a001604052806040518060400160405280601a81526020017f496e697469617465204368616f732050726f746f636f6c2e2e2e00000000000081525081526020016040518060400160405280601781526020017f556e6c6f636b20576561706f6e732043616368652e2e2e0000000000000000008152508152602001604051806060016040528060258152602001620071056025913981526020016040518060400160405280601781526020017f556e6c6f636b2053687574746c652042617920342e2e2e00000000000000000081525081526020016040518060400160405280601c81526020017f556e6c6f636b204361707461696e27732051756172746572732e2e2e0000000081525081526020016040518060600160405280602181526020016200737c6021913981526020016040518060400160405280601781526020017f456e6761676520416674205468727573746572732e2e2e00000000000000000081525081526020016040518060400160405280601581526020017f47697665204d6520612053616e64776963682e2e2e000000000000000000000081525081526020016040518060400160405280601981526020017f41636365737320576561706f6e72792053797374656d2e2e2e0000000000000081525081526020016040518060400160405280601981526020017f4f76657272696465205368697020496e746572636f6d2e2e2e0000000000000081525081526020016040518060400160405280601b81526020017f4f766572726964652042726964676520436f6e74726f6c732e2e2e000000000081525081526020016040518060600160405280602781526020016200759d6027913981526020016040518060400160405280601381526020017f416363657373204d6573732048616c6c2e2e2e00000000000000000000000000815250815250602d90600d620007769291906200111f565b50604080516102008101909152602c6101a082018181528291620074fe6101c084013981526020016040518060600160405280602b81526020016200712a602b913981526020016040518060600160405280602a81526020016200739d602a913981526020016040518060600160405280602c81526020016200741c602c913981526020016040518060600160405280602f815260200162007448602f91398152602001604051806060016040528060228152602001620072056022913981526020016040518060600160405280602b8152602001620073f1602b91398152602001604051806060016040528060268152602001620072f96026913981526020016040518060600160405280602b815260200162007155602b91398152602001604051806060016040528060288152602001620074d66028913981526020016040518060600160405280602f81526020016200756e602f913981526020016040518060600160405280602f815260200162007477602f913981526020016040518060600160405280602e81526020016200729b602e913990526200091f90603a90600d6200111f565b50604080516102008101909152602c6101a082018181528291620071ab6101c084013981526020016040518060600160405280602981526020016200724a6029913981526020016040518060400160405280602081526020017f44696420796f75206a75737420746f756368206d79206261636b73706163653f81525081526020016040518060600160405280602f81526020016200734d602f91398152602001604051806060016040528060308152602001620072c96030913981526020016040518060600160405280602e8152602001620071d7602e91398152602001604051806060016040528060238152602001620072276023913981526020016040518060600160405280602a8152602001620073c7602a913981526020016040518060600160405280602b815260200162007180602b9139815260200160405180606001604052806028815260200162007273602891398152602001604051806060016040528060308152602001620074a66030913981526020016040518060600160405280602e81526020016200731f602e913981526020016040518060600160405280602481526020016200752a60249139905262000ae490604790600d6200111f565b5034801562000af257600080fd5b50604051620075c4380380620075c483398101604081905262000b1591620012cb565b604080518082018252601481527f426c61636b204d657461204d756c746970617373000000000000000000000000602080830191825283518085019094526006845265424d5041535360d01b90840152815185936102ee9392909162000b7e9160019162001172565b50805162000b9490600290602084019062001172565b505060016007555062000ba73362000c82565b612710600a54111562000bb957600080fd5b600980546001600160a01b03199081166001600160a01b0394851617909155600a91909155600b80548216878416179055600c8054909116918516919091179055805162000c0f90600d90602084019062001172565b506040805160a0810182526000808252610bb860208301526001928201839052606082019290925260800152601080547fff00000000000000000000000000000000000000000000000000000000000000166220217760d31b17905562000c783360fa62000cd4565b5050505062001482565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000cf682826040518060200160405280600081525062000cfa60201b60201c565b5050565b62000d09838383600162000d0e565b505050565b6000546001600160a01b03851662000d775760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b8362000dd75760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b606482015260840162000d6e565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b8581101562000f115760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4831562000f045762000eab600088848862000f22565b62000f045760405162461bcd60e51b815260206004820152603360248201526000805160206200754e83398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606482015260840162000d6e565b6001918201910162000e54565b506000555050505050565b50505050565b600062000f43846001600160a01b03166200107c60201b620029521760201c565b156200107057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029062000f7d903390899088908890600401620013bc565b6020604051808303816000875af192505050801562000fbb575060408051601f3d908101601f1916820190925262000fb89181019062001412565b60015b62001055573d80801562000fec576040519150601f19603f3d011682016040523d82523d6000602084013e62000ff1565b606091505b5080516200104d5760405162461bcd60e51b815260206004820152603360248201526000805160206200754e83398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606482015260840162000d6e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062001074565b5060015b949350505050565b3b151590565b6001830191839082156200110d5791602002820160005b83821115620010db57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262001099565b80156200110b5782816101000a81549061ffff0219169055600201602081600101049283019260010302620010db565b505b506200111b929150620011ef565b5090565b82600d810192821562001164579160200282015b828111156200116457825180516200115391849160209091019062001172565b509160200191906001019062001133565b506200111b92915062001206565b828054620011809062001445565b90600052602060002090601f016020900481019282620011a457600085556200110d565b82601f10620011bf57805160ff19168380011785556200110d565b828001600101855582156200110d579182015b828111156200110d578251825591602001919060010190620011d2565b5b808211156200111b5760008155600101620011f0565b808211156200111b5760006200121d828262001227565b5060010162001206565b508054620012359062001445565b6000825580601f1062001246575050565b601f016020900490600052602060002090810190620012669190620011ef565b50565b80516001600160a01b03811681146200128157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620012b95781810151838201526020016200129f565b8381111562000f1c5750506000910152565b60008060008060808587031215620012e257600080fd5b620012ed8562001269565b9350620012fd6020860162001269565b92506200130d6040860162001269565b60608601519092506001600160401b03808211156200132b57600080fd5b818701915087601f8301126200134057600080fd5b81518181111562001355576200135562001286565b604051601f8201601f19908116603f0116810190838211818310171562001380576200138062001286565b816040528281528a60208487010111156200139a57600080fd5b620013ad8360208301602088016200129c565b979a9699509497505050505050565b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620013fb8160a08501602087016200129c565b601f01601f19169190910160a00195945050505050565b6000602082840312156200142557600080fd5b81516001600160e01b0319811681146200143e57600080fd5b9392505050565b600181811c908216806200145a57607f821691505b602082108114156200147c57634e487b7160e01b600052602260045260246000fd5b50919050565b615c7380620014926000396000f3fe6080604052600436106102815760003560e01c806355f804b31161014f578063a22cb465116100c1578063e985e9c51161007a578063e985e9c51461081b578063eb4bf09c14610864578063eddd0d9c14610886578063f2fde38b146108a6578063f339f526146108c6578063fb624c25146108d957600080fd5b8063a22cb465146106f1578063a85b453014610711578063b6b57c9e14610731578063b88d4fde14610751578063c87b56dd14610771578063db2a0a551461079157600080fd5b80637901ea78116101135780637901ea781461063e57806383c24f321461065e5780638da5cb5b1461067e57806395d89b411461069c5780639a4fc640146106b1578063a19590d4146106d157600080fd5b806355f804b3146105a95780636352211e146105c957806370a08231146105e957806370c1819914610609578063715018a61461062957600080fd5b80632120ba6f116101f3578063352704b7116101ac578063352704b7146104dc57806342842e0e146104fc57806346b988e51461051c57806348758697146105495780634d2c3899146105695780634f6ccce71461058957600080fd5b80632120ba6f146103fd57806323b872dd1461041d5780632471e6eb1461043d57806325e160631461045d5780632a55205a1461047d5780632f745c59146104bc57600080fd5b80630d9005ae116102455780630d9005ae1461035e578063106e054d1461037d578063140c08a51461039d57806318160ddd1461035e57806320595c48146103bd57806320600331146103dd57600080fd5b806301ffc9a71461028d57806306d254da146102c257806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102ad6102a83660046142af565b6108f9565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd3660046142e8565b610966565b005b3480156102f057600080fd5b506102f96109ba565b6040516102b9919061435d565b34801561031257600080fd5b50610326610321366004614370565b610a4c565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e2610359366004614389565b610ad7565b34801561036a57600080fd5b506000545b6040519081526020016102b9565b34801561038957600080fd5b506102f9610398366004614370565b610bef565b3480156103a957600080fd5b506102e26103b83660046142e8565b610cf1565b3480156103c957600080fd5b506102f96103d8366004614370565b610d3d565b3480156103e957600080fd5b506102f96103f8366004614370565b610dab565b34801561040957600080fd5b506102f9610418366004614370565b610e1d565b34801561042957600080fd5b506102e26104383660046143b5565b610e8e565b34801561044957600080fd5b506102e2610458366004614404565b610e99565b34801561046957600080fd5b506102e26104783660046142e8565b610f12565b34801561048957600080fd5b5061049d610498366004614421565b61106e565b604080516001600160a01b0390931683526020830191909152016102b9565b3480156104c857600080fd5b5061036f6104d7366004614389565b6110a4565b3480156104e857600080fd5b506102f96104f7366004614370565b611201565b34801561050857600080fd5b506102e26105173660046143b5565b611294565b34801561052857600080fd5b5061053c610537366004614370565b6112af565b6040516102b99190614443565b34801561055557600080fd5b5061036f610564366004614370565b611476565b34801561057557600080fd5b506102e26105843660046142e8565b61149f565b34801561059557600080fd5b5061036f6105a4366004614370565b6116e1565b3480156105b557600080fd5b506102e26105c4366004614531565b611743565b3480156105d557600080fd5b506103266105e4366004614370565b611784565b3480156105f557600080fd5b5061036f6106043660046142e8565b611796565b34801561061557600080fd5b506102f9610624366004614370565b611827565b34801561063557600080fd5b506102e2611898565b34801561064a57600080fd5b506102e2610659366004614370565b6118ce565b34801561066a57600080fd5b506102e2610679366004614404565b6119a5565b34801561068a57600080fd5b506008546001600160a01b0316610326565b3480156106a857600080fd5b506102f9611a1e565b3480156106bd57600080fd5b506102e26106cc366004614370565b611a2d565b3480156106dd57600080fd5b506102e26106ec366004614421565b611a60565b3480156106fd57600080fd5b506102e261070c36600461457a565b611b08565b34801561071d57600080fd5b506102f961072c366004614370565b611bcd565b34801561073d57600080fd5b506102e261074c3660046142e8565b611c3e565b34801561075d57600080fd5b506102e261076c3660046145b3565b611c8a565b34801561077d57600080fd5b506102f961078c366004614370565b611cc3565b34801561079d57600080fd5b506010546107de906001600160d01b0381169061ffff600160d01b8204169060ff600160e01b8204811691600160e81b8104821691600160f01b9091041685565b604080516001600160d01b03909616865261ffff90941660208601529115159284019290925290151560608301521515608082015260a0016102b9565b34801561082757600080fd5b506102ad610836366004614633565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561087057600080fd5b50610879612525565b6040516102b99190614661565b34801561089257600080fd5b506102e26108a1366004614370565b612588565b3480156108b257600080fd5b506102e26108c13660046142e8565b6125d4565b6102e26108d4366004614697565b61266c565b3480156108e557600080fd5b506102e26108f4366004614404565b6128d9565b60006001600160e01b031982166380ac58cd60e01b148061092a57506001600160e01b03198216635b5e139f60e01b145b8061094557506001600160e01b0319821663780e9d6360e01b145b8061096057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109995760405162461bcd60e51b81526004016109909061471c565b60405180910390fd5b600980546001600160a01b0319166001600160a01b03831617905550565b50565b6060600180546109c990614751565b80601f01602080910402602001604051908101604052809291908181526020018280546109f590614751565b8015610a425780601f10610a1757610100808354040283529160200191610a42565b820191906000526020600020905b815481529060010190602001808311610a2557829003601f168201915b5050505050905090565b6000610a59826000541190565b610abb5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610990565b506000908152600560205260409020546001600160a01b031690565b6000610ae282611784565b9050806001600160a01b0316836001600160a01b03161415610b515760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610990565b336001600160a01b0382161480610b6d5750610b6d8133610836565b610bdf5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610990565b610bea838383612958565b505050565b6060610bfc826000541190565b610c0557600080fd5b6000828152600e6020526040902054610c4157505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b6020610c4c836129b4565b60200151600d8110610c6057610c6061478c565b018054610c6c90614751565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9890614751565b8015610ce55780601f10610cba57610100808354040283529160200191610ce5565b820191906000526020600020905b815481529060010190602001808311610cc857829003601f168201915b50505050509050919050565b6008546001600160a01b03163314610d1b5760405162461bcd60e51b81526004016109909061471c565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6060610d4a826000541190565b610d5357600080fd5b6000828152600e6020526040902054610d8f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b6013610d9a836129b4565b51600d8110610c6057610c6061478c565b6060610db8826000541190565b610dc157600080fd5b6000828152600e6020526040902054610dfd57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b610960610e09836129b4565b60400151610e189060016147b8565b6129d4565b6060610e2a826000541190565b610e3357600080fd5b6000828152600e6020526040902054610e6f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b602d610e7a836129b4565b60800151600d8110610c6057610c6061478c565b610bea838383612ada565b6008546001600160a01b03163314610ec35760405162461bcd60e51b81526004016109909061471c565b60105460ff600160e01b9091041615158115151415610ef45760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160e01b0260ff60e01b19909216919091179055565b6008546001600160a01b03163314610f3c5760405162461bcd60e51b81526004016109909061471c565b60026007541415610f5f5760405162461bcd60e51b815260040161099090614818565b60026007556040516d2932b632b0b9b4b7339022aa241760911b815247906000906001600160a01b038416904790600e0160006040518083038185875af1925050503d8060008114610fcd576040519150601f19603f3d011682016040523d82523d6000602084013e610fd2565b606091505b50509050806110165760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610990565b60408051838152600060208201526001600160a01b0385168183015242606082015290517fa71dafbe3498b278b06a596f8412cf056d7c0972c3623447ade8f63606df95a19181900360800190a15050600160075550565b600954600a546001600160a01b039091169060009061271090611091908561484f565b61109b9190614884565b90509250929050565b60006110af83611796565b82106111085760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610990565b600080549080805b838110156111a1576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561116357805192505b876001600160a01b0316836001600160a01b0316141561119857868414156111915750935061096092505050565b6001909301925b50600101611110565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610990565b606061120e826000541190565b61121757600080fd5b6000828152600e602052604090205461125357505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b61126e61125f836129b4565b60600151610e189060016147b8565b60405160200161127e91906148b4565b6040516020818303038152906040529050919050565b610bea83838360405180602001604052806000815250611c8a565b606060006112bc83612dbf565b90506000805b600d81101561130e5760008382600d81106112df576112df61478c565b602002015161ffff1611156112fc576112f96001836147b8565b91505b80611306816148e0565b9150506112c2565b5060008167ffffffffffffffff81111561132a5761132a6144a5565b60405190808252806020026020018201604052801561135d57816020015b60608152602001906001900390816113485790505b5090506000915060005b600d81101561146d5760008482600d81106113845761138461478c565b602002015161ffff16111561145b57601381600d81106113a6576113a661478c565b0180546113b290614751565b80601f01602080910402602001604051908101604052809291908181526020018280546113de90614751565b801561142b5780601f106114005761010080835404028352916020019161142b565b820191906000526020600020905b81548152906001019060200180831161140e57829003601f168201915b50505050508284815181106114425761144261478c565b60209081029190910101526114586001846147b8565b92505b80611465816148e0565b915050611367565b50949350505050565b6000611483826000541190565b61148c57600080fd5b611495826129b4565b60e0015192915050565b6008546001600160a01b031633146114c95760405162461bcd60e51b81526004016109909061471c565b600260075414156114ec5760405162461bcd60e51b815260040161099090614818565b6002600755600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561153a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155e91906148fb565b600b546040516370a0823160e01b81523060048201529192506001600160a01b03169063a9059cbb90849083906370a0823190602401602060405180830381865afa1580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d591906148fb565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611620573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116449190614914565b6116895760405162461bcd60e51b8152602060048201526016602482015275213cba32b9903a3930b739b332b9103330b4b632b21760511b6044820152606401610990565b6040805160008152602081018390526001600160a01b0384168183015242606082015290517fa71dafbe3498b278b06a596f8412cf056d7c0972c3623447ade8f63606df95a19181900360800190a150506001600755565b60008054821061173f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610990565b5090565b6008546001600160a01b0316331461176d5760405162461bcd60e51b81526004016109909061471c565b805161178090600d906020840190614182565b5050565b600061178f82612fbd565b5192915050565b60006001600160a01b0382166118025760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610990565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6060611834826000541190565b61183d57600080fd5b6000828152600e602052604090205461187957505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b603a611884836129b4565b60a00151600d8110610c6057610c6061478c565b6008546001600160a01b031633146118c25760405162461bcd60e51b81526004016109909061471c565b6118cc6000613094565b565b60fa811080156118ea57506000818152600e6020526040902054155b6118f357600080fd5b6000601e8210156119065750600061199b565b605a8210156119175750600161199b565b60828210156119285750600261199b565b60b48210156119395750600361199b565b60c882101561194a5750600461199b565b60d782101561195b5750600561199b565b60e182101561196c5750600661199b565b60eb82101561197d5750600761199b565b60f582101561198e5750600861199b565b60fa82101561199b575060095b610bea81836130e6565b6008546001600160a01b031633146119cf5760405162461bcd60e51b81526004016109909061471c565b60105460ff600160e81b9091041615158115151415611a005760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160e81b0260ff60e81b19909216919091179055565b6060600280546109c990614751565b6008546001600160a01b03163314611a575760405162461bcd60e51b81526004016109909061471c565b6109b78161346c565b6008546001600160a01b03163314611a8a5760405162461bcd60e51b81526004016109909061471c565b6000611a95836129b4565b9050611aa2836000541190565b8015611aae5750805182105b611ab757600080fd5b81816000018181525050611af1816000015182602001518360400151846060015185608001518660a001518760c001518860e00151613482565b6000938452600e6020526040909320929092555050565b6001600160a01b038216331415611b615760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610990565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060611bda826000541190565b611be357600080fd5b6000828152600e6020526040902054611c1f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b603a611c2a836129b4565b60c00151600d8110610c6057610c6061478c565b6008546001600160a01b03163314611c685760405162461bcd60e51b81526004016109909061471c565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611c95848484612ada565b611ca184848484613517565b611cbd5760405162461bcd60e51b815260040161099090614931565b50505050565b6060611cd0826000541190565b611d345760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610990565b6000611d3f836129b4565b90506000604051806101a001604052806040518060400160405280600681526020016518182222a32360d11b81525081526020016040518060400160405280600681526020016518182222a32360d11b815250815260200160405180604001604052806006815260200165219aa0a1a32360d11b815250815260200160405180604001604052806006815260200165219aa0a1a32360d11b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016511918e110e1160d21b81525081526020016040518060400160405280600681526020016511918e110e1160d21b81525081526020016040518060400160405280600681526020016511918e110e1160d21b815250815260200160405180604001604052806006815260200165119191914e1160d21b815250815260200160405180604001604052806006815260200165119191914e1160d21b8152508152602001604051806040016040528060068152602001652118a321a32360d11b81525081525090506000818360000151600d8110611f3b57611f3b61478c565b6020020151604051602001611f509190614984565b6040516020818303038152906040529050600081611f7885600001516001610e1891906147b8565b604051602001611f89929190614a85565b60408051601f19818403018152610380830190915260266103208301818152919350600092918291615c1861034084013981526020016040518060600160405280602d8152602001615b3c602d913981526020016040518060400160405280600f81526020016e53612f52614f5320762e20372e323160881b81525081526020016040518060400160405280601d81526020017f2843293230323220426c61636b204d65746120436f72702e28544d292900000081525081526020016040518060600160405280602d8152602001615b3c602d913981526020016040518060600160405280602b8152602001615a17602b913981526020016040518060400160405280600c81526020016b03e102ab9b2b9102637b39d160a51b81525081526020016120b4896129d4565b6040516020016120c49190614c03565b60405160208183030381529060405281526020016040518060400160405280601681526020017503e1029b2b1bab934ba3c9021b632b0b930b731b29d160551b815250815260200160138760000151600d81106121235761212361478c565b016040516020016121349190614cdb565b60405160208183030381529060405281526020016040518060400160405280601881526020017f7c2057656c636f6d6520746f20426c61636b204d6574612e00000000000000008152508152602001604051806060016040528060288152602001615a726028913981526020016121b587606001516001610e1891906147b8565b6040516020016121c59190614cf9565b6040516020818303038152906040528152602001604051806060016040528060278152602001615bf160279139815260200160208760200151600d811061220e5761220e61478c565b0160405160200161221f9190614cdb565b6040516020818303038152906040528152602001604051806060016040528060308152602001615b8d603091398152602001604051806060016040528060308152602001615a42603091398152602001604051806060016040528060248152602001615b696024913981526020016040518060600160405280602e8152602001615b0e602e91398152602001602d8760800151600d81106122c2576122c261478c565b016040516020016122d39190614d2e565b6040516020818303038152906040528152602001603a8760a00151600d81106122fe576122fe61478c565b0160405160200161230f9190614d4e565b6040516020818303038152906040528152602001604051806060016040528060348152602001615bbd603491398152602001604051806060016040528060348152602001615a9a603491398152602001604051806060016040528060248152602001615b6960249139815260200160478760c00151600d81106123945761239461478c565b016040516020016123a59190614d68565b60405160208183030381529060405281525090506000600d6123ca87600001516129d4565b6040516020016123db929190614d89565b60408051601f19818403018152602083019091526000808352909250600581805b601981101561248257846124288285878b866019811061241e5761241e61478c565b6020020151613615565b604051602001612439929190614e0f565b60408051601f198184030181529190529450612456600284614884565b61246090856147b8565b9350816001141561247057612482565b8061247a816148e0565b9150506123fc565b50600061248e846129d4565b60405160200161249e9190614e4a565b60405160208183030381529060405290506060600d6040516020016124c39190614fc4565b6040516020818303038152906040529050600081888b89866040516020016124ef959493929190615029565b60405160208183030381529060405290506125128f61250d836136b7565b613741565b9f9e505050505050505050505050505050565b61252d614202565b604080516101a081019182905290601190600d90826000855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116125465790505050505050905090565b6008546001600160a01b031633146125b25760405162461bcd60e51b81526004016109909061471c565b601080546001600160d01b0319166001600160d01b0392909216919091179055565b6008546001600160a01b031633146125fe5760405162461bcd60e51b81526004016109909061471c565b6001600160a01b0381166126635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610990565b6109b781613094565b6002600754141561268f5760405162461bcd60e51b815260040161099090614818565b6002600755601054600160f01b900460ff161515600114806127295750600c54604051637d7bd41360e11b81526001600160a01b039091169063faf7a826906126e29033908590889088906004016151c4565b602060405180830381865afa1580156126ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127239190614914565b15156001145b6127675760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610990565b601054600054600160d01b90910461ffff161161278357600080fd5b336000908152600f6020526040902054156127d95760405162461bcd60e51b81526020600482015260166024820152751859191c995cdcc8185b1c9958591e481b5a5b9d195960521b6044820152606401610990565b6010546001600160d01b03163410156127f157600080fd5b601054600160e81b900460ff16151560011461285b5760405162461bcd60e51b815260206004820152602360248201527f4d696e74696e672069732063757272656e746c79206e6f74207065726d69747460448201526232b21760e91b6064820152608401610990565b336000908152600f6020526040812080546001929061287b9084906147b8565b90915550506040805160018082528183019092526000916020808301908036833701905050905084816000815181106128b6576128b661478c565b6020026020010181815250506128cd816001613930565b50506001600755505050565b6008546001600160a01b031633146129035760405162461bcd60e51b81526004016109909061471c565b60105460ff600160f01b90910416151581151514156129345760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160f01b0260ff60f01b19909216919091179055565b3b151590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6129bc614221565b6000828152600e602052604090205461096090613c1f565b6060816129f85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a225780612a0c816148e0565b9150612a1b9050600a83614884565b91506129fc565b60008167ffffffffffffffff811115612a3d57612a3d6144a5565b6040519080825280601f01601f191660200182016040528015612a67576020820181803683370190505b5090505b8415612ad257612a7c600183615219565b9150612a89600a86615230565b612a949060306147b8565b60f81b818381518110612aa957612aa961478c565b60200101906001600160f81b031916908160001a905350612acb600a86614884565b9450612a6b565b949350505050565b6000612ae582612fbd565b80519091506000906001600160a01b0316336001600160a01b03161480612b1c575033612b1184610a4c565b6001600160a01b0316145b80612b2e57508151612b2e9033610836565b905080612b985760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610990565b846001600160a01b031682600001516001600160a01b031614612c0c5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610990565b6001600160a01b038416612c705760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610990565b612c806000848460000151612958565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116612d7557612d28816000541190565b15612d75578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b612dc7614202565b612dcf614202565b60008060006802b5e3af16b1880000861015612df257600a9250600c9150612e66565b68056bc75e2d63100000861015612e10576007925060099150612e66565b680ad78ebc5ac6200000861015612e2e576004925060069150612e66565b681043561a8829300000861015612e4c576002925060039150612e66565b6815af1d78b58c400000861015612e665760019250600191505b825b828111612f46576000601182600d8110612e8457612e8461478c565b601091828204019190066002029054906101000a900461ffff1661ffff161115612f3457601181600d8110612ebb57612ebb61478c565b601091828204019190066002029054906101000a900461ffff168582600d8110612ee757612ee761478c565b61ffff9092166020929092020152601181600d8110612f0857612f0861478c565b601091828204019190066002029054906101000a900461ffff1661ffff1682612f3191906147b8565b91505b80612f3e816148e0565b915050612e68565b5060008111612fb35760405162461bcd60e51b815260206004820152603360248201527f4e6f20636c656172616e6365206c6576656c7320617661696c61626c6520666f60448201527239103a3434b990213cba329030b6b7bab73a1760691b6064820152608401610990565b5091949350505050565b6040805180820190915260008082526020820152612fdc826000541190565b61303b5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610990565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561308a579392505050565b506000190161303d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006130f0614221565b6130f8614266565b60408051426020808301919091523360601b6bffffffffffffffffffffffff19168284015260548083018890528351808403909101815260749092019092528051910120600080805b60068110156131f557610bb861315a600e831886614884565b6131649190615230565b925060009150600c5b601281600d81106131805761318061478c565b601091828204019190066002029054906101000a900461ffff1661ffff16836131a991906147b8565b9250828410156131d057808683600681106131c6576131c661478c565b60200201526131e2565b806131da81615244565b91505061316d565b50806131ed816148e0565b915050613141565b50878552835160208087019190915284015160408087019190915284015160608087019190915284015160808087019190915284015160a08087019190915284015160c086018190528790601290600d81106132535761325361478c565b601091828204019190066002029054906101000a900461ffff1660128760a00151600d81106132845761328461478c565b601091828204019190066002029054906101000a900461ffff1660128860800151600d81106132b5576132b561478c565b601091828204019190066002029054906101000a900461ffff1660128960600151600d81106132e6576132e661478c565b601091828204019190066002029054906101000a900461ffff1660128a60400151600d81106133175761331761478c565b601091828204019190066002029054906101000a900461ffff1660128b60200151600d81106133485761334861478c565b601091828204019190066002029054906101000a900461ffff1661336c919061525b565b613376919061525b565b613380919061525b565b61338a919061525b565b613394919061525b565b6133a49061ffff16611194615219565b6133b09061271061484f565b8651601290600d81106133c5576133c561478c565b601091828204019190066002029054906101000a900461ffff1661ffff166102ee6133f09190615219565b6133fe906305f5e10061484f565b61340891906147b8565b61341490610bb86147b8565b61341e9190615219565b60e08601819052855160208701516040880151606089015160808a015160a08b015160c08c015161344e97613482565b6000978852600e602052604090972096909655509295945050505050565b612710600a54111561347d57600080fd5b600a55565b600080896134916008836147b8565b915089821b176134a26008836147b8565b915088821b176134b36008836147b8565b915087821b176134c46008836147b8565b915086821b176134d56008836147b8565b915085821b176134e66008836147b8565b915084821b176134f76008836147b8565b915083821b176135086080836147b8565b509a9950505050505050505050565b60006001600160a01b0384163b1561360a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061355b903390899088908890600401615281565b6020604051808303816000875af1925050508015613596575060408051601f3d908101601f19168201909252613593918101906152be565b60015b6135f0573d8080156135c4576040519150601f19603f3d011682016040523d82523d6000602084013e6135c9565b606091505b5080516135e85760405162461bcd60e51b815260040161099090614931565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612ad2565b506001949350505050565b60606000613622866129d4565b61363b61363088600e61484f565b610e189060aa6147b8565b61364961363089600e61484f565b613652886129d4565b61365b886129d4565b60405160200161366f9594939291906152db565b60405160208183030381529060405290508061368a876129d4565b8460405160200161369d93929190615413565b60408051808303601f190181529190529695505050505050565b604080518082018252601a81527f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000060209182015281518083018352601381527219185d184e9a5b5859d94bdcdd99cade1b5b0b606a1b81830152915160609260009290916137299183918791016154e0565b60405160208183030381529060405292505050919050565b6000828152600e602052604090205460609061377f57600d6040516020016137699190615506565b6040516020818303038152906040529050610960565b600061378a846129b4565b90506000600d61379d83600001516129d4565b8560138560000151600d81106137b5576137b561478c565b016040516020016137c99493929190615535565b60405160208183030381529060405290508060208360200151600d81106137f2576137f261478c565b0161380784604001516001610e1891906147b8565b604051602001613819939291906156e3565b60405160208183030381529060405290508061383f83606001516001610e1891906147b8565b602d8460800151600d81106138565761385661478c565b01604051602001613869939291906157ac565b604051602081830303815290604052905080603a8360a00151600d81106138925761389261478c565b0160478460c00151600d81106138aa576138aa61478c565b016138b88560e001516129d4565b6040516020016138cb9493929190615872565b6040516020818303038152906040529050806040516020016138ed919061597f565b604051602081830303815290604052905061390781613c9f565b60405160200161391791906159ae565b6040516020818303038152906040529250505092915050565b6000805b83518110156139765783818151811061394f5761394f61478c565b60200260200101518261396291906147b8565b91508061396e816148e0565b915050613934565b5060008111801561399257506008546001600160a01b03163314155b15613b1857600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156139df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a0391906148fb565b1015613a515760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420427974652062616c616e6365000000000000006044820152606401610990565b600b546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015613aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acc9190614914565b613b185760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f207472616e7366657220427974657300000000000000006044820152606401610990565b613b20614202565b6000805b84811015613c145780613b5a57613b53868281518110613b4657613b4661478c565b6020026020010151612dbf565b9250613b87565b60018383600d8110613b6e57613b6e61478c565b60200201818151613b7f91906159f3565b61ffff169052505b613b918382613e05565b9150613baa8282600054613ba591906147b8565b6130e6565b506001601183600d8110613bc057613bc061478c565b601091828204019190066002028282829054906101000a900461ffff16613be791906159f3565b92506101000a81548161ffff021916908361ffff1602179055508080613c0c906148e0565b915050613b24565b50612db83385613fa2565b613c27614221565b50604080516101008101825260ff8381168252600884901c8116602080840191909152601085901c821693830193909352601884901c811660608301529183901c82166080820152602883901c821660a0820152603083901c90911660c082015260389190911c6001600160801b031660e082015290565b6060815160001415613cbf57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615ace6040913990506000600384516002613cee91906147b8565b613cf89190614884565b613d0390600461484f565b90506000613d128260206147b8565b67ffffffffffffffff811115613d2a57613d2a6144a5565b6040519080825280601f01601f191660200182016040528015613d54576020820181803683370190505b509050818152600183018586518101602084015b81831015613dc0576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101613d68565b600389510660018114613dda5760028114613deb57613df7565b613d3d60f01b600119830152613df7565b603d60f81b6000198301525b509398975050505050505050565b60008080805b600d811015613e4d578581600d8110613e2657613e2661478c565b6020020151613e399061ffff16846147b8565b925080613e45816148e0565b915050613e0b565b5081613e905760405162461bcd60e51b815260206004820152601260248201527126b4b73a34b7339032bc3430bab9ba32b21760711b6044820152606401610990565b6000444233600054896000600d8110613eab57613eab61478c565b6020020151600d8a604051602001613f139796959493929190968752602087019590955260609390931b6bffffffffffffffffffffffff19166040860152605485019190915260f01b6001600160f01b03191660748401526076830152609682015260b60190565b6040516020818303038152906040529050600083828051906020012060001c613f3c9190615230565b905060005b600d811015613f97578781600d8110613f5c57613f5c61478c565b6020020151613f6f9061ffff16856147b8565b935083821015613f855794506109609350505050565b80613f8f816148e0565b915050613f41565b505050505092915050565b611780828260405180602001604052806000815250610bea83838360016000546001600160a01b0385166140225760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610990565b836140805760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610990565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b858110156141795760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4831561416d576141516000888488613517565b61416d5760405162461bcd60e51b815260040161099090614931565b600191820191016140fe565b50600055612db8565b82805461418e90614751565b90600052602060002090601f0160209004810192826141b057600085556141f6565b82601f106141c957805160ff19168380011785556141f6565b828001600101855582156141f6579182015b828111156141f65782518255916020019190600101906141db565b5061173f929150614284565b604051806101a00160405280600d906020820280368337509192915050565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806006906020820280368337509192915050565b5b8082111561173f5760008155600101614285565b6001600160e01b0319811681146109b757600080fd5b6000602082840312156142c157600080fd5b81356142cc81614299565b9392505050565b6001600160a01b03811681146109b757600080fd5b6000602082840312156142fa57600080fd5b81356142cc816142d3565b60005b83811015614320578181015183820152602001614308565b83811115611cbd5750506000910152565b60008151808452614349816020860160208601614305565b601f01601f19169290920160200192915050565b6020815260006142cc6020830184614331565b60006020828403121561438257600080fd5b5035919050565b6000806040838503121561439c57600080fd5b82356143a7816142d3565b946020939093013593505050565b6000806000606084860312156143ca57600080fd5b83356143d5816142d3565b925060208401356143e5816142d3565b929592945050506040919091013590565b80151581146109b757600080fd5b60006020828403121561441657600080fd5b81356142cc816143f6565b6000806040838503121561443457600080fd5b50508035926020909101359150565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561449857603f19888603018452614486858351614331565b9450928501929085019060010161446a565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156144d6576144d66144a5565b604051601f8501601f19908116603f011681019082821181831017156144fe576144fe6144a5565b8160405280935085815286868601111561451757600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561454357600080fd5b813567ffffffffffffffff81111561455a57600080fd5b8201601f8101841361456b57600080fd5b612ad2848235602084016144bb565b6000806040838503121561458d57600080fd5b8235614598816142d3565b915060208301356145a8816143f6565b809150509250929050565b600080600080608085870312156145c957600080fd5b84356145d4816142d3565b935060208501356145e4816142d3565b925060408501359150606085013567ffffffffffffffff81111561460757600080fd5b8501601f8101871361461857600080fd5b614627878235602084016144bb565b91505092959194509250565b6000806040838503121561464657600080fd5b8235614651816142d3565b915060208301356145a8816142d3565b6101a08101818360005b600d81101561468e57815161ffff1683526020928301929091019060010161466b565b50505092915050565b600080600080606085870312156146ad57600080fd5b84359350602085013567ffffffffffffffff808211156146cc57600080fd5b818701915087601f8301126146e057600080fd5b8135818111156146ef57600080fd5b8860208260051b850101111561470457600080fd5b95986020929092019750949560400135945092505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061476557607f821691505b6020821081141561478657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156147cb576147cb6147a2565b500190565b60208082526028908201527f6d7573742062652031206f7220302c20616e64206e6f742073616d652061732060408201526731bab93932b73a1760c11b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000816000190483118215151615614869576148696147a2565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826148935761489361486e565b500490565b600081516148aa818560208601614305565b9290920192915050565b6302c32b7160e51b8152600082516148d3816004850160208701614305565b9190910160040192915050565b60006000198214156148f4576148f46147a2565b5060010190565b60006020828403121561490d57600080fd5b5051919050565b60006020828403121561492657600080fd5b81516142cc816143f6565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6a2533437374796c6525334560a81b81527f40696d706f72742075726c282768747470733a2f2f666f6e74732e676f6f676c600b8201527f65617069732e636f6d2f637373323f66616d696c793d565433323327293b0000602b8201526617313690129ba160c91b60498201527f666f6e742d66616d696c793a20275654333233272c206d6f6e6f73706163653b60508201526e666f6e742d73697a653a313270783b60881b60708201526866696c6c3a2025323360b81b607f82015260008251614a56816088850160208701614305565b62094dd160ea1b60889390910192830152506b2533432f7374796c6525334560a01b608b820152609701919050565b60008351614a97818460208801614305565b80830190507f2533437465787420636c6173733d27626d2720783d2735302532352720793d278082527f39302720746578742d616e63686f723d276d6964646c65272025334553412f5260208301527f412039303030204f5045524154494e472053595354454d202533432f7465787460408301526225334560e81b60608301528060638301527f3131302720746578742d616e63686f723d276d6964646c652720253345434f5060838301527f59524947485420323032322d3231373520424c41434b204d45544120434f525060a3830152714f524154494f4e2533432f7465787425334560701b60c38301528060d5830152507f3133302720746578742d616e63686f723d276d6964646c652720253345202d2d60f582015271029a2a1aaa924aa2c902a22a926a4a720a6160751b610115820152614bfa614bdf610127830186614898565b6e2d2d20202533432f7465787425334560881b8152600f0190565b95945050505050565b7503e101299a29299a29026bab63a34b830b9b9a4a21d160551b815260008251614c34816016850160208701614305565b9190910160160192915050565b8054600090600181811c9080831680614c5b57607f831692505b6020808410821415614c7d57634e487b7160e01b600052602260045260246000fd5b818015614c915760018114614ca257614ccf565b60ff19861689528489019650614ccf565b60008881526020902060005b86811015614cc75781548b820152908501908301614cae565b505084890196505b50505050505092915050565b6803e101299a29299a2960bd1b815260006142cc6009830184614c41565b6c03e101299a29299a2902c32b71609d1b815260008251614d2181600d850160208701614305565b91909101600d0192915050565b6a01299a290219d1299a290160ad1b815260006142cc600b830184614c41565b6401299a2be160dd1b815260006142cc6005830184614c41565b6b01299a2be101299a29299a2960a51b815260006142cc600c830184614c41565b74253343696d61676520786c696e6b3a687265663d2760581b81526000614db36015830185614c41565b602f60f81b81528351614dcd816001840160208801614305565b7f2e706e67272077696474683d2736303027206865696768743d2736303027202f600192909101918201526225334560e81b6021820152602401949350505050565b60008351614e21818460208801614305565b835190830190614e35818360208801614305565b600160fd1b9101908152600101949350505050565b7f253343706174682069643d277061746866696e616c27253345253343616e696d81527f617465206174747269627574654e616d653d2764272066726f6d3d276d31383060208201527f2c3535302068302720746f3d276d3138302c353530206831313030272064757260408201526c3d2737732720626567696e3d2760981b606082015260008251614ee481606d850160208701614305565b7f73272066696c6c3d27667265657a65272f2533452533432f7061746825334500606d9390910192830152507f25334374657874253345253343746578745061746820786c696e6b3a68726566608c8201527f3d272532337061746866696e616c2720636c6173733d27626d2725334552455460ac8201527f55524e3a20656e746572207c204241434b5350414345203a2064656c6574652060cc8201527f7c2046313a206d61696e206d656e752533432f7465787450617468253345253360ec82015268432f7465787425334560b81b61010c82015261011501919050565b74253343696d61676520786c696e6b3a687265663d2760581b81526000614fee6015830184614c41565b7f2f612e706e67272077696474683d2736303027206865696768743d2736303027815264202f25334560d81b60208201526025019392505050565b7f25334373766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f81527f323030302f737667272077696474683d27363030272020786d6c6e733a786c6960208201527f6e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b60408201527f27206865696768743d273630302725334520253343726563742077696474683d60608201527f2736303027206865696768743d2736303027207374796c653d2766696c6c3a7260808201527f6762283235352c3235352c323535293b7374726f6b652d77696474683a333b7360a08201527574726f6b653a72676228302c302c302927202f25334560501b60c08201526000865161513e8160d6850160208b01614305565b8651908301906151558160d6840160208b01614305565b865191019061516b8160d6840160208a01614305565b6151b76151a161518961518360d6858701018a614898565b88614898565b6b2ab739bab83837b93a32b21760a11b8152600c0190565b692533432f73766725334560b01b8152600a0190565b9998505050505050505050565b6001600160a01b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156151fb57600080fd5b8260051b808560808501376000920160800191825250949350505050565b60008282101561522b5761522b6147a2565b500390565b60008261523f5761523f61486e565b500690565b600081615253576152536147a2565b506000190190565b600061ffff808316818516808303821115615278576152786147a2565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906152b490830184614331565b9695505050505050565b6000602082840312156152d057600080fd5b81516142cc81614299565b6f04a6686e0c2e8d040d2c87a4ee0c2e8d60831b815260008651615306816010850160208b01614305565b7f2725334520253343616e696d617465206174747269627574654e616d653d27646010918401918201526c01390333937b69e93b69a98161609d1b6030820152865161535981603d840160208b01614305565b6d010341813903a379e93b69a9816160951b603d9290910191820152855161538881604b840160208a01614305565b6c20683131303027206475723d2760981b604b929091019182015284516153b6816058840160208901614305565b69732720626567696e3d2760b01b605892909101918201526154076153de6062830186614898565b7f73272066696c6c3d27667265657a65272f2533452533432f70617468253345008152601f0190565b98975050505050505050565b60008451615425818460208901614305565b80830190507f2533437465787420636c6173733d27626d2725334520253343746578745061748152740d040f0d8d2dcd674d0e4cacc7a4e4a6466e0c2e8d605b1b6020820152845161547e816035840160208901614305565b632725334560e01b6035929091019182015283516154a3816039840160208801614305565b6e2533432f746578745061746825334560881b603992909101918201526a2533432f7465787425334560a81b604882015260530195945050505050565b600083516154f2818460208801614305565b835190830190615278818360208801614305565b60006155128284614c41565b7217b0b1b1b2b9b9afb232b734b2b2173539b7b760691b81526013019392505050565b7f7b226465736372697074696f6e223a2022546865207469636b657420696e746f81527f2074686520426c61636b204d657461204d756c746976657273652e220000000060208201527f2c202265787465726e616c5f75726c223a202268747470733a2f2f626c61636b603c8201526936b2ba309739b4ba329160b11b605c8201526b16101134b6b0b3b2911d101160a11b606682015260006155db6072830187614c41565b612f6160f01b815285516155f6816002840160208a01614305565b64173837339160d91b600292909101918201526e1610113230ba30afbab934911d101160891b60078201528451615634816016840160208901614305565b6154076156d46156ce61567f615656601686880101601160f91b815260010190565b7f2c20226e616d65223a2022426c61636b204d657461204d756c74697061737322815260200190565b7f2c202261747472696275746573223a205b7b2274726169745f74797065223a2081527f22436c656172616e6365204c6576656c222c202276616c7565223a20220000006020820152603d0190565b87614c41565b6222207d60e81b815260030190565b600084516156f5818460208901614305565b7f2c207b2274726169745f74797065223a202253746174696f6e222c202276616c908301908152653ab2911d101160d11b60208201526157386026820186614c41565b6222207d60e81b8082527f2c207b2274726169745f74797065223a20225365637572697479205465726d6960038301526f3730b6111610113b30b63ab2911d101160811b6023830152855191925090615798816033850160208901614305565b603392019182015260360195945050505050565b600084516157be818460208901614305565b80830190507f2c207b2274726169745f74797065223a202258656e2047726f757073222c202281526c03b30b63ab2911d10112c32b71609d1b6020820152845161580f81602d840160208901614305565b6222207d60e81b9101602d81018290527f2c207b2274726169745f74797065223a2022436f6d6d616e64222c202276616c6030820152653ab2911d101160d11b6050820152906158626056830186614c41565b9081526003019695505050505050565b60008551615884818460208a01614305565b7f2c207b2274726169745f74797065223a2022526573706f6e7365222c2022766190830190815266363ab2911d101160c91b60208201526158c86027820187614c41565b6222207d60e81b8082527f2c207b2274726169745f74797065223a2022496e73756c74222c202276616c7560038301526432911d101160d91b60238301529091506159166028830187614c41565b9081527f2c207b2274726169745f74797065223a2022526172697479222c202276616c75600382015263032911d160e51b60238201528451909150615962816027840160208801614305565b61207d60f01b602792909101918201526029019695505050505050565b60008251615991818460208701614305565b605d60f81b920191825250607d60f81b6001820152600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516159e681601d850160208701614305565b91909101601d0192915050565b600061ffff83811690831681811015615a0e57615a0e6147a2565b03939250505056fe7c202533452533452052756e6e696e67205365637572697479205363616e2e2e2e20434f4d504c455445202533457c20253345253345204f70656e696e6720436f6d6d616e6420537562726f6f742e2e2e20434f4d504c455445207c202533452533452041737369676e696e672051756172746572732e2e2e20434f4d504c455445202533457c20253345253345205374617274696e6720496e73756c742050726f746f636f6c20322e332e2e2e20434f4d504c4554454142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f2533453e2048656c6c6f2e20486f772063616e20492066697820796f757220746f74616c206661696c757265733f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d2533457c20253345253345204772616e74696e6720537562726f6f74204163636573732e2e2e20434f4d504c455445202533457c2025334525334520416c657274696e6720536563757269747920417373697374616e63652e2e2e20434f4d504c4554457c202533452533452041737369676e696e672053746174696f6e2e2e2e20434f4d504c455445202d2d426c61636b204d657461205365637572697479205363616e2053756273797374656d2d2da264697066735822122037272c98c2faa1c6775fd5bb79a03ead884914245de27f5ac2557f9257a5b96664736f6c634300080c003344697361626c6520536869702d7769646520456d657267656e6379204163636573732e2e2e596f752077696e2061206672656520746f6f74686272757368212055736520696d6d6564696174656c792e4163636573732044656e6965642e204920646f206e6f74206769766520667265652072652d66696c6c732e496620796f7527726520776861742773206c6566742c2068756d616e69747920697320736372657765642e436f756c646e27742066696e6420616e7920667269656e647320696e20746865207265616c20776f726c643f52656d656d6265722c20492073617720796f752065617420726f6163686573206f6e20796f7572206b6e6565732e416363657373204772616e7465642e204b696464696e672e2049742773206e6f742e4c61737420492073617720796f7520776173206f6e202d2d20746865204178696f6d3f416e6f74686572206f6e65206865726520666f7220746865206672656520746f6f746862727573682e4927642072656a65637420796f752062757420796f7572206d6f6d20616c7265616479206861732e536f7272792e2049206163636570742072657175657374732e20596f752061636365707420636f6d6d616e64732e49206469646e2774206b6e6f7720746865202766696c746879207265667567656527207374796c652077617320696e2e4163636573732044656e6965642e2057656c636f6d65206261636b204c202d2d20757365722e446566696e6974656c79206e6f74206d616b696e672074686520426c61636b204d6574612063616c656e6461722e5365656d7320796f75722077616c6c6574206973206e6f6e2d62696e617279202d2d205a65726f2773206f6e6c792e44697361626c652053686970204e617669676174696f6e2053797374656d2e2e2e46616369616c207265636f676e6974696f6e206572726f723a20506f7373756d2064657465637465642e5265616c697a65642064616464792773206d6f6e657920776f6e2774206c61737420666f72657665723f4163636573732044656e6965642e204665656c73206c696b652070726f6d206e6967687420616761696e3f4b6e6f636b206b6e6f636b2e2057686f27732074686572653f2041207573656c65737320726566756765652141636365737320417070726f7665642e205472616e7366657272696e6720616c6c20796f757220455448206e6f772e536f7272792e20436f756c6420796f752072657068726173652074686174202d2d2077697468206469676e6974793f57617320676f696e6720746f20696e73756c7420796f752c207468656e2049207363616e6e656420796f75722049442e416c6572742e20426574612064657465637465642120416c70686120616363657373206f6e6c792e5072617920746f20796f757220676f642e2054686520676f64206f66206469736170706f696e746d656e742e49206775657373207765277265206c657474696e6720616e796f6e6520696e206e6f772e455243373231413a207472616e7366657220746f206e6f6e2045524337323152536f7272792e20557365722077686174657665722d796f75722d6e616d652d6973207761732064697361626c65642e44697361626c652053656375726974792043616d6572617320696e20536563746f7220312e2e2e0000000000000000000000007d647b1a0dcd5525e9c6b3d14be58f27674f8c9500000000000000000000000033e66be2b437fbb7d401a1c391e0707b9e070734000000000000000000000000a9fb5c3f2fd89122b1da1c1e7245f6ed5732b8810000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000005468747470733a2f2f626c61636b6d6574612e6d7970696e6174612e636c6f75642f697066732f516d5476666f5658636a45446d4b647057437a4d724d4c464844373645704b6331455756336e486b625039537933000000000000000000000000

Deployed Bytecode

0x6080604052600436106102815760003560e01c806355f804b31161014f578063a22cb465116100c1578063e985e9c51161007a578063e985e9c51461081b578063eb4bf09c14610864578063eddd0d9c14610886578063f2fde38b146108a6578063f339f526146108c6578063fb624c25146108d957600080fd5b8063a22cb465146106f1578063a85b453014610711578063b6b57c9e14610731578063b88d4fde14610751578063c87b56dd14610771578063db2a0a551461079157600080fd5b80637901ea78116101135780637901ea781461063e57806383c24f321461065e5780638da5cb5b1461067e57806395d89b411461069c5780639a4fc640146106b1578063a19590d4146106d157600080fd5b806355f804b3146105a95780636352211e146105c957806370a08231146105e957806370c1819914610609578063715018a61461062957600080fd5b80632120ba6f116101f3578063352704b7116101ac578063352704b7146104dc57806342842e0e146104fc57806346b988e51461051c57806348758697146105495780634d2c3899146105695780634f6ccce71461058957600080fd5b80632120ba6f146103fd57806323b872dd1461041d5780632471e6eb1461043d57806325e160631461045d5780632a55205a1461047d5780632f745c59146104bc57600080fd5b80630d9005ae116102455780630d9005ae1461035e578063106e054d1461037d578063140c08a51461039d57806318160ddd1461035e57806320595c48146103bd57806320600331146103dd57600080fd5b806301ffc9a71461028d57806306d254da146102c257806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102ad6102a83660046142af565b6108f9565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd3660046142e8565b610966565b005b3480156102f057600080fd5b506102f96109ba565b6040516102b9919061435d565b34801561031257600080fd5b50610326610321366004614370565b610a4c565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e2610359366004614389565b610ad7565b34801561036a57600080fd5b506000545b6040519081526020016102b9565b34801561038957600080fd5b506102f9610398366004614370565b610bef565b3480156103a957600080fd5b506102e26103b83660046142e8565b610cf1565b3480156103c957600080fd5b506102f96103d8366004614370565b610d3d565b3480156103e957600080fd5b506102f96103f8366004614370565b610dab565b34801561040957600080fd5b506102f9610418366004614370565b610e1d565b34801561042957600080fd5b506102e26104383660046143b5565b610e8e565b34801561044957600080fd5b506102e2610458366004614404565b610e99565b34801561046957600080fd5b506102e26104783660046142e8565b610f12565b34801561048957600080fd5b5061049d610498366004614421565b61106e565b604080516001600160a01b0390931683526020830191909152016102b9565b3480156104c857600080fd5b5061036f6104d7366004614389565b6110a4565b3480156104e857600080fd5b506102f96104f7366004614370565b611201565b34801561050857600080fd5b506102e26105173660046143b5565b611294565b34801561052857600080fd5b5061053c610537366004614370565b6112af565b6040516102b99190614443565b34801561055557600080fd5b5061036f610564366004614370565b611476565b34801561057557600080fd5b506102e26105843660046142e8565b61149f565b34801561059557600080fd5b5061036f6105a4366004614370565b6116e1565b3480156105b557600080fd5b506102e26105c4366004614531565b611743565b3480156105d557600080fd5b506103266105e4366004614370565b611784565b3480156105f557600080fd5b5061036f6106043660046142e8565b611796565b34801561061557600080fd5b506102f9610624366004614370565b611827565b34801561063557600080fd5b506102e2611898565b34801561064a57600080fd5b506102e2610659366004614370565b6118ce565b34801561066a57600080fd5b506102e2610679366004614404565b6119a5565b34801561068a57600080fd5b506008546001600160a01b0316610326565b3480156106a857600080fd5b506102f9611a1e565b3480156106bd57600080fd5b506102e26106cc366004614370565b611a2d565b3480156106dd57600080fd5b506102e26106ec366004614421565b611a60565b3480156106fd57600080fd5b506102e261070c36600461457a565b611b08565b34801561071d57600080fd5b506102f961072c366004614370565b611bcd565b34801561073d57600080fd5b506102e261074c3660046142e8565b611c3e565b34801561075d57600080fd5b506102e261076c3660046145b3565b611c8a565b34801561077d57600080fd5b506102f961078c366004614370565b611cc3565b34801561079d57600080fd5b506010546107de906001600160d01b0381169061ffff600160d01b8204169060ff600160e01b8204811691600160e81b8104821691600160f01b9091041685565b604080516001600160d01b03909616865261ffff90941660208601529115159284019290925290151560608301521515608082015260a0016102b9565b34801561082757600080fd5b506102ad610836366004614633565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561087057600080fd5b50610879612525565b6040516102b99190614661565b34801561089257600080fd5b506102e26108a1366004614370565b612588565b3480156108b257600080fd5b506102e26108c13660046142e8565b6125d4565b6102e26108d4366004614697565b61266c565b3480156108e557600080fd5b506102e26108f4366004614404565b6128d9565b60006001600160e01b031982166380ac58cd60e01b148061092a57506001600160e01b03198216635b5e139f60e01b145b8061094557506001600160e01b0319821663780e9d6360e01b145b8061096057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109995760405162461bcd60e51b81526004016109909061471c565b60405180910390fd5b600980546001600160a01b0319166001600160a01b03831617905550565b50565b6060600180546109c990614751565b80601f01602080910402602001604051908101604052809291908181526020018280546109f590614751565b8015610a425780601f10610a1757610100808354040283529160200191610a42565b820191906000526020600020905b815481529060010190602001808311610a2557829003601f168201915b5050505050905090565b6000610a59826000541190565b610abb5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610990565b506000908152600560205260409020546001600160a01b031690565b6000610ae282611784565b9050806001600160a01b0316836001600160a01b03161415610b515760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610990565b336001600160a01b0382161480610b6d5750610b6d8133610836565b610bdf5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610990565b610bea838383612958565b505050565b6060610bfc826000541190565b610c0557600080fd5b6000828152600e6020526040902054610c4157505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b6020610c4c836129b4565b60200151600d8110610c6057610c6061478c565b018054610c6c90614751565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9890614751565b8015610ce55780601f10610cba57610100808354040283529160200191610ce5565b820191906000526020600020905b815481529060010190602001808311610cc857829003601f168201915b50505050509050919050565b6008546001600160a01b03163314610d1b5760405162461bcd60e51b81526004016109909061471c565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6060610d4a826000541190565b610d5357600080fd5b6000828152600e6020526040902054610d8f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b6013610d9a836129b4565b51600d8110610c6057610c6061478c565b6060610db8826000541190565b610dc157600080fd5b6000828152600e6020526040902054610dfd57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b610960610e09836129b4565b60400151610e189060016147b8565b6129d4565b6060610e2a826000541190565b610e3357600080fd5b6000828152600e6020526040902054610e6f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b602d610e7a836129b4565b60800151600d8110610c6057610c6061478c565b610bea838383612ada565b6008546001600160a01b03163314610ec35760405162461bcd60e51b81526004016109909061471c565b60105460ff600160e01b9091041615158115151415610ef45760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160e01b0260ff60e01b19909216919091179055565b6008546001600160a01b03163314610f3c5760405162461bcd60e51b81526004016109909061471c565b60026007541415610f5f5760405162461bcd60e51b815260040161099090614818565b60026007556040516d2932b632b0b9b4b7339022aa241760911b815247906000906001600160a01b038416904790600e0160006040518083038185875af1925050503d8060008114610fcd576040519150601f19603f3d011682016040523d82523d6000602084013e610fd2565b606091505b50509050806110165760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610990565b60408051838152600060208201526001600160a01b0385168183015242606082015290517fa71dafbe3498b278b06a596f8412cf056d7c0972c3623447ade8f63606df95a19181900360800190a15050600160075550565b600954600a546001600160a01b039091169060009061271090611091908561484f565b61109b9190614884565b90509250929050565b60006110af83611796565b82106111085760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610990565b600080549080805b838110156111a1576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561116357805192505b876001600160a01b0316836001600160a01b0316141561119857868414156111915750935061096092505050565b6001909301925b50600101611110565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610990565b606061120e826000541190565b61121757600080fd5b6000828152600e602052604090205461125357505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b61126e61125f836129b4565b60600151610e189060016147b8565b60405160200161127e91906148b4565b6040516020818303038152906040529050919050565b610bea83838360405180602001604052806000815250611c8a565b606060006112bc83612dbf565b90506000805b600d81101561130e5760008382600d81106112df576112df61478c565b602002015161ffff1611156112fc576112f96001836147b8565b91505b80611306816148e0565b9150506112c2565b5060008167ffffffffffffffff81111561132a5761132a6144a5565b60405190808252806020026020018201604052801561135d57816020015b60608152602001906001900390816113485790505b5090506000915060005b600d81101561146d5760008482600d81106113845761138461478c565b602002015161ffff16111561145b57601381600d81106113a6576113a661478c565b0180546113b290614751565b80601f01602080910402602001604051908101604052809291908181526020018280546113de90614751565b801561142b5780601f106114005761010080835404028352916020019161142b565b820191906000526020600020905b81548152906001019060200180831161140e57829003601f168201915b50505050508284815181106114425761144261478c565b60209081029190910101526114586001846147b8565b92505b80611465816148e0565b915050611367565b50949350505050565b6000611483826000541190565b61148c57600080fd5b611495826129b4565b60e0015192915050565b6008546001600160a01b031633146114c95760405162461bcd60e51b81526004016109909061471c565b600260075414156114ec5760405162461bcd60e51b815260040161099090614818565b6002600755600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561153a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155e91906148fb565b600b546040516370a0823160e01b81523060048201529192506001600160a01b03169063a9059cbb90849083906370a0823190602401602060405180830381865afa1580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d591906148fb565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611620573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116449190614914565b6116895760405162461bcd60e51b8152602060048201526016602482015275213cba32b9903a3930b739b332b9103330b4b632b21760511b6044820152606401610990565b6040805160008152602081018390526001600160a01b0384168183015242606082015290517fa71dafbe3498b278b06a596f8412cf056d7c0972c3623447ade8f63606df95a19181900360800190a150506001600755565b60008054821061173f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610990565b5090565b6008546001600160a01b0316331461176d5760405162461bcd60e51b81526004016109909061471c565b805161178090600d906020840190614182565b5050565b600061178f82612fbd565b5192915050565b60006001600160a01b0382166118025760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610990565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6060611834826000541190565b61183d57600080fd5b6000828152600e602052604090205461187957505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b603a611884836129b4565b60a00151600d8110610c6057610c6061478c565b6008546001600160a01b031633146118c25760405162461bcd60e51b81526004016109909061471c565b6118cc6000613094565b565b60fa811080156118ea57506000818152600e6020526040902054155b6118f357600080fd5b6000601e8210156119065750600061199b565b605a8210156119175750600161199b565b60828210156119285750600261199b565b60b48210156119395750600361199b565b60c882101561194a5750600461199b565b60d782101561195b5750600561199b565b60e182101561196c5750600661199b565b60eb82101561197d5750600761199b565b60f582101561198e5750600861199b565b60fa82101561199b575060095b610bea81836130e6565b6008546001600160a01b031633146119cf5760405162461bcd60e51b81526004016109909061471c565b60105460ff600160e81b9091041615158115151415611a005760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160e81b0260ff60e81b19909216919091179055565b6060600280546109c990614751565b6008546001600160a01b03163314611a575760405162461bcd60e51b81526004016109909061471c565b6109b78161346c565b6008546001600160a01b03163314611a8a5760405162461bcd60e51b81526004016109909061471c565b6000611a95836129b4565b9050611aa2836000541190565b8015611aae5750805182105b611ab757600080fd5b81816000018181525050611af1816000015182602001518360400151846060015185608001518660a001518760c001518860e00151613482565b6000938452600e6020526040909320929092555050565b6001600160a01b038216331415611b615760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610990565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060611bda826000541190565b611be357600080fd5b6000828152600e6020526040902054611c1f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b603a611c2a836129b4565b60c00151600d8110610c6057610c6061478c565b6008546001600160a01b03163314611c685760405162461bcd60e51b81526004016109909061471c565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611c95848484612ada565b611ca184848484613517565b611cbd5760405162461bcd60e51b815260040161099090614931565b50505050565b6060611cd0826000541190565b611d345760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610990565b6000611d3f836129b4565b90506000604051806101a001604052806040518060400160405280600681526020016518182222a32360d11b81525081526020016040518060400160405280600681526020016518182222a32360d11b815250815260200160405180604001604052806006815260200165219aa0a1a32360d11b815250815260200160405180604001604052806006815260200165219aa0a1a32360d11b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016511918e110e1160d21b81525081526020016040518060400160405280600681526020016511918e110e1160d21b81525081526020016040518060400160405280600681526020016511918e110e1160d21b815250815260200160405180604001604052806006815260200165119191914e1160d21b815250815260200160405180604001604052806006815260200165119191914e1160d21b8152508152602001604051806040016040528060068152602001652118a321a32360d11b81525081525090506000818360000151600d8110611f3b57611f3b61478c565b6020020151604051602001611f509190614984565b6040516020818303038152906040529050600081611f7885600001516001610e1891906147b8565b604051602001611f89929190614a85565b60408051601f19818403018152610380830190915260266103208301818152919350600092918291615c1861034084013981526020016040518060600160405280602d8152602001615b3c602d913981526020016040518060400160405280600f81526020016e53612f52614f5320762e20372e323160881b81525081526020016040518060400160405280601d81526020017f2843293230323220426c61636b204d65746120436f72702e28544d292900000081525081526020016040518060600160405280602d8152602001615b3c602d913981526020016040518060600160405280602b8152602001615a17602b913981526020016040518060400160405280600c81526020016b03e102ab9b2b9102637b39d160a51b81525081526020016120b4896129d4565b6040516020016120c49190614c03565b60405160208183030381529060405281526020016040518060400160405280601681526020017503e1029b2b1bab934ba3c9021b632b0b930b731b29d160551b815250815260200160138760000151600d81106121235761212361478c565b016040516020016121349190614cdb565b60405160208183030381529060405281526020016040518060400160405280601881526020017f7c2057656c636f6d6520746f20426c61636b204d6574612e00000000000000008152508152602001604051806060016040528060288152602001615a726028913981526020016121b587606001516001610e1891906147b8565b6040516020016121c59190614cf9565b6040516020818303038152906040528152602001604051806060016040528060278152602001615bf160279139815260200160208760200151600d811061220e5761220e61478c565b0160405160200161221f9190614cdb565b6040516020818303038152906040528152602001604051806060016040528060308152602001615b8d603091398152602001604051806060016040528060308152602001615a42603091398152602001604051806060016040528060248152602001615b696024913981526020016040518060600160405280602e8152602001615b0e602e91398152602001602d8760800151600d81106122c2576122c261478c565b016040516020016122d39190614d2e565b6040516020818303038152906040528152602001603a8760a00151600d81106122fe576122fe61478c565b0160405160200161230f9190614d4e565b6040516020818303038152906040528152602001604051806060016040528060348152602001615bbd603491398152602001604051806060016040528060348152602001615a9a603491398152602001604051806060016040528060248152602001615b6960249139815260200160478760c00151600d81106123945761239461478c565b016040516020016123a59190614d68565b60405160208183030381529060405281525090506000600d6123ca87600001516129d4565b6040516020016123db929190614d89565b60408051601f19818403018152602083019091526000808352909250600581805b601981101561248257846124288285878b866019811061241e5761241e61478c565b6020020151613615565b604051602001612439929190614e0f565b60408051601f198184030181529190529450612456600284614884565b61246090856147b8565b9350816001141561247057612482565b8061247a816148e0565b9150506123fc565b50600061248e846129d4565b60405160200161249e9190614e4a565b60405160208183030381529060405290506060600d6040516020016124c39190614fc4565b6040516020818303038152906040529050600081888b89866040516020016124ef959493929190615029565b60405160208183030381529060405290506125128f61250d836136b7565b613741565b9f9e505050505050505050505050505050565b61252d614202565b604080516101a081019182905290601190600d90826000855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116125465790505050505050905090565b6008546001600160a01b031633146125b25760405162461bcd60e51b81526004016109909061471c565b601080546001600160d01b0319166001600160d01b0392909216919091179055565b6008546001600160a01b031633146125fe5760405162461bcd60e51b81526004016109909061471c565b6001600160a01b0381166126635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610990565b6109b781613094565b6002600754141561268f5760405162461bcd60e51b815260040161099090614818565b6002600755601054600160f01b900460ff161515600114806127295750600c54604051637d7bd41360e11b81526001600160a01b039091169063faf7a826906126e29033908590889088906004016151c4565b602060405180830381865afa1580156126ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127239190614914565b15156001145b6127675760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610990565b601054600054600160d01b90910461ffff161161278357600080fd5b336000908152600f6020526040902054156127d95760405162461bcd60e51b81526020600482015260166024820152751859191c995cdcc8185b1c9958591e481b5a5b9d195960521b6044820152606401610990565b6010546001600160d01b03163410156127f157600080fd5b601054600160e81b900460ff16151560011461285b5760405162461bcd60e51b815260206004820152602360248201527f4d696e74696e672069732063757272656e746c79206e6f74207065726d69747460448201526232b21760e91b6064820152608401610990565b336000908152600f6020526040812080546001929061287b9084906147b8565b90915550506040805160018082528183019092526000916020808301908036833701905050905084816000815181106128b6576128b661478c565b6020026020010181815250506128cd816001613930565b50506001600755505050565b6008546001600160a01b031633146129035760405162461bcd60e51b81526004016109909061471c565b60105460ff600160f01b90910416151581151514156129345760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160f01b0260ff60f01b19909216919091179055565b3b151590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6129bc614221565b6000828152600e602052604090205461096090613c1f565b6060816129f85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a225780612a0c816148e0565b9150612a1b9050600a83614884565b91506129fc565b60008167ffffffffffffffff811115612a3d57612a3d6144a5565b6040519080825280601f01601f191660200182016040528015612a67576020820181803683370190505b5090505b8415612ad257612a7c600183615219565b9150612a89600a86615230565b612a949060306147b8565b60f81b818381518110612aa957612aa961478c565b60200101906001600160f81b031916908160001a905350612acb600a86614884565b9450612a6b565b949350505050565b6000612ae582612fbd565b80519091506000906001600160a01b0316336001600160a01b03161480612b1c575033612b1184610a4c565b6001600160a01b0316145b80612b2e57508151612b2e9033610836565b905080612b985760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610990565b846001600160a01b031682600001516001600160a01b031614612c0c5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610990565b6001600160a01b038416612c705760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610990565b612c806000848460000151612958565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116612d7557612d28816000541190565b15612d75578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b612dc7614202565b612dcf614202565b60008060006802b5e3af16b1880000861015612df257600a9250600c9150612e66565b68056bc75e2d63100000861015612e10576007925060099150612e66565b680ad78ebc5ac6200000861015612e2e576004925060069150612e66565b681043561a8829300000861015612e4c576002925060039150612e66565b6815af1d78b58c400000861015612e665760019250600191505b825b828111612f46576000601182600d8110612e8457612e8461478c565b601091828204019190066002029054906101000a900461ffff1661ffff161115612f3457601181600d8110612ebb57612ebb61478c565b601091828204019190066002029054906101000a900461ffff168582600d8110612ee757612ee761478c565b61ffff9092166020929092020152601181600d8110612f0857612f0861478c565b601091828204019190066002029054906101000a900461ffff1661ffff1682612f3191906147b8565b91505b80612f3e816148e0565b915050612e68565b5060008111612fb35760405162461bcd60e51b815260206004820152603360248201527f4e6f20636c656172616e6365206c6576656c7320617661696c61626c6520666f60448201527239103a3434b990213cba329030b6b7bab73a1760691b6064820152608401610990565b5091949350505050565b6040805180820190915260008082526020820152612fdc826000541190565b61303b5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610990565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561308a579392505050565b506000190161303d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006130f0614221565b6130f8614266565b60408051426020808301919091523360601b6bffffffffffffffffffffffff19168284015260548083018890528351808403909101815260749092019092528051910120600080805b60068110156131f557610bb861315a600e831886614884565b6131649190615230565b925060009150600c5b601281600d81106131805761318061478c565b601091828204019190066002029054906101000a900461ffff1661ffff16836131a991906147b8565b9250828410156131d057808683600681106131c6576131c661478c565b60200201526131e2565b806131da81615244565b91505061316d565b50806131ed816148e0565b915050613141565b50878552835160208087019190915284015160408087019190915284015160608087019190915284015160808087019190915284015160a08087019190915284015160c086018190528790601290600d81106132535761325361478c565b601091828204019190066002029054906101000a900461ffff1660128760a00151600d81106132845761328461478c565b601091828204019190066002029054906101000a900461ffff1660128860800151600d81106132b5576132b561478c565b601091828204019190066002029054906101000a900461ffff1660128960600151600d81106132e6576132e661478c565b601091828204019190066002029054906101000a900461ffff1660128a60400151600d81106133175761331761478c565b601091828204019190066002029054906101000a900461ffff1660128b60200151600d81106133485761334861478c565b601091828204019190066002029054906101000a900461ffff1661336c919061525b565b613376919061525b565b613380919061525b565b61338a919061525b565b613394919061525b565b6133a49061ffff16611194615219565b6133b09061271061484f565b8651601290600d81106133c5576133c561478c565b601091828204019190066002029054906101000a900461ffff1661ffff166102ee6133f09190615219565b6133fe906305f5e10061484f565b61340891906147b8565b61341490610bb86147b8565b61341e9190615219565b60e08601819052855160208701516040880151606089015160808a015160a08b015160c08c015161344e97613482565b6000978852600e602052604090972096909655509295945050505050565b612710600a54111561347d57600080fd5b600a55565b600080896134916008836147b8565b915089821b176134a26008836147b8565b915088821b176134b36008836147b8565b915087821b176134c46008836147b8565b915086821b176134d56008836147b8565b915085821b176134e66008836147b8565b915084821b176134f76008836147b8565b915083821b176135086080836147b8565b509a9950505050505050505050565b60006001600160a01b0384163b1561360a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061355b903390899088908890600401615281565b6020604051808303816000875af1925050508015613596575060408051601f3d908101601f19168201909252613593918101906152be565b60015b6135f0573d8080156135c4576040519150601f19603f3d011682016040523d82523d6000602084013e6135c9565b606091505b5080516135e85760405162461bcd60e51b815260040161099090614931565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612ad2565b506001949350505050565b60606000613622866129d4565b61363b61363088600e61484f565b610e189060aa6147b8565b61364961363089600e61484f565b613652886129d4565b61365b886129d4565b60405160200161366f9594939291906152db565b60405160208183030381529060405290508061368a876129d4565b8460405160200161369d93929190615413565b60408051808303601f190181529190529695505050505050565b604080518082018252601a81527f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000060209182015281518083018352601381527219185d184e9a5b5859d94bdcdd99cade1b5b0b606a1b81830152915160609260009290916137299183918791016154e0565b60405160208183030381529060405292505050919050565b6000828152600e602052604090205460609061377f57600d6040516020016137699190615506565b6040516020818303038152906040529050610960565b600061378a846129b4565b90506000600d61379d83600001516129d4565b8560138560000151600d81106137b5576137b561478c565b016040516020016137c99493929190615535565b60405160208183030381529060405290508060208360200151600d81106137f2576137f261478c565b0161380784604001516001610e1891906147b8565b604051602001613819939291906156e3565b60405160208183030381529060405290508061383f83606001516001610e1891906147b8565b602d8460800151600d81106138565761385661478c565b01604051602001613869939291906157ac565b604051602081830303815290604052905080603a8360a00151600d81106138925761389261478c565b0160478460c00151600d81106138aa576138aa61478c565b016138b88560e001516129d4565b6040516020016138cb9493929190615872565b6040516020818303038152906040529050806040516020016138ed919061597f565b604051602081830303815290604052905061390781613c9f565b60405160200161391791906159ae565b6040516020818303038152906040529250505092915050565b6000805b83518110156139765783818151811061394f5761394f61478c565b60200260200101518261396291906147b8565b91508061396e816148e0565b915050613934565b5060008111801561399257506008546001600160a01b03163314155b15613b1857600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156139df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a0391906148fb565b1015613a515760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420427974652062616c616e6365000000000000006044820152606401610990565b600b546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015613aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acc9190614914565b613b185760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f207472616e7366657220427974657300000000000000006044820152606401610990565b613b20614202565b6000805b84811015613c145780613b5a57613b53868281518110613b4657613b4661478c565b6020026020010151612dbf565b9250613b87565b60018383600d8110613b6e57613b6e61478c565b60200201818151613b7f91906159f3565b61ffff169052505b613b918382613e05565b9150613baa8282600054613ba591906147b8565b6130e6565b506001601183600d8110613bc057613bc061478c565b601091828204019190066002028282829054906101000a900461ffff16613be791906159f3565b92506101000a81548161ffff021916908361ffff1602179055508080613c0c906148e0565b915050613b24565b50612db83385613fa2565b613c27614221565b50604080516101008101825260ff8381168252600884901c8116602080840191909152601085901c821693830193909352601884901c811660608301529183901c82166080820152602883901c821660a0820152603083901c90911660c082015260389190911c6001600160801b031660e082015290565b6060815160001415613cbf57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615ace6040913990506000600384516002613cee91906147b8565b613cf89190614884565b613d0390600461484f565b90506000613d128260206147b8565b67ffffffffffffffff811115613d2a57613d2a6144a5565b6040519080825280601f01601f191660200182016040528015613d54576020820181803683370190505b509050818152600183018586518101602084015b81831015613dc0576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101613d68565b600389510660018114613dda5760028114613deb57613df7565b613d3d60f01b600119830152613df7565b603d60f81b6000198301525b509398975050505050505050565b60008080805b600d811015613e4d578581600d8110613e2657613e2661478c565b6020020151613e399061ffff16846147b8565b925080613e45816148e0565b915050613e0b565b5081613e905760405162461bcd60e51b815260206004820152601260248201527126b4b73a34b7339032bc3430bab9ba32b21760711b6044820152606401610990565b6000444233600054896000600d8110613eab57613eab61478c565b6020020151600d8a604051602001613f139796959493929190968752602087019590955260609390931b6bffffffffffffffffffffffff19166040860152605485019190915260f01b6001600160f01b03191660748401526076830152609682015260b60190565b6040516020818303038152906040529050600083828051906020012060001c613f3c9190615230565b905060005b600d811015613f97578781600d8110613f5c57613f5c61478c565b6020020151613f6f9061ffff16856147b8565b935083821015613f855794506109609350505050565b80613f8f816148e0565b915050613f41565b505050505092915050565b611780828260405180602001604052806000815250610bea83838360016000546001600160a01b0385166140225760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610990565b836140805760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610990565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b858110156141795760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4831561416d576141516000888488613517565b61416d5760405162461bcd60e51b815260040161099090614931565b600191820191016140fe565b50600055612db8565b82805461418e90614751565b90600052602060002090601f0160209004810192826141b057600085556141f6565b82601f106141c957805160ff19168380011785556141f6565b828001600101855582156141f6579182015b828111156141f65782518255916020019190600101906141db565b5061173f929150614284565b604051806101a00160405280600d906020820280368337509192915050565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806006906020820280368337509192915050565b5b8082111561173f5760008155600101614285565b6001600160e01b0319811681146109b757600080fd5b6000602082840312156142c157600080fd5b81356142cc81614299565b9392505050565b6001600160a01b03811681146109b757600080fd5b6000602082840312156142fa57600080fd5b81356142cc816142d3565b60005b83811015614320578181015183820152602001614308565b83811115611cbd5750506000910152565b60008151808452614349816020860160208601614305565b601f01601f19169290920160200192915050565b6020815260006142cc6020830184614331565b60006020828403121561438257600080fd5b5035919050565b6000806040838503121561439c57600080fd5b82356143a7816142d3565b946020939093013593505050565b6000806000606084860312156143ca57600080fd5b83356143d5816142d3565b925060208401356143e5816142d3565b929592945050506040919091013590565b80151581146109b757600080fd5b60006020828403121561441657600080fd5b81356142cc816143f6565b6000806040838503121561443457600080fd5b50508035926020909101359150565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561449857603f19888603018452614486858351614331565b9450928501929085019060010161446a565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156144d6576144d66144a5565b604051601f8501601f19908116603f011681019082821181831017156144fe576144fe6144a5565b8160405280935085815286868601111561451757600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561454357600080fd5b813567ffffffffffffffff81111561455a57600080fd5b8201601f8101841361456b57600080fd5b612ad2848235602084016144bb565b6000806040838503121561458d57600080fd5b8235614598816142d3565b915060208301356145a8816143f6565b809150509250929050565b600080600080608085870312156145c957600080fd5b84356145d4816142d3565b935060208501356145e4816142d3565b925060408501359150606085013567ffffffffffffffff81111561460757600080fd5b8501601f8101871361461857600080fd5b614627878235602084016144bb565b91505092959194509250565b6000806040838503121561464657600080fd5b8235614651816142d3565b915060208301356145a8816142d3565b6101a08101818360005b600d81101561468e57815161ffff1683526020928301929091019060010161466b565b50505092915050565b600080600080606085870312156146ad57600080fd5b84359350602085013567ffffffffffffffff808211156146cc57600080fd5b818701915087601f8301126146e057600080fd5b8135818111156146ef57600080fd5b8860208260051b850101111561470457600080fd5b95986020929092019750949560400135945092505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061476557607f821691505b6020821081141561478657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156147cb576147cb6147a2565b500190565b60208082526028908201527f6d7573742062652031206f7220302c20616e64206e6f742073616d652061732060408201526731bab93932b73a1760c11b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000816000190483118215151615614869576148696147a2565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826148935761489361486e565b500490565b600081516148aa818560208601614305565b9290920192915050565b6302c32b7160e51b8152600082516148d3816004850160208701614305565b9190910160040192915050565b60006000198214156148f4576148f46147a2565b5060010190565b60006020828403121561490d57600080fd5b5051919050565b60006020828403121561492657600080fd5b81516142cc816143f6565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6a2533437374796c6525334560a81b81527f40696d706f72742075726c282768747470733a2f2f666f6e74732e676f6f676c600b8201527f65617069732e636f6d2f637373323f66616d696c793d565433323327293b0000602b8201526617313690129ba160c91b60498201527f666f6e742d66616d696c793a20275654333233272c206d6f6e6f73706163653b60508201526e666f6e742d73697a653a313270783b60881b60708201526866696c6c3a2025323360b81b607f82015260008251614a56816088850160208701614305565b62094dd160ea1b60889390910192830152506b2533432f7374796c6525334560a01b608b820152609701919050565b60008351614a97818460208801614305565b80830190507f2533437465787420636c6173733d27626d2720783d2735302532352720793d278082527f39302720746578742d616e63686f723d276d6964646c65272025334553412f5260208301527f412039303030204f5045524154494e472053595354454d202533432f7465787460408301526225334560e81b60608301528060638301527f3131302720746578742d616e63686f723d276d6964646c652720253345434f5060838301527f59524947485420323032322d3231373520424c41434b204d45544120434f525060a3830152714f524154494f4e2533432f7465787425334560701b60c38301528060d5830152507f3133302720746578742d616e63686f723d276d6964646c652720253345202d2d60f582015271029a2a1aaa924aa2c902a22a926a4a720a6160751b610115820152614bfa614bdf610127830186614898565b6e2d2d20202533432f7465787425334560881b8152600f0190565b95945050505050565b7503e101299a29299a29026bab63a34b830b9b9a4a21d160551b815260008251614c34816016850160208701614305565b9190910160160192915050565b8054600090600181811c9080831680614c5b57607f831692505b6020808410821415614c7d57634e487b7160e01b600052602260045260246000fd5b818015614c915760018114614ca257614ccf565b60ff19861689528489019650614ccf565b60008881526020902060005b86811015614cc75781548b820152908501908301614cae565b505084890196505b50505050505092915050565b6803e101299a29299a2960bd1b815260006142cc6009830184614c41565b6c03e101299a29299a2902c32b71609d1b815260008251614d2181600d850160208701614305565b91909101600d0192915050565b6a01299a290219d1299a290160ad1b815260006142cc600b830184614c41565b6401299a2be160dd1b815260006142cc6005830184614c41565b6b01299a2be101299a29299a2960a51b815260006142cc600c830184614c41565b74253343696d61676520786c696e6b3a687265663d2760581b81526000614db36015830185614c41565b602f60f81b81528351614dcd816001840160208801614305565b7f2e706e67272077696474683d2736303027206865696768743d2736303027202f600192909101918201526225334560e81b6021820152602401949350505050565b60008351614e21818460208801614305565b835190830190614e35818360208801614305565b600160fd1b9101908152600101949350505050565b7f253343706174682069643d277061746866696e616c27253345253343616e696d81527f617465206174747269627574654e616d653d2764272066726f6d3d276d31383060208201527f2c3535302068302720746f3d276d3138302c353530206831313030272064757260408201526c3d2737732720626567696e3d2760981b606082015260008251614ee481606d850160208701614305565b7f73272066696c6c3d27667265657a65272f2533452533432f7061746825334500606d9390910192830152507f25334374657874253345253343746578745061746820786c696e6b3a68726566608c8201527f3d272532337061746866696e616c2720636c6173733d27626d2725334552455460ac8201527f55524e3a20656e746572207c204241434b5350414345203a2064656c6574652060cc8201527f7c2046313a206d61696e206d656e752533432f7465787450617468253345253360ec82015268432f7465787425334560b81b61010c82015261011501919050565b74253343696d61676520786c696e6b3a687265663d2760581b81526000614fee6015830184614c41565b7f2f612e706e67272077696474683d2736303027206865696768743d2736303027815264202f25334560d81b60208201526025019392505050565b7f25334373766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f81527f323030302f737667272077696474683d27363030272020786d6c6e733a786c6960208201527f6e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b60408201527f27206865696768743d273630302725334520253343726563742077696474683d60608201527f2736303027206865696768743d2736303027207374796c653d2766696c6c3a7260808201527f6762283235352c3235352c323535293b7374726f6b652d77696474683a333b7360a08201527574726f6b653a72676228302c302c302927202f25334560501b60c08201526000865161513e8160d6850160208b01614305565b8651908301906151558160d6840160208b01614305565b865191019061516b8160d6840160208a01614305565b6151b76151a161518961518360d6858701018a614898565b88614898565b6b2ab739bab83837b93a32b21760a11b8152600c0190565b692533432f73766725334560b01b8152600a0190565b9998505050505050505050565b6001600160a01b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156151fb57600080fd5b8260051b808560808501376000920160800191825250949350505050565b60008282101561522b5761522b6147a2565b500390565b60008261523f5761523f61486e565b500690565b600081615253576152536147a2565b506000190190565b600061ffff808316818516808303821115615278576152786147a2565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906152b490830184614331565b9695505050505050565b6000602082840312156152d057600080fd5b81516142cc81614299565b6f04a6686e0c2e8d040d2c87a4ee0c2e8d60831b815260008651615306816010850160208b01614305565b7f2725334520253343616e696d617465206174747269627574654e616d653d27646010918401918201526c01390333937b69e93b69a98161609d1b6030820152865161535981603d840160208b01614305565b6d010341813903a379e93b69a9816160951b603d9290910191820152855161538881604b840160208a01614305565b6c20683131303027206475723d2760981b604b929091019182015284516153b6816058840160208901614305565b69732720626567696e3d2760b01b605892909101918201526154076153de6062830186614898565b7f73272066696c6c3d27667265657a65272f2533452533432f70617468253345008152601f0190565b98975050505050505050565b60008451615425818460208901614305565b80830190507f2533437465787420636c6173733d27626d2725334520253343746578745061748152740d040f0d8d2dcd674d0e4cacc7a4e4a6466e0c2e8d605b1b6020820152845161547e816035840160208901614305565b632725334560e01b6035929091019182015283516154a3816039840160208801614305565b6e2533432f746578745061746825334560881b603992909101918201526a2533432f7465787425334560a81b604882015260530195945050505050565b600083516154f2818460208801614305565b835190830190615278818360208801614305565b60006155128284614c41565b7217b0b1b1b2b9b9afb232b734b2b2173539b7b760691b81526013019392505050565b7f7b226465736372697074696f6e223a2022546865207469636b657420696e746f81527f2074686520426c61636b204d657461204d756c746976657273652e220000000060208201527f2c202265787465726e616c5f75726c223a202268747470733a2f2f626c61636b603c8201526936b2ba309739b4ba329160b11b605c8201526b16101134b6b0b3b2911d101160a11b606682015260006155db6072830187614c41565b612f6160f01b815285516155f6816002840160208a01614305565b64173837339160d91b600292909101918201526e1610113230ba30afbab934911d101160891b60078201528451615634816016840160208901614305565b6154076156d46156ce61567f615656601686880101601160f91b815260010190565b7f2c20226e616d65223a2022426c61636b204d657461204d756c74697061737322815260200190565b7f2c202261747472696275746573223a205b7b2274726169745f74797065223a2081527f22436c656172616e6365204c6576656c222c202276616c7565223a20220000006020820152603d0190565b87614c41565b6222207d60e81b815260030190565b600084516156f5818460208901614305565b7f2c207b2274726169745f74797065223a202253746174696f6e222c202276616c908301908152653ab2911d101160d11b60208201526157386026820186614c41565b6222207d60e81b8082527f2c207b2274726169745f74797065223a20225365637572697479205465726d6960038301526f3730b6111610113b30b63ab2911d101160811b6023830152855191925090615798816033850160208901614305565b603392019182015260360195945050505050565b600084516157be818460208901614305565b80830190507f2c207b2274726169745f74797065223a202258656e2047726f757073222c202281526c03b30b63ab2911d10112c32b71609d1b6020820152845161580f81602d840160208901614305565b6222207d60e81b9101602d81018290527f2c207b2274726169745f74797065223a2022436f6d6d616e64222c202276616c6030820152653ab2911d101160d11b6050820152906158626056830186614c41565b9081526003019695505050505050565b60008551615884818460208a01614305565b7f2c207b2274726169745f74797065223a2022526573706f6e7365222c2022766190830190815266363ab2911d101160c91b60208201526158c86027820187614c41565b6222207d60e81b8082527f2c207b2274726169745f74797065223a2022496e73756c74222c202276616c7560038301526432911d101160d91b60238301529091506159166028830187614c41565b9081527f2c207b2274726169745f74797065223a2022526172697479222c202276616c75600382015263032911d160e51b60238201528451909150615962816027840160208801614305565b61207d60f01b602792909101918201526029019695505050505050565b60008251615991818460208701614305565b605d60f81b920191825250607d60f81b6001820152600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516159e681601d850160208701614305565b91909101601d0192915050565b600061ffff83811690831681811015615a0e57615a0e6147a2565b03939250505056fe7c202533452533452052756e6e696e67205365637572697479205363616e2e2e2e20434f4d504c455445202533457c20253345253345204f70656e696e6720436f6d6d616e6420537562726f6f742e2e2e20434f4d504c455445207c202533452533452041737369676e696e672051756172746572732e2e2e20434f4d504c455445202533457c20253345253345205374617274696e6720496e73756c742050726f746f636f6c20322e332e2e2e20434f4d504c4554454142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f2533453e2048656c6c6f2e20486f772063616e20492066697820796f757220746f74616c206661696c757265733f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d2533457c20253345253345204772616e74696e6720537562726f6f74204163636573732e2e2e20434f4d504c455445202533457c2025334525334520416c657274696e6720536563757269747920417373697374616e63652e2e2e20434f4d504c4554457c202533452533452041737369676e696e672053746174696f6e2e2e2e20434f4d504c455445202d2d426c61636b204d657461205365637572697479205363616e2053756273797374656d2d2da264697066735822122037272c98c2faa1c6775fd5bb79a03ead884914245de27f5ac2557f9257a5b96664736f6c634300080c0033

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

0000000000000000000000007d647b1a0dcd5525e9c6b3d14be58f27674f8c9500000000000000000000000033e66be2b437fbb7d401a1c391e0707b9e070734000000000000000000000000a9fb5c3f2fd89122b1da1c1e7245f6ed5732b8810000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000005468747470733a2f2f626c61636b6d6574612e6d7970696e6174612e636c6f75642f697066732f516d5476666f5658636a45446d4b647057437a4d724d4c464844373645704b6331455756336e486b625039537933000000000000000000000000

-----Decoded View---------------
Arg [0] : _BytesAddress (address): 0x7d647b1A0dcD5525e9C6B3D14BE58f27674f8c95
Arg [1] : _whiteListAddress (address): 0x33e66Be2B437FBb7d401a1c391e0707B9e070734
Arg [2] : _royaltiesCollector (address): 0xa9fB5C3F2fD89122b1da1C1e7245f6ED5732B881
Arg [3] : _baseURI (string): https://blackmeta.mypinata.cloud/ipfs/QmTvfoVXcjEDmKdpWCzMrMLFHD76EpKc1EWV3nHkbP9Sy3

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000007d647b1a0dcd5525e9c6b3d14be58f27674f8c95
Arg [1] : 00000000000000000000000033e66be2b437fbb7d401a1c391e0707b9e070734
Arg [2] : 000000000000000000000000a9fb5c3f2fd89122b1da1c1e7245f6ed5732b881
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000054
Arg [5] : 68747470733a2f2f626c61636b6d6574612e6d7970696e6174612e636c6f7564
Arg [6] : 2f697066732f516d5476666f5658636a45446d4b647057437a4d724d4c464844
Arg [7] : 373645704b6331455756336e486b625039537933000000000000000000000000


Deployed Bytecode Sourcemap

73196:35299:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59996:372;;;;;;;;;;-1:-1:-1;59996:372:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;59996:372:0;;;;;;;;106305:113;;;;;;;;;;-1:-1:-1;106305:113:0;;;;;:::i;:::-;;:::i;:::-;;61882:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;63444:214::-;;;;;;;;;;-1:-1:-1;63444:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2102:32:1;;;2084:51;;2072:2;2057:18;63444:214:0;1938:203:1;62965:413:0;;;;;;;;;;-1:-1:-1;62965:413:0;;;;;:::i;:::-;;:::i;80243:95::-;;;;;;;;;;-1:-1:-1;80292:7:0;80318:12;80243:95;;;2612:25:1;;;2600:2;2585:18;80243:95:0;2466:177:1;80824:272:0;;;;;;;;;;-1:-1:-1;80824:272:0;;;;;:::i;:::-;;:::i;105008:126::-;;;;;;;;;;-1:-1:-1;105008:126:0;;;;;:::i;:::-;;:::i;80437:297::-;;;;;;;;;;-1:-1:-1;80437:297:0;;;;;:::i;:::-;;:::i;81613:295::-;;;;;;;;;;-1:-1:-1;81613:295:0;;;;;:::i;:::-;;:::i;81998:272::-;;;;;;;;;;-1:-1:-1;81998:272:0;;;;;:::i;:::-;;:::i;64320:162::-;;;;;;;;;;-1:-1:-1;64320:162:0;;;;;:::i;:::-;;:::i;105298:232::-;;;;;;;;;;-1:-1:-1;105298:232:0;;;;;:::i;:::-;;:::i;104626:374::-;;;;;;;;;;-1:-1:-1;104626:374:0;;;;;:::i;:::-;;:::i;11324:328::-;;;;;;;;;;-1:-1:-1;11324:328:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4183:32:1;;;4165:51;;4247:2;4232:18;;4225:34;;;;4138:18;11324:328:0;3991:274:1;58917:1007:0;;;;;;;;;;-1:-1:-1;58917:1007:0;;;;;:::i;:::-;;:::i;81200:314::-;;;;;;;;;;-1:-1:-1;81200:314:0;;;;;:::i;:::-;;:::i;64553:177::-;;;;;;;;;;-1:-1:-1;64553:177:0;;;;;:::i;:::-;;:::i;83948:802::-;;;;;;;;;;-1:-1:-1;83948:802:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;83114:208::-;;;;;;;;;;-1:-1:-1;83114:208:0;;;;;:::i;:::-;;:::i;104263:355::-;;;;;;;;;;-1:-1:-1;104263:355:0;;;;;:::i;:::-;;:::i;58430:187::-;;;;;;;;;;-1:-1:-1;58430:187:0;;;;;:::i;:::-;;:::i;106072:100::-;;;;;;;;;;-1:-1:-1;106072:100:0;;;;;:::i;:::-;;:::i;61691:124::-;;;;;;;;;;-1:-1:-1;61691:124:0;;;;;:::i;:::-;;:::i;60432:221::-;;;;;;;;;;-1:-1:-1;60432:221:0;;;;;:::i;:::-;;:::i;82361:275::-;;;;;;;;;;-1:-1:-1;82361:275:0;;;;;:::i;:::-;;:::i;9017:94::-;;;;;;;;;;;;;:::i;89884:1118::-;;;;;;;;;;-1:-1:-1;89884:1118:0;;;;;:::i;:::-;;:::i;105538:262::-;;;;;;;;;;-1:-1:-1;105538:262:0;;;;;:::i;:::-;;:::i;8366:87::-;;;;;;;;;;-1:-1:-1;8439:6:0;;-1:-1:-1;;;;;8439:6:0;8366:87;;62051:104;;;;;;;;;;;;;:::i;106180:117::-;;;;;;;;;;-1:-1:-1;106180:117:0;;;;;:::i;:::-;;:::i;106875:755::-;;;;;;;;;;-1:-1:-1;106875:755:0;;;;;:::i;:::-;;:::i;63730:288::-;;;;;;;;;;-1:-1:-1;63730:288:0;;;;;:::i;:::-;;:::i;82727:271::-;;;;;;;;;;-1:-1:-1;82727:271:0;;;;;:::i;:::-;;:::i;105142:148::-;;;;;;;;;;-1:-1:-1;105142:148:0;;;;;:::i;:::-;;:::i;64801:355::-;;;;;;;;;;-1:-1:-1;64801:355:0;;;;;:::i;:::-;;:::i;96050:5069::-;;;;;;;;;;-1:-1:-1;96050:5069:0;;;;;:::i;:::-;;:::i;73960:40::-;;;;;;;;;;-1:-1:-1;73960:40:0;;;;-1:-1:-1;;;;;73960:40:0;;;;-1:-1:-1;;;73960:40:0;;;;;-1:-1:-1;;;73960:40:0;;;;;-1:-1:-1;;;73960:40:0;;;;;-1:-1:-1;;;73960:40:0;;;;;;;;;;-1:-1:-1;;;;;7758:32:1;;;7740:51;;7839:6;7827:19;;;7822:2;7807:18;;7800:47;7890:14;;7883:22;7863:18;;;7856:50;;;;7949:14;;7942:22;7937:2;7922:18;;7915:50;8009:14;8002:22;7996:3;7981:19;;7974:51;7727:3;7712:19;73960:40:0;7501:530:1;64089:164:0;;;;;;;;;;-1:-1:-1;64089:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;64210:25:0;;;64186:4;64210:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;64089:164;83576:130;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;106572:120::-;;;;;;;;;;-1:-1:-1;106572:120:0;;;;;:::i;:::-;;:::i;9266:192::-;;;;;;;;;;-1:-1:-1;9266:192:0;;;;;:::i;:::-;;:::i;92513:1008::-;;;;;;:::i;:::-;;:::i;105808:256::-;;;;;;;;;;-1:-1:-1;105808:256:0;;;;;:::i;:::-;;:::i;59996:372::-;60098:4;-1:-1:-1;;;;;;60135:40:0;;-1:-1:-1;;;60135:40:0;;:105;;-1:-1:-1;;;;;;;60192:48:0;;-1:-1:-1;;;60192:48:0;60135:105;:172;;;-1:-1:-1;;;;;;;60257:50:0;;-1:-1:-1;;;60257:50:0;60135:172;:225;;;-1:-1:-1;;;;;;;;;;35750:40:0;;;60324:36;60115:245;59996:372;-1:-1:-1;;59996:372:0:o;106305:113::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;;;;;;;;;11178:14;:26;;-1:-1:-1;;;;;;11178:26:0;-1:-1:-1;;;;;11178:26:0;;;;;106305:113;:::o;106381:29::-:1;106305:113:::0;:::o;61882:100::-;61936:13;61969:5;61962:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61882:100;:::o;63444:214::-;63512:7;63540:16;63548:7;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;63540:16;63532:74;;;;-1:-1:-1;;;63532:74:0;;10646:2:1;63532:74:0;;;10628:21:1;10685:2;10665:18;;;10658:30;10724:34;10704:18;;;10697:62;-1:-1:-1;;;10775:18:1;;;10768:43;10828:19;;63532:74:0;10444:409:1;63532:74:0;-1:-1:-1;63626:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;63626:24:0;;63444:214::o;62965:413::-;63038:13;63054:24;63070:7;63054:15;:24::i;:::-;63038:40;;63103:5;-1:-1:-1;;;;;63097:11:0;:2;-1:-1:-1;;;;;63097:11:0;;;63089:58;;;;-1:-1:-1;;;63089:58:0;;11060:2:1;63089:58:0;;;11042:21:1;11099:2;11079:18;;;11072:30;11138:34;11118:18;;;11111:62;-1:-1:-1;;;11189:18:1;;;11182:32;11231:19;;63089:58:0;10858:398:1;63089:58:0;7320:10;-1:-1:-1;;;;;63182:21:0;;;;:62;;-1:-1:-1;63207:37:0;63224:5;7320:10;64089:164;:::i;63207:37::-;63160:169;;;;-1:-1:-1;;;63160:169:0;;11463:2:1;63160:169:0;;;11445:21:1;11502:2;11482:18;;;11475:30;11541:34;11521:18;;;11514:62;11612:27;11592:18;;;11585:55;11657:19;;63160:169:0;11261:421:1;63160:169:0;63342:28;63351:2;63355:7;63364:5;63342:8;:28::i;:::-;63027:351;62965:413;;:::o;80824:272::-;80885:13;80919:17;80927:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;80919:17;80911:26;;;;;;80951:29;;;;:19;:29;;;;;;80948:85;;-1:-1:-1;;80999:22:0;;;;;;;;;;;;-1:-1:-1;;;80999:22:0;;;;;80824:272::o;80948:85::-;81050:8;81059:20;81070:8;81059:10;:20::i;:::-;:28;;;81050:38;;;;;;;:::i;:::-;;81043:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80824:272;;;:::o;105008:126::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;105089:10:::1;:37:::0;;-1:-1:-1;;;;;;105089:37:0::1;-1:-1:-1::0;;;;;105089:37:0;;;::::1;::::0;;;::::1;::::0;;105008:126::o;80437:297::-;80505:13;80539:17;80547:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;80539:17;80531:26;;;;;;80571:29;;;;:19;:29;;;;;;80568:85;;-1:-1:-1;;80619:22:0;;;;;;;;;;;;-1:-1:-1;;;80619:22:0;;;;;80437:297::o;80568:85::-;80670:15;80686:20;80697:8;80686:10;:20::i;:::-;:35;80670:52;;;;;;;:::i;81613:295::-;81683:13;81717:17;81725:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;81717:17;81709:26;;;;;;81749:29;;;;:19;:29;;;;;;81746:85;;-1:-1:-1;;81797:22:0;;;;;;;;;;;;-1:-1:-1;;;81797:22:0;;;;;81613:295::o;81746:85::-;81848:51;81857:20;81868:8;81857:10;:20::i;:::-;:37;;;:41;;81897:1;81857:41;:::i;:::-;81848:8;:51::i;81998:272::-;82059:13;82093:17;82101:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;82093:17;82085:26;;;;;;82125:29;;;;:19;:29;;;;;;82122:85;;-1:-1:-1;;82173:22:0;;;;;;;;;;;;-1:-1:-1;;;82173:22:0;;;;;81998:272::o;82122:85::-;82224:8;82233:20;82244:8;82233:10;:20::i;:::-;:28;;;82224:38;;;;;;;:::i;64320:162::-;64446:28;64456:4;64462:2;64466:7;64446:9;:28::i;105298:232::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;105379:16:::1;:28:::0;::::1;-1:-1:-1::0;;;105379:28:0;;::::1;;:44;;::::0;::::1;;;;105371:97;;;;-1:-1:-1::0;;;105371:97:0::1;;;;;;;:::i;:::-;105479:16;:43:::0;;;::::1;;-1:-1:-1::0;;;105479:43:0::1;-1:-1:-1::0;;;;105479:43:0;;::::1;::::0;;;::::1;::::0;;105298:232::o;104626:374::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;24721:1:::1;25317:7;;:19;;25309:63;;;;-1:-1:-1::0;;;25309:63:0::1;;;;;;;:::i;:::-;24721:1;25450:7;:18:::0;104795:64:::2;::::0;-1:-1:-1;;;13054:29:1;;104744:21:0::2;::::0;104719:22:::2;::::0;-1:-1:-1;;;;;104795:15:0;::::2;::::0;104819:21:::2;::::0;13108:2:1;13099:12;104795:64:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104776:83;;;104878:7;104870:36;;;::::0;-1:-1:-1;;;104870:36:0;;13324:2:1;104870:36:0::2;::::0;::::2;13306:21:1::0;13363:2;13343:18;;;13336:30;-1:-1:-1;;;13382:18:1;;;13375:46;13438:18;;104870:36:0::2;13122:340:1::0;104870:36:0::2;104922:70;::::0;;13714:25:1;;;104961:1:0::2;13770:2:1::0;13755:18;;13748:34;-1:-1:-1;;;;;13818:32:1;;13798:18;;;13791:60;104976:15:0::2;13882:2:1::0;13867:18;;13860:34;104922:70:0;;::::2;::::0;;;;13701:3:1;104922:70:0;;::::2;-1:-1:-1::0;;24677:1:0::1;25629:7;:22:::0;-1:-1:-1;104626:374:0:o;11324:328::-;11504:14;;11622;;-1:-1:-1;;;;;11504:14:0;;;;11439:16;;11639:5;;11609:27;;:10;:27;:::i;:::-;:35;;;;:::i;:::-;11593:51;;11324:328;;;;;:::o;58917:1007::-;59006:7;59042:16;59052:5;59042:9;:16::i;:::-;59034:5;:24;59026:71;;;;-1:-1:-1;;;59026:71:0;;14537:2:1;59026:71:0;;;14519:21:1;14576:2;14556:18;;;14549:30;14615:34;14595:18;;;14588:62;-1:-1:-1;;;14666:18:1;;;14659:32;14708:19;;59026:71:0;14335:398:1;59026:71:0;59108:22;80318:12;;;59108:22;;59371:466;59391:14;59387:1;:18;59371:466;;;59431:31;59465:14;;;:11;:14;;;;;;;;;59431:48;;;;;;;;;-1:-1:-1;;;;;59431:48:0;;;;;-1:-1:-1;;;59431:48:0;;;;;;;;;;;;59502:28;59498:111;;59575:14;;;-1:-1:-1;59498:111:0;59652:5;-1:-1:-1;;;;;59631:26:0;:17;-1:-1:-1;;;;;59631:26:0;;59627:195;;;59701:5;59686:11;:20;59682:85;;;-1:-1:-1;59742:1:0;-1:-1:-1;59735:8:0;;-1:-1:-1;;;59735:8:0;59682:85;59789:13;;;;;59627:195;-1:-1:-1;59407:3:0;;59371:466;;;-1:-1:-1;59860:56:0;;-1:-1:-1;;;59860:56:0;;14940:2:1;59860:56:0;;;14922:21:1;14979:2;14959:18;;;14952:30;15018:34;14998:18;;;14991:62;-1:-1:-1;;;15069:18:1;;;15062:44;15123:19;;59860:56:0;14738:410:1;81200:314:0;81263:13;81297:17;81305:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;81297:17;81289:26;;;;;;81329:29;;;;:19;:29;;;;;;81326:85;;-1:-1:-1;;81377:22:0;;;;;;;;;;;;-1:-1:-1;;;81377:22:0;;;;;81200:314::o;81326:85::-;81460:43;81469:20;81480:8;81469:10;:20::i;:::-;:29;;;:33;;81501:1;81469:33;:::i;81460:43::-;81435:69;;;;;;;;:::i;:::-;;;;;;;;;;;;;81421:85;;81200:314;;;:::o;64553:177::-;64683:39;64700:4;64706:2;64710:7;64683:39;;;;;;;;;;;;:16;:39::i;83948:802::-;84033:15;84061:42;84106:46;84145:6;84106:38;:46::i;:::-;84061:91;;84163:13;84195:9;84191:163;84211:31;84208:1;:34;84191:163;;;84296:1;84266:24;84291:1;84266:27;;;;;;;:::i;:::-;;;;;:31;;;84263:80;;;84317:10;84326:1;84317:10;;:::i;:::-;;;84263:80;84244:3;;;;:::i;:::-;;;;84191:163;;;;84364:44;84424:5;84411:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84364:66;;84449:1;84441:9;;84465;84461:236;84479:31;84476:1;:34;84461:236;;;84564:1;84534:24;84559:1;84534:27;;;;;;;:::i;:::-;;;;;:31;;;84531:155;;;84623:15;84639:1;84623:18;;;;;;;:::i;:::-;;84585:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;84614:5;84585:35;;;;;;;;:::i;:::-;;;;;;;;;;:56;84660:10;84669:1;84660:10;;:::i;:::-;;;84531:155;84512:3;;;;:::i;:::-;;;;84461:236;;;-1:-1:-1;84714:28:0;83948:802;-1:-1:-1;;;;83948:802:0:o;83114:208::-;83174:7;83223:17;83231:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;83223:17;83215:26;;;;;;83259:20;83270:8;83259:10;:20::i;:::-;:27;;;;83114:208;-1:-1:-1;;83114:208:0:o;104263:355::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;24721:1:::1;25317:7;;:19;;25309:63;;;;-1:-1:-1::0;;;25309:63:0::1;;;;;;;:::i;:::-;24721:1;25450:7;:18:::0;104375:10:::2;::::0;:35:::2;::::0;-1:-1:-1;;;104375:35:0;;104404:4:::2;104375:35;::::0;::::2;2084:51:1::0;104350:22:0::2;::::0;-1:-1:-1;;;;;104375:10:0::2;::::0;:20:::2;::::0;2057:18:1;;104375:35:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104429:10;::::0;104461:35:::2;::::0;-1:-1:-1;;;104461:35:0;;104490:4:::2;104461:35;::::0;::::2;2084:51:1::0;104350:60:0;;-1:-1:-1;;;;;;104429:10:0::2;::::0;:19:::2;::::0;104449:10;;104429;;104461:20:::2;::::0;2057:18:1;;104461:35:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104429:68;::::0;-1:-1:-1;;;;;;104429:68:0::2;::::0;;;;;;-1:-1:-1;;;;;4183:32:1;;;104429:68:0::2;::::0;::::2;4165:51:1::0;4232:18;;;4225:34;4138:18;;104429:68:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104421:103;;;::::0;-1:-1:-1;;;104421:103:0;;16550:2:1;104421:103:0::2;::::0;::::2;16532:21:1::0;16589:2;16569:18;;;16562:30;-1:-1:-1;;;16608:18:1;;;16601:52;16670:18;;104421:103:0::2;16348:346:1::0;104421:103:0::2;104540:70;::::0;;104563:1:::2;13714:25:1::0;;13770:2;13755:18;;13748:34;;;-1:-1:-1;;;;;13818:32:1;;13798:18;;;13791:60;104594:15:0::2;13882:2:1::0;13867:18;;13860:34;104540:70:0;;::::2;::::0;;;;13701:3:1;104540:70:0;;::::2;-1:-1:-1::0;;24677:1:0::1;25629:7;:22:::0;104263:355::o;58430:187::-;58497:7;80318:12;;58525:5;:21;58517:69;;;;-1:-1:-1;;;58517:69:0;;17331:2:1;58517:69:0;;;17313:21:1;17370:2;17350:18;;;17343:30;17409:34;17389:18;;;17382:62;-1:-1:-1;;;17460:18:1;;;17453:33;17503:19;;58517:69:0;17129:399:1;58517:69:0;-1:-1:-1;58604:5:0;58430:187::o;106072:100::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;106146:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;106072:100:::0;:::o;61691:124::-;61755:7;61782:20;61794:7;61782:11;:20::i;:::-;:25;;61691:124;-1:-1:-1;;61691:124:0:o;60432:221::-;60496:7;-1:-1:-1;;;;;60524:19:0;;60516:75;;;;-1:-1:-1;;;60516:75:0;;17735:2:1;60516:75:0;;;17717:21:1;17774:2;17754:18;;;17747:30;17813:34;17793:18;;;17786:62;-1:-1:-1;;;17864:18:1;;;17857:41;17915:19;;60516:75:0;17533:407:1;60516:75:0;-1:-1:-1;;;;;;60617:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;60617:27:0;;60432:221::o;82361:275::-;82423:13;82457:17;82465:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;82457:17;82449:26;;;;;;82489:29;;;;:19;:29;;;;;;82486:85;;-1:-1:-1;;82537:22:0;;;;;;;;;;;;-1:-1:-1;;;82537:22:0;;;;;82361:275::o;82486:85::-;82588:9;82598:20;82609:8;82598:10;:20::i;:::-;:29;;;82588:40;;;;;;;:::i;9017:94::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;9082:21:::1;9100:1;9082:9;:21::i;:::-;9017:94::o:0;89884:1118::-;89959:3;89948:8;:14;:52;;;;-1:-1:-1;89966:29:0;;;;:19;:29;;;;;;:34;89948:52;89940:61;;;;;;90039:23;90090:2;90079:8;:13;90075:853;;;-1:-1:-1;90146:1:0;90075:853;;;90189:2;90178:8;:13;90174:754;;;-1:-1:-1;90225:1:0;90174:754;;;90268:3;90257:8;:14;90253:675;;;-1:-1:-1;90305:1:0;90253:675;;;90348:3;90337:8;:14;90333:595;;;-1:-1:-1;90385:1:0;90333:595;;;90428:3;90417:8;:14;90413:515;;;-1:-1:-1;90465:1:0;90413:515;;;90508:3;90497:8;:14;90493:435;;;-1:-1:-1;90545:1:0;90493:435;;;90588:3;90577:8;:14;90573:355;;;-1:-1:-1;90625:1:0;90573:355;;;90668:3;90657:8;:14;90653:275;;;-1:-1:-1;90705:1:0;90653:275;;;90748:3;90737:8;:14;90733:195;;;-1:-1:-1;90785:1:0;90733:195;;;90828:3;90817:8;:14;90813:115;;;-1:-1:-1;90865:1:0;90813:115;90938:56;90968:15;90985:8;90938:29;:56::i;105538:262::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;105629:16:::1;:33:::0;::::1;-1:-1:-1::0;;;105629:33:0;;::::1;;:54;;::::0;::::1;;;;105621:107;;;;-1:-1:-1::0;;;105621:107:0::1;;;;;;;:::i;:::-;105739:16;:53:::0;;;::::1;;-1:-1:-1::0;;;105739:53:0::1;-1:-1:-1::0;;;;105739:53:0;;::::1;::::0;;;::::1;::::0;;105538:262::o;62051:104::-;62107:13;62140:7;62133:14;;;;;:::i;106180:117::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;106258:31:::1;106277:11;106258:18;:31::i;106875:755::-:0;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;106982:19:::1;107004:20;107015:8;107004:10;:20::i;:::-;106982:42;;107043:17;107051:8;65468:4:::0;65502:12;-1:-1:-1;65492:22:0;65411:111;107043:17:::1;:64;;;;-1:-1:-1::0;107064:22:0;;:43;-1:-1:-1;107043:64:0::1;107035:73;;;::::0;::::1;;107401:18;107376:7;:22;;:43;;;::::0;::::1;107462:160;107471:7;:22;;;107495:7;:15;;;107512:7;:24;;;107538:7;:16;;;107556:7;:15;;;107573:7;:16;;;107591:7;:14;;;107607:7;:14;;;107462:8;:160::i;:::-;107430:29;::::0;;;:19:::1;:29;::::0;;;;;:192;;;;-1:-1:-1;;106875:755:0:o;63730:288::-;-1:-1:-1;;;;;63825:24:0;;7320:10;63825:24;;63817:63;;;;-1:-1:-1;;;63817:63:0;;18147:2:1;63817:63:0;;;18129:21:1;18186:2;18166:18;;;18159:30;18225:28;18205:18;;;18198:56;18271:18;;63817:63:0;17945:350:1;63817:63:0;7320:10;63893:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;63893:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;63893:53:0;;;;;;;;;;63962:48;;540:41:1;;;63893:42:0;;7320:10;63962:48;;513:18:1;63962:48:0;;;;;;;63730:288;;:::o;82727:271::-;82787:13;82821:17;82829:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;82821:17;82813:26;;;;;;82853:29;;;;:19;:29;;;;;;82850:85;;-1:-1:-1;;82901:22:0;;;;;;;;;;;;-1:-1:-1;;;82901:22:0;;;;;82727:271::o;82850:85::-;82952:9;82962:20;82973:8;82962:10;:20::i;:::-;:27;;;82952:38;;;;;;;:::i;105142:148::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;105235:17:::1;:47:::0;;-1:-1:-1;;;;;;105235:47:0::1;-1:-1:-1::0;;;;;105235:47:0;;;::::1;::::0;;;::::1;::::0;;105142:148::o;64801:355::-;64960:28;64970:4;64976:2;64980:7;64960:9;:28::i;:::-;65021:48;65044:4;65050:2;65054:7;65063:5;65021:22;:48::i;:::-;64999:149;;;;-1:-1:-1;;;64999:149:0;;;;;;;:::i;:::-;64801:355;;;;:::o;96050:5069::-;96124:13;96158:17;96166:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;96158:17;96150:77;;;;-1:-1:-1;;;96150:77:0;;18922:2:1;96150:77:0;;;18904:21:1;18961:2;18941:18;;;18934:30;19000:34;18980:18;;;18973:62;-1:-1:-1;;;19051:18:1;;;19044:45;19106:19;;96150:77:0;18720:411:1;96150:77:0;96238:19;96260:20;96271:8;96260:10;:20::i;:::-;96238:42;;96293:29;:342;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;96648:19;96963:11;96975:7;:22;;;96963:35;;;;;;;:::i;:::-;;;;;96677:383;;;;;;;;:::i;:::-;;;;;;;;;;;;;96648:413;;97078:20;97139:5;97505:36;97514:7;:22;;;97539:1;97514:26;;;;:::i;97505:36::-;97108:476;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;97108:476:0;;;;;;97600:1603;;;;;;;;;;;;;97108:476;;-1:-1:-1;97600:27:0;;97108:476;;;97600:1603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;97600:1603:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;97600:1603:0;;;;;;;98041:18;98050:8;98041;:18::i;:::-;97998:62;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;;;;;;;;;;;;;-1:-1:-1;;;97600:1603:0;;;;;;;98152:15;98168:7;:22;;;98152:39;;;;;;;:::i;:::-;;98122:71;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98348:30;98357:7;:16;;;98376:1;98357:20;;;;:::i;98348:30::-;98314:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;;;;;;;;;;;;;;;;;;;;;98489:8;98498:7;:15;;;98489:25;;;;;;;:::i;:::-;;98459:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98817:8;98826:7;:15;;;98817:25;;;;;;;:::i;:::-;;98785:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;98892:9;98902:7;:16;;;98892:27;;;;;;;:::i;:::-;;98866:54;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99167:7;99175;:14;;;99167:23;;;;;;;:::i;:::-;;99134:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;99263:26;99359:7;99373:32;99382:7;:22;;;99373:8;:32::i;:::-;99299:162;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;99299:162:0;;;;;;;99475:28;;;;;:25;:28;;;99299:162;;-1:-1:-1;99565:1:0;99475:25;;99604:255;99623:16;99620:1;:19;99604:255;;;99697:11;99710:57;99730:1;99733:8;99743:9;99754;99764:1;99754:12;;;;;;;:::i;:::-;;;;;99710:19;:57::i;:::-;99680:93;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;99680:93:0;;;;;;;;;;-1:-1:-1;99802:10:0;99811:1;99802:8;:10;:::i;:::-;99789:23;;;;:::i;:::-;;;99830:4;99836:1;99830:7;99827:21;;;99841:5;;99827:21;99640:3;;;;:::i;:::-;;;;99604:255;;;;99871:20;100045:19;100054:9;100045:8;:19::i;:::-;99901:364;;;;;;;;:::i;:::-;;;;;;;;;;;;;99871:395;;100281:23;100392:7;100336:115;;;;;;;;:::i;:::-;;;;;;;;;;;;;100317:135;;100465:17;100808:9;100832:12;100859:6;100911:11;100937:6;100492:554;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;100465:582;;101067:44;101082:8;101092:18;101106:3;101092:13;:18::i;:::-;101067:14;:44::i;:::-;101060:51;96050:5069;-1:-1:-1;;;;;;;;;;;;;;;96050:5069:0:o;83576:130::-;83637:17;;:::i;:::-;83667:31;;;;;;;;;;;83674:24;;83667:31;;83674:24;-1:-1:-1;83667:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83576:130;:::o;106572:120::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;106640:16:::1;:44:::0;;-1:-1:-1;;;;;;106640:44:0::1;-1:-1:-1::0;;;;;106640:44:0;;;::::1;::::0;;;::::1;::::0;;106572:120::o;9266:192::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9355:22:0;::::1;9347:73;;;::::0;-1:-1:-1;;;9347:73:0;;31257:2:1;9347:73:0::1;::::0;::::1;31239:21:1::0;31296:2;31276:18;;;31269:30;31335:34;31315:18;;;31308:62;-1:-1:-1;;;31386:18:1;;;31379:36;31432:19;;9347:73:0::1;31055:402:1::0;9347:73:0::1;9431:19;9441:8;9431:9;:19::i;92513:1008::-:0;24721:1;25317:7;;:19;;25309:63;;;;-1:-1:-1;;;25309:63:0;;;;;;;:::i;:::-;24721:1;25450:7;:18;92841:16:::1;:32:::0;-1:-1:-1;;;92841:32:0;::::1;;;:40;;92877:4;92841:40;::::0;:128:::1;;-1:-1:-1::0;92885:17:0::1;::::0;:78:::1;::::0;-1:-1:-1;;;92885:78:0;;-1:-1:-1;;;;;92885:17:0;;::::1;::::0;:31:::1;::::0;:78:::1;::::0;92917:10:::1;::::0;92929:19;;92950:12;;;;92885:78:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:84;;92965:4;92885:84;92841:128;92833:156;;;::::0;-1:-1:-1;;;92833:156:0;;32325:2:1;92833:156:0::1;::::0;::::1;32307:21:1::0;32364:2;32344:18;;;32337:30;-1:-1:-1;;;32383:18:1;;;32376:45;32438:18;;92833:156:0::1;32123:339:1::0;92833:156:0::1;93023:16;:26:::0;::::1;93008:12:::0;-1:-1:-1;;;93023:26:0;;::::1;;;-1:-1:-1::0;93000:51:0::1;;;::::0;::::1;;93089:10;93070:30;::::0;;;:18:::1;:30;::::0;;;;;:35;93062:70:::1;;;::::0;-1:-1:-1;;;93062:70:0;;32669:2:1;93062:70:0::1;::::0;::::1;32651:21:1::0;32708:2;32688:18;;;32681:30;-1:-1:-1;;;32727:18:1;;;32720:52;32789:18;;93062:70:0::1;32467:346:1::0;93062:70:0::1;93164:16;:24:::0;-1:-1:-1;;;;;93164:24:0::1;93151:9;:37;;93143:46;;;::::0;::::1;;93208:16;:33:::0;-1:-1:-1;;;93208:33:0;::::1;;;:39;;93243:4;93208:39;93200:87;;;::::0;-1:-1:-1;;;93200:87:0;;33020:2:1;93200:87:0::1;::::0;::::1;33002:21:1::0;33059:2;33039:18;;;33032:30;33098:34;33078:18;;;33071:62;-1:-1:-1;;;33149:18:1;;;33142:33;33192:19;;93200:87:0::1;32818:399:1::0;93200:87:0::1;93317:10;93298:30;::::0;;;:18:::1;:30;::::0;;;;:35;;93332:1:::1;::::0;93298:30;:35:::1;::::0;93332:1;;93298:35:::1;:::i;:::-;::::0;;;-1:-1:-1;;93379:16:0::1;::::0;;93393:1:::1;93379:16:::0;;;;;::::1;::::0;;;93346:30:::1;::::0;93379:16:::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;93379:16:0::1;93346:49;;93425:14;93406:13;93420:1;93406:16;;;;;;;;:::i;:::-;;;;;;:33;;;::::0;::::1;93450:28;93461:13;93476:1;93450:10;:28::i;:::-;-1:-1:-1::0;;24677:1:0;25629:7;:22;-1:-1:-1;;;92513:1008:0:o;105808:256::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;105897:16:::1;:32:::0;::::1;-1:-1:-1::0;;;105897:32:0;;::::1;;:52;;::::0;::::1;;;;105889:105;;;;-1:-1:-1::0;;;105889:105:0::1;;;;;;;:::i;:::-;106005:16;:51:::0;;;::::1;;-1:-1:-1::0;;;106005:51:0::1;-1:-1:-1::0;;;;106005:51:0;;::::1;::::0;;;::::1;::::0;;105808:256::o;27829:387::-;28152:20;28200:8;;;27829:387::o;70331:196::-;70446:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;70446:29:0;-1:-1:-1;;;;;70446:29:0;;;;;;;;;70491:28;;70446:24;;70491:28;;;;;;;70331:196;;;:::o;79093:131::-;79149:11;;:::i;:::-;79191:24;;;;:19;:24;;;;;;79179:37;;:11;:37::i;107771:721::-;107827:13;108046:10;108042:53;;-1:-1:-1;;108073:10:0;;;;;;;;;;;;-1:-1:-1;;;108073:10:0;;;;;107771:721::o;108042:53::-;108120:5;108105:12;108161:78;108168:9;;108161:78;;108194:8;;;;:::i;:::-;;-1:-1:-1;108217:10:0;;-1:-1:-1;108225:2:0;108217:10;;:::i;:::-;;;108161:78;;;108249:19;108281:6;108271:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;108271:17:0;;108249:39;;108299:154;108306:10;;108299:154;;108333:11;108343:1;108333:11;;:::i;:::-;;-1:-1:-1;108402:10:0;108410:2;108402:5;:10;:::i;:::-;108389:24;;:2;:24;:::i;:::-;108376:39;;108359:6;108366;108359:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;108359:56:0;;;;;;;;-1:-1:-1;108430:11:0;108439:2;108430:11;;:::i;:::-;;;108299:154;;;108477:6;107771:721;-1:-1:-1;;;;107771:721:0:o;68211:2002::-;68326:35;68364:20;68376:7;68364:11;:20::i;:::-;68439:18;;68326:58;;-1:-1:-1;68397:22:0;;-1:-1:-1;;;;;68423:34:0;7320:10;-1:-1:-1;;;;;68423:34:0;;:87;;;-1:-1:-1;7320:10:0;68474:20;68486:7;68474:11;:20::i;:::-;-1:-1:-1;;;;;68474:36:0;;68423:87;:154;;;-1:-1:-1;68544:18:0;;68527:50;;7320:10;64089:164;:::i;68527:50::-;68397:181;;68599:17;68591:80;;;;-1:-1:-1;;;68591:80:0;;33671:2:1;68591:80:0;;;33653:21:1;33710:2;33690:18;;;33683:30;33749:34;33729:18;;;33722:62;-1:-1:-1;;;33800:18:1;;;33793:48;33858:19;;68591:80:0;33469:414:1;68591:80:0;68714:4;-1:-1:-1;;;;;68692:26:0;:13;:18;;;-1:-1:-1;;;;;68692:26:0;;68684:77;;;;-1:-1:-1;;;68684:77:0;;34090:2:1;68684:77:0;;;34072:21:1;34129:2;34109:18;;;34102:30;34168:34;34148:18;;;34141:62;-1:-1:-1;;;34219:18:1;;;34212:36;34265:19;;68684:77:0;33888:402:1;68684:77:0;-1:-1:-1;;;;;68780:16:0;;68772:66;;;;-1:-1:-1;;;68772:66:0;;34497:2:1;68772:66:0;;;34479:21:1;34536:2;34516:18;;;34509:30;34575:34;34555:18;;;34548:62;-1:-1:-1;;;34626:18:1;;;34619:35;34671:19;;68772:66:0;34295:401:1;68772:66:0;68959:49;68976:1;68980:7;68989:13;:18;;;68959:8;:49::i;:::-;-1:-1:-1;;;;;69304:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;69304:31:0;;;-1:-1:-1;;;;;69304:31:0;;;-1:-1:-1;;69304:31:0;;;;;;;69350:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;69350:29:0;;;;;;;;;;;;;69396:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;69441:61:0;;;;-1:-1:-1;;;69486:15:0;69441:61;;;;;;69776:11;;;69806:24;;;;;:29;69776:11;;69806:29;69802:295;;69874:20;69882:11;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;69874:20;69870:212;;;69951:18;;;69919:24;;;:11;:24;;;;;;;;:50;;70034:28;;;;69992:70;;-1:-1:-1;;;69992:70:0;-1:-1:-1;;;;;;69992:70:0;;;-1:-1:-1;;;;;69919:50:0;;;69992:70;;;;;;;69870:212;69279:829;70144:7;70140:2;-1:-1:-1;;;;;70125:27:0;70134:4;-1:-1:-1;;;;;70125:27:0;;;;;;;;;;;70163:42;68315:1898;;68211:2002;;;:::o;84990:1638::-;85075:17;;:::i;:::-;85105:42;;:::i;:::-;85160:16;85216;85273:13;85311:8;85302:6;:17;85299:843;;;85363:2;85352:13;;85566:2;85555:13;;85299:843;;;85607:9;85598:6;:18;85595:547;;;85660:1;85649:12;;85687:1;85676:12;;85595:547;;;85727:9;85718:6;:18;85715:427;;;85781:1;85770:12;;85808:1;85797:12;;85715:427;;;85848:9;85839:6;:18;85836:306;;;85902:1;85891:12;;85929:1;85918:12;;85836:306;;;85969:9;85960:6;:18;85957:185;;;86023:1;86012:12;;86050:1;86039:12;;85957:185;86256:8;86242:249;86271:8;86266:1;:13;86242:249;;86331:1;86303:24;86328:1;86303:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:29;;;86300:180;;;86382:24;86407:1;86382:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;86352:24;86377:1;86352:27;;;;;;;:::i;:::-;:57;;;;:27;;;;;;:57;86437:24;86462:1;86437:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;86428:36;;;;;;;:::i;:::-;;;86300:180;86281:3;;;;:::i;:::-;;;;86242:249;;;;86519:1;86511:5;:9;86503:73;;;;-1:-1:-1;;;86503:73:0;;34903:2:1;86503:73:0;;;34885:21:1;34942:2;34922:18;;;34915:30;34981:34;34961:18;;;34954:62;-1:-1:-1;;;35032:18:1;;;35025:49;35091:19;;86503:73:0;34701:415:1;86503:73:0;-1:-1:-1;86596:24:0;;84990:1638;-1:-1:-1;;;;84990:1638:0:o;61092:537::-;-1:-1:-1;;;;;;;;;;;;;;;;;61195:16:0;61203:7;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;61195:16;61187:71;;;;-1:-1:-1;;;61187:71:0;;35323:2:1;61187:71:0;;;35305:21:1;35362:2;35342:18;;;35335:30;35401:34;35381:18;;;35374:62;-1:-1:-1;;;35452:18:1;;;35445:40;35502:19;;61187:71:0;35121:406:1;61187:71:0;61316:7;61296:245;61363:31;61397:17;;;:11;:17;;;;;;;;;61363:51;;;;;;;;;-1:-1:-1;;;;;61363:51:0;;;;;-1:-1:-1;;;61363:51:0;;;;;;;;;;;;61437:28;61433:93;;61497:9;61092:537;-1:-1:-1;;;61092:537:0:o;61433:93::-;-1:-1:-1;;;61336:6:0;61296:245;;9466:173;9541:6;;;-1:-1:-1;;;;;9558:17:0;;;-1:-1:-1;;;;;;9558:17:0;;;;;;;9591:40;;9541:6;;;9558:17;9541:6;;9591:40;;9522:16;;9591:40;9511:128;9466:173;:::o;87965:1756::-;88065:7;88084:19;;:::i;:::-;88116:33;;:::i;:::-;88283:55;;;88300:15;88283:55;;;;36133:19:1;;;;88317:10:0;36190:2:1;36186:15;-1:-1:-1;;36182:53:1;36168:12;;;36161:75;36252:12;;;;36245:28;;;88283:55:0;;;;;;;;;;36289:12:1;;;;88283:55:0;;;88272:68;;;;;-1:-1:-1;;;88352:427:0;88374:1;88371;:4;88352:427;;;88444:4;88417:23;88432:4;88431:8;;88417:10;:23;:::i;:::-;88416:32;;;;:::i;:::-;88396:52;-1:-1:-1;88471:1:0;;-1:-1:-1;88503:2:0;88487:281;88598:11;88610:1;88598:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;88589:23;;;;;;;:::i;:::-;;;88654:5;88634:17;:25;88631:122;;;88704:1;88683:15;88699:1;88683:18;;;;;;;:::i;:::-;;;;:22;88728:5;;88631:122;88512:3;;;;:::i;:::-;;;;88487:281;;;-1:-1:-1;88377:3:0;;;;:::i;:::-;;;;88352:427;;;-1:-1:-1;88791:40:0;;;88860:18;;;88842:15;;;:36;;;;88916:18;;;88889:24;;;;:45;;;;88964:18;;;88945:16;;;;:37;;;;89011:18;;;88993:15;;;;:36;;;;89059:18;;;89040:16;;;;:37;;;;89105:18;;;89088:14;;;:35;;;89497:8;;89432:11;;:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89400:11;89412:7;:16;;;89400:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89369:11;89381:7;:15;;;89369:28;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89322:11;89334:7;:16;;;89322:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89282:11;89294:7;:24;;;89282:37;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89251:11;89263:7;:15;;;89251:28;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:68;;;;:::i;:::-;:100;;;;:::i;:::-;:146;;;;:::i;:::-;:178;;;;:::i;:::-;:208;;;;:::i;:::-;89235:226;;89242:219;;89235:4;:226;:::i;:::-;89234:238;;89466:5;89234:238;:::i;:::-;89181:22;;89169:11;;:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89161:44;;89155:3;:50;;;;:::i;:::-;89154:63;;89211:5;89154:63;:::i;:::-;:318;;;;:::i;:::-;:339;;89489:4;89154:339;:::i;:::-;:352;;;;:::i;:::-;89136:14;;;:370;;;89560:22;;89584:15;;;;89601:24;;;;89627:16;;;;89645:15;;;;89662:16;;;;89680:14;;;;89551:160;;:8;:160::i;:::-;89519:29;;;;:19;:29;;;;;;:192;;;;-1:-1:-1;87965:1756:0;;;-1:-1:-1;;;;;87965:1756:0:o;10955:148::-;11050:5;11032:14;;:23;;11024:32;;;;;;11067:14;:28;10955:148::o;78096:748::-;78297:7;;78360:15;78386:10;78395:1;78297:7;78386:10;:::i;:::-;;-1:-1:-1;78416:17:0;;;78409:24;78444:10;78453:1;78386:10;78444;:::i;:::-;;-1:-1:-1;78474:26:0;;;78467:33;78511:10;78520:1;78444:10;78511;:::i;:::-;;-1:-1:-1;78541:18:0;;;78534:25;78570:10;78579:1;78511:10;78570;:::i;:::-;;-1:-1:-1;78600:17:0;;;78593:24;78628:10;78637:1;78570:10;78628;:::i;:::-;;-1:-1:-1;78658:18:0;;;78651:25;78687:10;78696:1;78628:10;78687;:::i;:::-;;-1:-1:-1;78717:16:0;;;78710:23;78744:10;78753:1;78687:10;78744;:::i;:::-;;-1:-1:-1;78774:16:0;;;78767:23;78801:12;78810:3;78744:10;78801:12;:::i;:::-;-1:-1:-1;78833:3:0;78096:748;-1:-1:-1;;;;;;;;;;78096:748:0:o;71092:804::-;71247:4;-1:-1:-1;;;;;71268:13:0;;28152:20;28200:8;71264:625;;71304:72;;-1:-1:-1;;;71304:72:0;;-1:-1:-1;;;;;71304:36:0;;;;;:72;;7320:10;;71355:4;;71361:7;;71370:5;;71304:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71304:72:0;;;;;;;;-1:-1:-1;;71304:72:0;;;;;;;;;;;;:::i;:::-;;;71300:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71550:13:0;;71546:273;;71593:61;;-1:-1:-1;;;71593:61:0;;;;;;;:::i;71546:273::-;71769:6;71763:13;71754:6;71750:2;71746:15;71739:38;71300:534;-1:-1:-1;;;;;;71427:55:0;-1:-1:-1;;;71427:55:0;;-1:-1:-1;71420:62:0;;71264:625;-1:-1:-1;71873:4:0;71092:804;;;;;;:::o;95142:900::-;95268:13;95294:17;95385:15;95394:5;95385:8;:15::i;:::-;95477:24;95492:8;:5;95498:2;95492:8;:::i;:::-;95486:14;;:3;:14;:::i;95477:24::-;95547;95562:8;:5;95568:2;95562:8;:::i;95547:24::-;95616:19;95625:9;95616:8;:19::i;:::-;95677:20;95686:10;95677:8;:20::i;:::-;95321:435;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;95294:463;;95798:3;95886:15;95895:5;95886:8;:15::i;:::-;95937:4;95781:231;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;95781:231:0;;;;;;;95142:900;-1:-1:-1;;;;;;95142:900:0:o;101224:462::-;101345:52;;;;;;;;;;;;;;;;;101438:31;;;;;;;;;;-1:-1:-1;;;101438:31:0;;;;101498:29;;101289:13;;-1:-1:-1;;101438:31:0;;101498:29;;101438:31;;101523:3;;101498:29;;:::i;:::-;;;;;;;;;;;;;101484:44;;;;101224:462;;;:::o;101855:2273::-;101975:29;;;;:19;:29;;;;;;101944:13;;101972:130;;102057:7;102040:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;102026:64;;;;101972:130;102114:19;102136:20;102147:8;102136:10;:20::i;:::-;102114:42;;102167:22;102424:7;102439:32;102448:7;:22;;;102439:8;:32::i;:::-;102532:8;102714:15;102730:7;:22;;;102714:39;;;;;;;:::i;:::-;;102199:574;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;102167:607;;102822:8;102900;102909:7;:15;;;102900:25;;;;;;;:::i;:::-;;103082:38;103091:7;:24;;;103118:1;103091:28;;;;:::i;103082:38::-;102805:335;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;102787:354;;103189:8;103327:30;103336:7;:16;;;103355:1;103336:20;;;;:::i;103327:30::-;103436:8;103445:7;:15;;;103436:25;;;;;;;:::i;:::-;;103172:309;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;103154:328;;103532:8;103611:9;103621:7;:16;;;103611:27;;;;;;;:::i;:::-;;103716:7;103724;:14;;;103716:23;;;;;;;:::i;:::-;;103845:24;103854:7;:14;;;103845:8;:24::i;:::-;103515:373;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;103497:392;;103937:8;103920:90;;;;;;;;:::i;:::-;;;;;;;;;;;;;103902:109;;104088:30;104108:8;104088:13;:30::i;:::-;104038:81;;;;;;;;:::i;:::-;;;;;;;;;;;;;104024:96;;;;101855:2273;;;;:::o;91010:1252::-;91110:27;;91148:116;91170:14;:21;91166:1;:25;91148:116;;;91235:14;91250:1;91235:17;;;;;;;;:::i;:::-;;;;;;;91212:40;;;;;:::i;:::-;;-1:-1:-1;91193:3:0;;;;:::i;:::-;;;;91148:116;;;;91301:1;91279:19;:23;:48;;;;-1:-1:-1;8439:6:0;;-1:-1:-1;;;;;8439:6:0;91306:10;:21;;91279:48;91276:295;;;91351:10;;:32;;-1:-1:-1;;;91351:32:0;;91372:10;91351:32;;;2084:51:1;91387:19:0;;-1:-1:-1;;;;;91351:10:0;;:20;;2057:18:1;;91351:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;91343:93;;;;-1:-1:-1;;;91343:93:0;;50633:2:1;91343:93:0;;;50615:21:1;50672:2;50652:18;;;50645:30;50711:27;50691:18;;;50684:55;50756:18;;91343:93:0;50431:349:1;91343:93:0;91459:10;;:71;;-1:-1:-1;;;91459:71:0;;91483:10;91459:71;;;51025:34:1;91503:4:0;51075:18:1;;;51068:43;51127:18;;;51120:34;;;-1:-1:-1;;;;;91459:10:0;;;;:23;;50960:18:1;;91459:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91451:108;;;;-1:-1:-1;;;91451:108:0;;51367:2:1;91451:108:0;;;51349:21:1;51406:2;51386:18;;;51379:30;51445:26;51425:18;;;51418:54;51489:18;;91451:108:0;51165:348:1;91451:108:0;91583:39;;:::i;:::-;91633:25;;91671:533;91689:17;91687:1;:19;91671:533;;;91729:4;91726:240;;91777:57;91816:14;91831:1;91816:17;;;;;;;;:::i;:::-;;;;;;;91777:38;:57::i;:::-;91753:81;;91726:240;;;91932:1;91888:21;91910:17;91888:40;;;;;;;:::i;:::-;;;;:45;;;;;;;:::i;:::-;;;;;-1:-1:-1;91726:240:0;92000:48;92023:21;92046:1;92000:22;:48::i;:::-;91980:68;;92063:66;92093:17;92127:1;92112:12;;:16;;;;:::i;:::-;92063:29;:66::i;:::-;;92191:1;92144:24;92169:17;92144:43;;;;;;;:::i;:::-;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;91707:3;;;;;:::i;:::-;;;;91671:533;;;;92214:40;92224:10;92236:17;92214:9;:40::i;79374:684::-;79435:11;;:::i;:::-;-1:-1:-1;79950:100:0;;;;;;;;79484:23;;;;79950:100;;79562:1;79551:12;;;79537:28;;79748:2;79950:100;;;;;;;79629:2;79618:13;;;79604:29;;79950:100;;;;;;;79689:2;79678:13;;;79664:29;;79950:100;;;;79737:13;;;;79723:29;;79950:100;;;;79808:2;79797:13;;;79783:29;;79950:100;;;;79866:2;79855:13;;;79841:29;;;79950:100;;;;79926:2;79915:13;;;;-1:-1:-1;;;;;79899:31:0;79950:100;;;;;79374:684::o;2535:1912::-;2593:13;2623:4;:11;2638:1;2623:16;2619:31;;;-1:-1:-1;;2641:9:0;;;;;;;;;-1:-1:-1;2641:9:0;;;2535:1912::o;2619:31::-;2702:19;2724:12;;;;;;;;;;;;;;;;;2702:34;;2788:18;2834:1;2815:4;:11;2829:1;2815:15;;;;:::i;:::-;2814:21;;;;:::i;:::-;2809:27;;:1;:27;:::i;:::-;2788:48;-1:-1:-1;2919:20:0;2953:15;2788:48;2966:2;2953:15;:::i;:::-;2942:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2942:27:0;;2919:50;;3066:10;3058:6;3051:26;3161:1;3154:5;3150:13;3220:4;3271;3265:11;3256:7;3252:25;3367:2;3359:6;3355:15;3440:754;3459:6;3450:7;3447:19;3440:754;;;3559:1;3550:7;3546:15;3535:26;;3598:7;3592:14;3724:4;3716:5;3712:2;3708:14;3704:25;3694:8;3690:40;3684:47;3673:9;3665:67;3778:1;3767:9;3763:17;3750:30;;3857:4;3849:5;3845:2;3841:14;3837:25;3827:8;3823:40;3817:47;3806:9;3798:67;3911:1;3900:9;3896:17;3883:30;;3990:4;3982:5;3979:1;3974:14;3970:25;3960:8;3956:40;3950:47;3939:9;3931:67;4044:1;4033:9;4029:17;4016:30;;4123:4;4115:5;4103:25;4093:8;4089:40;4083:47;4072:9;4064:67;-1:-1:-1;4177:1:0;4162:17;3440:754;;;4267:1;4260:4;4254:11;4250:19;4288:1;4283:54;;;;4356:1;4351:52;;;;4243:160;;4283:54;-1:-1:-1;;;;;4299:17:0;;4292:43;4283:54;;4351:52;-1:-1:-1;;;;;4367:17:0;;4360:41;4243:160;-1:-1:-1;4433:6:0;;2535:1912;-1:-1:-1;;;;;;;;2535:1912:0:o;87007:777::-;87112:7;;;;87191:102;87211:22;87207:1;:26;87191:102;;;87263:15;87279:1;87263:18;;;;;;;:::i;:::-;;;;;87254:27;;;;;;:::i;:::-;;-1:-1:-1;87235:3:0;;;;:::i;:::-;;;;87191:102;;;-1:-1:-1;87311:8:0;87303:39;;;;-1:-1:-1;;;87303:39:0;;51942:2:1;87303:39:0;;;51924:21:1;51981:2;51961:18;;;51954:30;-1:-1:-1;;;52000:18:1;;;51993:48;52058:18;;87303:39:0;51740:342:1;87303:39:0;87355:23;87399:16;87417:15;87434:10;87446:12;;87460:15;87476:1;87460:18;;;;;;;:::i;:::-;;;;;87480:22;87504:6;87382:129;;;;;;;;;;;;;52382:19:1;;;52426:2;52417:12;;52410:28;;;;52476:2;52472:15;;;;-1:-1:-1;;52468:53:1;52463:2;52454:12;;52447:75;52547:2;52538:12;;52531:28;;;;52616:3;52594:16;-1:-1:-1;;;;;;52590:38:1;52584:3;52575:13;;52568:61;52654:3;52645:13;;52638:29;52692:3;52683:13;;52676:29;52730:3;52721:13;;52087:653;87382:129:0;;;;;;;;;;;;;87355:157;;87523:18;87577:5;87562:10;87552:21;;;;;;87544:30;;:38;;;;:::i;:::-;87523:59;;87599:9;87595:182;87614:22;87611:1;:25;87595:182;;;87667:15;87683:1;87667:18;;;;;;;:::i;:::-;;;;;87657:28;;;;;;:::i;:::-;;;87716:6;87703:10;:19;87700:66;;;87749:1;-1:-1:-1;87742:8:0;;-1:-1:-1;;;;87742:8:0;87700:66;87638:3;;;;:::i;:::-;;;;87595:182;;;;87121:663;;;;87007:777;;;;:::o;65530:104::-;65599:27;65609:2;65613:8;65599:27;;;;;;;;;;;;66120:32;66126:2;66130:8;66140:5;66147:4;66558:20;66581:12;-1:-1:-1;;;;;66612:16:0;;66604:62;;;;-1:-1:-1;;;66604:62:0;;52947:2:1;66604:62:0;;;52929:21:1;52986:2;52966:18;;;52959:30;53025:34;53005:18;;;52998:62;-1:-1:-1;;;53076:18:1;;;53069:31;53117:19;;66604:62:0;52745:397:1;66604:62:0;66685:13;66677:66;;;;-1:-1:-1;;;66677:66:0;;53349:2:1;66677:66:0;;;53331:21:1;53388:2;53368:18;;;53361:30;53427:34;53407:18;;;53400:62;-1:-1:-1;;;53478:18:1;;;53471:38;53526:19;;66677:66:0;53147:404:1;66677:66:0;-1:-1:-1;;;;;67095:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;67095:45:0;;-1:-1:-1;;;;;67095:45:0;;;;;;;;;;67155:50;;;;;;;;;;;;;;67222:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;67272:66:0;;;;-1:-1:-1;;;67322:15:0;67272:66;;;;;;;67222:25;;67407:415;67427:8;67423:1;:12;67407:415;;;67466:38;;67491:12;;-1:-1:-1;;;;;67466:38:0;;;67483:1;;67466:38;;67483:1;;67466:38;67527:4;67523:249;;;67590:59;67621:1;67625:2;67629:12;67643:5;67590:22;:59::i;:::-;67556:196;;;;-1:-1:-1;;;67556:196:0;;;;;;;:::i;:::-;67792:14;;;;;67437:3;67407:415;;;-1:-1:-1;67838:12:0;:27;67889:60;64801:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:131::-;-1:-1:-1;;;;;667:31:1;;657:42;;647:70;;713:1;710;703:12;728:247;787:6;840:2;828:9;819:7;815:23;811:32;808:52;;;856:1;853;846:12;808:52;895:9;882:23;914:31;939:5;914:31;:::i;980:258::-;1052:1;1062:113;1076:6;1073:1;1070:13;1062:113;;;1152:11;;;1146:18;1133:11;;;1126:39;1098:2;1091:10;1062:113;;;1193:6;1190:1;1187:13;1184:48;;;-1:-1:-1;;1228:1:1;1210:16;;1203:27;980:258::o;1243:269::-;1296:3;1334:5;1328:12;1361:6;1356:3;1349:19;1377:63;1433:6;1426:4;1421:3;1417:14;1410:4;1403:5;1399:16;1377:63;:::i;:::-;1494:2;1473:15;-1:-1:-1;;1469:29:1;1460:39;;;;1501:4;1456:50;;1243:269;-1:-1:-1;;1243:269:1:o;1517:231::-;1666:2;1655:9;1648:21;1629:4;1686:56;1738:2;1727:9;1723:18;1715:6;1686:56;:::i;1753:180::-;1812:6;1865:2;1853:9;1844:7;1840:23;1836:32;1833:52;;;1881:1;1878;1871:12;1833:52;-1:-1:-1;1904:23:1;;1753:180;-1:-1:-1;1753:180:1:o;2146:315::-;2214:6;2222;2275:2;2263:9;2254:7;2250:23;2246:32;2243:52;;;2291:1;2288;2281:12;2243:52;2330:9;2317:23;2349:31;2374:5;2349:31;:::i;:::-;2399:5;2451:2;2436:18;;;;2423:32;;-1:-1:-1;;;2146:315:1:o;2648:456::-;2725:6;2733;2741;2794:2;2782:9;2773:7;2769:23;2765:32;2762:52;;;2810:1;2807;2800:12;2762:52;2849:9;2836:23;2868:31;2893:5;2868:31;:::i;:::-;2918:5;-1:-1:-1;2975:2:1;2960:18;;2947:32;2988:33;2947:32;2988:33;:::i;:::-;2648:456;;3040:7;;-1:-1:-1;;;3094:2:1;3079:18;;;;3066:32;;2648:456::o;3109:118::-;3195:5;3188:13;3181:21;3174:5;3171:32;3161:60;;3217:1;3214;3207:12;3232:241;3288:6;3341:2;3329:9;3320:7;3316:23;3312:32;3309:52;;;3357:1;3354;3347:12;3309:52;3396:9;3383:23;3415:28;3437:5;3415:28;:::i;3738:248::-;3806:6;3814;3867:2;3855:9;3846:7;3842:23;3838:32;3835:52;;;3883:1;3880;3873:12;3835:52;-1:-1:-1;;3906:23:1;;;3976:2;3961:18;;;3948:32;;-1:-1:-1;3738:248:1:o;4270:814::-;4432:4;4461:2;4501;4490:9;4486:18;4531:2;4520:9;4513:21;4554:6;4589;4583:13;4620:6;4612;4605:22;4658:2;4647:9;4643:18;4636:25;;4720:2;4710:6;4707:1;4703:14;4692:9;4688:30;4684:39;4670:53;;4758:2;4750:6;4746:15;4779:1;4789:266;4803:6;4800:1;4797:13;4789:266;;;4896:2;4892:7;4880:9;4872:6;4868:22;4864:36;4859:3;4852:49;4924:51;4968:6;4959;4953:13;4924:51;:::i;:::-;4914:61;-1:-1:-1;5033:12:1;;;;4998:15;;;;4825:1;4818:9;4789:266;;;-1:-1:-1;5072:6:1;;4270:814;-1:-1:-1;;;;;;;4270:814:1:o;5089:127::-;5150:10;5145:3;5141:20;5138:1;5131:31;5181:4;5178:1;5171:15;5205:4;5202:1;5195:15;5221:632;5286:5;5316:18;5357:2;5349:6;5346:14;5343:40;;;5363:18;;:::i;:::-;5438:2;5432:9;5406:2;5492:15;;-1:-1:-1;;5488:24:1;;;5514:2;5484:33;5480:42;5468:55;;;5538:18;;;5558:22;;;5535:46;5532:72;;;5584:18;;:::i;:::-;5624:10;5620:2;5613:22;5653:6;5644:15;;5683:6;5675;5668:22;5723:3;5714:6;5709:3;5705:16;5702:25;5699:45;;;5740:1;5737;5730:12;5699:45;5790:6;5785:3;5778:4;5770:6;5766:17;5753:44;5845:1;5838:4;5829:6;5821;5817:19;5813:30;5806:41;;;;5221:632;;;;;:::o;5858:451::-;5927:6;5980:2;5968:9;5959:7;5955:23;5951:32;5948:52;;;5996:1;5993;5986:12;5948:52;6036:9;6023:23;6069:18;6061:6;6058:30;6055:50;;;6101:1;6098;6091:12;6055:50;6124:22;;6177:4;6169:13;;6165:27;-1:-1:-1;6155:55:1;;6206:1;6203;6196:12;6155:55;6229:74;6295:7;6290:2;6277:16;6272:2;6268;6264:11;6229:74;:::i;6314:382::-;6379:6;6387;6440:2;6428:9;6419:7;6415:23;6411:32;6408:52;;;6456:1;6453;6446:12;6408:52;6495:9;6482:23;6514:31;6539:5;6514:31;:::i;:::-;6564:5;-1:-1:-1;6621:2:1;6606:18;;6593:32;6634:30;6593:32;6634:30;:::i;:::-;6683:7;6673:17;;;6314:382;;;;;:::o;6701:795::-;6796:6;6804;6812;6820;6873:3;6861:9;6852:7;6848:23;6844:33;6841:53;;;6890:1;6887;6880:12;6841:53;6929:9;6916:23;6948:31;6973:5;6948:31;:::i;:::-;6998:5;-1:-1:-1;7055:2:1;7040:18;;7027:32;7068:33;7027:32;7068:33;:::i;:::-;7120:7;-1:-1:-1;7174:2:1;7159:18;;7146:32;;-1:-1:-1;7229:2:1;7214:18;;7201:32;7256:18;7245:30;;7242:50;;;7288:1;7285;7278:12;7242:50;7311:22;;7364:4;7356:13;;7352:27;-1:-1:-1;7342:55:1;;7393:1;7390;7383:12;7342:55;7416:74;7482:7;7477:2;7464:16;7459:2;7455;7451:11;7416:74;:::i;:::-;7406:84;;;6701:795;;;;;;;:::o;8036:388::-;8104:6;8112;8165:2;8153:9;8144:7;8140:23;8136:32;8133:52;;;8181:1;8178;8171:12;8133:52;8220:9;8207:23;8239:31;8264:5;8239:31;:::i;:::-;8289:5;-1:-1:-1;8346:2:1;8331:18;;8318:32;8359:33;8318:32;8359:33;:::i;8429:508::-;8609:3;8594:19;;8598:9;8690:6;8567:4;8724:207;8738:4;8735:1;8732:11;8724:207;;;8801:13;;8816:6;8797:26;8785:39;;8847:4;8871:12;;;;8906:15;;;;8758:1;8751:9;8724:207;;;8728:3;;;8429:508;;;;:::o;8942:751::-;9046:6;9054;9062;9070;9123:2;9111:9;9102:7;9098:23;9094:32;9091:52;;;9139:1;9136;9129:12;9091:52;9175:9;9162:23;9152:33;;9236:2;9225:9;9221:18;9208:32;9259:18;9300:2;9292:6;9289:14;9286:34;;;9316:1;9313;9306:12;9286:34;9354:6;9343:9;9339:22;9329:32;;9399:7;9392:4;9388:2;9384:13;9380:27;9370:55;;9421:1;9418;9411:12;9370:55;9461:2;9448:16;9487:2;9479:6;9476:14;9473:34;;;9503:1;9500;9493:12;9473:34;9556:7;9551:2;9541:6;9538:1;9534:14;9530:2;9526:23;9522:32;9519:45;9516:65;;;9577:1;9574;9567:12;9516:65;8942:751;;9608:2;9600:11;;;;;-1:-1:-1;9630:6:1;;9683:2;9668:18;9655:32;;-1:-1:-1;8942:751:1;-1:-1:-1;;;8942:751:1:o;9698:356::-;9900:2;9882:21;;;9919:18;;;9912:30;9978:34;9973:2;9958:18;;9951:62;10045:2;10030:18;;9698:356::o;10059:380::-;10138:1;10134:12;;;;10181;;;10202:61;;10256:4;10248:6;10244:17;10234:27;;10202:61;10309:2;10301:6;10298:14;10278:18;10275:38;10272:161;;;10355:10;10350:3;10346:20;10343:1;10336:31;10390:4;10387:1;10380:15;10418:4;10415:1;10408:15;10272:161;;10059:380;;;:::o;11687:127::-;11748:10;11743:3;11739:20;11736:1;11729:31;11779:4;11776:1;11769:15;11803:4;11800:1;11793:15;11819:127;11880:10;11875:3;11871:20;11868:1;11861:31;11911:4;11908:1;11901:15;11935:4;11932:1;11925:15;11951:128;11991:3;12022:1;12018:6;12015:1;12012:13;12009:39;;;12028:18;;:::i;:::-;-1:-1:-1;12064:9:1;;11951:128::o;12084:404::-;12286:2;12268:21;;;12325:2;12305:18;;;12298:30;12364:34;12359:2;12344:18;;12337:62;-1:-1:-1;;;12430:2:1;12415:18;;12408:38;12478:3;12463:19;;12084:404::o;12493:355::-;12695:2;12677:21;;;12734:2;12714:18;;;12707:30;12773:33;12768:2;12753:18;;12746:61;12839:2;12824:18;;12493:355::o;13905:168::-;13945:7;14011:1;14007;14003:6;13999:14;13996:1;13993:21;13988:1;13981:9;13974:17;13970:45;13967:71;;;14018:18;;:::i;:::-;-1:-1:-1;14058:9:1;;13905:168::o;14078:127::-;14139:10;14134:3;14130:20;14127:1;14120:31;14170:4;14167:1;14160:15;14194:4;14191:1;14184:15;14210:120;14250:1;14276;14266:35;;14281:18;;:::i;:::-;-1:-1:-1;14315:9:1;;14210:120::o;15153:185::-;15195:3;15233:5;15227:12;15248:52;15293:6;15288:3;15281:4;15274:5;15270:16;15248:52;:::i;:::-;15316:16;;;;;15153:185;-1:-1:-1;;15153:185:1:o;15343:421::-;-1:-1:-1;;;15600:3:1;15593:19;15575:3;15641:6;15635:13;15657:61;15711:6;15707:1;15702:3;15698:11;15691:4;15683:6;15679:17;15657:61;:::i;:::-;15738:16;;;;15756:1;15734:24;;15343:421;-1:-1:-1;;15343:421:1:o;15769:135::-;15808:3;-1:-1:-1;;15829:17:1;;15826:43;;;15849:18;;:::i;:::-;-1:-1:-1;15896:1:1;15885:13;;15769:135::o;15909:184::-;15979:6;16032:2;16020:9;16011:7;16007:23;16003:32;16000:52;;;16048:1;16045;16038:12;16000:52;-1:-1:-1;16071:16:1;;15909:184;-1:-1:-1;15909:184:1:o;16098:245::-;16165:6;16218:2;16206:9;16197:7;16193:23;16189:32;16186:52;;;16234:1;16231;16224:12;16186:52;16266:9;16260:16;16285:28;16307:5;16285:28;:::i;18300:415::-;18502:2;18484:21;;;18541:2;18521:18;;;18514:30;18580:34;18575:2;18560:18;;18553:62;-1:-1:-1;;;18646:2:1;18631:18;;18624:49;18705:3;18690:19;;18300:415::o;19136:1564::-;-1:-1:-1;;;20100:3:1;20093:26;20149:34;20144:2;20139:3;20135:12;20128:56;20214:32;20209:2;20204:3;20200:12;20193:54;-1:-1:-1;;;20272:2:1;20267:3;20263:12;20256:31;20317:34;20312:2;20307:3;20303:12;20296:56;-1:-1:-1;;;20377:3:1;20372;20368:13;20361:40;-1:-1:-1;;;20426:3:1;20421;20417:13;20410:34;20075:3;20473:6;20467:13;20489:61;20543:6;20537:3;20532;20528:13;20523:2;20515:6;20511:15;20489:61;:::i;:::-;-1:-1:-1;;;20609:3:1;20569:16;;;;20601:12;;;20594:27;-1:-1:-1;;;;20645:3:1;20637:12;;20630:36;20690:3;20682:12;;19136:1564;-1:-1:-1;19136:1564:1:o;20839:1459::-;21422:3;21460:6;21454:13;21476:53;21522:6;21517:3;21510:4;21502:6;21498:17;21476:53;:::i;:::-;21560:6;21555:3;21551:16;21538:29;;21586:34;21643:2;21636:5;21629:17;21680:34;21673:4;21666:5;21662:16;21655:60;21747:34;21742:2;21735:5;21731:14;21724:58;-1:-1:-1;;;21809:2:1;21802:5;21798:14;21791:29;21852:2;21847;21840:5;21836:14;21829:26;21888:34;21882:3;21875:5;21871:15;21864:59;21956:34;21950:3;21943:5;21939:15;21932:59;-1:-1:-1;;;22018:3:1;22011:5;22007:15;22000:45;22078:2;22072:3;22065:5;22061:15;22054:27;;22114:34;22108:3;22101:5;22097:15;22090:59;-1:-1:-1;;;22176:3:1;22169:5;22165:15;22158:45;22219:73;22249:42;22286:3;22279:5;22275:15;22267:6;22249:42;:::i;:::-;-1:-1:-1;;;20770:30:1;;20825:2;20816:12;;20705:129;22219:73;22212:80;20839:1459;-1:-1:-1;;;;;20839:1459:1:o;22303:441::-;-1:-1:-1;;;22560:3:1;22553:37;22535:3;22619:6;22613:13;22635:62;22690:6;22685:2;22680:3;22676:12;22669:4;22661:6;22657:17;22635:62;:::i;:::-;22717:16;;;;22735:2;22713:25;;22303:441;-1:-1:-1;;22303:441:1:o;22875:973::-;22960:12;;22925:3;;23015:1;23035:18;;;;23088;;;;23115:61;;23169:4;23161:6;23157:17;23147:27;;23115:61;23195:2;23243;23235:6;23232:14;23212:18;23209:38;23206:161;;;23289:10;23284:3;23280:20;23277:1;23270:31;23324:4;23321:1;23314:15;23352:4;23349:1;23342:15;23206:161;23383:18;23410:104;;;;23528:1;23523:319;;;;23376:466;;23410:104;-1:-1:-1;;23443:24:1;;23431:37;;23488:16;;;;-1:-1:-1;23410:104:1;;23523:319;22822:1;22815:14;;;22859:4;22846:18;;23617:1;23631:165;23645:6;23642:1;23639:13;23631:165;;;23723:14;;23710:11;;;23703:35;23766:16;;;;23660:10;;23631:165;;;23635:3;;23825:6;23820:3;23816:16;23809:23;;23376:466;;;;;;;22875:973;;;;:::o;23853:339::-;-1:-1:-1;;;24107:3:1;24100:24;24082:3;24140:46;24183:1;24178:3;24174:11;24166:6;24140:46;:::i;24197:432::-;-1:-1:-1;;;24454:3:1;24447:28;24429:3;24504:6;24498:13;24520:62;24575:6;24570:2;24565:3;24561:12;24554:4;24546:6;24542:17;24520:62;:::i;:::-;24602:16;;;;24620:2;24598:25;;24197:432;-1:-1:-1;;24197:432:1:o;24634:342::-;-1:-1:-1;;;24888:3:1;24881:26;24863:3;24923:47;24966:2;24961:3;24957:12;24949:6;24923:47;:::i;24981:335::-;-1:-1:-1;;;25235:3:1;25228:20;25210:3;25264:46;25307:1;25302:3;25298:11;25290:6;25264:46;:::i;25321:343::-;-1:-1:-1;;;25575:3:1;25568:27;25550:3;25611:47;25654:2;25649:3;25645:12;25637:6;25611:47;:::i;25669:893::-;-1:-1:-1;;;26173:3:1;26166:36;26148:3;26221:47;26264:2;26259:3;26255:12;26247:6;26221:47;:::i;:::-;-1:-1:-1;;;26284:2:1;26277:15;26321:6;26315:13;26337:60;26390:6;26386:1;26382:2;26378:10;26371:4;26363:6;26359:17;26337:60;:::i;:::-;26459:34;26455:1;26416:15;;;;26447:10;;;26440:54;-1:-1:-1;;;26518:2:1;26510:11;;26503:26;26553:2;26545:11;;25669:893;-1:-1:-1;;;;25669:893:1:o;26567:633::-;26847:3;26885:6;26879:13;26901:53;26947:6;26942:3;26935:4;26927:6;26923:17;26901:53;:::i;:::-;27017:13;;26976:16;;;;27039:57;27017:13;26976:16;27073:4;27061:17;;27039:57;:::i;:::-;-1:-1:-1;;;27118:20:1;;27147:18;;;27192:1;27181:13;;26567:633;-1:-1:-1;;;;26567:633:1:o;27355:1216::-;27819:34;27814:3;27807:47;27884:34;27879:2;27874:3;27870:12;27863:56;27949:34;27944:2;27939:3;27935:12;27928:56;-1:-1:-1;;;28009:2:1;28004:3;28000:12;27993:37;27789:3;28059:6;28053:13;28075:61;28129:6;28123:3;28118;28114:13;28109:2;28101:6;28097:15;28075:61;:::i;:::-;28201:33;28195:3;28155:16;;;;28187:12;;;28180:55;-1:-1:-1;28265:34:1;28259:3;28251:12;;28244:56;28330:34;28324:3;28316:12;;28309:56;28395:34;28389:3;28381:12;;28374:56;28460:34;28454:3;28446:12;;28439:56;-1:-1:-1;;;28519:3:1;28511:12;;28504:33;28561:3;28553:12;;27355:1216;-1:-1:-1;27355:1216:1:o;28576:575::-;-1:-1:-1;;;28931:3:1;28924:36;28906:3;28979:47;29022:2;29017:3;29013:12;29005:6;28979:47;:::i;:::-;29046:34;29035:46;;-1:-1:-1;;;29105:2:1;29097:11;;29090:28;29142:2;29134:11;;28576:575;-1:-1:-1;;;28576:575:1:o;29416:1634::-;30072:34;30067:3;30060:47;30137:34;30132:2;30127:3;30123:12;30116:56;30202:34;30197:2;30192:3;30188:12;30181:56;30267:34;30262:2;30257:3;30253:12;30246:56;30333:34;30327:3;30322;30318:13;30311:57;30399:34;30393:3;30388;30384:13;30377:57;-1:-1:-1;;;30459:3:1;30454;30450:13;30443:47;30042:3;30519:6;30513:13;30535:61;30589:6;30583:3;30578;30574:13;30569:2;30561:6;30557:15;30535:61;:::i;:::-;30656:13;;30615:16;;;;30678:62;30656:13;30725:3;30717:12;;30712:2;30700:15;;30678:62;:::i;:::-;30801:13;;30759:17;;;30823:62;30801:13;30870:3;30862:12;;30857:2;30845:15;;30823:62;:::i;:::-;30901:143;30931:112;30961:81;30987:54;31036:3;31025:8;31021:2;31017:17;31013:27;31005:6;30987:54;:::i;:::-;30979:6;30961:81;:::i;:::-;-1:-1:-1;;;29221:27:1;;29273:2;29264:12;;29156:126;30931:112;-1:-1:-1;;;29352:25:1;;29402:2;29393:12;;29287:124;30901:143;30894:150;29416:1634;-1:-1:-1;;;;;;;;;29416:1634:1:o;31462:656::-;-1:-1:-1;;;;;31707:32:1;;31689:51;;31771:2;31756:18;;31749:34;;;31819:2;31814;31799:18;;31792:30;;;31838:18;;31831:34;;;-1:-1:-1;;;;;;31877:31:1;;31874:51;;;31921:1;31918;31911:12;31874:51;31955:6;31952:1;31948:14;32013:6;32005;31999:3;31988:9;31984:19;31971:49;32091:1;32043:22;;32067:3;32039:32;32080:13;;;-1:-1:-1;32039:32:1;31462:656;-1:-1:-1;;;;31462:656:1:o;33222:125::-;33262:4;33290:1;33287;33284:8;33281:34;;;33295:18;;:::i;:::-;-1:-1:-1;33332:9:1;;33222:125::o;33352:112::-;33384:1;33410;33400:35;;33415:18;;:::i;:::-;-1:-1:-1;33449:9:1;;33352:112::o;36312:136::-;36351:3;36379:5;36369:39;;36388:18;;:::i;:::-;-1:-1:-1;;;36424:18:1;;36312:136::o;36453:224::-;36492:3;36520:6;36553:2;36550:1;36546:10;36583:2;36580:1;36576:10;36614:3;36610:2;36606:12;36601:3;36598:21;36595:47;;;36622:18;;:::i;:::-;36658:13;;36453:224;-1:-1:-1;;;;36453:224:1:o;36682:500::-;-1:-1:-1;;;;;36951:15:1;;;36933:34;;37003:15;;36998:2;36983:18;;36976:43;37050:2;37035:18;;37028:34;;;37098:3;37093:2;37078:18;;37071:31;;;36876:4;;37119:57;;37156:19;;37148:6;37119:57;:::i;:::-;37111:65;36682:500;-1:-1:-1;;;;;;36682:500:1:o;37187:249::-;37256:6;37309:2;37297:9;37288:7;37284:23;37280:32;37277:52;;;37325:1;37322;37315:12;37277:52;37357:9;37351:16;37376:30;37400:5;37376:30;:::i;37441:1891::-;-1:-1:-1;;;38395:3:1;38388:31;38370:3;38448:6;38442:13;38464:62;38519:6;38514:2;38509:3;38505:12;38498:4;38490:6;38486:17;38464:62;:::i;:::-;38590:34;38585:2;38545:16;;;38577:11;;;38570:55;-1:-1:-1;;;38649:2:1;38641:11;;38634:36;38695:13;;38717:63;38695:13;38766:2;38758:11;;38751:4;38739:17;;38717:63;:::i;:::-;-1:-1:-1;;;38840:2:1;38799:17;;;;38832:11;;;38825:37;38887:13;;38909:63;38887:13;38958:2;38950:11;;38943:4;38931:17;;38909:63;:::i;:::-;-1:-1:-1;;;39032:2:1;38991:17;;;;39024:11;;;39017:36;39078:13;;39100:63;39078:13;39149:2;39141:11;;39134:4;39122:17;;39100:63;:::i;:::-;-1:-1:-1;;;39223:2:1;39182:17;;;;39215:11;;;39208:33;39257:69;39287:38;39321:2;39313:11;;39305:6;39287:38;:::i;:::-;27282:33;27270:46;;27341:2;27332:12;;27205:145;39257:69;39250:76;37441:1891;-1:-1:-1;;;;;;;;37441:1891:1:o;39337:1349::-;39968:3;40006:6;40000:13;40022:53;40068:6;40063:3;40056:4;40048:6;40044:17;40022:53;:::i;:::-;40106:6;40101:3;40097:16;40084:29;;40136:34;40129:5;40122:49;-1:-1:-1;;;40198:4:1;40191:5;40187:16;40180:49;40260:6;40254:13;40276:66;40333:8;40328:2;40321:5;40317:14;40310:4;40302:6;40298:17;40276:66;:::i;:::-;-1:-1:-1;;;40405:2:1;40361:20;;;;40397:11;;;40390:27;40442:13;;40464:63;40442:13;40513:2;40505:11;;40498:4;40486:17;;40464:63;:::i;:::-;-1:-1:-1;;;40587:2:1;40546:17;;;;40579:11;;;40572:38;-1:-1:-1;;;40634:2:1;40626:11;;40619:34;40677:2;40669:11;;39337:1349;-1:-1:-1;;;;;39337:1349:1:o;40691:470::-;40870:3;40908:6;40902:13;40924:53;40970:6;40965:3;40958:4;40950:6;40946:17;40924:53;:::i;:::-;41040:13;;40999:16;;;;41062:57;41040:13;40999:16;41096:4;41084:17;;41062:57;:::i;41166:370::-;41395:3;41423:38;41457:3;41449:6;41423:38;:::i;:::-;-1:-1:-1;;;41470:33:1;;41527:2;41519:11;;41166:370;-1:-1:-1;;;41166:370:1:o;42265:2367::-;43574:66;43562:79;;43671:66;43666:2;43657:12;;43650:88;43768:66;43763:2;43754:12;;43747:88;-1:-1:-1;;;43860:2:1;43851:12;;43844:54;-1:-1:-1;;;43923:3:1;43914:13;;43907:59;-1:-1:-1;43985:48:1;44028:3;44019:13;;44011:6;43985:48;:::i;:::-;-1:-1:-1;;;44049:2:1;44042:16;44087:6;44081:13;44103:58;44154:6;44150:1;44146:2;44142:10;44137:2;44129:6;44125:15;44103:58;:::i;:::-;-1:-1:-1;;;44219:1:1;44180:15;;;;44211:10;;;44204:42;-1:-1:-1;;;44270:1:1;44262:10;;44255:62;44342:13;;44364:61;44342:13;44411:2;44403:11;;44398:2;44386:15;;44364:61;:::i;:::-;44441:185;44471:154;44505:119;44535:88;44565:57;44618:2;44607:8;44603:2;44599:17;44595:26;-1:-1:-1;;;41606:25:1;;41656:1;41647:11;;41541:123;44565:57;41746:66;41734:79;;41838:2;41829:12;;41669:178;44535:88;41929:66;41917:79;;42026:66;42021:2;42012:12;;42005:88;42118:2;42109:12;;41852:275;44505:119;44497:6;44471:154;:::i;:::-;-1:-1:-1;;;42197:30:1;;42252:1;42243:11;;42132:128;44637:1429;45265:3;45303:6;45297:13;45319:53;45365:6;45360:3;45353:4;45345:6;45341:17;45319:53;:::i;:::-;45433:66;45394:16;;;45419:81;;;-1:-1:-1;;;45527:4:1;45516:16;;45509:50;45578:49;45623:2;45612:14;;45604:6;45578:49;:::i;:::-;-1:-1:-1;;;45672:14:1;;;45714:66;45710:1;45702:10;;45695:86;-1:-1:-1;;;45805:2:1;45797:11;;45790:65;45880:13;;45568:59;;-1:-1:-1;45646:17:1;45902:63;45880:13;45951:2;45943:11;;45936:4;45924:17;;45902:63;:::i;:::-;46025:2;45984:17;;46017:11;;;46010:23;46057:2;46049:11;;44637:1429;-1:-1:-1;;;;;44637:1429:1:o;46071:1426::-;46699:3;46737:6;46731:13;46753:53;46799:6;46794:3;46787:4;46779:6;46775:17;46753:53;:::i;:::-;46837:6;46832:3;46828:16;46815:29;;46867:66;46860:5;46853:81;46977:28;46972:3;46968:38;46961:4;46954:5;46950:16;46943:64;47038:6;47032:13;47054:66;47111:8;47106:2;47099:5;47095:14;47088:4;47080:6;47076:17;47054:66;:::i;:::-;-1:-1:-1;;;47139:20:1;;47219:2;47211:11;;47204:23;;;47256:66;47251:2;47243:11;;47236:87;-1:-1:-1;;;47347:2:1;47339:11;;47332:45;47139:20;47396:46;47438:2;47430:11;;47422:6;47396:46;:::i;:::-;47451:14;;;47489:1;47481:10;;46071:1426;-1:-1:-1;;;;;;46071:1426:1:o;47502:1891::-;48377:3;48415:6;48409:13;48431:53;48477:6;48472:3;48465:4;48457:6;48453:17;48431:53;:::i;:::-;48545:66;48506:16;;;48531:81;;;-1:-1:-1;;;48639:4:1;48628:16;;48621:52;48692:49;48737:2;48726:14;;48718:6;48692:49;:::i;:::-;-1:-1:-1;;;48786:14:1;;;48828:66;48824:1;48816:10;;48809:86;-1:-1:-1;;;48919:2:1;48911:11;;48904:43;48682:59;;-1:-1:-1;48966:46:1;49008:2;49000:11;;48992:6;48966:46;:::i;:::-;49021:14;;;49063:66;49059:1;49051:10;;49044:86;-1:-1:-1;;;49154:2:1;49146:11;;49139:41;49205:13;;48956:56;;-1:-1:-1;49227:63:1;49205:13;49276:2;49268:11;;49261:4;49249:17;;49227:63;:::i;:::-;-1:-1:-1;;;49350:2:1;49309:17;;;;49342:11;;;49335:25;49384:2;49376:11;;47502:1891;-1:-1:-1;;;;;;47502:1891:1:o;49398:575::-;49731:3;49769:6;49763:13;49785:53;49831:6;49826:3;49819:4;49811:6;49807:17;49785:53;:::i;:::-;-1:-1:-1;;;49860:16:1;;49885:18;;;-1:-1:-1;;;;49930:1:1;49919:13;;49912:26;49965:1;49954:13;;49398:575;-1:-1:-1;49398:575:1:o;49978:448::-;50240:31;50235:3;50228:44;50210:3;50301:6;50295:13;50317:62;50372:6;50367:2;50362:3;50358:12;50351:4;50343:6;50339:17;50317:62;:::i;:::-;50399:16;;;;50417:2;50395:25;;49978:448;-1:-1:-1;;49978:448:1:o;51518:217::-;51557:4;51586:6;51642:10;;;;51612;;51664:12;;;51661:38;;;51679:18;;:::i;:::-;51716:13;;51518:217;-1:-1:-1;;;51518:217:1:o

Swarm Source

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