ETH Price: $3,700.89 (+4.67%)
Gas: 63 Gwei

Token

TXA (TXA)
 

Overview

Max Total Supply

48,082,840.968870117725102676 TXA

Holders

2,281 (0.00%)

Total Transfers

-

Market

Price

$0.07 @ 0.000020 ETH (-4.57%)

Fully Diluted Market Cap

$3,471,292.62

Circulating Supply Market Cap

$1,127,941.00

Other Info

Token Contract (WITH 18 Decimals)

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

OVERVIEW

Project TXA is building a Decentralized Settlement Layer for a new generation of DEXs, called the Hybrid-DEX or hDEX.

Market

Volume (24H):$95,956.00
Market Capitalization:$1,127,941.00
Circulating Supply:15,636,607.00 TXA
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TXA

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-14
*/

// Sources flattened with hardhat v2.4.0 https://hardhat.org
// SPDX-License-Identifier: GPL-3.0-or-later

// File @openzeppelin/contracts/token/ERC777/[email protected]

// License: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777Token standard as defined in the EIP.
 *
 * This contract uses the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let
 * token holders and recipients react to token movements by using setting implementers
 * for the associated interfaces in said registry. See {IERC1820Registry} and
 * {ERC1820Implementer}.
 */
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);
}


// File @openzeppelin/contracts/token/ERC777/[email protected]

// License: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
 *
 * Accounts can be notified of {IERC777} tokens being sent to them by having a
 * contract implement this interface (contract holders can be their own
 * implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
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;
}


// File @openzeppelin/contracts/token/ERC777/[email protected]

// License: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensSender standard as defined in the EIP.
 *
 * {IERC777} Token holders can be notified of operations performed on their
 * tokens by having a contract implement this interface (contract holders can be
 *  their own implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
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;
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// License: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

// License: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.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);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// License: MIT

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

// License: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the global ERC1820 Registry, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register
 * implementers for interfaces in this registry, as well as query support.
 *
 * Implementers may be shared by multiple accounts, and can also implement more
 * than a single interface for each account. Contracts can implement interfaces
 * for themselves, but externally-owned accounts (EOA) must delegate this to a
 * contract.
 *
 * {IERC165} interfaces can also be queried via the registry.
 *
 * For an in-depth explanation and source code analysis, see the EIP text.
 */
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);
}


// File @openzeppelin/contracts/token/ERC777/[email protected]

// License: MIT

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the {IERC777} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * Support for ERC20 is included in this contract, as specified by the EIP: both
 * the ERC777 and ERC20 interfaces can be safely used when interacting with it.
 * Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token
 * movements.
 *
 * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there
 * are no special restrictions in the amount of tokens that created, moved, or
 * destroyed. This makes integration with ERC20 applications seamless.
 */
contract ERC777 is Context, IERC777, IERC20 {
    using Address for address;

    IERC1820Registry constant internal _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);

    mapping(address => uint256) private _balances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender");
    bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");

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

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

    /**
     * @dev `defaultOperators` may be an empty array.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        address[] memory defaultOperators_
    ) {
        _name = name_;
        _symbol = symbol_;

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

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

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

    /**
     * @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  {
        _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 returns (bool) {
        require(recipient != address(0), "ERC777: transfer to the zero address");

        address from = _msgSender();

        _callTokensToSend(from, from, recipient, amount, "", "");

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

        _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  {
        _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
    {
        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 {
        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 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();

        _callTokensToSend(spender, holder, recipient, amount, "", "");

        _move(spender, holder, recipient, amount, "", "");

        uint256 currentAllowance = _allowances[holder][spender];
        require(currentAllowance >= amount, "ERC777: transfer amount exceeds allowance");
        _approve(holder, spender, currentAllowance - amount);

        _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
    {
        _mint(account, amount, userData, operatorData, true);
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If `requireReceptionAck` is set to true, and 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,
        bool requireReceptionAck
    )
        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 += amount;
        _balances[account] += amount;

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

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

        _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
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC777: burn amount exceeds balance");
        _balances[from] = fromBalance - amount;
        _totalSupply -= 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
    )
        private
    {
        _beforeTokenTransfer(operator, from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC777: transfer amount exceeds balance");
        _balances[from] = fromBalance - amount;
        _balances[to] += 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 { }
}


// File contracts/TXA.sol
// License: GPL-3.0-or-later
/**
 *  Copyright (C) 2021 TXA Pte. Ltd.
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
 *  See the GNU General Public License for more details.
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
pragma solidity ^0.8.3;

contract TXA is ERC777 {
    address public manager;
    bool public transferFlag = false;
    mapping(address => bool) public distributors;
    mapping(address => bool) public restricted;
    /**
     * @dev `defaultOperators` may be an empty array.
     */
    constructor(
        address[] memory defaultOperators,
        address _manager,
        address founders,
        address operations,
        address advisors,
        address seed,
        address privateSale,
        address foundation,
        address reserve
    ) public ERC777("TXA", "TXA", defaultOperators) {
        manager = _manager;
        uint256 wholeTokenMul = 10 ** uint256(decimals());
        distributors[msg.sender] = true;
        distributors[manager] = true;
        distributors[founders] = true;
        distributors[operations] = true;
        distributors[advisors] = true;
        distributors[seed] = true;
        distributors[privateSale] = true;
        distributors[foundation] = true;
        distributors[reserve] = true;
        _mint(msg.sender, wholeTokenMul * 50000000, "", "");
        send(founders, wholeTokenMul * 8000000, "");
        send(operations, wholeTokenMul * 7000000, "");
        send(advisors, wholeTokenMul * 5000000, "");
        send(seed, wholeTokenMul * 1250000, "");
        send(privateSale, wholeTokenMul * 4375000, "");
        send(foundation, wholeTokenMul * 10000000, "");
        transfer(reserve, wholeTokenMul * 14375000);
        distributors[msg.sender] = false;
        require(balanceOf(msg.sender) == 0, "LEFTOVER_TOKENS");
    }

    modifier onlyManager {
        require(msg.sender == manager, "UNAUTHORIZED");
        _;
    }

    /**
     * Called by manager to allow non-distribution contracts to perform transfers.
     */
    function allowTransfers() external onlyManager {
        require(!transferFlag, "ALREADY_ACTIVATED");
        transferFlag = true;
    }

    /**
     * Called by manager to restrict addresses from receiving tokens.
     */
    function restrictTransfers(address[] calldata recipients) external onlyManager {
        for(uint i = 0; i < recipients.length; i++) {
            restricted[recipients[i]] = true;
        }
    }

    /**
     * Called before every transfer to check it should be allowed.
     * If manager has yet to call `allowTransfers`, then only distribution addresses are allowed to transfer.
     * Forbids transferring to an address that manager has set as restricted.
     */
    function _beforeTokenTransfer(address operator, address from, address to, uint256 amount) internal override { 
        if(!transferFlag) {
            require(from == address(0) || distributors[from], "NOT_DISTRIBUTOR");
        }
        require(!restricted[to], "FORBIDDEN_RECIPIENT");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"defaultOperators","type":"address[]"},{"internalType":"address","name":"_manager","type":"address"},{"internalType":"address","name":"founders","type":"address"},{"internalType":"address","name":"operations","type":"address"},{"internalType":"address","name":"advisors","type":"address"},{"internalType":"address","name":"seed","type":"address"},{"internalType":"address","name":"privateSale","type":"address"},{"internalType":"address","name":"foundation","type":"address"},{"internalType":"address","name":"reserve","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":[],"name":"allowTransfers","outputs":[],"stateMutability":"nonpayable","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":"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":[{"internalType":"address","name":"","type":"address"}],"name":"distributors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"recipients","type":"address[]"}],"name":"restrictTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"restricted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"}]

