ETH Price: $1,960.58 (-2.38%)
 

Overview

Max Total Supply

2,666,643.503792320577876068 xMEED

Holders

112

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
XMeedsNFTRewarding

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license
/**
 *Submitted for verification at Etherscan.io on 2022-03-17
*/

// SPDX-License-Identifier: UNLICENSED

// File: contracts/abstract/OwnableDelegateProxy.sol


pragma solidity 0.8.9;

contract OwnableDelegateProxy {}
// File: contracts/abstract/ProxyRegistry.sol


pragma solidity 0.8.9;


// Part: ProxyRegistry

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

// File: contracts/abstract/Roles.sol


pragma solidity 0.8.9;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {

    struct Role {
        mapping(address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view
        returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}



// File: contracts/abstract/IERC1155TokenReceiver.sol


pragma solidity 0.8.9;

/**
 * @dev ERC-1155 interface for accepting safe transfers.
 */
interface IERC1155TokenReceiver {

    /**
     * @notice Handle the receipt of a single ERC1155 token type
     * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated
     * This function MAY throw to revert and reject the transfer
     * Return of other amount than the magic value MUST result in the transaction being reverted
     * Note: The token contract address is always the message sender
     * @param _operator  The address which called the `safeTransferFrom` function
     * @param _from      The address which previously owned the token
     * @param _id        The id of the token being transferred
     * @param _amount    The amount of tokens being transferred
     * @param _data      Additional data with no specified format
     * @return           `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     */
    function onERC1155Received(
        address _operator,
        address _from,
        uint256 _id,
        uint256 _amount,
        bytes calldata _data
    )
        external returns (
            bytes4
        )
    ;

    /**
     * @notice Handle the receipt of multiple ERC1155 token types
     * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated
     * This function MAY throw to revert and reject the transfer
     * Return of other amount than the magic value WILL result in the transaction being reverted
     * Note: The token contract address is always the message sender
     * @param _operator  The address which called the `safeBatchTransferFrom` function
     * @param _from      The address which previously owned the token
     * @param _ids       An array containing ids of each token being transferred
     * @param _amounts   An array containing amounts of each token being transferred
     * @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 _amounts,
        bytes calldata _data
    )
        external returns (
            bytes4
        )
    ;

    /**
     * @notice Indicates whether a contract implements the `ERC1155TokenReceiver` functions and so can accept ERC1155 token types.
     * @param  interfaceID The ERC-165 interface ID that is queried for support.s
     * @dev This function MUST return true if it implements the ERC1155TokenReceiver interface and ERC-165 interface.
     *      This function MUST NOT consume more than 5,000 gas.
     * @return Wheter ERC-165 or ERC1155TokenReceiver interfaces are supported.
     */
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
// File: contracts/abstract/ERC1155Metadata.sol


pragma solidity 0.8.9;

/**
 * @notice Contract that handles metadata related methods.
 * @dev Methods assume a deterministic generation of URI based on token IDs.
 *      Methods also assume that URI uses hex representation of token IDs.
 */
abstract contract ERC1155Metadata {

    /***********************************|
     *   |     Metadata Public Function s    |
     |__________________________________*/
    /**
     * @notice A distinct Uniform Resource Identifier (URI) for a given token.
     * @dev URIs are defined in RFC 3986.
     *      URIs are assumed to be deterministically generated based on token ID
     *      Token IDs are assumed to be represented in their hex format in URIs
     * @return URI string
     */
    function uri(uint256 _id) external view virtual returns (string memory);
}



// File: contracts/abstract/IERC1155.sol


pragma solidity 0.8.9;

interface IERC1155 {
    // Events
    /**
     * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning
     *   Operator MUST be msg.sender
     *   When minting/creating tokens, the `_from` field MUST be set to `0x0`
     *   When burning/destroying tokens, the `_to` field MUST be set to `0x0`
     *   The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID
     *   To broadcast the existence of a token ID with no initial balance, the contract SHOULD emit the TransferSingle event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0
     */
    event TransferSingle(address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256 _id,
        uint256 _amount);

    /**
     * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning
     *   Operator MUST be msg.sender
     *   When minting/creating tokens, the `_from` field MUST be set to `0x0`
     *   When burning/destroying tokens, the `_to` field MUST be set to `0x0`
     *   The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID
     *   To broadcast the existence of multiple token IDs with no initial balance, this SHOULD emit the TransferBatch event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0
     */
    event TransferBatch(address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256[] _ids,
        uint256[] _amounts);

    /**
     * @dev MUST emit when an approval is updated
     */
    event ApprovalForAll(address indexed _owner,
        address indexed _operator,
        bool _approved);

    /**
     * @dev MUST emit when the URI is updated for a token ID
     *   URIs are defined in RFC 3986
     *   The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata JSON Schema"
     */
    event URI(string _uri, uint256 indexed _id);

    /**
     * @notice Transfers amount of an _id from the _from address to the _to address specified
     * @dev MUST emit TransferSingle event on success
     * Caller must be approved to manage the _from account's tokens (see isApprovedForAll)
     * MUST throw if `_to` is the zero address
     * MUST throw if balance of sender for token `_id` is lower than the `_amount` sent
     * MUST throw on any other error
     * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155Received` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * @param _from    Source address
     * @param _to      Target address
     * @param _id      ID of the token type
     * @param _amount  Transfered amount
     * @param _data    Additional data with no specified format, sent in call to `_to`
     */
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _amount,
        bytes calldata _data
    )
        external;

    /**
     * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
     * @dev MUST emit TransferBatch event on success
     * Caller must be approved to manage the _from account's tokens (see isApprovedForAll)
     * MUST throw if `_to` is the zero address
     * MUST throw if length of `_ids` is not the same as length of `_amounts`
     * MUST throw if any of the balance of sender for token `_ids` is lower than the respective `_amounts` sent
     * MUST throw on any other error
     * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155BatchReceived` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * Transfers and events MUST occur in the array order they were submitted (_ids[0] before _ids[1], etc)
     * @param _from     Source addresses
     * @param _to       Target addresses
     * @param _ids      IDs of each token type
     * @param _amounts  Transfer amounts per token type
     * @param _data     Additional data with no specified format, sent in call to `_to`
     */
    function safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _amounts,
        bytes calldata _data
    )
        external;

    /**
     * @notice Get the balance of an account's Tokens
     * @param _owner  The address of the token holder
     * @param _id     ID of the Token
     * @return        The _owner's balance of the Token type requested
     */
    function balanceOf(address _owner, uint256 _id) external view
        returns (uint256);

    /**
     * @notice Get the balance of multiple account/token pairs
     * @param _owners The addresses of the token holders
     * @param _ids    ID of the Tokens
     * @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
     */
    function balanceOfBatch(
        address[] calldata _owners,
        uint256[] calldata _ids
    )
        external
        view
        returns (
            uint256[] memory
        )
    ;

    /**
     * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens
     * @dev MUST emit the ApprovalForAll event on success
     * @param _operator  Address to add to the set of authorized operators
     * @param _approved  True if the operator is approved, false to revoke approval
     */
    function setApprovalForAll(address _operator, bool _approved) external;

    /**
     * @notice Queries the approval status of an operator for a given owner
     * @param _owner      The owner of the Tokens
     * @param _operator   Address of authorized operator
     * @return isOperator True if the operator is approved, false if not
     */
    function isApprovedForAll(
        address _owner,
        address _operator
    )
        external
        view
        returns (
            bool isOperator
        )
    ;
}

// File: contracts/abstract/IERC165.sol


pragma solidity 0.8.9;

/**
 * @title ERC165
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
interface IERC165 {

    /**
     * @notice Query if a contract implements an interface
     * @dev Interface identification is specified in ERC-165. This function
     * uses less than 30,000 gas
     * @param _interfaceId The interface identifier, as specified in ERC-165
     */
    function supportsInterface(bytes4 _interfaceId) external view
        returns (bool);
}
// File: contracts/abstract/FundDistribution.sol


pragma solidity 0.8.9;

/**
 * @title Fund Distribution interface that could be used by other contracts to reference
 * TokenFactory/MasterChef in order to enable minting/rewarding to a designated fund address.
 */
interface FundDistribution {
    /**
     * @dev an operation that triggers reward distribution by minting to the designated address
     * from TokenFactory. The fund address must be already configured in TokenFactory to receive
     * funds, else no funds will be retrieved.
     */
    function sendReward(address _fundAddress) external returns (bool);
}

// File: contracts/abstract/Address.sol


pragma solidity 0.8.9;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}



// File: contracts/abstract/Context.sol


pragma solidity 0.8.9;

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

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



// File: contracts/abstract/Ownable.sol


pragma solidity 0.8.9;


// Part: OpenZeppelin/[email protected]/Ownable

/**
 * @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.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/abstract/MinterRole.sol


pragma solidity 0.8.9;




/**
 * @title MinterRole
 * @dev Owner is responsible to add/remove minter
 */
contract MinterRole is Context, Ownable {

    using Roles for Roles.Role;

    event MinterAdded(address indexed account);

    event MinterRemoved(address indexed account);

    Roles.Role private _minters;

    modifier onlyMinter() {
        require(
            isMinter(_msgSender()),
            "MinterRole: caller does not have the Minter role"
        );
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return _minters.has(account);
    }

    function addMinter(address account) public onlyOwner {
        _addMinter(account);
    }

    function renounceMinter() public {
        _removeMinter(_msgSender());
    }

    function _addMinter(address account) internal {
        _minters.add(account);
        emit MinterAdded(account);
    }

    function _removeMinter(address account) internal {
        _minters.remove(account);
        emit MinterRemoved(account);
    }
}

// File: contracts/abstract/SafeMath.sol


pragma solidity 0.8.9;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 * 
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 * 
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {

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

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     * 
     * Counterpart to Solidity's `-` operator.
     * 
     * Requirements:
     * - Subtraction cannot overflow.
     * 
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     * 
     * Counterpart to Solidity's `*` operator.
     * 
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     * 
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     * 
     * Requirements:
     * - The divisor cannot be zero.
     * 
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     * 
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     * 
     * Requirements:
     * - The divisor cannot be zero.
     * 
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}



// File: contracts/abstract/ERC1155.sol


pragma solidity 0.8.9;







/**
 * @dev Implementation of Multi-Token Standard contract
 */
