ETH Price: $3,777.52 (-1.81%)
Gas: 5 Gwei

Contract

0x5911a6DA952A9D1B67Be13cEcB389aD247420360
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Set Approval For...199657102024-05-28 3:34:1147 hrs ago1716867251IN
Benji Bananas: Token
0 ETH0.000532511.50037924
Set Approval For...199651122024-05-28 1:34:232 days ago1716860063IN
Benji Bananas: Token
0 ETH0.0005060110.92839509
Safe Transfer Fr...199651052024-05-28 1:32:592 days ago1716859979IN
Benji Bananas: Token
0 ETH0.0005689511.01236696
Set Approval For...199528262024-05-26 8:22:113 days ago1716711731IN
Benji Bananas: Token
0 ETH0.000124355.0809657
Set Approval For...199528012024-05-26 8:17:113 days ago1716711431IN
Benji Bananas: Token
0 ETH0.000123455.04429648
Set Approval For...199429482024-05-24 23:13:595 days ago1716592439IN
Benji Bananas: Token
0 ETH0.000239625.17520165
Set Approval For...199319572024-05-23 10:22:236 days ago1716459743IN
Benji Bananas: Token
0 ETH0.000322476.96449558
Safe Transfer Fr...199314382024-05-23 8:37:476 days ago1716453467IN
Benji Bananas: Token
0 ETH0.000352836.82926777
Set Approval For...199231042024-05-22 4:39:237 days ago1716352763IN
Benji Bananas: Token
0 ETH0.000270335.83834473
Set Approval For...198952362024-05-18 7:06:3511 days ago1716015995IN
Benji Bananas: Token
0 ETH0.000178923.86430974
Set Approval For...198838692024-05-16 16:56:1113 days ago1715878571IN
Benji Bananas: Token
0 ETH0.000352147.60523959
Set Approval For...198722482024-05-15 1:59:3515 days ago1715738375IN
Benji Bananas: Token
0 ETH0.000186424.02622432
Set Approval For...198672032024-05-14 8:57:1115 days ago1715677031IN
Benji Bananas: Token
0 ETH0.000167166.31404079
Set Approval For...198672022024-05-14 8:56:5915 days ago1715677019IN
Benji Bananas: Token
0 ETH0.000151496.18998849
Set Approval For...198669332024-05-14 8:02:4715 days ago1715673767IN
Benji Bananas: Token
0 ETH0.0004921410.60948483
Safe Transfer Fr...198668672024-05-14 7:49:1115 days ago1715672951IN
Benji Bananas: Token
0 ETH0.000419428.09538316
Set Approval For...197995132024-05-04 21:46:1125 days ago1714859171IN
Benji Bananas: Token
0 ETH0.000212274.58443617
Set Approval For...197832182024-05-02 15:05:3527 days ago1714662335IN
Benji Bananas: Token
0 ETH0.0009836721.24427563
Set Approval For...197602602024-04-29 10:05:3530 days ago1714385135IN
Benji Bananas: Token
0 ETH0.000437829.45567674
Safe Transfer Fr...197316592024-04-25 10:03:1134 days ago1714039391IN
Benji Bananas: Token
0 ETH0.0006795512.03493215
Set Approval For...196853132024-04-18 22:26:4741 days ago1713479207IN
Benji Bananas: Token
0 ETH0.00022549.20976286
Set Approval For...196582432024-04-15 3:29:4744 days ago1713151787IN
Benji Bananas: Token
0 ETH0.000372838.0521187
Set Approval For...196320712024-04-11 11:25:5948 days ago1712834759IN
Benji Bananas: Token
0 ETH0.0007295915.72834179
Set Approval For...196300802024-04-11 4:44:1148 days ago1712810651IN
Benji Bananas: Token
0 ETH0.0003882815.91933097
Set Approval For...196212222024-04-09 23:00:4750 days ago1712703647IN
Benji Bananas: Token
0 ETH0.0009426420.32649677
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BenjiBananasMembershipPassNFT

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.6.4 https://hardhat.org

// File contracts/token/erc1155/BenjiBananasMembershipPassNFT.sol

/**
 *Submitted for verification at Etherscan.io on 2021-10-12
 */

// Sources flattened with hardhat v2.6.5 https://hardhat.org

// File @animoca/ethereum-contracts-core-1.1.2/contracts/metatx/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity >=0.7.6 <0.8.0;

/*
 * 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.
 */