60806040526000600960146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50604051620059e9380380620059e983398181016040528101906200005291906200178e565b6040518060400160405280600381526020017f54584100000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f54584100000000000000000000000000000000000000000000000000000000008152508a8260029080519060200190620000d79291906200156a565b508160039080519060200190620000f09291906200156a565b50806004908051906020019062000109929190620015fb565b5060005b8151811015620001c65760016005600084848151811062000157577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620001bd90620020d2565b9150506200010d565b50731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce2177054306040518463ffffffff1660e01b81526004016200023a9392919062001afb565b600060405180830381600087803b1580156200025557600080fd5b505af11580156200026a573d6000803e3d6000fd5b50505050731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a306040518463ffffffff1660e01b8152600401620002e19392919062001afb565b600060405180830381600087803b158015620002fc57600080fd5b505af115801562000311573d6000803e3d6000fd5b5050505050505087600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006200036b6200090860201b60201c565b60ff16600a6200037c919062001e0f565b90506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620006fb336302faf08083620006cf919062001f4c565b60405180602001604052806000815250604051806020016040528060008152506200091160201b60201c565b6200072d88627a12008362000711919062001f4c565b604051806020016040528060008152506200092d60201b60201c565b6200075f87626acfc08362000743919062001f4c565b604051806020016040528060008152506200092d60201b60201c565b6200079186624c4b408362000775919062001f4c565b604051806020016040528060008152506200092d60201b60201c565b620007c385621312d083620007a7919062001f4c565b604051806020016040528060008152506200092d60201b60201c565b620007f5846242c1d883620007d9919062001f4c565b604051806020016040528060008152506200092d60201b60201c565b620008278362989680836200080b919062001f4c565b604051806020016040528060008152506200092d60201b60201c565b620008498262db5858836200083d919062001f4c565b6200096760201b60201c565b506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000620008b53362000a9860201b60201c565b14620008f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008ef9062001c26565b60405180910390fd5b5050505050505050505062002414565b60006012905090565b6200092784848484600162000ae060201b60201c565b50505050565b620009626200094162000ce160201b60201c565b84848460405180602001604052806000815250600162000ce960201b60201c565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620009db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009d29062001c04565b60405180910390fd5b6000620009ed62000ce160201b60201c565b905062000a2381828686604051806020016040528060008152506040518060200160405280600081525062000e2f60201b60201c565b62000a5781828686604051806020016040528060008152506040518060200160405280600081525062000fb060201b60201c565b62000a8d8182868660405180602001604052806000815250604051806020016040528060008152506000620011e660201b60201c565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000b53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b4a9062001bc0565b60405180910390fd5b600062000b6562000ce160201b60201c565b905062000b7c8160008888620013e460201b60201c565b846001600082825462000b90919062001d57565b92505081905550846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000be7919062001d57565b9250508190555062000c068160008888888888620011e660201b60201c565b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d87878760405162000c699392919062001c87565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405162000cd1919062001c6a565b60405180910390a3505050505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141562000d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d539062001b38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000dc69062001c48565b60405180910390fd5b600062000de162000ce160201b60201c565b905062000df981888888888862000e2f60201b60201c565b62000e0f81888888888862000fb060201b60201c565b62000e2681888888888888620011e660201b60201c565b50505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956040518363ffffffff1660e01b815260040162000ea292919062001ace565b60206040518083038186803b15801562000ebb57600080fd5b505afa15801562000ed0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ef6919062001762565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462000fa7578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b815260040162000f729695949392919062001a53565b600060405180830381600087803b15801562000f8d57600080fd5b505af115801562000fa2573d6000803e3d6000fd5b505050505b50505050505050565b62000fc486868686620013e460201b60201c565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156200104d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620010449062001b5a565b60405180910390fd5b83816200105b919062001fad565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620010ed919062001d57565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc826146779878787876040516200116e9392919062001c87565b60405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051620011d5919062001c6a565b60405180910390a350505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b81526004016200125992919062001ace565b60206040518083038186803b1580156200127257600080fd5b505afa15801562001287573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012ad919062001762565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161462001362578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401620013289695949392919062001a53565b600060405180830381600087803b1580156200134357600080fd5b505af115801562001358573d6000803e3d6000fd5b50505050620013da565b8115620013d957620013958673ffffffffffffffffffffffffffffffffffffffff166200155760201b6200151f1760201c565b15620013d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013cf9062001be2565b60405180910390fd5b5b5b5050505050505050565b600960149054906101000a900460ff16620014c157600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806200147e5750600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b620014c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014b79062001b9e565b60405180910390fd5b5b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161562001551576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620015489062001b7c565b60405180910390fd5b50505050565b600080823b905060008111915050919050565b828054620015789062002066565b90600052602060002090601f0160209004810192826200159c5760008555620015e8565b82601f10620015b757805160ff1916838001178555620015e8565b82800160010185558215620015e8579182015b82811115620015e7578251825591602001919060010190620015ca565b5b509050620015f791906200168a565b5090565b82805482825590600052602060002090810192821562001677579160200282015b82811115620016765782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906200161c565b5b5090506200168691906200168a565b5090565b5b80821115620016a55760008160009055506001016200168b565b5090565b6000620016c0620016ba8462001cfb565b62001cd2565b90508083825260208201905082856020860282011115620016e057600080fd5b60005b85811015620017145781620016f988826200171e565b845260208401935060208301925050600181019050620016e3565b5050509392505050565b6000815190506200172f81620023fa565b92915050565b600082601f8301126200174757600080fd5b815162001759848260208601620016a9565b91505092915050565b6000602082840312156200177557600080fd5b600062001785848285016200171e565b91505092915050565b60008060008060008060008060006101208a8c031215620017ae57600080fd5b60008a015167ffffffffffffffff811115620017c957600080fd5b620017d78c828d0162001735565b9950506020620017ea8c828d016200171e565b9850506040620017fd8c828d016200171e565b9750506060620018108c828d016200171e565b9650506080620018238c828d016200171e565b95505060a0620018368c828d016200171e565b94505060c0620018498c828d016200171e565b93505060e06200185c8c828d016200171e565b925050610100620018708c828d016200171e565b9150509295985092959850929598565b6200188b8162001fe8565b82525050565b6200189c8162001ffc565b82525050565b6000620018af8262001d2a565b620018bb818562001d35565b9350620018cd81856020860162002030565b620018d881620021ad565b840191505092915050565b6000620018f260228362001d46565b9150620018ff82620021cb565b604082019050919050565b60006200191960278362001d46565b915062001926826200221a565b604082019050919050565b60006200194060138362001d46565b91506200194d8262002269565b602082019050919050565b600062001967600f8362001d46565b9150620019748262002292565b602082019050919050565b60006200198e60208362001d46565b91506200199b82620022bb565b602082019050919050565b6000620019b5604d8362001d46565b9150620019c282620022e4565b606082019050919050565b6000620019dc60248362001d46565b9150620019e98262002359565b604082019050919050565b600062001a03600f8362001d46565b915062001a1082620023a8565b602082019050919050565b600062001a2a60208362001d46565b915062001a3782620023d1565b602082019050919050565b62001a4d8162002026565b82525050565b600060c08201905062001a6a600083018962001880565b62001a79602083018862001880565b62001a88604083018762001880565b62001a97606083018662001a42565b818103608083015262001aab8185620018a2565b905081810360a083015262001ac18184620018a2565b9050979650505050505050565b600060408201905062001ae5600083018562001880565b62001af4602083018462001891565b9392505050565b600060608201905062001b12600083018662001880565b62001b21602083018562001891565b62001b30604083018462001880565b949350505050565b6000602082019050818103600083015262001b5381620018e3565b9050919050565b6000602082019050818103600083015262001b75816200190a565b9050919050565b6000602082019050818103600083015262001b978162001931565b9050919050565b6000602082019050818103600083015262001bb98162001958565b9050919050565b6000602082019050818103600083015262001bdb816200197f565b9050919050565b6000602082019050818103600083015262001bfd81620019a6565b9050919050565b6000602082019050818103600083015262001c1f81620019cd565b9050919050565b6000602082019050818103600083015262001c4181620019f4565b9050919050565b6000602082019050818103600083015262001c638162001a1b565b9050919050565b600060208201905062001c81600083018462001a42565b92915050565b600060608201905062001c9e600083018662001a42565b818103602083015262001cb28185620018a2565b9050818103604083015262001cc88184620018a2565b9050949350505050565b600062001cde62001cf1565b905062001cec82826200209c565b919050565b6000604051905090565b600067ffffffffffffffff82111562001d195762001d186200217e565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062001d648262002026565b915062001d718362002026565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001da95762001da862002120565b5b828201905092915050565b6000808291508390505b600185111562001e065780860481111562001dde5762001ddd62002120565b5b600185161562001dee5780820291505b808102905062001dfe85620021be565b945062001dbe565b94509492505050565b600062001e1c8262002026565b915062001e298362002026565b925062001e587fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001e60565b905092915050565b60008262001e72576001905062001f45565b8162001e82576000905062001f45565b816001811462001e9b576002811462001ea65762001edc565b600191505062001f45565b60ff84111562001ebb5762001eba62002120565b5b8360020a91508482111562001ed55762001ed462002120565b5b5062001f45565b5060208310610133831016604e8410600b841016171562001f165782820a90508381111562001f105762001f0f62002120565b5b62001f45565b62001f25848484600162001db4565b9250905081840481111562001f3f5762001f3e62002120565b5b81810290505b9392505050565b600062001f598262002026565b915062001f668362002026565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562001fa25762001fa162002120565b5b828202905092915050565b600062001fba8262002026565b915062001fc78362002026565b92508282101562001fdd5762001fdc62002120565b5b828203905092915050565b600062001ff58262002006565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200205057808201518184015260208101905062002033565b8381111562002060576000848401525b50505050565b600060028204905060018216806200207f57607f821691505b602082108114156200209657620020956200214f565b5b50919050565b620020a782620021ad565b810181811067ffffffffffffffff82111715620020c957620020c86200217e565b5b80604052505050565b6000620020df8262002026565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562002115576200211462002120565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f4552433737373a2073656e642066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b7f464f5242494444454e5f524543495049454e5400000000000000000000000000600082015250565b7f4e4f545f4449535452494255544f520000000000000000000000000000000000600082015250565b7f4552433737373a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b7f4552433737373a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4c4546544f5645525f544f4b454e530000000000000000000000000000000000600082015250565b7f4552433737373a2073656e6420746f20746865207a65726f2061646472657373600082015250565b620024058162001fe8565b81146200241157600080fd5b50565b6135c580620024246000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806395d89b41116100c3578063d8d9d6bc1161007c578063d8d9d6bc146103b7578063d95b6371146103e7578063dd62ed3e14610417578063fad8b32a14610447578063fc673c4f14610463578063fe9d93031461047f57610158565b806395d89b41146102e35780639bd9bbc614610301578063a393cedc1461031d578063a9059cbb1461033b578063c1d7b73e1461036b578063cc6427841461038757610158565b8063313ce56711610115578063313ce56714610221578063481c6a751461023f578063556f0dc71461025d57806362ad1b831461027b57806370a0823114610297578063959b8c3f146102c757610158565b806306e485381461015d57806306fdde031461017b578063095ea7b31461019957806318160ddd146101c95780632185810b146101e757806323b872dd146101f1575b600080fd5b61016561049b565b6040516101729190612a15565b60405180910390f35b610183610529565b6040516101909190612a52565b60405180910390f35b6101b360048036038101906101ae91906123db565b6105bb565b6040516101c09190612a37565b60405180910390f35b6101d16105de565b6040516101de9190612cb4565b60405180910390f35b6101ef6105e8565b005b61020b600480360381019061020691906122e5565b6106e5565b6040516102189190612a37565b60405180910390f35b61022961093f565b6040516102369190612d14565b60405180910390f35b610247610948565b6040516102549190612962565b60405180910390f35b61026561096e565b6040516102729190612cb4565b60405180910390f35b61029560048036038101906102909190612334565b610977565b005b6102b160048036038101906102ac9190612257565b6109dd565b6040516102be9190612cb4565b60405180910390f35b6102e160048036038101906102dc9190612257565b610a25565b005b6102eb610c86565b6040516102f89190612a52565b60405180910390f35b61031b60048036038101906103169190612417565b610d18565b005b610325610d42565b6040516103329190612a37565b60405180910390f35b610355600480360381019061035091906123db565b610d55565b6040516103629190612a37565b60405180910390f35b61038560048036038101906103809190612511565b610e63565b005b6103a1600480360381019061039c9190612257565b610fbe565b6040516103ae9190612a37565b60405180910390f35b6103d160048036038101906103cc9190612257565b610fde565b6040516103de9190612a37565b60405180910390f35b61040160048036038101906103fc91906122a9565b610ffe565b60405161040e9190612a37565b60405180910390f35b610431600480360381019061042c91906122a9565b6111af565b60405161043e9190612cb4565b60405180910390f35b610461600480360381019061045c9190612257565b611236565b005b61047d6004803603810190610478919061247e565b611497565b005b61049960048036038101906104949190612556565b6114f9565b005b6060600480548060200260200160405190810160405280929190818152602001828054801561051f57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116104d5575b5050505050905090565b60606002805461053890612f21565b80601f016020809104026020016040519081016040528092919081815260200182805461056490612f21565b80156105b15780601f10610586576101008083540402835291602001916105b1565b820191906000526020600020905b81548152906001019060200180831161059457829003601f168201915b5050505050905090565b6000806105c6611532565b90506105d381858561153a565b600191505092915050565b6000600154905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066f90612ad4565b60405180910390fd5b600960149054906101000a900460ff16156106c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bf90612af4565b60405180910390fd5b6001600960146101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074d90612bd4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156107c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bd90612c34565b60405180910390fd5b60006107d0611532565b90506107fe818686866040518060200160405280600081525060405180602001604052806000815250611705565b61082a81868686604051806020016040528060008152506040518060200160405280600081525061187b565b6000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156108ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e590612c14565b60405180910390fd5b610904868386846108ff9190612e4c565b61153a565b6109328287878760405180602001604052806000815250604051806020016040528060008152506000611a9e565b6001925050509392505050565b60006012905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006001905090565b610988610982611532565b86610ffe565b6109c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109be90612bf4565b60405180910390fd5b6109d685858585856001611c7f565b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8073ffffffffffffffffffffffffffffffffffffffff16610a44611532565b73ffffffffffffffffffffffffffffffffffffffff161415610a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9290612b54565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b855760076000610af9611532565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055610c22565b600160066000610b93611532565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610c2a611532565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b606060038054610c9590612f21565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190612f21565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b5050505050905090565b610d3d610d23611532565b848484604051806020016040528060008152506001611c7f565b505050565b600960149054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90612bd4565b60405180910390fd5b6000610dd0611532565b9050610dfe818286866040518060200160405280600081525060405180602001604052806000815250611705565b610e2a81828686604051806020016040528060008152506040518060200160405280600081525061187b565b610e588182868660405180602001604052806000815250604051806020016040528060008152506000611a9e565b600191505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90612ad4565b60405180910390fd5b60005b82829050811015610fb9576001600b6000858585818110610f40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610f559190612257565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fb190612f84565b915050610ef6565b505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806111165750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156111155750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b806111a75750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61123e611532565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a390612b74565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561139f5760016007600061130c611532565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611433565b600660006113ab611532565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b61143b611532565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b6114a86114a2611532565b85610ffe565b6114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90612bf4565b60405180910390fd5b6114f384848484611d9f565b50505050565b61151b611504611532565b838360405180602001604052806000815250611d9f565b5050565b600080823b905060008111915050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a190612a74565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161190612c94565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516116f89190612cb4565b60405180910390a3505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956040518363ffffffff1660e01b81526004016117769291906129ec565b60206040518083038186803b15801561178e57600080fd5b505afa1580156117a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c69190612280565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611872578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b815260040161183f9695949392919061297d565b600060405180830381600087803b15801561185957600080fd5b505af115801561186d573d6000803e3d6000fd5b505050505b50505050505050565b61188786868686611ffb565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490612ab4565b60405180910390fd5b83816119199190612e4c565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119a99190612df6565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051611a2893929190612ccf565b60405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a8d9190612cb4565b60405180910390a350505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b8152600401611b0f9291906129ec565b60206040518083038186803b158015611b2757600080fd5b505afa158015611b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5f9190612280565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c0e578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401611bd79695949392919061297d565b600060405180830381600087803b158015611bf157600080fd5b505af1158015611c05573d6000803e3d6000fd5b50505050611c75565b8115611c7457611c338673ffffffffffffffffffffffffffffffffffffffff1661151f565b15611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90612bb4565b60405180910390fd5b5b5b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690612a94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5690612c74565b60405180910390fd5b6000611d69611532565b9050611d79818888888888611705565b611d8781888888888861187b565b611d9681888888888888611a9e565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0690612b34565b60405180910390fd5b6000611e19611532565b9050611e2a81866000878787611705565b611e378186600087611ffb565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015611ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb490612c54565b60405180910390fd5b8481611ec99190612e4c565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508460016000828254611f1d9190612e4c565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098878787604051611f8593929190612ccf565b60405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051611feb9190612cb4565b60405180910390a3505050505050565b600960149054906101000a900460ff166120d357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806120935750600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c990612b94565b60405180910390fd5b5b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215790612b14565b60405180910390fd5b50505050565b600061217961217484612d54565b612d2f565b90508281526020810184848401111561219157600080fd5b61219c848285612edf565b509392505050565b6000813590506121b381613561565b92915050565b6000815190506121c881613561565b92915050565b60008083601f8401126121e057600080fd5b8235905067ffffffffffffffff8111156121f957600080fd5b60208301915083602082028301111561221157600080fd5b9250929050565b600082601f83011261222957600080fd5b8135612239848260208601612166565b91505092915050565b60008135905061225181613578565b92915050565b60006020828403121561226957600080fd5b6000612277848285016121a4565b91505092915050565b60006020828403121561229257600080fd5b60006122a0848285016121b9565b91505092915050565b600080604083850312156122bc57600080fd5b60006122ca858286016121a4565b92505060206122db858286016121a4565b9150509250929050565b6000806000606084860312156122fa57600080fd5b6000612308868287016121a4565b9350506020612319868287016121a4565b925050604061232a86828701612242565b9150509250925092565b600080600080600060a0868803121561234c57600080fd5b600061235a888289016121a4565b955050602061236b888289016121a4565b945050604061237c88828901612242565b935050606086013567ffffffffffffffff81111561239957600080fd5b6123a588828901612218565b925050608086013567ffffffffffffffff8111156123c257600080fd5b6123ce88828901612218565b9150509295509295909350565b600080604083850312156123ee57600080fd5b60006123fc858286016121a4565b925050602061240d85828601612242565b9150509250929050565b60008060006060848603121561242c57600080fd5b600061243a868287016121a4565b935050602061244b86828701612242565b925050604084013567ffffffffffffffff81111561246857600080fd5b61247486828701612218565b9150509250925092565b6000806000806080858703121561249457600080fd5b60006124a2878288016121a4565b94505060206124b387828801612242565b935050604085013567ffffffffffffffff8111156124d057600080fd5b6124dc87828801612218565b925050606085013567ffffffffffffffff8111156124f957600080fd5b61250587828801612218565b91505092959194509250565b6000806020838503121561252457600080fd5b600083013567ffffffffffffffff81111561253e57600080fd5b61254a858286016121ce565b92509250509250929050565b6000806040838503121561256957600080fd5b600061257785828601612242565b925050602083013567ffffffffffffffff81111561259457600080fd5b6125a085828601612218565b9150509250929050565b60006125b683836125c2565b60208301905092915050565b6125cb81612e80565b82525050565b6125da81612e80565b82525050565b60006125eb82612d95565b6125f58185612dc3565b935061260083612d85565b8060005b8381101561263157815161261888826125aa565b975061262383612db6565b925050600181019050612604565b5085935050505092915050565b61264781612e92565b82525050565b61265681612e9e565b82525050565b600061266782612da0565b6126718185612dd4565b9350612681818560208601612eee565b61268a8161305a565b840191505092915050565b60006126a082612dab565b6126aa8185612de5565b93506126ba818560208601612eee565b6126c38161305a565b840191505092915050565b60006126db602583612de5565b91506126e68261306b565b604082019050919050565b60006126fe602283612de5565b9150612709826130ba565b604082019050919050565b6000612721602783612de5565b915061272c82613109565b604082019050919050565b6000612744600c83612de5565b915061274f82613158565b602082019050919050565b6000612767601183612de5565b915061277282613181565b602082019050919050565b600061278a601383612de5565b9150612795826131aa565b602082019050919050565b60006127ad602283612de5565b91506127b8826131d3565b604082019050919050565b60006127d0602483612de5565b91506127db82613222565b604082019050919050565b60006127f3602183612de5565b91506127fe82613271565b604082019050919050565b6000612816600f83612de5565b9150612821826132c0565b602082019050919050565b6000612839604d83612de5565b9150612844826132e9565b606082019050919050565b600061285c602483612de5565b91506128678261335e565b604082019050919050565b600061287f602c83612de5565b915061288a826133ad565b604082019050919050565b60006128a2602983612de5565b91506128ad826133fc565b604082019050919050565b60006128c5602683612de5565b91506128d08261344b565b604082019050919050565b60006128e8602383612de5565b91506128f38261349a565b604082019050919050565b600061290b602083612de5565b9150612916826134e9565b602082019050919050565b600061292e602383612de5565b915061293982613512565b604082019050919050565b61294d81612ec8565b82525050565b61295c81612ed2565b82525050565b600060208201905061297760008301846125d1565b92915050565b600060c08201905061299260008301896125d1565b61299f60208301886125d1565b6129ac60408301876125d1565b6129b96060830186612944565b81810360808301526129cb818561265c565b905081810360a08301526129df818461265c565b9050979650505050505050565b6000604082019050612a0160008301856125d1565b612a0e602083018461264d565b9392505050565b60006020820190508181036000830152612a2f81846125e0565b905092915050565b6000602082019050612a4c600083018461263e565b92915050565b60006020820190508181036000830152612a6c8184612695565b905092915050565b60006020820190508181036000830152612a8d816126ce565b9050919050565b60006020820190508181036000830152612aad816126f1565b9050919050565b60006020820190508181036000830152612acd81612714565b9050919050565b60006020820190508181036000830152612aed81612737565b9050919050565b60006020820190508181036000830152612b0d8161275a565b9050919050565b60006020820190508181036000830152612b2d8161277d565b9050919050565b60006020820190508181036000830152612b4d816127a0565b9050919050565b60006020820190508181036000830152612b6d816127c3565b9050919050565b60006020820190508181036000830152612b8d816127e6565b9050919050565b60006020820190508181036000830152612bad81612809565b9050919050565b60006020820190508181036000830152612bcd8161282c565b9050919050565b60006020820190508181036000830152612bed8161284f565b9050919050565b60006020820190508181036000830152612c0d81612872565b9050919050565b60006020820190508181036000830152612c2d81612895565b9050919050565b60006020820190508181036000830152612c4d816128b8565b9050919050565b60006020820190508181036000830152612c6d816128db565b9050919050565b60006020820190508181036000830152612c8d816128fe565b9050919050565b60006020820190508181036000830152612cad81612921565b9050919050565b6000602082019050612cc96000830184612944565b92915050565b6000606082019050612ce46000830186612944565b8181036020830152612cf6818561265c565b90508181036040830152612d0a818461265c565b9050949350505050565b6000602082019050612d296000830184612953565b92915050565b6000612d39612d4a565b9050612d458282612f53565b919050565b6000604051905090565b600067ffffffffffffffff821115612d6f57612d6e61302b565b5b612d788261305a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612e0182612ec8565b9150612e0c83612ec8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e4157612e40612fcd565b5b828201905092915050565b6000612e5782612ec8565b9150612e6283612ec8565b925082821015612e7557612e74612fcd565b5b828203905092915050565b6000612e8b82612ea8565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612f0c578082015181840152602081019050612ef1565b83811115612f1b576000848401525b50505050565b60006002820490506001821680612f3957607f821691505b60208210811415612f4d57612f4c612ffc565b5b50919050565b612f5c8261305a565b810181811067ffffffffffffffff82111715612f7b57612f7a61302b565b5b80604052505050565b6000612f8f82612ec8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fc257612fc1612fcd565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433737373a20617070726f76652066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a2073656e642066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b7f554e415554484f52495a45440000000000000000000000000000000000000000600082015250565b7f414c52454144595f414354495641544544000000000000000000000000000000600082015250565b7f464f5242494444454e5f524543495049454e5400000000000000000000000000600082015250565b7f4552433737373a206275726e2066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a20617574686f72697a696e672073656c66206173206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a207265766f6b696e672073656c66206173206f70657261746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e4f545f4449535452494255544f520000000000000000000000000000000000600082015250565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b7f4552433737373a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60008201527f7220666f7220686f6c6465720000000000000000000000000000000000000000602082015250565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b7f4552433737373a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a206275726e20616d6f756e7420657863656564732062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a2073656e6420746f20746865207a65726f2061646472657373600082015250565b7f4552433737373a20617070726f766520746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b61356a81612e80565b811461357557600080fd5b50565b61358181612ec8565b811461358c57600080fd5b5056fea2646970667358221220da325c377b5369ab78faba574ff7b9ef251fc8329c2e0c8169c1027d3091c43064736f6c6343000803003300000000000000000000000000000000000000000000000000000000000001200000000000000000000000004ae4823521b25089edb36c40d96b962044cfc8df00000000000000000000000047ecca5d5cfeb20b0360ab99d501705eb79ce2c000000000000000000000000012a138e48201d35a01aa68553c04b4dbcf992360000000000000000000000000fd867afd0327f538ae611d1c8e48e1a16d3760f60000000000000000000000003dbb613be8691a8220adda2a6e79c0a3b596a4e4000000000000000000000000f04dbbecac4fa58b8aad0500796e7329393d57df0000000000000000000000008afc80b3aa909f630f747c8bdf9a4ba7eb12c357000000000000000000000000bd52887f62a84ea3c5b70aca40a6cce30641b4cc0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c806395d89b41116100c3578063d8d9d6bc1161007c578063d8d9d6bc146103b7578063d95b6371146103e7578063dd62ed3e14610417578063fad8b32a14610447578063fc673c4f14610463578063fe9d93031461047f57610158565b806395d89b41146102e35780639bd9bbc614610301578063a393cedc1461031d578063a9059cbb1461033b578063c1d7b73e1461036b578063cc6427841461038757610158565b8063313ce56711610115578063313ce56714610221578063481c6a751461023f578063556f0dc71461025d57806362ad1b831461027b57806370a0823114610297578063959b8c3f146102c757610158565b806306e485381461015d57806306fdde031461017b578063095ea7b31461019957806318160ddd146101c95780632185810b146101e757806323b872dd146101f1575b600080fd5b61016561049b565b6040516101729190612a15565b60405180910390f35b610183610529565b6040516101909190612a52565b60405180910390f35b6101b360048036038101906101ae91906123db565b6105bb565b6040516101c09190612a37565b60405180910390f35b6101d16105de565b6040516101de9190612cb4565b60405180910390f35b6101ef6105e8565b005b61020b600480360381019061020691906122e5565b6106e5565b6040516102189190612a37565b60405180910390f35b61022961093f565b6040516102369190612d14565b60405180910390f35b610247610948565b6040516102549190612962565b60405180910390f35b61026561096e565b6040516102729190612cb4565b60405180910390f35b61029560048036038101906102909190612334565b610977565b005b6102b160048036038101906102ac9190612257565b6109dd565b6040516102be9190612cb4565b60405180910390f35b6102e160048036038101906102dc9190612257565b610a25565b005b6102eb610c86565b6040516102f89190612a52565b60405180910390f35b61031b60048036038101906103169190612417565b610d18565b005b610325610d42565b6040516103329190612a37565b60405180910390f35b610355600480360381019061035091906123db565b610d55565b6040516103629190612a37565b60405180910390f35b61038560048036038101906103809190612511565b610e63565b005b6103a1600480360381019061039c9190612257565b610fbe565b6040516103ae9190612a37565b60405180910390f35b6103d160048036038101906103cc9190612257565b610fde565b6040516103de9190612a37565b60405180910390f35b61040160048036038101906103fc91906122a9565b610ffe565b60405161040e9190612a37565b60405180910390f35b610431600480360381019061042c91906122a9565b6111af565b60405161043e9190612cb4565b60405180910390f35b610461600480360381019061045c9190612257565b611236565b005b61047d6004803603810190610478919061247e565b611497565b005b61049960048036038101906104949190612556565b6114f9565b005b6060600480548060200260200160405190810160405280929190818152602001828054801561051f57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116104d5575b5050505050905090565b60606002805461053890612f21565b80601f016020809104026020016040519081016040528092919081815260200182805461056490612f21565b80156105b15780601f10610586576101008083540402835291602001916105b1565b820191906000526020600020905b81548152906001019060200180831161059457829003601f168201915b5050505050905090565b6000806105c6611532565b90506105d381858561153a565b600191505092915050565b6000600154905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066f90612ad4565b60405180910390fd5b600960149054906101000a900460ff16156106c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bf90612af4565b60405180910390fd5b6001600960146101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074d90612bd4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156107c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107bd90612c34565b60405180910390fd5b60006107d0611532565b90506107fe818686866040518060200160405280600081525060405180602001604052806000815250611705565b61082a81868686604051806020016040528060008152506040518060200160405280600081525061187b565b6000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156108ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e590612c14565b60405180910390fd5b610904868386846108ff9190612e4c565b61153a565b6109328287878760405180602001604052806000815250604051806020016040528060008152506000611a9e565b6001925050509392505050565b60006012905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006001905090565b610988610982611532565b86610ffe565b6109c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109be90612bf4565b60405180910390fd5b6109d685858585856001611c7f565b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8073ffffffffffffffffffffffffffffffffffffffff16610a44611532565b73ffffffffffffffffffffffffffffffffffffffff161415610a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9290612b54565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b855760076000610af9611532565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055610c22565b600160066000610b93611532565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b610c2a611532565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b606060038054610c9590612f21565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc190612f21565b8015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b5050505050905090565b610d3d610d23611532565b848484604051806020016040528060008152506001611c7f565b505050565b600960149054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90612bd4565b60405180910390fd5b6000610dd0611532565b9050610dfe818286866040518060200160405280600081525060405180602001604052806000815250611705565b610e2a81828686604051806020016040528060008152506040518060200160405280600081525061187b565b610e588182868660405180602001604052806000815250604051806020016040528060008152506000611a9e565b600191505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90612ad4565b60405180910390fd5b60005b82829050811015610fb9576001600b6000858585818110610f40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610f559190612257565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fb190612f84565b915050610ef6565b505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806111165750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156111155750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b806111a75750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61123e611532565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a390612b74565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561139f5760016007600061130c611532565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611433565b600660006113ab611532565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b61143b611532565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b6114a86114a2611532565b85610ffe565b6114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90612bf4565b60405180910390fd5b6114f384848484611d9f565b50505050565b61151b611504611532565b838360405180602001604052806000815250611d9f565b5050565b600080823b905060008111915050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a190612a74565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161190612c94565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516116f89190612cb4565b60405180910390a3505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956040518363ffffffff1660e01b81526004016117769291906129ec565b60206040518083038186803b15801561178e57600080fd5b505afa1580156117a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c69190612280565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611872578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b815260040161183f9695949392919061297d565b600060405180830381600087803b15801561185957600080fd5b505af115801561186d573d6000803e3d6000fd5b505050505b50505050505050565b61188786868686611ffb565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490612ab4565b60405180910390fd5b83816119199190612e4c565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119a99190612df6565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051611a2893929190612ccf565b60405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a8d9190612cb4565b60405180910390a350505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b8152600401611b0f9291906129ec565b60206040518083038186803b158015611b2757600080fd5b505afa158015611b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5f9190612280565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c0e578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401611bd79695949392919061297d565b600060405180830381600087803b158015611bf157600080fd5b505af1158015611c05573d6000803e3d6000fd5b50505050611c75565b8115611c7457611c338673ffffffffffffffffffffffffffffffffffffffff1661151f565b15611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90612bb4565b60405180910390fd5b5b5b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690612a94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5690612c74565b60405180910390fd5b6000611d69611532565b9050611d79818888888888611705565b611d8781888888888861187b565b611d9681888888888888611a9e565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0690612b34565b60405180910390fd5b6000611e19611532565b9050611e2a81866000878787611705565b611e378186600087611ffb565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015611ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb490612c54565b60405180910390fd5b8481611ec99190612e4c565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508460016000828254611f1d9190612e4c565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098878787604051611f8593929190612ccf565b60405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051611feb9190612cb4565b60405180910390a3505050505050565b600960149054906101000a900460ff166120d357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806120935750600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c990612b94565b60405180910390fd5b5b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215790612b14565b60405180910390fd5b50505050565b600061217961217484612d54565b612d2f565b90508281526020810184848401111561219157600080fd5b61219c848285612edf565b509392505050565b6000813590506121b381613561565b92915050565b6000815190506121c881613561565b92915050565b60008083601f8401126121e057600080fd5b8235905067ffffffffffffffff8111156121f957600080fd5b60208301915083602082028301111561221157600080fd5b9250929050565b600082601f83011261222957600080fd5b8135612239848260208601612166565b91505092915050565b60008135905061225181613578565b92915050565b60006020828403121561226957600080fd5b6000612277848285016121a4565b91505092915050565b60006020828403121561229257600080fd5b60006122a0848285016121b9565b91505092915050565b600080604083850312156122bc57600080fd5b60006122ca858286016121a4565b92505060206122db858286016121a4565b9150509250929050565b6000806000606084860312156122fa57600080fd5b6000612308868287016121a4565b9350506020612319868287016121a4565b925050604061232a86828701612242565b9150509250925092565b600080600080600060a0868803121561234c57600080fd5b600061235a888289016121a4565b955050602061236b888289016121a4565b945050604061237c88828901612242565b935050606086013567ffffffffffffffff81111561239957600080fd5b6123a588828901612218565b925050608086013567ffffffffffffffff8111156123c257600080fd5b6123ce88828901612218565b9150509295509295909350565b600080604083850312156123ee57600080fd5b60006123fc858286016121a4565b925050602061240d85828601612242565b9150509250929050565b60008060006060848603121561242c57600080fd5b600061243a868287016121a4565b935050602061244b86828701612242565b925050604084013567ffffffffffffffff81111561246857600080fd5b61247486828701612218565b9150509250925092565b6000806000806080858703121561249457600080fd5b60006124a2878288016121a4565b94505060206124b387828801612242565b935050604085013567ffffffffffffffff8111156124d057600080fd5b6124dc87828801612218565b925050606085013567ffffffffffffffff8111156124f957600080fd5b61250587828801612218565b91505092959194509250565b6000806020838503121561252457600080fd5b600083013567ffffffffffffffff81111561253e57600080fd5b61254a858286016121ce565b92509250509250929050565b6000806040838503121561256957600080fd5b600061257785828601612242565b925050602083013567ffffffffffffffff81111561259457600080fd5b6125a085828601612218565b9150509250929050565b60006125b683836125c2565b60208301905092915050565b6125cb81612e80565b82525050565b6125da81612e80565b82525050565b60006125eb82612d95565b6125f58185612dc3565b935061260083612d85565b8060005b8381101561263157815161261888826125aa565b975061262383612db6565b925050600181019050612604565b5085935050505092915050565b61264781612e92565b82525050565b61265681612e9e565b82525050565b600061266782612da0565b6126718185612dd4565b9350612681818560208601612eee565b61268a8161305a565b840191505092915050565b60006126a082612dab565b6126aa8185612de5565b93506126ba818560208601612eee565b6126c38161305a565b840191505092915050565b60006126db602583612de5565b91506126e68261306b565b604082019050919050565b60006126fe602283612de5565b9150612709826130ba565b604082019050919050565b6000612721602783612de5565b915061272c82613109565b604082019050919050565b6000612744600c83612de5565b915061274f82613158565b602082019050919050565b6000612767601183612de5565b915061277282613181565b602082019050919050565b600061278a601383612de5565b9150612795826131aa565b602082019050919050565b60006127ad602283612de5565b91506127b8826131d3565b604082019050919050565b60006127d0602483612de5565b91506127db82613222565b604082019050919050565b60006127f3602183612de5565b91506127fe82613271565b604082019050919050565b6000612816600f83612de5565b9150612821826132c0565b602082019050919050565b6000612839604d83612de5565b9150612844826132e9565b606082019050919050565b600061285c602483612de5565b91506128678261335e565b604082019050919050565b600061287f602c83612de5565b915061288a826133ad565b604082019050919050565b60006128a2602983612de5565b91506128ad826133fc565b604082019050919050565b60006128c5602683612de5565b91506128d08261344b565b604082019050919050565b60006128e8602383612de5565b91506128f38261349a565b604082019050919050565b600061290b602083612de5565b9150612916826134e9565b602082019050919050565b600061292e602383612de5565b915061293982613512565b604082019050919050565b61294d81612ec8565b82525050565b61295c81612ed2565b82525050565b600060208201905061297760008301846125d1565b92915050565b600060c08201905061299260008301896125d1565b61299f60208301886125d1565b6129ac60408301876125d1565b6129b96060830186612944565b81810360808301526129cb818561265c565b905081810360a08301526129df818461265c565b9050979650505050505050565b6000604082019050612a0160008301856125d1565b612a0e602083018461264d565b9392505050565b60006020820190508181036000830152612a2f81846125e0565b905092915050565b6000602082019050612a4c600083018461263e565b92915050565b60006020820190508181036000830152612a6c8184612695565b905092915050565b60006020820190508181036000830152612a8d816126ce565b9050919050565b60006020820190508181036000830152612aad816126f1565b9050919050565b60006020820190508181036000830152612acd81612714565b9050919050565b60006020820190508181036000830152612aed81612737565b9050919050565b60006020820190508181036000830152612b0d8161275a565b9050919050565b60006020820190508181036000830152612b2d8161277d565b9050919050565b60006020820190508181036000830152612b4d816127a0565b9050919050565b60006020820190508181036000830152612b6d816127c3565b9050919050565b60006020820190508181036000830152612b8d816127e6565b9050919050565b60006020820190508181036000830152612bad81612809565b9050919050565b60006020820190508181036000830152612bcd8161282c565b9050919050565b60006020820190508181036000830152612bed8161284f565b9050919050565b60006020820190508181036000830152612c0d81612872565b9050919050565b60006020820190508181036000830152612c2d81612895565b9050919050565b60006020820190508181036000830152612c4d816128b8565b9050919050565b60006020820190508181036000830152612c6d816128db565b9050919050565b60006020820190508181036000830152612c8d816128fe565b9050919050565b60006020820190508181036000830152612cad81612921565b9050919050565b6000602082019050612cc96000830184612944565b92915050565b6000606082019050612ce46000830186612944565b8181036020830152612cf6818561265c565b90508181036040830152612d0a818461265c565b9050949350505050565b6000602082019050612d296000830184612953565b92915050565b6000612d39612d4a565b9050612d458282612f53565b919050565b6000604051905090565b600067ffffffffffffffff821115612d6f57612d6e61302b565b5b612d788261305a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612e0182612ec8565b9150612e0c83612ec8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e4157612e40612fcd565b5b828201905092915050565b6000612e5782612ec8565b9150612e6283612ec8565b925082821015612e7557612e74612fcd565b5b828203905092915050565b6000612e8b82612ea8565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612f0c578082015181840152602081019050612ef1565b83811115612f1b576000848401525b50505050565b60006002820490506001821680612f3957607f821691505b60208210811415612f4d57612f4c612ffc565b5b50919050565b612f5c8261305a565b810181811067ffffffffffffffff82111715612f7b57612f7a61302b565b5b80604052505050565b6000612f8f82612ec8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fc257612fc1612fcd565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433737373a20617070726f76652066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a2073656e642066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b7f554e415554484f52495a45440000000000000000000000000000000000000000600082015250565b7f414c52454144595f414354495641544544000000000000000000000000000000600082015250565b7f464f5242494444454e5f524543495049454e5400000000000000000000000000600082015250565b7f4552433737373a206275726e2066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a20617574686f72697a696e672073656c66206173206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a207265766f6b696e672073656c66206173206f70657261746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e4f545f4449535452494255544f520000000000000000000000000000000000600082015250565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b7f4552433737373a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60008201527f7220666f7220686f6c6465720000000000000000000000000000000000000000602082015250565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b7f4552433737373a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a206275726e20616d6f756e7420657863656564732062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433737373a2073656e6420746f20746865207a65726f2061646472657373600082015250565b7f4552433737373a20617070726f766520746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b61356a81612e80565b811461357557600080fd5b50565b61358181612ec8565b811461358c57600080fd5b5056fea2646970667358221220da325c377b5369ab78faba574ff7b9ef251fc8329c2e0c8169c1027d3091c43064736f6c63430008030033

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