abstract contract ERC1155 is IERC1155, IERC165, ERC1155Metadata {
    using SafeMath for uint256;
    using Address for address;

    /***********************************|
     *   |        Variables and Events       |
     |__________________________________*/
    // onReceive function signatures
    bytes4 internal constant ERC1155_RECEIVED_VALUE = 0xf23a6e61;
    bytes4 internal constant ERC1155_BATCH_RECEIVED_VALUE = 0xbc197c81;

    // Objects balances
    mapping(address => mapping(uint256 => uint256)) internal balances;

    // Operator Functions
    mapping(address => mapping(address => bool)) internal operators;

    /***********************************|
     *   |     Public Transfer Functions     |
     |__________________________________*/
    /**
     * @notice Transfers amount amount of an _id from the _from address to the _to address specified
     * @param _from    Source address
     * @param _to      Target address
     * @param _id      ID of the token type
     * @param _amount  Transfered amount
     * @param _data    Additional data with no specified format, sent in call to `_to`
     */
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _amount,
        bytes memory _data
    )
        public override virtual {
        require((
                msg.sender == _from
                )
            || _isApprovedForAll(_from, msg.sender), "ERC1155#safeTransferFrom: INVALID_OPERATOR");
        require(_to != address(0), "ERC1155#safeTransferFrom: INVALID_RECIPIENT");
        // require(_amount >= balances[_from][_id]) is not necessary since checked with safemath operations
        _safeTransferFrom(_from, _to, _id, _amount);
        _callonERC1155Received(_from, _to, _id, _amount, _data);
    }

    /**
     * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
     * @param _from     Source addresses
     * @param _to       Target addresses
     * @param _ids      IDs of each token type
     * @param _amounts  Transfer amounts per token type
     * @param _data     Additional data with no specified format, sent in call to `_to`
     */
    function safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] memory _ids,
        uint256[] memory _amounts,
        bytes memory _data
    )
        public override virtual {
        // Requirements
        require((
                msg.sender == _from
                )
            || _isApprovedForAll(_from, msg.sender), "ERC1155#safeBatchTransferFrom: INVALID_OPERATOR");
        require(_to != address(0), "ERC1155#safeBatchTransferFrom: INVALID_RECIPIENT");

        _safeBatchTransferFrom(_from, _to, _ids, _amounts);
        _callonERC1155BatchReceived(_from, _to, _ids, _amounts, _data);
    }

    /***********************************|
     *   |    Internal Transfer Functions    |
     |__________________________________*/
    /**
     * @dev Transfers amount amount of an _id from the _from address to the _to address specified
     * @param _from    Source address
     * @param _to      Target address
     * @param _id      ID of the token type
     * @param _amount  Transfered amount
     */
    function _safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _amount
    )
        internal {
        // Update balances
        balances[_from][_id] = balances[_from][_id].sub (
            _amount
            )
        ; // Subtract amount
        balances[_to][_id] = balances[_to][_id].add(_amount); // Add amount
        // Emit event
        emit TransferSingle(msg.sender, _from, _to, _id, _amount);
    }

    /**
     * @dev Verifies if receiver is contract and if so, calls (_to).onERC1155Received(...)
     */
    function _callonERC1155Received(
        address _from,
        address _to,
        uint256 _id,
        uint256 _amount,
        bytes memory _data
    )
        internal {
        if (_to.isContract()) {
            try IERC1155TokenReceiver(_to).onERC1155Received(msg.sender, _from, _id, _amount, _data) returns (bytes4 response) {
                if (response != ERC1155_RECEIVED_VALUE) {
                    revert("ERC1155#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155#_callonERC1155Received: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    /**
     * @dev Send multiple types of Tokens from the _from address to the _to address (with safety call)
     * @param _from     Source addresses
     * @param _to       Target addresses
     * @param _ids      IDs of each token type
     * @param _amounts  Transfer amounts per token type
     */
    function _safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] memory _ids,
        uint256[] memory _amounts
    )
        internal {
        require (
            _ids.length == _amounts.length, "ERC1155#_safeBatchTransferFrom: INVALID_ARRAYS_LENGTH"
            )
        ;

        // Number of transfer to execute
        uint256 nTransfer = _ids.length;

        // Executing all transfers
        for (uint256 i = 0; i < nTransfer;i++) {
            // Update storage balance of previous bin
            balances[_from][_ids[i]] = balances[_from][_ids[i]].sub(_amounts[i]);
            balances[_to][_ids[i]] = balances[_to][_ids[i]].add(_amounts[i]);
        }

        // Emit event
        emit TransferBatch(msg.sender, _from, _to, _ids, _amounts);
    }

    /**
     * @dev Verifies if receiver is contract and if so, calls (_to).onERC1155BatchReceived(...)
     */
    function _callonERC1155BatchReceived(
        address _from,
        address _to,
        uint256[] memory _ids,
        uint256[] memory _amounts,
        bytes memory _data
    )
        internal {
        // Check if recipient is contract
        if (_to.isContract()
        ) {
            try IERC1155TokenReceiver(_to).onERC1155BatchReceived(msg.sender, _from, _ids, _amounts, _data) returns (bytes4 response) {
                if (response != ERC1155_BATCH_RECEIVED_VALUE) {
                    revert("ERC1155#_callonERC1155BatchReceived: INVALID_ON_RECEIVE_MESSAGE");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155#_callonERC1155BatchReceived: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    /**
     * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens
     * @param _operator  Address to add to the set of authorized operators
     * @param _approved  True if the operator is approved, false to revoke approval
     */
    function setApprovalForAll(address _operator, bool _approved) external override {
        // Update operator status
        operators[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /**
     * @dev Queries the approval status of an operator for a given owner
     * @param _owner      The owner of the Tokens
     * @param _operator   Address of authorized operator
     * @return isOperator true if the operator is approved, false if not
     */
    function _isApprovedForAll(
        address _owner,
        address _operator
    )
        internal
        view
        returns (bool isOperator) {
        return operators[_owner][_operator];
    }

    /**
     * @notice Get the balance of an account's Tokens
     * @param _owner  The address of the token holder
     * @param _id     ID of the Token
     * @return The _owner's balance of the Token type requested
     */
    function balanceOf(address _owner, uint256 _id) override public view returns (uint256) {
        return balances[_owner][_id];
    }

    /**
     * @notice Get the balance of multiple account/token pairs
     * @param _owners The addresses of the token holders
     * @param _ids    ID of the Tokens
     * @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
     */
    function balanceOfBatch(address[] memory _owners, uint256[] memory _ids)
        override
        public
        view
        returns (uint256[] memory) {
        require(_owners.length == _ids.length, "ERC1155#balanceOfBatch: INVALID_ARRAY_LENGTH");

        // Variables
        uint256[] memory batchBalances = new uint256[](_owners.length);

        // Iterate over each owner and token ID
        for (uint256 i = 0; i < _owners.length;i++) {
            batchBalances[i] = balances[_owners[i]][_ids[i]];
        }

        return batchBalances;
    }

    /*
     * INTERFACE_SIGNATURE_ERC165 = bytes4(keccak256("supportsInterface(bytes4)"));
     */
    bytes4 private constant INTERFACE_SIGNATURE_ERC165 = 0x01ffc9a7;

    /*
     * INTERFACE_SIGNATURE_ERC1155 =
     * bytes4(keccak256("safeTransferFrom(address,address,uint256,uint256,bytes)")) ^
     * bytes4(keccak256("safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)")) ^
     * bytes4(keccak256("balanceOf(address,uint256)")) ^
     * bytes4(keccak256("balanceOfBatch(address[],uint256[])")) ^
     * bytes4(keccak256("setApprovalForAll(address,bool)")) ^
     * bytes4(keccak256("isApprovedForAll(address,address)"));
     */
    bytes4 private constant INTERFACE_SIGNATURE_ERC1155 = 0xd9b67a26;

    /**
     * @notice Query if a contract implements an interface
     * @param _interfaceID  The interface identifier, as specified in ERC-165
     * @return `true` if the contract implements `_interfaceID` and
     */
    function supportsInterface(bytes4 _interfaceID) override external pure returns (bool) {
        if (_interfaceID == INTERFACE_SIGNATURE_ERC165 || _interfaceID == INTERFACE_SIGNATURE_ERC1155) {
            return true;
        }
        return false;
    }
}



// File: contracts/abstract/ERC1155MintBurn.sol


pragma solidity 0.8.9;



/**
 * @dev Multi-Fungible Tokens with minting and burning methods. These methods assume
 *      a parent contract to be executed as they are `internal` functions
 */
abstract contract ERC1155MintBurn is ERC1155 {
    using SafeMath for uint256;

    /****************************************|
     *   |            Minting Functions           |
     |_______________________________________*/
    /**
     * @dev Mint _amount of tokens of a given id
     * @param _to      The address to mint tokens to
     * @param _id      Token id to mint
     * @param _amount  The amount to be minted
     * @param _data    Data to pass if receiver is contract
     */
    function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data) internal {
        // Add _amount
        balances[_to][_id] = balances[_to][_id].add(_amount);

        // Emit event
        emit TransferSingle(msg.sender, address(0x0), _to, _id, _amount);

        // Calling onReceive method if recipient is contract
        _callonERC1155Received(address(0x0), _to, _id, _amount, _data);
    }

    /**
     * @dev Mint tokens for each ids in _ids
     * @param _to       The address to mint tokens to
     * @param _ids      Array of ids to mint
     * @param _amounts  Array of amount of tokens to mint per id
     * @param _data    Data to pass if receiver is contract
     */
    function _batchMint(
        address _to,
        uint256[] memory _ids,
        uint256[] memory _amounts,
        bytes memory _data
    )
        internal {
        require (
            _ids.length == _amounts.length, "ERC1155MintBurn#batchMint: INVALID_ARRAYS_LENGTH"
            )
        ;

        // Number of mints to execute
        uint256 nMint = _ids.length;

        // Executing all minting
        for (uint256 i = 0; i < nMint;i++) {
            // Update storage balance
            balances[_to][_ids[i]] = balances[_to][_ids[i]].add(_amounts[i]);
        }

        // Emit batch mint event
        emit TransferBatch(msg.sender, address(0x0), _to, _ids, _amounts);

        // Calling onReceive method if recipient is contract
        _callonERC1155BatchReceived(address(0x0), _to, _ids, _amounts, _data);
    }

    /****************************************|
     *   |            Burning Functions           |
     |_______________________________________*/
    /**
     * @dev Burn _amount of tokens of a given token id
     * @param _from    The address to burn tokens from
     * @param _id      Token id to burn
     * @param _amount  The amount to be burned
     */
    function _burn(address _from, uint256 _id,
        uint256 _amount) internal {
        // Substract _amount
        balances[_from][_id] = balances[_from][_id].sub(_amount);

        // Emit event
        emit TransferSingle(msg.sender, _from, address(0x0), _id, _amount);
    }

    /**
     * @dev Burn tokens of given token id for each (_ids[i], _amounts[i]) pair
     * @param _from     The address to burn tokens from
     * @param _ids      Array of token ids to burn
     * @param _amounts  Array of the amount to be burned
     */
    function _batchBurn(
        address _from,
        uint256[] memory _ids,
        uint256[] memory _amounts
    )
        internal {
        require (
            _ids.length == _amounts.length, "ERC1155MintBurn#batchBurn: INVALID_ARRAYS_LENGTH"
            )
        ;

        // Number of mints to execute
        uint256 nBurn = _ids.length;

        // Executing all minting
        for (uint256 i = 0; i < nBurn;i++) {
            // Update storage balance
            balances[_from][_ids[i]] = balances[_from][_ids[i]].sub(_amounts[i]);
        }

        // Emit batch mint event
        emit TransferBatch(msg.sender, _from, address(0x0), _ids, _amounts);
    }
}



// File: contracts/abstract/ERC1155Tradable.sol


pragma solidity 0.8.9;








/**
 * @title ERC1155Tradable
 * ERC1155Tradable - ERC1155 contract that whitelists an operator address, 
 * has create and mint functionality, and supports useful standards from OpenZeppelin,
 *   like _exists(), name(), symbol(), and totalSupply()
 */
abstract contract ERC1155Tradable is ERC1155MintBurn, Ownable, MinterRole {
    using SafeMath for uint256;
    using Address for address;

    // OpenSea proxy registry to ease selling NFTs on OpenSea
    address public proxyRegistryAddress;

    mapping(uint256 => address) public creators;
    mapping(uint256 => uint256) public tokenSupply;
    mapping(uint256 => uint256) public tokenMaxSupply;
    mapping(uint256 => uint8) public tokenCityIndex;
    mapping(uint256 => uint8) public tokenType;

    // Contract name
    string public name;

    // Contract symbol
    string public symbol;

    // URI's default URI prefix
    string internal baseMetadataURI;

    uint256 internal _currentTokenID = 0;

    constructor (string memory _name, string memory _symbol, address _proxyRegistryAddress, string memory _baseMetadataURI) {
        name = _name;
        symbol = _symbol;
        proxyRegistryAddress = _proxyRegistryAddress;
        baseMetadataURI = _baseMetadataURI;
    }

    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(baseMetadataURI));
    }

    /**
     * @dev Returns URIs are defined in RFC 3986.
     *      URIs are assumed to be deterministically generated based on token ID
     *      Token IDs are assumed to be represented in their hex format in URIs
     * @return URI string
     */
    function uri(uint256 _id) override external view returns (string memory) {
        require(_exists(_id), "Deed NFT doesn't exists");
        return string(abi.encodePacked(baseMetadataURI, _uint2str(_id)));
    }

    /**
     * @dev Returns the total quantity for a token ID
     * @param _id uint256 ID of the token to query
     * @return amount of token in existence
     */
    function totalSupply(uint256 _id) public view returns (uint256) {
        return tokenSupply[_id];
    }

    /**
     * @dev Returns the max quantity for a token ID
     * @param _id uint256 ID of the token to query
     * @return amount of token in existence
     */
    function maxSupply(uint256 _id) public view returns (uint256) {
        return tokenMaxSupply[_id];
    }

    /**
     * @dev return city index of designated NFT with its identifier
     */
    function cityIndex(uint256 _id) public view returns (uint256) {
        require(_exists(_id), "Deed NFT doesn't exists");
        return tokenCityIndex[_id];
    }

    /**
     * @dev return card type of designated NFT with its identifier
     */
    function cardType(uint256 _id) public view returns (uint256) {
        require(_exists(_id), "Deed NFT doesn't exists");
        return tokenType[_id];
    }

    /**
     * @dev Creates a new token type and assigns _initialSupply to an address
     * @param _initialOwner the first owner of the Token
     * @param _initialSupply Optional amount to supply the first owner (1 for NFT)
     * @param _maxSupply max supply allowed (1 for NFT)
     * @param _cityIndex city index of NFT
     *    (0 = Tanit, 1 = Reshef, 2 = Ashtarte, 3 = Melqart, 4 = Eshmun, 5 = Kushor, 6 = Hammon)
     * @param _type card type of NFT
     *    (0 = Common, 1 = Uncommon, 2 = Rare, 3 = Legendary)
     * @param _data Optional data to pass if receiver is contract
     * @return The newly created token ID
     */
    function create(
        address _initialOwner,
        uint256 _initialSupply,
        uint256 _maxSupply,
        uint8 _cityIndex,
        uint8 _type,
        bytes memory _data
    ) public onlyMinter returns (uint256) {
        require(_initialSupply <= _maxSupply, "_initialSupply > _maxSupply");
        uint256 _id = _getNextTokenID();
        _incrementTokenTypeId();
        creators[_id] = _initialOwner;

        if (_initialSupply != 0) {
            _mint(_initialOwner, _id, _initialSupply, _data);
        }
        tokenSupply[_id] = _initialSupply;
        tokenMaxSupply[_id] = _maxSupply;
        tokenCityIndex[_id] = _cityIndex;
        tokenType[_id] = _type;
        return _id;
    }

    /**
     * @dev Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-free listings.
     * @param _owner      The owner of the Tokens
     * @param _operator   Address of authorized operator
     * @return isOperator true if the operator is approved, false if not
     */
    function isApprovedForAll(address _owner, address _operator) override public view returns (bool isOperator) {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(_owner)) == _operator) {
            return true;
        }

        return _isApprovedForAll(_owner, _operator);
    }

    /**
     * @dev Returns whether the specified token exists by checking to see if it has a creator
     * @param _id uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 _id) internal view returns (bool) {
        return creators[_id] != address(0);
    }

    /**
     * @dev calculates the next token ID based on value of _currentTokenID
     * @return uint256 for the next token ID
     */
    function _getNextTokenID() private view returns (uint256) {
        return _currentTokenID.add(1);
    }

    /**
     * @dev increments the value of _currentTokenID
     */
    function _incrementTokenTypeId() private {
        _currentTokenID++;
    }

    /**
     * @dev Convert uint256 to string
     * @param _i Unsigned integer to convert to string
     */
    function _uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k] = bytes1(uint8(48 + _i % 10));
            _i /= 10;
            if (k > 0) {
                k--;
            }
        }
        return string(bstr);
    }

}
// File: contracts/abstract/IERC20.sol


pragma solidity 0.8.9;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     * 
     * Returns a boolean value indicating whether the operation succeeded.
     * 
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     * 
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     * 
     * Returns a boolean value indicating whether the operation succeeded.
     * 
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * 
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     * 
     * Returns a boolean value indicating whether the operation succeeded.
     * 
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     * 
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}



// File: contracts/abstract/ERC20.sol


pragma solidity 0.8.9;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
abstract contract ERC20 is Context, IERC20 {

    using SafeMath for uint256;
    using Address for address;

    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory tokenName, string memory tokenSymbol) {
        _name = tokenName;
        _symbol = tokenSymbol;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public override view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        virtual
        override
        view
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

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

// File: contracts/abstract/XMeedsToken.sol


pragma solidity 0.8.9;








abstract contract XMeedsToken is ERC20("Staked MEED", "xMEED"), Ownable {
    using SafeMath for uint256;
    IERC20 public meed;
    FundDistribution public rewardDistribution;

    constructor(IERC20 _meed, FundDistribution _rewardDistribution) {
        meed = _meed;
        rewardDistribution = _rewardDistribution;
    }

    /**
     * @dev This method will:
     * 1/ retrieve staked amount of MEEDs that should already been approved on ERC20 MEED Token
     * 2/ Send back some xMEED ERC20 Token for staker
     */
    function _stake(uint256 _amount) internal {
        // Retrieve MEEDs from Reserve Fund (TokenFactory)
        require(rewardDistribution.sendReward(address(this)) == true, "Error retrieving funds from reserve");

        uint256 totalMeed = meed.balanceOf(address(this));
        uint256 totalShares = totalSupply();
        if (totalShares == 0 || totalMeed == 0) {
            _mint(_msgSender(), _amount);
        } else {
            uint256 what = _amount.mul(totalShares).div(totalMeed);
            _mint(_msgSender(), what);
        }
        meed.transferFrom(_msgSender(), address(this), _amount);
    }

    /**
     * @dev This method will:
     * 1/ Withdraw staked amount of MEEDs that wallet has already staked in this contract
     *  plus a proportion of Rewarded MEEDs sent from TokenFactory/MasterChef
     * 2/ Burn equivalent amount of xMEED from caller account
     */
    function _withdraw(uint256 _amount) internal {
        // Retrieve MEEDs from Reserve Fund (TokenFactory)
        require(rewardDistribution.sendReward(address(this)) == true, "Error retrieving funds from reserve");

        uint256 totalMeed = meed.balanceOf(address(this));
        uint256 totalShares = totalSupply();
        uint256 what = _amount.mul(totalMeed).div(totalShares);
        _burn(_msgSender(), _amount);
        meed.transfer(_msgSender(), what);
    }
}
// File: contracts/abstract/MeedsPointsRewarding.sol


pragma solidity 0.8.9;



contract MeedsPointsRewarding is XMeedsToken {
    using SafeMath for uint256;

    // The block time when Points rewarding will starts
    uint256 public startRewardsTime;

    mapping(address => uint256) internal points;
    mapping(address => uint256) internal pointsLastUpdateTime;

    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);

    /**
     * @dev a modifier to store earned points for a designated address until
     * current block after having staked some MEEDs. if the Points rewarding didn't started yet
     * the address will not receive points yet.
     */
    modifier updateReward(address account) {
        if (account != address(0)) {
          if (block.timestamp < startRewardsTime) {
            points[account] = 0;
            pointsLastUpdateTime[account] = startRewardsTime;
          } else {
            points[account] = earned(account);
            pointsLastUpdateTime[account] = block.timestamp;
          }
        }
        _;
    }

    constructor (IERC20 _meed, FundDistribution _rewardDistribution, uint256 _startRewardsTime) XMeedsToken(_meed, _rewardDistribution) {
        startRewardsTime = _startRewardsTime;
    }

    /**
     * @dev returns the earned points for the designated address after having staked some MEEDs
     * token. If the Points rewarding distribution didn't started yet, 0 will be returned instead.
     */
    function earned(address account) public view returns (uint256) {
        if (block.timestamp < startRewardsTime) {
          return 0;
        } else {
          uint256 timeDifference = block.timestamp.sub(pointsLastUpdateTime[account]);
          uint256 balance = balanceOf(account);
          uint256 decimals = 1e18;
          uint256 x = balance / decimals;
          uint256 ratePerSecond = decimals.mul(x).div(x.add(12000)).div(240);
          return points[account].add(ratePerSecond.mul(timeDifference));
        }
    }

    /**
     * @dev This method will:
     * 1/ Update Rewarding Points for address of caller (using modifier)
     * 2/ retrieve staked amount of MEEDs that should already been approved on ERC20 MEED Token
     * 3/ Send back some xMEED ERC20 Token for staker
     */
    function stake(uint256 amount) public updateReward(msg.sender) {
        require(amount > 0, "Invalid amount");

        _stake(amount);
        emit Staked(msg.sender, amount);
    }

    /**
     * @dev This method will:
     * 1/ Update Rewarding Points for address of caller (using modifier)
     * 2/ Withdraw staked amount of MEEDs that wallet has already staked in this contract
     *  plus a proportion of Rewarded MEEDs sent from TokenFactory/MasterChef
     * 3/ Burn equivalent amount of xMEED from caller account
     */
    function withdraw(uint256 amount) public updateReward(msg.sender) {
        require(amount > 0, "Cannot withdraw 0");

        _withdraw(amount);
        emit Withdrawn(msg.sender, amount);
    }

    /**
     * @dev This method will:
     * 1/ Update Rewarding Points for address of caller (using modifier)
     * 2/ Withdraw all staked MEEDs that are wallet has staked in this contract
     *  plus a proportion of Rewarded MEEDs sent from TokenFactory/MasterChef
     * 3/ Burn equivalent amount of xMEED from caller account
     */
    function exit() external {
        withdraw(balanceOf(msg.sender));
    }

    /**
     * @dev ERC-20 transfer method in addition to updating earned points
     * of spender and recipient (using modifiers)
     */
    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        updateReward(msg.sender)
        updateReward(recipient)
        returns (bool) {
        return super.transfer(recipient, amount);
    }

    /**
     * @dev ERC-20 transferFrom method in addition to updating earned points
     * of spender and recipient (using modifiers)
     */
    function transferFrom(address sender, address recipient, uint256 amount)
        public
        virtual
        override
        updateReward(sender)
        updateReward(recipient)
        returns (bool) {
        return super.transferFrom(sender, recipient, amount);
    }

}



// File: contracts/XMeedsNFTRewarding.sol


pragma solidity 0.8.9;