abstract contract ManagedIdentity {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

// File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-173 Contract Ownership Standard
 * Note: the ERC-165 identifier for this interface is 0x7f5828d0
 */
interface IERC173 {
    /**
     * Event emited when ownership of a contract changes.
     * @param previousOwner the previous owner.
     * @param newOwner the new owner.
     */
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * Get the address of the owner
     * @return The address of the owner.
     */
    function owner() external view returns (address);

    /**
     * Set the address of the new owner of the contract
     * Set newOwner to address(0) to renounce any ownership.
     * @dev Emits an {OwnershipTransferred} event.
     * @param newOwner The address of the new owner of the contract. Using the zero address means renouncing ownership.
     */
    function transferOwnership(address newOwner) external;
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;

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

    /**
     * Initializes the contract, setting the deployer as the initial owner.
     * @dev Emits an {IERC173-OwnershipTransferred(address,address)} event.
     */
    constructor(address owner_) {
        _owner = owner_;
        emit OwnershipTransferred(address(0), owner_);
    }

    /**
     * Gets the address of the current contract owner.
     */
    function owner() public view virtual override returns (address) {
        return _owner;
    }

    /**
     * See {IERC173-transferOwnership(address)}
     * @dev Reverts if the sender is not the current contract owner.
     * @param newOwner the address of the new owner. Use the zero address to renounce the ownership.
     */
    function transferOwnership(address newOwner) public virtual override {
        _requireOwnership(_msgSender());
        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
    }

    /**
     * @dev Reverts if `account` is not the contract owner.
     * @param account the account to test.
     */
    function _requireOwnership(address account) internal virtual {
        require(account == this.owner(), "Ownable: not the owner");
    }
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/types/[email protected]

// Partially derived from OpenZeppelin:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/406c83649bd6169fc1b578e08506d78f0873b276/contracts/utils/Address.sol

pragma solidity >=0.7.6 <0.8.0;

/**
 * @dev Upgrades the address type to check if it is a contract.
 */
library AddressIsContract {
    /**
     * @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;
    }
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20Wrapper
 * Wraps ERC20 functions to support non-standard implementations which do not return a bool value.
 * Calls to the wrapped functions revert only if they throw or if they return false.
 */
library ERC20Wrapper {
    using AddressIsContract for address;

    function wrappedTransfer(
        IWrappedERC20 token,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function wrappedTransferFrom(
        IWrappedERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function wrappedApprove(
        IWrappedERC20 token,
        address spender,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function _callWithOptionalReturnData(IWrappedERC20 token, bytes memory callData) internal {
        address target = address(token);
        require(target.isContract(), "ERC20Wrapper: non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = target.call(callData);
        if (success) {
            if (data.length != 0) {
                require(abi.decode(data, (bool)), "ERC20Wrapper: operation failed");
            }
        } else {
            // revert using a standard revert message
            if (data.length == 0) {
                revert("ERC20Wrapper: operation failed");
            }

            // revert using the revert message coming from the call
            assembly {
                let size := mload(data)
                revert(add(32, data), size)
            }
        }
    }
}

interface IWrappedERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;

abstract contract Recoverable is ManagedIdentity, Ownable {
    using ERC20Wrapper for IWrappedERC20;

    /**
     * Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens
     * so that the extraction is limited to only amounts sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `tokens` and `amounts` do not have the same length.
     * @dev Reverts if one of `tokens` is does not implement the ERC20 transfer function.
     * @dev Reverts if one of the ERC20 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param tokens the list of ERC20 token addresses.
     * @param amounts the list of token amounts to transfer.
     */
    function recoverERC20s(
        address[] calldata accounts,
        address[] calldata tokens,
        uint256[] calldata amounts
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == tokens.length && length == amounts.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IWrappedERC20(tokens[i]).wrappedTransfer(accounts[i], amounts[i]);
        }
    }

    /**
     * Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens
     * so that the extraction is limited to only tokens sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `contracts` and `amounts` do not have the same length.
     * @dev Reverts if one of `contracts` is does not implement the ERC721 transferFrom function.
     * @dev Reverts if one of the ERC721 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param contracts the list of ERC721 contract addresses.
     * @param tokenIds the list of token ids to transfer.
     */
    function recoverERC721s(
        address[] calldata accounts,
        address[] calldata contracts,
        uint256[] calldata tokenIds
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == contracts.length && length == tokenIds.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IRecoverableERC721(contracts[i]).transferFrom(address(this), accounts[i], tokenIds[i]);
        }
    }
}

interface IRecoverableERC721 {
    /// See {IERC721-transferFrom(address,address,uint256)}
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
}

// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

abstract contract UsingAppendedCallData {
    function _lastAppendedDataAsSender() internal pure virtual returns (address payable sender) {
        // Copied from openzeppelin : https://github.com/OpenZeppelin/openzeppelin-contracts/blob/9d5f77db9da0604ce0b25148898a94ae2c20d70f/contracts/metatx/ERC2771Context.sol1
        // The assembly code is more direct than the Solidity version using `abi.decode`.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            sender := shr(96, calldataload(sub(calldatasize(), 20)))
        }
    }

    function _msgDataAssuming20BytesAppendedData() internal pure virtual returns (bytes calldata) {
        return msg.data[:msg.data.length - 20];
    }
}

// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

interface IERC2771 {
    function isTrustedForwarder(address forwarder) external view returns (bool);
}

// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

interface IForwarderRegistry {
    function isForwarderFor(address, address) external view returns (bool);
}

// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

abstract contract UsingUniversalForwarding is UsingAppendedCallData, IERC2771 {
    IForwarderRegistry internal immutable _forwarderRegistry;
    address internal immutable _universalForwarder;

    constructor(IForwarderRegistry forwarderRegistry, address universalForwarder) {
        _universalForwarder = universalForwarder;
        _forwarderRegistry = forwarderRegistry;
    }

    function isTrustedForwarder(address forwarder) external view virtual override returns (bool) {
        return forwarder == _universalForwarder || forwarder == address(_forwarderRegistry);
    }

    function _msgSender() internal view virtual returns (address payable) {
        address payable msgSender = msg.sender;
        address payable sender = _lastAppendedDataAsSender();
        if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) {
            // if forwarder use appended data
            return sender;
        }

        // if msg.sender is neither the registry nor the universal forwarder,
        // we have to check the last 20bytes of the call data intepreted as an address
        // and check if the msg.sender was registered as forewarder for that address
        // we check tx.origin to save gas in case where msg.sender == tx.origin
        // solhint-disable-next-line avoid-tx-origin
        if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(sender, msgSender)) {
            return sender;
        }

        return msgSender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        address payable msgSender = msg.sender;
        if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) {
            // if forwarder use appended data
            return _msgDataAssuming20BytesAppendedData();
        }

        // we check tx.origin to save gas in case where msg.sender == tx.origin
        // solhint-disable-next-line avoid-tx-origin
        if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(_lastAppendedDataAsSender(), msgSender)) {
            return _msgDataAssuming20BytesAppendedData();
        }
        return msg.data;
    }
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory. optional extension: Burnable.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.
 */
interface IERC1155InventoryBurnable {
    /**
     * Burns some token.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `id` does not represent a token.
     * @dev Reverts if `id` represents a Fungible Token and `value` is 0.
     * @dev Reverts if `id` represents a Fungible Token and `value` is higher than `from`'s balance.
     * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if `id` represents a Non-Fungible Token which is not owned by `from`.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param from Address of the current token owner.
     * @param id Identifier of the token to burn.
     * @param value Amount of token to burn.
     */
    function burnFrom(
        address from,
        uint256 id,
        uint256 value
    ) external;

    /**
     * Burns multiple tokens.
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `ids` does not represent a token.
     * @dev Reverts if one of `ids` represents a Fungible Token and `value` is 0.
     * @dev Reverts if one of `ids` represents a Fungible Token and `value` is higher than `from`'s balance.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token which is not owned by `from`.
     * @dev Emits an {IERC1155-TransferBatch} event.
     * @param from Address of the current tokens owner.
     * @param ids Identifiers of the tokens to burn.
     * @param values Amounts of tokens to burn.
     */
    function batchBurnFrom(
        address from,
        uint256[] calldata ids,
        uint256[] calldata values
    ) external;
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155InventoryIdentifiersLib, a library to introspect inventory identifiers.
 * @dev With N=32, representing the Non-Fungible Collection mask length, identifiers are represented as follow:
 * (a) a Fungible Token:
 *     - most significant bit == 0
 * (b) a Non-Fungible Collection:
 *     - most significant bit == 1
 *     - (256-N) least significant bits == 0
 * (c) a Non-Fungible Token:
 *     - most significant bit == 1
 *     - (256-N) least significant bits != 0
 */
library ERC1155InventoryIdentifiersLib {
    // Non-Fungible bit. If an id has this bit set, it is a Non-Fungible (either Collection or Token)
    uint256 internal constant _NF_BIT = 1 << 255;

    // Mask for Non-Fungible Collection (including the nf bit)
    uint256 internal constant _NF_COLLECTION_MASK = uint256(type(uint32).max) << 224;
    uint256 internal constant _NF_TOKEN_MASK = ~_NF_COLLECTION_MASK;

    function isFungibleToken(uint256 id) internal pure returns (bool) {
        return id & _NF_BIT == 0;
    }

    function isNonFungibleToken(uint256 id) internal pure returns (bool) {
        return id & _NF_BIT != 0 && id & _NF_TOKEN_MASK != 0;
    }

    function getNonFungibleCollection(uint256 nftId) internal pure returns (uint256) {
        return nftId & _NF_COLLECTION_MASK;
    }
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/introspection/[email protected]

pragma solidity >=0.7.6 <0.8.0;

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

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, basic interface.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.
 */
interface IERC1155 {
    event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value);

    event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values);

    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    event URI(string _value, uint256 indexed _id);

    /**
     * Safely transfers some token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `from` has an insufficient balance.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused.
     * @dev Emits a `TransferSingle` event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to transfer.
     * @param value Amount of token to transfer.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external;

    /**
     * Safely transfers a batch of tokens.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `from` has an insufficient balance for any of `ids`.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits a `TransferBatch` event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external;

    /**
     * Retrieves the balance of `id` owned by account `owner`.
     * @param owner The account to retrieve the balance of.
     * @param id The identifier to retrieve the balance of.
     * @return The balance of `id` owned by account `owner`.
     */
    function balanceOf(address owner, uint256 id) external view returns (uint256);

    /**
     * Retrieves the balances of `ids` owned by accounts `owners`. For each pair:
     * @dev Reverts if `owners` and `ids` have different lengths.
     * @param owners The addresses of the token holders
     * @param ids The identifiers to retrieve the balance of.
     * @return The balances of `ids` owned by accounts `owners`.
     */
    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * Enables or disables an operator's approval.
     * @dev Emits an `ApprovalForAll` event.
     * @param operator Address of the operator.
     * @param approved True to approve the operator, false to revoke an approval.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * Retrieves the approval status of an operator for a given owner.
     * @param owner Address of the authorisation giver.
     * @param operator Address of the operator.
     * @return True if the operator is approved, false if not.
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, optional extension: Inventory.
 * Interface for Fungible/Non-Fungible Tokens management on an ERC1155 contract.
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * @dev Note: The ERC-165 identifier for this interface is 0x09ce5c46.
 */
interface IERC1155InventoryFunctions {
    function ownerOf(uint256 nftId) external view returns (address);

    function isFungible(uint256 id) external view returns (bool);

    function collectionOf(uint256 nftId) external view returns (uint256);
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, optional extension: Inventory.
 * Interface for Fungible/Non-Fungible Tokens management on an ERC1155 contract.
 *
 * This interface rationalizes the co-existence of Fungible and Non-Fungible Tokens
 * within the same contract. As several kinds of Fungible Tokens can be managed under
 * the Multi-Token standard, we consider that Non-Fungible Tokens can be classified
 * under their own specific type. We introduce the concept of Non-Fungible Collection
 * and consider the usage of 3 types of identifiers:
 * (a) Fungible Token identifiers, each representing a set of Fungible Tokens,
 * (b) Non-Fungible Collection identifiers, each representing a set of Non-Fungible Tokens (this is not a token),
 * (c) Non-Fungible Token identifiers.
 *
 * Identifiers nature
 * |       Type                | isFungible  | isCollection | isToken |
 * |  Fungible Token           |   true      |     true     |  true   |
 * |  Non-Fungible Collection  |   false     |     true     |  false  |
 * |  Non-Fungible Token       |   false     |     false    |  true   |
 *
 * Identifiers compatibilities
 * |       Type                |  transfer  |   balance    |   supply    |  owner  |
 * |  Fungible Token           |    OK      |     OK       |     OK      |   NOK   |
 * |  Non-Fungible Collection  |    NOK     |     OK       |     OK      |   NOK   |
 * |  Non-Fungible Token       |    OK      |   0 or 1     |   0 or 1    |   OK    |
 *
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * @dev Note: The ERC-165 identifier for this interface is 0x09ce5c46.
 */
interface IERC1155Inventory is IERC1155, IERC1155InventoryFunctions {
    //================================================== ERC1155Inventory ===================================================//
    /**
     * Optional event emitted when a collection (Fungible Token or Non-Fungible Collection) is created.
     *  This event can be used by a client application to determine which identifiers are meaningful
     *  to track through the functions `balanceOf`, `balanceOfBatch` and `totalSupply`.
     * @dev This event MUST NOT be emitted twice for the same `collectionId`.
     */
    event CollectionCreated(uint256 indexed collectionId, bool indexed fungible);

    /**
     * Retrieves the owner of a Non-Fungible Token (ERC721-compatible).
     * @dev Reverts if `nftId` is owned by the zero address.
     * @param nftId Identifier of the token to query.
     * @return Address of the current owner of the token.
     */
    function ownerOf(uint256 nftId) external view override returns (address);

    /**
     * Introspects whether or not `id` represents a Fungible Token.
     *  This function MUST return true even for a Fungible Token which is not-yet created.
     * @param id The identifier to query.
     * @return bool True if `id` represents aFungible Token, false otherwise.
     */
    function isFungible(uint256 id) external view override returns (bool);

    /**
     * Introspects the Non-Fungible Collection to which `nftId` belongs.
     * @dev This function MUST return a value representing a Non-Fungible Collection.
     * @dev This function MUST return a value for a non-existing token, and SHOULD NOT be used to check the existence of a Non-Fungible Token.
     * @dev Reverts if `nftId` does not represent a Non-Fungible Token.
     * @param nftId The token identifier to query the collection of.
     * @return The Non-Fungible Collection identifier to which `nftId` belongs.
     */
    function collectionOf(uint256 nftId) external view override returns (uint256);

    //======================================================= ERC1155 =======================================================//

    /**
     * Retrieves the balance of `id` owned by account `owner`.
     * @param owner The account to retrieve the balance of.
     * @param id The identifier to retrieve the balance of.
     * @return
     *  If `id` represents a collection (Fungible Token or Non-Fungible Collection), the balance for this collection.
     *  If `id` represents a Non-Fungible Token, 1 if the token is owned by `owner`, else 0.
     */
    function balanceOf(address owner, uint256 id) external view override returns (uint256);

    /**
     * Retrieves the balances of `ids` owned by accounts `owners`.
     * @dev Reverts if `owners` and `ids` have different lengths.
     * @param owners The accounts to retrieve the balances of.
     * @param ids The identifiers to retrieve the balances of.
     * @return An array of elements such as for each pair `id`/`owner`:
     *  If `id` represents a collection (Fungible Token or Non-Fungible Collection), the balance for this collection.
     *  If `id` represents a Non-Fungible Token, 1 if the token is owned by `owner`, else 0.
     */
    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view override returns (uint256[] memory);

    /**
     * Safely transfers some token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `id` does not represent a token.
     * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if `id` represents a Non-Fungible Token and is not owned by `from`.
     * @dev Reverts if `id` represents a Fungible Token and `value` is 0.
     * @dev Reverts if `id` represents a Fungible Token and `from` has an insufficient balance.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to transfer.
     * @param value Amount of token to transfer.
     * @param data Optional data to pass to the receiver contract.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external override;

    /**
     * @notice this documentation overrides its {IERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.
     * Safely transfers a batch of tokens.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `ids` does not represent a token.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and is not owned by `from`.
     * @dev Reverts if one of `ids` represents a Fungible Token and `value` is 0.
     * @dev Reverts if one of `ids` represents a Fungible Token and `from` has an insufficient balance.
     * @dev Reverts if one of `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits an {IERC1155-TransferBatch} event.
     * @param from Current tokens owner.
     * @param to Address of the new tokens owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to pass to the receiver contract.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external override;
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, optional extension: Metadata URI.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.
 */
interface IERC1155MetadataURI {
    /**
     * @notice A distinct Uniform Resource Identifier (URI) for a given token.
     * @dev URIs are defined in RFC 3986.
     * @dev The URI MUST point to a JSON file that conforms to the "ERC1155 Metadata URI JSON Schema".
     * @dev The uri function SHOULD be used to retrieve values if no event was emitted.
     * @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.
     * @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for
     *  an implementation to return a valid string even if the token does not exist.
     * @return URI string
     */
    function uri(uint256 id) external view returns (string memory);
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory, optional extension: Total Supply.
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * @dev Note: The ERC-165 identifier for this interface is 0xbd85b039.
 */
interface IERC1155InventoryTotalSupply {
    /**
     * Retrieves the total supply of `id`.
     * @param id The identifier for which to retrieve the supply of.
     * @return
     *  If `id` represents a collection (Fungible Token or Non-Fungible Collection), the total supply for this collection.
     *  If `id` represents a Non-Fungible Token, 1 if the token exists, else 0.
     */
    function totalSupply(uint256 id) external view returns (uint256);
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, Tokens Receiver.
 * Interface for any contract that wants to support transfers from ERC1155 asset contracts.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.
 */
interface IERC1155TokenReceiver {
    /**
     * @notice Handle the receipt of a single ERC1155 token type.
     * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.
     * This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     *  (i.e. 0xf23a6e61) to accept the transfer.
     * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
     * @param operator  The address which initiated the transfer (i.e. msg.sender)
     * @param from      The address which previously owned the token
     * @param id        The ID of the token being transferred
     * @param value     The amount of tokens being transferred
     * @param data      Additional data with no specified format
     * @return bytes4   `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @notice Handle the receipt of multiple ERC1155 token types.
     * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.
     * This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     *  (i.e. 0xbc197c81) if to accept the transfer(s).
     * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
     * @param operator  The address which initiated the batch transfer (i.e. msg.sender)
     * @param from      The address which previously owned the token
     * @param ids       An array containing ids of each token being transferred (order and length must match _values array)
     * @param values    An array containing amounts of each token being transferred (order and length must match _ids array)
     * @param data      Additional data with no specified format
     * @return          `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory Base.
 * @dev The functions `safeTransferFrom(address,address,uint256,uint256,bytes)`
 *  and `safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)` need to be implemented by a child contract.
 * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`.
 */
abstract contract ERC1155InventoryBase is ManagedIdentity, IERC165, IERC1155Inventory, IERC1155MetadataURI, IERC1155InventoryTotalSupply {
    using ERC1155InventoryIdentifiersLib for uint256;

    // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
    bytes4 internal constant _ERC1155_RECEIVED = 0xf23a6e61;

    // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
    bytes4 internal constant _ERC1155_BATCH_RECEIVED = 0xbc197c81;

    // Burnt Non-Fungible Token owner's magic value
    uint256 internal constant _BURNT_NFT_OWNER = 0xdead000000000000000000000000000000000000000000000000000000000000;

    /* owner => operator => approved */
    mapping(address => mapping(address => bool)) internal _operators;

    /* collection ID => owner => balance */
    mapping(uint256 => mapping(address => uint256)) internal _balances;

    /* collection ID => supply */
    mapping(uint256 => uint256) internal _supplies;

    /* NFT ID => owner */
    mapping(uint256 => uint256) internal _owners;

    /* collection ID => creator */
    mapping(uint256 => address) internal _creators;

    //======================================================= ERC165 ========================================================//

    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
            interfaceId == type(IERC165).interfaceId ||
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            interfaceId == type(IERC1155InventoryFunctions).interfaceId ||
            interfaceId == type(IERC1155InventoryTotalSupply).interfaceId;
    }

    //======================================================= ERC1155 =======================================================//

    /// @inheritdoc IERC1155Inventory
    function balanceOf(address owner, uint256 id) public view virtual override returns (uint256) {
        require(owner != address(0), "Inventory: zero address");

        if (id.isNonFungibleToken()) {
            return address(uint160(_owners[id])) == owner ? 1 : 0;
        }

        return _balances[id][owner];
    }

    /// @inheritdoc IERC1155Inventory
    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual override returns (uint256[] memory) {
        require(owners.length == ids.length, "Inventory: inconsistent arrays");

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

        for (uint256 i = 0; i != owners.length; ++i) {
            balances[i] = balanceOf(owners[i], ids[i]);
        }

        return balances;
    }

    /// @inheritdoc IERC1155
    function setApprovalForAll(address operator, bool approved) public virtual override {
        address sender = _msgSender();
        require(operator != sender, "Inventory: self-approval");
        _operators[sender][operator] = approved;
        emit ApprovalForAll(sender, operator, approved);
    }

    /// @inheritdoc IERC1155
    function isApprovedForAll(address tokenOwner, address operator) public view virtual override returns (bool) {
        return _operators[tokenOwner][operator];
    }

    //================================================== ERC1155Inventory ===================================================//

    /// @inheritdoc IERC1155Inventory
    function isFungible(uint256 id) external pure virtual override returns (bool) {
        return id.isFungibleToken();
    }

    /// @inheritdoc IERC1155Inventory
    function collectionOf(uint256 nftId) external pure virtual override returns (uint256) {
        require(nftId.isNonFungibleToken(), "Inventory: not an NFT");
        return nftId.getNonFungibleCollection();
    }

    /// @inheritdoc IERC1155Inventory
    function ownerOf(uint256 nftId) public view virtual override returns (address) {
        address owner = address(uint160(_owners[nftId]));
        require(owner != address(0), "Inventory: non-existing NFT");
        return owner;
    }

    //============================================= ERC1155InventoryTotalSupply =============================================//

    /// @inheritdoc IERC1155InventoryTotalSupply
    function totalSupply(uint256 id) external view virtual override returns (uint256) {
        if (id.isNonFungibleToken()) {
            return address(uint160(_owners[id])) == address(0) ? 0 : 1;
        } else {
            return _supplies[id];
        }
    }

    //============================================ High-level Internal Functions ============================================//

    /**
     * Creates a collection (optional).
     * @dev Reverts if `collectionId` does not represent a collection.
     * @dev Reverts if `collectionId` has already been created.
     * @dev Emits a {IERC1155Inventory-CollectionCreated} event.
     * @param collectionId Identifier of the collection.
     */
    function _createCollection(uint256 collectionId) internal virtual {
        require(!collectionId.isNonFungibleToken(), "Inventory: not a collection");
        require(_creators[collectionId] == address(0), "Inventory: existing collection");
        _creators[collectionId] = _msgSender();
        emit CollectionCreated(collectionId, collectionId.isFungibleToken());
    }

    function _creator(uint256 collectionId) internal view virtual returns (address) {
        require(!collectionId.isNonFungibleToken(), "Inventory: not a collection");
        return _creators[collectionId];
    }

    //============================================== Helper Internal Functions ==============================================//

    /**
     * Returns whether `sender` is authorised to make a transfer on behalf of `from`.
     * @param from The address to check operatibility upon.
     * @param sender The sender address.
     * @return True if sender is `from` or an operator for `from`, false otherwise.
     */
    function _isOperatable(address from, address sender) internal view virtual returns (bool) {
        return (from == sender) || _operators[from][sender];
    }

    /**
     * Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.
     * @dev Reverts if `to` is not a contract.
     * @dev Reverts if the call to the target fails or is refused.
     * @param from Previous token owner.
     * @param to New token owner.
     * @param id Identifier of the token transferred.
     * @param value Amount of token transferred.
     * @param data Optional data to send along with the receiver contract call.
     */
    function _callOnERC1155Received(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) internal {
        require(IERC1155TokenReceiver(to).onERC1155Received(_msgSender(), from, id, value, data) == _ERC1155_RECEIVED, "Inventory: transfer refused");
    }

    /**
     * Calls {IERC1155TokenReceiver-onERC1155batchReceived} on a target contract.
     * @dev Reverts if `to` is not a contract.
     * @dev Reverts if the call to the target fails or is refused.
     * @param from Previous tokens owner.
     * @param to New tokens owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to send along with the receiver contract call.
     */
    function _callOnERC1155BatchReceived(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal {
        require(
            IERC1155TokenReceiver(to).onERC1155BatchReceived(_msgSender(), from, ids, values, data) == _ERC1155_BATCH_RECEIVED,
            "Inventory: transfer refused"
        );
    }
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

// solhint-disable-next-line max-line-length

/**
 * @title ERC1155Inventory, a contract which manages up to multiple Collections of Fungible and Non-Fungible Tokens.
 * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`.
 */
abstract contract ERC1155Inventory is ERC1155InventoryBase {
    using AddressIsContract for address;
    using ERC1155InventoryIdentifiersLib for uint256;

    //======================================================= ERC1155 =======================================================//

    /// @inheritdoc IERC1155Inventory
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) public virtual override {
        address sender = _msgSender();
        require(to != address(0), "Inventory: transfer to zero");
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        if (id.isFungibleToken()) {
            _transferFungible(from, to, id, value);
        } else if (id.isNonFungibleToken()) {
            _transferNFT(from, to, id, value, false);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(sender, from, to, id, value);
        if (to.isContract()) {
            _callOnERC1155Received(from, to, id, value, data);
        }
    }

    /// @inheritdoc IERC1155Inventory
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) public virtual override {
        // internal function to avoid stack too deep error
        _safeBatchTransferFrom(from, to, ids, values, data);
    }

    //============================================ High-level Internal Functions ============================================//

    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal {
        require(to != address(0), "Inventory: transfer to zero");
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");
        address sender = _msgSender();
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            uint256 value = values[i];
            if (id.isFungibleToken()) {
                _transferFungible(from, to, id, value);
            } else if (id.isNonFungibleToken()) {
                _transferNFT(from, to, id, value, true);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount);
                        nfCollectionId = nextCollectionId;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount);
        }

        emit TransferBatch(sender, from, to, ids, values);
        if (to.isContract()) {
            _callOnERC1155BatchReceived(from, to, ids, values, data);
        }
    }

    function _safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) internal {
        require(to != address(0), "Inventory: mint to zero");

        if (id.isFungibleToken()) {
            _mintFungible(to, id, value);
        } else if (id.isNonFungibleToken()) {
            _mintNFT(to, id, value, false);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(_msgSender(), address(0), to, id, value);
        if (to.isContract()) {
            _callOnERC1155Received(address(0), to, id, value, data);
        }
    }

    function _safeBatchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "Inventory: mint to zero");
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            uint256 value = values[i];
            if (id.isFungibleToken()) {
                _mintFungible(to, id, value);
            } else if (id.isNonFungibleToken()) {
                _mintNFT(to, id, value, true);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _balances[nfCollectionId][to] += nfCollectionCount;
                        _supplies[nfCollectionId] += nfCollectionCount;
                        nfCollectionId = nextCollectionId;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _balances[nfCollectionId][to] += nfCollectionCount;
            _supplies[nfCollectionId] += nfCollectionCount;
        }

        emit TransferBatch(_msgSender(), address(0), to, ids, values);
        if (to.isContract()) {
            _callOnERC1155BatchReceived(address(0), to, ids, values, data);
        }
    }

    //============================================== Helper Internal Functions ==============================================//

    function _mintFungible(
        address to,
        uint256 id,
        uint256 value
    ) internal {
        require(value != 0, "Inventory: zero value");
        uint256 supply = _supplies[id];
        uint256 newSupply = supply + value;
        require(newSupply > supply, "Inventory: supply overflow");
        _supplies[id] = newSupply;
        // cannot overflow as any balance is bounded up by the supply which cannot overflow
        _balances[id][to] += value;
    }

    function _mintNFT(
        address to,
        uint256 id,
        uint256 value,
        bool isBatch
    ) internal {
        require(value == 1, "Inventory: wrong NFT value");
        require(_owners[id] == 0, "Inventory: existing/burnt NFT");

        _owners[id] = uint256(uint160(to));

        if (!isBatch) {
            uint256 collectionId = id.getNonFungibleCollection();
            // it is virtually impossible that a Non-Fungible Collection supply
            // overflows due to the cost of minting individual tokens
            ++_supplies[collectionId];
            // cannot overflow as supply cannot overflow
            ++_balances[collectionId][to];
        }
    }

    function _transferFungible(
        address from,
        address to,
        uint256 id,
        uint256 value
    ) internal {
        require(value != 0, "Inventory: zero value");
        uint256 balance = _balances[id][from];
        require(balance >= value, "Inventory: not enough balance");
        if (from != to) {
            _balances[id][from] = balance - value;
            // cannot overflow as supply cannot overflow
            _balances[id][to] += value;
        }
    }

    function _transferNFT(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bool isBatch
    ) internal {
        require(value == 1, "Inventory: wrong NFT value");
        require(from == address(uint160(_owners[id])), "Inventory: non-owned NFT");
        _owners[id] = uint256(uint160(to));
        if (!isBatch) {
            uint256 collectionId = id.getNonFungibleCollection();
            // cannot underflow as balance is verified through ownership
            _balances[collectionId][from] -= 1;
            // cannot overflow as supply cannot overflow
            _balances[collectionId][to] += 1;
        }
    }

    function _transferNFTUpdateCollection(
        address from,
        address to,
        uint256 collectionId,
        uint256 amount
    ) internal virtual {
        if (from != to) {
            // cannot underflow as balance is verified through ownership
            _balances[collectionId][from] -= amount;
            // cannot overflow as supply cannot overflow
            _balances[collectionId][to] += amount;
        }
    }
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155Inventory, burnable version.
 * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`.
 */
abstract contract ERC1155InventoryBurnable is IERC1155InventoryBurnable, ERC1155Inventory {
    using ERC1155InventoryIdentifiersLib for uint256;

    //======================================================= ERC165 ========================================================//

    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC1155InventoryBurnable).interfaceId || super.supportsInterface(interfaceId);
    }

    //============================================== ERC1155InventoryBurnable ===============================================//

    /// @inheritdoc IERC1155InventoryBurnable
    function burnFrom(
        address from,
        uint256 id,
        uint256 value
    ) public virtual override {
        address sender = _msgSender();
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        if (id.isFungibleToken()) {
            _burnFungible(from, id, value);
        } else if (id.isNonFungibleToken()) {
            _burnNFT(from, id, value, false);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(sender, from, address(0), id, value);
    }

    /// @inheritdoc IERC1155InventoryBurnable
    function batchBurnFrom(
        address from,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual override {
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");

        address sender = _msgSender();
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            uint256 value = values[i];
            if (id.isFungibleToken()) {
                _burnFungible(from, id, value);
            } else if (id.isNonFungibleToken()) {
                _burnNFT(from, id, value, true);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _balances[nfCollectionId][from] -= nfCollectionCount;
                        _supplies[nfCollectionId] -= nfCollectionCount;
                        nfCollectionId = nextCollectionId;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _balances[nfCollectionId][from] -= nfCollectionCount;
            _supplies[nfCollectionId] -= nfCollectionCount;
        }

        emit TransferBatch(sender, from, address(0), ids, values);
    }

    //============================================== Helper Internal Functions ==============================================//

    function _burnFungible(
        address from,
        uint256 id,
        uint256 value
    ) internal {
        require(value != 0, "Inventory: zero value");
        uint256 balance = _balances[id][from];
        require(balance >= value, "Inventory: not enough balance");
        _balances[id][from] = balance - value;
        // Cannot underflow
        _supplies[id] -= value;
    }

    function _burnNFT(
        address from,
        uint256 id,
        uint256 value,
        bool isBatch
    ) internal {
        require(value == 1, "Inventory: wrong NFT value");
        require(from == address(uint160(_owners[id])), "Inventory: non-owned NFT");
        _owners[id] = _BURNT_NFT_OWNER;

        if (!isBatch) {
            uint256 collectionId = id.getNonFungibleCollection();
            // cannot underflow as balance is confirmed through ownership
            --_balances[collectionId][from];
            // Cannot underflow
            --_supplies[collectionId];
        }
    }
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory, optional extension: Mintable.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 */
interface IERC1155InventoryMintable {
    /**
     * Safely mints some token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `id` is not a token.
     * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if `id` represents a Non-Fungible Token which has already been minted.
     * @dev Reverts if `id` represents a Fungible Token and `value` is 0.
     * @dev Reverts if `id` represents a Fungible Token and there is an overflow of supply.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails or is refused.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to mint.
     * @param value Amount of token to mint.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external;

    /**
     * Safely mints a batch of tokens.
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if one of `ids` is not a token.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and its paired value is not 1.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token which has already been minted.
     * @dev Reverts if one of `ids` represents a Fungible Token and its paired value is 0.
     * @dev Reverts if one of `ids` represents a Fungible Token and there is an overflow of supply.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits an {IERC1155-TransferBatch} event.
     * @param to Address of the new tokens owner.
     * @param ids Identifiers of the tokens to mint.
     * @param values Amounts of tokens to mint.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeBatchMint(
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external;
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory, optional extension: Creator.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x510b5158.
 */
interface IERC1155InventoryCreator {
    /**
     * Returns the creator of a collection, or the zero address if the collection has not been created.
     * @dev Reverts if `collectionId` does not represent a collection.
     * @param collectionId Identifier of the collection.
     * @return The creator of a collection, or the zero address if the collection has not been created.
     */
    function creator(uint256 collectionId) external view returns (address);
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/types/[email protected]

// Partially derived from OpenZeppelin:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8b10cb38d8fedf34f2d89b0ed604f2dceb76d6a9/contracts/utils/Strings.sol

pragma solidity >=0.7.6 <0.8.0;

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

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/metadata/[email protected]

pragma solidity >=0.7.6 <0.8.0;

abstract contract BaseMetadataURI is ManagedIdentity, Ownable {
    using UInt256ToDecimalString for uint256;

    event BaseMetadataURISet(string baseMetadataURI);

    string public baseMetadataURI;

    function setBaseMetadataURI(string calldata baseMetadataURI_) external {
        _requireOwnership(_msgSender());
        baseMetadataURI = baseMetadataURI_;
        emit BaseMetadataURISet(baseMetadataURI_);
    }

    function _uri(uint256 id) internal view virtual returns (string memory) {
        return string(abi.encodePacked(baseMetadataURI, id.toDecimalString()));
    }
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * Contract which allows derived contracts access control over token minting operations.
 */
contract MinterRole is Ownable {
    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    mapping(address => bool) public isMinter;

    /**
     * Constructor.
     */
    constructor(address owner_) Ownable(owner_) {
        _addMinter(owner_);
    }

    /**
     * Grants the minter role to a non-minter.
     * @dev reverts if the sender is not the contract owner.
     * @param account The account to grant the minter role to.
     */
    function addMinter(address account) public {
        _requireOwnership(_msgSender());
        _addMinter(account);
    }

    /**
     * Renounces the granted minter role.
     * @dev reverts if the sender is not a minter.
     */
    function renounceMinter() public {
        address account = _msgSender();
        _requireMinter(account);
        isMinter[account] = false;
        emit MinterRemoved(account);
    }

    function _requireMinter(address account) internal view {
        require(isMinter[account], "MinterRole: not a Minter");
    }

    function _addMinter(address account) internal {
        isMinter[account] = true;
        emit MinterAdded(account);
    }
}

// File contracts/token/ERC1155/BenjiBananasMembershipPassNFT.sol

pragma solidity >=0.7.6 <0.8.0;

// solhint-disable-next-line max-line-length

/**
 * @title BenjiBananasMembershipPassNFT
 */
contract BenjiBananasMembershipPassNFT is
    Recoverable,
    UsingUniversalForwarding,
    ERC1155InventoryBurnable,
    IERC1155InventoryMintable,
    IERC1155InventoryCreator,
    BaseMetadataURI,
    MinterRole
{
    constructor(IForwarderRegistry forwarderRegistry, address universalForwarder)
        UsingUniversalForwarding(forwarderRegistry, universalForwarder)
        MinterRole(msg.sender)
    {}

    //======================================================= ERC165 ========================================================//

    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC1155InventoryCreator).interfaceId || super.supportsInterface(interfaceId);
    }

    //================================================= ERC1155MetadataURI ==================================================//

    /// @inheritdoc IERC1155MetadataURI
    function uri(uint256 id) external view virtual override returns (string memory) {
        return _uri(id);
    }

    //=============================================== ERC1155InventoryCreator ===============================================//

    /// @inheritdoc IERC1155InventoryCreator
    function creator(uint256 collectionId) external view override returns (address) {
        return _creator(collectionId);
    }

    //=========================================== ERC1155InventoryCreator (admin) ===========================================//

    /**
     * Creates a collection.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `collectionId` does not represent a collection.
     * @dev Reverts if `collectionId` has already been created.
     * @dev Emits a {IERC1155Inventory-CollectionCreated} event.
     * @param collectionId Identifier of the collection.
     */
    function createCollection(uint256 collectionId) external {
        _requireOwnership(_msgSender());
        _createCollection(collectionId);
    }

    //============================================== ERC1155InventoryMintable ===============================================//

    /// @inheritdoc IERC1155InventoryMintable
    /// @dev Reverts if the sender is not a minter.
    function safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) public virtual override {
        _requireMinter(_msgSender());
        _safeMint(to, id, value, data);
    }

    /// @inheritdoc IERC1155InventoryMintable
    /// @dev Reverts if the sender is not a minter.
    function safeBatchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) public virtual override {
        _requireMinter(_msgSender());
        _safeBatchMint(to, ids, values, data);
    }

    //======================================== Meta Transactions Internal Functions =========================================//

    function _msgSender() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (address payable) {
        return UsingUniversalForwarding._msgSender();
    }

    function _msgData() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (bytes memory ret) {
        return UsingUniversalForwarding._msgData();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"},{"internalType":"address","name":"universalForwarder","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"string","name":"baseMetadataURI","type":"string"}],"name":"BaseMetadataURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"collectionId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"fungible","type":"bool"}],"name":"CollectionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"collectionOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"createCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","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":"baseMetadataURI_","type":"string"}],"name":"setBaseMetadataURI","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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b50604051620039b6380380620039b6833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b03191633908117825560405190918491849184918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606091821b811660a05291901b16608052620000ad81620000b6565b50505062000102565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b60805160601c60a05160601c61387b6200013b600039806112255280612fc35250806112605280612f88528061301b525061387b6000f3fe608060405234801561001057600080fd5b50600436106101c35760003560e01c806380534934116100f9578063bd85b03911610097578063d0011d9d11610071578063d0011d9d14610d70578063e985e9c514610d8d578063f242432a14610dbb578063f2fde38b14610e84576101c3565b8063bd85b03914610c28578063c3666c3614610c45578063c7778baa14610d53576101c3565b806398650275116100d35780639865027514610baf578063a22cb46514610bb7578063aa271e1a14610be5578063adebf6f214610c0b576101c3565b80638053493414610a4e5780638da5cb5b14610b81578063983b2d5614610b89576101c3565b8063510b5158116101665780635cfa9297116101405780635cfa9297146107f55780636352211e146108b557806373c8a958146108d25780637e518ec8146109e0576101c3565b8063510b51581461078e578063572b6c05146107c75780635b2bd79e146107ed576101c3565b80630e89341c116101a25780630e89341c146103fb578063124d91e51461048d5780632eb2c2d6146104bf5780634e1273f414610680576101c3565b8062fdd58e146101c857806301ffc9a7146102065780630d6a5bbb14610241575b600080fd5b6101f4600480360360408110156101de57600080fd5b506001600160a01b038135169060200135610eaa565b60408051918252519081900360200190f35b61022d6004803603602081101561021c57600080fd5b50356001600160e01b031916610f75565b604080519115158252519081900360200190f35b6103f96004803603608081101561025757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561028157600080fd5b82018360208201111561029357600080fd5b803590602001918460208302840111600160201b831117156102b457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561030357600080fd5b82018360208201111561031557600080fd5b803590602001918460208302840111600160201b8311171561033657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561038557600080fd5b82018360208201111561039757600080fd5b803590602001918460018302840111600160201b831117156103b857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fa2945050505050565b005b6104186004803603602081101561041157600080fd5b5035610fc4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045257818101518382015260200161043a565b50505050905090810190601f16801561047f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f9600480360360608110156104a357600080fd5b506001600160a01b038135169060208101359060400135610fcf565b6103f9600480360360a08110156104d557600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561050857600080fd5b82018360208201111561051a57600080fd5b803590602001918460208302840111600160201b8311171561053b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058a57600080fd5b82018360208201111561059c57600080fd5b803590602001918460208302840111600160201b831117156105bd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060c57600080fd5b82018360208201111561061e57600080fd5b803590602001918460018302840111600160201b8311171561063f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061110e945050505050565b61073e6004803603604081101561069657600080fd5b810190602081018135600160201b8111156106b057600080fd5b8201836020820111156106c257600080fd5b803590602001918460208302840111600160201b831117156106e357600080fd5b919390929091602081019035600160201b81111561070057600080fd5b82018360208201111561071257600080fd5b803590602001918460208302840111600160201b8311171561073357600080fd5b509092509050611122565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561077a578181015183820152602001610762565b505050509050019250505060405180910390f35b6107ab600480360360208110156107a457600080fd5b5035611216565b604080516001600160a01b039092168252519081900360200190f35b61022d600480360360208110156107dd57600080fd5b50356001600160a01b0316611221565b61041861129a565b6103f96004803603608081101561080b57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561084157600080fd5b82018360208201111561085357600080fd5b803590602001918460018302840111600160201b8311171561087457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611328945050505050565b6107ab600480360360208110156108cb57600080fd5b503561133f565b6103f9600480360360608110156108e857600080fd5b810190602081018135600160201b81111561090257600080fd5b82018360208201111561091457600080fd5b803590602001918460208302840111600160201b8311171561093557600080fd5b919390929091602081019035600160201b81111561095257600080fd5b82018360208201111561096457600080fd5b803590602001918460208302840111600160201b8311171561098557600080fd5b919390929091602081019035600160201b8111156109a257600080fd5b8201836020820111156109b457600080fd5b803590602001918460208302840111600160201b831117156109d557600080fd5b5090925090506113a9565b6103f9600480360360208110156109f657600080fd5b810190602081018135600160201b811115610a1057600080fd5b820183602082011115610a2257600080fd5b803590602001918460018302840111600160201b83111715610a4357600080fd5b50909250905061149b565b6103f960048036036060811015610a6457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610a8e57600080fd5b820183602082011115610aa057600080fd5b803590602001918460208302840111600160201b83111715610ac157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b1057600080fd5b820183602082011115610b2257600080fd5b803590602001918460208302840111600160201b83111715610b4357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611517945050505050565b6107ab6117ca565b6103f960048036036020811015610b9f57600080fd5b50356001600160a01b03166117da565b6103f96117f1565b6103f960048036036040811015610bcd57600080fd5b506001600160a01b038135169060200135151561184f565b61022d60048036036020811015610bfb57600080fd5b50356001600160a01b0316611930565b61022d60048036036020811015610c2157600080fd5b5035611945565b6101f460048036036020811015610c3e57600080fd5b5035611950565b6103f960048036036060811015610c5b57600080fd5b810190602081018135600160201b811115610c7557600080fd5b820183602082011115610c8757600080fd5b803590602001918460208302840111600160201b83111715610ca857600080fd5b919390929091602081019035600160201b811115610cc557600080fd5b820183602082011115610cd757600080fd5b803590602001918460208302840111600160201b83111715610cf857600080fd5b919390929091602081019035600160201b811115610d1557600080fd5b820183602082011115610d2757600080fd5b803590602001918460208302840111600160201b83111715610d4857600080fd5b5090925090506119a6565b6101f460048036036020811015610d6957600080fd5b5035611aee565b6103f960048036036020811015610d8657600080fd5b5035611b4b565b61022d60048036036040811015610da357600080fd5b506001600160a01b0381358116916020013516611b5f565b6103f9600480360360a0811015610dd157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610e1057600080fd5b820183602082011115610e2257600080fd5b803590602001918460018302840111600160201b83111715610e4357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b8d945050505050565b6103f960048036036020811015610e9a57600080fd5b50356001600160a01b0316611d01565b60006001600160a01b038316610f07576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b610f1082611d5a565b15610f4a576000828152600460205260409020546001600160a01b03848116911614610f3d576000610f40565b60015b60ff169050610f6f565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216630a216a2b60e31b1480610f9a5750610f9a82611d7b565b90505b919050565b610fb2610fad611da0565b611daf565b610fbe84848484611e1c565b50505050565b6060610f9a826120ee565b6000610fd9611da0565b9050610fe584826121c1565b611024576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b61102d8361220f565b156110425761103d848484612219565b6110aa565b61104b83611d5a565b1561105d5761103d848484600061231a565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b60006001600160a01b0316846001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a450505050565b61111b8585858585612440565b5050505050565b6060838214611166576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008467ffffffffffffffff8111801561117f57600080fd5b506040519080825280602002602001820160405280156111a9578160200160208202803683370190505b50905060005b80861461120c576111ed8787838181106111c557fe5b905060200201356001600160a01b03168686848181106111e157fe5b90506020020135610eaa565b8282815181106111f957fe5b60209081029190910101526001016111af565b5095945050505050565b6000610f9a82612718565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610f9a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316149050919050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113205780601f106112f557610100808354040283529160200191611320565b820191906000526020600020905b81548152906001019060200180831161130357829003601f168201915b505050505081565b611333610fad611da0565b610fbe84848484612791565b6000818152600460205260408120546001600160a01b038116610f9a576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b6113b96113b4611da0565b6128a0565b8483811480156113c857508082145b611419576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114915761148988888381811061143257fe5b905060200201356001600160a01b031685858481811061144e57fe5b9050602002013588888581811061146157fe5b905060200201356001600160a01b03166001600160a01b031661295d9092919063ffffffff16565b60010161141c565b5050505050505050565b6114a66113b4611da0565b6114b260068383613764565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b81518151811461155c576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b6000611566611da0565b905061157285826121c1565b6115b1576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146116a55760008782815181106115cc57fe5b6020026020010151905060008783815181106115e457fe5b602002602001015190506115f78261220f565b1561160c576116078a8383612219565b61169b565b61161582611d5a565b1561105d576116278a8383600161231a565b6000611632836129b4565b9050856116455780955060019450611699565b8581146116925760008681526002602090815260408083206001600160a01b038f168452825280832080548990039055978252600390529590952080549490940390935560019284611699565b8460010194505b505b50506001016115b7565b5081156116e75760008281526002602090815260408083206001600160a01b038b16845282528083208054859003905584835260039091529020805482900390555b60006001600160a01b0316876001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561176d578181015183820152602001611755565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117ac578181015183820152602001611794565b5050505090500194505050505060405180910390a450505050505050565b6000546001600160a01b03165b90565b6117e56113b4611da0565b6117ee816129c1565b50565b60006117fb611da0565b905061180681611daf565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b6000611859611da0565b9050806001600160a01b0316836001600160a01b031614156118c2576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b60076020526000908152604090205460ff1681565b6000610f9a8261220f565b600061195b82611d5a565b15611991576000828152600460205260409020546001600160a01b031615611984576001611987565b60005b60ff169050610f9d565b50600081815260036020526040902054610f9d565b6119b16113b4611da0565b8483811480156119c057508082145b611a11576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461149157858582818110611a2757fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110611a5257fe5b905060200201356001600160a01b0316878786818110611a6e57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611acb57600080fd5b505af1158015611adf573d6000803e3d6000fd5b50505050806001019050611a14565b6000611af982611d5a565b611b42576040805162461bcd60e51b8152602060048201526015602482015274125b9d995b9d1bdc9e4e881b9bdd08185b88139195605a1b604482015290519081900360640190fd5b610f9a826129b4565b611b566113b4611da0565b6117ee81612a0d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000611b97611da0565b90506001600160a01b038516611bf4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b611bfe86826121c1565b611c3d576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b611c468461220f565b15611c5c57611c5786868686612b41565b611c78565b611c6584611d5a565b1561105d57611c57868686866000612c57565b846001600160a01b0316866001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611ce7856001600160a01b0316612d7d565b15611cf957611cf98686868686612d83565b505050505050565b611d0c6113b4611da0565b600080546001600160a01b0319166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000600160ff1b821615801590610f9a5750506001600160e01b0316151590565b60006001600160e01b0319821663921ed8d160e01b1480610f9a5750610f9a82612ef4565b6000611daa612f78565b905090565b6001600160a01b03811660009081526007602052604090205460ff166117ee576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b038416611e71576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b825182518114611eb6576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008060005b838114611fa8576000878281518110611ed157fe5b602002602001015190506000878381518110611ee957fe5b60200260200101519050611efc8261220f565b15611f1157611f0c8a83836130d8565b611f9e565b611f1a82611d5a565b1561105d57611f2c8a838360016131c2565b6000611f37836129b4565b905085611f4a5780955060019450611f9c565b858114611f955760008681526002602090815260408083206001600160a01b038f16845282528083208054890190559782526003905295909520805490940190935560019284611f9c565b8460010194505b505b5050600101611ebc565b508115611fe85760008281526002602090815260408083206001600160a01b038b1684528252808320805485019055848352600390915290208054820190555b6001600160a01b0387166000611ffc611da0565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561206c578181015183820152602001612054565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156120ab578181015183820152602001612093565b5050505090500194505050505060405180910390a46120d2876001600160a01b0316612d7d565b156120e5576120e56000888888886132e1565b50505050505050565b606060066120fb83613446565b60405160200180838054600181600116156101000203166002900480156121595780601f10612137576101008083540402835291820191612159565b820191906000526020600020905b815481529060010190602001808311612145575b5050825160208401908083835b602083106121855780518252601f199092019160209182019101612166565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000816001600160a01b0316836001600160a01b0316148061220857506001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b600160ff1b161590565b80612263576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b0387168452909152902054818110156122db576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b03909716835295815285822092849003909255928352600390529190208054919091039055565b8160011461236c576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b038581169116146123d5576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b600083815260046020526040902061dead60f01b905580610fbe5760006123fb846129b4565b60008181526002602090815260408083206001600160a01b038a1684528252808320805460001990810190915593835260039091529020805490910190555050505050565b6001600160a01b03841661249b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b8251825181146124e0576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60006124ea611da0565b90506124f687826121c1565b612535576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146125fd57600088828151811061255057fe5b60200260200101519050600088838151811061256857fe5b6020026020010151905061257b8261220f565b156125915761258c8c8c8484612b41565b6125f3565b61259a82611d5a565b1561105d576125ad8c8c84846001612c57565b60006125b8836129b4565b9050856125cb57809550600194506125f1565b8581146125ea576125de8d8d8888613521565b809550600194506125f1565b8460010194505b505b505060010161253b565b5081156126105761261089898484613521565b876001600160a01b0316896001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561269557818101518382015260200161267d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156126d45781810151838201526020016126bc565b5050505090500194505050505060405180910390a46126fb886001600160a01b0316612d7d565b1561270d5761270d89898989896132e1565b505050505050505050565b600061272382611d5a565b15612775576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b0384166127e6576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b6127ef8361220f565b15612804576127ff8484846130d8565b61281f565b61280d83611d5a565b1561105d576127ff84848460006131c2565b6001600160a01b0384166000612833611da0565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a461288d846001600160a01b0316612d7d565b15610fbe57610fbe600085858585612d83565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128d957600080fd5b505afa1580156128ed573d6000803e3d6000fd5b505050506040513d602081101561290357600080fd5b50516001600160a01b038281169116146117ee576040805162461bcd60e51b815260206004820152601660248201527527bbb730b136329d103737ba103a34329037bbb732b960511b604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526129af908490613575565b505050565b6001600160e01b03191690565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b612a1681611d5a565b15612a68576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615612ad2576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b612ada611da0565b600082815260056020526040902080546001600160a01b0319166001600160a01b0392909216919091179055612b0f8161220f565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b80612b8b576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b038816845290915290205481811015612c03576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461111b5760009283526002602090815260408085206001600160a01b039788168652909152808420918390039091559290931681522080549091019055565b81600114612ca9576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b03868116911614612d12576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b03851690558061111b576000612d3c846129b4565b60009081526002602090815260408083206001600160a01b03998a168452909152808220805460001901905595909616865250505091208054600101905550565b3b151590565b63f23a6e6160e01b6001600160a01b03851663f23a6e61612da2611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612e1c578181015183820152602001612e04565b50505050905090810190601f168015612e495780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015612e6c57600080fd5b505af1158015612e80573d6000803e3d6000fd5b505050506040513d6020811015612e9657600080fd5b50516001600160e01b0319161461111b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60006001600160e01b031982166301ffc9a760e01b1480612f2557506001600160e01b03198216636cdb3d1360e11b145b80612f4057506001600160e01b031982166303a24d0760e21b145b80612f5b57506001600160e01b031982166304e72e2360e11b145b80610f9a5750506001600160e01b03191663bd85b03960e01b1490565b60003381612f84613758565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480612ff757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b156130055791506117d79050565b6001600160a01b03821632148015906130c457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561309757600080fd5b505afa1580156130ab573d6000803e3d6000fd5b505050506040513d60208110156130c157600080fd5b50515b156130d25791506117d79050565b50905090565b80613122576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b600082815260036020526040902054818101818111613188576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b81600114613214576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b60008381526004602052604090205415613275576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b038516905580610fbe57600061329f846129b4565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a168552909252909120805490910190555050505050565b63bc197c8160e01b6001600160a01b03851663bc197c81613300611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015613379578181015183820152602001613361565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156133b85781810151838201526020016133a0565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156133f45781810151838201526020016133dc565b50505050905090810190601f1680156134215780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015612e6c57600080fd5b60608161346b57506040805180820190915260018152600360fc1b6020820152610f9d565b8160005b811561348357600101600a8204915061346f565b60008167ffffffffffffffff8111801561349c57600080fd5b506040519080825280601f01601f1916602001820160405280156134c7576020820181803683370190505b50859350905060001982015b831561351857600a840660300160f81b828280600190039350815181106134f657fe5b60200101906001600160f81b031916908160001a905350600a840493506134d3565b50949350505050565b826001600160a01b0316846001600160a01b031614610fbe5760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b816135886001600160a01b038216612d7d565b6135d9576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106136165780518252601f1990920191602091820191016135f7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081156136fc578051156136f7578080602001905160208110156136a457600080fd5b50516136f7576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b61111b565b805161374f576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b60131936013560601c90565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261379a57600085556137e0565b82601f106137b35782800160ff198235161785556137e0565b828001600101855582156137e0579182015b828111156137e05782358255916020019190600101906137c5565b506137ec9291506137f0565b5090565b5b808211156137ec57600081556001016137f156fe496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000496e76656e746f72793a20696e636f6e73697374656e74206172726179730000a26469706673582212208f635348050ae875d7f3ba6d2ea489f83f6d79a22b048a98937551edf99e209064736f6c63430007060033000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c35760003560e01c806380534934116100f9578063bd85b03911610097578063d0011d9d11610071578063d0011d9d14610d70578063e985e9c514610d8d578063f242432a14610dbb578063f2fde38b14610e84576101c3565b8063bd85b03914610c28578063c3666c3614610c45578063c7778baa14610d53576101c3565b806398650275116100d35780639865027514610baf578063a22cb46514610bb7578063aa271e1a14610be5578063adebf6f214610c0b576101c3565b80638053493414610a4e5780638da5cb5b14610b81578063983b2d5614610b89576101c3565b8063510b5158116101665780635cfa9297116101405780635cfa9297146107f55780636352211e146108b557806373c8a958146108d25780637e518ec8146109e0576101c3565b8063510b51581461078e578063572b6c05146107c75780635b2bd79e146107ed576101c3565b80630e89341c116101a25780630e89341c146103fb578063124d91e51461048d5780632eb2c2d6146104bf5780634e1273f414610680576101c3565b8062fdd58e146101c857806301ffc9a7146102065780630d6a5bbb14610241575b600080fd5b6101f4600480360360408110156101de57600080fd5b506001600160a01b038135169060200135610eaa565b60408051918252519081900360200190f35b61022d6004803603602081101561021c57600080fd5b50356001600160e01b031916610f75565b604080519115158252519081900360200190f35b6103f96004803603608081101561025757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561028157600080fd5b82018360208201111561029357600080fd5b803590602001918460208302840111600160201b831117156102b457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561030357600080fd5b82018360208201111561031557600080fd5b803590602001918460208302840111600160201b8311171561033657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561038557600080fd5b82018360208201111561039757600080fd5b803590602001918460018302840111600160201b831117156103b857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fa2945050505050565b005b6104186004803603602081101561041157600080fd5b5035610fc4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045257818101518382015260200161043a565b50505050905090810190601f16801561047f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f9600480360360608110156104a357600080fd5b506001600160a01b038135169060208101359060400135610fcf565b6103f9600480360360a08110156104d557600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561050857600080fd5b82018360208201111561051a57600080fd5b803590602001918460208302840111600160201b8311171561053b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058a57600080fd5b82018360208201111561059c57600080fd5b803590602001918460208302840111600160201b831117156105bd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060c57600080fd5b82018360208201111561061e57600080fd5b803590602001918460018302840111600160201b8311171561063f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061110e945050505050565b61073e6004803603604081101561069657600080fd5b810190602081018135600160201b8111156106b057600080fd5b8201836020820111156106c257600080fd5b803590602001918460208302840111600160201b831117156106e357600080fd5b919390929091602081019035600160201b81111561070057600080fd5b82018360208201111561071257600080fd5b803590602001918460208302840111600160201b8311171561073357600080fd5b509092509050611122565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561077a578181015183820152602001610762565b505050509050019250505060405180910390f35b6107ab600480360360208110156107a457600080fd5b5035611216565b604080516001600160a01b039092168252519081900360200190f35b61022d600480360360208110156107dd57600080fd5b50356001600160a01b0316611221565b61041861129a565b6103f96004803603608081101561080b57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561084157600080fd5b82018360208201111561085357600080fd5b803590602001918460018302840111600160201b8311171561087457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611328945050505050565b6107ab600480360360208110156108cb57600080fd5b503561133f565b6103f9600480360360608110156108e857600080fd5b810190602081018135600160201b81111561090257600080fd5b82018360208201111561091457600080fd5b803590602001918460208302840111600160201b8311171561093557600080fd5b919390929091602081019035600160201b81111561095257600080fd5b82018360208201111561096457600080fd5b803590602001918460208302840111600160201b8311171561098557600080fd5b919390929091602081019035600160201b8111156109a257600080fd5b8201836020820111156109b457600080fd5b803590602001918460208302840111600160201b831117156109d557600080fd5b5090925090506113a9565b6103f9600480360360208110156109f657600080fd5b810190602081018135600160201b811115610a1057600080fd5b820183602082011115610a2257600080fd5b803590602001918460018302840111600160201b83111715610a4357600080fd5b50909250905061149b565b6103f960048036036060811015610a6457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610a8e57600080fd5b820183602082011115610aa057600080fd5b803590602001918460208302840111600160201b83111715610ac157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b1057600080fd5b820183602082011115610b2257600080fd5b803590602001918460208302840111600160201b83111715610b4357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611517945050505050565b6107ab6117ca565b6103f960048036036020811015610b9f57600080fd5b50356001600160a01b03166117da565b6103f96117f1565b6103f960048036036040811015610bcd57600080fd5b506001600160a01b038135169060200135151561184f565b61022d60048036036020811015610bfb57600080fd5b50356001600160a01b0316611930565b61022d60048036036020811015610c2157600080fd5b5035611945565b6101f460048036036020811015610c3e57600080fd5b5035611950565b6103f960048036036060811015610c5b57600080fd5b810190602081018135600160201b811115610c7557600080fd5b820183602082011115610c8757600080fd5b803590602001918460208302840111600160201b83111715610ca857600080fd5b919390929091602081019035600160201b811115610cc557600080fd5b820183602082011115610cd757600080fd5b803590602001918460208302840111600160201b83111715610cf857600080fd5b919390929091602081019035600160201b811115610d1557600080fd5b820183602082011115610d2757600080fd5b803590602001918460208302840111600160201b83111715610d4857600080fd5b5090925090506119a6565b6101f460048036036020811015610d6957600080fd5b5035611aee565b6103f960048036036020811015610d8657600080fd5b5035611b4b565b61022d60048036036040811015610da357600080fd5b506001600160a01b0381358116916020013516611b5f565b6103f9600480360360a0811015610dd157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610e1057600080fd5b820183602082011115610e2257600080fd5b803590602001918460018302840111600160201b83111715610e4357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b8d945050505050565b6103f960048036036020811015610e9a57600080fd5b50356001600160a01b0316611d01565b60006001600160a01b038316610f07576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b610f1082611d5a565b15610f4a576000828152600460205260409020546001600160a01b03848116911614610f3d576000610f40565b60015b60ff169050610f6f565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216630a216a2b60e31b1480610f9a5750610f9a82611d7b565b90505b919050565b610fb2610fad611da0565b611daf565b610fbe84848484611e1c565b50505050565b6060610f9a826120ee565b6000610fd9611da0565b9050610fe584826121c1565b611024576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b61102d8361220f565b156110425761103d848484612219565b6110aa565b61104b83611d5a565b1561105d5761103d848484600061231a565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b60006001600160a01b0316846001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a450505050565b61111b8585858585612440565b5050505050565b6060838214611166576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008467ffffffffffffffff8111801561117f57600080fd5b506040519080825280602002602001820160405280156111a9578160200160208202803683370190505b50905060005b80861461120c576111ed8787838181106111c557fe5b905060200201356001600160a01b03168686848181106111e157fe5b90506020020135610eaa565b8282815181106111f957fe5b60209081029190910101526001016111af565b5095945050505050565b6000610f9a82612718565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610f9a57507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b0316826001600160a01b0316149050919050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113205780601f106112f557610100808354040283529160200191611320565b820191906000526020600020905b81548152906001019060200180831161130357829003601f168201915b505050505081565b611333610fad611da0565b610fbe84848484612791565b6000818152600460205260408120546001600160a01b038116610f9a576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b6113b96113b4611da0565b6128a0565b8483811480156113c857508082145b611419576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114915761148988888381811061143257fe5b905060200201356001600160a01b031685858481811061144e57fe5b9050602002013588888581811061146157fe5b905060200201356001600160a01b03166001600160a01b031661295d9092919063ffffffff16565b60010161141c565b5050505050505050565b6114a66113b4611da0565b6114b260068383613764565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b81518151811461155c576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b6000611566611da0565b905061157285826121c1565b6115b1576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146116a55760008782815181106115cc57fe5b6020026020010151905060008783815181106115e457fe5b602002602001015190506115f78261220f565b1561160c576116078a8383612219565b61169b565b61161582611d5a565b1561105d576116278a8383600161231a565b6000611632836129b4565b9050856116455780955060019450611699565b8581146116925760008681526002602090815260408083206001600160a01b038f168452825280832080548990039055978252600390529590952080549490940390935560019284611699565b8460010194505b505b50506001016115b7565b5081156116e75760008281526002602090815260408083206001600160a01b038b16845282528083208054859003905584835260039091529020805482900390555b60006001600160a01b0316876001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561176d578181015183820152602001611755565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117ac578181015183820152602001611794565b5050505090500194505050505060405180910390a450505050505050565b6000546001600160a01b03165b90565b6117e56113b4611da0565b6117ee816129c1565b50565b60006117fb611da0565b905061180681611daf565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b6000611859611da0565b9050806001600160a01b0316836001600160a01b031614156118c2576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b60076020526000908152604090205460ff1681565b6000610f9a8261220f565b600061195b82611d5a565b15611991576000828152600460205260409020546001600160a01b031615611984576001611987565b60005b60ff169050610f9d565b50600081815260036020526040902054610f9d565b6119b16113b4611da0565b8483811480156119c057508082145b611a11576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461149157858582818110611a2757fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110611a5257fe5b905060200201356001600160a01b0316878786818110611a6e57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611acb57600080fd5b505af1158015611adf573d6000803e3d6000fd5b50505050806001019050611a14565b6000611af982611d5a565b611b42576040805162461bcd60e51b8152602060048201526015602482015274125b9d995b9d1bdc9e4e881b9bdd08185b88139195605a1b604482015290519081900360640190fd5b610f9a826129b4565b611b566113b4611da0565b6117ee81612a0d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000611b97611da0565b90506001600160a01b038516611bf4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b611bfe86826121c1565b611c3d576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b611c468461220f565b15611c5c57611c5786868686612b41565b611c78565b611c6584611d5a565b1561105d57611c57868686866000612c57565b846001600160a01b0316866001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611ce7856001600160a01b0316612d7d565b15611cf957611cf98686868686612d83565b505050505050565b611d0c6113b4611da0565b600080546001600160a01b0319166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000600160ff1b821615801590610f9a5750506001600160e01b0316151590565b60006001600160e01b0319821663921ed8d160e01b1480610f9a5750610f9a82612ef4565b6000611daa612f78565b905090565b6001600160a01b03811660009081526007602052604090205460ff166117ee576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b038416611e71576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b825182518114611eb6576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008060005b838114611fa8576000878281518110611ed157fe5b602002602001015190506000878381518110611ee957fe5b60200260200101519050611efc8261220f565b15611f1157611f0c8a83836130d8565b611f9e565b611f1a82611d5a565b1561105d57611f2c8a838360016131c2565b6000611f37836129b4565b905085611f4a5780955060019450611f9c565b858114611f955760008681526002602090815260408083206001600160a01b038f16845282528083208054890190559782526003905295909520805490940190935560019284611f9c565b8460010194505b505b5050600101611ebc565b508115611fe85760008281526002602090815260408083206001600160a01b038b1684528252808320805485019055848352600390915290208054820190555b6001600160a01b0387166000611ffc611da0565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561206c578181015183820152602001612054565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156120ab578181015183820152602001612093565b5050505090500194505050505060405180910390a46120d2876001600160a01b0316612d7d565b156120e5576120e56000888888886132e1565b50505050505050565b606060066120fb83613446565b60405160200180838054600181600116156101000203166002900480156121595780601f10612137576101008083540402835291820191612159565b820191906000526020600020905b815481529060010190602001808311612145575b5050825160208401908083835b602083106121855780518252601f199092019160209182019101612166565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000816001600160a01b0316836001600160a01b0316148061220857506001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b600160ff1b161590565b80612263576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b0387168452909152902054818110156122db576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b03909716835295815285822092849003909255928352600390529190208054919091039055565b8160011461236c576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b038581169116146123d5576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b600083815260046020526040902061dead60f01b905580610fbe5760006123fb846129b4565b60008181526002602090815260408083206001600160a01b038a1684528252808320805460001990810190915593835260039091529020805490910190555050505050565b6001600160a01b03841661249b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b8251825181146124e0576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60006124ea611da0565b90506124f687826121c1565b612535576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146125fd57600088828151811061255057fe5b60200260200101519050600088838151811061256857fe5b6020026020010151905061257b8261220f565b156125915761258c8c8c8484612b41565b6125f3565b61259a82611d5a565b1561105d576125ad8c8c84846001612c57565b60006125b8836129b4565b9050856125cb57809550600194506125f1565b8581146125ea576125de8d8d8888613521565b809550600194506125f1565b8460010194505b505b505060010161253b565b5081156126105761261089898484613521565b876001600160a01b0316896001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561269557818101518382015260200161267d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156126d45781810151838201526020016126bc565b5050505090500194505050505060405180910390a46126fb886001600160a01b0316612d7d565b1561270d5761270d89898989896132e1565b505050505050505050565b600061272382611d5a565b15612775576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b0384166127e6576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b6127ef8361220f565b15612804576127ff8484846130d8565b61281f565b61280d83611d5a565b1561105d576127ff84848460006131c2565b6001600160a01b0384166000612833611da0565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a461288d846001600160a01b0316612d7d565b15610fbe57610fbe600085858585612d83565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128d957600080fd5b505afa1580156128ed573d6000803e3d6000fd5b505050506040513d602081101561290357600080fd5b50516001600160a01b038281169116146117ee576040805162461bcd60e51b815260206004820152601660248201527527bbb730b136329d103737ba103a34329037bbb732b960511b604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526129af908490613575565b505050565b6001600160e01b03191690565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b612a1681611d5a565b15612a68576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615612ad2576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b612ada611da0565b600082815260056020526040902080546001600160a01b0319166001600160a01b0392909216919091179055612b0f8161220f565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b80612b8b576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b038816845290915290205481811015612c03576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461111b5760009283526002602090815260408085206001600160a01b039788168652909152808420918390039091559290931681522080549091019055565b81600114612ca9576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b03868116911614612d12576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b03851690558061111b576000612d3c846129b4565b60009081526002602090815260408083206001600160a01b03998a168452909152808220805460001901905595909616865250505091208054600101905550565b3b151590565b63f23a6e6160e01b6001600160a01b03851663f23a6e61612da2611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612e1c578181015183820152602001612e04565b50505050905090810190601f168015612e495780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015612e6c57600080fd5b505af1158015612e80573d6000803e3d6000fd5b505050506040513d6020811015612e9657600080fd5b50516001600160e01b0319161461111b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60006001600160e01b031982166301ffc9a760e01b1480612f2557506001600160e01b03198216636cdb3d1360e11b145b80612f4057506001600160e01b031982166303a24d0760e21b145b80612f5b57506001600160e01b031982166304e72e2360e11b145b80610f9a5750506001600160e01b03191663bd85b03960e01b1490565b60003381612f84613758565b90507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b0316826001600160a01b03161480612ff757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b156130055791506117d79050565b6001600160a01b03821632148015906130c457507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561309757600080fd5b505afa1580156130ab573d6000803e3d6000fd5b505050506040513d60208110156130c157600080fd5b50515b156130d25791506117d79050565b50905090565b80613122576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b600082815260036020526040902054818101818111613188576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b81600114613214576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b60008381526004602052604090205415613275576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b038516905580610fbe57600061329f846129b4565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a168552909252909120805490910190555050505050565b63bc197c8160e01b6001600160a01b03851663bc197c81613300611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015613379578181015183820152602001613361565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156133b85781810151838201526020016133a0565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156133f45781810151838201526020016133dc565b50505050905090810190601f1680156134215780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015612e6c57600080fd5b60608161346b57506040805180820190915260018152600360fc1b6020820152610f9d565b8160005b811561348357600101600a8204915061346f565b60008167ffffffffffffffff8111801561349c57600080fd5b506040519080825280601f01601f1916602001820160405280156134c7576020820181803683370190505b50859350905060001982015b831561351857600a840660300160f81b828280600190039350815181106134f657fe5b60200101906001600160f81b031916908160001a905350600a840493506134d3565b50949350505050565b826001600160a01b0316846001600160a01b031614610fbe5760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b816135886001600160a01b038216612d7d565b6135d9576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106136165780518252601f1990920191602091820191016135f7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081156136fc578051156136f7578080602001905160208110156136a457600080fd5b50516136f7576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b61111b565b805161374f576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b60131936013560601c90565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261379a57600085556137e0565b82601f106137b35782800160ff198235161785556137e0565b828001600101855582156137e0579182015b828111156137e05782358255916020019190600101906137c5565b506137ec9291506137f0565b5090565b5b808211156137ec57600081556001016137f156fe496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000496e76656e746f72793a20696e636f6e73697374656e74206172726179730000a26469706673582212208f635348050ae875d7f3ba6d2ea489f83f6d79a22b048a98937551edf99e209064736f6c63430007060033

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

000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : forwarderRegistry (address): 0xB87EbEB1f4aA317bd3eEc04704D3fFD6e3BC4b8f
Arg [1] : universalForwarder (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

65689:3427:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38761:328;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38761:328:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;66278:214;;;;;;;;;;;;;;;;-1:-1:-1;66278:214:0;-1:-1:-1;;;;;;66278:214:0;;:::i;:::-;;;;;;;;;;;;;;;;;;68336:263;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68336:263:0;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68336:263:0;;;;;;;;-1:-1:-1;68336:263:0;;-1:-1:-1;;;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68336:263:0;;;;;;;;-1:-1:-1;68336:263:0;;-1:-1:-1;;;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68336:263:0;;-1:-1:-1;68336:263:0;;-1:-1:-1;;;;;68336:263:0:i;:::-;;66672:114;;;;;;;;;;;;;;;;-1:-1:-1;66672:114:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55427:572;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;55427:572:0;;;;;;;;;;;;;:::i;46435:329::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46435:329:0;;;;;;;;-1:-1:-1;46435:329:0;;-1:-1:-1;;;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46435:329:0;;;;;;;;-1:-1:-1;46435:329:0;;-1:-1:-1;;;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46435:329:0;;-1:-1:-1;46435:329:0;;-1:-1:-1;;;;;46435:329:0:i;39136:445::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;-1:-1:-1;39136:445:0;;-1:-1:-1;39136:445:0;-1:-1:-1;39136:445:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66971:128;;;;;;;;;;;;;;;;-1:-1:-1;66971:128:0;;:::i;:::-;;;;-1:-1:-1;;;;;66971:128:0;;;;;;;;;;;;;;12643:195;;;;;;;;;;;;;;;;-1:-1:-1;12643:195:0;-1:-1:-1;;;;;12643:195:0;;:::i;63611:29::-;;;:::i;67997:231::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67997:231:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67997:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67997:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67997:231:0;;-1:-1:-1;67997:231:0;;-1:-1:-1;;;;;67997:231:0:i;40740:239::-;;;;;;;;;;;;;;;;-1:-1:-1;40740:239:0;;:::i;8738:492::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;-1:-1:-1;8738:492:0;;-1:-1:-1;8738:492:0;-1:-1:-1;8738:492:0;:::i;63649:218::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63649:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63649:218:0;;;;;;;;;;-1:-1:-1;63649:218:0;;-1:-1:-1;63649:218:0;-1:-1:-1;63649:218:0;:::i;56054:1804::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56054:1804:0;;;;;;;;;;;;;;;-1:-1:-1;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56054:1804:0;;;;;;;;-1:-1:-1;56054:1804:0;;-1:-1:-1;;;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56054:1804:0;;-1:-1:-1;56054:1804:0;;-1:-1:-1;;;;;56054:1804:0:i;3093:96::-;;;:::i;64776:123::-;;;;;;;;;;;;;;;;-1:-1:-1;64776:123:0;-1:-1:-1;;;;;64776:123:0;;:::i;65020:190::-;;;:::i;39619:306::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39619:306:0;;;;;;;;;;:::i;64407:40::-;;;;;;;;;;;;;;;;-1:-1:-1;64407:40:0;-1:-1:-1;;;;;64407:40:0;;:::i;40307:124::-;;;;;;;;;;;;;;;;-1:-1:-1;40307:124:0;;:::i;41168:267::-;;;;;;;;;;;;;;;;-1:-1:-1;41168:267:0;;:::i;10056:522::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;-1:-1:-1;10056:522:0;;-1:-1:-1;10056:522:0;-1:-1:-1;10056:522:0;:::i;40478:215::-;;;;;;;;;;;;;;;;-1:-1:-1;40478:215:0;;:::i;67609:149::-;;;;;;;;;;;;;;;;-1:-1:-1;67609:149:0;;:::i;39963:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39963:166:0;;;;;;;;;;:::i;45577:811::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45577:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45577:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45577:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45577:811:0;;-1:-1:-1;45577:811:0;;-1:-1:-1;;;;;45577:811:0:i;3436:201::-;;;;;;;;;;;;;;;;-1:-1:-1;3436:201:0;-1:-1:-1;;;;;3436:201:0;;:::i;38761:328::-;38845:7;-1:-1:-1;;;;;38873:19:0;;38865:55;;;;;-1:-1:-1;;;38865:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38937:23;:2;:21;:23::i;:::-;38933:109;;;39000:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;38984:38:0;;;;;;:46;;39029:1;38984:46;;;39025:1;38984:46;38977:53;;;;;;38933:109;-1:-1:-1;39061:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;39061:20:0;;;;;;;;;;38761:328;;;;;:::o;66278:214::-;66363:4;-1:-1:-1;;;;;;66387:57:0;;-1:-1:-1;;;66387:57:0;;:97;;;66448:36;66472:11;66448:23;:36::i;:::-;66380:104;;66278:214;;;;:::o;68336:263::-;68515:28;68530:12;:10;:12::i;:::-;68515:14;:28::i;:::-;68554:37;68569:2;68573:3;68578:6;68586:4;68554:14;:37::i;:::-;68336:263;;;;:::o;66672:114::-;66737:13;66770:8;66775:2;66770:4;:8::i;55427:572::-;55555:14;55572:12;:10;:12::i;:::-;55555:29;;55603:27;55617:4;55623:6;55603:13;:27::i;:::-;55595:70;;;;;-1:-1:-1;;;55595:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55595:70:0;;;;;;;;;;;;;;;55682:20;:2;:18;:20::i;:::-;55678:245;;;55719:30;55733:4;55739:2;55743:5;55719:13;:30::i;:::-;55678:245;;;55771:23;:2;:21;:23::i;:::-;55767:156;;;55811:32;55820:4;55826:2;55830:5;55837;55811:8;:32::i;55767:156::-;55876:35;;;-1:-1:-1;;;55876:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;55767:156;55977:1;-1:-1:-1;;;;;55940:51:0;55963:4;-1:-1:-1;;;;;55940:51:0;55955:6;-1:-1:-1;;;;;55940:51:0;;55981:2;55985:5;55940:51;;;;;;;;;;;;;;;;;;;;;;;;55427:572;;;;:::o;46435:329::-;46705:51;46728:4;46734:2;46738:3;46743:6;46751:4;46705:22;:51::i;:::-;46435:329;;;;;:::o;39136:445::-;39251:16;39288:27;;;39280:70;;;;;-1:-1:-1;;;39280:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39280:70:0;;;;;;;;;;;;;;;39363:25;39405:6;39391:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39391:28:0;;39363:56;;39437:9;39432:114;39452:18;;;39432:114;;39506:28;39516:6;;39523:1;39516:9;;;;;;;;;;;;;-1:-1:-1;;;;;39516:9:0;39527:3;;39531:1;39527:6;;;;;;;;;;;;;39506:9;:28::i;:::-;39492:8;39501:1;39492:11;;;;;;;;;;;;;;;;;:42;39472:3;;39432:114;;;-1:-1:-1;39565:8:0;39136:445;-1:-1:-1;;;;;39136:445:0:o;66971:128::-;67042:7;67069:22;67078:12;67069:8;:22::i;12643:195::-;12730:4;12767:19;-1:-1:-1;;;;;12754:32:0;:9;-1:-1:-1;;;;;12754:32:0;;:76;;;;12811:18;-1:-1:-1;;;;;12790:40:0;:9;-1:-1:-1;;;;;12790:40:0;;12747:83;;12643:195;;;:::o;63611:29::-;;;;;;;;;;;;;;;-1:-1:-1;;63611:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67997:231::-;68151:28;68166:12;:10;:12::i;68151:28::-;68190:30;68200:2;68204;68208:5;68215:4;68190:9;:30::i;40740:239::-;40810:7;40862:14;;;:7;:14;;;;;;-1:-1:-1;;;;;40897:19:0;;40889:59;;;;;-1:-1:-1;;;40889:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8738:492;8907:31;8925:12;:10;:12::i;:::-;8907:17;:31::i;:::-;8966:8;9000:23;;;:51;;;;-1:-1:-1;9027:24:0;;;9000:51;8992:90;;;;;-1:-1:-1;;;8992:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9098:9;9093:130;9118:6;9113:1;:11;9093:130;;9146:65;9187:8;;9196:1;9187:11;;;;;;;;;;;;;-1:-1:-1;;;;;9187:11:0;9200:7;;9208:1;9200:10;;;;;;;;;;;;;9160:6;;9167:1;9160:9;;;;;;;;;;;;;-1:-1:-1;;;;;9160:9:0;-1:-1:-1;;;;;9146:40:0;;;:65;;;;;:::i;:::-;9126:3;;9093:130;;;;8738:492;;;;;;;:::o;63649:218::-;63731:31;63749:12;:10;:12::i;63731:31::-;63773:34;:15;63791:16;;63773:34;:::i;:::-;;63823:36;63842:16;;63823:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63823:36:0;;;;;;;;-1:-1:-1;63823:36:0;;-1:-1:-1;;;;63823:36:0;63649:218;;:::o;56054:1804::-;56224:10;;56263:13;;56253:23;;56245:66;;;;;-1:-1:-1;;;56245:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;56245:66:0;;;;;;;;;;;;;;;56324:14;56341:12;:10;:12::i;:::-;56324:29;;56372:27;56386:4;56392:6;56372:13;:27::i;:::-;56364:70;;;;;-1:-1:-1;;;56364:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;56364:70:0;;;;;;;;;;;;;;;56447:22;56480:25;56521:9;56516:1088;56537:6;56532:1;:11;56516:1088;;56565:10;56578:3;56582:1;56578:6;;;;;;;;;;;;;;56565:19;;56599:13;56615:6;56622:1;56615:9;;;;;;;;;;;;;;56599:25;;56643:20;:2;:18;:20::i;:::-;56639:954;;;56684:30;56698:4;56704:2;56708:5;56684:13;:30::i;:::-;56639:954;;;56740:23;:2;:21;:23::i;:::-;56736:857;;;56784:31;56793:4;56799:2;56803:5;56810:4;56784:8;:31::i;:::-;56834:24;56861:29;:2;:27;:29::i;:::-;56834:56;-1:-1:-1;56913:19:0;56909:593;;56974:16;56957:33;;57033:1;57013:21;;56909:593;;;57107:14;57087:16;:34;57083:400;;57150:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;57150:31:0;;;;;;;;;:52;;;;;;;57229:25;;;:9;:25;;;;;;:46;;;;;;;;;-1:-1:-1;;57319:16:0;57083:400;;;57440:19;;;;;57083:400;56736:857;;-1:-1:-1;;56545:3:0;;56516:1088;;;-1:-1:-1;57620:19:0;;57616:165;;57656:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;57656:31:0;;;;;;;;;:52;;;;;;;57723:25;;;:9;:25;;;;;:46;;;;;;;57616:165;57834:1;-1:-1:-1;;;;;57798:52:0;57820:4;-1:-1:-1;;;;;57798:52:0;57812:6;-1:-1:-1;;;;;57798:52:0;;57838:3;57843:6;57798:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56054:1804;;;;;;;:::o;3093:96::-;3148:7;3175:6;-1:-1:-1;;;;;3175:6:0;3093:96;;:::o;64776:123::-;64830:31;64848:12;:10;:12::i;64830:31::-;64872:19;64883:7;64872:10;:19::i;:::-;64776:123;:::o;65020:190::-;65064:15;65082:12;:10;:12::i;:::-;65064:30;;65105:23;65120:7;65105:14;:23::i;:::-;-1:-1:-1;;;;;65139:17:0;;65159:5;65139:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;65139:25:0;;;65180:22;;;65159:5;65180:22;65020:190;:::o;39619:306::-;39714:14;39731:12;:10;:12::i;:::-;39714:29;;39774:6;-1:-1:-1;;;;;39762:18:0;:8;-1:-1:-1;;;;;39762:18:0;;;39754:55;;;;;-1:-1:-1;;;39754:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39820:18:0;;;;;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;;:39;;-1:-1:-1;;39820:39:0;;;;;;;;;;39875:42;;;;;;;;;;;;;;;;;39619:306;;;:::o;64407:40::-;;;;;;;;;;;;;;;:::o;40307:124::-;40379:4;40403:20;:2;:18;:20::i;41168:267::-;41241:7;41265:23;:2;:21;:23::i;:::-;41261:167;;;41353:1;41328:11;;;:7;:11;;;;;;-1:-1:-1;;;;;41312:43:0;;:51;;41362:1;41312:51;;;41358:1;41312:51;41305:58;;;;;;41261:167;-1:-1:-1;41403:13:0;;;;:9;:13;;;;;;41396:20;;10056:522;10230:31;10248:12;:10;:12::i;10230:31::-;10289:8;10323:26;;;:55;;;;-1:-1:-1;10353:25:0;;;10323:55;10315:94;;;;;-1:-1:-1;;;10315:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10425:9;10420:151;10445:6;10440:1;:11;10420:151;;10492:9;;10502:1;10492:12;;;;;;;;;;;;;-1:-1:-1;;;;;10492:12:0;-1:-1:-1;;;;;10473:45:0;;10527:4;10534:8;;10543:1;10534:11;;;;;;;;;;;;;-1:-1:-1;;;;;10534:11:0;10547:8;;10556:1;10547:11;;;;;;;;;;;;;10473:86;;;;;;;;;;;;;-1:-1:-1;;;;;10473:86:0;;;;;;-1:-1:-1;;;;;10473:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10453:3;;;;;10420:151;;40478:215;40555:7;40583:26;:5;:24;:26::i;:::-;40575:60;;;;;-1:-1:-1;;;40575:60:0;;;;;;;;;;;;-1:-1:-1;;;40575:60:0;;;;;;;;;;;;;;;40653:32;:5;:30;:32::i;67609:149::-;67677:31;67695:12;:10;:12::i;67677:31::-;67719;67737:12;67719:17;:31::i;39963:166::-;-1:-1:-1;;;;;40089:22:0;;;40065:4;40089:22;;;:10;:22;;;;;;;;:32;;;;;;;;;;;;;;;39963:166::o;45577:811::-;45762:14;45779:12;:10;:12::i;:::-;45762:29;-1:-1:-1;;;;;;45810:16:0;;45802:56;;;;;-1:-1:-1;;;45802:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45877:27;45891:4;45897:6;45877:13;:27::i;:::-;45869:70;;;;;-1:-1:-1;;;45869:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;45869:70:0;;;;;;;;;;;;;;;45956:20;:2;:18;:20::i;:::-;45952:261;;;45993:38;46011:4;46017:2;46021;46025:5;45993:17;:38::i;:::-;45952:261;;;46053:23;:2;:21;:23::i;:::-;46049:164;;;46093:40;46106:4;46112:2;46116;46120:5;46127;46093:12;:40::i;46049:164::-;46259:2;-1:-1:-1;;;;;46230:43:0;46253:4;-1:-1:-1;;;;;46230:43:0;46245:6;-1:-1:-1;;;;;46230:43:0;;46263:2;46267:5;46230:43;;;;;;;;;;;;;;;;;;;;;;;;46288:15;:2;-1:-1:-1;;;;;46288:13:0;;:15::i;:::-;46284:97;;;46320:49;46343:4;46349:2;46353;46357:5;46364:4;46320:22;:49::i;:::-;45577:811;;;;;;:::o;3436:201::-;3516:31;3534:12;:10;:12::i;3516:31::-;3558:6;:17;;-1:-1:-1;;;;;;3558:17:0;-1:-1:-1;;;;;3558:17:0;;;;;;;;;3591:38;;3558:17;;3612:6;;;3591:38;;3558:6;3591:38;3436:201;:::o;17841:140::-;17904:4;-1:-1:-1;;;17928:12:0;;:17;;;;:45;;-1:-1:-1;;;;;;;17949:19:0;:24;;;17841:140::o;55026:215::-;55111:4;-1:-1:-1;;;;;;55135:58:0;;-1:-1:-1;;;55135:58:0;;:98;;;55197:36;55221:11;55197:23;:36::i;68738:185::-;68843:15;68878:37;:35;:37::i;:::-;68871:44;;68738:185;:::o;65218:128::-;-1:-1:-1;;;;;65292:17:0;;;;;;:8;:17;;;;;;;;65284:54;;;;;-1:-1:-1;;;65284:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;49500:1880;-1:-1:-1;;;;;49681:16:0;;49673:52;;;;;-1:-1:-1;;;49673:52:0;;;;;;;;;;;;-1:-1:-1;;;49673:52:0;;;;;;;;;;;;;;;49753:10;;49792:13;;49782:23;;49774:66;;;;;-1:-1:-1;;;49774:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;49774:66:0;;;;;;;;;;;;;;;49853:22;49886:25;49927:9;49922:1082;49943:6;49938:1;:11;49922:1082;;49971:10;49984:3;49988:1;49984:6;;;;;;;;;;;;;;49971:19;;50005:13;50021:6;50028:1;50021:9;;;;;;;;;;;;;;50005:25;;50049:20;:2;:18;:20::i;:::-;50045:948;;;50090:28;50104:2;50108;50112:5;50090:13;:28::i;:::-;50045:948;;;50144:23;:2;:21;:23::i;:::-;50140:853;;;50188:29;50197:2;50201;50205:5;50212:4;50188:8;:29::i;:::-;50236:24;50263:29;:2;:27;:29::i;:::-;50236:56;-1:-1:-1;50315:19:0;50311:591;;50376:16;50359:33;;50435:1;50415:21;;50311:591;;;50509:14;50489:16;:34;50485:398;;50552:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;50552:29:0;;;;;;;;;:50;;;;;;50629:25;;;:9;:25;;;;;;:46;;;;;;;;-1:-1:-1;;50719:16:0;50485:398;;;50840:19;;;;;50485:398;50140:853;;-1:-1:-1;;49951:3:0;;49922:1082;;;-1:-1:-1;51020:19:0;;51016:163;;51056:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;51056:29:0;;;;;;;;;:50;;;;;;51121:25;;;:9;:25;;;;;:46;;;;;;51016:163;-1:-1:-1;;;;;51196:56:0;;51232:1;51210:12;:10;:12::i;:::-;-1:-1:-1;;;;;51196:56:0;;51240:3;51245:6;51196:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51267:15;:2;-1:-1:-1;;;;;51267:13:0;;:15::i;:::-;51263:110;;;51299:62;51335:1;51339:2;51343:3;51348:6;51356:4;51299:27;:62::i;:::-;49500:1880;;;;;;;:::o;63875:161::-;63932:13;63989:15;64006:20;:2;:18;:20::i;:::-;63972:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63972:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63972:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63958:70;;63875:161;;;:::o;42926:160::-;43010:4;43043:6;-1:-1:-1;;;;;43035:14:0;:4;-1:-1:-1;;;;;43035:14:0;;43034:44;;;-1:-1:-1;;;;;;43054:16:0;;;;;;;:10;:16;;;;;;;;:24;;;;;;;;;;;;43034:44;43027:51;42926:160;-1:-1:-1;;;42926:160:0:o;17724:109::-;-1:-1:-1;;;17808:12:0;:17;;17724:109::o;57997:397::-;58123:10;58115:44;;;;;-1:-1:-1;;;58115:44:0;;;;;;;;;;;;-1:-1:-1;;;58115:44:0;;;;;;;;;;;;;;;58170:15;58188:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;58188:19:0;;;;;;;;;;58226:16;;;;58218:58;;;;;-1:-1:-1;;;58218:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58287:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;58287:19:0;;;;;;;;;;;58309:15;;;;58287:37;;;58364:13;;;:9;:13;;;;;:22;;;;;;;;57997:397::o;58402:618::-;58546:5;58555:1;58546:10;58538:49;;;;;-1:-1:-1;;;58538:49:0;;;;;;;;;;;;-1:-1:-1;;;58538:49:0;;;;;;;;;;;;;;;58630:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;58606:37:0;;;;;;58598:74;;;;;-1:-1:-1;;;58598:74:0;;;;;;;;;;;;-1:-1:-1;;;58598:74:0;;;;;;;;;;;;;;;58683:11;;;;:7;:11;;;;;-1:-1:-1;;;58683:30:0;;58731:7;58726:287;;58755:20;58778:29;:2;:27;:29::i;:::-;58899:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;58899:29:0;;;;;;;;;58897:31;;-1:-1:-1;;58897:31:0;;;;;;58978:23;;;:9;:23;;;;;58976:25;;;;;;;-1:-1:-1;58402:618:0;;;;:::o;46903:1942::-;-1:-1:-1;;;;;47107:16:0;;47099:56;;;;;-1:-1:-1;;;47099:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47183:10;;47222:13;;47212:23;;47204:66;;;;;-1:-1:-1;;;47204:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47204:66:0;;;;;;;;;;;;;;;47281:14;47298:12;:10;:12::i;:::-;47281:29;;47329:27;47343:4;47349:6;47329:13;:27::i;:::-;47321:70;;;;;-1:-1:-1;;;47321:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47321:70:0;;;;;;;;;;;;;;;47404:22;47437:25;47478:9;47473:1052;47494:6;47489:1;:11;47473:1052;;47522:10;47535:3;47539:1;47535:6;;;;;;;;;;;;;;47522:19;;47556:13;47572:6;47579:1;47572:9;;;;;;;;;;;;;;47556:25;;47600:20;:2;:18;:20::i;:::-;47596:918;;;47641:38;47659:4;47665:2;47669;47673:5;47641:17;:38::i;:::-;47596:918;;;47705:23;:2;:21;:23::i;:::-;47701:813;;;47749:39;47762:4;47768:2;47772;47776:5;47783:4;47749:12;:39::i;:::-;47807:24;47834:29;:2;:27;:29::i;:::-;47807:56;-1:-1:-1;47886:19:0;47882:541;;47947:16;47930:33;;48006:1;47986:21;;47882:541;;;48080:14;48060:16;:34;48056:348;;48123:73;48152:4;48158:2;48162:14;48178:17;48123:28;:73::i;:::-;48240:16;48223:33;;48303:1;48283:21;;48056:348;;;48361:19;;;;;48056:348;47701:813;;-1:-1:-1;;47502:3:0;;47473:1052;;;-1:-1:-1;48541:19:0;;48537:125;;48577:73;48606:4;48612:2;48616:14;48632:17;48577:28;:73::i;:::-;48707:2;-1:-1:-1;;;;;48679:44:0;48701:4;-1:-1:-1;;;;;48679:44:0;48693:6;-1:-1:-1;;;;;48679:44:0;;48711:3;48716:6;48679:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48738:15;:2;-1:-1:-1;;;;;48738:13:0;;:15::i;:::-;48734:104;;;48770:56;48798:4;48804:2;48808:3;48813:6;48821:4;48770:27;:56::i;:::-;46903:1942;;;;;;;;;:::o;42280:214::-;42351:7;42380:33;:12;:31;:33::i;:::-;42379:34;42371:74;;;;;-1:-1:-1;;;42371:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42463:23:0;;;;:9;:23;;;;;;-1:-1:-1;;;;;42463:23:0;;42280:214::o;48853:639::-;-1:-1:-1;;;;;49001:16:0;;48993:52;;;;;-1:-1:-1;;;48993:52:0;;;;;;;;;;;;-1:-1:-1;;;48993:52:0;;;;;;;;;;;;;;;49062:20;:2;:18;:20::i;:::-;49058:241;;;49099:28;49113:2;49117;49121:5;49099:13;:28::i;:::-;49058:241;;;49149:23;:2;:21;:23::i;:::-;49145:154;;;49189:30;49198:2;49202;49206:5;49213;49189:8;:30::i;49145:154::-;-1:-1:-1;;;;;49316:55:0;;49353:1;49331:12;:10;:12::i;:::-;-1:-1:-1;;;;;49316:55:0;;49361:2;49365:5;49316:55;;;;;;;;;;;;;;;;;;;;;;;;49386:15;:2;-1:-1:-1;;;;;49386:13:0;;:15::i;:::-;49382:103;;;49418:55;49449:1;49453:2;49457;49461:5;49468:4;49418:22;:55::i;3768:138::-;3859:4;-1:-1:-1;;;;;3859:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3859:12:0;-1:-1:-1;;;;;3848:23:0;;;;;;3840:58;;;;;-1:-1:-1;;;3840:58:0;;;;;;;;;;;;-1:-1:-1;;;3840:58:0;;;;;;;;;;;;;;5731:229;5893:58;;;-1:-1:-1;;;;;5893:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5893:58:0;-1:-1:-1;;;5893:58:0;;;5858:94;;5886:5;;5858:27;:94::i;:::-;5731:229;;;:::o;17989:134::-;-1:-1:-1;;;;;;18088:27:0;;17989:134::o;65354:125::-;-1:-1:-1;;;;;65411:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;65411:24:0;65431:4;65411:24;;;65451:20;;;65411:17;65451:20;65354:125;:::o;41894:378::-;41980:33;:12;:31;:33::i;:::-;41979:34;41971:74;;;;;-1:-1:-1;;;41971:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42099:1;42064:23;;;:9;:23;;;;;;-1:-1:-1;;;;;42064:23:0;:37;42056:80;;;;;-1:-1:-1;;;42056:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42173:12;:10;:12::i;:::-;42147:23;;;;:9;:23;;;;;:38;;-1:-1:-1;;;;;;42147:38:0;-1:-1:-1;;;;;42147:38:0;;;;;;;;;;42233:30;42147:23;42233:28;:30::i;:::-;42201:63;;42219:12;42201:63;;;;;;;;;;41894:378;:::o;52729:501::-;52880:10;52872:44;;;;;-1:-1:-1;;;52872:44:0;;;;;;;;;;;;-1:-1:-1;;;52872:44:0;;;;;;;;;;;;;;;52927:15;52945:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;52945:19:0;;;;;;;;;;52983:16;;;;52975:58;;;;;-1:-1:-1;;;52975:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53056:2;-1:-1:-1;;;;;53048:10:0;:4;-1:-1:-1;;;;;53048:10:0;;53044:179;;53075:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;53075:19:0;;;;;;;;;;;53097:15;;;;53075:37;;;53185:17;;;;;;;:26;;;;;;;52729:501::o;53238:679::-;53407:5;53416:1;53407:10;53399:49;;;;;-1:-1:-1;;;53399:49:0;;;;;;;;;;;;-1:-1:-1;;;53399:49:0;;;;;;;;;;;;;;;53491:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;53467:37:0;;;;;;53459:74;;;;;-1:-1:-1;;;53459:74:0;;;;;;;;;;;;-1:-1:-1;;;53459:74:0;;;;;;;;;;;;;;;53544:11;;;;:7;:11;;;;;-1:-1:-1;;;;;53558:20:0;;53544:34;;53594:7;53589:321;;53618:20;53641:29;:2;:27;:29::i;:::-;53759:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;53759:29:0;;;;;;;;;;;:34;;-1:-1:-1;;53759:34:0;;;53866:27;;;;;;-1:-1:-1;;;53866:27:0;;:32;;-1:-1:-1;53866:32:0;;;-1:-1:-1;53238:679:0:o;4920:387::-;5243:20;5291:8;;;4920:387::o;43569:325::-;-1:-1:-1;;;;;;;;43753:43:0;;37120:10;43797:12;:10;:12::i;:::-;43811:4;43817:2;43821:5;43828:4;43753:80;;;;;;;;;;;;;-1:-1:-1;;;;;43753:80:0;;;;;;-1:-1:-1;;;;;43753:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43753:80:0;-1:-1:-1;;;;;;43753:101:0;;43745:141;;;;;-1:-1:-1;;;43745:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;38132:451;38217:4;-1:-1:-1;;;;;;38254:40:0;;-1:-1:-1;;;38254:40:0;;:98;;-1:-1:-1;;;;;;;38311:41:0;;-1:-1:-1;;;38311:41:0;38254:98;:167;;;-1:-1:-1;;;;;;;38369:52:0;;-1:-1:-1;;;38369:52:0;38254:167;:243;;;-1:-1:-1;;;;;;;38438:59:0;;-1:-1:-1;;;38438:59:0;38254:243;:321;;;-1:-1:-1;;;;;;;;38514:61:0;-1:-1:-1;;;38514:61:0;;38132:451::o;12846:922::-;12899:15;12955:10;12899:15;13001:27;:25;:27::i;:::-;12976:52;;13064:18;-1:-1:-1;;;;;13043:40:0;:9;-1:-1:-1;;;;;13043:40:0;;:76;;;;13100:19;-1:-1:-1;;;;;13087:32:0;:9;-1:-1:-1;;;;;13087:32:0;;13043:76;13039:169;;;13190:6;-1:-1:-1;13183:13:0;;-1:-1:-1;13183:13:0;13039:169;-1:-1:-1;;;;;13612:22:0;;13625:9;13612:22;;;;:78;;;13638:18;-1:-1:-1;;;;;13638:33:0;;13672:6;13680:9;13638:52;;;;;;;;;;;;;-1:-1:-1;;;;;13638:52:0;;;;;;-1:-1:-1;;;;;13638:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13638:52:0;13612:78;13608:124;;;13714:6;-1:-1:-1;13707:13:0;;-1:-1:-1;13707:13:0;13608:124;-1:-1:-1;13751:9:0;-1:-1:-1;12846:922:0;:::o;51519:488::-;51643:10;51635:44;;;;;-1:-1:-1;;;51635:44:0;;;;;;;;;;;;-1:-1:-1;;;51635:44:0;;;;;;;;;;;;;;;51690:14;51707:13;;;:9;:13;;;;;;51751:14;;;51784:18;;;51776:57;;;;;-1:-1:-1;;;51776:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51844:13;;;;:9;:13;;;;;;;;:25;;;;51973:9;:13;;;;;-1:-1:-1;;;;;51973:17:0;;;;;;;;;-1:-1:-1;51973:17:0;;;:26;;;;;;;51519:488::o;52015:706::-;52157:5;52166:1;52157:10;52149:49;;;;;-1:-1:-1;;;52149:49:0;;;;;;;;;;;;-1:-1:-1;;;52149:49:0;;;;;;;;;;;;;;;52217:11;;;;:7;:11;;;;;;:16;52209:58;;;;;-1:-1:-1;;;52209:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52280:11;;;;:7;:11;;;;;-1:-1:-1;;;;;52294:20:0;;52280:34;;52332:7;52327:387;;52356:20;52379:29;:2;:27;:29::i;:::-;52577:23;;;;:9;:23;;;;;;;;52575:25;;;;;;;;;52675:9;:23;;;;;-1:-1:-1;;;;;52675:27:0;;;;;;;;;;52673:29;;;;;;;-1:-1:-1;52015:706:0;;;;:::o;44390:400::-;-1:-1:-1;;;;;;;;44613:48:0;;37285:10;44662:12;:10;:12::i;:::-;44676:4;44682:3;44687:6;44695:4;44613:87;;;;;;;;;;;;;-1:-1:-1;;;;;44613:87:0;;;;;;-1:-1:-1;;;;;44613:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62732:564;62795:13;62825:10;62821:53;;-1:-1:-1;62852:10:0;;;;;;;;;;;;-1:-1:-1;;;62852:10:0;;;;;;62821:53;62899:5;62884:12;62940:78;62947:9;;62940:78;;62973:8;;63004:2;62996:10;;;;62940:78;;;63028:19;63060:6;63050:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63050:17:0;-1:-1:-1;63122:5:0;;-1:-1:-1;63028:39:0;-1:-1:-1;;;63094:10:0;;63138:119;63145:9;;63138:119;;63215:2;63208:4;:9;63202:2;:16;63189:31;;63171:6;63178:7;;;;;;;63171:15;;;;;;;;;;;:49;-1:-1:-1;;;;;63171:49:0;;;;;;;;-1:-1:-1;63243:2:0;63235:10;;;;63138:119;;;-1:-1:-1;63281:6:0;62732:564;-1:-1:-1;;;;62732:564:0:o;53925:446::-;54110:2;-1:-1:-1;;;;;54102:10:0;:4;-1:-1:-1;;;;;54102:10:0;;54098:266;;54203:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;54203:29:0;;;;;;;;;;;:39;;;;;;;54315:27;;;;;;;:37;;;;;;;53925:446::o;6487:892::-;6613:5;6638:19;-1:-1:-1;;;;;6638:17:0;;;:19::i;:::-;6630:58;;;;;-1:-1:-1;;;6630:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6762:12;6776:17;6797:6;-1:-1:-1;;;;;6797:11:0;6809:8;6797:21;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6797:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6761:57;;;;6833:7;6829:543;;;6861:11;;:16;6857:124;;6917:4;6906:24;;;;;;;;;;;;;;;-1:-1:-1;6906:24:0;6898:67;;;;;-1:-1:-1;;;6898:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6829:543;;;7072:11;;7068:97;;7109:40;;;-1:-1:-1;;;7109:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7068:97;7296:4;7290:11;7341:4;7334;7330:2;7326:13;7319:27;10969:526;-1:-1:-1;;11456:14:0;11452:23;11439:37;11435:2;11431:46;;11406:82::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://8f635348050ae875d7f3ba6d2ea489f83f6d79a22b048a98937551edf99e2090

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Benji Bananas is a free-to-play mobile game from Animoca Brands available for download on the App Store and Google Play.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.