00000000000000000000000000000000000000000000000000000000000001200000000000000000000000004ae4823521b25089edb36c40d96b962044cfc8df00000000000000000000000047ecca5d5cfeb20b0360ab99d501705eb79ce2c000000000000000000000000012a138e48201d35a01aa68553c04b4dbcf992360000000000000000000000000fd867afd0327f538ae611d1c8e48e1a16d3760f60000000000000000000000003dbb613be8691a8220adda2a6e79c0a3b596a4e4000000000000000000000000f04dbbecac4fa58b8aad0500796e7329393d57df0000000000000000000000008afc80b3aa909f630f747c8bdf9a4ba7eb12c357000000000000000000000000bd52887f62a84ea3c5b70aca40a6cce30641b4cc0000000000000000000000000000000000000000000000000000000000000000

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

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000004ae4823521b25089edb36c40d96b962044cfc8df
Arg [2] : 00000000000000000000000047ecca5d5cfeb20b0360ab99d501705eb79ce2c0
Arg [3] : 00000000000000000000000012a138e48201d35a01aa68553c04b4dbcf992360
Arg [4] : 000000000000000000000000fd867afd0327f538ae611d1c8e48e1a16d3760f6
Arg [5] : 0000000000000000000000003dbb613be8691a8220adda2a6e79c0a3b596a4e4
Arg [6] : 000000000000000000000000f04dbbecac4fa58b8aad0500796e7329393d57df
Arg [7] : 0000000000000000000000008afc80b3aa909f630f747c8bdf9a4ba7eb12c357
Arg [8] : 000000000000000000000000bd52887f62a84ea3c5b70aca40a6cce30641b4cc
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

