Token Crossfi

 

Overview [ERC-20]

Max Total Supply:
100,000,000 CRFI

Holders:
860

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CRFI

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-15
*/

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

// SPDX-License-Identifier: PRIVATE
pragma solidity >=0.6.2 <0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IERC777 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the smallest part of the token that is not divisible. This
     * means all token operations (creation, movement and destruction) must have
     * amounts that are a multiple of this number.
     *
     * For most token contracts, this value will equal 1.
     */
    function granularity() external view returns (uint256);

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * If send or receive hooks are registered for the caller and `recipient`,
     * the corresponding functions will be called with `data` and empty
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function send(address recipient, uint256 amount, bytes calldata data) external;

    /**
     * @dev Destroys `amount` tokens from the caller's account, reducing the
     * total supply.
     *
     * If a send hook is registered for the caller, the corresponding function
     * will be called with `data` and empty `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     */
    function burn(uint256 amount, bytes calldata data) external;

    /**
     * @dev Returns true if an account is an operator of `tokenHolder`.
     * Operators can send and burn tokens on behalf of their owners. All
     * accounts are their own operator.
     *
     * See {operatorSend} and {operatorBurn}.
     */
    function isOperatorFor(address operator, address tokenHolder) external view returns (bool);

    /**
     * @dev Make an account an operator of the caller.
     *
     * See {isOperatorFor}.
     *
     * Emits an {AuthorizedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function authorizeOperator(address operator) external;

    /**
     * @dev Revoke an account's operator status for the caller.
     *
     * See {isOperatorFor} and {defaultOperators}.
     *
     * Emits a {RevokedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function revokeOperator(address operator) external;

    /**
     * @dev Returns the list of default operators. These accounts are operators
     * for all token holders, even if {authorizeOperator} was never called on
     * them.
     *
     * This list is immutable, but individual holders may revoke these via
     * {revokeOperator}, in which case {isOperatorFor} will return false.
     */
    function defaultOperators() external view returns (address[] memory);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must
     * be an operator of `sender`.
     *
     * If send or receive hooks are registered for `sender` and `recipient`,
     * the corresponding functions will be called with `data` and
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - `sender` cannot be the zero address.
     * - `sender` must have at least `amount` tokens.
     * - the caller must be an operator for `sender`.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the total supply.
     * The caller must be an operator of `account`.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `data` and `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     * - the caller must be an operator for `account`.
     */
    function operatorBurn(
        address account,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    event Sent(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes data,
        bytes operatorData
    );

    event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

    event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);

    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);

    event RevokedOperator(address indexed operator, address indexed tokenHolder);
}

interface IERC777Recipient {
    /**
     * @dev Called by an {IERC777} token contract whenever tokens are being
     * moved or created into a registered account (`to`). The type of operation
     * is conveyed by `from` being the zero address or not.
     *
     * This call occurs _after_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the post-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

interface IERC777Sender {
    /**
     * @dev Called by an {IERC777} token contract whenever a registered holder's
     * (`from`) tokens are about to be moved or destroyed. The type of operation
     * is conveyed by `to` being the zero address or not.
     *
     * This call occurs _before_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the pre-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

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);
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

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

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

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

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

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

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

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

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

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.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

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

        // 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);
            }
        }
    }
}

interface IERC1820Registry {
    /**
     * @dev Sets `newManager` as the manager for `account`. A manager of an
     * account is able to set interface implementers for it.
     *
     * By default, each account is its own manager. Passing a value of `0x0` in
     * `newManager` will reset the manager to this initial state.
     *
     * Emits a {ManagerChanged} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     */
    function setManager(address account, address newManager) external;

    /**
     * @dev Returns the manager for `account`.
     *
     * See {setManager}.
     */
    function getManager(address account) external view returns (address);

    /**
     * @dev Sets the `implementer` contract as ``account``'s implementer for
     * `interfaceHash`.
     *
     * `account` being the zero address is an alias for the caller's address.
     * The zero address can also be used in `implementer` to remove an old one.
     *
     * See {interfaceHash} to learn how these are created.
     *
     * Emits an {InterfaceImplementerSet} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not
     * end in 28 zeroes).
     * - `implementer` must implement {IERC1820Implementer} and return true when
     * queried for support, unless `implementer` is the caller. See
     * {IERC1820Implementer-canImplementInterfaceForAddress}.
     */
    function setInterfaceImplementer(address account, bytes32 _interfaceHash, address implementer) external;

    /**
     * @dev Returns the implementer of `interfaceHash` for `account`. If no such
     * implementer is registered, returns the zero address.
     *
     * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28
     * zeroes), `account` will be queried for support of it.
     *
     * `account` being the zero address is an alias for the caller's address.
     */
    function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address);

    /**
     * @dev Returns the interface hash for an `interfaceName`, as defined in the
     * corresponding
     * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP].
     */
    function interfaceHash(string calldata interfaceName) external pure returns (bytes32);

    /**
     *  @notice Updates the cache with whether the contract implements an ERC165 interface or not.
     *  @param account Address of the contract for which to update the cache.
     *  @param interfaceId ERC165 interface for which to update the cache.
     */
    function updateERC165Cache(address account, bytes4 interfaceId) external;

    /**
     *  @notice Checks whether a contract implements an ERC165 interface or not.
     *  If the result is not cached a direct lookup on the contract address is performed.
     *  If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling
     *  {updateERC165Cache} with the contract address.
     *  @param account Address of the contract to check.
     *  @param interfaceId ERC165 interface to check.
     *  @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool);

    /**
     *  @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache.
     *  @param account Address of the contract to check.
     *  @param interfaceId ERC165 interface to check.
     *  @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool);

    event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);

    event ManagerChanged(address indexed account, address indexed newManager);
}

contract CRFI is Context, IERC777, IERC20,IERC777Recipient {
  
  //////////////////// using
  using SafeMath for uint256;
  using Address for address;

  //////////////////// const
  IERC1820Registry constant internal _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);
  
  // We inline the result of the following hashes because Solidity doesn't resolve them at compile time.
  // See https://github.com/ethereum/solidity/issues/4024.

  // keccak256("ERC777TokensSender")
  bytes32 constant private _TOKENS_SENDER_INTERFACE_HASH =
    0x29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe895;

  // keccak256("ERC777TokensRecipient")
  bytes32 constant private _TOKENS_RECIPIENT_INTERFACE_HASH =
    0xb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b;

  //////////////////// for admin
  address public superAdmin;
  mapping(address => uint256) public admins;

  // only effect erc20 interface.
  // when erc777mode equal 0, the erc777 feature is disabled;
  // when erc777mode equal 1, the erc777 feature is enabled by whitelist.
  // when erc777 mode equal 2, the erc777 feature is disabled by blacklist.
  // when erc777 mode equal 3, the erc777 feature is enabled;
  // in whitelist or black list mode, whether "from" or "to" address in list, the feature would be effected.
  enum Erc777ModeType {disabled, whitelist, blacklist, enabled}
  Erc777ModeType public erc777Mode;
  mapping(address=>bool) public blacklist;
  mapping(address=>bool) public whitelist;
  
  //////////////////// for coin
  mapping(address => uint256) private _balances;

  uint256 private _totalSupply;

  string private _name;
  string private _symbol;

  // ERC20-allowances
  mapping (address => mapping (address => uint256)) private _allowances;

  mapping(address=>bool) private _freezeAddress;

  //////////////////// for operator  
  // This isn't ever read from - it's only used to respond to the defaultOperators query.
  address[] private _defaultOperatorsArray;

  // Immutable, but accounts may revoke them (tracked in __revokedDefaultOperators).
  mapping(address => bool) private _defaultOperators;

  // For each account, a mapping of its operators and revoked default operators.
  mapping(address => mapping(address => bool)) private _operators;
  mapping(address => mapping(address => bool)) private _revokedDefaultOperators;


  //////////////////// constructor
  /**
   * @dev `defaultOperators` may be an empty array.
   */
  constructor(address[] memory defaultOperators_
              )
      {
        _name = "Crossfi";
        _symbol = "CRFI";

        _defaultOperatorsArray = defaultOperators_;
        for (uint256 i = 0; i < _defaultOperatorsArray.length; i++) {
          _defaultOperators[_defaultOperatorsArray[i]] = true;
        }

        // register interfaces
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this));
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this));

        superAdmin = msg.sender;

        // init mode
        ChangeMode(Erc777ModeType.disabled);

        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), _TOKENS_RECIPIENT_INTERFACE_HASH, address(this));

        _mint(msg.sender, 1e26, "", "");
      }

  //////////////////// modifier
  modifier IsAdmin() {
    require(msg.sender == superAdmin || admins[msg.sender] == 1, "only admin");
    _;
  }

  modifier IsSuperAdmin() {
    require(superAdmin == msg.sender, "only super admin");
    _;
  }

  modifier CheckFreeze(address addr){
    require(_freezeAddress[addr] == false, "account is freeze");
    _;
  }

  //////////////////// super admin func
  function AddAdmin(address adminAddr)
    public
    IsSuperAdmin(){
    require(admins[adminAddr] == 0, "already add this admin");
    admins[adminAddr] = 1;
  }

  function DelAdmin(address adminAddr)
    public
    IsSuperAdmin(){
    require(admins[adminAddr] == 1, "this addr is not admin");
    admins[adminAddr] = 0;
  }

  function ChangeSuperAdmin(address suAdminAddr)
    public
    IsSuperAdmin(){
    require(suAdminAddr != address(0x0), "empty new super admin");

    superAdmin = suAdminAddr;
  }

  //////////////////// for admin func
  function AddBlackList(address[] memory addrs)
    public
    IsAdmin(){

    for(uint256 i = 0; i < addrs.length; i++){
      address addr = addrs[i];
      if(blacklist[addr]){
        continue;
      }
      blacklist[addr] = true;
    }
  }

  function DelBlackList(address[] memory addrs)
    public
    IsAdmin(){

    for(uint256 i = 0; i < addrs.length; i++){
      address addr = addrs[i];
      if(!blacklist[addr]){
        continue;
      }
      blacklist[addr] = false;
    }
  }

  function AddWhiteList(address[] memory addrs)
    public
    IsAdmin(){

    for(uint256 i = 0; i < addrs.length; i++){
      address addr = addrs[i];
      if(whitelist[addr]){
        continue;
      }
      whitelist[addr] = true;
    }
  }

  function DelWhiteList(address[] memory addrs)
    public
    IsAdmin(){

    for(uint256 i = 0; i < addrs.length; i++){
      address addr = addrs[i];
      if(!whitelist[addr] ){
        continue;
      }
      whitelist[addr] = false;
    }
  }

  function ChangeMode(Erc777ModeType mode)
    public
    IsAdmin(){

    erc777Mode = mode;
  }

  function FreezeAddr(address[] memory addrs)
    public
    IsAdmin(){
    for(uint256 i = 0; i < addrs.length; i++){
      address addr = addrs[i];
      if(_freezeAddress[addr] == true){
        continue;
      }
      _freezeAddress[addr] = true;
    }
  }

  function UnfreezeAddr(address[] memory addrs)
    public
    IsAdmin(){
    for(uint256 i = 0; i < addrs.length; i++){
      address addr = addrs[i];
      if(_freezeAddress[addr] == false){
        continue;
      }
      _freezeAddress[addr] = false;
    }
  }
  
  
  /**
   * @dev See {IERC777-name}.
   */
  function name() public view virtual override returns (string memory) {
    return _name;
  }

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

  /**
   * @dev See {ERC20-decimals}.
   *
   * Always returns 18, as per the
   * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility).
   */
  function decimals() public pure virtual returns (uint8) {
    return 18;
  }

  /**
   * @dev See {IERC777-granularity}.
   *
   * This implementation always returns `1`.
   */
  function granularity() public view virtual override returns (uint256) {
    return 1;
  }

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

  /**
   * @dev Returns the amount of tokens owned by an account (`tokenHolder`).
   */
  function balanceOf(address tokenHolder) public view virtual override(IERC20, IERC777) returns (uint256) {
    return _balances[tokenHolder];
  }

  function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData)
    public
    pure
    override{
    revert("can't receive any coin");
  }

  /**
   * @dev See {IERC777-send}.
   *
   * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
   */
  function send(address recipient, uint256 amount, bytes memory data) public virtual override  CheckFreeze(_msgSender()){
    _send(_msgSender(), recipient, amount, data, "", true);
  }

  /**
   * @dev See {IERC20-transfer}.
   *
   * Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient}
   * interface if it is a contract.
   *
   * Also emits a {Sent} event.
   */
  function transfer(address recipient, uint256 amount)
    public
    virtual
    override
    CheckFreeze(_msgSender())
    returns (bool) {
    require(recipient != address(0), "ERC777: transfer to the zero address");

    address from = _msgSender();

    bool erc777Enable = _enableERC777(from, recipient);

    if(erc777Enable){
      _callTokensToSend(from, from, recipient, amount, "", "");
    }

    _move(from, from, recipient, amount, "", "", erc777Enable);

    if(erc777Enable){
      _callTokensReceived(from, from, recipient, amount, "", "", false);
    }

    return true;
  }

  /**
   * @dev See {IERC777-burn}.
   *
   * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
   */
  function burn(uint256 amount, bytes memory data) public virtual override  CheckFreeze(_msgSender()){
    _burn(_msgSender(), amount, data, "");
  }

  /**
   * @dev See {IERC777-isOperatorFor}.
   */
  function isOperatorFor(address operator, address tokenHolder) public view virtual override returns (bool) {
    return operator == tokenHolder ||
      (_defaultOperators[operator] && !_revokedDefaultOperators[tokenHolder][operator]) ||
      _operators[tokenHolder][operator];
  }

  /**
   * @dev See {IERC777-authorizeOperator}.
   */
  function authorizeOperator(address operator) public virtual override  {
    require(_msgSender() != operator, "ERC777: authorizing self as operator");

    if (_defaultOperators[operator]) {
      delete _revokedDefaultOperators[_msgSender()][operator];
    } else {
      _operators[_msgSender()][operator] = true;
    }

    emit AuthorizedOperator(operator, _msgSender());
  }

  /**
   * @dev See {IERC777-revokeOperator}.
   */
  function revokeOperator(address operator) public virtual override  {
    require(operator != _msgSender(), "ERC777: revoking self as operator");

    if (_defaultOperators[operator]) {
      _revokedDefaultOperators[_msgSender()][operator] = true;
    } else {
      delete _operators[_msgSender()][operator];
    }

    emit RevokedOperator(operator, _msgSender());
  }

  /**
   * @dev See {IERC777-defaultOperators}.
   */
  function defaultOperators() public view virtual override returns (address[] memory) {
    return _defaultOperatorsArray;
  }

  /**
   * @dev See {IERC777-operatorSend}.
   *
   * Emits {Sent} and {IERC20-Transfer} events.
   */
  function operatorSend(
                        address sender,
                        address recipient,
                        uint256 amount,
                        bytes memory data,
                        bytes memory operatorData
                        )
    public
    virtual
    override
    CheckFreeze(sender)
  {
    require(isOperatorFor(_msgSender(), sender), "ERC777: caller is not an operator for holder");
    _send(sender, recipient, amount, data, operatorData, true);
  }

  /**
   * @dev See {IERC777-operatorBurn}.
   *
   * Emits {Burned} and {IERC20-Transfer} events.
   */
  function operatorBurn(address account, uint256 amount, bytes memory data, bytes memory operatorData) public virtual override CheckFreeze(account){
    require(isOperatorFor(_msgSender(), account), "ERC777: caller is not an operator for holder");
    _burn(account, amount, data, operatorData);
  }

  /**
   * @dev See {IERC20-allowance}.
   *
   * Note that operator and allowance concepts are orthogonal: operators may
   * not have allowance, and accounts with allowance may not be operators
   * themselves.
   */
  function allowance(address holder, address spender) public view virtual override returns (uint256) {
    return _allowances[holder][spender];
  }

  /**
   * @dev See {IERC20-approve}.
   *
   * Note that accounts cannot have allowance issued by their operators.
   */
  function approve(address spender, uint256 value) public virtual override returns (bool) {
    address holder = _msgSender();
    _approve(holder, spender, value);
    return true;
  }

  /**
   * @dev See {IERC20-transferFrom}.
   *
   * Note that operator and allowance concepts are orthogonal: operators cannot
   * call `transferFrom` (unless they have allowance), and accounts with
   * allowance cannot call `operatorSend` (unless they are operators).
   *
   * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events.
   */
  function transferFrom(address holder, address recipient, uint256 amount) public virtual override CheckFreeze(holder) returns (bool) {
    require(recipient != address(0), "ERC777: transfer to the zero address");
    require(holder != address(0), "ERC777: transfer from the zero address");

    address spender = _msgSender();

    bool erc777Enable = _enableERC777(holder, recipient);

    if(erc777Enable){
      _callTokensToSend(spender, holder, recipient, amount, "", "");
    }

    _move(spender, holder, recipient, amount, "", "", erc777Enable);
    _approve(holder, spender, _allowances[holder][spender].sub(amount, "ERC777: transfer amount exceeds allowance"));

    if(erc777Enable){
      _callTokensReceived(spender, holder, recipient, amount, "", "", false);
    }

    return true;
  }
  
  /**
   * @dev Creates `amount` tokens and assigns them to `account`, increasing
   * the total supply.
   *
   * If a send hook is registered for `account`, the corresponding function
   * will be called with `operator`, `data` and `operatorData`.
   *
   * See {IERC777Sender} and {IERC777Recipient}.
   *
   * Emits {Minted} and {IERC20-Transfer} events.
   *
   * Requirements
   *
   * - `account` cannot be the zero address.
   * - if `account` is a contract, it must implement the {IERC777Recipient}
   * interface.
   */
  function _mint(
                 address account,
                 uint256 amount,
                 bytes memory userData,
                 bytes memory operatorData
                 )
    internal
    virtual
  {
    require(account != address(0), "ERC777: mint to the zero address");

    address operator = _msgSender();

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

    // Update state variables
    _totalSupply = _totalSupply.add(amount);
    _balances[account] = _balances[account].add(amount);

    _callTokensReceived(operator, address(0), account, amount, userData, operatorData, true);

    emit Minted(operator, account, amount, userData, operatorData);
    emit Transfer(address(0), account, amount);
  }

  /**
   * @dev Send tokens
   * @param from address token holder address
   * @param to address recipient address
   * @param amount uint256 amount of tokens to transfer
   * @param userData bytes extra information provided by the token holder (if any)
   * @param operatorData bytes extra information provided by the operator (if any)
   * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
   */
  function _send(
                 address from,
                 address to,
                 uint256 amount,
                 bytes memory userData,
                 bytes memory operatorData,
                 bool requireReceptionAck
                 )
    internal
    virtual
  {
    require(from != address(0), "ERC777: send from the zero address");
    require(to != address(0), "ERC777: send to the zero address");

    address operator = _msgSender();

    _callTokensToSend(operator, from, to, amount, userData, operatorData);

    _move(operator, from, to, amount, userData, operatorData, true);

    _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck);
  }

  /**
   * @dev Burn tokens
   * @param from address token holder address
   * @param amount uint256 amount of tokens to burn
   * @param data bytes extra information provided by the token holder
   * @param operatorData bytes extra information provided by the operator (if any)
   */
  function _burn(
                 address from,
                 uint256 amount,
                 bytes memory data,
                 bytes memory operatorData
                 )
    internal
    virtual
  {
    require(from != address(0), "ERC777: burn from the zero address");

    address operator = _msgSender();

    _callTokensToSend(operator, from, address(0), amount, data, operatorData);

    _beforeTokenTransfer(operator, from, address(0), amount);

    // Update state variables
    _balances[from] = _balances[from].sub(amount, "ERC777: burn amount exceeds balance");
    _totalSupply = _totalSupply.sub(amount);

    emit Burned(operator, from, amount, data, operatorData);
    emit Transfer(from, address(0), amount);
  }

  function _move(
                 address operator,
                 address from,
                 address to,
                 uint256 amount,
                 bytes memory userData,
                 bytes memory operatorData,
                 bool erc777Enable
                 )
    private
  {
    if(erc777Enable){
      _beforeTokenTransfer(operator, from, to, amount);
    }

    _balances[from] = _balances[from].sub(amount, "ERC777: transfer amount exceeds balance");
    _balances[to] = _balances[to].add(amount);

    emit Sent(operator, from, to, amount, userData, operatorData);
    emit Transfer(from, to, amount);
  }

  /**
   * @dev See {ERC20-_approve}.
   *
   * Note that accounts cannot have allowance issued by their operators.
   */
  function _approve(address holder, address spender, uint256 value) internal {
    require(holder != address(0), "ERC777: approve from the zero address");
    require(spender != address(0), "ERC777: approve to the zero address");

    _allowances[holder][spender] = value;
    emit Approval(holder, spender, value);
  }

  /**
   * @dev Call from.tokensToSend() if the interface is registered
   * @param operator address operator requesting the transfer
   * @param from address token holder address
   * @param to address recipient address
   * @param amount uint256 amount of tokens to transfer
   * @param userData bytes extra information provided by the token holder (if any)
   * @param operatorData bytes extra information provided by the operator (if any)
   */
  function _callTokensToSend(
                             address operator,
                             address from,
                             address to,
                             uint256 amount,
                             bytes memory userData,
                             bytes memory operatorData
                             )
    private
  {
    address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH);
    if (implementer != address(0)) {
      IERC777Sender(implementer).tokensToSend(operator, from, to, amount, userData, operatorData);
    }
  }

  /**
   * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but
   * tokensReceived() was not registered for the recipient
   * @param operator address operator requesting the transfer
   * @param from address token holder address
   * @param to address recipient address
   * @param amount uint256 amount of tokens to transfer
   * @param userData bytes extra information provided by the token holder (if any)
   * @param operatorData bytes extra information provided by the operator (if any)
   * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
   */
  function _callTokensReceived(
                               address operator,
                               address from,
                               address to,
                               uint256 amount,
                               bytes memory userData,
                               bytes memory operatorData,
                               bool requireReceptionAck
                               )
    private
  {
    address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH);
    if (implementer != address(0)) {
      IERC777Recipient(implementer).tokensReceived(operator, from, to, amount, userData, operatorData);
    } else if (requireReceptionAck) {
      require(!to.isContract(), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient");
    }
  }

  /**
   * @dev Hook that is called before any token transfer. This includes
   * calls to {send}, {transfer}, {operatorSend}, 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 operator, address from, address to, uint256 amount) internal virtual { }

  
  function _enableERC777(address from, address to)
    internal
    view
    returns(bool){

    if(erc777Mode == Erc777ModeType.disabled){
      return false;
    }

    if(erc777Mode == Erc777ModeType.enabled){
      return true;
    }

    if(erc777Mode == Erc777ModeType.whitelist){
      return whitelist[from] || whitelist[to];
    }

    if(erc777Mode == Erc777ModeType.blacklist){
      return (!blacklist[from]) && (!blacklist[to]);
    }

    return false;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"defaultOperators_","type":"address[]"}],"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":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"RevokedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Sent","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"},{"inputs":[{"internalType":"address","name":"adminAddr","type":"address"}],"name":"AddAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"AddBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"AddWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum CRFI.Erc777ModeType","name":"mode","type":"uint8"}],"name":"ChangeMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"suAdminAddr","type":"address"}],"name":"ChangeSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adminAddr","type":"address"}],"name":"DelAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"DelBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"DelWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"FreezeAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"UnfreezeAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"authorizeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"defaultOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc777Mode","outputs":[{"internalType":"enum CRFI.Erc777ModeType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"superAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"pure","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":"holder","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":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162003d1138038062003d11833981810160405260208110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82518660208202830111640100000000821117156200008c57600080fd5b82525081516020918201928201910280838360005b83811015620000bb578181015183820152602001620000a1565b505050509091016040818101905260078082526643726f7373666960c81b6020909201918252620000f4955093509150829050620009a6565b50604080518082019091526004808252634352464960e01b60209092019182526200012291600891620009a6565b5080516200013890600b90602084019062000a3b565b5060005b600b5481101562000198576001600c6000600b84815481106200015b57fe5b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff19169115159190911790556001016200013c565b50604080516329965a1d60e01b815230600482018190527fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce2177054602483015260448201529051731820a4b7618bde71dce8cdc73aab6c95905fad24916329965a1d91606480830192600092919082900301818387803b1580156200021957600080fd5b505af11580156200022e573d6000803e3d6000fd5b5050604080516329965a1d60e01b815230600482018190527faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a602483015260448201529051731820a4b7618bde71dce8cdc73aab6c95905fad2493506329965a1d9250606480830192600092919082900301818387803b158015620002b257600080fd5b505af1158015620002c7573d6000803e3d6000fd5b5050600080546001600160a01b03191633178155620002e992509050620003b5565b604080516329965a1d60e01b8152306004820181905260008051602062003ca4833981519152602483015260448201529051731820a4b7618bde71dce8cdc73aab6c95905fad24916329965a1d91606480830192600092919082900301818387803b1580156200035857600080fd5b505af11580156200036d573d6000803e3d6000fd5b50505050620003ae336a52b7d2dcc80cd2e400000060405180602001604052806000815250604051806020016040528060008152506200044060201b60201c565b5062000aaa565b6000546001600160a01b0316331480620003df575033600090815260016020819052604090912054145b6200041e576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b6002805482919060ff191660018360038111156200043857fe5b021790555050565b6001600160a01b0384166200049c576040805162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6000620004a8620006a3565b9050620004b98160008787620006a7565b620004d584600654620006ad60201b620022791790919060201c565b6006556001600160a01b0385166000908152600560209081526040909120546200050a91869062002279620006ad821b17901c565b6001600160a01b038616600090815260056020526040812091909155620005399082908787878760016200070f565b846001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015620005ba578181015183820152602001620005a0565b50505050905090810190601f168015620005e85780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156200061d57818101518382015260200162000603565b50505050905090810190601f1680156200064b5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a36040805185815290516001600160a01b038716916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b3390565b50505050565b60008282018381101562000708576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6040805163555ddc6560e11b81526001600160a01b038716600482015260008051602062003ca483398151915260248201529051600091731820a4b7618bde71dce8cdc73aab6c95905fad249163aabbb8ca91604480820192602092909190829003018186803b1580156200078357600080fd5b505afa15801562000798573d6000803e3d6000fd5b505050506040513d6020811015620007af57600080fd5b505190506001600160a01b038116156200093257806001600160a01b03166223de298989898989896040518763ffffffff1660e01b815260040180876001600160a01b03168152602001866001600160a01b03168152602001856001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156200085c57818101518382015260200162000842565b50505050905090810190601f1680156200088a5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015620008bf578181015183820152602001620008a5565b50505050905090810190601f168015620008ed5780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b1580156200091357600080fd5b505af115801562000928573d6000803e3d6000fd5b5050505062000996565b8115620009965762000958866001600160a01b0316620009a060201b620022d31760201c565b15620009965760405162461bcd60e51b815260040180806020018281038252604d81526020018062003cc4604d913960600191505060405180910390fd5b5050505050505050565b3b151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620009de576000855562000a29565b82601f10620009f957805160ff191683800117855562000a29565b8280016001018555821562000a29579182015b8281111562000a2957825182559160200191906001019062000a0c565b5062000a3792915062000a93565b5090565b82805482825590600052602060002090810192821562000a29579160200282015b8281111562000a2957825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000a5c565b5b8082111562000a37576000815560010162000a94565b6131ea8062000aba6000396000f3fe608060405234801561001057600080fd5b50600436106102055760003560e01c8063782ab6421161011a578063b6932914116100ad578063e6a3c3771161007c578063e6a3c37714610bab578063f9f92be414610c4c578063fad8b32a14610c72578063fc673c4f14610c98578063fe9d930314610dd657610205565b8063b693291414610a88578063c505409114610aae578063d95b637114610b4f578063dd62ed3e14610b7d57610205565b80639b19251a116100e95780639b19251a146109575780639bd9bbc61461097d578063a9059cbb14610a36578063ad6de44514610a6257610205565b8063782ab6421461085f57806391af82a314610900578063959b8c3f1461092957806395d89b411461094f57610205565b806329575f6a1161019d578063429b62e51161016c578063429b62e514610621578063556f0dc71461064757806362ad1b831461064f57806368b18d711461079857806370a082311461083957610205565b806329575f6a1461051e578063313ce5671461054257806331a21fc6146105605780633920521a1461060157610205565b806312efe4b3116101d957806312efe4b31461040757806318160ddd1461042d57806323b872dd146104475780632572ac571461047d57610205565b806223de291461020a57806306e48538146102f257806306fdde031461034a578063095ea7b3146103c7575b600080fd5b6102f0600480360360c081101561022057600080fd5b6001600160a01b03823581169260208101358216926040820135909216916060820135919081019060a081016080820135600160201b81111561026257600080fd5b82018360208201111561027457600080fd5b803590602001918460018302840111600160201b8311171561029557600080fd5b919390929091602081019035600160201b8111156102b257600080fd5b8201836020820111156102c457600080fd5b803590602001918460018302840111600160201b831117156102e557600080fd5b509092509050610e81565b005b6102fa610ec7565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561033657818101518382015260200161031e565b505050509050019250505060405180910390f35b610352610f29565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038c578181015183820152602001610374565b50505050905090810190601f1680156103b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f3600480360360408110156103dd57600080fd5b506001600160a01b038135169060200135610fb6565b604080519115158252519081900360200190f35b6102f06004803603602081101561041d57600080fd5b50356001600160a01b0316610fda565b6104356110a1565b60408051918252519081900360200190f35b6103f36004803603606081101561045d57600080fd5b506001600160a01b038135811691602081013590911690604001356110a7565b6102f06004803603602081101561049357600080fd5b810190602081018135600160201b8111156104ad57600080fd5b8201836020820111156104bf57600080fd5b803590602001918460208302840111600160201b831117156104e057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506112a3945050505050565b610526611386565b604080516001600160a01b039092168252519081900360200190f35b61054a611395565b6040805160ff9092168252519081900360200190f35b6102f06004803603602081101561057657600080fd5b810190602081018135600160201b81111561059057600080fd5b8201836020820111156105a257600080fd5b803590602001918460208302840111600160201b831117156105c357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061139a945050505050565b6102f06004803603602081101561061757600080fd5b503560ff1661147d565b6104356004803603602081101561063757600080fd5b50356001600160a01b0316611505565b610435611517565b6102f0600480360360a081101561066557600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561069f57600080fd5b8201836020820111156106b157600080fd5b803590602001918460018302840111600160201b831117156106d257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561072457600080fd5b82018360208201111561073657600080fd5b803590602001918460018302840111600160201b8311171561075757600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061151c945050505050565b6102f0600480360360208110156107ae57600080fd5b810190602081018135600160201b8111156107c857600080fd5b8201836020820111156107da57600080fd5b803590602001918460208302840111600160201b831117156107fb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506115e3945050505050565b6104356004803603602081101561084f57600080fd5b50356001600160a01b03166116c2565b6102f06004803603602081101561087557600080fd5b810190602081018135600160201b81111561088f57600080fd5b8201836020820111156108a157600080fd5b803590602001918460208302840111600160201b831117156108c257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506116dd945050505050565b6109086117c0565b6040518082600381111561091857fe5b815260200191505060405180910390f35b6102f06004803603602081101561093f57600080fd5b50356001600160a01b03166117c9565b610352611915565b6103f36004803603602081101561096d57600080fd5b50356001600160a01b0316611976565b6102f06004803603606081101561099357600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156109c257600080fd5b8201836020820111156109d457600080fd5b803590602001918460018302840111600160201b831117156109f557600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061198b945050505050565b6103f360048036036040811015610a4c57600080fd5b506001600160a01b038135169060200135611a20565b6102f060048036036020811015610a7857600080fd5b50356001600160a01b0316611b8a565b6102f060048036036020811015610a9e57600080fd5b50356001600160a01b0316611c5d565b6102f060048036036020811015610ac457600080fd5b810190602081018135600160201b811115610ade57600080fd5b820183602082011115610af057600080fd5b803590602001918460208302840111600160201b83111715610b1157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611d30945050505050565b6103f360048036036040811015610b6557600080fd5b506001600160a01b0381358116916020013516611e18565b61043560048036036040811015610b9357600080fd5b506001600160a01b0381358116916020013516611eba565b6102f060048036036020811015610bc157600080fd5b810190602081018135600160201b811115610bdb57600080fd5b820183602082011115610bed57600080fd5b803590602001918460208302840111600160201b83111715610c0e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ee5945050505050565b6103f360048036036020811015610c6257600080fd5b50356001600160a01b0316611fc4565b6102f060048036036020811015610c8857600080fd5b50356001600160a01b0316611fd9565b6102f060048036036080811015610cae57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610cdd57600080fd5b820183602082011115610cef57600080fd5b803590602001918460018302840111600160201b83111715610d1057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610d6257600080fd5b820183602082011115610d7457600080fd5b803590602001918460018302840111600160201b83111715610d9557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612125945050505050565b6102f060048036036040811015610dec57600080fd5b81359190810190604081016020820135600160201b811115610e0d57600080fd5b820183602082011115610e1f57600080fd5b803590602001918460018302840111600160201b83111715610e4057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506121e8945050505050565b6040805162461bcd60e51b815260206004820152601660248201527531b0b713ba103932b1b2b4bb329030b73c9031b7b4b760511b604482015290519081900360640190fd5b6060600b805480602002602001604051908101604052809291908181526020018280548015610f1f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f01575b5050505050905090565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f1f5780601f10610f8a57610100808354040283529160200191610f1f565b820191906000526020600020905b815481529060010190602001808311610f9857509395945050505050565b600080610fc16122d9565b9050610fce8185856122dd565b60019150505b92915050565b6000546001600160a01b0316331461102c576040805162461bcd60e51b815260206004820152601060248201526f37b7363c9039bab832b91030b236b4b760811b604482015290519081900360640190fd5b6001600160a01b03811661107f576040805162461bcd60e51b815260206004820152601560248201527432b6b83a3c903732bb9039bab832b91030b236b4b760591b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60065490565b6001600160a01b0383166000908152600a6020526040812054849060ff161561110b576040805162461bcd60e51b81526020600482015260116024820152706163636f756e7420697320667265657a6560781b604482015290519081900360640190fd5b6001600160a01b0384166111505760405162461bcd60e51b81526004018080602001828103825260248152602001806130d06024913960400191505060405180910390fd5b6001600160a01b0385166111955760405162461bcd60e51b81526004018080602001828103825260268152602001806131496026913960400191505060405180910390fd5b600061119f6122d9565b905060006111ad87876123c9565b905080156111e1576111e18288888860405180602001604052806000815250604051806020016040528060008152506124d3565b61120e82888888604051806020016040528060008152506040518060200160405280600081525087612700565b611262878361125d88604051806060016040528060298152602001613120602991396001600160a01b03808e166000908152600960209081526040808320938c16835292905220549190612921565b6122dd565b80156112965761129682888888604051806020016040528060008152506040518060200160405280600081525060006129b8565b5060019695505050505050565b6000546001600160a01b03163314806112cc575033600090815260016020819052604090912054145b61130a576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b60005b815181101561138257600082828151811061132457fe5b6020908102919091018101516001600160a01b0381166000908152600490925260409091205490915060ff1661135a575061137a565b6001600160a01b03166000908152600460205260409020805460ff191690555b60010161130d565b5050565b6000546001600160a01b031681565b601290565b6000546001600160a01b03163314806113c3575033600090815260016020819052604090912054145b611401576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b60005b815181101561138257600082828151811061141b57fe5b6020908102919091018101516001600160a01b0381166000908152600490925260409091205490915060ff16156114525750611475565b6001600160a01b03166000908152600460205260409020805460ff191660011790555b600101611404565b6000546001600160a01b03163314806114a6575033600090815260016020819052604090912054145b6114e4576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b6002805482919060ff191660018360038111156114fd57fe5b021790555050565b60016020526000908152604090205481565b600190565b6001600160a01b0385166000908152600a6020526040902054859060ff1615611580576040805162461bcd60e51b81526020600482015260116024820152706163636f756e7420697320667265657a6560781b604482015290519081900360640190fd5b61159161158b6122d9565b87611e18565b6115cc5760405162461bcd60e51b815260040180806020018281038252602c8152602001806130f4602c913960400191505060405180910390fd5b6115db86868686866001612c3d565b505050505050565b6000546001600160a01b031633148061160c575033600090815260016020819052604090912054145b61164a576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b60005b815181101561138257600082828151811061166457fe5b6020908102919091018101516001600160a01b0381166000908152600390925260409091205490915060ff1661169a57506116ba565b6001600160a01b03166000908152600360205260409020805460ff191690555b60010161164d565b6001600160a01b031660009081526005602052604090205490565b6000546001600160a01b0316331480611706575033600090815260016020819052604090912054145b611744576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b60005b815181101561138257600082828151811061175e57fe5b6020908102919091018101516001600160a01b0381166000908152600390925260409091205490915060ff161561179557506117b8565b6001600160a01b03166000908152600360205260409020805460ff191660011790555b600101611747565b60025460ff1681565b806001600160a01b03166117db6122d9565b6001600160a01b031614156118215760405162461bcd60e51b815260040180806020018281038252602481526020018061303e6024913960400191505060405180910390fd5b6001600160a01b0381166000908152600c602052604090205460ff161561188457600e600061184e6122d9565b6001600160a01b03908116825260208083019390935260409182016000908120918516815292529020805460ff191690556118cb565b6001600d60006118926122d9565b6001600160a01b03908116825260208083019390935260409182016000908120918616815292529020805460ff19169115159190911790555b6118d36122d9565b6001600160a01b0316816001600160a01b03167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b60088054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f1f5780601f10610f8a57610100808354040283529160200191610f1f565b60046020526000908152604090205460ff1681565b6119936122d9565b6001600160a01b0381166000908152600a602052604090205460ff16156119f5576040805162461bcd60e51b81526020600482015260116024820152706163636f756e7420697320667265657a6560781b604482015290519081900360640190fd5b611a1a611a006122d9565b858585604051806020016040528060008152506001612c3d565b50505050565b6000611a2a6122d9565b6001600160a01b0381166000908152600a602052604090205460ff1615611a8c576040805162461bcd60e51b81526020600482015260116024820152706163636f756e7420697320667265657a6560781b604482015290519081900360640190fd5b6001600160a01b038416611ad15760405162461bcd60e51b81526004018080602001828103825260248152602001806130d06024913960400191505060405180910390fd5b6000611adb6122d9565b90506000611ae982876123c9565b90508015611b1d57611b1d8283888860405180602001604052806000815250604051806020016040528060008152506124d3565b611b4a82838888604051806020016040528060008152506040518060200160405280600081525087612700565b8015611b7e57611b7e82838888604051806020016040528060008152506040518060200160405280600081525060006129b8565b50600195945050505050565b6000546001600160a01b03163314611bdc576040805162461bcd60e51b815260206004820152601060248201526f37b7363c9039bab832b91030b236b4b760811b604482015290519081900360640190fd5b6001600160a01b03811660009081526001602052604090205415611c40576040805162461bcd60e51b815260206004820152601660248201527530b63932b0b23c9030b232103a3434b99030b236b4b760511b604482015290519081900360640190fd5b6001600160a01b0316600090815260016020819052604090912055565b6000546001600160a01b03163314611caf576040805162461bcd60e51b815260206004820152601060248201526f37b7363c9039bab832b91030b236b4b760811b604482015290519081900360640190fd5b6001600160a01b03811660009081526001602081905260409091205414611d16576040805162461bcd60e51b81526020600482015260166024820152753a3434b99030b232391034b9903737ba1030b236b4b760511b604482015290519081900360640190fd5b6001600160a01b0316600090815260016020526040812055565b6000546001600160a01b0316331480611d59575033600090815260016020819052604090912054145b611d97576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b60005b8151811015611382576000828281518110611db157fe5b6020908102919091018101516001600160a01b0381166000908152600a90925260409091205490915060ff16151560011415611ded5750611e10565b6001600160a01b03166000908152600a60205260409020805460ff191660011790555b600101611d9a565b6000816001600160a01b0316836001600160a01b03161480611e8357506001600160a01b0383166000908152600c602052604090205460ff168015611e8357506001600160a01b038083166000908152600e602090815260408083209387168352929052205460ff16155b80611eb357506001600160a01b038083166000908152600d602090815260408083209387168352929052205460ff165b9392505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b6000546001600160a01b0316331480611f0e575033600090815260016020819052604090912054145b611f4c576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b60005b8151811015611382576000828281518110611f6657fe5b6020908102919091018101516001600160a01b0381166000908152600a90925260409091205490915060ff16611f9c5750611fbc565b6001600160a01b03166000908152600a60205260409020805460ff191690555b600101611f4f565b60036020526000908152604090205460ff1681565b611fe16122d9565b6001600160a01b0316816001600160a01b031614156120315760405162461bcd60e51b81526004018080602001828103825260218152602001806130626021913960400191505060405180910390fd5b6001600160a01b0381166000908152600c602052604090205460ff161561209d576001600e60006120606122d9565b6001600160a01b03908116825260208083019390935260409182016000908120918616815292529020805460ff19169115159190911790556120db565b600d60006120a96122d9565b6001600160a01b03908116825260208083019390935260409182016000908120918516815292529020805460ff191690555b6120e36122d9565b6001600160a01b0316816001600160a01b03167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b6001600160a01b0384166000908152600a6020526040902054849060ff1615612189576040805162461bcd60e51b81526020600482015260116024820152706163636f756e7420697320667265657a6560781b604482015290519081900360640190fd5b61219a6121946122d9565b86611e18565b6121d55760405162461bcd60e51b815260040180806020018281038252602c8152602001806130f4602c913960400191505060405180910390fd5b6121e185858585612d16565b5050505050565b6121f06122d9565b6001600160a01b0381166000908152600a602052604090205460ff1615612252576040805162461bcd60e51b81526020600482015260116024820152706163636f756e7420697320667265657a6560781b604482015290519081900360640190fd5b61227461225d6122d9565b848460405180602001604052806000815250612d16565b505050565b600082820183811015611eb3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b3390565b6001600160a01b0383166123225760405162461bcd60e51b8152600401808060200182810382526025815260200180612fae6025913960400191505060405180910390fd5b6001600160a01b0382166123675760405162461bcd60e51b81526004018080602001828103825260238152602001806131926023913960400191505060405180910390fd5b6001600160a01b03808416600081815260096020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008060025460ff1660038111156123dd57fe5b14156123eb57506000610fd4565b600360025460ff1660038111156123fe57fe5b141561240c57506001610fd4565b600160025460ff16600381111561241f57fe5b141561246b576001600160a01b03831660009081526004602052604090205460ff168061246457506001600160a01b03821660009081526004602052604090205460ff165b9050610fd4565b6002805460ff16600381111561247d57fe5b14156124ca576001600160a01b03831660009081526003602052604090205460ff161580156124645750506001600160a01b03811660009081526003602052604090205460ff1615610fd4565b50600092915050565b6040805163555ddc6560e11b81526001600160a01b03871660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe89560248201529051600091731820a4b7618bde71dce8cdc73aab6c95905fad249163aabbb8ca91604480820192602092909190829003018186803b15801561255757600080fd5b505afa15801561256b573d6000803e3d6000fd5b505050506040513d602081101561258157600080fd5b505190506001600160a01b038116156126f757806001600160a01b03166375ab97828888888888886040518763ffffffff1660e01b815260040180876001600160a01b03168152602001866001600160a01b03168152602001856001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561262c578181015183820152602001612614565b50505050905090810190601f1680156126595780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561268c578181015183820152602001612674565b50505050905090810190601f1680156126b95780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b1580156126de57600080fd5b505af11580156126f2573d6000803e3d6000fd5b505050505b50505050505050565b80156127125761271287878787611a1a565b61274f84604051806060016040528060278152602001612ff5602791396001600160a01b0389166000908152600560205260409020549190612921565b6001600160a01b03808816600090815260056020526040808220939093559087168152205461277e9085612279565b60056000876001600160a01b03166001600160a01b0316815260200190815260200160002081905550846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612830578181015183820152602001612818565b50505050905090810190601f16801561285d5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612890578181015183820152602001612878565b50505050905090810190601f1680156128bd5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a4846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a350505050505050565b600081848411156129b05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561297557818101518382015260200161295d565b50505050905090810190601f1680156129a25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040805163555ddc6560e11b81526001600160a01b03871660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60248201529051600091731820a4b7618bde71dce8cdc73aab6c95905fad249163aabbb8ca91604480820192602092909190829003018186803b158015612a3c57600080fd5b505afa158015612a50573d6000803e3d6000fd5b505050506040513d6020811015612a6657600080fd5b505190506001600160a01b03811615612bdf57806001600160a01b03166223de298989898989896040518763ffffffff1660e01b815260040180876001600160a01b03168152602001866001600160a01b03168152602001856001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612b10578181015183820152602001612af8565b50505050905090810190601f168015612b3d5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612b70578181015183820152602001612b58565b50505050905090810190601f168015612b9d5780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015612bc257600080fd5b505af1158015612bd6573d6000803e3d6000fd5b50505050612c33565b8115612c3357612bf7866001600160a01b03166122d3565b15612c335760405162461bcd60e51b815260040180806020018281038252604d815260200180613083604d913960600191505060405180910390fd5b5050505050505050565b6001600160a01b038616612c825760405162461bcd60e51b8152600401808060200182810382526022815260200180612fd36022913960400191505060405180910390fd5b6001600160a01b038516612cdd576040805162461bcd60e51b815260206004820181905260248201527f4552433737373a2073656e6420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6000612ce76122d9565b9050612cf78188888888886124d3565b612d078188888888886001612700565b6126f7818888888888886129b8565b6001600160a01b038416612d5b5760405162461bcd60e51b815260040180806020018281038252602281526020018061301c6022913960400191505060405180910390fd5b6000612d656122d9565b9050612d76818660008787876124d3565b612d838186600087611a1a565b612dc08460405180606001604052806023815260200161316f602391396001600160a01b0388166000908152600560205260409020549190612921565b6001600160a01b038616600090815260056020526040902055600654612de69085612f50565b600681905550846001600160a01b0316816001600160a01b03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612e6b578181015183820152602001612e53565b50505050905090810190601f168015612e985780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612ecb578181015183820152602001612eb3565b50505050905090810190601f168015612ef85780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a36040805185815290516000916001600160a01b038816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b600082821115612fa7576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fe4552433737373a20617070726f76652066726f6d20746865207a65726f20616464726573734552433737373a2073656e642066726f6d20746865207a65726f20616464726573734552433737373a207472616e7366657220616d6f756e7420657863656564732062616c616e63654552433737373a206275726e2066726f6d20746865207a65726f20616464726573734552433737373a20617574686f72697a696e672073656c66206173206f70657261746f724552433737373a207265766f6b696e672073656c66206173206f70657261746f724552433737373a20746f6b656e20726563697069656e7420636f6e747261637420686173206e6f20696d706c656d656e74657220666f7220455243373737546f6b656e73526563697069656e744552433737373a207472616e7366657220746f20746865207a65726f20616464726573734552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f7220666f7220686f6c6465724552433737373a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654552433737373a207472616e736665722066726f6d20746865207a65726f20616464726573734552433737373a206275726e20616d6f756e7420657863656564732062616c616e63654552433737373a20617070726f766520746f20746865207a65726f2061646472657373a264697066735822122041398d4abdbca80d9d5cb6a9baa02b17289d45d8acd60743fb2393f824fe1bda64736f6c63430007060033b281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b4552433737373a20746f6b656e20726563697069656e7420636f6e747261637420686173206e6f20696d706c656d656e74657220666f7220455243373737546f6b656e73526563697069656e7400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------

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


Deployed ByteCode Sourcemap

29338:21853:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36619:273;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36619:273:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36619:273:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36619:273:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36619:273:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36619:273:0;;;;;;;;;;-1:-1:-1;36619:273:0;;-1:-1:-1;36619:273:0;-1:-1:-1;36619:273:0;:::i;:::-;;39614:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35491:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41290:187;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41290:187:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;33508:185;;;;;;;;;;;;;;;;-1:-1:-1;33508:185:0;-1:-1:-1;;;;;33508:185:0;;:::i;36251:119::-;;;:::i;:::-;;;;;;;;;;;;;;;;41842:819;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41842:819:0;;;;;;;;;;;;;;;;;:::i;34520:257::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34520:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34520:257:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34520:257:0;;-1:-1:-1;34520:257:0;;-1:-1:-1;;;;;34520:257:0:i;30207:25::-;;;:::i;:::-;;;;-1:-1:-1;;;;;30207:25:0;;;;;;;;;;;;;;35914:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34260:254;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34260:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34260:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34260:254:0;;-1:-1:-1;34260:254:0;;-1:-1:-1;;;;;34260:254:0:i;34783:99::-;;;;;;;;;;;;;;;;-1:-1:-1;34783:99:0;;;;:::i;30237:41::-;;;;;;;;;;;;;;;;-1:-1:-1;30237:41:0;-1:-1:-1;;;;;30237:41:0;;:::i;36102:91::-;;;:::i;39854:508::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39854:508:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39854:508:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39854:508:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39854:508:0;;;;;;;;-1:-1:-1;39854:508:0;;-1:-1:-1;;;;;39854:508:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39854:508:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39854:508:0;;-1:-1:-1;39854:508:0;;-1:-1:-1;;;;;39854:508:0:i;33998:256::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33998:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33998:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33998:256:0;;-1:-1:-1;33998:256:0;;-1:-1:-1;;;;;33998:256:0:i;36467:146::-;;;;;;;;;;;;;;;;-1:-1:-1;36467:146:0;-1:-1:-1;;;;;36467:146:0;;:::i;33738:254::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33738:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33738:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33738:254:0;;-1:-1:-1;33738:254:0;;-1:-1:-1;;;;;33738:254:0:i;30773:32::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;38721:389;;;;;;;;;;;;;;;;-1:-1:-1;38721:389:0;-1:-1:-1;;;;;38721:389:0;;:::i;35638:98::-;;;:::i;30854:39::-;;;;;;;;;;;;;;;;-1:-1:-1;30854:39:0;-1:-1:-1;;;;;30854:39:0;;:::i;37017:185::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37017:185:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37017:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37017:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37017:185:0;;-1:-1:-1;37017:185:0;;-1:-1:-1;;;;;37017:185:0:i;37425:613::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37425:613:0;;;;;;;;:::i;33164:166::-;;;;;;;;;;;;;;;;-1:-1:-1;33164:166:0;-1:-1:-1;;;;;33164:166:0;;:::i;33336:::-;;;;;;;;;;;;;;;;-1:-1:-1;33336:166:0;-1:-1:-1;;;;;33336:166:0;;:::i;34888:268::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34888:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34888:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34888:268:0;;-1:-1:-1;34888:268:0;;-1:-1:-1;;;;;34888:268:0:i;38372:285::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38372:285:0;;;;;;;;;;:::i;41010:147::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41010:147:0;;;;;;;;;;:::i;35162:272::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35162:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35162:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35162:272:0;;-1:-1:-1;35162:272:0;;-1:-1:-1;;;;;35162:272:0:i;30810:39::-;;;;;;;;;;;;;;;;-1:-1:-1;30810:39:0;-1:-1:-1;;;;;30810:39:0;;:::i;39171:380::-;;;;;;;;;;;;;;;;-1:-1:-1;39171:380:0;-1:-1:-1;;;;;39171:380:0;;:::i;40478:300::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40478:300:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40478:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40478:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40478:300:0;;;;;;;;-1:-1:-1;40478:300:0;;-1:-1:-1;;;;;40478:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40478:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40478:300:0;;-1:-1:-1;40478:300:0;;-1:-1:-1;;;;;40478:300:0:i;38163:149::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38163:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38163:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38163:149:0;;-1:-1:-1;38163:149:0;;-1:-1:-1;;;;;38163:149:0:i;36619:273::-;36854:32;;;-1:-1:-1;;;36854:32:0;;;;;;;;;;;;-1:-1:-1;;;36854:32:0;;;;;;;;;;;;;;39614:126;39680:16;39712:22;39705:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39705:29:0;;;;;;;;;;;;;;;;;;;;;;;39614:126;:::o;35491:94::-;35574:5;35567:12;;;;;;;;-1:-1:-1;;35567:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35545:13;;35567:12;;35574:5;;35567:12;;35574:5;35567:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35567:12:0;;35491:94;-1:-1:-1;;;;;35491:94:0:o;41290:187::-;41372:4;41385:14;41402:12;:10;:12::i;:::-;41385:29;;41421:32;41430:6;41438:7;41447:5;41421:8;:32::i;:::-;41467:4;41460:11;;;41290:187;;;;;:::o;33508:185::-;32938:10;;-1:-1:-1;;;;;32938:10:0;32952;32938:24;32930:53;;;;;-1:-1:-1;;;32930:53:0;;;;;;;;;;;;-1:-1:-1;;;32930:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33601:27:0;::::1;33593:61;;;::::0;;-1:-1:-1;;;33593:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33593:61:0;;;;;;;;;;;;;::::1;;33663:10;:24:::0;;-1:-1:-1;;;;;;33663:24:0::1;-1:-1:-1::0;;;;;33663:24:0;;;::::1;::::0;;;::::1;::::0;;33508:185::o;36251:119::-;36352:12;;36251:119;:::o;41842:819::-;-1:-1:-1;;;;;33052:20:0;;41968:4;33052:20;;;:14;:20;;;;;;41951:6;;33052:20;;:29;33044:59;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41989:23:0;::::1;41981:72;;;;-1:-1:-1::0;;;41981:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42068:20:0;::::1;42060:71;;;;-1:-1:-1::0;;;42060:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42140:15;42158:12;:10;:12::i;:::-;42140:30;;42179:17;42199:32;42213:6;42221:9;42199:13;:32::i;:::-;42179:52;;42243:12;42240:94;;;42265:61;42283:7;42292:6;42300:9;42311:6;42265:61;;;;;;;;;;;::::0;::::1;;;;;;;;;;;::::0;:17:::1;:61::i;:::-;42342:63;42348:7;42357:6;42365:9;42376:6;42342:63;;;;;;;;;;;::::0;::::1;;;;;;;;;;;::::0;42392:12:::1;42342:5;:63::i;:::-;42412:112;42421:6;42429:7;42438:85;42471:6;42438:85;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42438:19:0;;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;:28;;::::1;::::0;;;;;;;;:85;:32:::1;:85::i;:::-;42412:8;:112::i;:::-;42536:12;42533:103;;;42558:70;42578:7;42587:6;42595:9;42606:6;42558:70;;;;;;;;;;;::::0;::::1;;;;;;;;;;;::::0;42622:5:::1;42558:19;:70::i;:::-;-1:-1:-1::0;42651:4:0::1;::::0;41842:819;-1:-1:-1;;;;;;41842:819:0:o;34520:257::-;32827:10;;-1:-1:-1;;;;;32827:10:0;32813;:24;;:51;;-1:-1:-1;32848:10:0;32841:18;;;;:6;:18;;;;;;;;;:23;32813:51;32805:74;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;;;;34605:9:::1;34601:171;34624:5;:12;34620:1;:16;34601:171;;;34651:12;34666:5;34672:1;34666:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;34687:15:0;::::1;;::::0;;;:9:::1;:15:::0;;;;;;;;34666:8;;-1:-1:-1;34687:15:0::1;;34683:50;;34715:8;;;34683:50;-1:-1:-1::0;;;;;34741:15:0::1;34759:5;34741:15:::0;;;:9:::1;:15;::::0;;;;:23;;-1:-1:-1;;34741:23:0::1;::::0;;34601:171:::1;34638:3;;34601:171;;;;34520:257:::0;:::o;30207:25::-;;;-1:-1:-1;;;;;30207:25:0;;:::o;35914:78::-;35984:2;35914:78;:::o;34260:254::-;32827:10;;-1:-1:-1;;;;;32827:10:0;32813;:24;;:51;;-1:-1:-1;32848:10:0;32841:18;;;;:6;:18;;;;;;;;;:23;32813:51;32805:74;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;;;;34345:9:::1;34341:168;34364:5;:12;34360:1;:16;34341:168;;;34391:12;34406:5;34412:1;34406:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;34426:15:0;::::1;;::::0;;;:9:::1;:15:::0;;;;;;;;34406:8;;-1:-1:-1;34426:15:0::1;;34423:48;;;34453:8;;;34423:48;-1:-1:-1::0;;;;;34479:15:0::1;;::::0;;;:9:::1;:15;::::0;;;;:22;;-1:-1:-1;;34479:22:0::1;34497:4;34479:22;::::0;;34341:168:::1;34378:3;;34341:168;;34783:99:::0;32827:10;;-1:-1:-1;;;;;32827:10:0;32813;:24;;:51;;-1:-1:-1;32848:10:0;32841:18;;;;:6;:18;;;;;;;;;:23;32813:51;32805:74;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;;;;34859:10:::1;:17:::0;;34872:4;;34859:10;-1:-1:-1;;34859:17:0::1;::::0;34872:4;34859:17:::1;::::0;::::1;;;;;;;;;;;34783:99:::0;:::o;30237:41::-;;;;;;;;;;;;;:::o;36102:91::-;36186:1;36102:91;:::o;39854:508::-;-1:-1:-1;;;;;33052:20:0;;;;;;:14;:20;;;;;;40181:6;;33052:20;;:29;33044:59;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;;;;40207:35:::1;40221:12;:10;:12::i;:::-;40235:6;40207:13;:35::i;:::-;40199:92;;;;-1:-1:-1::0;;;40199:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40298:58;40304:6;40312:9;40323:6;40331:4;40337:12;40351:4;40298:5;:58::i;:::-;39854:508:::0;;;;;;:::o;33998:256::-;32827:10;;-1:-1:-1;;;;;32827:10:0;32813;:24;;:51;;-1:-1:-1;32848:10:0;32841:18;;;;:6;:18;;;;;;;;;:23;32813:51;32805:74;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;;;;34083:9:::1;34079:170;34102:5;:12;34098:1;:16;34079:170;;;34129:12;34144:5;34150:1;34144:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;34165:15:0;::::1;;::::0;;;:9:::1;:15:::0;;;;;;;;34144:8;;-1:-1:-1;34165:15:0::1;;34161:49;;34192:8;;;34161:49;-1:-1:-1::0;;;;;34218:15:0::1;34236:5;34218:15:::0;;;:9:::1;:15;::::0;;;;:23;;-1:-1:-1;;34218:23:0::1;::::0;;34079:170:::1;34116:3;;34079:170;;36467:146:::0;-1:-1:-1;;;;;36585:22:0;36562:7;36585:22;;;:9;:22;;;;;;;36467:146::o;33738:254::-;32827:10;;-1:-1:-1;;;;;32827:10:0;32813;:24;;:51;;-1:-1:-1;32848:10:0;32841:18;;;;:6;:18;;;;;;;;;:23;32813:51;32805:74;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;;;;33823:9:::1;33819:168;33842:5;:12;33838:1;:16;33819:168;;;33869:12;33884:5;33890:1;33884:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;33904:15:0;::::1;;::::0;;;:9:::1;:15:::0;;;;;;;;33884:8;;-1:-1:-1;33904:15:0::1;;33901:48;;;33931:8;;;33901:48;-1:-1:-1::0;;;;;33957:15:0::1;;::::0;;;:9:::1;:15;::::0;;;;:22;;-1:-1:-1;;33957:22:0::1;33975:4;33957:22;::::0;;33819:168:::1;33856:3;;33819:168;;30773:32:::0;;;;;;:::o;38721:389::-;38822:8;-1:-1:-1;;;;;38806:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;38806:24:0;;;38798:73;;;;-1:-1:-1;;;38798:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38884:27:0;;;;;;:17;:27;;;;;;;;38880:169;;;38929:24;:38;38954:12;:10;:12::i;:::-;-1:-1:-1;;;;;38929:38:0;;;;;;;;;;;;;;;;;-1:-1:-1;38929:38:0;;;:48;;;;;;;;;38922:55;;-1:-1:-1;;38922:55:0;;;38880:169;;;39037:4;39000:10;:24;39011:12;:10;:12::i;:::-;-1:-1:-1;;;;;39000:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;39000:24:0;;;:34;;;;;;;;;:41;;-1:-1:-1;;39000:41:0;;;;;;;;;;38880:169;39091:12;:10;:12::i;:::-;-1:-1:-1;;;;;39062:42:0;39081:8;-1:-1:-1;;;;;39062:42:0;;;;;;;;;;;38721:389;:::o;35638:98::-;35723:7;35716:14;;;;;;;;-1:-1:-1;;35716:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35694:13;;35716:14;;35723:7;;35716:14;;35723:7;35716:14;;;;;;;;;;;;;;;;;;;;;;;;30854:39;;;;;;;;;;;;;;;:::o;37017:185::-;37122:12;:10;:12::i;:::-;-1:-1:-1;;;;;33052:20:0;;;;;;:14;:20;;;;;;;;:29;33044:59;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;;;;37142:54:::1;37148:12;:10;:12::i;:::-;37162:9;37173:6;37181:4;37142:54;;;;;;;;;;;::::0;37191:4:::1;37142:5;:54::i;:::-;37017:185:::0;;;;:::o;37425:613::-;37562:4;37534:12;:10;:12::i;:::-;-1:-1:-1;;;;;33052:20:0;;;;;;:14;:20;;;;;;;;:29;33044:59;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37583:23:0;::::1;37575:72;;;;-1:-1:-1::0;;;37575:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37656:12;37671;:10;:12::i;:::-;37656:27;;37692:17;37712:30;37726:4;37732:9;37712:13;:30::i;:::-;37692:50;;37754:12;37751:89;;;37776:56;37794:4;37800;37806:9;37817:6;37776:56;;;;;;;;;;;::::0;::::1;;;;;;;;;;;::::0;:17:::1;:56::i;:::-;37848:58;37854:4;37860;37866:9;37877:6;37848:58;;;;;;;;;;;::::0;::::1;;;;;;;;;;;::::0;37893:12:::1;37848:5;:58::i;:::-;37918:12;37915:98;;;37940:65;37960:4;37966;37972:9;37983:6;37940:65;;;;;;;;;;;::::0;::::1;;;;;;;;;;;::::0;37999:5:::1;37940:19;:65::i;:::-;-1:-1:-1::0;38028:4:0::1;::::0;37425:613;-1:-1:-1;;;;;37425:613:0:o;33164:166::-;32938:10;;-1:-1:-1;;;;;32938:10:0;32952;32938:24;32930:53;;;;;-1:-1:-1;;;32930:53:0;;;;;;;;;;;;-1:-1:-1;;;32930:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33247:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;;:22;33239:57:::1;;;::::0;;-1:-1:-1;;;33239:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33239:57:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;33303:17:0::1;;::::0;;;33323:1:::1;33303:17;::::0;;;;;;;:21;33164:166::o;33336:::-;32938:10;;-1:-1:-1;;;;;32938:10:0;32952;32938:24;32930:53;;;;;-1:-1:-1;;;32930:53:0;;;;;;;;;;;;-1:-1:-1;;;32930:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33419:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;;;;;:22:::1;33411:57;;;::::0;;-1:-1:-1;;;33411:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33411:57:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;33475:17:0::1;33495:1;33475:17:::0;;;:6:::1;:17;::::0;;;;:21;33336:166::o;34888:268::-;32827:10;;-1:-1:-1;;;;;32827:10:0;32813;:24;;:51;;-1:-1:-1;32848:10:0;32841:18;;;;:6;:18;;;;;;;;;:23;32813:51;32805:74;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;;;;34969:9:::1;34965:186;34988:5;:12;34984:1;:16;34965:186;;;35015:12;35030:5;35036:1;35030:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;35050:20:0;::::1;;::::0;;;:14:::1;:20:::0;;;;;;;;35030:8;;-1:-1:-1;35050:20:0::1;;:28;;:20:::0;:28:::1;35047:61;;;35090:8;;;35047:61;-1:-1:-1::0;;;;;35116:20:0::1;;::::0;;;:14:::1;:20;::::0;;;;:27;;-1:-1:-1;;35116:27:0::1;35139:4;35116:27;::::0;;34965:186:::1;35002:3;;34965:186;;38372:285:::0;38472:4;38504:11;-1:-1:-1;;;;;38492:23:0;:8;-1:-1:-1;;;;;38492:23:0;;:115;;;-1:-1:-1;;;;;;38527:27:0;;;;;;:17;:27;;;;;;;;:79;;;;-1:-1:-1;;;;;;38559:37:0;;;;;;;:24;:37;;;;;;;;:47;;;;;;;;;;;;38558:48;38527:79;38492:159;;;-1:-1:-1;;;;;;38618:23:0;;;;;;;:10;:23;;;;;;;;:33;;;;;;;;;;;;38492:159;38485:166;38372:285;-1:-1:-1;;;38372:285:0:o;41010:147::-;-1:-1:-1;;;;;41123:19:0;;;41100:7;41123:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;41010:147::o;35162:272::-;32827:10;;-1:-1:-1;;;;;32827:10:0;32813;:24;;:51;;-1:-1:-1;32848:10:0;32841:18;;;;:6;:18;;;;;;;;;:23;32813:51;32805:74;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;-1:-1:-1;;;32805:74:0;;;;;;;;;;;;;;;35245:9:::1;35241:188;35264:5;:12;35260:1;:16;35241:188;;;35291:12;35306:5;35312:1;35306:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;35326:20:0;::::1;;::::0;;;:14:::1;:20:::0;;;;;;;;35306:8;;-1:-1:-1;35326:20:0::1;;35323:62;;35367:8;;;35323:62;-1:-1:-1::0;;;;;35393:20:0::1;35416:5;35393:20:::0;;;:14:::1;:20;::::0;;;;:28;;-1:-1:-1;;35393:28:0::1;::::0;;35241:188:::1;35278:3;;35241:188;;30810:39:::0;;;;;;;;;;;;;;;:::o;39171:380::-;39265:12;:10;:12::i;:::-;-1:-1:-1;;;;;39253:24:0;:8;-1:-1:-1;;;;;39253:24:0;;;39245:70;;;;-1:-1:-1;;;39245:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39328:27:0;;;;;;:17;:27;;;;;;;;39324:169;;;39417:4;39366:24;:38;39391:12;:10;:12::i;:::-;-1:-1:-1;;;;;39366:38:0;;;;;;;;;;;;;;;;;-1:-1:-1;39366:38:0;;;:48;;;;;;;;;:55;;-1:-1:-1;;39366:55:0;;;;;;;;;;39324:169;;;39451:10;:24;39462:12;:10;:12::i;:::-;-1:-1:-1;;;;;39451:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;39451:24:0;;;:34;;;;;;;;;39444:41;;-1:-1:-1;;39444:41:0;;;39324:169;39532:12;:10;:12::i;:::-;-1:-1:-1;;;;;39506:39:0;39522:8;-1:-1:-1;;;;;39506:39:0;;;;;;;;;;;39171:380;:::o;40478:300::-;-1:-1:-1;;;;;33052:20:0;;;;;;:14;:20;;;;;;40615:7;;33052:20;;:29;33044:59;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;;;;40638:36:::1;40652:12;:10;:12::i;:::-;40666:7;40638:13;:36::i;:::-;40630:93;;;;-1:-1:-1::0;;;40630:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40730:42;40736:7;40745:6;40753:4;40759:12;40730:5;:42::i;:::-;40478:300:::0;;;;;:::o;38163:149::-;38249:12;:10;:12::i;:::-;-1:-1:-1;;;;;33052:20:0;;;;;;:14;:20;;;;;;;;:29;33044:59;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;-1:-1:-1;;;33044:59:0;;;;;;;;;;;;;;;38269:37:::1;38275:12;:10;:12::i;:::-;38289:6;38297:4;38269:37;;;;;;;;;;;::::0;:5:::1;:37::i;:::-;38163:149:::0;;;:::o;12624:179::-;12682:7;12714:5;;;12738:6;;;;12730:46;;;;;-1:-1:-1;;;12730:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17901:422;18268:20;18307:8;;;17901:422::o;176:106::-;264:10;176:106;:::o;47019:323::-;-1:-1:-1;;;;;47109:20:0;;47101:70;;;;-1:-1:-1;;;47101:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47186:21:0;;47178:69;;;;-1:-1:-1;;;47178:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47256:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:36;;;47304:32;;;;;;;;;;;;;;;;;47019:323;;;:::o;50698:490::-;50784:4;;50801:10;;;;:37;;;;;;;;;50798:70;;;-1:-1:-1;50855:5:0;50848:12;;50798:70;50893:22;50879:10;;;;:36;;;;;;;;;50876:68;;;-1:-1:-1;50932:4:0;50925:11;;50876:68;50969:24;50955:10;;;;:38;;;;;;;;;50952:98;;;-1:-1:-1;;;;;51010:15:0;;;;;;:9;:15;;;;;;;;;:32;;-1:-1:-1;;;;;;51029:13:0;;;;;;:9;:13;;;;;;;;51010:32;51003:39;;;;50952:98;51075:24;51061:10;;;;:38;;;;;;;;;51058:104;;;-1:-1:-1;;;;;51118:15:0;;;;;;:9;:15;;;;;;;;51117:16;51116:38;;;;-1:-1:-1;;;;;;;51140:13:0;;;;;;:9;:13;;;;;;;;51139:14;51109:45;;51058:104;-1:-1:-1;51177:5:0;50698:490;;;;:::o;47806:623::-;48200:78;;;-1:-1:-1;;;48200:78:0;;-1:-1:-1;;;;;48200:78:0;;;;;;29921:66;48200:78;;;;;;48178:19;;29601:42;;48200:41;;:78;;;;;;;;;;;;;;;29601:42;48200:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48200:78:0;;-1:-1:-1;;;;;;48289:25:0;;;48285:139;;48339:11;-1:-1:-1;;;;;48325:39:0;;48365:8;48375:4;48381:2;48385:6;48393:8;48403:12;48325:91;;;;;;;;;;;;;-1:-1:-1;;;;;48325:91:0;;;;;;-1:-1:-1;;;;;48325:91:0;;;;;;-1:-1:-1;;;;;48325:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48325:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48285:139;47806:623;;;;;;;:::o;46234:652::-;46550:12;46547:81;;;46572:48;46593:8;46603:4;46609:2;46613:6;46572:20;:48::i;:::-;46654:70;46674:6;46654:70;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46654:15:0;;;;;;:9;:15;;;;;;;:70;:19;:70::i;:::-;-1:-1:-1;;;;;46636:15:0;;;;;;;:9;:15;;;;;;:88;;;;46747:13;;;;;;;:25;;46765:6;46747:17;:25::i;:::-;46731:9;:13;46741:2;-1:-1:-1;;;;;46731:13:0;-1:-1:-1;;;;;46731:13:0;;;;;;;;;;;;:41;;;;46807:2;-1:-1:-1;;;;;46786:56:0;46801:4;-1:-1:-1;;;;;46786:56:0;46791:8;-1:-1:-1;;;;;46786:56:0;;46811:6;46819:8;46829:12;46786:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46786:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46869:2;-1:-1:-1;;;;;46854:26:0;46863:4;-1:-1:-1;;;;;46854:26:0;;46873:6;46854:26;;;;;;;;;;;;;;;;;;46234:652;;;;;;;:::o;15451:166::-;15537:7;15573:12;15565:6;;;;15557:29;;;;-1:-1:-1;;;15557:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15604:5:0;;;15451:166::o;49107:857::-;49575:79;;;-1:-1:-1;;;49575:79:0;;-1:-1:-1;;;;;49575:79:0;;;;;;30100:66;49575:79;;;;;;49553:19;;29601:42;;49575:41;;:79;;;;;;;;;;;;;;;29601:42;49575:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49575:79:0;;-1:-1:-1;;;;;;49665:25:0;;;49661:298;;49718:11;-1:-1:-1;;;;;49701:44:0;;49746:8;49756:4;49762:2;49766:6;49774:8;49784:12;49701:96;;;;;;;;;;;;;-1:-1:-1;;;;;49701:96:0;;;;;;-1:-1:-1;;;;;49701:96:0;;;;;;-1:-1:-1;;;;;49701:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49701:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49661:298;;;49815:19;49811:148;;;49854:15;:2;-1:-1:-1;;;;;49854:13:0;;:15::i;:::-;49853:16;49845:106;;;;-1:-1:-1;;;49845:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49107:857;;;;;;;;:::o;44444:728::-;-1:-1:-1;;;;;44750:18:0;;44742:65;;;;-1:-1:-1;;;44742:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44822:16:0;;44814:61;;;;;-1:-1:-1;;;44814:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44884:16;44903:12;:10;:12::i;:::-;44884:31;;44924:69;44942:8;44952:4;44958:2;44962:6;44970:8;44980:12;44924:17;:69::i;:::-;45002:63;45008:8;45018:4;45024:2;45028:6;45036:8;45046:12;45060:4;45002:5;:63::i;:::-;45074:92;45094:8;45104:4;45110:2;45114:6;45122:8;45132:12;45146:19;45074;:92::i;45470:758::-;-1:-1:-1;;;;;45698:18:0;;45690:65;;;;-1:-1:-1;;;45690:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45764:16;45783:12;:10;:12::i;:::-;45764:31;;45804:73;45822:8;45832:4;45846:1;45850:6;45858:4;45864:12;45804:17;:73::i;:::-;45886:56;45907:8;45917:4;45931:1;45935:6;45886:20;:56::i;:::-;46000:66;46020:6;46000:66;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46000:15:0;;;;;;:9;:15;;;;;;;:66;:19;:66::i;:::-;-1:-1:-1;;;;;45982:15:0;;;;;;:9;:15;;;;;:84;46088:12;;:24;;46105:6;46088:16;:24::i;:::-;46073:12;:39;;;;46143:4;-1:-1:-1;;;;;46126:50:0;46133:8;-1:-1:-1;;;;;46126:50:0;;46149:6;46157:4;46163:12;46126:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46126:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46188:34;;;;;;;;46211:1;;-1:-1:-1;;;;;46188:34:0;;;;;;;;;;;;45470:758;;;;;:::o;13086:158::-;13144:7;13177:1;13172;:6;;13164:49;;;;;-1:-1:-1;;;13164:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13231:5:0;;;13086:158::o

Swarm Source

ipfs://41398d4abdbca80d9d5cb6a9baa02b17289d45d8acd60743fb2393f824fe1bda

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.