contract XMeedsNFTRewarding is MeedsPointsRewarding {
    using SafeMath for uint256;

    // Info of each Card Type
    struct CardTypeDetail {
        string name;
        uint8 cityIndex;
        uint8 cardType;
        uint32 supply;
        uint32 maxSupply;
        uint256 amount;
    }

    // Info of each City
    struct CityDetail {
        string name;
        uint32 population;
        uint32 maxPopulation;
        uint256 availability;
    }

    ERC1155Tradable public nft;

    CardTypeDetail[] public cardTypeInfo;
    CityDetail[] public cityInfo;
    uint8 public currentCityIndex = 0;
    uint256 public lastCityMintingCompleteDate = 0;

    event Redeemed(address indexed user, string city, string cardType, uint256 id);
    event NFTSet(ERC1155Tradable indexed newNFT);

    constructor (
        IERC20 _meed,
        FundDistribution _rewardDistribution,
        ERC1155Tradable _nftAddress,
        uint256 _startRewardsTime,
        string[] memory _cityNames,
        string[] memory _cardNames,
        uint256[] memory _cardPrices,
        uint32[] memory _cardSupply
    ) MeedsPointsRewarding(_meed, _rewardDistribution, _startRewardsTime) {
        nft = _nftAddress;
        lastCityMintingCompleteDate = block.timestamp;

        uint256 citiesLength = _cityNames.length;
        uint256 cardsLength = _cardNames.length;
        uint32 citiesCardsLength = uint32(citiesLength * cardsLength);
        require(uint32(_cardSupply.length) == citiesCardsLength, "Provided Supply list per card per city must equal to Card Type length");

        uint256 _month = 30 days;
        uint256 _index = 0;
        for (uint8 i = 0; i < citiesLength; i++) {
            uint32 _maxPopulation = 0;
            for (uint8 j = 0; j < cardsLength; j++) {
                string memory _cardName = _cardNames[j];
                uint256 _cardPrice = _cardPrices[j];
                uint32 _maxSupply = _cardSupply[_index];
                cardTypeInfo.push(CardTypeDetail({
                    name: _cardName,
                    cityIndex: i,
                    cardType: j,
                    amount: _cardPrice,
                    supply: 0,
                    maxSupply: _maxSupply
                }));
                _maxPopulation += _maxSupply;
                _index++;
            }

            uint256 _availability = i > 0 ? ((2 ** (i + 1)) * _month) : 0;
            string memory _cityName = _cityNames[i];
            cityInfo.push(CityDetail({
                name: _cityName,
                population: 0,
                maxPopulation: _maxPopulation,
                availability: _availability
            }));
        }
    }

    /**
     * @dev Set MEED NFT address
     */
    function setNFT(ERC1155Tradable _nftAddress) public onlyOwner {
        nft = _nftAddress;
        emit NFTSet(_nftAddress);
    }

    /**
     * @dev Checks if current city is mintable
     */
    function isCurrentCityMintable() public view returns (bool) {
        return block.timestamp > cityMintingStartDate();
    }

    /**
     * @dev returns current city minting start date
     */
    function cityMintingStartDate() public view returns (uint256) {
        CityDetail memory city = cityInfo[currentCityIndex];
        return city.availability.add(lastCityMintingCompleteDate);
    }

    /**
     * @dev Redeem an NFT by minting it and substracting the amount af Points (Card Type price)
     * from caller balance of points.
     */
    function redeem(uint8 cardTypeId) public updateReward(msg.sender) returns (uint256 tokenId) {
        require(cardTypeId < cardTypeInfo.length, "Card Type doesn't exist");

        CardTypeDetail storage cardType = cardTypeInfo[cardTypeId];
        require(cardType.maxSupply > 0, "Card Type not available for minting");
        require(points[msg.sender] >= cardType.amount, "Not enough points to redeem for card");
        require(cardType.supply < cardType.maxSupply, "Max cards supply reached");
        require(cardType.cityIndex == currentCityIndex, "Designated city isn't available for minting yet");

        CityDetail storage city = cityInfo[cardType.cityIndex];
        require(block.timestamp > city.availability.add(lastCityMintingCompleteDate), "Designated city isn't available for minting yet");

        city.population = city.population + 1;
        cardType.supply = cardType.supply + 1;
        if (city.population >= city.maxPopulation) {
            currentCityIndex++;
            lastCityMintingCompleteDate = block.timestamp;
        }

        points[msg.sender] = points[msg.sender].sub(cardType.amount);
        uint256 _tokenId = nft.create(msg.sender, 1, 1, cardType.cityIndex, cardType.cardType, "");
        emit Redeemed(msg.sender, city.name, cardType.name, _tokenId);
        return _tokenId;
    }

}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IERC20","name":"_meed","type":"address"},{"internalType":"contract FundDistribution","name":"_rewardDistribution","type":"address"},{"internalType":"contract ERC1155Tradable","name":"_nftAddress","type":"address"},{"internalType":"uint256","name":"_startRewardsTime","type":"uint256"},{"internalType":"string[]","name":"_cityNames","type":"string[]"},{"internalType":"string[]","name":"_cardNames","type":"string[]"},{"internalType":"uint256[]","name":"_cardPrices","type":"uint256[]"},{"internalType":"uint32[]","name":"_cardSupply","type":"uint32[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract ERC1155Tradable","name":"newNFT","type":"address"}],"name":"NFTSet","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":"user","type":"address"},{"indexed":false,"internalType":"string","name":"city","type":"string"},{"indexed":false,"internalType":"string","name":"cardType","type":"string"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Redeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cardTypeInfo","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint8","name":"cityIndex","type":"uint8"},{"internalType":"uint8","name":"cardType","type":"uint8"},{"internalType":"uint32","name":"supply","type":"uint32"},{"internalType":"uint32","name":"maxSupply","type":"uint32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cityInfo","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint32","name":"population","type":"uint32"},{"internalType":"uint32","name":"maxPopulation","type":"uint32"},{"internalType":"uint256","name":"availability","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cityMintingStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentCityIndex","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isCurrentCityMintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCityMintingCompleteDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"meed","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract ERC1155Tradable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"cardTypeId","type":"uint8"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardDistribution","outputs":[{"internalType":"contract FundDistribution","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ERC1155Tradable","name":"_nftAddress","type":"address"}],"name":"setNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startRewardsTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600e60006101000a81548160ff021916908360ff1602179055506000600f553480156200003257600080fd5b5060405162005d0938038062005d09833981810160405281019062000058919062000d88565b87878682826040518060400160405280600b81526020017f5374616b6564204d4545440000000000000000000000000000000000000000008152506040518060400160405280600581526020017f784d4545440000000000000000000000000000000000000000000000000000008152508160039080519060200190620000e192919062000714565b508060049080519060200190620000fa92919062000714565b506012600560006101000a81548160ff021916908360ff1602179055505050620001396200012d620005d960201b60201c565b620005e160201b60201c565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508060088190555050505085600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600f81905550600084519050600084519050600081836200022b919062000efc565b90508063ffffffff16845163ffffffff16146200027f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000276906200100a565b60405180910390fd5b600062278d0090506000805b858160ff161015620005c5576000805b868160ff161015620004725760008b8260ff1681518110620002c257620002c16200102c565b5b6020026020010151905060008b8360ff1681518110620002e757620002e66200102c565b5b6020026020010151905060008b87815181106200030957620003086200102c565b5b60200260200101519050600c6040518060c001604052808581526020018860ff1681526020018660ff168152602001600063ffffffff1681526020018363ffffffff16815260200184815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000190805190602001906200039c92919062000714565b5060208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160010160016101000a81548160ff021916908360ff16021790555060608201518160010160026101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160066101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160020155505080856200044791906200105b565b9450868062000456906200109c565b97505050505080806200046990620010f7565b9150506200029b565b506000808360ff161162000488576000620004b3565b8460018462000498919062001126565b6002620004a69190620012b8565b620004b2919062000efc565b5b905060008c8460ff1681518110620004d057620004cf6200102c565b5b60200260200101519050600d6040518060800160405280838152602001600063ffffffff1681526020018563ffffffff16815260200184815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000190805190602001906200055192919062000714565b5060208201518160010160006101000a81548163ffffffff021916908363ffffffff16021790555060408201518160010160046101000a81548163ffffffff021916908363ffffffff1602179055506060820151816002015550505050508080620005bc90620010f7565b9150506200028b565b505050505050505050505050505062001406565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000654576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200064b906200137f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8280546200072290620013d0565b90600052602060002090601f01602090048101928262000746576000855562000792565b82601f106200076157805160ff191683800117855562000792565b8280016001018555821562000792579182015b828111156200079157825182559160200191906001019062000774565b5b509050620007a19190620007a5565b5090565b5b80821115620007c0576000816000905550600101620007a6565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200080582620007d8565b9050919050565b60006200081982620007f8565b9050919050565b6200082b816200080c565b81146200083757600080fd5b50565b6000815190506200084b8162000820565b92915050565b60006200085e82620007f8565b9050919050565b620008708162000851565b81146200087c57600080fd5b50565b600081519050620008908162000865565b92915050565b6000620008a382620007f8565b9050919050565b620008b58162000896565b8114620008c157600080fd5b50565b600081519050620008d581620008aa565b92915050565b6000819050919050565b620008f081620008db565b8114620008fc57600080fd5b50565b6000815190506200091081620008e5565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000966826200091b565b810181811067ffffffffffffffff821117156200098857620009876200092c565b5b80604052505050565b60006200099d620007c4565b9050620009ab82826200095b565b919050565b600067ffffffffffffffff821115620009ce57620009cd6200092c565b5b602082029050602081019050919050565b600080fd5b600080fd5b600067ffffffffffffffff82111562000a075762000a066200092c565b5b62000a12826200091b565b9050602081019050919050565b60005b8381101562000a3f57808201518184015260208101905062000a22565b8381111562000a4f576000848401525b50505050565b600062000a6c62000a6684620009e9565b62000991565b90508281526020810184848401111562000a8b5762000a8a620009e4565b5b62000a9884828562000a1f565b509392505050565b600082601f83011262000ab85762000ab762000916565b5b815162000aca84826020860162000a55565b91505092915050565b600062000aea62000ae484620009b0565b62000991565b9050808382526020820190506020840283018581111562000b105762000b0f620009df565b5b835b8181101562000b5e57805167ffffffffffffffff81111562000b395762000b3862000916565b5b80860162000b48898262000aa0565b8552602085019450505060208101905062000b12565b5050509392505050565b600082601f83011262000b805762000b7f62000916565b5b815162000b9284826020860162000ad3565b91505092915050565b600067ffffffffffffffff82111562000bb95762000bb86200092c565b5b602082029050602081019050919050565b600062000be162000bdb8462000b9b565b62000991565b9050808382526020820190506020840283018581111562000c075762000c06620009df565b5b835b8181101562000c34578062000c1f8882620008ff565b84526020840193505060208101905062000c09565b5050509392505050565b600082601f83011262000c565762000c5562000916565b5b815162000c6884826020860162000bca565b91505092915050565b600067ffffffffffffffff82111562000c8f5762000c8e6200092c565b5b602082029050602081019050919050565b600063ffffffff82169050919050565b62000cbb8162000ca0565b811462000cc757600080fd5b50565b60008151905062000cdb8162000cb0565b92915050565b600062000cf862000cf28462000c71565b62000991565b9050808382526020820190506020840283018581111562000d1e5762000d1d620009df565b5b835b8181101562000d4b578062000d36888262000cca565b84526020840193505060208101905062000d20565b5050509392505050565b600082601f83011262000d6d5762000d6c62000916565b5b815162000d7f84826020860162000ce1565b91505092915050565b600080600080600080600080610100898b03121562000dac5762000dab620007ce565b5b600062000dbc8b828c016200083a565b985050602062000dcf8b828c016200087f565b975050604062000de28b828c01620008c4565b965050606062000df58b828c01620008ff565b955050608089015167ffffffffffffffff81111562000e195762000e18620007d3565b5b62000e278b828c0162000b68565b94505060a089015167ffffffffffffffff81111562000e4b5762000e4a620007d3565b5b62000e598b828c0162000b68565b93505060c089015167ffffffffffffffff81111562000e7d5762000e7c620007d3565b5b62000e8b8b828c0162000c3e565b92505060e089015167ffffffffffffffff81111562000eaf5762000eae620007d3565b5b62000ebd8b828c0162000d55565b9150509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000f0982620008db565b915062000f1683620008db565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000f525762000f5162000ecd565b5b828202905092915050565b600082825260208201905092915050565b7f50726f766964656420537570706c79206c69737420706572206361726420706560008201527f722063697479206d75737420657175616c20746f20436172642054797065206c60208201527f656e677468000000000000000000000000000000000000000000000000000000604082015250565b600062000ff260458362000f5d565b915062000fff8262000f6e565b606082019050919050565b60006020820190508181036000830152620010258162000fe3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620010688262000ca0565b9150620010758362000ca0565b92508263ffffffff0382111562001091576200109062000ecd565b5b828201905092915050565b6000620010a982620008db565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620010df57620010de62000ecd565b5b600182019050919050565b600060ff82169050919050565b60006200110482620010ea565b915060ff8214156200111b576200111a62000ecd565b5b600182019050919050565b60006200113382620010ea565b91506200114083620010ea565b92508260ff0382111562001159576200115862000ecd565b5b828201905092915050565b60008160011c9050919050565b6000808291508390505b6001851115620011c3578086048111156200119b576200119a62000ecd565b5b6001851615620011ab5780820291505b8081029050620011bb8562001164565b94506200117b565b94509492505050565b600082620011de5760019050620012b1565b81620011ee5760009050620012b1565b8160018114620012075760028114620012125762001248565b6001915050620012b1565b60ff84111562001227576200122662000ecd565b5b8360020a91508482111562001241576200124062000ecd565b5b50620012b1565b5060208310610133831016604e8410600b8410161715620012825782820a9050838111156200127c576200127b62000ecd565b5b620012b1565b62001291848484600162001171565b92509050818404811115620012ab57620012aa62000ecd565b5b81810290505b9392505050565b6000620012c582620008db565b9150620012d283620010ea565b9250620013017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620011cc565b905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006200136760268362000f5d565b9150620013748262001309565b604082019050919050565b600060208201905081810360008301526200139a8162001358565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620013e957607f821691505b602082108114156200140057620013ff620013a1565b5b50919050565b6148f380620014166000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c806372ae12cf1161010f578063ad61f87d116100a2578063f17f244111610071578063f17f24411461059e578063f2fde38b146105bc578063f43156e3146105d8578063f56e9c661461060d576101e4565b8063ad61f87d14610513578063dd62ed3e14610531578063e5bea43514610561578063e9fad8ee14610594576101e4565b8063a44bc4c2116100de578063a44bc4c214610479578063a457c2d714610497578063a694fc3a146104c7578063a9059cbb146104e3576101e4565b806372ae12cf146104015780638da5cb5b1461041f5780638f32d59b1461043d57806395d89b411461045b576101e4565b80632b425e9a116101875780633950935111610156578063395093511461037957806347ccca02146103a957806370a08231146103c7578063715018a6146103f7576101e4565b80632b425e9a146102f15780632e1a7d4d1461030f578063313ce5671461032b57806332271faf14610349576101e4565b8063101114cf116101c3578063101114cf1461026757806318160ddd1461028557806323b80449146102a357806323b872dd146102c1576101e4565b80628cc262146101e957806306fdde0314610219578063095ea7b314610237575b600080fd5b61020360048036038101906101fe9190613472565b610629565b60405161021091906134b8565b60405180910390f35b61022161077f565b60405161022e919061356c565b60405180910390f35b610251600480360381019061024c91906135ba565b610811565b60405161025e9190613615565b60405180910390f35b61026f61082f565b60405161027c919061368f565b60405180910390f35b61028d610855565b60405161029a91906134b8565b60405180910390f35b6102ab61085f565b6040516102b891906134b8565b60405180910390f35b6102db60048036038101906102d691906136aa565b610865565b6040516102e89190613615565b60405180910390f35b6102f9610b3f565b60405161030691906134b8565b60405180910390f35b610329600480360381019061032491906136fd565b610b45565b005b610333610d44565b6040516103409190613746565b60405180910390f35b610363600480360381019061035e919061378d565b610d5b565b60405161037091906134b8565b60405180910390f35b610393600480360381019061038e91906135ba565b611460565b6040516103a09190613615565b60405180910390f35b6103b1611513565b6040516103be91906137db565b60405180910390f35b6103e160048036038101906103dc9190613472565b611539565b6040516103ee91906134b8565b60405180910390f35b6103ff611581565b005b610409611689565b60405161041691906134b8565b60405180910390f35b6104276117d4565b6040516104349190613805565b60405180910390f35b6104456117fe565b6040516104529190613615565b60405180910390f35b61046361185d565b604051610470919061356c565b60405180910390f35b6104816118ef565b60405161048e9190613746565b60405180910390f35b6104b160048036038101906104ac91906135ba565b611902565b6040516104be9190613615565b60405180910390f35b6104e160048036038101906104dc91906136fd565b6119cf565b005b6104fd60048036038101906104f891906135ba565b611bce565b60405161050a9190613615565b60405180910390f35b61051b611ea6565b6040516105289190613615565b60405180910390f35b61054b60048036038101906105469190613820565b611eb7565b60405161055891906134b8565b60405180910390f35b61057b600480360381019061057691906136fd565b611f3e565b60405161058b949392919061387f565b60405180910390f35b61059c612026565b005b6105a6612039565b6040516105b391906138ec565b60405180910390f35b6105d660048036038101906105d19190613472565b61205f565b005b6105f260048036038101906105ed91906136fd565b6120b2565b60405161060496959493929190613907565b60405180910390f35b610627600480360381019061062291906139ad565b6121c0565b005b600060085442101561063e576000905061077a565b6000610692600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261228e90919063ffffffff16565b9050600061069f84611539565b90506000670de0b6b3a76400009050600081836106bc9190613a38565b9050600061070c60f06106fe6106dd612ee0866122d890919063ffffffff16565b6106f0868861233690919063ffffffff16565b6123b190919063ffffffff16565b6123b190919063ffffffff16565b9050610772610724868361233690919063ffffffff16565b600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122d890919063ffffffff16565b955050505050505b919050565b60606003805461078e90613a98565b80601f01602080910402602001604051908101604052809291908181526020018280546107ba90613a98565b80156108075780601f106107dc57610100808354040283529160200191610807565b820191906000526020600020905b8154815290600101906020018083116107ea57829003601f168201915b5050505050905090565b600061082561081e6123fb565b8484612403565b6001905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b60085481565b600083600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109c857600854421015610936576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506109c7565b61093f81610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b83600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b2957600854421015610a97576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b28565b610aa081610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b610b348686866125ce565b925050509392505050565b600f5481565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ca657600854421015610c14576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ca5565b610c1d81610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b60008211610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090613b16565b60405180910390fd5b610cf2826126a7565b3373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610d3891906134b8565b60405180910390a25050565b6000600560009054906101000a900460ff16905090565b600033600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ebe57600854421015610e2c576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ebd565b610e3581610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b600c805490508360ff1610610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90613b82565b60405180910390fd5b6000600c8460ff1681548110610f2157610f20613ba2565b5b9060005260206000209060030201905060008160010160069054906101000a900463ffffffff1663ffffffff1611610f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8590613c43565b60405180910390fd5b8060020154600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90613cd5565b60405180910390fd5b8060010160069054906101000a900463ffffffff1663ffffffff168160010160029054906101000a900463ffffffff1663ffffffff161061108a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108190613d41565b60405180910390fd5b600e60009054906101000a900460ff1660ff168160010160009054906101000a900460ff1660ff16146110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990613dd3565b60405180910390fd5b6000600d8260010160009054906101000a900460ff1660ff168154811061111c5761111b613ba2565b5b90600052602060002090600302019050611145600f5482600201546122d890919063ffffffff16565b4211611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90613dd3565b60405180910390fd5b60018160010160009054906101000a900463ffffffff166111a79190613df3565b8160010160006101000a81548163ffffffff021916908363ffffffff16021790555060018260010160029054906101000a900463ffffffff166111ea9190613df3565b8260010160026101000a81548163ffffffff021916908363ffffffff1602179055508060010160049054906101000a900463ffffffff1663ffffffff168160010160009054906101000a900463ffffffff1663ffffffff161061128757600e600081819054906101000a900460ff168092919061126690613e2d565b91906101000a81548160ff021916908360ff1602179055505042600f819055505b6112dd8260020154600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461228e90919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f74a794336001808760010160009054906101000a900460ff168860010160019054906101000a900460ff166040518663ffffffff1660e01b81526004016113a8959493929190613ec9565b602060405180830381600087803b1580156113c257600080fd5b505af11580156113d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fa9190613f44565b90503373ffffffffffffffffffffffffffffffffffffffff167fcc60a283bc30f15f0d37ef24fad923527bb36819f6813593d7a0291c41dc564c83600001856000018460405161144c93929190614006565b60405180910390a280945050505050919050565b600061150961146d6123fb565b84611504856001600061147e6123fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122d890919063ffffffff16565b612403565b6001905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115896117fe565b6115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90614097565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600d600e60009054906101000a900460ff1660ff16815481106116b2576116b1613ba2565b5b90600052602060002090600302016040518060800160405290816000820180546116db90613a98565b80601f016020809104026020016040519081016040528092919081815260200182805461170790613a98565b80156117545780601f1061172957610100808354040283529160200191611754565b820191906000526020600020905b81548152906001019060200180831161173757829003601f168201915b505050505081526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201548152505090506117ce600f5482606001516122d890919063ffffffff16565b91505090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118416123fb565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b60606004805461186c90613a98565b80601f016020809104026020016040519081016040528092919081815260200182805461189890613a98565b80156118e55780601f106118ba576101008083540402835291602001916118e5565b820191906000526020600020905b8154815290600101906020018083116118c857829003601f168201915b5050505050905090565b600e60009054906101000a900460ff1681565b60006119c561190f6123fb565b846119c08560405180606001604052806025815260200161489960259139600160006119396123fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461294c9092919063ffffffff16565b612403565b6001905092915050565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b3057600854421015611a9e576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b2f565b611aa781610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b60008211611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a90614103565b60405180910390fd5b611b7c826129b0565b3373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d83604051611bc291906134b8565b60405180910390a25050565b600033600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d3157600854421015611c9f576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d30565b611ca881610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b83600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e9257600854421015611e00576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e91565b611e0981610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b611e9c8585612c82565b9250505092915050565b6000611eb0611689565b4211905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600d8181548110611f4e57600080fd5b9060005260206000209060030201600091509050806000018054611f7190613a98565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9d90613a98565b8015611fea5780601f10611fbf57610100808354040283529160200191611fea565b820191906000526020600020905b815481529060010190602001808311611fcd57829003601f168201915b5050505050908060010160009054906101000a900463ffffffff16908060010160049054906101000a900463ffffffff16908060020154905084565b61203761203233611539565b610b45565b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120676117fe565b6120a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209d90614097565b60405180910390fd5b6120af81612ca0565b50565b600c81815481106120c257600080fd5b90600052602060002090600302016000915090508060000180546120e590613a98565b80601f016020809104026020016040519081016040528092919081815260200182805461211190613a98565b801561215e5780601f106121335761010080835404028352916020019161215e565b820191906000526020600020905b81548152906001019060200180831161214157829003601f168201915b5050505050908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900463ffffffff16908060010160069054906101000a900463ffffffff16908060020154905086565b6121c86117fe565b612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe90614097565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f75fc4fdf6d5e94402ecc584683c37c192cfde2ea99b612d59a6864204919c7e460405160405180910390a250565b60006122d083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061294c565b905092915050565b60008082846122e79190614123565b90508381101561232c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612323906141c5565b60405180910390fd5b8091505092915050565b60008083141561234957600090506123ab565b6000828461235791906141e5565b90508284826123669190613a38565b146123a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239d906142b1565b60405180910390fd5b809150505b92915050565b60006123f383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612dd0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246a90614343565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124da906143d5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125c191906134b8565b60405180910390a3505050565b60006125db848484612e33565b61269c846125e76123fb565b6126978560405180606001604052806028815260200161487160289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061264d6123fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461294c9092919063ffffffff16565b612403565b600190509392505050565b60011515600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dabff25306040518263ffffffff1660e01b81526004016127069190613805565b602060405180830381600087803b15801561272057600080fd5b505af1158015612734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127589190614421565b15151461279a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612791906144c0565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127f79190613805565b60206040518083038186803b15801561280f57600080fd5b505afa158015612823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128479190613f44565b90506000612853610855565b9050600061287c8261286e858761233690919063ffffffff16565b6123b190919063ffffffff16565b905061288f6128896123fb565b856130c8565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6128d56123fb565b836040518363ffffffff1660e01b81526004016128f39291906144e0565b602060405180830381600087803b15801561290d57600080fd5b505af1158015612921573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129459190614421565b5050505050565b6000838311158290612994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298b919061356c565b60405180910390fd5b50600083856129a39190614509565b9050809150509392505050565b60011515600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dabff25306040518263ffffffff1660e01b8152600401612a0f9190613805565b602060405180830381600087803b158015612a2957600080fd5b505af1158015612a3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a619190614421565b151514612aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9a906144c0565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612b009190613805565b60206040518083038186803b158015612b1857600080fd5b505afa158015612b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b509190613f44565b90506000612b5c610855565b90506000811480612b6d5750600082145b15612b8857612b83612b7d6123fb565b84613276565b612bc4565b6000612baf83612ba1848761233690919063ffffffff16565b6123b190919063ffffffff16565b9050612bc2612bbc6123fb565b82613276565b505b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd612c0a6123fb565b30866040518463ffffffff1660e01b8152600401612c2a9392919061453d565b602060405180830381600087803b158015612c4457600080fd5b505af1158015612c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7c9190614421565b50505050565b6000612c96612c8f6123fb565b8484612e33565b6001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d07906145e6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290612e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0e919061356c565b60405180910390fd5b5060008385612e269190613a38565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9a90614678565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0a9061470a565b60405180910390fd5b612f1e83838361340a565b612f898160405180606001604052806026815260200161484b602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461294c9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061301c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122d890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130bb91906134b8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312f9061479c565b60405180910390fd5b6131448260008361340a565b6131af81604051806060016040528060228152602001614829602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461294c9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506132068160025461228e90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161326a91906134b8565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132dd90614808565b60405180910390fd5b6132f26000838361340a565b613307816002546122d890919063ffffffff16565b60028190555061335e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122d890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133fe91906134b8565b60405180910390a35050565b505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061343f82613414565b9050919050565b61344f81613434565b811461345a57600080fd5b50565b60008135905061346c81613446565b92915050565b6000602082840312156134885761348761340f565b5b60006134968482850161345d565b91505092915050565b6000819050919050565b6134b28161349f565b82525050565b60006020820190506134cd60008301846134a9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561350d5780820151818401526020810190506134f2565b8381111561351c576000848401525b50505050565b6000601f19601f8301169050919050565b600061353e826134d3565b61354881856134de565b93506135588185602086016134ef565b61356181613522565b840191505092915050565b600060208201905081810360008301526135868184613533565b905092915050565b6135978161349f565b81146135a257600080fd5b50565b6000813590506135b48161358e565b92915050565b600080604083850312156135d1576135d061340f565b5b60006135df8582860161345d565b92505060206135f0858286016135a5565b9150509250929050565b60008115159050919050565b61360f816135fa565b82525050565b600060208201905061362a6000830184613606565b92915050565b6000819050919050565b600061365561365061364b84613414565b613630565b613414565b9050919050565b60006136678261363a565b9050919050565b60006136798261365c565b9050919050565b6136898161366e565b82525050565b60006020820190506136a46000830184613680565b92915050565b6000806000606084860312156136c3576136c261340f565b5b60006136d18682870161345d565b93505060206136e28682870161345d565b92505060406136f3868287016135a5565b9150509250925092565b6000602082840312156137135761371261340f565b5b6000613721848285016135a5565b91505092915050565b600060ff82169050919050565b6137408161372a565b82525050565b600060208201905061375b6000830184613737565b92915050565b61376a8161372a565b811461377557600080fd5b50565b60008135905061378781613761565b92915050565b6000602082840312156137a3576137a261340f565b5b60006137b184828501613778565b91505092915050565b60006137c58261365c565b9050919050565b6137d5816137ba565b82525050565b60006020820190506137f060008301846137cc565b92915050565b6137ff81613434565b82525050565b600060208201905061381a60008301846137f6565b92915050565b600080604083850312156138375761383661340f565b5b60006138458582860161345d565b92505060206138568582860161345d565b9150509250929050565b600063ffffffff82169050919050565b61387981613860565b82525050565b600060808201905081810360008301526138998187613533565b90506138a86020830186613870565b6138b56040830185613870565b6138c260608301846134a9565b95945050505050565b60006138d68261365c565b9050919050565b6138e6816138cb565b82525050565b600060208201905061390160008301846138dd565b92915050565b600060c08201905081810360008301526139218189613533565b90506139306020830188613737565b61393d6040830187613737565b61394a6060830186613870565b6139576080830185613870565b61396460a08301846134a9565b979650505050505050565b600061397a82613434565b9050919050565b61398a8161396f565b811461399557600080fd5b50565b6000813590506139a781613981565b92915050565b6000602082840312156139c3576139c261340f565b5b60006139d184828501613998565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a438261349f565b9150613a4e8361349f565b925082613a5e57613a5d6139da565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ab057607f821691505b60208210811415613ac457613ac3613a69565b5b50919050565b7f43616e6e6f742077697468647261772030000000000000000000000000000000600082015250565b6000613b006011836134de565b9150613b0b82613aca565b602082019050919050565b60006020820190508181036000830152613b2f81613af3565b9050919050565b7f43617264205479706520646f65736e2774206578697374000000000000000000600082015250565b6000613b6c6017836134de565b9150613b7782613b36565b602082019050919050565b60006020820190508181036000830152613b9b81613b5f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f436172642054797065206e6f7420617661696c61626c6520666f72206d696e7460008201527f696e670000000000000000000000000000000000000000000000000000000000602082015250565b6000613c2d6023836134de565b9150613c3882613bd1565b604082019050919050565b60006020820190508181036000830152613c5c81613c20565b9050919050565b7f4e6f7420656e6f75676820706f696e747320746f2072656465656d20666f722060008201527f6361726400000000000000000000000000000000000000000000000000000000602082015250565b6000613cbf6024836134de565b9150613cca82613c63565b604082019050919050565b60006020820190508181036000830152613cee81613cb2565b9050919050565b7f4d617820636172647320737570706c7920726561636865640000000000000000600082015250565b6000613d2b6018836134de565b9150613d3682613cf5565b602082019050919050565b60006020820190508181036000830152613d5a81613d1e565b9050919050565b7f44657369676e6174656420636974792069736e277420617661696c61626c652060008201527f666f72206d696e74696e67207965740000000000000000000000000000000000602082015250565b6000613dbd602f836134de565b9150613dc882613d61565b604082019050919050565b60006020820190508181036000830152613dec81613db0565b9050919050565b6000613dfe82613860565b9150613e0983613860565b92508263ffffffff03821115613e2257613e21613a09565b5b828201905092915050565b6000613e388261372a565b915060ff821415613e4c57613e4b613a09565b5b600182019050919050565b6000819050919050565b6000613e7c613e77613e7284613e57565b613630565b61349f565b9050919050565b613e8c81613e61565b82525050565b600082825260208201905092915050565b50565b6000613eb3600083613e92565b9150613ebe82613ea3565b600082019050919050565b600060c082019050613ede60008301886137f6565b613eeb6020830187613e83565b613ef86040830186613e83565b613f056060830185613737565b613f126080830184613737565b81810360a0830152613f2381613ea6565b90509695505050505050565b600081519050613f3e8161358e565b92915050565b600060208284031215613f5a57613f5961340f565b5b6000613f6884828501613f2f565b91505092915050565b60008190508160005260206000209050919050565b60008154613f9381613a98565b613f9d81866134de565b94506001821660008114613fb85760018114613fca57613ffd565b60ff1983168652602086019350613ffd565b613fd385613f71565b60005b83811015613ff557815481890152600182019150602081019050613fd6565b808801955050505b50505092915050565b600060608201905081810360008301526140208186613f86565b905081810360208301526140348185613f86565b905061404360408301846134a9565b949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140816020836134de565b915061408c8261404b565b602082019050919050565b600060208201905081810360008301526140b081614074565b9050919050565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b60006140ed600e836134de565b91506140f8826140b7565b602082019050919050565b6000602082019050818103600083015261411c816140e0565b9050919050565b600061412e8261349f565b91506141398361349f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561416e5761416d613a09565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b60006141af601b836134de565b91506141ba82614179565b602082019050919050565b600060208201905081810360008301526141de816141a2565b9050919050565b60006141f08261349f565b91506141fb8361349f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561423457614233613a09565b5b828202905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061429b6021836134de565b91506142a68261423f565b604082019050919050565b600060208201905081810360008301526142ca8161428e565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061432d6024836134de565b9150614338826142d1565b604082019050919050565b6000602082019050818103600083015261435c81614320565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006143bf6022836134de565b91506143ca82614363565b604082019050919050565b600060208201905081810360008301526143ee816143b2565b9050919050565b6143fe816135fa565b811461440957600080fd5b50565b60008151905061441b816143f5565b92915050565b6000602082840312156144375761443661340f565b5b60006144458482850161440c565b91505092915050565b7f4572726f722072657472696576696e672066756e64732066726f6d207265736560008201527f7276650000000000000000000000000000000000000000000000000000000000602082015250565b60006144aa6023836134de565b91506144b58261444e565b604082019050919050565b600060208201905081810360008301526144d98161449d565b9050919050565b60006040820190506144f560008301856137f6565b61450260208301846134a9565b9392505050565b60006145148261349f565b915061451f8361349f565b92508282101561453257614531613a09565b5b828203905092915050565b600060608201905061455260008301866137f6565b61455f60208301856137f6565b61456c60408301846134a9565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145d06026836134de565b91506145db82614574565b604082019050919050565b600060208201905081810360008301526145ff816145c3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006146626025836134de565b915061466d82614606565b604082019050919050565b6000602082019050818103600083015261469181614655565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006146f46023836134de565b91506146ff82614698565b604082019050919050565b60006020820190508181036000830152614723816146e7565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006147866021836134de565b91506147918261472a565b604082019050919050565b600060208201905081810360008301526147b581614779565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006147f2601f836134de565b91506147fd826147bc565b602082019050919050565b60006020820190508181036000830152614821816147e5565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220bda92198b7496d12eb65765af37ec831c990c0bd13828ab65e18fcf367fd2ec964736f6c634300080900330000000000000000000000008503a7b00b4b52692cc6c14e5b96f142e30547b70000000000000000000000001b37d04759ad542640cc44ff849a3730403860500000000000000000000000000143b71443650aa8efa76bd82f35c22ebd558090000000000000000000000000000000000000000000000000000000006240fa80000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000554616e6974000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000652657368656600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008417368746172746500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074d656c716172740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064573686d756e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064b7573686f720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648616d6d6f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000006436f6d6d6f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008556e636f6d6d6f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004526172650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094c6567656e64617279000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000001b1ae4d6e2ef50000000000000000000000000000000000000000000000000006c6b935b8bbd4000000000000000000000000000000000000000000000000000a968163f0a57b40000000000000000000000000000000000000000000000000152d02c7e14af6800000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000258000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000017700000000000000000000000000000000000000000000000000000000000000bb800000000000000000000000000000000000000000000000000000000000003e30000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000007530000000000000000000000000000000000000000000000000000000000000270c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000927c000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000001869d000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000005b8d8000000000000000000000000000000000000000000000000000000000002dc6c000000000000000000000000000000000000000000000000000000000000f423e000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000039387000000000000000000000000000000000000000000000000000000000001c9c380000000000000000000000000000000000000000000000000000000000098967f0000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e45760003560e01c806372ae12cf1161010f578063ad61f87d116100a2578063f17f244111610071578063f17f24411461059e578063f2fde38b146105bc578063f43156e3146105d8578063f56e9c661461060d576101e4565b8063ad61f87d14610513578063dd62ed3e14610531578063e5bea43514610561578063e9fad8ee14610594576101e4565b8063a44bc4c2116100de578063a44bc4c214610479578063a457c2d714610497578063a694fc3a146104c7578063a9059cbb146104e3576101e4565b806372ae12cf146104015780638da5cb5b1461041f5780638f32d59b1461043d57806395d89b411461045b576101e4565b80632b425e9a116101875780633950935111610156578063395093511461037957806347ccca02146103a957806370a08231146103c7578063715018a6146103f7576101e4565b80632b425e9a146102f15780632e1a7d4d1461030f578063313ce5671461032b57806332271faf14610349576101e4565b8063101114cf116101c3578063101114cf1461026757806318160ddd1461028557806323b80449146102a357806323b872dd146102c1576101e4565b80628cc262146101e957806306fdde0314610219578063095ea7b314610237575b600080fd5b61020360048036038101906101fe9190613472565b610629565b60405161021091906134b8565b60405180910390f35b61022161077f565b60405161022e919061356c565b60405180910390f35b610251600480360381019061024c91906135ba565b610811565b60405161025e9190613615565b60405180910390f35b61026f61082f565b60405161027c919061368f565b60405180910390f35b61028d610855565b60405161029a91906134b8565b60405180910390f35b6102ab61085f565b6040516102b891906134b8565b60405180910390f35b6102db60048036038101906102d691906136aa565b610865565b6040516102e89190613615565b60405180910390f35b6102f9610b3f565b60405161030691906134b8565b60405180910390f35b610329600480360381019061032491906136fd565b610b45565b005b610333610d44565b6040516103409190613746565b60405180910390f35b610363600480360381019061035e919061378d565b610d5b565b60405161037091906134b8565b60405180910390f35b610393600480360381019061038e91906135ba565b611460565b6040516103a09190613615565b60405180910390f35b6103b1611513565b6040516103be91906137db565b60405180910390f35b6103e160048036038101906103dc9190613472565b611539565b6040516103ee91906134b8565b60405180910390f35b6103ff611581565b005b610409611689565b60405161041691906134b8565b60405180910390f35b6104276117d4565b6040516104349190613805565b60405180910390f35b6104456117fe565b6040516104529190613615565b60405180910390f35b61046361185d565b604051610470919061356c565b60405180910390f35b6104816118ef565b60405161048e9190613746565b60405180910390f35b6104b160048036038101906104ac91906135ba565b611902565b6040516104be9190613615565b60405180910390f35b6104e160048036038101906104dc91906136fd565b6119cf565b005b6104fd60048036038101906104f891906135ba565b611bce565b60405161050a9190613615565b60405180910390f35b61051b611ea6565b6040516105289190613615565b60405180910390f35b61054b60048036038101906105469190613820565b611eb7565b60405161055891906134b8565b60405180910390f35b61057b600480360381019061057691906136fd565b611f3e565b60405161058b949392919061387f565b60405180910390f35b61059c612026565b005b6105a6612039565b6040516105b391906138ec565b60405180910390f35b6105d660048036038101906105d19190613472565b61205f565b005b6105f260048036038101906105ed91906136fd565b6120b2565b60405161060496959493929190613907565b60405180910390f35b610627600480360381019061062291906139ad565b6121c0565b005b600060085442101561063e576000905061077a565b6000610692600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261228e90919063ffffffff16565b9050600061069f84611539565b90506000670de0b6b3a76400009050600081836106bc9190613a38565b9050600061070c60f06106fe6106dd612ee0866122d890919063ffffffff16565b6106f0868861233690919063ffffffff16565b6123b190919063ffffffff16565b6123b190919063ffffffff16565b9050610772610724868361233690919063ffffffff16565b600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122d890919063ffffffff16565b955050505050505b919050565b60606003805461078e90613a98565b80601f01602080910402602001604051908101604052809291908181526020018280546107ba90613a98565b80156108075780601f106107dc57610100808354040283529160200191610807565b820191906000526020600020905b8154815290600101906020018083116107ea57829003601f168201915b5050505050905090565b600061082561081e6123fb565b8484612403565b6001905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b60085481565b600083600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109c857600854421015610936576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506109c7565b61093f81610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b83600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b2957600854421015610a97576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b28565b610aa081610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b610b348686866125ce565b925050509392505050565b600f5481565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ca657600854421015610c14576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ca5565b610c1d81610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b60008211610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090613b16565b60405180910390fd5b610cf2826126a7565b3373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610d3891906134b8565b60405180910390a25050565b6000600560009054906101000a900460ff16905090565b600033600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ebe57600854421015610e2c576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ebd565b610e3581610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b600c805490508360ff1610610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90613b82565b60405180910390fd5b6000600c8460ff1681548110610f2157610f20613ba2565b5b9060005260206000209060030201905060008160010160069054906101000a900463ffffffff1663ffffffff1611610f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8590613c43565b60405180910390fd5b8060020154600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90613cd5565b60405180910390fd5b8060010160069054906101000a900463ffffffff1663ffffffff168160010160029054906101000a900463ffffffff1663ffffffff161061108a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108190613d41565b60405180910390fd5b600e60009054906101000a900460ff1660ff168160010160009054906101000a900460ff1660ff16146110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990613dd3565b60405180910390fd5b6000600d8260010160009054906101000a900460ff1660ff168154811061111c5761111b613ba2565b5b90600052602060002090600302019050611145600f5482600201546122d890919063ffffffff16565b4211611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90613dd3565b60405180910390fd5b60018160010160009054906101000a900463ffffffff166111a79190613df3565b8160010160006101000a81548163ffffffff021916908363ffffffff16021790555060018260010160029054906101000a900463ffffffff166111ea9190613df3565b8260010160026101000a81548163ffffffff021916908363ffffffff1602179055508060010160049054906101000a900463ffffffff1663ffffffff168160010160009054906101000a900463ffffffff1663ffffffff161061128757600e600081819054906101000a900460ff168092919061126690613e2d565b91906101000a81548160ff021916908360ff1602179055505042600f819055505b6112dd8260020154600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461228e90919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f74a794336001808760010160009054906101000a900460ff168860010160019054906101000a900460ff166040518663ffffffff1660e01b81526004016113a8959493929190613ec9565b602060405180830381600087803b1580156113c257600080fd5b505af11580156113d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fa9190613f44565b90503373ffffffffffffffffffffffffffffffffffffffff167fcc60a283bc30f15f0d37ef24fad923527bb36819f6813593d7a0291c41dc564c83600001856000018460405161144c93929190614006565b60405180910390a280945050505050919050565b600061150961146d6123fb565b84611504856001600061147e6123fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122d890919063ffffffff16565b612403565b6001905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115896117fe565b6115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90614097565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600d600e60009054906101000a900460ff1660ff16815481106116b2576116b1613ba2565b5b90600052602060002090600302016040518060800160405290816000820180546116db90613a98565b80601f016020809104026020016040519081016040528092919081815260200182805461170790613a98565b80156117545780601f1061172957610100808354040283529160200191611754565b820191906000526020600020905b81548152906001019060200180831161173757829003601f168201915b505050505081526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201548152505090506117ce600f5482606001516122d890919063ffffffff16565b91505090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118416123fb565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b60606004805461186c90613a98565b80601f016020809104026020016040519081016040528092919081815260200182805461189890613a98565b80156118e55780601f106118ba576101008083540402835291602001916118e5565b820191906000526020600020905b8154815290600101906020018083116118c857829003601f168201915b5050505050905090565b600e60009054906101000a900460ff1681565b60006119c561190f6123fb565b846119c08560405180606001604052806025815260200161489960259139600160006119396123fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461294c9092919063ffffffff16565b612403565b6001905092915050565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b3057600854421015611a9e576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b2f565b611aa781610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b60008211611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a90614103565b60405180910390fd5b611b7c826129b0565b3373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d83604051611bc291906134b8565b60405180910390a25050565b600033600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d3157600854421015611c9f576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d30565b611ca881610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b83600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e9257600854421015611e00576000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600854600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e91565b611e0981610629565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b611e9c8585612c82565b9250505092915050565b6000611eb0611689565b4211905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600d8181548110611f4e57600080fd5b9060005260206000209060030201600091509050806000018054611f7190613a98565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9d90613a98565b8015611fea5780601f10611fbf57610100808354040283529160200191611fea565b820191906000526020600020905b815481529060010190602001808311611fcd57829003601f168201915b5050505050908060010160009054906101000a900463ffffffff16908060010160049054906101000a900463ffffffff16908060020154905084565b61203761203233611539565b610b45565b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120676117fe565b6120a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209d90614097565b60405180910390fd5b6120af81612ca0565b50565b600c81815481106120c257600080fd5b90600052602060002090600302016000915090508060000180546120e590613a98565b80601f016020809104026020016040519081016040528092919081815260200182805461211190613a98565b801561215e5780601f106121335761010080835404028352916020019161215e565b820191906000526020600020905b81548152906001019060200180831161214157829003601f168201915b5050505050908060010160009054906101000a900460ff16908060010160019054906101000a900460ff16908060010160029054906101000a900463ffffffff16908060010160069054906101000a900463ffffffff16908060020154905086565b6121c86117fe565b612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe90614097565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f75fc4fdf6d5e94402ecc584683c37c192cfde2ea99b612d59a6864204919c7e460405160405180910390a250565b60006122d083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061294c565b905092915050565b60008082846122e79190614123565b90508381101561232c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612323906141c5565b60405180910390fd5b8091505092915050565b60008083141561234957600090506123ab565b6000828461235791906141e5565b90508284826123669190613a38565b146123a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239d906142b1565b60405180910390fd5b809150505b92915050565b60006123f383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612dd0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246a90614343565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124da906143d5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125c191906134b8565b60405180910390a3505050565b60006125db848484612e33565b61269c846125e76123fb565b6126978560405180606001604052806028815260200161487160289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061264d6123fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461294c9092919063ffffffff16565b612403565b600190509392505050565b60011515600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dabff25306040518263ffffffff1660e01b81526004016127069190613805565b602060405180830381600087803b15801561272057600080fd5b505af1158015612734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127589190614421565b15151461279a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612791906144c0565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127f79190613805565b60206040518083038186803b15801561280f57600080fd5b505afa158015612823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128479190613f44565b90506000612853610855565b9050600061287c8261286e858761233690919063ffffffff16565b6123b190919063ffffffff16565b905061288f6128896123fb565b856130c8565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6128d56123fb565b836040518363ffffffff1660e01b81526004016128f39291906144e0565b602060405180830381600087803b15801561290d57600080fd5b505af1158015612921573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129459190614421565b5050505050565b6000838311158290612994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298b919061356c565b60405180910390fd5b50600083856129a39190614509565b9050809150509392505050565b60011515600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dabff25306040518263ffffffff1660e01b8152600401612a0f9190613805565b602060405180830381600087803b158015612a2957600080fd5b505af1158015612a3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a619190614421565b151514612aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9a906144c0565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612b009190613805565b60206040518083038186803b158015612b1857600080fd5b505afa158015612b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b509190613f44565b90506000612b5c610855565b90506000811480612b6d5750600082145b15612b8857612b83612b7d6123fb565b84613276565b612bc4565b6000612baf83612ba1848761233690919063ffffffff16565b6123b190919063ffffffff16565b9050612bc2612bbc6123fb565b82613276565b505b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd612c0a6123fb565b30866040518463ffffffff1660e01b8152600401612c2a9392919061453d565b602060405180830381600087803b158015612c4457600080fd5b505af1158015612c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7c9190614421565b50505050565b6000612c96612c8f6123fb565b8484612e33565b6001905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d07906145e6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290612e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0e919061356c565b60405180910390fd5b5060008385612e269190613a38565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9a90614678565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0a9061470a565b60405180910390fd5b612f1e83838361340a565b612f898160405180606001604052806026815260200161484b602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461294c9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061301c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122d890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130bb91906134b8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312f9061479c565b60405180910390fd5b6131448260008361340a565b6131af81604051806060016040528060228152602001614829602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461294c9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506132068160025461228e90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161326a91906134b8565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132dd90614808565b60405180910390fd5b6132f26000838361340a565b613307816002546122d890919063ffffffff16565b60028190555061335e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122d890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133fe91906134b8565b60405180910390a35050565b505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061343f82613414565b9050919050565b61344f81613434565b811461345a57600080fd5b50565b60008135905061346c81613446565b92915050565b6000602082840312156134885761348761340f565b5b60006134968482850161345d565b91505092915050565b6000819050919050565b6134b28161349f565b82525050565b60006020820190506134cd60008301846134a9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561350d5780820151818401526020810190506134f2565b8381111561351c576000848401525b50505050565b6000601f19601f8301169050919050565b600061353e826134d3565b61354881856134de565b93506135588185602086016134ef565b61356181613522565b840191505092915050565b600060208201905081810360008301526135868184613533565b905092915050565b6135978161349f565b81146135a257600080fd5b50565b6000813590506135b48161358e565b92915050565b600080604083850312156135d1576135d061340f565b5b60006135df8582860161345d565b92505060206135f0858286016135a5565b9150509250929050565b60008115159050919050565b61360f816135fa565b82525050565b600060208201905061362a6000830184613606565b92915050565b6000819050919050565b600061365561365061364b84613414565b613630565b613414565b9050919050565b60006136678261363a565b9050919050565b60006136798261365c565b9050919050565b6136898161366e565b82525050565b60006020820190506136a46000830184613680565b92915050565b6000806000606084860312156136c3576136c261340f565b5b60006136d18682870161345d565b93505060206136e28682870161345d565b92505060406136f3868287016135a5565b9150509250925092565b6000602082840312156137135761371261340f565b5b6000613721848285016135a5565b91505092915050565b600060ff82169050919050565b6137408161372a565b82525050565b600060208201905061375b6000830184613737565b92915050565b61376a8161372a565b811461377557600080fd5b50565b60008135905061378781613761565b92915050565b6000602082840312156137a3576137a261340f565b5b60006137b184828501613778565b91505092915050565b60006137c58261365c565b9050919050565b6137d5816137ba565b82525050565b60006020820190506137f060008301846137cc565b92915050565b6137ff81613434565b82525050565b600060208201905061381a60008301846137f6565b92915050565b600080604083850312156138375761383661340f565b5b60006138458582860161345d565b92505060206138568582860161345d565b9150509250929050565b600063ffffffff82169050919050565b61387981613860565b82525050565b600060808201905081810360008301526138998187613533565b90506138a86020830186613870565b6138b56040830185613870565b6138c260608301846134a9565b95945050505050565b60006138d68261365c565b9050919050565b6138e6816138cb565b82525050565b600060208201905061390160008301846138dd565b92915050565b600060c08201905081810360008301526139218189613533565b90506139306020830188613737565b61393d6040830187613737565b61394a6060830186613870565b6139576080830185613870565b61396460a08301846134a9565b979650505050505050565b600061397a82613434565b9050919050565b61398a8161396f565b811461399557600080fd5b50565b6000813590506139a781613981565b92915050565b6000602082840312156139c3576139c261340f565b5b60006139d184828501613998565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a438261349f565b9150613a4e8361349f565b925082613a5e57613a5d6139da565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ab057607f821691505b60208210811415613ac457613ac3613a69565b5b50919050565b7f43616e6e6f742077697468647261772030000000000000000000000000000000600082015250565b6000613b006011836134de565b9150613b0b82613aca565b602082019050919050565b60006020820190508181036000830152613b2f81613af3565b9050919050565b7f43617264205479706520646f65736e2774206578697374000000000000000000600082015250565b6000613b6c6017836134de565b9150613b7782613b36565b602082019050919050565b60006020820190508181036000830152613b9b81613b5f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f436172642054797065206e6f7420617661696c61626c6520666f72206d696e7460008201527f696e670000000000000000000000000000000000000000000000000000000000602082015250565b6000613c2d6023836134de565b9150613c3882613bd1565b604082019050919050565b60006020820190508181036000830152613c5c81613c20565b9050919050565b7f4e6f7420656e6f75676820706f696e747320746f2072656465656d20666f722060008201527f6361726400000000000000000000000000000000000000000000000000000000602082015250565b6000613cbf6024836134de565b9150613cca82613c63565b604082019050919050565b60006020820190508181036000830152613cee81613cb2565b9050919050565b7f4d617820636172647320737570706c7920726561636865640000000000000000600082015250565b6000613d2b6018836134de565b9150613d3682613cf5565b602082019050919050565b60006020820190508181036000830152613d5a81613d1e565b9050919050565b7f44657369676e6174656420636974792069736e277420617661696c61626c652060008201527f666f72206d696e74696e67207965740000000000000000000000000000000000602082015250565b6000613dbd602f836134de565b9150613dc882613d61565b604082019050919050565b60006020820190508181036000830152613dec81613db0565b9050919050565b6000613dfe82613860565b9150613e0983613860565b92508263ffffffff03821115613e2257613e21613a09565b5b828201905092915050565b6000613e388261372a565b915060ff821415613e4c57613e4b613a09565b5b600182019050919050565b6000819050919050565b6000613e7c613e77613e7284613e57565b613630565b61349f565b9050919050565b613e8c81613e61565b82525050565b600082825260208201905092915050565b50565b6000613eb3600083613e92565b9150613ebe82613ea3565b600082019050919050565b600060c082019050613ede60008301886137f6565b613eeb6020830187613e83565b613ef86040830186613e83565b613f056060830185613737565b613f126080830184613737565b81810360a0830152613f2381613ea6565b90509695505050505050565b600081519050613f3e8161358e565b92915050565b600060208284031215613f5a57613f5961340f565b5b6000613f6884828501613f2f565b91505092915050565b60008190508160005260206000209050919050565b60008154613f9381613a98565b613f9d81866134de565b94506001821660008114613fb85760018114613fca57613ffd565b60ff1983168652602086019350613ffd565b613fd385613f71565b60005b83811015613ff557815481890152600182019150602081019050613fd6565b808801955050505b50505092915050565b600060608201905081810360008301526140208186613f86565b905081810360208301526140348185613f86565b905061404360408301846134a9565b949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140816020836134de565b915061408c8261404b565b602082019050919050565b600060208201905081810360008301526140b081614074565b9050919050565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b60006140ed600e836134de565b91506140f8826140b7565b602082019050919050565b6000602082019050818103600083015261411c816140e0565b9050919050565b600061412e8261349f565b91506141398361349f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561416e5761416d613a09565b5b828201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b60006141af601b836134de565b91506141ba82614179565b602082019050919050565b600060208201905081810360008301526141de816141a2565b9050919050565b60006141f08261349f565b91506141fb8361349f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561423457614233613a09565b5b828202905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061429b6021836134de565b91506142a68261423f565b604082019050919050565b600060208201905081810360008301526142ca8161428e565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061432d6024836134de565b9150614338826142d1565b604082019050919050565b6000602082019050818103600083015261435c81614320565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006143bf6022836134de565b91506143ca82614363565b604082019050919050565b600060208201905081810360008301526143ee816143b2565b9050919050565b6143fe816135fa565b811461440957600080fd5b50565b60008151905061441b816143f5565b92915050565b6000602082840312156144375761443661340f565b5b60006144458482850161440c565b91505092915050565b7f4572726f722072657472696576696e672066756e64732066726f6d207265736560008201527f7276650000000000000000000000000000000000000000000000000000000000602082015250565b60006144aa6023836134de565b91506144b58261444e565b604082019050919050565b600060208201905081810360008301526144d98161449d565b9050919050565b60006040820190506144f560008301856137f6565b61450260208301846134a9565b9392505050565b60006145148261349f565b915061451f8361349f565b92508282101561453257614531613a09565b5b828203905092915050565b600060608201905061455260008301866137f6565b61455f60208301856137f6565b61456c60408301846134a9565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145d06026836134de565b91506145db82614574565b604082019050919050565b600060208201905081810360008301526145ff816145c3565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006146626025836134de565b915061466d82614606565b604082019050919050565b6000602082019050818103600083015261469181614655565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006146f46023836134de565b91506146ff82614698565b604082019050919050565b60006020820190508181036000830152614723816146e7565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006147866021836134de565b91506147918261472a565b604082019050919050565b600060208201905081810360008301526147b581614779565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006147f2601f836134de565b91506147fd826147bc565b602082019050919050565b60006020820190508181036000830152614821816147e5565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220bda92198b7496d12eb65765af37ec831c990c0bd13828ab65e18fcf367fd2ec964736f6c63430008090033

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

0000000000000000000000008503a7b00b4b52692cc6c14e5b96f142e30547b70000000000000000000000001b37d04759ad542640cc44ff849a3730403860500000000000000000000000000143b71443650aa8efa76bd82f35c22ebd558090000000000000000000000000000000000000000000000000000000006240fa80000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000554616e6974000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000652657368656600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008417368746172746500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074d656c716172740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064573686d756e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064b7573686f720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000648616d6d6f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000006436f6d6d6f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008556e636f6d6d6f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004526172650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094c6567656e64617279000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000001b1ae4d6e2ef50000000000000000000000000000000000000000000000000006c6b935b8bbd4000000000000000000000000000000000000000000000000000a968163f0a57b40000000000000000000000000000000000000000000000000152d02c7e14af6800000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000258000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000017700000000000000000000000000000000000000000000000000000000000000bb800000000000000000000000000000000000000000000000000000000000003e30000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000ea600000000000000000000000000000000000000000000000000000000000007530000000000000000000000000000000000000000000000000000000000000270c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000927c000000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000001869d000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000005b8d8000000000000000000000000000000000000000000000000000000000002dc6c000000000000000000000000000000000000000000000000000000000000f423e000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000039387000000000000000000000000000000000000000000000000000000000001c9c380000000000000000000000000000000000000000000000000000000000098967f0000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : _meed (address): 0x8503a7b00B4b52692cC6c14e5b96F142E30547b7
Arg [1] : _rewardDistribution (address): 0x1B37D04759aD542640Cc44Ff849a373040386050
Arg [2] : _nftAddress (address): 0x0143b71443650AA8eFA76BD82F35c22EBD558090
Arg [3] : _startRewardsTime (uint256): 1648425600
Arg [4] : _cityNames (string[]): Tanit,Reshef,Ashtarte,Melqart,Eshmun,Kushor,Hammon
Arg [5] : _cardNames (string[]): Common,Uncommon,Rare,Legendary
Arg [6] : _cardPrices (uint256[]): 8000000000000000000000,32000000000000000000000,50000000000000000000000,100000000000000000000000
Arg [7] : _cardSupply (uint32[]): 50,30,13,7,600,300,94,6,6000,3000,995,5,60000,30000,9996,4,600000,300000,99997,3,6000000,3000000,999998,2,60000000,30000000,9999999,1

-----Encoded View---------------
77 Constructor Arguments found :
Arg [0] : 0000000000000000000000008503a7b00b4b52692cc6c14e5b96f142e30547b7
Arg [1] : 0000000000000000000000001b37d04759ad542640cc44ff849a373040386050
Arg [2] : 0000000000000000000000000143b71443650aa8efa76bd82f35c22ebd558090
Arg [3] : 000000000000000000000000000000000000000000000000000000006240fa80
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [5] : 00000000000000000000000000000000000000000000000000000000000003c0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000560
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000600
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [9] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [12] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [13] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [17] : 54616e6974000000000000000000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [19] : 5265736865660000000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [21] : 4173687461727465000000000000000000000000000000000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [23] : 4d656c7161727400000000000000000000000000000000000000000000000000
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [25] : 4573686d756e0000000000000000000000000000000000000000000000000000
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [27] : 4b7573686f720000000000000000000000000000000000000000000000000000
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [29] : 48616d6d6f6e0000000000000000000000000000000000000000000000000000
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [32] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [36] : 436f6d6d6f6e0000000000000000000000000000000000000000000000000000
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [38] : 556e636f6d6d6f6e000000000000000000000000000000000000000000000000
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [40] : 5261726500000000000000000000000000000000000000000000000000000000
Arg [41] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [42] : 4c6567656e646172790000000000000000000000000000000000000000000000
Arg [43] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [44] : 0000000000000000000000000000000000000000000001b1ae4d6e2ef5000000
Arg [45] : 0000000000000000000000000000000000000000000006c6b935b8bbd4000000
Arg [46] : 000000000000000000000000000000000000000000000a968163f0a57b400000
Arg [47] : 00000000000000000000000000000000000000000000152d02c7e14af6800000
Arg [48] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [49] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [50] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [51] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [52] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [53] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [54] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [55] : 000000000000000000000000000000000000000000000000000000000000005e
Arg [56] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [57] : 0000000000000000000000000000000000000000000000000000000000001770
Arg [58] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [59] : 00000000000000000000000000000000000000000000000000000000000003e3
Arg [60] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [61] : 000000000000000000000000000000000000000000000000000000000000ea60
Arg [62] : 0000000000000000000000000000000000000000000000000000000000007530
Arg [63] : 000000000000000000000000000000000000000000000000000000000000270c
Arg [64] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [65] : 00000000000000000000000000000000000000000000000000000000000927c0
Arg [66] : 00000000000000000000000000000000000000000000000000000000000493e0
Arg [67] : 000000000000000000000000000000000000000000000000000000000001869d
Arg [68] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [69] : 00000000000000000000000000000000000000000000000000000000005b8d80
Arg [70] : 00000000000000000000000000000000000000000000000000000000002dc6c0
Arg [71] : 00000000000000000000000000000000000000000000000000000000000f423e
Arg [72] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [73] : 0000000000000000000000000000000000000000000000000000000003938700
Arg [74] : 0000000000000000000000000000000000000000000000000000000001c9c380
Arg [75] : 000000000000000000000000000000000000000000000000000000000098967f
Arg [76] : 0000000000000000000000000000000000000000000000000000000000000001


Deployed Bytecode Sourcemap

74357:4943:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71418:541;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58348:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60545:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68042:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59423:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70082:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73983:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74994:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72794:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59275:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77940:1355;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62092:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74841:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59586:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24793:140;;;:::i;:::-;;77578:200;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23982:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24348:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58550:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74954:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62895:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72242:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73574:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77373:126;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60197:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74919:28;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;73348:75;;;:::i;:::-;;68017:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25088:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74876:36;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;77166:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71418:541;71472:7;71514:16;;71496:15;:34;71492:460;;;71552:1;71545:8;;;;71492:460;71584:22;71609:50;71629:20;:29;71650:7;71629:29;;;;;;;;;;;;;;;;71609:15;:19;;:50;;;;:::i;:::-;71584:75;;71672:15;71690:18;71700:7;71690:9;:18::i;:::-;71672:36;;71721:16;71740:4;71721:23;;71757:9;71779:8;71769:7;:18;;;;:::i;:::-;71757:30;;71800:21;71824:42;71862:3;71824:33;71844:12;71850:5;71844:1;:5;;:12;;;;:::i;:::-;71824:15;71837:1;71824:8;:12;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;:37;;:42;;;;:::i;:::-;71800:66;;71886:54;71906:33;71924:14;71906:13;:17;;:33;;;;:::i;:::-;71886:6;:15;71893:7;71886:15;;;;;;;;;;;;;;;;:19;;:54;;;;:::i;:::-;71879:61;;;;;;;71418:541;;;;:::o;58348:83::-;58385:13;58418:5;58411:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58348:83;:::o;60545:210::-;60664:4;60686:39;60695:12;:10;:12::i;:::-;60709:7;60718:6;60686:8;:39::i;:::-;60743:4;60736:11;;60545:210;;;;:::o;68042:42::-;;;;;;;;;;;;;:::o;59423:100::-;59476:7;59503:12;;59496:19;;59423:100;:::o;70082:31::-;;;;:::o;73983:282::-;74188:4;74129:6;70672:1;70653:21;;:7;:21;;;70649:332;;70711:16;;70693:15;:34;70689:281;;;70762:1;70744:6;:15;70751:7;70744:15;;;;;;;;;;;;;;;:19;;;;70810:16;;70778:20;:29;70799:7;70778:29;;;;;;;;;;;;;;;:48;;;;70689:281;;;70879:15;70886:7;70879:6;:15::i;:::-;70861:6;:15;70868:7;70861:15;;;;;;;;;;;;;;;:33;;;;70941:15;70909:20;:29;70930:7;70909:29;;;;;;;;;;;;;;;:47;;;;70689:281;70649:332;74159:9:::1;70672:1;70653:21;;:7;:21;;;70649:332;;70711:16;;70693:15;:34;70689:281;;;70762:1;70744:6;:15;70751:7;70744:15;;;;;;;;;;;;;;;:19;;;;70810:16;;70778:20;:29;70799:7;70778:29;;;;;;;;;;;;;;;:48;;;;70689:281;;;70879:15;70886:7;70879:6;:15::i;:::-;70861:6;:15;70868:7;70861:15;;;;;;;;;;;;;;;:33;;;;70941:15;70909:20;:29;70930:7;70909:29;;;;;;;;;;;;;;;:47;;;;70689:281;70649:332;74212:45:::2;74231:6;74239:9;74250:6;74212:18;:45::i;:::-;74205:52;;70991:1:::1;73983:282:::0;;;;;;:::o;74994:46::-;;;;:::o;72794:200::-;72848:10;70672:1;70653:21;;:7;:21;;;70649:332;;70711:16;;70693:15;:34;70689:281;;;70762:1;70744:6;:15;70751:7;70744:15;;;;;;;;;;;;;;;:19;;;;70810:16;;70778:20;:29;70799:7;70778:29;;;;;;;;;;;;;;;:48;;;;70689:281;;;70879:15;70886:7;70879:6;:15::i;:::-;70861:6;:15;70868:7;70861:15;;;;;;;;;;;;;;;:33;;;;70941:15;70909:20;:29;70930:7;70909:29;;;;;;;;;;;;;;;:47;;;;70689:281;70649:332;72888:1:::1;72879:6;:10;72871:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;72924:17;72934:6;72924:9;:17::i;:::-;72967:10;72957:29;;;72979:6;72957:29;;;;;;:::i;:::-;;;;;;;;72794:200:::0;;:::o;59275:83::-;59316:5;59341:9;;;;;;;;;;;59334:16;;59275:83;:::o;77940:1355::-;78015:15;77994:10;70672:1;70653:21;;:7;:21;;;70649:332;;70711:16;;70693:15;:34;70689:281;;;70762:1;70744:6;:15;70751:7;70744:15;;;;;;;;;;;;;;;:19;;;;70810:16;;70778:20;:29;70799:7;70778:29;;;;;;;;;;;;;;;:48;;;;70689:281;;;70879:15;70886:7;70879:6;:15::i;:::-;70861:6;:15;70868:7;70861:15;;;;;;;;;;;;;;;:33;;;;70941:15;70909:20;:29;70930:7;70909:29;;;;;;;;;;;;;;;:47;;;;70689:281;70649:332;78064:12:::1;:19;;;;78051:10;:32;;;78043:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78124:31;78158:12;78171:10;78158:24;;;;;;;;;;:::i;:::-;;;;;;;;;;;;78124:58;;78222:1;78201:8;:18;;;;;;;;;;;;:22;;;78193:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;78304:8;:15;;;78282:6;:18;78289:10;78282:18;;;;;;;;;;;;;;;;:37;;78274:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;78397:8;:18;;;;;;;;;;;;78379:36;;:8;:15;;;;;;;;;;;;:36;;;78371:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;78485:16;;;;;;;;;;;78463:38;;:8;:18;;;;;;;;;;;;:38;;;78455:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;78566:23;78592:8;78601;:18;;;;;;;;;;;;78592:28;;;;;;;;;;:::i;:::-;;;;;;;;;;;;78566:54;;78657:50;78679:27;;78657:4;:17;;;:21;;:50;;;;:::i;:::-;78639:15;:68;78631:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;78808:1;78790:4;:15;;;;;;;;;;;;:19;;;;:::i;:::-;78772:4;:15;;;:37;;;;;;;;;;;;;;;;;;78856:1;78838:8;:15;;;;;;;;;;;;:19;;;;:::i;:::-;78820:8;:15;;;:37;;;;;;;;;;;;;;;;;;78891:4;:18;;;;;;;;;;;;78872:37;;:4;:15;;;;;;;;;;;;:37;;;78868:148;;78926:16;;:18;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;78989:15;78959:27;:45;;;;78868:148;79049:39;79072:8;:15;;;79049:6;:18;79056:10;79049:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;79028:6;:18;79035:10;79028:18;;;;;;;;;;;;;;;:60;;;;79099:16;79118:3;;;;;;;;;;;:10;;;79129;79141:1;79144::::0;79147:8:::1;:18;;;;;;;;;;;;79167:8;:17;;;;;;;;;;;;79118:71;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79099:90;;79214:10;79205:56;;;79226:4;:9;;79237:8;:13;;79252:8;79205:56;;;;;;;;:::i;:::-;;;;;;;;79279:8;79272:15;;;;;77940:1355:::0;;;;:::o;62092:300::-;62207:4;62229:133;62252:12;:10;:12::i;:::-;62279:7;62301:50;62340:10;62301:11;:25;62313:12;:10;:12::i;:::-;62301:25;;;;;;;;;;;;;;;:34;62327:7;62301:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;62229:8;:133::i;:::-;62380:4;62373:11;;62092:300;;;;:::o;74841:26::-;;;;;;;;;;;;;:::o;59586:119::-;59652:7;59679:9;:18;59689:7;59679:18;;;;;;;;;;;;;;;;59672:25;;59586:119;;;:::o;24793:140::-;24194:9;:7;:9::i;:::-;24186:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;24892:1:::1;24855:40;;24876:6;;;;;;;;;;;24855:40;;;;;;;;;;;;24923:1;24906:6;;:19;;;;;;;;;;;;;;;;;;24793:140::o:0;77578:200::-;77631:7;77651:22;77676:8;77685:16;;;;;;;;;;;77676:26;;;;;;;;;;:::i;:::-;;;;;;;;;;;;77651:51;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77720:50;77742:27;;77720:4;:17;;;:21;;:50;;;;:::i;:::-;77713:57;;;77578:200;:::o;23982:79::-;24020:7;24047:6;;;;;;;;;;;24040:13;;23982:79;:::o;24348:94::-;24388:4;24428:6;;;;;;;;;;;24412:22;;:12;:10;:12::i;:::-;:22;;;24405:29;;24348:94;:::o;58550:87::-;58589:13;58622:7;58615:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58550:87;:::o;74954:33::-;;;;;;;;;;;;;:::o;62895:400::-;63015:4;63037:228;63060:12;:10;:12::i;:::-;63087:7;63109:145;63166:15;63109:145;;;;;;;;;;;;;;;;;:11;:25;63121:12;:10;:12::i;:::-;63109:25;;;;;;;;;;;;;;;:34;63135:7;63109:34;;;;;;;;;;;;;;;;:38;;:145;;;;;:::i;:::-;63037:8;:228::i;:::-;63283:4;63276:11;;62895:400;;;;:::o;72242:188::-;72293:10;70672:1;70653:21;;:7;:21;;;70649:332;;70711:16;;70693:15;:34;70689:281;;;70762:1;70744:6;:15;70751:7;70744:15;;;;;;;;;;;;;;;:19;;;;70810:16;;70778:20;:29;70799:7;70778:29;;;;;;;;;;;;;;;:48;;;;70689:281;;;70879:15;70886:7;70879:6;:15::i;:::-;70861:6;:15;70868:7;70861:15;;;;;;;;;;;;;;;:33;;;;70941:15;70909:20;:29;70930:7;70909:29;;;;;;;;;;;;;;;:47;;;;70689:281;70649:332;72333:1:::1;72324:6;:10;72316:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;72366:14;72373:6;72366;:14::i;:::-;72403:10;72396:26;;;72415:6;72396:26;;;;;;:::i;:::-;;;;;;;;72242:188:::0;;:::o;73574:254::-;73763:4;73700:10;70672:1;70653:21;;:7;:21;;;70649:332;;70711:16;;70693:15;:34;70689:281;;;70762:1;70744:6;:15;70751:7;70744:15;;;;;;;;;;;;;;;:19;;;;70810:16;;70778:20;:29;70799:7;70778:29;;;;;;;;;;;;;;;:48;;;;70689:281;;;70879:15;70886:7;70879:6;:15::i;:::-;70861:6;:15;70868:7;70861:15;;;;;;;;;;;;;;;:33;;;;70941:15;70909:20;:29;70930:7;70909:29;;;;;;;;;;;;;;;:47;;;;70689:281;70649:332;73734:9:::1;70672:1;70653:21;;:7;:21;;;70649:332;;70711:16;;70693:15;:34;70689:281;;;70762:1;70744:6;:15;70751:7;70744:15;;;;;;;;;;;;;;;:19;;;;70810:16;;70778:20;:29;70799:7;70778:29;;;;;;;;;;;;;;;:48;;;;70689:281;;;70879:15;70886:7;70879:6;:15::i;:::-;70861:6;:15;70868:7;70861:15;;;;;;;;;;;;;;;:33;;;;70941:15;70909:20;:29;70930:7;70909:29;;;;;;;;;;;;;;;:47;;;;70689:281;70649:332;73787:33:::2;73802:9;73813:6;73787:14;:33::i;:::-;73780:40;;70991:1:::1;73574:254:::0;;;;;:::o;77373:126::-;77427:4;77469:22;:20;:22::i;:::-;77451:15;:40;77444:47;;77373:126;:::o;60197:201::-;60331:7;60363:11;:18;60375:5;60363:18;;;;;;;;;;;;;;;:27;60382:7;60363:27;;;;;;;;;;;;;;;;60356:34;;60197:201;;;;:::o;74919:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73348:75::-;73384:31;73393:21;73403:10;73393:9;:21::i;:::-;73384:8;:31::i;:::-;73348:75::o;68017:18::-;;;;;;;;;;;;;:::o;25088:109::-;24194:9;:7;:9::i;:::-;24186:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;25161:28:::1;25180:8;25161:18;:28::i;:::-;25088:109:::0;:::o;74876:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77166:133::-;24194:9;:7;:9::i;:::-;24186:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;77245:11:::1;77239:3;;:17;;;;;;;;;;;;;;;;;;77279:11;77272:19;;;;;;;;;;;;77166:133:::0;:::o;28045:136::-;28103:7;28130:43;28134:1;28137;28130:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;28123:50;;28045:136;;;;:::o;27587:181::-;27645:7;27665:9;27681:1;27677;:5;;;;:::i;:::-;27665:17;;27706:1;27701;:6;;27693:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;27759:1;27752:8;;;27587:181;;;;:::o;28966:471::-;29024:7;29274:1;29269;:6;29265:47;;;29299:1;29292:8;;;;29265:47;29324:9;29340:1;29336;:5;;;;:::i;:::-;29324:17;;29369:1;29364;29360;:5;;;;:::i;:::-;:10;29352:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;29428:1;29421:8;;;28966:471;;;;;:::o;29907:132::-;29965:7;29992:39;29996:1;29999;29992:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;29985:46;;29907:132;;;;:::o;22846:98::-;22899:7;22926:10;22919:17;;22846:98;:::o;66279:380::-;66432:1;66415:19;;:5;:19;;;;66407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66513:1;66494:21;;:7;:21;;;;66486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66597:6;66567:11;:18;66579:5;66567:18;;;;;;;;;;;;;;;:27;66586:7;66567:27;;;;;;;;;;;;;;;:36;;;;66635:7;66619:32;;66628:5;66619:32;;;66644:6;66619:32;;;;;;:::i;:::-;;;;;;;;66279:380;;;:::o;61229:454::-;61369:4;61386:36;61396:6;61404:9;61415:6;61386:9;:36::i;:::-;61433:220;61456:6;61477:12;:10;:12::i;:::-;61504:138;61560:6;61504:138;;;;;;;;;;;;;;;;;:11;:19;61516:6;61504:19;;;;;;;;;;;;;;;:33;61524:12;:10;:12::i;:::-;61504:33;;;;;;;;;;;;;;;;:37;;:138;;;;;:::i;:::-;61433:8;:220::i;:::-;61671:4;61664:11;;61229:454;;;;;:::o;69365:480::-;69537:4;69489:52;;:18;;;;;;;;;;;:29;;;69527:4;69489:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;69481:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;69594:17;69614:4;;;;;;;;;;;:14;;;69637:4;69614:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69594:49;;69654:19;69676:13;:11;:13::i;:::-;69654:35;;69700:12;69715:39;69742:11;69715:22;69727:9;69715:7;:11;;:22;;;;:::i;:::-;:26;;:39;;;;:::i;:::-;69700:54;;69765:28;69771:12;:10;:12::i;:::-;69785:7;69765:5;:28::i;:::-;69804:4;;;;;;;;;;;:13;;;69818:12;:10;:12::i;:::-;69832:4;69804:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69410:435;;;69365:480;:::o;28521:192::-;28607:7;28640:1;28635;:6;;28643:12;28627:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28667:9;28683:1;28679;:5;;;;:::i;:::-;28667:17;;28704:1;28697:8;;;28521:192;;;;;:::o;68448:627::-;68617:4;68569:52;;:18;;;;;;;;;;;:29;;;68607:4;68569:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;68561:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;68674:17;68694:4;;;;;;;;;;;:14;;;68717:4;68694:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68674:49;;68734:19;68756:13;:11;:13::i;:::-;68734:35;;68799:1;68784:11;:16;:34;;;;68817:1;68804:9;:14;68784:34;68780:222;;;68835:28;68841:12;:10;:12::i;:::-;68855:7;68835:5;:28::i;:::-;68780:222;;;68896:12;68911:39;68940:9;68911:24;68923:11;68911:7;:11;;:24;;;;:::i;:::-;:28;;:39;;;;:::i;:::-;68896:54;;68965:25;68971:12;:10;:12::i;:::-;68985:4;68965:5;:25::i;:::-;68881:121;68780:222;69012:4;;;;;;;;;;;:17;;;69030:12;:10;:12::i;:::-;69052:4;69059:7;69012:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68490:585;;68448:627;:::o;59918:216::-;60040:4;60062:42;60072:12;:10;:12::i;:::-;60086:9;60097:6;60062:9;:42::i;:::-;60122:4;60115:11;;59918:216;;;;:::o;25303:229::-;25397:1;25377:22;;:8;:22;;;;25369:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25487:8;25458:38;;25479:6;;;;;;;;;;;25458:38;;;;;;;;;;;;25516:8;25507:6;;:17;;;;;;;;;;;;;;;;;;25303:229;:::o;30572:343::-;30658:7;30757:1;30753;:5;30760:12;30745:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30784:9;30800:1;30796;:5;;;;:::i;:::-;30784:17;;30906:1;30899:8;;;30572:343;;;;;:::o;63785:610::-;63943:1;63925:20;;:6;:20;;;;63917:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;64027:1;64006:23;;:9;:23;;;;63998:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;64082:47;64103:6;64111:9;64122:6;64082:20;:47::i;:::-;64162:108;64198:6;64162:108;;;;;;;;;;;;;;;;;:9;:17;64172:6;64162:17;;;;;;;;;;;;;;;;:21;;:108;;;;;:::i;:::-;64142:9;:17;64152:6;64142:17;;;;;;;;;;;;;;;:128;;;;64304:32;64329:6;64304:9;:20;64314:9;64304:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;64281:9;:20;64291:9;64281:20;;;;;;;;;;;;;;;:55;;;;64369:9;64352:35;;64361:6;64352:35;;;64380:6;64352:35;;;;;;:::i;:::-;;;;;;;;63785:610;;;:::o;65386:455::-;65489:1;65470:21;;:7;:21;;;;65462:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;65542:49;65563:7;65580:1;65584:6;65542:20;:49::i;:::-;65625:105;65662:6;65625:105;;;;;;;;;;;;;;;;;:9;:18;65635:7;65625:18;;;;;;;;;;;;;;;;:22;;:105;;;;;:::i;:::-;65604:9;:18;65614:7;65604:18;;;;;;;;;;;;;;;:126;;;;65756:24;65773:6;65756:12;;:16;;:24;;;;:::i;:::-;65741:12;:39;;;;65822:1;65796:37;;65805:7;65796:37;;;65826:6;65796:37;;;;;;:::i;:::-;;;;;;;;65386:455;;:::o;64676:378::-;64779:1;64760:21;;:7;:21;;;;64752:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;64830:49;64859:1;64863:7;64872:6;64830:20;:49::i;:::-;64907:24;64924:6;64907:12;;:16;;:24;;;;:::i;:::-;64892:12;:39;;;;64963:30;64986:6;64963:9;:18;64973:7;64963:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;64942:9;:18;64952:7;64942:18;;;;;;;;;;;;;;;:51;;;;65030:7;65009:37;;65026:1;65009:37;;;65039:6;65009:37;;;;;;:::i;:::-;;;;;;;;64676:378;;:::o;67684:125::-;;;;:::o;88:117:1:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:99::-;1663:6;1697:5;1691:12;1681:22;;1611:99;;;:::o;1716:169::-;1800:11;1834:6;1829:3;1822:19;1874:4;1869:3;1865:14;1850:29;;1716:169;;;;:::o;1891:307::-;1959:1;1969:113;1983:6;1980:1;1977:13;1969:113;;;2068:1;2063:3;2059:11;2053:18;2049:1;2044:3;2040:11;2033:39;2005:2;2002:1;1998:10;1993:15;;1969:113;;;2100:6;2097:1;2094:13;2091:101;;;2180:1;2171:6;2166:3;2162:16;2155:27;2091:101;1940:258;1891:307;;;:::o;2204:102::-;2245:6;2296:2;2292:7;2287:2;2280:5;2276:14;2272:28;2262:38;;2204:102;;;:::o;2312:364::-;2400:3;2428:39;2461:5;2428:39;:::i;:::-;2483:71;2547:6;2542:3;2483:71;:::i;:::-;2476:78;;2563:52;2608:6;2603:3;2596:4;2589:5;2585:16;2563:52;:::i;:::-;2640:29;2662:6;2640:29;:::i;:::-;2635:3;2631:39;2624:46;;2404:272;2312:364;;;;:::o;2682:313::-;2795:4;2833:2;2822:9;2818:18;2810:26;;2882:9;2876:4;2872:20;2868:1;2857:9;2853:17;2846:47;2910:78;2983:4;2974:6;2910:78;:::i;:::-;2902:86;;2682:313;;;;:::o;3001:122::-;3074:24;3092:5;3074:24;:::i;:::-;3067:5;3064:35;3054:63;;3113:1;3110;3103:12;3054:63;3001:122;:::o;3129:139::-;3175:5;3213:6;3200:20;3191:29;;3229:33;3256:5;3229:33;:::i;:::-;3129:139;;;;:::o;3274:474::-;3342:6;3350;3399:2;3387:9;3378:7;3374:23;3370:32;3367:119;;;3405:79;;:::i;:::-;3367:119;3525:1;3550:53;3595:7;3586:6;3575:9;3571:22;3550:53;:::i;:::-;3540:63;;3496:117;3652:2;3678:53;3723:7;3714:6;3703:9;3699:22;3678:53;:::i;:::-;3668:63;;3623:118;3274:474;;;;;:::o;3754:90::-;3788:7;3831:5;3824:13;3817:21;3806:32;;3754:90;;;:::o;3850:109::-;3931:21;3946:5;3931:21;:::i;:::-;3926:3;3919:34;3850:109;;:::o;3965:210::-;4052:4;4090:2;4079:9;4075:18;4067:26;;4103:65;4165:1;4154:9;4150:17;4141:6;4103:65;:::i;:::-;3965:210;;;;:::o;4181:60::-;4209:3;4230:5;4223:12;;4181:60;;;:::o;4247:142::-;4297:9;4330:53;4348:34;4357:24;4375:5;4357:24;:::i;:::-;4348:34;:::i;:::-;4330:53;:::i;:::-;4317:66;;4247:142;;;:::o;4395:126::-;4445:9;4478:37;4509:5;4478:37;:::i;:::-;4465:50;;4395:126;;;:::o;4527:150::-;4601:9;4634:37;4665:5;4634:37;:::i;:::-;4621:50;;4527:150;;;:::o;4683:179::-;4794:61;4849:5;4794:61;:::i;:::-;4789:3;4782:74;4683:179;;:::o;4868:270::-;4985:4;5023:2;5012:9;5008:18;5000:26;;5036:95;5128:1;5117:9;5113:17;5104:6;5036:95;:::i;:::-;4868:270;;;;:::o;5144:619::-;5221:6;5229;5237;5286:2;5274:9;5265:7;5261:23;5257:32;5254:119;;;5292:79;;:::i;:::-;5254:119;5412:1;5437:53;5482:7;5473:6;5462:9;5458:22;5437:53;:::i;:::-;5427:63;;5383:117;5539:2;5565:53;5610:7;5601:6;5590:9;5586:22;5565:53;:::i;:::-;5555:63;;5510:118;5667:2;5693:53;5738:7;5729:6;5718:9;5714:22;5693:53;:::i;:::-;5683:63;;5638:118;5144:619;;;;;:::o;5769:329::-;5828:6;5877:2;5865:9;5856:7;5852:23;5848:32;5845:119;;;5883:79;;:::i;:::-;5845:119;6003:1;6028:53;6073:7;6064:6;6053:9;6049:22;6028:53;:::i;:::-;6018:63;;5974:117;5769:329;;;;:::o;6104:86::-;6139:7;6179:4;6172:5;6168:16;6157:27;;6104:86;;;:::o;6196:112::-;6279:22;6295:5;6279:22;:::i;:::-;6274:3;6267:35;6196:112;;:::o;6314:214::-;6403:4;6441:2;6430:9;6426:18;6418:26;;6454:67;6518:1;6507:9;6503:17;6494:6;6454:67;:::i;:::-;6314:214;;;;:::o;6534:118::-;6605:22;6621:5;6605:22;:::i;:::-;6598:5;6595:33;6585:61;;6642:1;6639;6632:12;6585:61;6534:118;:::o;6658:135::-;6702:5;6740:6;6727:20;6718:29;;6756:31;6781:5;6756:31;:::i;:::-;6658:135;;;;:::o;6799:325::-;6856:6;6905:2;6893:9;6884:7;6880:23;6876:32;6873:119;;;6911:79;;:::i;:::-;6873:119;7031:1;7056:51;7099:7;7090:6;7079:9;7075:22;7056:51;:::i;:::-;7046:61;;7002:115;6799:325;;;;:::o;7130:150::-;7204:9;7237:37;7268:5;7237:37;:::i;:::-;7224:50;;7130:150;;;:::o;7286:179::-;7397:61;7452:5;7397:61;:::i;:::-;7392:3;7385:74;7286:179;;:::o;7471:270::-;7588:4;7626:2;7615:9;7611:18;7603:26;;7639:95;7731:1;7720:9;7716:17;7707:6;7639:95;:::i;:::-;7471:270;;;;:::o;7747:118::-;7834:24;7852:5;7834:24;:::i;:::-;7829:3;7822:37;7747:118;;:::o;7871:222::-;7964:4;8002:2;7991:9;7987:18;7979:26;;8015:71;8083:1;8072:9;8068:17;8059:6;8015:71;:::i;:::-;7871:222;;;;:::o;8099:474::-;8167:6;8175;8224:2;8212:9;8203:7;8199:23;8195:32;8192:119;;;8230:79;;:::i;:::-;8192:119;8350:1;8375:53;8420:7;8411:6;8400:9;8396:22;8375:53;:::i;:::-;8365:63;;8321:117;8477:2;8503:53;8548:7;8539:6;8528:9;8524:22;8503:53;:::i;:::-;8493:63;;8448:118;8099:474;;;;;:::o;8579:93::-;8615:7;8655:10;8648:5;8644:22;8633:33;;8579:93;;;:::o;8678:115::-;8763:23;8780:5;8763:23;:::i;:::-;8758:3;8751:36;8678:115;;:::o;8799:636::-;8992:4;9030:3;9019:9;9015:19;9007:27;;9080:9;9074:4;9070:20;9066:1;9055:9;9051:17;9044:47;9108:78;9181:4;9172:6;9108:78;:::i;:::-;9100:86;;9196:70;9262:2;9251:9;9247:18;9238:6;9196:70;:::i;:::-;9276;9342:2;9331:9;9327:18;9318:6;9276:70;:::i;:::-;9356:72;9424:2;9413:9;9409:18;9400:6;9356:72;:::i;:::-;8799:636;;;;;;;:::o;9441:141::-;9506:9;9539:37;9570:5;9539:37;:::i;:::-;9526:50;;9441:141;;;:::o;9588:161::-;9690:52;9736:5;9690:52;:::i;:::-;9685:3;9678:65;9588:161;;:::o;9755:252::-;9863:4;9901:2;9890:9;9886:18;9878:26;;9914:86;9997:1;9986:9;9982:17;9973:6;9914:86;:::i;:::-;9755:252;;;;:::o;10013:842::-;10254:4;10292:3;10281:9;10277:19;10269:27;;10342:9;10336:4;10332:20;10328:1;10317:9;10313:17;10306:47;10370:78;10443:4;10434:6;10370:78;:::i;:::-;10362:86;;10458:68;10522:2;10511:9;10507:18;10498:6;10458:68;:::i;:::-;10536;10600:2;10589:9;10585:18;10576:6;10536:68;:::i;:::-;10614:70;10680:2;10669:9;10665:18;10656:6;10614:70;:::i;:::-;10694:71;10760:3;10749:9;10745:19;10736:6;10694:71;:::i;:::-;10775:73;10843:3;10832:9;10828:19;10819:6;10775:73;:::i;:::-;10013:842;;;;;;;;;:::o;10861:120::-;10922:7;10951:24;10969:5;10951:24;:::i;:::-;10940:35;;10861:120;;;:::o;10987:170::-;11084:48;11126:5;11084:48;:::i;:::-;11077:5;11074:59;11064:87;;11147:1;11144;11137:12;11064:87;10987:170;:::o;11163:187::-;11233:5;11271:6;11258:20;11249:29;;11287:57;11338:5;11287:57;:::i;:::-;11163:187;;;;:::o;11356:377::-;11439:6;11488:2;11476:9;11467:7;11463:23;11459:32;11456:119;;;11494:79;;:::i;:::-;11456:119;11614:1;11639:77;11708:7;11699:6;11688:9;11684:22;11639:77;:::i;:::-;11629:87;;11585:141;11356:377;;;;:::o;11739:180::-;11787:77;11784:1;11777:88;11884:4;11881:1;11874:15;11908:4;11905:1;11898:15;11925:180;11973:77;11970:1;11963:88;12070:4;12067:1;12060:15;12094:4;12091:1;12084:15;12111:185;12151:1;12168:20;12186:1;12168:20;:::i;:::-;12163:25;;12202:20;12220:1;12202:20;:::i;:::-;12197:25;;12241:1;12231:35;;12246:18;;:::i;:::-;12231:35;12288:1;12285;12281:9;12276:14;;12111:185;;;;:::o;12302:180::-;12350:77;12347:1;12340:88;12447:4;12444:1;12437:15;12471:4;12468:1;12461:15;12488:320;12532:6;12569:1;12563:4;12559:12;12549:22;;12616:1;12610:4;12606:12;12637:18;12627:81;;12693:4;12685:6;12681:17;12671:27;;12627:81;12755:2;12747:6;12744:14;12724:18;12721:38;12718:84;;;12774:18;;:::i;:::-;12718:84;12539:269;12488:320;;;:::o;12814:167::-;12954:19;12950:1;12942:6;12938:14;12931:43;12814:167;:::o;12987:366::-;13129:3;13150:67;13214:2;13209:3;13150:67;:::i;:::-;13143:74;;13226:93;13315:3;13226:93;:::i;:::-;13344:2;13339:3;13335:12;13328:19;;12987:366;;;:::o;13359:419::-;13525:4;13563:2;13552:9;13548:18;13540:26;;13612:9;13606:4;13602:20;13598:1;13587:9;13583:17;13576:47;13640:131;13766:4;13640:131;:::i;:::-;13632:139;;13359:419;;;:::o;13784:173::-;13924:25;13920:1;13912:6;13908:14;13901:49;13784:173;:::o;13963:366::-;14105:3;14126:67;14190:2;14185:3;14126:67;:::i;:::-;14119:74;;14202:93;14291:3;14202:93;:::i;:::-;14320:2;14315:3;14311:12;14304:19;;13963:366;;;:::o;14335:419::-;14501:4;14539:2;14528:9;14524:18;14516:26;;14588:9;14582:4;14578:20;14574:1;14563:9;14559:17;14552:47;14616:131;14742:4;14616:131;:::i;:::-;14608:139;;14335:419;;;:::o;14760:180::-;14808:77;14805:1;14798:88;14905:4;14902:1;14895:15;14929:4;14926:1;14919:15;14946:222;15086:34;15082:1;15074:6;15070:14;15063:58;15155:5;15150:2;15142:6;15138:15;15131:30;14946:222;:::o;15174:366::-;15316:3;15337:67;15401:2;15396:3;15337:67;:::i;:::-;15330:74;;15413:93;15502:3;15413:93;:::i;:::-;15531:2;15526:3;15522:12;15515:19;;15174:366;;;:::o;15546:419::-;15712:4;15750:2;15739:9;15735:18;15727:26;;15799:9;15793:4;15789:20;15785:1;15774:9;15770:17;15763:47;15827:131;15953:4;15827:131;:::i;:::-;15819:139;;15546:419;;;:::o;15971:223::-;16111:34;16107:1;16099:6;16095:14;16088:58;16180:6;16175:2;16167:6;16163:15;16156:31;15971:223;:::o;16200:366::-;16342:3;16363:67;16427:2;16422:3;16363:67;:::i;:::-;16356:74;;16439:93;16528:3;16439:93;:::i;:::-;16557:2;16552:3;16548:12;16541:19;;16200:366;;;:::o;16572:419::-;16738:4;16776:2;16765:9;16761:18;16753:26;;16825:9;16819:4;16815:20;16811:1;16800:9;16796:17;16789:47;16853:131;16979:4;16853:131;:::i;:::-;16845:139;;16572:419;;;:::o;16997:174::-;17137:26;17133:1;17125:6;17121:14;17114:50;16997:174;:::o;17177:366::-;17319:3;17340:67;17404:2;17399:3;17340:67;:::i;:::-;17333:74;;17416:93;17505:3;17416:93;:::i;:::-;17534:2;17529:3;17525:12;17518:19;;17177:366;;;:::o;17549:419::-;17715:4;17753:2;17742:9;17738:18;17730:26;;17802:9;17796:4;17792:20;17788:1;17777:9;17773:17;17766:47;17830:131;17956:4;17830:131;:::i;:::-;17822:139;;17549:419;;;:::o;17974:234::-;18114:34;18110:1;18102:6;18098:14;18091:58;18183:17;18178:2;18170:6;18166:15;18159:42;17974:234;:::o;18214:366::-;18356:3;18377:67;18441:2;18436:3;18377:67;:::i;:::-;18370:74;;18453:93;18542:3;18453:93;:::i;:::-;18571:2;18566:3;18562:12;18555:19;;18214:366;;;:::o;18586:419::-;18752:4;18790:2;18779:9;18775:18;18767:26;;18839:9;18833:4;18829:20;18825:1;18814:9;18810:17;18803:47;18867:131;18993:4;18867:131;:::i;:::-;18859:139;;18586:419;;;:::o;19011:246::-;19050:3;19069:19;19086:1;19069:19;:::i;:::-;19064:24;;19102:19;19119:1;19102:19;:::i;:::-;19097:24;;19199:1;19187:10;19183:18;19180:1;19177:25;19174:51;;;19205:18;;:::i;:::-;19174:51;19249:1;19246;19242:9;19235:16;;19011:246;;;;:::o;19263:167::-;19300:3;19323:22;19339:5;19323:22;:::i;:::-;19314:31;;19367:4;19360:5;19357:15;19354:41;;;19375:18;;:::i;:::-;19354:41;19422:1;19415:5;19411:13;19404:20;;19263:167;;;:::o;19436:85::-;19481:7;19510:5;19499:16;;19436:85;;;:::o;19527:158::-;19585:9;19618:61;19636:42;19645:32;19671:5;19645:32;:::i;:::-;19636:42;:::i;:::-;19618:61;:::i;:::-;19605:74;;19527:158;;;:::o;19691:147::-;19786:45;19825:5;19786:45;:::i;:::-;19781:3;19774:58;19691:147;;:::o;19844:168::-;19927:11;19961:6;19956:3;19949:19;20001:4;19996:3;19992:14;19977:29;;19844:168;;;;:::o;20018:114::-;;:::o;20138:362::-;20279:3;20300:65;20363:1;20358:3;20300:65;:::i;:::-;20293:72;;20374:93;20463:3;20374:93;:::i;:::-;20492:1;20487:3;20483:11;20476:18;;20138:362;;;:::o;20506:986::-;20819:4;20857:3;20846:9;20842:19;20834:27;;20871:71;20939:1;20928:9;20924:17;20915:6;20871:71;:::i;:::-;20952:80;21028:2;21017:9;21013:18;21004:6;20952:80;:::i;:::-;21042;21118:2;21107:9;21103:18;21094:6;21042:80;:::i;:::-;21132:68;21196:2;21185:9;21181:18;21172:6;21132:68;:::i;:::-;21210:69;21274:3;21263:9;21259:19;21250:6;21210:69;:::i;:::-;21327:9;21321:4;21317:20;21311:3;21300:9;21296:19;21289:49;21355:130;21480:4;21355:130;:::i;:::-;21347:138;;20506:986;;;;;;;;:::o;21498:143::-;21555:5;21586:6;21580:13;21571:22;;21602:33;21629:5;21602:33;:::i;:::-;21498:143;;;;:::o;21647:351::-;21717:6;21766:2;21754:9;21745:7;21741:23;21737:32;21734:119;;;21772:79;;:::i;:::-;21734:119;21892:1;21917:64;21973:7;21964:6;21953:9;21949:22;21917:64;:::i;:::-;21907:74;;21863:128;21647:351;;;;:::o;22004:141::-;22053:4;22076:3;22068:11;;22099:3;22096:1;22089:14;22133:4;22130:1;22120:18;22112:26;;22004:141;;;:::o;22175:802::-;22260:3;22297:5;22291:12;22326:36;22352:9;22326:36;:::i;:::-;22378:71;22442:6;22437:3;22378:71;:::i;:::-;22371:78;;22480:1;22469:9;22465:17;22496:1;22491:135;;;;22640:1;22635:336;;;;22458:513;;22491:135;22575:4;22571:9;22560;22556:25;22551:3;22544:38;22611:4;22606:3;22602:14;22595:21;;22491:135;;22635:336;22702:38;22734:5;22702:38;:::i;:::-;22762:1;22776:154;22790:6;22787:1;22784:13;22776:154;;;22864:7;22858:14;22854:1;22849:3;22845:11;22838:35;22914:1;22905:7;22901:15;22890:26;;22812:4;22809:1;22805:12;22800:17;;22776:154;;;22959:1;22954:3;22950:11;22943:18;;22642:329;;22458:513;;22264:713;;22175:802;;;;:::o;22983:612::-;23166:4;23204:2;23193:9;23189:18;23181:26;;23253:9;23247:4;23243:20;23239:1;23228:9;23224:17;23217:47;23281:75;23351:4;23342:6;23281:75;:::i;:::-;23273:83;;23403:9;23397:4;23393:20;23388:2;23377:9;23373:18;23366:48;23431:75;23501:4;23492:6;23431:75;:::i;:::-;23423:83;;23516:72;23584:2;23573:9;23569:18;23560:6;23516:72;:::i;:::-;22983:612;;;;;;:::o;23601:182::-;23741:34;23737:1;23729:6;23725:14;23718:58;23601:182;:::o;23789:366::-;23931:3;23952:67;24016:2;24011:3;23952:67;:::i;:::-;23945:74;;24028:93;24117:3;24028:93;:::i;:::-;24146:2;24141:3;24137:12;24130:19;;23789:366;;;:::o;24161:419::-;24327:4;24365:2;24354:9;24350:18;24342:26;;24414:9;24408:4;24404:20;24400:1;24389:9;24385:17;24378:47;24442:131;24568:4;24442:131;:::i;:::-;24434:139;;24161:419;;;:::o;24586:164::-;24726:16;24722:1;24714:6;24710:14;24703:40;24586:164;:::o;24756:366::-;24898:3;24919:67;24983:2;24978:3;24919:67;:::i;:::-;24912:74;;24995:93;25084:3;24995:93;:::i;:::-;25113:2;25108:3;25104:12;25097:19;;24756:366;;;:::o;25128:419::-;25294:4;25332:2;25321:9;25317:18;25309:26;;25381:9;25375:4;25371:20;25367:1;25356:9;25352:17;25345:47;25409:131;25535:4;25409:131;:::i;:::-;25401:139;;25128:419;;;:::o;25553:305::-;25593:3;25612:20;25630:1;25612:20;:::i;:::-;25607:25;;25646:20;25664:1;25646:20;:::i;:::-;25641:25;;25800:1;25732:66;25728:74;25725:1;25722:81;25719:107;;;25806:18;;:::i;:::-;25719:107;25850:1;25847;25843:9;25836:16;;25553:305;;;;:::o;25864:177::-;26004:29;26000:1;25992:6;25988:14;25981:53;25864:177;:::o;26047:366::-;26189:3;26210:67;26274:2;26269:3;26210:67;:::i;:::-;26203:74;;26286:93;26375:3;26286:93;:::i;:::-;26404:2;26399:3;26395:12;26388:19;;26047:366;;;:::o;26419:419::-;26585:4;26623:2;26612:9;26608:18;26600:26;;26672:9;26666:4;26662:20;26658:1;26647:9;26643:17;26636:47;26700:131;26826:4;26700:131;:::i;:::-;26692:139;;26419:419;;;:::o;26844:348::-;26884:7;26907:20;26925:1;26907:20;:::i;:::-;26902:25;;26941:20;26959:1;26941:20;:::i;:::-;26936:25;;27129:1;27061:66;27057:74;27054:1;27051:81;27046:1;27039:9;27032:17;27028:105;27025:131;;;27136:18;;:::i;:::-;27025:131;27184:1;27181;27177:9;27166:20;;26844:348;;;;:::o;27198:220::-;27338:34;27334:1;27326:6;27322:14;27315:58;27407:3;27402:2;27394:6;27390:15;27383:28;27198:220;:::o;27424:366::-;27566:3;27587:67;27651:2;27646:3;27587:67;:::i;:::-;27580:74;;27663:93;27752:3;27663:93;:::i;:::-;27781:2;27776:3;27772:12;27765:19;;27424:366;;;:::o;27796:419::-;27962:4;28000:2;27989:9;27985:18;27977:26;;28049:9;28043:4;28039:20;28035:1;28024:9;28020:17;28013:47;28077:131;28203:4;28077:131;:::i;:::-;28069:139;;27796:419;;;:::o;28221:223::-;28361:34;28357:1;28349:6;28345:14;28338:58;28430:6;28425:2;28417:6;28413:15;28406:31;28221:223;:::o;28450:366::-;28592:3;28613:67;28677:2;28672:3;28613:67;:::i;:::-;28606:74;;28689:93;28778:3;28689:93;:::i;:::-;28807:2;28802:3;28798:12;28791:19;;28450:366;;;:::o;28822:419::-;28988:4;29026:2;29015:9;29011:18;29003:26;;29075:9;29069:4;29065:20;29061:1;29050:9;29046:17;29039:47;29103:131;29229:4;29103:131;:::i;:::-;29095:139;;28822:419;;;:::o;29247:221::-;29387:34;29383:1;29375:6;29371:14;29364:58;29456:4;29451:2;29443:6;29439:15;29432:29;29247:221;:::o;29474:366::-;29616:3;29637:67;29701:2;29696:3;29637:67;:::i;:::-;29630:74;;29713:93;29802:3;29713:93;:::i;:::-;29831:2;29826:3;29822:12;29815:19;;29474:366;;;:::o;29846:419::-;30012:4;30050:2;30039:9;30035:18;30027:26;;30099:9;30093:4;30089:20;30085:1;30074:9;30070:17;30063:47;30127:131;30253:4;30127:131;:::i;:::-;30119:139;;29846:419;;;:::o;30271:116::-;30341:21;30356:5;30341:21;:::i;:::-;30334:5;30331:32;30321:60;;30377:1;30374;30367:12;30321:60;30271:116;:::o;30393:137::-;30447:5;30478:6;30472:13;30463:22;;30494:30;30518:5;30494:30;:::i;:::-;30393:137;;;;:::o;30536:345::-;30603:6;30652:2;30640:9;30631:7;30627:23;30623:32;30620:119;;;30658:79;;:::i;:::-;30620:119;30778:1;30803:61;30856:7;30847:6;30836:9;30832:22;30803:61;:::i;:::-;30793:71;;30749:125;30536:345;;;;:::o;30887:222::-;31027:34;31023:1;31015:6;31011:14;31004:58;31096:5;31091:2;31083:6;31079:15;31072:30;30887:222;:::o;31115:366::-;31257:3;31278:67;31342:2;31337:3;31278:67;:::i;:::-;31271:74;;31354:93;31443:3;31354:93;:::i;:::-;31472:2;31467:3;31463:12;31456:19;;31115:366;;;:::o;31487:419::-;31653:4;31691:2;31680:9;31676:18;31668:26;;31740:9;31734:4;31730:20;31726:1;31715:9;31711:17;31704:47;31768:131;31894:4;31768:131;:::i;:::-;31760:139;;31487:419;;;:::o;31912:332::-;32033:4;32071:2;32060:9;32056:18;32048:26;;32084:71;32152:1;32141:9;32137:17;32128:6;32084:71;:::i;:::-;32165:72;32233:2;32222:9;32218:18;32209:6;32165:72;:::i;:::-;31912:332;;;;;:::o;32250:191::-;32290:4;32310:20;32328:1;32310:20;:::i;:::-;32305:25;;32344:20;32362:1;32344:20;:::i;:::-;32339:25;;32383:1;32380;32377:8;32374:34;;;32388:18;;:::i;:::-;32374:34;32433:1;32430;32426:9;32418:17;;32250:191;;;;:::o;32447:442::-;32596:4;32634:2;32623:9;32619:18;32611:26;;32647:71;32715:1;32704:9;32700:17;32691:6;32647:71;:::i;:::-;32728:72;32796:2;32785:9;32781:18;32772:6;32728:72;:::i;:::-;32810;32878:2;32867:9;32863:18;32854:6;32810:72;:::i;:::-;32447:442;;;;;;:::o;32895:225::-;33035:34;33031:1;33023:6;33019:14;33012:58;33104:8;33099:2;33091:6;33087:15;33080:33;32895:225;:::o;33126:366::-;33268:3;33289:67;33353:2;33348:3;33289:67;:::i;:::-;33282:74;;33365:93;33454:3;33365:93;:::i;:::-;33483:2;33478:3;33474:12;33467:19;;33126:366;;;:::o;33498:419::-;33664:4;33702:2;33691:9;33687:18;33679:26;;33751:9;33745:4;33741:20;33737:1;33726:9;33722:17;33715:47;33779:131;33905:4;33779:131;:::i;:::-;33771:139;;33498:419;;;:::o;33923:224::-;34063:34;34059:1;34051:6;34047:14;34040:58;34132:7;34127:2;34119:6;34115:15;34108:32;33923:224;:::o;34153:366::-;34295:3;34316:67;34380:2;34375:3;34316:67;:::i;:::-;34309:74;;34392:93;34481:3;34392:93;:::i;:::-;34510:2;34505:3;34501:12;34494:19;;34153:366;;;:::o;34525:419::-;34691:4;34729:2;34718:9;34714:18;34706:26;;34778:9;34772:4;34768:20;34764:1;34753:9;34749:17;34742:47;34806:131;34932:4;34806:131;:::i;:::-;34798:139;;34525:419;;;:::o;34950:222::-;35090:34;35086:1;35078:6;35074:14;35067:58;35159:5;35154:2;35146:6;35142:15;35135:30;34950:222;:::o;35178:366::-;35320:3;35341:67;35405:2;35400:3;35341:67;:::i;:::-;35334:74;;35417:93;35506:3;35417:93;:::i;:::-;35535:2;35530:3;35526:12;35519:19;;35178:366;;;:::o;35550:419::-;35716:4;35754:2;35743:9;35739:18;35731:26;;35803:9;35797:4;35793:20;35789:1;35778:9;35774:17;35767:47;35831:131;35957:4;35831:131;:::i;:::-;35823:139;;35550:419;;;:::o;35975:220::-;36115:34;36111:1;36103:6;36099:14;36092:58;36184:3;36179:2;36171:6;36167:15;36160:28;35975:220;:::o;36201:366::-;36343:3;36364:67;36428:2;36423:3;36364:67;:::i;:::-;36357:74;;36440:93;36529:3;36440:93;:::i;:::-;36558:2;36553:3;36549:12;36542:19;;36201:366;;;:::o;36573:419::-;36739:4;36777:2;36766:9;36762:18;36754:26;;36826:9;36820:4;36816:20;36812:1;36801:9;36797:17;36790:47;36854:131;36980:4;36854:131;:::i;:::-;36846:139;;36573:419;;;:::o;36998:181::-;37138:33;37134:1;37126:6;37122:14;37115:57;36998:181;:::o;37185:366::-;37327:3;37348:67;37412:2;37407:3;37348:67;:::i;:::-;37341:74;;37424:93;37513:3;37424:93;:::i;:::-;37542:2;37537:3;37533:12;37526:19;;37185:366;;;:::o;37557:419::-;37723:4;37761:2;37750:9;37746:18;37738:26;;37810:9;37804:4;37800:20;37796:1;37785:9;37781:17;37774:47;37838:131;37964:4;37838:131;:::i;:::-;37830:139;;37557:419;;;:::o

Swarm Source

ipfs://bda92198b7496d12eb65765af37ec831c990c0bd13828ab65e18fcf367fd2ec9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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