45134:2847:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32516:132;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28626:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34145:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29452:125;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46960:139;;;:::i;:::-;;34722:793;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29083:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45164:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29289:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32774:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29682:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31539:423;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28787:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29971:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45193:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30378:451;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47196:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45232:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45283:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31164:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33847:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32031:414;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33309:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30966:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32516:132;32582:16;32618:22;32611:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32516:132;:::o;28626:100::-;28680:13;28713:5;28706:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28626:100;:::o;34145:201::-;34227:4;34244:14;34261:12;:10;:12::i;:::-;34244:29;;34284:32;34293:6;34301:7;34310:5;34284:8;:32::i;:::-;34334:4;34327:11;;;34145:201;;;;:::o;29452:125::-;29530:7;29557:12;;29550:19;;29452:125;:::o;46960:139::-;46806:7;;;;;;;;;;;46792:21;;:10;:21;;;46784:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;47027:12:::1;;;;;;;;;;;47026:13;47018:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;47087:4;47072:12;;:19;;;;;;;;;;;;;;;;;;46960:139::o:0;34722:793::-;34828:4;34874:1;34853:23;;:9;:23;;;;34845:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;34954:1;34936:20;;:6;:20;;;;34928:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;35012:15;35030:12;:10;:12::i;:::-;35012:30;;35055:61;35073:7;35082:6;35090:9;35101:6;35055:61;;;;;;;;;;;;;;;;;;;;;;;;:17;:61::i;:::-;35129:49;35135:7;35144:6;35152:9;35163:6;35129:49;;;;;;;;;;;;;;;;;;;;;;;;:5;:49::i;:::-;35191:24;35218:11;:19;35230:6;35218:19;;;;;;;;;;;;;;;:28;35238:7;35218:28;;;;;;;;;;;;;;;;35191:55;;35285:6;35265:16;:26;;35257:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;35348:52;35357:6;35365:7;35393:6;35374:16;:25;;;;:::i;:::-;35348:8;:52::i;:::-;35413:70;35433:7;35442:6;35450:9;35461:6;35413:70;;;;;;;;;;;;;;;;;;;;;;;;35477:5;35413:19;:70::i;:::-;35503:4;35496:11;;;;34722:793;;;;;:::o;29083:84::-;29132:5;29157:2;29150:9;;29083:84;:::o;45164:22::-;;;;;;;;;;;;;:::o;29289:97::-;29350:7;29377:1;29370:8;;29289:97;:::o;32774:407::-;33020:35;33034:12;:10;:12::i;:::-;33048:6;33020:13;:35::i;:::-;33012:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;33115:58;33121:6;33129:9;33140:6;33148:4;33154:12;33168:4;33115:5;:58::i;:::-;32774:407;;;;;:::o;29682:152::-;29777:7;29804:9;:22;29814:11;29804:22;;;;;;;;;;;;;;;;29797:29;;29682:152;;;:::o;31539:423::-;31644:8;31628:24;;:12;:10;:12::i;:::-;:24;;;;31620:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31710:17;:27;31728:8;31710:27;;;;;;;;;;;;;;;;;;;;;;;;;31706:189;;;31761:24;:38;31786:12;:10;:12::i;:::-;31761:38;;;;;;;;;;;;;;;:48;31800:8;31761:48;;;;;;;;;;;;;;;;31754:55;;;;;;;;;;;31706:189;;;31879:4;31842:10;:24;31853:12;:10;:12::i;:::-;31842:24;;;;;;;;;;;;;;;:34;31867:8;31842:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;31706:189;31941:12;:10;:12::i;:::-;31912:42;;31931:8;31912:42;;;;;;;;;;;;31539:423;:::o;28787:104::-;28843:13;28876:7;28869:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28787:104;:::o;29971:166::-;30075:54;30081:12;:10;:12::i;:::-;30095:9;30106:6;30114:4;30075:54;;;;;;;;;;;;30124:4;30075:5;:54::i;:::-;29971:166;;;:::o;45193:32::-;;;;;;;;;;;;;:::o;30378:451::-;30464:4;30510:1;30489:23;;:9;:23;;;;30481:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;30566:12;30581;:10;:12::i;:::-;30566:27;;30606:56;30624:4;30630;30636:9;30647:6;30606:56;;;;;;;;;;;;;;;;;;;;;;;;:17;:56::i;:::-;30675:44;30681:4;30687;30693:9;30704:6;30675:44;;;;;;;;;;;;;;;;;;;;;;;;:5;:44::i;:::-;30732:65;30752:4;30758;30764:9;30775:6;30732:65;;;;;;;;;;;;;;;;;;;;;;;;30791:5;30732:19;:65::i;:::-;30817:4;30810:11;;;30378:451;;;;:::o;47196:200::-;46806:7;;;;;;;;;;;46792:21;;:10;:21;;;46784:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;47290:6:::1;47286:103;47306:10;;:17;;47302:1;:21;47286:103;;;47373:4;47345:10;:25;47356:10;;47367:1;47356:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47345:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;47325:3;;;;;:::i;:::-;;;;47286:103;;;;47196:200:::0;;:::o;45232:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;45283:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;31164:303::-;31264:4;31300:11;31288:23;;:8;:23;;;:121;;;;31329:17;:27;31347:8;31329:27;;;;;;;;;;;;;;;;;;;;;;;;;:79;;;;;31361:24;:37;31386:11;31361:37;;;;;;;;;;;;;;;:47;31399:8;31361:47;;;;;;;;;;;;;;;;;;;;;;;;;31360:48;31329:79;31288:121;:171;;;;31426:10;:23;31437:11;31426:23;;;;;;;;;;;;;;;:33;31450:8;31426:33;;;;;;;;;;;;;;;;;;;;;;;;;31288:171;31281:178;;31164:303;;;;:::o;33847:153::-;33937:7;33964:11;:19;33976:6;33964:19;;;;;;;;;;;;;;;:28;33984:7;33964:28;;;;;;;;;;;;;;;;33957:35;;33847:153;;;;:::o;32031:414::-;32129:12;:10;:12::i;:::-;32117:24;;:8;:24;;;;32109:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;32196:17;:27;32214:8;32196:27;;;;;;;;;;;;;;;;;;;;;;;;;32192:189;;;32291:4;32240:24;:38;32265:12;:10;:12::i;:::-;32240:38;;;;;;;;;;;;;;;:48;32279:8;32240:48;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;32192:189;;;32335:10;:24;32346:12;:10;:12::i;:::-;32335:24;;;;;;;;;;;;;;;:34;32360:8;32335:34;;;;;;;;;;;;;;;;32328:41;;;;;;;;;;;32192:189;32424:12;:10;:12::i;:::-;32398:39;;32414:8;32398:39;;;;;;;;;;;;32031:414;:::o;33309:290::-;33453:36;33467:12;:10;:12::i;:::-;33481:7;33453:13;:36::i;:::-;33445:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;33549:42;33555:7;33564:6;33572:4;33578:12;33549:5;:42::i;:::-;33309:290;;;;:::o;30966:130::-;31051:37;31057:12;:10;:12::i;:::-;31071:6;31079:4;31051:37;;;;;;;;;;;;:5;:37::i;:::-;30966:130;;:::o;12641:422::-;12701:4;12909:12;13020:7;13008:20;13000:28;;13054:1;13047:4;:8;13040:15;;;12641:422;;;:::o;20547:98::-;20600:7;20627:10;20620:17;;20547:98;:::o;40843:341::-;40955:1;40937:20;;:6;:20;;;;40929:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;41037:1;41018:21;;:7;:21;;;;41010:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;41123:5;41092:11;:19;41104:6;41092:19;;;;;;;;;;;;;;;:28;41112:7;41092:28;;;;;;;;;;;;;;;:36;;;;41161:7;41144:32;;41153:6;41144:32;;;41170:5;41144:32;;;;;;:::i;:::-;;;;;;;;40843:341;;;:::o;41668:498::-;41899:19;26835:42;41921:41;;;41963:4;27093:31;41921:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41899:100;;42037:1;42014:25;;:11;:25;;;42010:149;;42070:11;42056:39;;;42096:8;42106:4;42112:2;42116:6;42124:8;42134:12;42056:91;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42010:149;41668:498;;;;;;;:::o;40090:608::-;40309:48;40330:8;40340:4;40346:2;40350:6;40309:20;:48::i;:::-;40370:19;40392:9;:15;40402:4;40392:15;;;;;;;;;;;;;;;;40370:37;;40441:6;40426:11;:21;;40418:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40534:6;40520:11;:20;;;;:::i;:::-;40502:9;:15;40512:4;40502:15;;;;;;;;;;;;;;;:38;;;;40568:6;40551:9;:13;40561:2;40551:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;40613:2;40592:56;;40607:4;40592:56;;40597:8;40592:56;;;40617:6;40625:8;40635:12;40592:56;;;;;;;;:::i;:::-;;;;;;;;40679:2;40664:26;;40673:4;40664:26;;;40683:6;40664:26;;;;;;:::i;:::-;;;;;;;;40090:608;;;;;;;:::o;42868:705::-;43136:19;26835:42;43158:41;;;43200:2;27191:34;43158:79;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43136:101;;43275:1;43252:25;;:11;:25;;;43248:318;;43311:11;43294:44;;;43339:8;43349:4;43355:2;43359:6;43367:8;43377:12;43294:96;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43248:318;;;43412:19;43408:158;;;43457:15;:2;:13;;;:15::i;:::-;43456:16;43448:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;43408:158;43248:318;42868:705;;;;;;;;:::o;38255:691::-;38524:1;38508:18;;:4;:18;;;;38500:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38598:1;38584:16;;:2;:16;;;;38576:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38650:16;38669:12;:10;:12::i;:::-;38650:31;;38694:69;38712:8;38722:4;38728:2;38732:6;38740:8;38750:12;38694:17;:69::i;:::-;38776:57;38782:8;38792:4;38798:2;38802:6;38810:8;38820:12;38776:5;:57::i;:::-;38846:92;38866:8;38876:4;38882:2;38886:6;38894:8;38904:12;38918:19;38846;:92::i;:::-;38255:691;;;;;;;:::o;39260:822::-;39469:1;39453:18;;:4;:18;;;;39445:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39523:16;39542:12;:10;:12::i;:::-;39523:31;;39567:73;39585:8;39595:4;39609:1;39613:6;39621:4;39627:12;39567:17;:73::i;:::-;39653:56;39674:8;39684:4;39698:1;39702:6;39653:20;:56::i;:::-;39757:19;39779:9;:15;39789:4;39779:15;;;;;;;;;;;;;;;;39757:37;;39828:6;39813:11;:21;;39805:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;39917:6;39903:11;:20;;;;:::i;:::-;39885:9;:15;39895:4;39885:15;;;;;;;;;;;;;;;:38;;;;39950:6;39934:12;;:22;;;;;;;:::i;:::-;;;;;;;;39991:4;39974:50;;39981:8;39974:50;;;39997:6;40005:4;40011:12;39974:50;;;;;;;;:::i;:::-;;;;;;;;40063:1;40040:34;;40049:4;40040:34;;;40067:6;40040:34;;;;;;:::i;:::-;;;;;;;;39260:822;;;;;;:::o;47680:298::-;47804:12;;;;;;;;;;;47800:113;;47857:1;47841:18;;:4;:18;;;:40;;;;47863:12;:18;47876:4;47863:18;;;;;;;;;;;;;;;;;;;;;;;;;47841:40;47833:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47800:113;47932:10;:14;47943:2;47932:14;;;;;;;;;;;;;;;;;;;;;;;;;47931:15;47923:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;47680:298;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:143::-;;589:6;583:13;574:22;;605:33;632:5;605:33;:::i;:::-;564:80;;;;:::o;667:367::-;;;800:3;793:4;785:6;781:17;777:27;767:2;;818:1;815;808:12;767:2;854:6;841:20;831:30;;884:18;876:6;873:30;870:2;;;916:1;913;906:12;870:2;953:4;945:6;941:17;929:29;;1007:3;999:4;991:6;987:17;977:8;973:32;970:41;967:2;;;1024:1;1021;1014:12;967:2;757:277;;;;;:::o;1053:271::-;;1157:3;1150:4;1142:6;1138:17;1134:27;1124:2;;1175:1;1172;1165:12;1124:2;1215:6;1202:20;1240:78;1314:3;1306:6;1299:4;1291:6;1287:17;1240:78;:::i;:::-;1231:87;;1114:210;;;;;:::o;1330:139::-;;1414:6;1401:20;1392:29;;1430:33;1457:5;1430:33;:::i;:::-;1382:87;;;;:::o;1475:262::-;;1583:2;1571:9;1562:7;1558:23;1554:32;1551:2;;;1599:1;1596;1589:12;1551:2;1642:1;1667:53;1712:7;1703:6;1692:9;1688:22;1667:53;:::i;:::-;1657:63;;1613:117;1541:196;;;;:::o;1743:284::-;;1862:2;1850:9;1841:7;1837:23;1833:32;1830:2;;;1878:1;1875;1868:12;1830:2;1921:1;1946:64;2002:7;1993:6;1982:9;1978:22;1946:64;:::i;:::-;1936:74;;1892:128;1820:207;;;;:::o;2033:407::-;;;2158:2;2146:9;2137:7;2133:23;2129:32;2126:2;;;2174:1;2171;2164:12;2126:2;2217:1;2242:53;2287:7;2278:6;2267:9;2263:22;2242:53;:::i;:::-;2232:63;;2188:117;2344:2;2370:53;2415:7;2406:6;2395:9;2391:22;2370:53;:::i;:::-;2360:63;;2315:118;2116:324;;;;;:::o;2446:552::-;;;;2588:2;2576:9;2567:7;2563:23;2559:32;2556:2;;;2604:1;2601;2594:12;2556:2;2647:1;2672:53;2717:7;2708:6;2697:9;2693:22;2672:53;:::i;:::-;2662:63;;2618:117;2774:2;2800:53;2845:7;2836:6;2825:9;2821:22;2800:53;:::i;:::-;2790:63;;2745:118;2902:2;2928:53;2973:7;2964:6;2953:9;2949:22;2928:53;:::i;:::-;2918:63;;2873:118;2546:452;;;;;:::o;3004:1066::-;;;;;;3198:3;3186:9;3177:7;3173:23;3169:33;3166:2;;;3215:1;3212;3205:12;3166:2;3258:1;3283:53;3328:7;3319:6;3308:9;3304:22;3283:53;:::i;:::-;3273:63;;3229:117;3385:2;3411:53;3456:7;3447:6;3436:9;3432:22;3411:53;:::i;:::-;3401:63;;3356:118;3513:2;3539:53;3584:7;3575:6;3564:9;3560:22;3539:53;:::i;:::-;3529:63;;3484:118;3669:2;3658:9;3654:18;3641:32;3700:18;3692:6;3689:30;3686:2;;;3732:1;3729;3722:12;3686:2;3760:62;3814:7;3805:6;3794:9;3790:22;3760:62;:::i;:::-;3750:72;;3612:220;3899:3;3888:9;3884:19;3871:33;3931:18;3923:6;3920:30;3917:2;;;3963:1;3960;3953:12;3917:2;3991:62;4045:7;4036:6;4025:9;4021:22;3991:62;:::i;:::-;3981:72;;3842:221;3156:914;;;;;;;;:::o;4076:407::-;;;4201:2;4189:9;4180:7;4176:23;4172:32;4169:2;;;4217:1;4214;4207:12;4169:2;4260:1;4285:53;4330:7;4321:6;4310:9;4306:22;4285:53;:::i;:::-;4275:63;;4231:117;4387:2;4413:53;4458:7;4449:6;4438:9;4434:22;4413:53;:::i;:::-;4403:63;;4358:118;4159:324;;;;;:::o;4489:663::-;;;;4640:2;4628:9;4619:7;4615:23;4611:32;4608:2;;;4656:1;4653;4646:12;4608:2;4699:1;4724:53;4769:7;4760:6;4749:9;4745:22;4724:53;:::i;:::-;4714:63;;4670:117;4826:2;4852:53;4897:7;4888:6;4877:9;4873:22;4852:53;:::i;:::-;4842:63;;4797:118;4982:2;4971:9;4967:18;4954:32;5013:18;5005:6;5002:30;4999:2;;;5045:1;5042;5035:12;4999:2;5073:62;5127:7;5118:6;5107:9;5103:22;5073:62;:::i;:::-;5063:72;;4925:220;4598:554;;;;;:::o;5158:920::-;;;;;5335:3;5323:9;5314:7;5310:23;5306:33;5303:2;;;5352:1;5349;5342:12;5303:2;5395:1;5420:53;5465:7;5456:6;5445:9;5441:22;5420:53;:::i;:::-;5410:63;;5366:117;5522:2;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5493:118;5678:2;5667:9;5663:18;5650:32;5709:18;5701:6;5698:30;5695:2;;;5741:1;5738;5731:12;5695:2;5769:62;5823:7;5814:6;5803:9;5799:22;5769:62;:::i;:::-;5759:72;;5621:220;5908:2;5897:9;5893:18;5880:32;5939:18;5931:6;5928:30;5925:2;;;5971:1;5968;5961:12;5925:2;5999:62;6053:7;6044:6;6033:9;6029:22;5999:62;:::i;:::-;5989:72;;5851:220;5293:785;;;;;;;:::o;6084:425::-;;;6227:2;6215:9;6206:7;6202:23;6198:32;6195:2;;;6243:1;6240;6233:12;6195:2;6314:1;6303:9;6299:17;6286:31;6344:18;6336:6;6333:30;6330:2;;;6376:1;6373;6366:12;6330:2;6412:80;6484:7;6475:6;6464:9;6460:22;6412:80;:::i;:::-;6394:98;;;;6257:245;6185:324;;;;;:::o;6515:518::-;;;6649:2;6637:9;6628:7;6624:23;6620:32;6617:2;;;6665:1;6662;6655:12;6617:2;6708:1;6733:53;6778:7;6769:6;6758:9;6754:22;6733:53;:::i;:::-;6723:63;;6679:117;6863:2;6852:9;6848:18;6835:32;6894:18;6886:6;6883:30;6880:2;;;6926:1;6923;6916:12;6880:2;6954:62;7008:7;6999:6;6988:9;6984:22;6954:62;:::i;:::-;6944:72;;6806:220;6607:426;;;;;:::o;7039:179::-;;7129:46;7171:3;7163:6;7129:46;:::i;:::-;7207:4;7202:3;7198:14;7184:28;;7119:99;;;;:::o;7224:108::-;7301:24;7319:5;7301:24;:::i;:::-;7296:3;7289:37;7279:53;;:::o;7338:118::-;7425:24;7443:5;7425:24;:::i;:::-;7420:3;7413:37;7403:53;;:::o;7492:732::-;;7640:54;7688:5;7640:54;:::i;:::-;7710:86;7789:6;7784:3;7710:86;:::i;:::-;7703:93;;7820:56;7870:5;7820:56;:::i;:::-;7899:7;7930:1;7915:284;7940:6;7937:1;7934:13;7915:284;;;8016:6;8010:13;8043:63;8102:3;8087:13;8043:63;:::i;:::-;8036:70;;8129:60;8182:6;8129:60;:::i;:::-;8119:70;;7975:224;7962:1;7959;7955:9;7950:14;;7915:284;;;7919:14;8215:3;8208:10;;7616:608;;;;;;;:::o;8230:109::-;8311:21;8326:5;8311:21;:::i;:::-;8306:3;8299:34;8289:50;;:::o;8345:118::-;8432:24;8450:5;8432:24;:::i;:::-;8427:3;8420:37;8410:53;;:::o;8469:360::-;;8583:38;8615:5;8583:38;:::i;:::-;8637:70;8700:6;8695:3;8637:70;:::i;:::-;8630:77;;8716:52;8761:6;8756:3;8749:4;8742:5;8738:16;8716:52;:::i;:::-;8793:29;8815:6;8793:29;:::i;:::-;8788:3;8784:39;8777:46;;8559:270;;;;;:::o;8835:364::-;;8951:39;8984:5;8951:39;:::i;:::-;9006:71;9070:6;9065:3;9006:71;:::i;:::-;8999:78;;9086:52;9131:6;9126:3;9119:4;9112:5;9108:16;9086:52;:::i;:::-;9163:29;9185:6;9163:29;:::i;:::-;9158:3;9154:39;9147:46;;8927:272;;;;;:::o;9205:366::-;;9368:67;9432:2;9427:3;9368:67;:::i;:::-;9361:74;;9444:93;9533:3;9444:93;:::i;:::-;9562:2;9557:3;9553:12;9546:19;;9351:220;;;:::o;9577:366::-;;9740:67;9804:2;9799:3;9740:67;:::i;:::-;9733:74;;9816:93;9905:3;9816:93;:::i;:::-;9934:2;9929:3;9925:12;9918:19;;9723:220;;;:::o;9949:366::-;;10112:67;10176:2;10171:3;10112:67;:::i;:::-;10105:74;;10188:93;10277:3;10188:93;:::i;:::-;10306:2;10301:3;10297:12;10290:19;;10095:220;;;:::o;10321:366::-;;10484:67;10548:2;10543:3;10484:67;:::i;:::-;10477:74;;10560:93;10649:3;10560:93;:::i;:::-;10678:2;10673:3;10669:12;10662:19;;10467:220;;;:::o;10693:366::-;;10856:67;10920:2;10915:3;10856:67;:::i;:::-;10849:74;;10932:93;11021:3;10932:93;:::i;:::-;11050:2;11045:3;11041:12;11034:19;;10839:220;;;:::o;11065:366::-;;11228:67;11292:2;11287:3;11228:67;:::i;:::-;11221:74;;11304:93;11393:3;11304:93;:::i;:::-;11422:2;11417:3;11413:12;11406:19;;11211:220;;;:::o;11437:366::-;;11600:67;11664:2;11659:3;11600:67;:::i;:::-;11593:74;;11676:93;11765:3;11676:93;:::i;:::-;11794:2;11789:3;11785:12;11778:19;;11583:220;;;:::o;11809:366::-;;11972:67;12036:2;12031:3;11972:67;:::i;:::-;11965:74;;12048:93;12137:3;12048:93;:::i;:::-;12166:2;12161:3;12157:12;12150:19;;11955:220;;;:::o;12181:366::-;;12344:67;12408:2;12403:3;12344:67;:::i;:::-;12337:74;;12420:93;12509:3;12420:93;:::i;:::-;12538:2;12533:3;12529:12;12522:19;;12327:220;;;:::o;12553:366::-;;12716:67;12780:2;12775:3;12716:67;:::i;:::-;12709:74;;12792:93;12881:3;12792:93;:::i;:::-;12910:2;12905:3;12901:12;12894:19;;12699:220;;;:::o;12925:366::-;;13088:67;13152:2;13147:3;13088:67;:::i;:::-;13081:74;;13164:93;13253:3;13164:93;:::i;:::-;13282:2;13277:3;13273:12;13266:19;;13071:220;;;:::o;13297:366::-;;13460:67;13524:2;13519:3;13460:67;:::i;:::-;13453:74;;13536:93;13625:3;13536:93;:::i;:::-;13654:2;13649:3;13645:12;13638:19;;13443:220;;;:::o;13669:366::-;;13832:67;13896:2;13891:3;13832:67;:::i;:::-;13825:74;;13908:93;13997:3;13908:93;:::i;:::-;14026:2;14021:3;14017:12;14010:19;;13815:220;;;:::o;14041:366::-;;14204:67;14268:2;14263:3;14204:67;:::i;:::-;14197:74;;14280:93;14369:3;14280:93;:::i;:::-;14398:2;14393:3;14389:12;14382:19;;14187:220;;;:::o;14413:366::-;;14576:67;14640:2;14635:3;14576:67;:::i;:::-;14569:74;;14652:93;14741:3;14652:93;:::i;:::-;14770:2;14765:3;14761:12;14754:19;;14559:220;;;:::o;14785:366::-;;14948:67;15012:2;15007:3;14948:67;:::i;:::-;14941:74;;15024:93;15113:3;15024:93;:::i;:::-;15142:2;15137:3;15133:12;15126:19;;14931:220;;;:::o;15157:366::-;;15320:67;15384:2;15379:3;15320:67;:::i;:::-;15313:74;;15396:93;15485:3;15396:93;:::i;:::-;15514:2;15509:3;15505:12;15498:19;;15303:220;;;:::o;15529:366::-;;15692:67;15756:2;15751:3;15692:67;:::i;:::-;15685:74;;15768:93;15857:3;15768:93;:::i;:::-;15886:2;15881:3;15877:12;15870:19;;15675:220;;;:::o;15901:118::-;15988:24;16006:5;15988:24;:::i;:::-;15983:3;15976:37;15966:53;;:::o;16025:112::-;16108:22;16124:5;16108:22;:::i;:::-;16103:3;16096:35;16086:51;;:::o;16143:222::-;;16274:2;16263:9;16259:18;16251:26;;16287:71;16355:1;16344:9;16340:17;16331:6;16287:71;:::i;:::-;16241:124;;;;:::o;16371:949::-;;16678:3;16667:9;16663:19;16655:27;;16692:71;16760:1;16749:9;16745:17;16736:6;16692:71;:::i;:::-;16773:72;16841:2;16830:9;16826:18;16817:6;16773:72;:::i;:::-;16855;16923:2;16912:9;16908:18;16899:6;16855:72;:::i;:::-;16937;17005:2;16994:9;16990:18;16981:6;16937:72;:::i;:::-;17057:9;17051:4;17047:20;17041:3;17030:9;17026:19;17019:49;17085:76;17156:4;17147:6;17085:76;:::i;:::-;17077:84;;17209:9;17203:4;17199:20;17193:3;17182:9;17178:19;17171:49;17237:76;17308:4;17299:6;17237:76;:::i;:::-;17229:84;;16645:675;;;;;;;;;:::o;17326:332::-;;17485:2;17474:9;17470:18;17462:26;;17498:71;17566:1;17555:9;17551:17;17542:6;17498:71;:::i;:::-;17579:72;17647:2;17636:9;17632:18;17623:6;17579:72;:::i;:::-;17452:206;;;;;:::o;17664:373::-;;17845:2;17834:9;17830:18;17822:26;;17894:9;17888:4;17884:20;17880:1;17869:9;17865:17;17858:47;17922:108;18025:4;18016:6;17922:108;:::i;:::-;17914:116;;17812:225;;;;:::o;18043:210::-;;18168:2;18157:9;18153:18;18145:26;;18181:65;18243:1;18232:9;18228:17;18219:6;18181:65;:::i;:::-;18135:118;;;;:::o;18259:313::-;;18410:2;18399:9;18395:18;18387:26;;18459:9;18453:4;18449:20;18445:1;18434:9;18430:17;18423:47;18487:78;18560:4;18551:6;18487:78;:::i;:::-;18479:86;;18377:195;;;;:::o;18578:419::-;;18782:2;18771:9;18767:18;18759:26;;18831:9;18825:4;18821:20;18817:1;18806:9;18802:17;18795:47;18859:131;18985:4;18859:131;:::i;:::-;18851:139;;18749:248;;;:::o;19003:419::-;;19207:2;19196:9;19192:18;19184:26;;19256:9;19250:4;19246:20;19242:1;19231:9;19227:17;19220:47;19284:131;19410:4;19284:131;:::i;:::-;19276:139;;19174:248;;;:::o;19428:419::-;;19632:2;19621:9;19617:18;19609:26;;19681:9;19675:4;19671:20;19667:1;19656:9;19652:17;19645:47;19709:131;19835:4;19709:131;:::i;:::-;19701:139;;19599:248;;;:::o;19853:419::-;;20057:2;20046:9;20042:18;20034:26;;20106:9;20100:4;20096:20;20092:1;20081:9;20077:17;20070:47;20134:131;20260:4;20134:131;:::i;:::-;20126:139;;20024:248;;;:::o;20278:419::-;;20482:2;20471:9;20467:18;20459:26;;20531:9;20525:4;20521:20;20517:1;20506:9;20502:17;20495:47;20559:131;20685:4;20559:131;:::i;:::-;20551:139;;20449:248;;;:::o;20703:419::-;;20907:2;20896:9;20892:18;20884:26;;20956:9;20950:4;20946:20;20942:1;20931:9;20927:17;20920:47;20984:131;21110:4;20984:131;:::i;:::-;20976:139;;20874:248;;;:::o;21128:419::-;;21332:2;21321:9;21317:18;21309:26;;21381:9;21375:4;21371:20;21367:1;21356:9;21352:17;21345:47;21409:131;21535:4;21409:131;:::i;:::-;21401:139;;21299:248;;;:::o;21553:419::-;;21757:2;21746:9;21742:18;21734:26;;21806:9;21800:4;21796:20;21792:1;21781:9;21777:17;21770:47;21834:131;21960:4;21834:131;:::i;:::-;21826:139;;21724:248;;;:::o;21978:419::-;;22182:2;22171:9;22167:18;22159:26;;22231:9;22225:4;22221:20;22217:1;22206:9;22202:17;22195:47;22259:131;22385:4;22259:131;:::i;:::-;22251:139;;22149:248;;;:::o;22403:419::-;;22607:2;22596:9;22592:18;22584:26;;22656:9;22650:4;22646:20;22642:1;22631:9;22627:17;22620:47;22684:131;22810:4;22684:131;:::i;:::-;22676:139;;22574:248;;;:::o;22828:419::-;;23032:2;23021:9;23017:18;23009:26;;23081:9;23075:4;23071:20;23067:1;23056:9;23052:17;23045:47;23109:131;23235:4;23109:131;:::i;:::-;23101:139;;22999:248;;;:::o;23253:419::-;;23457:2;23446:9;23442:18;23434:26;;23506:9;23500:4;23496:20;23492:1;23481:9;23477:17;23470:47;23534:131;23660:4;23534:131;:::i;:::-;23526:139;;23424:248;;;:::o;23678:419::-;;23882:2;23871:9;23867:18;23859:26;;23931:9;23925:4;23921:20;23917:1;23906:9;23902:17;23895:47;23959:131;24085:4;23959:131;:::i;:::-;23951:139;;23849:248;;;:::o;24103:419::-;;24307:2;24296:9;24292:18;24284:26;;24356:9;24350:4;24346:20;24342:1;24331:9;24327:17;24320:47;24384:131;24510:4;24384:131;:::i;:::-;24376:139;;24274:248;;;:::o;24528:419::-;;24732:2;24721:9;24717:18;24709:26;;24781:9;24775:4;24771:20;24767:1;24756:9;24752:17;24745:47;24809:131;24935:4;24809:131;:::i;:::-;24801:139;;24699:248;;;:::o;24953:419::-;;25157:2;25146:9;25142:18;25134:26;;25206:9;25200:4;25196:20;25192:1;25181:9;25177:17;25170:47;25234:131;25360:4;25234:131;:::i;:::-;25226:139;;25124:248;;;:::o;25378:419::-;;25582:2;25571:9;25567:18;25559:26;;25631:9;25625:4;25621:20;25617:1;25606:9;25602:17;25595:47;25659:131;25785:4;25659:131;:::i;:::-;25651:139;;25549:248;;;:::o;25803:419::-;;26007:2;25996:9;25992:18;25984:26;;26056:9;26050:4;26046:20;26042:1;26031:9;26027:17;26020:47;26084:131;26210:4;26084:131;:::i;:::-;26076:139;;25974:248;;;:::o;26228:222::-;;26359:2;26348:9;26344:18;26336:26;;26372:71;26440:1;26429:9;26425:17;26416:6;26372:71;:::i;:::-;26326:124;;;;:::o;26456:616::-;;26679:2;26668:9;26664:18;26656:26;;26692:71;26760:1;26749:9;26745:17;26736:6;26692:71;:::i;:::-;26810:9;26804:4;26800:20;26795:2;26784:9;26780:18;26773:48;26838:76;26909:4;26900:6;26838:76;:::i;:::-;26830:84;;26961:9;26955:4;26951:20;26946:2;26935:9;26931:18;26924:48;26989:76;27060:4;27051:6;26989:76;:::i;:::-;26981:84;;26646:426;;;;;;:::o;27078:214::-;;27205:2;27194:9;27190:18;27182:26;;27218:67;27282:1;27271:9;27267:17;27258:6;27218:67;:::i;:::-;27172:120;;;;:::o;27298:129::-;;27359:20;;:::i;:::-;27349:30;;27388:33;27416:4;27408:6;27388:33;:::i;:::-;27339:88;;;:::o;27433:75::-;;27499:2;27493:9;27483:19;;27473:35;:::o;27514:307::-;;27665:18;27657:6;27654:30;27651:2;;;27687:18;;:::i;:::-;27651:2;27725:29;27747:6;27725:29;:::i;:::-;27717:37;;27809:4;27803;27799:15;27791:23;;27580:241;;;:::o;27827:132::-;;27917:3;27909:11;;27947:4;27942:3;27938:14;27930:22;;27899:60;;;:::o;27965:114::-;;28066:5;28060:12;28050:22;;28039:40;;;:::o;28085:98::-;;28170:5;28164:12;28154:22;;28143:40;;;:::o;28189:99::-;;28275:5;28269:12;28259:22;;28248:40;;;:::o;28294:113::-;;28396:4;28391:3;28387:14;28379:22;;28369:38;;;:::o;28413:184::-;;28546:6;28541:3;28534:19;28586:4;28581:3;28577:14;28562:29;;28524:73;;;;:::o;28603:168::-;;28720:6;28715:3;28708:19;28760:4;28755:3;28751:14;28736:29;;28698:73;;;;:::o;28777:169::-;;28895:6;28890:3;28883:19;28935:4;28930:3;28926:14;28911:29;;28873:73;;;;:::o;28952:305::-;;29011:20;29029:1;29011:20;:::i;:::-;29006:25;;29045:20;29063:1;29045:20;:::i;:::-;29040:25;;29199:1;29131:66;29127:74;29124:1;29121:81;29118:2;;;29205:18;;:::i;:::-;29118:2;29249:1;29246;29242:9;29235:16;;28996:261;;;;:::o;29263:191::-;;29323:20;29341:1;29323:20;:::i;:::-;29318:25;;29357:20;29375:1;29357:20;:::i;:::-;29352:25;;29396:1;29393;29390:8;29387:2;;;29401:18;;:::i;:::-;29387:2;29446:1;29443;29439:9;29431:17;;29308:146;;;;:::o;29460:96::-;;29526:24;29544:5;29526:24;:::i;:::-;29515:35;;29505:51;;;:::o;29562:90::-;;29639:5;29632:13;29625:21;29614:32;;29604:48;;;:::o;29658:77::-;;29724:5;29713:16;;29703:32;;;:::o;29741:126::-;;29818:42;29811:5;29807:54;29796:65;;29786:81;;;:::o;29873:77::-;;29939:5;29928:16;;29918:32;;;:::o;29956:86::-;;30031:4;30024:5;30020:16;30009:27;;29999:43;;;:::o;30048:154::-;30132:6;30127:3;30122;30109:30;30194:1;30185:6;30180:3;30176:16;30169:27;30099:103;;;:::o;30208:307::-;30276:1;30286:113;30300:6;30297:1;30294:13;30286:113;;;30385:1;30380:3;30376:11;30370:18;30366:1;30361:3;30357:11;30350:39;30322:2;30319:1;30315:10;30310:15;;30286:113;;;30417:6;30414:1;30411:13;30408:2;;;30497:1;30488:6;30483:3;30479:16;30472:27;30408:2;30257:258;;;;:::o;30521:320::-;;30602:1;30596:4;30592:12;30582:22;;30649:1;30643:4;30639:12;30670:18;30660:2;;30726:4;30718:6;30714:17;30704:27;;30660:2;30788;30780:6;30777:14;30757:18;30754:38;30751:2;;;30807:18;;:::i;:::-;30751:2;30572:269;;;;:::o;30847:281::-;30930:27;30952:4;30930:27;:::i;:::-;30922:6;30918:40;31060:6;31048:10;31045:22;31024:18;31012:10;31009:34;31006:62;31003:2;;;31071:18;;:::i;:::-;31003:2;31111:10;31107:2;31100:22;30890:238;;;:::o;31134:233::-;;31196:24;31214:5;31196:24;:::i;:::-;31187:33;;31242:66;31235:5;31232:77;31229:2;;;31312:18;;:::i;:::-;31229:2;31359:1;31352:5;31348:13;31341:20;;31177:190;;;:::o;31373:180::-;31421:77;31418:1;31411:88;31518:4;31515:1;31508:15;31542:4;31539:1;31532:15;31559:180;31607:77;31604:1;31597:88;31704:4;31701:1;31694:15;31728:4;31725:1;31718:15;31745:180;31793:77;31790:1;31783:88;31890:4;31887:1;31880:15;31914:4;31911:1;31904:15;31931:102;;32023:2;32019:7;32014:2;32007:5;32003:14;31999:28;31989:38;;31979:54;;;:::o;32039:224::-;32179:34;32175:1;32167:6;32163:14;32156:58;32248:7;32243:2;32235:6;32231:15;32224:32;32145:118;:::o;32269:221::-;32409:34;32405:1;32397:6;32393:14;32386:58;32478:4;32473:2;32465:6;32461:15;32454:29;32375:115;:::o;32496:226::-;32636:34;32632:1;32624:6;32620:14;32613:58;32705:9;32700:2;32692:6;32688:15;32681:34;32602:120;:::o;32728:162::-;32868:14;32864:1;32856:6;32852:14;32845:38;32834:56;:::o;32896:167::-;33036:19;33032:1;33024:6;33020:14;33013:43;33002:61;:::o;33069:169::-;33209:21;33205:1;33197:6;33193:14;33186:45;33175:63;:::o;33244:221::-;33384:34;33380:1;33372:6;33368:14;33361:58;33453:4;33448:2;33440:6;33436:15;33429:29;33350:115;:::o;33471:223::-;33611:34;33607:1;33599:6;33595:14;33588:58;33680:6;33675:2;33667:6;33663:15;33656:31;33577:117;:::o;33700:220::-;33840:34;33836:1;33828:6;33824:14;33817:58;33909:3;33904:2;33896:6;33892:15;33885:28;33806:114;:::o;33926:165::-;34066:17;34062:1;34054:6;34050:14;34043:41;34032:59;:::o;34097:301::-;34237:34;34233:1;34225:6;34221:14;34214:58;34306:34;34301:2;34293:6;34289:15;34282:59;34375:15;34370:2;34362:6;34358:15;34351:40;34203:195;:::o;34404:223::-;34544:34;34540:1;34532:6;34528:14;34521:58;34613:6;34608:2;34600:6;34596:15;34589:31;34510:117;:::o;34633:231::-;34773:34;34769:1;34761:6;34757:14;34750:58;34842:14;34837:2;34829:6;34825:15;34818:39;34739:125;:::o;34870:228::-;35010:34;35006:1;34998:6;34994:14;34987:58;35079:11;35074:2;35066:6;35062:15;35055:36;34976:122;:::o;35104:225::-;35244:34;35240:1;35232:6;35228:14;35221:58;35313:8;35308:2;35300:6;35296:15;35289:33;35210:119;:::o;35335:222::-;35475:34;35471:1;35463:6;35459:14;35452:58;35544:5;35539:2;35531:6;35527:15;35520:30;35441:116;:::o;35563:182::-;35703:34;35699:1;35691:6;35687:14;35680:58;35669:76;:::o;35751:222::-;35891:34;35887:1;35879:6;35875:14;35868:58;35960:5;35955:2;35947:6;35943:15;35936:30;35857:116;:::o;35979:122::-;36052:24;36070:5;36052:24;:::i;:::-;36045:5;36042:35;36032:2;;36091:1;36088;36081:12;36032:2;36022:79;:::o;36107:122::-;36180:24;36198:5;36180:24;:::i;:::-;36173:5;36170:35;36160:2;;36219:1;36216;36209:12;36160:2;36150:79;:::o

Swarm Source

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

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