ETH Price: $3,419.80 (+1.13%)
Gas: 3 Gwei

Token

Dojo Warriors (DOJO)
 

Overview

Max Total Supply

0 DOJO

Holders

498

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
lowdreamz.eth
Balance
1 DOJO
0x90336dca8dce81647309a566a93d1a133f22a93d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
dojoWarriors

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-21
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

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/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

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

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

// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

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;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

// File: DojoWarriors.sol


pragma solidity ^0.8.11;







contract dojoWarriors is ERC721, Ownable, PaymentSplitter {
    using Counters for Counters.Counter;
    using SafeMath for uint256;

    Counters.Counter private _tokenIdCounter;
    
    //---------Variables-------------
    //  Max amount of tokens
    uint256 public maxAmntTokens;
    //  Max amount of tokens per transaction
    uint256 public maxTknPerTxs;
    //  Price per NFT
    uint256 public price;
    //  URI control
    string newURI;
    //  Sale is active
    bool public saleIsActive;
    //  URI locked
    bool public URIlocked;
    //  Mint counter per address
    mapping(address => uint) public mintCountPerAddress;
    
    constructor(address[] memory _payees, uint256[] memory _shares) ERC721("Dojo Warriors", "DOJO") PaymentSplitter(_payees, _shares) payable {
        //  Max amount of tokens
        maxAmntTokens = 8888;
        //  Max tokens per transaction
        maxTknPerTxs = 8;
        //  Price per NFT in wei
        price = 70000000000000000 wei;
        //  Deactivate sale
        saleIsActive = false;
        //  Unlock URI
        URIlocked = false;
    }
    
    //  Flip sale state
    function flipSaleState() public onlyOwner{
        saleIsActive = !saleIsActive;
    }
    
    //  Reserve NFTs, this won't cost ETH 
    function reserveNFT(uint256 reservedTokens)public onlyOwner{
        require ((reservedTokens.add(checkMintedTokens()) <= maxAmntTokens), "You are minting more NFTs than there are available, mint less tokens!");
        require (reservedTokens <= 20, "Sorry, the max amount of reserved tokens per transaction is set to 20");
        
        for (uint i=0; i<reservedTokens; i++){
            safeMint(msg.sender);
        }
    }
    
    //  Modify URI
    function changeURI(string calldata _newURI) public onlyOwner{
        require (URIlocked == false, "URI locked, you can't change it anymore");
        newURI = _newURI;
    }

    //  Lock URI
    function lockURI() public onlyOwner {
        require(URIlocked == false, "URI already locked");
        URIlocked = true;
    }
    
    //  Base URI function, this won't be callable, you will use the changeURI function instead
    function _baseURI() internal view override returns (string memory) {
        return newURI;
    }
    
    //  Base mint function, this won't be callable, you will use the mintNFT function instead
    function safeMint(address to) internal{
        _safeMint(to, _tokenIdCounter.current());
    _tokenIdCounter.increment();
    
    }
    //  Check amount of already minted NFTs
    function checkMintedTokens() public view returns(uint256) {
        return(_tokenIdCounter._value);
    }
    
    //  Function to mint tokens, this is the function that you are going to use
    //  instead of safeMint
    function mintNFT(uint256 amountTokens) public payable {
        
        //  Requires that the sale state is active
        require(saleIsActive, "Sale is not active at this moment");
        
        //  Requires that the amount of tokens user wants to mint + already minted tokens don't surpass the available tokens
        require ((amountTokens.add(checkMintedTokens()) <= maxAmntTokens), "You are minting more NFTs than there are available, mint less tokens!");
        require (amountTokens <= maxTknPerTxs, "Sorry, the max amount of tokens per transaction is set to 8");

        //  Requires the NFTs owned by the address to be less than 8, we update the mintCountPerAddress to this value
        if (balanceOf(msg.sender) < 8)  {
            mintCountPerAddress[msg.sender] = balanceOf(msg.sender);
        }
        
        //  Requires the NFT mint count of the user to be 8 NFTs or less
        require (mintCountPerAddress[msg.sender] + amountTokens <= 8, "You are not allowed to mint more than 8 NFTs, but you can buy more on secondary markets.");
        
        //  Requires the correct amount of ETH
        require (msg.value == (price.mul(amountTokens)), "Amount of Ether incorrect, try again.");
        
        //  Internal mint function
        for (uint i=0; i<amountTokens; i++){
            safeMint(msg.sender);
        }

        //  Update the mint count of the user
        mintCountPerAddress[msg.sender] += amountTokens;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_shares","type":"uint256[]"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"URIlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"changeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkMintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxAmntTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTknPerTxs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCountPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reservedTokens","type":"uint256"}],"name":"reserveNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260405162005df238038062005df28339818101604052810190620000299190620008ff565b81816040518060400160405280600d81526020017f446f6a6f2057617272696f7273000000000000000000000000000000000000008152506040518060400160405280600481526020017f444f4a4f000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000af92919062000550565b508060019080519060200190620000c892919062000550565b505050620000eb620000df6200024860201b60201c565b6200025060201b60201c565b805182511462000132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001299062000a0b565b60405180910390fd5b600082511162000179576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001709062000a7d565b60405180910390fd5b60005b8251811015620001e857620001d2838281518110620001a0576200019f62000a9f565b5b6020026020010151838381518110620001be57620001bd62000a9f565b5b60200260200101516200031660201b60201c565b8080620001df9062000afd565b9150506200017c565b5050506122b8600f81905550600860108190555066f8b0a10e4700006011819055506000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff021916908315150217905550505062000dfe565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003809062000bc1565b60405180910390fd5b60008111620003cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c69062000c33565b60405180910390fd5b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000454576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044b9062000ccb565b60405180910390fd5b600b829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007546200050b919062000ced565b6007819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200054492919062000d6c565b60405180910390a15050565b8280546200055e9062000dc8565b90600052602060002090601f016020900481019282620005825760008555620005ce565b82601f106200059d57805160ff1916838001178555620005ce565b82800160010185558215620005ce579182015b82811115620005cd578251825591602001919060010190620005b0565b5b509050620005dd9190620005e1565b5090565b5b80821115620005fc576000816000905550600101620005e2565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006648262000619565b810181811067ffffffffffffffff821117156200068657620006856200062a565b5b80604052505050565b60006200069b62000600565b9050620006a9828262000659565b919050565b600067ffffffffffffffff821115620006cc57620006cb6200062a565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070f82620006e2565b9050919050565b620007218162000702565b81146200072d57600080fd5b50565b600081519050620007418162000716565b92915050565b60006200075e6200075884620006ae565b6200068f565b90508083825260208201905060208402830185811115620007845762000783620006dd565b5b835b81811015620007b157806200079c888262000730565b84526020840193505060208101905062000786565b5050509392505050565b600082601f830112620007d357620007d262000614565b5b8151620007e584826020860162000747565b91505092915050565b600067ffffffffffffffff8211156200080c576200080b6200062a565b5b602082029050602081019050919050565b6000819050919050565b62000832816200081d565b81146200083e57600080fd5b50565b600081519050620008528162000827565b92915050565b60006200086f6200086984620007ee565b6200068f565b90508083825260208201905060208402830185811115620008955762000894620006dd565b5b835b81811015620008c25780620008ad888262000841565b84526020840193505060208101905062000897565b5050509392505050565b600082601f830112620008e457620008e362000614565b5b8151620008f684826020860162000858565b91505092915050565b600080604083850312156200091957620009186200060a565b5b600083015167ffffffffffffffff8111156200093a57620009396200060f565b5b6200094885828601620007bb565b925050602083015167ffffffffffffffff8111156200096c576200096b6200060f565b5b6200097a85828601620008cc565b9150509250929050565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b6000620009f360328362000984565b915062000a008262000995565b604082019050919050565b6000602082019050818103600083015262000a2681620009e4565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b600062000a65601a8362000984565b915062000a728262000a2d565b602082019050919050565b6000602082019050818103600083015262000a988162000a56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b0a826200081d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000b405762000b3f62000ace565b5b600182019050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b600062000ba9602c8362000984565b915062000bb68262000b4b565b604082019050919050565b6000602082019050818103600083015262000bdc8162000b9a565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b600062000c1b601d8362000984565b915062000c288262000be3565b602082019050919050565b6000602082019050818103600083015262000c4e8162000c0c565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b600062000cb3602b8362000984565b915062000cc08262000c55565b604082019050919050565b6000602082019050818103600083015262000ce68162000ca4565b9050919050565b600062000cfa826200081d565b915062000d07836200081d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000d3f5762000d3e62000ace565b5b828201905092915050565b62000d558162000702565b82525050565b62000d66816200081d565b82525050565b600060408201905062000d83600083018562000d4a565b62000d92602083018462000d5b565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000de157607f821691505b6020821081141562000df85762000df762000d99565b5b50919050565b614fe48062000e0e6000396000f3fe60806040526004361061021e5760003560e01c80638b83209b11610123578063c87b56dd116100ab578063e41c75db1161006f578063e41c75db14610835578063e5e01c1114610860578063e985e9c514610889578063eb8d2444146108c6578063f2fde38b146108f157610265565b8063c87b56dd14610728578063ce7c2ac214610765578063d79779b2146107a2578063dfe6425c146107df578063e33b7de31461080a57610265565b806395d89b41116100f257806395d89b41146106435780639852595c1461066e578063a035b1fe146106ab578063a22cb465146106d6578063b88d4fde146106ff57610265565b80638b83209b146105a85780638da5cb5b146105e55780638e021c0614610610578063926427441461062757610265565b80633a98ef39116101a65780636352211e116101755780636352211e146104af5780636dc407f9146104ec57806370a0823114610529578063715018a6146105665780637dd96a051461057d57610265565b80633a98ef39146103f5578063406072a91461042057806342842e0e1461045d57806348b750441461048657610265565b806319165587116101ed57806319165587146103385780631d6774311461036157806323b872dd1461038c57806334918dfd146103b5578063397be3fd146103cc57610265565b806301ffc9a71461026a57806306fdde03146102a7578063081812fc146102d2578063095ea7b31461030f57610265565b36610265577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061024c61091a565b3460405161025b9291906131e9565b60405180910390a1005b600080fd5b34801561027657600080fd5b50610291600480360381019061028c919061327e565b610922565b60405161029e91906132c6565b60405180910390f35b3480156102b357600080fd5b506102bc610a04565b6040516102c9919061337a565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f491906133c8565b610a96565b60405161030691906133f5565b60405180910390f35b34801561031b57600080fd5b506103366004803603810190610331919061343c565b610b1b565b005b34801561034457600080fd5b5061035f600480360381019061035a91906134ba565b610c33565b005b34801561036d57600080fd5b50610376610dde565b60405161038391906134e7565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae9190613502565b610de4565b005b3480156103c157600080fd5b506103ca610e44565b005b3480156103d857600080fd5b506103f360048036038101906103ee91906133c8565b610eec565b005b34801561040157600080fd5b5061040a611035565b60405161041791906134e7565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190613593565b61103f565b60405161045491906134e7565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190613502565b6110c6565b005b34801561049257600080fd5b506104ad60048036038101906104a89190613593565b6110e6565b005b3480156104bb57600080fd5b506104d660048036038101906104d191906133c8565b61139f565b6040516104e391906133f5565b60405180910390f35b3480156104f857600080fd5b50610513600480360381019061050e91906135d3565b611451565b60405161052091906134e7565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b91906135d3565b611469565b60405161055d91906134e7565b60405180910390f35b34801561057257600080fd5b5061057b611521565b005b34801561058957600080fd5b506105926115a9565b60405161059f91906134e7565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca91906133c8565b6115af565b6040516105dc91906133f5565b60405180910390f35b3480156105f157600080fd5b506105fa6115f7565b60405161060791906133f5565b60405180910390f35b34801561061c57600080fd5b50610625611621565b005b610641600480360381019061063c91906133c8565b611710565b005b34801561064f57600080fd5b506106586119c5565b604051610665919061337a565b60405180910390f35b34801561067a57600080fd5b50610695600480360381019061069091906135d3565b611a57565b6040516106a291906134e7565b60405180910390f35b3480156106b757600080fd5b506106c0611aa0565b6040516106cd91906134e7565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f8919061362c565b611aa6565b005b34801561070b57600080fd5b50610726600480360381019061072191906137a1565b611abc565b005b34801561073457600080fd5b5061074f600480360381019061074a91906133c8565b611b1e565b60405161075c919061337a565b60405180910390f35b34801561077157600080fd5b5061078c600480360381019061078791906135d3565b611bc5565b60405161079991906134e7565b60405180910390f35b3480156107ae57600080fd5b506107c960048036038101906107c49190613824565b611c0e565b6040516107d691906134e7565b60405180910390f35b3480156107eb57600080fd5b506107f4611c57565b60405161080191906134e7565b60405180910390f35b34801561081657600080fd5b5061081f611c64565b60405161082c91906134e7565b60405180910390f35b34801561084157600080fd5b5061084a611c6e565b60405161085791906132c6565b60405180910390f35b34801561086c57600080fd5b50610887600480360381019061088291906138b1565b611c81565b005b34801561089557600080fd5b506108b060048036038101906108ab91906138fe565b611d69565b6040516108bd91906132c6565b60405180910390f35b3480156108d257600080fd5b506108db611dfd565b6040516108e891906132c6565b60405180910390f35b3480156108fd57600080fd5b50610918600480360381019061091391906135d3565b611e10565b005b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109fd57506109fc82611f08565b5b9050919050565b606060008054610a139061396d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3f9061396d565b8015610a8c5780601f10610a6157610100808354040283529160200191610a8c565b820191906000526020600020905b815481529060010190602001808311610a6f57829003601f168201915b5050505050905090565b6000610aa182611f72565b610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790613a11565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b268261139f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e90613aa3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb661091a565b73ffffffffffffffffffffffffffffffffffffffff161480610be55750610be481610bdf61091a565b611d69565b5b610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90613b35565b60405180910390fd5b610c2e8383611fde565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90613bc7565b60405180910390fd5b6000610cbf611c64565b47610cca9190613c16565b90506000610ce18383610cdc86611a57565b612097565b90506000811415610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90613cde565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d769190613c16565b925050819055508060086000828254610d8f9190613c16565b92505081905550610da08382612105565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610dd1929190613d5d565b60405180910390a1505050565b600f5481565b610df5610def61091a565b826121f9565b610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90613df8565b60405180910390fd5b610e3f8383836122d7565b505050565b610e4c61091a565b73ffffffffffffffffffffffffffffffffffffffff16610e6a6115f7565b73ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb790613e64565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b610ef461091a565b73ffffffffffffffffffffffffffffffffffffffff16610f126115f7565b73ffffffffffffffffffffffffffffffffffffffff1614610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90613e64565b60405180910390fd5b600f54610f85610f76611c57565b8361253390919063ffffffff16565b1115610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd90613f1c565b60405180910390fd5b601481111561100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190613fd4565b60405180910390fd5b60005b818110156110315761101e33612549565b808061102990613ff4565b91505061100d565b5050565b6000600754905090565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6110e183838360405180602001604052806000815250611abc565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90613bc7565b60405180910390fd5b600061117383611c0e565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111ac91906133f5565b602060405180830381865afa1580156111c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ed9190614052565b6111f79190613c16565b9050600061120f838361120a878761103f565b612097565b90506000811415611255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124c90613cde565b60405180910390fd5b80600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112e19190613c16565b9250508190555080600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113379190613c16565b92505081905550611349848483612569565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516113919291906131e9565b60405180910390a250505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f906140f1565b60405180910390fd5b80915050919050565b60146020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190614183565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61152961091a565b73ffffffffffffffffffffffffffffffffffffffff166115476115f7565b73ffffffffffffffffffffffffffffffffffffffff161461159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159490613e64565b60405180910390fd5b6115a760006125ef565b565b60105481565b6000600b82815481106115c5576115c46141a3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61162961091a565b73ffffffffffffffffffffffffffffffffffffffff166116476115f7565b73ffffffffffffffffffffffffffffffffffffffff161461169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169490613e64565b60405180910390fd5b60001515601360019054906101000a900460ff161515146116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea9061421e565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550565b601360009054906101000a900460ff1661175f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611756906142b0565b60405180910390fd5b600f5461177c61176d611c57565b8361253390919063ffffffff16565b11156117bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b490613f1c565b60405180910390fd5b601054811115611802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f990614342565b60405180910390fd5b600861180d33611469565b10156118605761181c33611469565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600881601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118ad9190613c16565b11156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906143fa565b60405180910390fd5b611903816011546126b590919063ffffffff16565b3414611944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193b9061448c565b60405180910390fd5b60005b8181101561196b5761195833612549565b808061196390613ff4565b915050611947565b5080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119bb9190613c16565b9250508190555050565b6060600180546119d49061396d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a009061396d565b8015611a4d5780601f10611a2257610100808354040283529160200191611a4d565b820191906000526020600020905b815481529060010190602001808311611a3057829003601f168201915b5050505050905090565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60115481565b611ab8611ab161091a565b83836126cb565b5050565b611acd611ac761091a565b836121f9565b611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0390613df8565b60405180910390fd5b611b1884848484612838565b50505050565b6060611b2982611f72565b611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f9061451e565b60405180910390fd5b6000611b72612894565b90506000815111611b925760405180602001604052806000815250611bbd565b80611b9c84612926565b604051602001611bad92919061457a565b6040516020818303038152906040525b915050919050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60000154905090565b6000600854905090565b601360019054906101000a900460ff1681565b611c8961091a565b73ffffffffffffffffffffffffffffffffffffffff16611ca76115f7565b73ffffffffffffffffffffffffffffffffffffffff1614611cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf490613e64565b60405180910390fd5b60001515601360019054906101000a900460ff16151514611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90614610565b60405180910390fd5b818160129190611d649291906130ec565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601360009054906101000a900460ff1681565b611e1861091a565b73ffffffffffffffffffffffffffffffffffffffff16611e366115f7565b73ffffffffffffffffffffffffffffffffffffffff1614611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390613e64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef3906146a2565b60405180910390fd5b611f05816125ef565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120518361139f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600754600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856120e891906146c2565b6120f2919061474b565b6120fc919061477c565b90509392505050565b80471015612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f906147fc565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161216e9061484d565b60006040518083038185875af1925050503d80600081146121ab576040519150601f19603f3d011682016040523d82523d6000602084013e6121b0565b606091505b50509050806121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb906148d4565b60405180910390fd5b505050565b600061220482611f72565b612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a90614966565b60405180910390fd5b600061224e8361139f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122bd57508373ffffffffffffffffffffffffffffffffffffffff166122a584610a96565b73ffffffffffffffffffffffffffffffffffffffff16145b806122ce57506122cd8185611d69565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122f78261139f565b73ffffffffffffffffffffffffffffffffffffffff161461234d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612344906149f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b490614a8a565b60405180910390fd5b6123c8838383612a87565b6123d3600082611fde565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612423919061477c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461247a9190613c16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836125419190613c16565b905092915050565b61255c81612557600e612a8c565b612a9a565b612566600e612ab8565b50565b6125ea8363a9059cbb60e01b84846040516024016125889291906131e9565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612ace565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836126c391906146c2565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273190614af6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161282b91906132c6565b60405180910390a3505050565b6128438484846122d7565b61284f84848484612b95565b61288e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288590614b88565b60405180910390fd5b50505050565b6060601280546128a39061396d565b80601f01602080910402602001604051908101604052809291908181526020018280546128cf9061396d565b801561291c5780601f106128f15761010080835404028352916020019161291c565b820191906000526020600020905b8154815290600101906020018083116128ff57829003601f168201915b5050505050905090565b6060600082141561296e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a82565b600082905060005b600082146129a057808061298990613ff4565b915050600a82612999919061474b565b9150612976565b60008167ffffffffffffffff8111156129bc576129bb613676565b5b6040519080825280601f01601f1916602001820160405280156129ee5781602001600182028036833780820191505090505b5090505b60008514612a7b57600182612a07919061477c565b9150600a85612a169190614ba8565b6030612a229190613c16565b60f81b818381518110612a3857612a376141a3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a74919061474b565b94506129f2565b8093505050505b919050565b505050565b600081600001549050919050565b612ab4828260405180602001604052806000815250612d1d565b5050565b6001816000016000828254019250508190555050565b6000612b30826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d789092919063ffffffff16565b9050600081511115612b905780806020019051810190612b509190614bee565b612b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8690614c8d565b60405180910390fd5b5b505050565b6000612bb68473ffffffffffffffffffffffffffffffffffffffff16612d90565b15612d10578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bdf61091a565b8786866040518563ffffffff1660e01b8152600401612c019493929190614d02565b6020604051808303816000875af1925050508015612c3d57506040513d601f19601f82011682018060405250810190612c3a9190614d63565b60015b612cc0573d8060008114612c6d576040519150601f19603f3d011682016040523d82523d6000602084013e612c72565b606091505b50600081511415612cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612caf90614b88565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d15565b600190505b949350505050565b612d278383612da3565b612d346000848484612b95565b612d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6a90614b88565b60405180910390fd5b505050565b6060612d878484600085612f71565b90509392505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a90614ddc565b60405180910390fd5b612e1c81611f72565b15612e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5390614e48565b60405180910390fd5b612e6860008383612a87565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eb89190613c16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606082471015612fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fad90614eda565b60405180910390fd5b612fbf85612d90565b612ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff590614f46565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516130279190614f97565b60006040518083038185875af1925050503d8060008114613064576040519150601f19603f3d011682016040523d82523d6000602084013e613069565b606091505b5091509150613079828286613085565b92505050949350505050565b60608315613095578290506130e5565b6000835111156130a85782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dc919061337a565b60405180910390fd5b9392505050565b8280546130f89061396d565b90600052602060002090601f01602090048101928261311a5760008555613161565b82601f1061313357803560ff1916838001178555613161565b82800160010185558215613161579182015b82811115613160578235825591602001919060010190613145565b5b50905061316e9190613172565b5090565b5b8082111561318b576000816000905550600101613173565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131ba8261318f565b9050919050565b6131ca816131af565b82525050565b6000819050919050565b6131e3816131d0565b82525050565b60006040820190506131fe60008301856131c1565b61320b60208301846131da565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61325b81613226565b811461326657600080fd5b50565b60008135905061327881613252565b92915050565b6000602082840312156132945761329361321c565b5b60006132a284828501613269565b91505092915050565b60008115159050919050565b6132c0816132ab565b82525050565b60006020820190506132db60008301846132b7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561331b578082015181840152602081019050613300565b8381111561332a576000848401525b50505050565b6000601f19601f8301169050919050565b600061334c826132e1565b61335681856132ec565b93506133668185602086016132fd565b61336f81613330565b840191505092915050565b600060208201905081810360008301526133948184613341565b905092915050565b6133a5816131d0565b81146133b057600080fd5b50565b6000813590506133c28161339c565b92915050565b6000602082840312156133de576133dd61321c565b5b60006133ec848285016133b3565b91505092915050565b600060208201905061340a60008301846131c1565b92915050565b613419816131af565b811461342457600080fd5b50565b60008135905061343681613410565b92915050565b600080604083850312156134535761345261321c565b5b600061346185828601613427565b9250506020613472858286016133b3565b9150509250929050565b60006134878261318f565b9050919050565b6134978161347c565b81146134a257600080fd5b50565b6000813590506134b48161348e565b92915050565b6000602082840312156134d0576134cf61321c565b5b60006134de848285016134a5565b91505092915050565b60006020820190506134fc60008301846131da565b92915050565b60008060006060848603121561351b5761351a61321c565b5b600061352986828701613427565b935050602061353a86828701613427565b925050604061354b868287016133b3565b9150509250925092565b6000613560826131af565b9050919050565b61357081613555565b811461357b57600080fd5b50565b60008135905061358d81613567565b92915050565b600080604083850312156135aa576135a961321c565b5b60006135b88582860161357e565b92505060206135c985828601613427565b9150509250929050565b6000602082840312156135e9576135e861321c565b5b60006135f784828501613427565b91505092915050565b613609816132ab565b811461361457600080fd5b50565b60008135905061362681613600565b92915050565b600080604083850312156136435761364261321c565b5b600061365185828601613427565b925050602061366285828601613617565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136ae82613330565b810181811067ffffffffffffffff821117156136cd576136cc613676565b5b80604052505050565b60006136e0613212565b90506136ec82826136a5565b919050565b600067ffffffffffffffff82111561370c5761370b613676565b5b61371582613330565b9050602081019050919050565b82818337600083830152505050565b600061374461373f846136f1565b6136d6565b9050828152602081018484840111156137605761375f613671565b5b61376b848285613722565b509392505050565b600082601f8301126137885761378761366c565b5b8135613798848260208601613731565b91505092915050565b600080600080608085870312156137bb576137ba61321c565b5b60006137c987828801613427565b94505060206137da87828801613427565b93505060406137eb878288016133b3565b925050606085013567ffffffffffffffff81111561380c5761380b613221565b5b61381887828801613773565b91505092959194509250565b60006020828403121561383a5761383961321c565b5b60006138488482850161357e565b91505092915050565b600080fd5b600080fd5b60008083601f8401126138715761387061366c565b5b8235905067ffffffffffffffff81111561388e5761388d613851565b5b6020830191508360018202830111156138aa576138a9613856565b5b9250929050565b600080602083850312156138c8576138c761321c565b5b600083013567ffffffffffffffff8111156138e6576138e5613221565b5b6138f28582860161385b565b92509250509250929050565b600080604083850312156139155761391461321c565b5b600061392385828601613427565b925050602061393485828601613427565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061398557607f821691505b602082108114156139995761399861393e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006139fb602c836132ec565b9150613a068261399f565b604082019050919050565b60006020820190508181036000830152613a2a816139ee565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a8d6021836132ec565b9150613a9882613a31565b604082019050919050565b60006020820190508181036000830152613abc81613a80565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613b1f6038836132ec565b9150613b2a82613ac3565b604082019050919050565b60006020820190508181036000830152613b4e81613b12565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000613bb16026836132ec565b9150613bbc82613b55565b604082019050919050565b60006020820190508181036000830152613be081613ba4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613c21826131d0565b9150613c2c836131d0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6157613c60613be7565b5b828201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000613cc8602b836132ec565b9150613cd382613c6c565b604082019050919050565b60006020820190508181036000830152613cf781613cbb565b9050919050565b6000819050919050565b6000613d23613d1e613d198461318f565b613cfe565b61318f565b9050919050565b6000613d3582613d08565b9050919050565b6000613d4782613d2a565b9050919050565b613d5781613d3c565b82525050565b6000604082019050613d726000830185613d4e565b613d7f60208301846131da565b9392505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613de26031836132ec565b9150613ded82613d86565b604082019050919050565b60006020820190508181036000830152613e1181613dd5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e4e6020836132ec565b9150613e5982613e18565b602082019050919050565b60006020820190508181036000830152613e7d81613e41565b9050919050565b7f596f7520617265206d696e74696e67206d6f7265204e465473207468616e207460008201527f686572652061726520617661696c61626c652c206d696e74206c65737320746f60208201527f6b656e7321000000000000000000000000000000000000000000000000000000604082015250565b6000613f066045836132ec565b9150613f1182613e84565b606082019050919050565b60006020820190508181036000830152613f3581613ef9565b9050919050565b7f536f7272792c20746865206d617820616d6f756e74206f66207265736572766560008201527f6420746f6b656e7320706572207472616e73616374696f6e206973207365742060208201527f746f203230000000000000000000000000000000000000000000000000000000604082015250565b6000613fbe6045836132ec565b9150613fc982613f3c565b606082019050919050565b60006020820190508181036000830152613fed81613fb1565b9050919050565b6000613fff826131d0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561403257614031613be7565b5b600182019050919050565b60008151905061404c8161339c565b92915050565b6000602082840312156140685761406761321c565b5b60006140768482850161403d565b91505092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006140db6029836132ec565b91506140e68261407f565b604082019050919050565b6000602082019050818103600083015261410a816140ce565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061416d602a836132ec565b915061417882614111565b604082019050919050565b6000602082019050818103600083015261419c81614160565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f55524920616c7265616479206c6f636b65640000000000000000000000000000600082015250565b60006142086012836132ec565b9150614213826141d2565b602082019050919050565b60006020820190508181036000830152614237816141fb565b9050919050565b7f53616c65206973206e6f74206163746976652061742074686973206d6f6d656e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061429a6021836132ec565b91506142a58261423e565b604082019050919050565b600060208201905081810360008301526142c98161428d565b9050919050565b7f536f7272792c20746865206d617820616d6f756e74206f6620746f6b656e732060008201527f706572207472616e73616374696f6e2069732073657420746f20380000000000602082015250565b600061432c603b836132ec565b9150614337826142d0565b604082019050919050565b6000602082019050818103600083015261435b8161431f565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f206d696e74206d6f726560008201527f207468616e2038204e4654732c2062757420796f752063616e20627579206d6f60208201527f7265206f6e207365636f6e64617279206d61726b6574732e0000000000000000604082015250565b60006143e46058836132ec565b91506143ef82614362565b606082019050919050565b60006020820190508181036000830152614413816143d7565b9050919050565b7f416d6f756e74206f6620457468657220696e636f72726563742c20747279206160008201527f6761696e2e000000000000000000000000000000000000000000000000000000602082015250565b60006144766025836132ec565b91506144818261441a565b604082019050919050565b600060208201905081810360008301526144a581614469565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614508602f836132ec565b9150614513826144ac565b604082019050919050565b60006020820190508181036000830152614537816144fb565b9050919050565b600081905092915050565b6000614554826132e1565b61455e818561453e565b935061456e8185602086016132fd565b80840191505092915050565b60006145868285614549565b91506145928284614549565b91508190509392505050565b7f555249206c6f636b65642c20796f752063616e2774206368616e67652069742060008201527f616e796d6f726500000000000000000000000000000000000000000000000000602082015250565b60006145fa6027836132ec565b91506146058261459e565b604082019050919050565b60006020820190508181036000830152614629816145ed565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061468c6026836132ec565b915061469782614630565b604082019050919050565b600060208201905081810360008301526146bb8161467f565b9050919050565b60006146cd826131d0565b91506146d8836131d0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561471157614710613be7565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614756826131d0565b9150614761836131d0565b9250826147715761477061471c565b5b828204905092915050565b6000614787826131d0565b9150614792836131d0565b9250828210156147a5576147a4613be7565b5b828203905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006147e6601d836132ec565b91506147f1826147b0565b602082019050919050565b60006020820190508181036000830152614815816147d9565b9050919050565b600081905092915050565b50565b600061483760008361481c565b915061484282614827565b600082019050919050565b60006148588261482a565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006148be603a836132ec565b91506148c982614862565b604082019050919050565b600060208201905081810360008301526148ed816148b1565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614950602c836132ec565b915061495b826148f4565b604082019050919050565b6000602082019050818103600083015261497f81614943565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006149e26029836132ec565b91506149ed82614986565b604082019050919050565b60006020820190508181036000830152614a11816149d5565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a746024836132ec565b9150614a7f82614a18565b604082019050919050565b60006020820190508181036000830152614aa381614a67565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614ae06019836132ec565b9150614aeb82614aaa565b602082019050919050565b60006020820190508181036000830152614b0f81614ad3565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b726032836132ec565b9150614b7d82614b16565b604082019050919050565b60006020820190508181036000830152614ba181614b65565b9050919050565b6000614bb3826131d0565b9150614bbe836131d0565b925082614bce57614bcd61471c565b5b828206905092915050565b600081519050614be881613600565b92915050565b600060208284031215614c0457614c0361321c565b5b6000614c1284828501614bd9565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614c77602a836132ec565b9150614c8282614c1b565b604082019050919050565b60006020820190508181036000830152614ca681614c6a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614cd482614cad565b614cde8185614cb8565b9350614cee8185602086016132fd565b614cf781613330565b840191505092915050565b6000608082019050614d1760008301876131c1565b614d2460208301866131c1565b614d3160408301856131da565b8181036060830152614d438184614cc9565b905095945050505050565b600081519050614d5d81613252565b92915050565b600060208284031215614d7957614d7861321c565b5b6000614d8784828501614d4e565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614dc66020836132ec565b9150614dd182614d90565b602082019050919050565b60006020820190508181036000830152614df581614db9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614e32601c836132ec565b9150614e3d82614dfc565b602082019050919050565b60006020820190508181036000830152614e6181614e25565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614ec46026836132ec565b9150614ecf82614e68565b604082019050919050565b60006020820190508181036000830152614ef381614eb7565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614f30601d836132ec565b9150614f3b82614efa565b602082019050919050565b60006020820190508181036000830152614f5f81614f23565b9050919050565b6000614f7182614cad565b614f7b818561481c565b9350614f8b8185602086016132fd565b80840191505092915050565b6000614fa38284614f66565b91508190509291505056fea26469706673582212201094a7723e3dc8678084eea3f82ed272c412ce7a4b508f5fe0913384b295ff9e64736f6c634300080b0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000e8735f4cad4c73f9d4b7abae7ba0c580d45133200000000000000000000000005a7d97c88e9dbbe1748fb24d5fb7875745d7a152000000000000000000000000eee23b04ae90243f7abcb15bcb914387d73895b90000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000037f000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000004b

Deployed Bytecode

0x60806040526004361061021e5760003560e01c80638b83209b11610123578063c87b56dd116100ab578063e41c75db1161006f578063e41c75db14610835578063e5e01c1114610860578063e985e9c514610889578063eb8d2444146108c6578063f2fde38b146108f157610265565b8063c87b56dd14610728578063ce7c2ac214610765578063d79779b2146107a2578063dfe6425c146107df578063e33b7de31461080a57610265565b806395d89b41116100f257806395d89b41146106435780639852595c1461066e578063a035b1fe146106ab578063a22cb465146106d6578063b88d4fde146106ff57610265565b80638b83209b146105a85780638da5cb5b146105e55780638e021c0614610610578063926427441461062757610265565b80633a98ef39116101a65780636352211e116101755780636352211e146104af5780636dc407f9146104ec57806370a0823114610529578063715018a6146105665780637dd96a051461057d57610265565b80633a98ef39146103f5578063406072a91461042057806342842e0e1461045d57806348b750441461048657610265565b806319165587116101ed57806319165587146103385780631d6774311461036157806323b872dd1461038c57806334918dfd146103b5578063397be3fd146103cc57610265565b806301ffc9a71461026a57806306fdde03146102a7578063081812fc146102d2578063095ea7b31461030f57610265565b36610265577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061024c61091a565b3460405161025b9291906131e9565b60405180910390a1005b600080fd5b34801561027657600080fd5b50610291600480360381019061028c919061327e565b610922565b60405161029e91906132c6565b60405180910390f35b3480156102b357600080fd5b506102bc610a04565b6040516102c9919061337a565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f491906133c8565b610a96565b60405161030691906133f5565b60405180910390f35b34801561031b57600080fd5b506103366004803603810190610331919061343c565b610b1b565b005b34801561034457600080fd5b5061035f600480360381019061035a91906134ba565b610c33565b005b34801561036d57600080fd5b50610376610dde565b60405161038391906134e7565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae9190613502565b610de4565b005b3480156103c157600080fd5b506103ca610e44565b005b3480156103d857600080fd5b506103f360048036038101906103ee91906133c8565b610eec565b005b34801561040157600080fd5b5061040a611035565b60405161041791906134e7565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190613593565b61103f565b60405161045491906134e7565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190613502565b6110c6565b005b34801561049257600080fd5b506104ad60048036038101906104a89190613593565b6110e6565b005b3480156104bb57600080fd5b506104d660048036038101906104d191906133c8565b61139f565b6040516104e391906133f5565b60405180910390f35b3480156104f857600080fd5b50610513600480360381019061050e91906135d3565b611451565b60405161052091906134e7565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b91906135d3565b611469565b60405161055d91906134e7565b60405180910390f35b34801561057257600080fd5b5061057b611521565b005b34801561058957600080fd5b506105926115a9565b60405161059f91906134e7565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca91906133c8565b6115af565b6040516105dc91906133f5565b60405180910390f35b3480156105f157600080fd5b506105fa6115f7565b60405161060791906133f5565b60405180910390f35b34801561061c57600080fd5b50610625611621565b005b610641600480360381019061063c91906133c8565b611710565b005b34801561064f57600080fd5b506106586119c5565b604051610665919061337a565b60405180910390f35b34801561067a57600080fd5b50610695600480360381019061069091906135d3565b611a57565b6040516106a291906134e7565b60405180910390f35b3480156106b757600080fd5b506106c0611aa0565b6040516106cd91906134e7565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f8919061362c565b611aa6565b005b34801561070b57600080fd5b50610726600480360381019061072191906137a1565b611abc565b005b34801561073457600080fd5b5061074f600480360381019061074a91906133c8565b611b1e565b60405161075c919061337a565b60405180910390f35b34801561077157600080fd5b5061078c600480360381019061078791906135d3565b611bc5565b60405161079991906134e7565b60405180910390f35b3480156107ae57600080fd5b506107c960048036038101906107c49190613824565b611c0e565b6040516107d691906134e7565b60405180910390f35b3480156107eb57600080fd5b506107f4611c57565b60405161080191906134e7565b60405180910390f35b34801561081657600080fd5b5061081f611c64565b60405161082c91906134e7565b60405180910390f35b34801561084157600080fd5b5061084a611c6e565b60405161085791906132c6565b60405180910390f35b34801561086c57600080fd5b50610887600480360381019061088291906138b1565b611c81565b005b34801561089557600080fd5b506108b060048036038101906108ab91906138fe565b611d69565b6040516108bd91906132c6565b60405180910390f35b3480156108d257600080fd5b506108db611dfd565b6040516108e891906132c6565b60405180910390f35b3480156108fd57600080fd5b50610918600480360381019061091391906135d3565b611e10565b005b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109fd57506109fc82611f08565b5b9050919050565b606060008054610a139061396d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3f9061396d565b8015610a8c5780601f10610a6157610100808354040283529160200191610a8c565b820191906000526020600020905b815481529060010190602001808311610a6f57829003601f168201915b5050505050905090565b6000610aa182611f72565b610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790613a11565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b268261139f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e90613aa3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb661091a565b73ffffffffffffffffffffffffffffffffffffffff161480610be55750610be481610bdf61091a565b611d69565b5b610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90613b35565b60405180910390fd5b610c2e8383611fde565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90613bc7565b60405180910390fd5b6000610cbf611c64565b47610cca9190613c16565b90506000610ce18383610cdc86611a57565b612097565b90506000811415610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90613cde565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d769190613c16565b925050819055508060086000828254610d8f9190613c16565b92505081905550610da08382612105565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610dd1929190613d5d565b60405180910390a1505050565b600f5481565b610df5610def61091a565b826121f9565b610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90613df8565b60405180910390fd5b610e3f8383836122d7565b505050565b610e4c61091a565b73ffffffffffffffffffffffffffffffffffffffff16610e6a6115f7565b73ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb790613e64565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b610ef461091a565b73ffffffffffffffffffffffffffffffffffffffff16610f126115f7565b73ffffffffffffffffffffffffffffffffffffffff1614610f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5f90613e64565b60405180910390fd5b600f54610f85610f76611c57565b8361253390919063ffffffff16565b1115610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd90613f1c565b60405180910390fd5b601481111561100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190613fd4565b60405180910390fd5b60005b818110156110315761101e33612549565b808061102990613ff4565b91505061100d565b5050565b6000600754905090565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6110e183838360405180602001604052806000815250611abc565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90613bc7565b60405180910390fd5b600061117383611c0e565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111ac91906133f5565b602060405180830381865afa1580156111c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ed9190614052565b6111f79190613c16565b9050600061120f838361120a878761103f565b612097565b90506000811415611255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124c90613cde565b60405180910390fd5b80600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112e19190613c16565b9250508190555080600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113379190613c16565b92505081905550611349848483612569565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516113919291906131e9565b60405180910390a250505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143f906140f1565b60405180910390fd5b80915050919050565b60146020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190614183565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61152961091a565b73ffffffffffffffffffffffffffffffffffffffff166115476115f7565b73ffffffffffffffffffffffffffffffffffffffff161461159d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159490613e64565b60405180910390fd5b6115a760006125ef565b565b60105481565b6000600b82815481106115c5576115c46141a3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61162961091a565b73ffffffffffffffffffffffffffffffffffffffff166116476115f7565b73ffffffffffffffffffffffffffffffffffffffff161461169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169490613e64565b60405180910390fd5b60001515601360019054906101000a900460ff161515146116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea9061421e565b60405180910390fd5b6001601360016101000a81548160ff021916908315150217905550565b601360009054906101000a900460ff1661175f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611756906142b0565b60405180910390fd5b600f5461177c61176d611c57565b8361253390919063ffffffff16565b11156117bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b490613f1c565b60405180910390fd5b601054811115611802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f990614342565b60405180910390fd5b600861180d33611469565b10156118605761181c33611469565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600881601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118ad9190613c16565b11156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906143fa565b60405180910390fd5b611903816011546126b590919063ffffffff16565b3414611944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193b9061448c565b60405180910390fd5b60005b8181101561196b5761195833612549565b808061196390613ff4565b915050611947565b5080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119bb9190613c16565b9250508190555050565b6060600180546119d49061396d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a009061396d565b8015611a4d5780601f10611a2257610100808354040283529160200191611a4d565b820191906000526020600020905b815481529060010190602001808311611a3057829003601f168201915b5050505050905090565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60115481565b611ab8611ab161091a565b83836126cb565b5050565b611acd611ac761091a565b836121f9565b611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0390613df8565b60405180910390fd5b611b1884848484612838565b50505050565b6060611b2982611f72565b611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f9061451e565b60405180910390fd5b6000611b72612894565b90506000815111611b925760405180602001604052806000815250611bbd565b80611b9c84612926565b604051602001611bad92919061457a565b6040516020818303038152906040525b915050919050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60000154905090565b6000600854905090565b601360019054906101000a900460ff1681565b611c8961091a565b73ffffffffffffffffffffffffffffffffffffffff16611ca76115f7565b73ffffffffffffffffffffffffffffffffffffffff1614611cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf490613e64565b60405180910390fd5b60001515601360019054906101000a900460ff16151514611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90614610565b60405180910390fd5b818160129190611d649291906130ec565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601360009054906101000a900460ff1681565b611e1861091a565b73ffffffffffffffffffffffffffffffffffffffff16611e366115f7565b73ffffffffffffffffffffffffffffffffffffffff1614611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390613e64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef3906146a2565b60405180910390fd5b611f05816125ef565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120518361139f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600754600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856120e891906146c2565b6120f2919061474b565b6120fc919061477c565b90509392505050565b80471015612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f906147fc565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161216e9061484d565b60006040518083038185875af1925050503d80600081146121ab576040519150601f19603f3d011682016040523d82523d6000602084013e6121b0565b606091505b50509050806121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb906148d4565b60405180910390fd5b505050565b600061220482611f72565b612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a90614966565b60405180910390fd5b600061224e8361139f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122bd57508373ffffffffffffffffffffffffffffffffffffffff166122a584610a96565b73ffffffffffffffffffffffffffffffffffffffff16145b806122ce57506122cd8185611d69565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122f78261139f565b73ffffffffffffffffffffffffffffffffffffffff161461234d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612344906149f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b490614a8a565b60405180910390fd5b6123c8838383612a87565b6123d3600082611fde565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612423919061477c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461247a9190613c16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836125419190613c16565b905092915050565b61255c81612557600e612a8c565b612a9a565b612566600e612ab8565b50565b6125ea8363a9059cbb60e01b84846040516024016125889291906131e9565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612ace565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836126c391906146c2565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273190614af6565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161282b91906132c6565b60405180910390a3505050565b6128438484846122d7565b61284f84848484612b95565b61288e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288590614b88565b60405180910390fd5b50505050565b6060601280546128a39061396d565b80601f01602080910402602001604051908101604052809291908181526020018280546128cf9061396d565b801561291c5780601f106128f15761010080835404028352916020019161291c565b820191906000526020600020905b8154815290600101906020018083116128ff57829003601f168201915b5050505050905090565b6060600082141561296e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a82565b600082905060005b600082146129a057808061298990613ff4565b915050600a82612999919061474b565b9150612976565b60008167ffffffffffffffff8111156129bc576129bb613676565b5b6040519080825280601f01601f1916602001820160405280156129ee5781602001600182028036833780820191505090505b5090505b60008514612a7b57600182612a07919061477c565b9150600a85612a169190614ba8565b6030612a229190613c16565b60f81b818381518110612a3857612a376141a3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a74919061474b565b94506129f2565b8093505050505b919050565b505050565b600081600001549050919050565b612ab4828260405180602001604052806000815250612d1d565b5050565b6001816000016000828254019250508190555050565b6000612b30826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d789092919063ffffffff16565b9050600081511115612b905780806020019051810190612b509190614bee565b612b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8690614c8d565b60405180910390fd5b5b505050565b6000612bb68473ffffffffffffffffffffffffffffffffffffffff16612d90565b15612d10578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bdf61091a565b8786866040518563ffffffff1660e01b8152600401612c019493929190614d02565b6020604051808303816000875af1925050508015612c3d57506040513d601f19601f82011682018060405250810190612c3a9190614d63565b60015b612cc0573d8060008114612c6d576040519150601f19603f3d011682016040523d82523d6000602084013e612c72565b606091505b50600081511415612cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612caf90614b88565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d15565b600190505b949350505050565b612d278383612da3565b612d346000848484612b95565b612d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6a90614b88565b60405180910390fd5b505050565b6060612d878484600085612f71565b90509392505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a90614ddc565b60405180910390fd5b612e1c81611f72565b15612e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5390614e48565b60405180910390fd5b612e6860008383612a87565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eb89190613c16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606082471015612fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fad90614eda565b60405180910390fd5b612fbf85612d90565b612ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff590614f46565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516130279190614f97565b60006040518083038185875af1925050503d8060008114613064576040519150601f19603f3d011682016040523d82523d6000602084013e613069565b606091505b5091509150613079828286613085565b92505050949350505050565b60608315613095578290506130e5565b6000835111156130a85782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dc919061337a565b60405180910390fd5b9392505050565b8280546130f89061396d565b90600052602060002090601f01602090048101928261311a5760008555613161565b82601f1061313357803560ff1916838001178555613161565b82800160010185558215613161579182015b82811115613160578235825591602001919060010190613145565b5b50905061316e9190613172565b5090565b5b8082111561318b576000816000905550600101613173565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131ba8261318f565b9050919050565b6131ca816131af565b82525050565b6000819050919050565b6131e3816131d0565b82525050565b60006040820190506131fe60008301856131c1565b61320b60208301846131da565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61325b81613226565b811461326657600080fd5b50565b60008135905061327881613252565b92915050565b6000602082840312156132945761329361321c565b5b60006132a284828501613269565b91505092915050565b60008115159050919050565b6132c0816132ab565b82525050565b60006020820190506132db60008301846132b7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561331b578082015181840152602081019050613300565b8381111561332a576000848401525b50505050565b6000601f19601f8301169050919050565b600061334c826132e1565b61335681856132ec565b93506133668185602086016132fd565b61336f81613330565b840191505092915050565b600060208201905081810360008301526133948184613341565b905092915050565b6133a5816131d0565b81146133b057600080fd5b50565b6000813590506133c28161339c565b92915050565b6000602082840312156133de576133dd61321c565b5b60006133ec848285016133b3565b91505092915050565b600060208201905061340a60008301846131c1565b92915050565b613419816131af565b811461342457600080fd5b50565b60008135905061343681613410565b92915050565b600080604083850312156134535761345261321c565b5b600061346185828601613427565b9250506020613472858286016133b3565b9150509250929050565b60006134878261318f565b9050919050565b6134978161347c565b81146134a257600080fd5b50565b6000813590506134b48161348e565b92915050565b6000602082840312156134d0576134cf61321c565b5b60006134de848285016134a5565b91505092915050565b60006020820190506134fc60008301846131da565b92915050565b60008060006060848603121561351b5761351a61321c565b5b600061352986828701613427565b935050602061353a86828701613427565b925050604061354b868287016133b3565b9150509250925092565b6000613560826131af565b9050919050565b61357081613555565b811461357b57600080fd5b50565b60008135905061358d81613567565b92915050565b600080604083850312156135aa576135a961321c565b5b60006135b88582860161357e565b92505060206135c985828601613427565b9150509250929050565b6000602082840312156135e9576135e861321c565b5b60006135f784828501613427565b91505092915050565b613609816132ab565b811461361457600080fd5b50565b60008135905061362681613600565b92915050565b600080604083850312156136435761364261321c565b5b600061365185828601613427565b925050602061366285828601613617565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136ae82613330565b810181811067ffffffffffffffff821117156136cd576136cc613676565b5b80604052505050565b60006136e0613212565b90506136ec82826136a5565b919050565b600067ffffffffffffffff82111561370c5761370b613676565b5b61371582613330565b9050602081019050919050565b82818337600083830152505050565b600061374461373f846136f1565b6136d6565b9050828152602081018484840111156137605761375f613671565b5b61376b848285613722565b509392505050565b600082601f8301126137885761378761366c565b5b8135613798848260208601613731565b91505092915050565b600080600080608085870312156137bb576137ba61321c565b5b60006137c987828801613427565b94505060206137da87828801613427565b93505060406137eb878288016133b3565b925050606085013567ffffffffffffffff81111561380c5761380b613221565b5b61381887828801613773565b91505092959194509250565b60006020828403121561383a5761383961321c565b5b60006138488482850161357e565b91505092915050565b600080fd5b600080fd5b60008083601f8401126138715761387061366c565b5b8235905067ffffffffffffffff81111561388e5761388d613851565b5b6020830191508360018202830111156138aa576138a9613856565b5b9250929050565b600080602083850312156138c8576138c761321c565b5b600083013567ffffffffffffffff8111156138e6576138e5613221565b5b6138f28582860161385b565b92509250509250929050565b600080604083850312156139155761391461321c565b5b600061392385828601613427565b925050602061393485828601613427565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061398557607f821691505b602082108114156139995761399861393e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006139fb602c836132ec565b9150613a068261399f565b604082019050919050565b60006020820190508181036000830152613a2a816139ee565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a8d6021836132ec565b9150613a9882613a31565b604082019050919050565b60006020820190508181036000830152613abc81613a80565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613b1f6038836132ec565b9150613b2a82613ac3565b604082019050919050565b60006020820190508181036000830152613b4e81613b12565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000613bb16026836132ec565b9150613bbc82613b55565b604082019050919050565b60006020820190508181036000830152613be081613ba4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613c21826131d0565b9150613c2c836131d0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6157613c60613be7565b5b828201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000613cc8602b836132ec565b9150613cd382613c6c565b604082019050919050565b60006020820190508181036000830152613cf781613cbb565b9050919050565b6000819050919050565b6000613d23613d1e613d198461318f565b613cfe565b61318f565b9050919050565b6000613d3582613d08565b9050919050565b6000613d4782613d2a565b9050919050565b613d5781613d3c565b82525050565b6000604082019050613d726000830185613d4e565b613d7f60208301846131da565b9392505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613de26031836132ec565b9150613ded82613d86565b604082019050919050565b60006020820190508181036000830152613e1181613dd5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e4e6020836132ec565b9150613e5982613e18565b602082019050919050565b60006020820190508181036000830152613e7d81613e41565b9050919050565b7f596f7520617265206d696e74696e67206d6f7265204e465473207468616e207460008201527f686572652061726520617661696c61626c652c206d696e74206c65737320746f60208201527f6b656e7321000000000000000000000000000000000000000000000000000000604082015250565b6000613f066045836132ec565b9150613f1182613e84565b606082019050919050565b60006020820190508181036000830152613f3581613ef9565b9050919050565b7f536f7272792c20746865206d617820616d6f756e74206f66207265736572766560008201527f6420746f6b656e7320706572207472616e73616374696f6e206973207365742060208201527f746f203230000000000000000000000000000000000000000000000000000000604082015250565b6000613fbe6045836132ec565b9150613fc982613f3c565b606082019050919050565b60006020820190508181036000830152613fed81613fb1565b9050919050565b6000613fff826131d0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561403257614031613be7565b5b600182019050919050565b60008151905061404c8161339c565b92915050565b6000602082840312156140685761406761321c565b5b60006140768482850161403d565b91505092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006140db6029836132ec565b91506140e68261407f565b604082019050919050565b6000602082019050818103600083015261410a816140ce565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061416d602a836132ec565b915061417882614111565b604082019050919050565b6000602082019050818103600083015261419c81614160565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f55524920616c7265616479206c6f636b65640000000000000000000000000000600082015250565b60006142086012836132ec565b9150614213826141d2565b602082019050919050565b60006020820190508181036000830152614237816141fb565b9050919050565b7f53616c65206973206e6f74206163746976652061742074686973206d6f6d656e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061429a6021836132ec565b91506142a58261423e565b604082019050919050565b600060208201905081810360008301526142c98161428d565b9050919050565b7f536f7272792c20746865206d617820616d6f756e74206f6620746f6b656e732060008201527f706572207472616e73616374696f6e2069732073657420746f20380000000000602082015250565b600061432c603b836132ec565b9150614337826142d0565b604082019050919050565b6000602082019050818103600083015261435b8161431f565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f206d696e74206d6f726560008201527f207468616e2038204e4654732c2062757420796f752063616e20627579206d6f60208201527f7265206f6e207365636f6e64617279206d61726b6574732e0000000000000000604082015250565b60006143e46058836132ec565b91506143ef82614362565b606082019050919050565b60006020820190508181036000830152614413816143d7565b9050919050565b7f416d6f756e74206f6620457468657220696e636f72726563742c20747279206160008201527f6761696e2e000000000000000000000000000000000000000000000000000000602082015250565b60006144766025836132ec565b91506144818261441a565b604082019050919050565b600060208201905081810360008301526144a581614469565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614508602f836132ec565b9150614513826144ac565b604082019050919050565b60006020820190508181036000830152614537816144fb565b9050919050565b600081905092915050565b6000614554826132e1565b61455e818561453e565b935061456e8185602086016132fd565b80840191505092915050565b60006145868285614549565b91506145928284614549565b91508190509392505050565b7f555249206c6f636b65642c20796f752063616e2774206368616e67652069742060008201527f616e796d6f726500000000000000000000000000000000000000000000000000602082015250565b60006145fa6027836132ec565b91506146058261459e565b604082019050919050565b60006020820190508181036000830152614629816145ed565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061468c6026836132ec565b915061469782614630565b604082019050919050565b600060208201905081810360008301526146bb8161467f565b9050919050565b60006146cd826131d0565b91506146d8836131d0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561471157614710613be7565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614756826131d0565b9150614761836131d0565b9250826147715761477061471c565b5b828204905092915050565b6000614787826131d0565b9150614792836131d0565b9250828210156147a5576147a4613be7565b5b828203905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006147e6601d836132ec565b91506147f1826147b0565b602082019050919050565b60006020820190508181036000830152614815816147d9565b9050919050565b600081905092915050565b50565b600061483760008361481c565b915061484282614827565b600082019050919050565b60006148588261482a565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006148be603a836132ec565b91506148c982614862565b604082019050919050565b600060208201905081810360008301526148ed816148b1565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614950602c836132ec565b915061495b826148f4565b604082019050919050565b6000602082019050818103600083015261497f81614943565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006149e26029836132ec565b91506149ed82614986565b604082019050919050565b60006020820190508181036000830152614a11816149d5565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a746024836132ec565b9150614a7f82614a18565b604082019050919050565b60006020820190508181036000830152614aa381614a67565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614ae06019836132ec565b9150614aeb82614aaa565b602082019050919050565b60006020820190508181036000830152614b0f81614ad3565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b726032836132ec565b9150614b7d82614b16565b604082019050919050565b60006020820190508181036000830152614ba181614b65565b9050919050565b6000614bb3826131d0565b9150614bbe836131d0565b925082614bce57614bcd61471c565b5b828206905092915050565b600081519050614be881613600565b92915050565b600060208284031215614c0457614c0361321c565b5b6000614c1284828501614bd9565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614c77602a836132ec565b9150614c8282614c1b565b604082019050919050565b60006020820190508181036000830152614ca681614c6a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614cd482614cad565b614cde8185614cb8565b9350614cee8185602086016132fd565b614cf781613330565b840191505092915050565b6000608082019050614d1760008301876131c1565b614d2460208301866131c1565b614d3160408301856131da565b8181036060830152614d438184614cc9565b905095945050505050565b600081519050614d5d81613252565b92915050565b600060208284031215614d7957614d7861321c565b5b6000614d8784828501614d4e565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614dc66020836132ec565b9150614dd182614d90565b602082019050919050565b60006020820190508181036000830152614df581614db9565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614e32601c836132ec565b9150614e3d82614dfc565b602082019050919050565b60006020820190508181036000830152614e6181614e25565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614ec46026836132ec565b9150614ecf82614e68565b604082019050919050565b60006020820190508181036000830152614ef381614eb7565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614f30601d836132ec565b9150614f3b82614efa565b602082019050919050565b60006020820190508181036000830152614f5f81614f23565b9050919050565b6000614f7182614cad565b614f7b818561481c565b9350614f8b8185602086016132fd565b80840191505092915050565b6000614fa38284614f66565b91508190509291505056fea26469706673582212201094a7723e3dc8678084eea3f82ed272c412ce7a4b508f5fe0913384b295ff9e64736f6c634300080b0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000e8735f4cad4c73f9d4b7abae7ba0c580d45133200000000000000000000000005a7d97c88e9dbbe1748fb24d5fb7875745d7a152000000000000000000000000eee23b04ae90243f7abcb15bcb914387d73895b90000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000037f000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000004b

-----Decoded View---------------
Arg [0] : _payees (address[]): 0xe8735F4cAd4c73f9d4B7AbAE7BA0c580d4513320,0x5a7d97C88e9dbBE1748Fb24D5fb7875745d7A152,0xeee23b04aE90243f7abCB15bCB914387D73895b9
Arg [1] : _shares (uint256[]): 895,30,75

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [3] : 000000000000000000000000e8735f4cad4c73f9d4b7abae7ba0c580d4513320
Arg [4] : 0000000000000000000000005a7d97c88e9dbbe1748fb24d5fb7875745d7a152
Arg [5] : 000000000000000000000000eee23b04ae90243f7abcb15bcb914387d73895b9
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 000000000000000000000000000000000000000000000000000000000000037f
Arg [8] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [9] : 000000000000000000000000000000000000000000000000000000000000004b


Deployed Bytecode Sourcemap

59237:4340:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32323:40;32339:12;:10;:12::i;:::-;32353:9;32323:40;;;;;;;:::i;:::-;;;;;;;;59237:4340;;;;;46726:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47671:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49230:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48753:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34109:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59501:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49980:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60409:88;;;;;;;;;;;;;:::i;:::-;;60553:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32454:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33583:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50390:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34943:641;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47365:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59844:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47095:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16118:103;;;;;;;;;;;;;:::i;:::-;;59582:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33809:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15467:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61225:131;;;;;;;;;;;;;:::i;:::-;;62087:1487;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47840:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33305:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59639:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49523:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50646:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48015:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33101:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32891:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61858:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32639:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59782:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61022:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49749:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59731:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16376:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14191:98;14244:7;14271:10;14264:17;;14191:98;:::o;46726:305::-;46828:4;46880:25;46865:40;;;:11;:40;;;;:105;;;;46937:33;46922:48;;;:11;:48;;;;46865:105;:158;;;;46987:36;47011:11;46987:23;:36::i;:::-;46865:158;46845:178;;46726:305;;;:::o;47671:100::-;47725:13;47758:5;47751:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47671:100;:::o;49230:221::-;49306:7;49334:16;49342:7;49334;:16::i;:::-;49326:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49419:15;:24;49435:7;49419:24;;;;;;;;;;;;;;;;;;;;;49412:31;;49230:221;;;:::o;48753:411::-;48834:13;48850:23;48865:7;48850:14;:23::i;:::-;48834:39;;48898:5;48892:11;;:2;:11;;;;48884:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;48992:5;48976:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49001:37;49018:5;49025:12;:10;:12::i;:::-;49001:16;:37::i;:::-;48976:62;48954:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;49135:21;49144:2;49148:7;49135:8;:21::i;:::-;48823:341;48753:411;;:::o;34109:566::-;34204:1;34185:7;:16;34193:7;34185:16;;;;;;;;;;;;;;;;:20;34177:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34261:21;34309:15;:13;:15::i;:::-;34285:21;:39;;;;:::i;:::-;34261:63;;34335:15;34353:58;34369:7;34378:13;34393:17;34402:7;34393:8;:17::i;:::-;34353:15;:58::i;:::-;34335:76;;34443:1;34432:7;:12;;34424:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34527:7;34505:9;:18;34515:7;34505:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;34563:7;34545:14;;:25;;;;;;;:::i;:::-;;;;;;;;34583:35;34601:7;34610;34583:17;:35::i;:::-;34634:33;34650:7;34659;34634:33;;;;;;;:::i;:::-;;;;;;;;34166:509;;34109:566;:::o;59501:28::-;;;;:::o;49980:339::-;50175:41;50194:12;:10;:12::i;:::-;50208:7;50175:18;:41::i;:::-;50167:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50283:28;50293:4;50299:2;50303:7;50283:9;:28::i;:::-;49980:339;;;:::o;60409:88::-;15698:12;:10;:12::i;:::-;15687:23;;:7;:5;:7::i;:::-;:23;;;15679:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60477:12:::1;;;;;;;;;;;60476:13;60461:12;;:28;;;;;;;;;;;;;;;;;;60409:88::o:0;60553:437::-;15698:12;:10;:12::i;:::-;15687:23;;:7;:5;:7::i;:::-;:23;;;15679:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60676:13:::1;;60633:39;60652:19;:17;:19::i;:::-;60633:14;:18;;:39;;;;:::i;:::-;:56;;60623:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;60802:2;60784:14;:20;;60775:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;60904:6;60899:84;60916:14;60914:1;:16;60899:84;;;60951:20;60960:10;60951:8;:20::i;:::-;60932:3;;;;;:::i;:::-;;;;60899:84;;;;60553:437:::0;:::o;32454:91::-;32498:7;32525:12;;32518:19;;32454:91;:::o;33583:135::-;33653:7;33680:14;:21;33695:5;33680:21;;;;;;;;;;;;;;;:30;33702:7;33680:30;;;;;;;;;;;;;;;;33673:37;;33583:135;;;;:::o;50390:185::-;50528:39;50545:4;50551:2;50555:7;50528:39;;;;;;;;;;;;:16;:39::i;:::-;50390:185;;;:::o;34943:641::-;35044:1;35025:7;:16;35033:7;35025:16;;;;;;;;;;;;;;;;:20;35017:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;35101:21;35158:20;35172:5;35158:13;:20::i;:::-;35125:5;:15;;;35149:4;35125:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;35101:77;;35189:15;35207:65;35223:7;35232:13;35247:24;35256:5;35263:7;35247:8;:24::i;:::-;35207:15;:65::i;:::-;35189:83;;35304:1;35293:7;:12;;35285:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35400:7;35366:14;:21;35381:5;35366:21;;;;;;;;;;;;;;;:30;35388:7;35366:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;35448:7;35418:19;:26;35438:5;35418:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;35468:47;35491:5;35498:7;35507;35468:22;:47::i;:::-;35552:5;35531:45;;;35559:7;35568;35531:45;;;;;;;:::i;:::-;;;;;;;;35006:578;;34943:641;;:::o;47365:239::-;47437:7;47457:13;47473:7;:16;47481:7;47473:16;;;;;;;;;;;;;;;;;;;;;47457:32;;47525:1;47508:19;;:5;:19;;;;47500:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47591:5;47584:12;;;47365:239;;;:::o;59844:51::-;;;;;;;;;;;;;;;;;:::o;47095:208::-;47167:7;47212:1;47195:19;;:5;:19;;;;47187:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47279:9;:16;47289:5;47279:16;;;;;;;;;;;;;;;;47272:23;;47095:208;;;:::o;16118:103::-;15698:12;:10;:12::i;:::-;15687:23;;:7;:5;:7::i;:::-;:23;;;15679:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16183:30:::1;16210:1;16183:18;:30::i;:::-;16118:103::o:0;59582:27::-;;;;:::o;33809:100::-;33860:7;33887;33895:5;33887:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33880:21;;33809:100;;;:::o;15467:87::-;15513:7;15540:6;;;;;;;;;;;15533:13;;15467:87;:::o;61225:131::-;15698:12;:10;:12::i;:::-;15687:23;;:7;:5;:7::i;:::-;:23;;;15679:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61293:5:::1;61280:18;;:9;;;;;;;;;;;:18;;;61272:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;61344:4;61332:9;;:16;;;;;;;;;;;;;;;;;;61225:131::o:0;62087:1487::-;62222:12;;;;;;;;;;;62214:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62470:13;;62429:37;62446:19;:17;:19::i;:::-;62429:12;:16;;:37;;;;:::i;:::-;:54;;62419:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;62594:12;;62578;:28;;62569:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;62830:1;62806:21;62816:10;62806:9;:21::i;:::-;:25;62802:114;;;62883:21;62893:10;62883:9;:21::i;:::-;62849:19;:31;62869:10;62849:31;;;;;;;;;;;;;;;:55;;;;62802:114;63069:1;63053:12;63019:19;:31;63039:10;63019:31;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:51;;63010:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;63255:23;63265:12;63255:5;;:9;;:23;;;;:::i;:::-;63241:9;:38;63232:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;63383:6;63378:82;63395:12;63393:1;:14;63378:82;;;63428:20;63437:10;63428:8;:20::i;:::-;63409:3;;;;;:::i;:::-;;;;63378:82;;;;63554:12;63519:19;:31;63539:10;63519:31;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;62087:1487;:::o;47840:104::-;47896:13;47929:7;47922:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47840:104;:::o;33305:109::-;33361:7;33388:9;:18;33398:7;33388:18;;;;;;;;;;;;;;;;33381:25;;33305:109;;;:::o;59639:20::-;;;;:::o;49523:155::-;49618:52;49637:12;:10;:12::i;:::-;49651:8;49661;49618:18;:52::i;:::-;49523:155;;:::o;50646:328::-;50821:41;50840:12;:10;:12::i;:::-;50854:7;50821:18;:41::i;:::-;50813:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50927:39;50941:4;50947:2;50951:7;50960:5;50927:13;:39::i;:::-;50646:328;;;;:::o;48015:334::-;48088:13;48122:16;48130:7;48122;:16::i;:::-;48114:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48203:21;48227:10;:8;:10::i;:::-;48203:34;;48279:1;48261:7;48255:21;:25;:86;;;;;;;;;;;;;;;;;48307:7;48316:18;:7;:16;:18::i;:::-;48290:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48255:86;48248:93;;;48015:334;;;:::o;33101:105::-;33155:7;33182;:16;33190:7;33182:16;;;;;;;;;;;;;;;;33175:23;;33101:105;;;:::o;32891:119::-;32949:7;32976:19;:26;32996:5;32976:26;;;;;;;;;;;;;;;;32969:33;;32891:119;;;:::o;61858:107::-;61907:7;61934:15;:22;;;61927:30;;61858:107;:::o;32639:95::-;32685:7;32712:14;;32705:21;;32639:95;:::o;59782:21::-;;;;;;;;;;;;;:::o;61022:177::-;15698:12;:10;:12::i;:::-;15687:23;;:7;:5;:7::i;:::-;:23;;;15679:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61115:5:::1;61102:18;;:9;;;;;;;;;;;:18;;;61093:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;61184:7;;61175:6;:16;;;;;;;:::i;:::-;;61022:177:::0;;:::o;49749:164::-;49846:4;49870:18;:25;49889:5;49870:25;;;;;;;;;;;;;;;:35;49896:8;49870:35;;;;;;;;;;;;;;;;;;;;;;;;;49863:42;;49749:164;;;;:::o;59731:24::-;;;;;;;;;;;;;:::o;16376:201::-;15698:12;:10;:12::i;:::-;15687:23;;:7;:5;:7::i;:::-;:23;;;15679:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16485:1:::1;16465:22;;:8;:22;;;;16457:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16541:28;16560:8;16541:18;:28::i;:::-;16376:201:::0;:::o;39495:157::-;39580:4;39619:25;39604:40;;;:11;:40;;;;39597:47;;39495:157;;;:::o;52484:127::-;52549:4;52601:1;52573:30;;:7;:16;52581:7;52573:16;;;;;;;;;;;;;;;;;;;;;:30;;;;52566:37;;52484:127;;;:::o;56466:174::-;56568:2;56541:15;:24;56557:7;56541:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56624:7;56620:2;56586:46;;56595:23;56610:7;56595:14;:23::i;:::-;56586:46;;;;;;;;;;;;56466:174;;:::o;35762:248::-;35908:7;35987:15;35972:12;;35952:7;:16;35960:7;35952:16;;;;;;;;;;;;;;;;35936:13;:32;;;;:::i;:::-;35935:49;;;;:::i;:::-;:67;;;;:::i;:::-;35928:74;;35762:248;;;;;:::o;19077:317::-;19192:6;19167:21;:31;;19159:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19246:12;19264:9;:14;;19286:6;19264:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19245:52;;;19316:7;19308:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;19148:246;19077:317;;:::o;52778:348::-;52871:4;52896:16;52904:7;52896;:16::i;:::-;52888:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52972:13;52988:23;53003:7;52988:14;:23::i;:::-;52972:39;;53041:5;53030:16;;:7;:16;;;:51;;;;53074:7;53050:31;;:20;53062:7;53050:11;:20::i;:::-;:31;;;53030:51;:87;;;;53085:32;53102:5;53109:7;53085:16;:32::i;:::-;53030:87;53022:96;;;52778:348;;;;:::o;55770:578::-;55929:4;55902:31;;:23;55917:7;55902:14;:23::i;:::-;:31;;;55894:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;56012:1;55998:16;;:2;:16;;;;55990:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56068:39;56089:4;56095:2;56099:7;56068:20;:39::i;:::-;56172:29;56189:1;56193:7;56172:8;:29::i;:::-;56233:1;56214:9;:15;56224:4;56214:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;56262:1;56245:9;:13;56255:2;56245:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;56293:2;56274:7;:16;56282:7;56274:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56332:7;56328:2;56313:27;;56322:4;56313:27;;;;;;;;;;;;55770:578;;;:::o;5758:98::-;5816:7;5847:1;5843;:5;;;;:::i;:::-;5836:12;;5758:98;;;;:::o;61670:137::-;61719:40;61729:2;61733:25;:15;:23;:25::i;:::-;61719:9;:40::i;:::-;61766:27;:15;:25;:27::i;:::-;61670:137;:::o;25783:211::-;25900:86;25920:5;25950:23;;;25975:2;25979:5;25927:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25900:19;:86::i;:::-;25783:211;;;:::o;16737:191::-;16811:16;16830:6;;;;;;;;;;;16811:25;;16856:8;16847:6;;:17;;;;;;;;;;;;;;;;;;16911:8;16880:40;;16901:8;16880:40;;;;;;;;;;;;16800:128;16737:191;:::o;6496:98::-;6554:7;6585:1;6581;:5;;;;:::i;:::-;6574:12;;6496:98;;;;:::o;56782:315::-;56937:8;56928:17;;:5;:17;;;;56920:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57024:8;56986:18;:25;57005:5;56986:25;;;;;;;;;;;;;;;:35;57012:8;56986:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;57070:8;57048:41;;57063:5;57048:41;;;57080:8;57048:41;;;;;;:::i;:::-;;;;;;;;56782:315;;;:::o;51856:::-;52013:28;52023:4;52029:2;52033:7;52013:9;:28::i;:::-;52060:48;52083:4;52089:2;52093:7;52102:5;52060:22;:48::i;:::-;52052:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;51856:315;;;;:::o;61464:99::-;61516:13;61549:6;61542:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61464:99;:::o;11753:723::-;11809:13;12039:1;12030:5;:10;12026:53;;;12057:10;;;;;;;;;;;;;;;;;;;;;12026:53;12089:12;12104:5;12089:20;;12120:14;12145:78;12160:1;12152:4;:9;12145:78;;12178:8;;;;;:::i;:::-;;;;12209:2;12201:10;;;;;:::i;:::-;;;12145:78;;;12233:19;12265:6;12255:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12233:39;;12283:154;12299:1;12290:5;:10;12283:154;;12327:1;12317:11;;;;;:::i;:::-;;;12394:2;12386:5;:10;;;;:::i;:::-;12373:2;:24;;;;:::i;:::-;12360:39;;12343:6;12350;12343:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;12423:2;12414:11;;;;;:::i;:::-;;;12283:154;;;12461:6;12447:21;;;;;11753:723;;;;:::o;59033:126::-;;;;:::o;10795:114::-;10860:7;10887;:14;;;10880:21;;10795:114;;;:::o;53468:110::-;53544:26;53554:2;53558:7;53544:26;;;;;;;;;;;;:9;:26::i;:::-;53468:110;;:::o;10917:127::-;11024:1;11006:7;:14;;;:19;;;;;;;;;;;10917:127;:::o;28356:716::-;28780:23;28806:69;28834:4;28806:69;;;;;;;;;;;;;;;;;28814:5;28806:27;;;;:69;;;;;:::i;:::-;28780:95;;28910:1;28890:10;:17;:21;28886:179;;;28987:10;28976:30;;;;;;;;;;;;:::i;:::-;28968:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;28886:179;28426:646;28356:716;;:::o;57662:799::-;57817:4;57838:15;:2;:13;;;:15::i;:::-;57834:620;;;57890:2;57874:36;;;57911:12;:10;:12::i;:::-;57925:4;57931:7;57940:5;57874:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57870:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58133:1;58116:6;:13;:18;58112:272;;;58159:60;;;;;;;;;;:::i;:::-;;;;;;;;58112:272;58334:6;58328:13;58319:6;58315:2;58311:15;58304:38;57870:529;58007:41;;;57997:51;;;:6;:51;;;;57990:58;;;;;57834:620;58438:4;58431:11;;57662:799;;;;;;;:::o;53805:321::-;53935:18;53941:2;53945:7;53935:5;:18::i;:::-;53986:54;54017:1;54021:2;54025:7;54034:5;53986:22;:54::i;:::-;53964:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;53805:321;;;:::o;20561:229::-;20698:12;20730:52;20752:6;20760:4;20766:1;20769:12;20730:21;:52::i;:::-;20723:59;;20561:229;;;;;:::o;17755:387::-;17815:4;18023:12;18090:7;18078:20;18070:28;;18133:1;18126:4;:8;18119:15;;;17755:387;;;:::o;54462:382::-;54556:1;54542:16;;:2;:16;;;;54534:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54615:16;54623:7;54615;:16::i;:::-;54614:17;54606:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54677:45;54706:1;54710:2;54714:7;54677:20;:45::i;:::-;54752:1;54735:9;:13;54745:2;54735:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;54783:2;54764:7;:16;54772:7;54764:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;54828:7;54824:2;54803:33;;54820:1;54803:33;;;;;;;;;;;;54462:382;;:::o;21681:510::-;21851:12;21909:5;21884:21;:30;;21876:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;21976:18;21987:6;21976:10;:18::i;:::-;21968:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;22042:12;22056:23;22083:6;:11;;22102:5;22109:4;22083:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22041:73;;;;22132:51;22149:7;22158:10;22170:12;22132:16;:51::i;:::-;22125:58;;;;21681:510;;;;;;:::o;24367:712::-;24517:12;24546:7;24542:530;;;24577:10;24570:17;;;;24542:530;24711:1;24691:10;:17;:21;24687:374;;;24889:10;24883:17;24950:15;24937:10;24933:2;24929:19;24922:44;24687:374;25032:12;25025:20;;;;;;;;;;;:::i;:::-;;;;;;;;24367:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:149;1273:7;1313:66;1306:5;1302:78;1291:89;;1237:149;;;:::o;1392:120::-;1464:23;1481:5;1464:23;:::i;:::-;1457:5;1454:34;1444:62;;1502:1;1499;1492:12;1444:62;1392:120;:::o;1518:137::-;1563:5;1601:6;1588:20;1579:29;;1617:32;1643:5;1617:32;:::i;:::-;1518:137;;;;:::o;1661:327::-;1719:6;1768:2;1756:9;1747:7;1743:23;1739:32;1736:119;;;1774:79;;:::i;:::-;1736:119;1894:1;1919:52;1963:7;1954:6;1943:9;1939:22;1919:52;:::i;:::-;1909:62;;1865:116;1661:327;;;;:::o;1994:90::-;2028:7;2071:5;2064:13;2057:21;2046:32;;1994:90;;;:::o;2090:109::-;2171:21;2186:5;2171:21;:::i;:::-;2166:3;2159:34;2090:109;;:::o;2205:210::-;2292:4;2330:2;2319:9;2315:18;2307:26;;2343:65;2405:1;2394:9;2390:17;2381:6;2343:65;:::i;:::-;2205:210;;;;:::o;2421:99::-;2473:6;2507:5;2501:12;2491:22;;2421:99;;;:::o;2526:169::-;2610:11;2644:6;2639:3;2632:19;2684:4;2679:3;2675:14;2660:29;;2526:169;;;;:::o;2701:307::-;2769:1;2779:113;2793:6;2790:1;2787:13;2779:113;;;2878:1;2873:3;2869:11;2863:18;2859:1;2854:3;2850:11;2843:39;2815:2;2812:1;2808:10;2803:15;;2779:113;;;2910:6;2907:1;2904:13;2901:101;;;2990:1;2981:6;2976:3;2972:16;2965:27;2901:101;2750:258;2701:307;;;:::o;3014:102::-;3055:6;3106:2;3102:7;3097:2;3090:5;3086:14;3082:28;3072:38;;3014:102;;;:::o;3122:364::-;3210:3;3238:39;3271:5;3238:39;:::i;:::-;3293:71;3357:6;3352:3;3293:71;:::i;:::-;3286:78;;3373:52;3418:6;3413:3;3406:4;3399:5;3395:16;3373:52;:::i;:::-;3450:29;3472:6;3450:29;:::i;:::-;3445:3;3441:39;3434:46;;3214:272;3122:364;;;;:::o;3492:313::-;3605:4;3643:2;3632:9;3628:18;3620:26;;3692:9;3686:4;3682:20;3678:1;3667:9;3663:17;3656:47;3720:78;3793:4;3784:6;3720:78;:::i;:::-;3712:86;;3492:313;;;;:::o;3811:122::-;3884:24;3902:5;3884:24;:::i;:::-;3877:5;3874:35;3864:63;;3923:1;3920;3913:12;3864:63;3811:122;:::o;3939:139::-;3985:5;4023:6;4010:20;4001:29;;4039:33;4066:5;4039:33;:::i;:::-;3939:139;;;;:::o;4084:329::-;4143:6;4192:2;4180:9;4171:7;4167:23;4163:32;4160:119;;;4198:79;;:::i;:::-;4160:119;4318:1;4343:53;4388:7;4379:6;4368:9;4364:22;4343:53;:::i;:::-;4333:63;;4289:117;4084:329;;;;:::o;4419:222::-;4512:4;4550:2;4539:9;4535:18;4527:26;;4563:71;4631:1;4620:9;4616:17;4607:6;4563:71;:::i;:::-;4419:222;;;;:::o;4647:122::-;4720:24;4738:5;4720:24;:::i;:::-;4713:5;4710:35;4700:63;;4759:1;4756;4749:12;4700:63;4647:122;:::o;4775:139::-;4821:5;4859:6;4846:20;4837:29;;4875:33;4902:5;4875:33;:::i;:::-;4775:139;;;;:::o;4920:474::-;4988:6;4996;5045:2;5033:9;5024:7;5020:23;5016:32;5013:119;;;5051:79;;:::i;:::-;5013:119;5171:1;5196:53;5241:7;5232:6;5221:9;5217:22;5196:53;:::i;:::-;5186:63;;5142:117;5298:2;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5269:118;4920:474;;;;;:::o;5400:104::-;5445:7;5474:24;5492:5;5474:24;:::i;:::-;5463:35;;5400:104;;;:::o;5510:138::-;5591:32;5617:5;5591:32;:::i;:::-;5584:5;5581:43;5571:71;;5638:1;5635;5628:12;5571:71;5510:138;:::o;5654:155::-;5708:5;5746:6;5733:20;5724:29;;5762:41;5797:5;5762:41;:::i;:::-;5654:155;;;;:::o;5815:345::-;5882:6;5931:2;5919:9;5910:7;5906:23;5902:32;5899:119;;;5937:79;;:::i;:::-;5899:119;6057:1;6082:61;6135:7;6126:6;6115:9;6111:22;6082:61;:::i;:::-;6072:71;;6028:125;5815:345;;;;:::o;6166:222::-;6259:4;6297:2;6286:9;6282:18;6274:26;;6310:71;6378:1;6367:9;6363:17;6354:6;6310:71;:::i;:::-;6166:222;;;;:::o;6394:619::-;6471:6;6479;6487;6536:2;6524:9;6515:7;6511:23;6507:32;6504:119;;;6542:79;;:::i;:::-;6504:119;6662:1;6687:53;6732:7;6723:6;6712:9;6708:22;6687:53;:::i;:::-;6677:63;;6633:117;6789:2;6815:53;6860:7;6851:6;6840:9;6836:22;6815:53;:::i;:::-;6805:63;;6760:118;6917:2;6943:53;6988:7;6979:6;6968:9;6964:22;6943:53;:::i;:::-;6933:63;;6888:118;6394:619;;;;;:::o;7019:109::-;7069:7;7098:24;7116:5;7098:24;:::i;:::-;7087:35;;7019:109;;;:::o;7134:148::-;7220:37;7251:5;7220:37;:::i;:::-;7213:5;7210:48;7200:76;;7272:1;7269;7262:12;7200:76;7134:148;:::o;7288:165::-;7347:5;7385:6;7372:20;7363:29;;7401:46;7441:5;7401:46;:::i;:::-;7288:165;;;;:::o;7459:500::-;7540:6;7548;7597:2;7585:9;7576:7;7572:23;7568:32;7565:119;;;7603:79;;:::i;:::-;7565:119;7723:1;7748:66;7806:7;7797:6;7786:9;7782:22;7748:66;:::i;:::-;7738:76;;7694:130;7863:2;7889:53;7934:7;7925:6;7914:9;7910:22;7889:53;:::i;:::-;7879:63;;7834:118;7459:500;;;;;:::o;7965:329::-;8024:6;8073:2;8061:9;8052:7;8048:23;8044:32;8041:119;;;8079:79;;:::i;:::-;8041:119;8199:1;8224:53;8269:7;8260:6;8249:9;8245:22;8224:53;:::i;:::-;8214:63;;8170:117;7965:329;;;;:::o;8300:116::-;8370:21;8385:5;8370:21;:::i;:::-;8363:5;8360:32;8350:60;;8406:1;8403;8396:12;8350:60;8300:116;:::o;8422:133::-;8465:5;8503:6;8490:20;8481:29;;8519:30;8543:5;8519:30;:::i;:::-;8422:133;;;;:::o;8561:468::-;8626:6;8634;8683:2;8671:9;8662:7;8658:23;8654:32;8651:119;;;8689:79;;:::i;:::-;8651:119;8809:1;8834:53;8879:7;8870:6;8859:9;8855:22;8834:53;:::i;:::-;8824:63;;8780:117;8936:2;8962:50;9004:7;8995:6;8984:9;8980:22;8962:50;:::i;:::-;8952:60;;8907:115;8561:468;;;;;:::o;9035:117::-;9144:1;9141;9134:12;9158:117;9267:1;9264;9257:12;9281:180;9329:77;9326:1;9319:88;9426:4;9423:1;9416:15;9450:4;9447:1;9440:15;9467:281;9550:27;9572:4;9550:27;:::i;:::-;9542:6;9538:40;9680:6;9668:10;9665:22;9644:18;9632:10;9629:34;9626:62;9623:88;;;9691:18;;:::i;:::-;9623:88;9731:10;9727:2;9720:22;9510:238;9467:281;;:::o;9754:129::-;9788:6;9815:20;;:::i;:::-;9805:30;;9844:33;9872:4;9864:6;9844:33;:::i;:::-;9754:129;;;:::o;9889:307::-;9950:4;10040:18;10032:6;10029:30;10026:56;;;10062:18;;:::i;:::-;10026:56;10100:29;10122:6;10100:29;:::i;:::-;10092:37;;10184:4;10178;10174:15;10166:23;;9889:307;;;:::o;10202:154::-;10286:6;10281:3;10276;10263:30;10348:1;10339:6;10334:3;10330:16;10323:27;10202:154;;;:::o;10362:410::-;10439:5;10464:65;10480:48;10521:6;10480:48;:::i;:::-;10464:65;:::i;:::-;10455:74;;10552:6;10545:5;10538:21;10590:4;10583:5;10579:16;10628:3;10619:6;10614:3;10610:16;10607:25;10604:112;;;10635:79;;:::i;:::-;10604:112;10725:41;10759:6;10754:3;10749;10725:41;:::i;:::-;10445:327;10362:410;;;;;:::o;10791:338::-;10846:5;10895:3;10888:4;10880:6;10876:17;10872:27;10862:122;;10903:79;;:::i;:::-;10862:122;11020:6;11007:20;11045:78;11119:3;11111:6;11104:4;11096:6;11092:17;11045:78;:::i;:::-;11036:87;;10852:277;10791:338;;;;:::o;11135:943::-;11230:6;11238;11246;11254;11303:3;11291:9;11282:7;11278:23;11274:33;11271:120;;;11310:79;;:::i;:::-;11271:120;11430:1;11455:53;11500:7;11491:6;11480:9;11476:22;11455:53;:::i;:::-;11445:63;;11401:117;11557:2;11583:53;11628:7;11619:6;11608:9;11604:22;11583:53;:::i;:::-;11573:63;;11528:118;11685:2;11711:53;11756:7;11747:6;11736:9;11732:22;11711:53;:::i;:::-;11701:63;;11656:118;11841:2;11830:9;11826:18;11813:32;11872:18;11864:6;11861:30;11858:117;;;11894:79;;:::i;:::-;11858:117;11999:62;12053:7;12044:6;12033:9;12029:22;11999:62;:::i;:::-;11989:72;;11784:287;11135:943;;;;;;;:::o;12084:355::-;12156:6;12205:2;12193:9;12184:7;12180:23;12176:32;12173:119;;;12211:79;;:::i;:::-;12173:119;12331:1;12356:66;12414:7;12405:6;12394:9;12390:22;12356:66;:::i;:::-;12346:76;;12302:130;12084:355;;;;:::o;12445:117::-;12554:1;12551;12544:12;12568:117;12677:1;12674;12667:12;12705:553;12763:8;12773:6;12823:3;12816:4;12808:6;12804:17;12800:27;12790:122;;12831:79;;:::i;:::-;12790:122;12944:6;12931:20;12921:30;;12974:18;12966:6;12963:30;12960:117;;;12996:79;;:::i;:::-;12960:117;13110:4;13102:6;13098:17;13086:29;;13164:3;13156:4;13148:6;13144:17;13134:8;13130:32;13127:41;13124:128;;;13171:79;;:::i;:::-;13124:128;12705:553;;;;;:::o;13264:529::-;13335:6;13343;13392:2;13380:9;13371:7;13367:23;13363:32;13360:119;;;13398:79;;:::i;:::-;13360:119;13546:1;13535:9;13531:17;13518:31;13576:18;13568:6;13565:30;13562:117;;;13598:79;;:::i;:::-;13562:117;13711:65;13768:7;13759:6;13748:9;13744:22;13711:65;:::i;:::-;13693:83;;;;13489:297;13264:529;;;;;:::o;13799:474::-;13867:6;13875;13924:2;13912:9;13903:7;13899:23;13895:32;13892:119;;;13930:79;;:::i;:::-;13892:119;14050:1;14075:53;14120:7;14111:6;14100:9;14096:22;14075:53;:::i;:::-;14065:63;;14021:117;14177:2;14203:53;14248:7;14239:6;14228:9;14224:22;14203:53;:::i;:::-;14193:63;;14148:118;13799:474;;;;;:::o;14279:180::-;14327:77;14324:1;14317:88;14424:4;14421:1;14414:15;14448:4;14445:1;14438:15;14465:320;14509:6;14546:1;14540:4;14536:12;14526:22;;14593:1;14587:4;14583:12;14614:18;14604:81;;14670:4;14662:6;14658:17;14648:27;;14604:81;14732:2;14724:6;14721:14;14701:18;14698:38;14695:84;;;14751:18;;:::i;:::-;14695:84;14516:269;14465:320;;;:::o;14791:231::-;14931:34;14927:1;14919:6;14915:14;14908:58;15000:14;14995:2;14987:6;14983:15;14976:39;14791:231;:::o;15028:366::-;15170:3;15191:67;15255:2;15250:3;15191:67;:::i;:::-;15184:74;;15267:93;15356:3;15267:93;:::i;:::-;15385:2;15380:3;15376:12;15369:19;;15028:366;;;:::o;15400:419::-;15566:4;15604:2;15593:9;15589:18;15581:26;;15653:9;15647:4;15643:20;15639:1;15628:9;15624:17;15617:47;15681:131;15807:4;15681:131;:::i;:::-;15673:139;;15400:419;;;:::o;15825:220::-;15965:34;15961:1;15953:6;15949:14;15942:58;16034:3;16029:2;16021:6;16017:15;16010:28;15825:220;:::o;16051:366::-;16193:3;16214:67;16278:2;16273:3;16214:67;:::i;:::-;16207:74;;16290:93;16379:3;16290:93;:::i;:::-;16408:2;16403:3;16399:12;16392:19;;16051:366;;;:::o;16423:419::-;16589:4;16627:2;16616:9;16612:18;16604:26;;16676:9;16670:4;16666:20;16662:1;16651:9;16647:17;16640:47;16704:131;16830:4;16704:131;:::i;:::-;16696:139;;16423:419;;;:::o;16848:243::-;16988:34;16984:1;16976:6;16972:14;16965:58;17057:26;17052:2;17044:6;17040:15;17033:51;16848:243;:::o;17097:366::-;17239:3;17260:67;17324:2;17319:3;17260:67;:::i;:::-;17253:74;;17336:93;17425:3;17336:93;:::i;:::-;17454:2;17449:3;17445:12;17438:19;;17097:366;;;:::o;17469:419::-;17635:4;17673:2;17662:9;17658:18;17650:26;;17722:9;17716:4;17712:20;17708:1;17697:9;17693:17;17686:47;17750:131;17876:4;17750:131;:::i;:::-;17742:139;;17469:419;;;:::o;17894:225::-;18034:34;18030:1;18022:6;18018:14;18011:58;18103:8;18098:2;18090:6;18086:15;18079:33;17894:225;:::o;18125:366::-;18267:3;18288:67;18352:2;18347:3;18288:67;:::i;:::-;18281:74;;18364:93;18453:3;18364:93;:::i;:::-;18482:2;18477:3;18473:12;18466:19;;18125:366;;;:::o;18497:419::-;18663:4;18701:2;18690:9;18686:18;18678:26;;18750:9;18744:4;18740:20;18736:1;18725:9;18721:17;18714:47;18778:131;18904:4;18778:131;:::i;:::-;18770:139;;18497:419;;;:::o;18922:180::-;18970:77;18967:1;18960:88;19067:4;19064:1;19057:15;19091:4;19088:1;19081:15;19108:305;19148:3;19167:20;19185:1;19167:20;:::i;:::-;19162:25;;19201:20;19219:1;19201:20;:::i;:::-;19196:25;;19355:1;19287:66;19283:74;19280:1;19277:81;19274:107;;;19361:18;;:::i;:::-;19274:107;19405:1;19402;19398:9;19391:16;;19108:305;;;;:::o;19419:230::-;19559:34;19555:1;19547:6;19543:14;19536:58;19628:13;19623:2;19615:6;19611:15;19604:38;19419:230;:::o;19655:366::-;19797:3;19818:67;19882:2;19877:3;19818:67;:::i;:::-;19811:74;;19894:93;19983:3;19894:93;:::i;:::-;20012:2;20007:3;20003:12;19996:19;;19655:366;;;:::o;20027:419::-;20193:4;20231:2;20220:9;20216:18;20208:26;;20280:9;20274:4;20270:20;20266:1;20255:9;20251:17;20244:47;20308:131;20434:4;20308:131;:::i;:::-;20300:139;;20027:419;;;:::o;20452:60::-;20480:3;20501:5;20494:12;;20452:60;;;:::o;20518:142::-;20568:9;20601:53;20619:34;20628:24;20646:5;20628:24;:::i;:::-;20619:34;:::i;:::-;20601:53;:::i;:::-;20588:66;;20518:142;;;:::o;20666:126::-;20716:9;20749:37;20780:5;20749:37;:::i;:::-;20736:50;;20666:126;;;:::o;20798:134::-;20856:9;20889:37;20920:5;20889:37;:::i;:::-;20876:50;;20798:134;;;:::o;20938:147::-;21033:45;21072:5;21033:45;:::i;:::-;21028:3;21021:58;20938:147;;:::o;21091:348::-;21220:4;21258:2;21247:9;21243:18;21235:26;;21271:79;21347:1;21336:9;21332:17;21323:6;21271:79;:::i;:::-;21360:72;21428:2;21417:9;21413:18;21404:6;21360:72;:::i;:::-;21091:348;;;;;:::o;21445:236::-;21585:34;21581:1;21573:6;21569:14;21562:58;21654:19;21649:2;21641:6;21637:15;21630:44;21445:236;:::o;21687:366::-;21829:3;21850:67;21914:2;21909:3;21850:67;:::i;:::-;21843:74;;21926:93;22015:3;21926:93;:::i;:::-;22044:2;22039:3;22035:12;22028:19;;21687:366;;;:::o;22059:419::-;22225:4;22263:2;22252:9;22248:18;22240:26;;22312:9;22306:4;22302:20;22298:1;22287:9;22283:17;22276:47;22340:131;22466:4;22340:131;:::i;:::-;22332:139;;22059:419;;;:::o;22484:182::-;22624:34;22620:1;22612:6;22608:14;22601:58;22484:182;:::o;22672:366::-;22814:3;22835:67;22899:2;22894:3;22835:67;:::i;:::-;22828:74;;22911:93;23000:3;22911:93;:::i;:::-;23029:2;23024:3;23020:12;23013:19;;22672:366;;;:::o;23044:419::-;23210:4;23248:2;23237:9;23233:18;23225:26;;23297:9;23291:4;23287:20;23283:1;23272:9;23268:17;23261:47;23325:131;23451:4;23325:131;:::i;:::-;23317:139;;23044:419;;;:::o;23469:293::-;23609:34;23605:1;23597:6;23593:14;23586:58;23678:34;23673:2;23665:6;23661:15;23654:59;23747:7;23742:2;23734:6;23730:15;23723:32;23469:293;:::o;23768:366::-;23910:3;23931:67;23995:2;23990:3;23931:67;:::i;:::-;23924:74;;24007:93;24096:3;24007:93;:::i;:::-;24125:2;24120:3;24116:12;24109:19;;23768:366;;;:::o;24140:419::-;24306:4;24344:2;24333:9;24329:18;24321:26;;24393:9;24387:4;24383:20;24379:1;24368:9;24364:17;24357:47;24421:131;24547:4;24421:131;:::i;:::-;24413:139;;24140:419;;;:::o;24565:293::-;24705:34;24701:1;24693:6;24689:14;24682:58;24774:34;24769:2;24761:6;24757:15;24750:59;24843:7;24838:2;24830:6;24826:15;24819:32;24565:293;:::o;24864:366::-;25006:3;25027:67;25091:2;25086:3;25027:67;:::i;:::-;25020:74;;25103:93;25192:3;25103:93;:::i;:::-;25221:2;25216:3;25212:12;25205:19;;24864:366;;;:::o;25236:419::-;25402:4;25440:2;25429:9;25425:18;25417:26;;25489:9;25483:4;25479:20;25475:1;25464:9;25460:17;25453:47;25517:131;25643:4;25517:131;:::i;:::-;25509:139;;25236:419;;;:::o;25661:233::-;25700:3;25723:24;25741:5;25723:24;:::i;:::-;25714:33;;25769:66;25762:5;25759:77;25756:103;;;25839:18;;:::i;:::-;25756:103;25886:1;25879:5;25875:13;25868:20;;25661:233;;;:::o;25900:143::-;25957:5;25988:6;25982:13;25973:22;;26004:33;26031:5;26004:33;:::i;:::-;25900:143;;;;:::o;26049:351::-;26119:6;26168:2;26156:9;26147:7;26143:23;26139:32;26136:119;;;26174:79;;:::i;:::-;26136:119;26294:1;26319:64;26375:7;26366:6;26355:9;26351:22;26319:64;:::i;:::-;26309:74;;26265:128;26049:351;;;;:::o;26406:228::-;26546:34;26542:1;26534:6;26530:14;26523:58;26615:11;26610:2;26602:6;26598:15;26591:36;26406:228;:::o;26640:366::-;26782:3;26803:67;26867:2;26862:3;26803:67;:::i;:::-;26796:74;;26879:93;26968:3;26879:93;:::i;:::-;26997:2;26992:3;26988:12;26981:19;;26640:366;;;:::o;27012:419::-;27178:4;27216:2;27205:9;27201:18;27193:26;;27265:9;27259:4;27255:20;27251:1;27240:9;27236:17;27229:47;27293:131;27419:4;27293:131;:::i;:::-;27285:139;;27012:419;;;:::o;27437:229::-;27577:34;27573:1;27565:6;27561:14;27554:58;27646:12;27641:2;27633:6;27629:15;27622:37;27437:229;:::o;27672:366::-;27814:3;27835:67;27899:2;27894:3;27835:67;:::i;:::-;27828:74;;27911:93;28000:3;27911:93;:::i;:::-;28029:2;28024:3;28020:12;28013:19;;27672:366;;;:::o;28044:419::-;28210:4;28248:2;28237:9;28233:18;28225:26;;28297:9;28291:4;28287:20;28283:1;28272:9;28268:17;28261:47;28325:131;28451:4;28325:131;:::i;:::-;28317:139;;28044:419;;;:::o;28469:180::-;28517:77;28514:1;28507:88;28614:4;28611:1;28604:15;28638:4;28635:1;28628:15;28655:168;28795:20;28791:1;28783:6;28779:14;28772:44;28655:168;:::o;28829:366::-;28971:3;28992:67;29056:2;29051:3;28992:67;:::i;:::-;28985:74;;29068:93;29157:3;29068:93;:::i;:::-;29186:2;29181:3;29177:12;29170:19;;28829:366;;;:::o;29201:419::-;29367:4;29405:2;29394:9;29390:18;29382:26;;29454:9;29448:4;29444:20;29440:1;29429:9;29425:17;29418:47;29482:131;29608:4;29482:131;:::i;:::-;29474:139;;29201:419;;;:::o;29626:220::-;29766:34;29762:1;29754:6;29750:14;29743:58;29835:3;29830:2;29822:6;29818:15;29811:28;29626:220;:::o;29852:366::-;29994:3;30015:67;30079:2;30074:3;30015:67;:::i;:::-;30008:74;;30091:93;30180:3;30091:93;:::i;:::-;30209:2;30204:3;30200:12;30193:19;;29852:366;;;:::o;30224:419::-;30390:4;30428:2;30417:9;30413:18;30405:26;;30477:9;30471:4;30467:20;30463:1;30452:9;30448:17;30441:47;30505:131;30631:4;30505:131;:::i;:::-;30497:139;;30224:419;;;:::o;30649:246::-;30789:34;30785:1;30777:6;30773:14;30766:58;30858:29;30853:2;30845:6;30841:15;30834:54;30649:246;:::o;30901:366::-;31043:3;31064:67;31128:2;31123:3;31064:67;:::i;:::-;31057:74;;31140:93;31229:3;31140:93;:::i;:::-;31258:2;31253:3;31249:12;31242:19;;30901:366;;;:::o;31273:419::-;31439:4;31477:2;31466:9;31462:18;31454:26;;31526:9;31520:4;31516:20;31512:1;31501:9;31497:17;31490:47;31554:131;31680:4;31554:131;:::i;:::-;31546:139;;31273:419;;;:::o;31698:312::-;31838:34;31834:1;31826:6;31822:14;31815:58;31907:34;31902:2;31894:6;31890:15;31883:59;31976:26;31971:2;31963:6;31959:15;31952:51;31698:312;:::o;32016:366::-;32158:3;32179:67;32243:2;32238:3;32179:67;:::i;:::-;32172:74;;32255:93;32344:3;32255:93;:::i;:::-;32373:2;32368:3;32364:12;32357:19;;32016:366;;;:::o;32388:419::-;32554:4;32592:2;32581:9;32577:18;32569:26;;32641:9;32635:4;32631:20;32627:1;32616:9;32612:17;32605:47;32669:131;32795:4;32669:131;:::i;:::-;32661:139;;32388:419;;;:::o;32813:224::-;32953:34;32949:1;32941:6;32937:14;32930:58;33022:7;33017:2;33009:6;33005:15;32998:32;32813:224;:::o;33043:366::-;33185:3;33206:67;33270:2;33265:3;33206:67;:::i;:::-;33199:74;;33282:93;33371:3;33282:93;:::i;:::-;33400:2;33395:3;33391:12;33384:19;;33043:366;;;:::o;33415:419::-;33581:4;33619:2;33608:9;33604:18;33596:26;;33668:9;33662:4;33658:20;33654:1;33643:9;33639:17;33632:47;33696:131;33822:4;33696:131;:::i;:::-;33688:139;;33415:419;;;:::o;33840:234::-;33980:34;33976:1;33968:6;33964:14;33957:58;34049:17;34044:2;34036:6;34032:15;34025:42;33840:234;:::o;34080:366::-;34222:3;34243:67;34307:2;34302:3;34243:67;:::i;:::-;34236:74;;34319:93;34408:3;34319:93;:::i;:::-;34437:2;34432:3;34428:12;34421:19;;34080:366;;;:::o;34452:419::-;34618:4;34656:2;34645:9;34641:18;34633:26;;34705:9;34699:4;34695:20;34691:1;34680:9;34676:17;34669:47;34733:131;34859:4;34733:131;:::i;:::-;34725:139;;34452:419;;;:::o;34877:148::-;34979:11;35016:3;35001:18;;34877:148;;;;:::o;35031:377::-;35137:3;35165:39;35198:5;35165:39;:::i;:::-;35220:89;35302:6;35297:3;35220:89;:::i;:::-;35213:96;;35318:52;35363:6;35358:3;35351:4;35344:5;35340:16;35318:52;:::i;:::-;35395:6;35390:3;35386:16;35379:23;;35141:267;35031:377;;;;:::o;35414:435::-;35594:3;35616:95;35707:3;35698:6;35616:95;:::i;:::-;35609:102;;35728:95;35819:3;35810:6;35728:95;:::i;:::-;35721:102;;35840:3;35833:10;;35414:435;;;;;:::o;35855:226::-;35995:34;35991:1;35983:6;35979:14;35972:58;36064:9;36059:2;36051:6;36047:15;36040:34;35855:226;:::o;36087:366::-;36229:3;36250:67;36314:2;36309:3;36250:67;:::i;:::-;36243:74;;36326:93;36415:3;36326:93;:::i;:::-;36444:2;36439:3;36435:12;36428:19;;36087:366;;;:::o;36459:419::-;36625:4;36663:2;36652:9;36648:18;36640:26;;36712:9;36706:4;36702:20;36698:1;36687:9;36683:17;36676:47;36740:131;36866:4;36740:131;:::i;:::-;36732:139;;36459:419;;;:::o;36884:225::-;37024:34;37020:1;37012:6;37008:14;37001:58;37093:8;37088:2;37080:6;37076:15;37069:33;36884:225;:::o;37115:366::-;37257:3;37278:67;37342:2;37337:3;37278:67;:::i;:::-;37271:74;;37354:93;37443:3;37354:93;:::i;:::-;37472:2;37467:3;37463:12;37456:19;;37115:366;;;:::o;37487:419::-;37653:4;37691:2;37680:9;37676:18;37668:26;;37740:9;37734:4;37730:20;37726:1;37715:9;37711:17;37704:47;37768:131;37894:4;37768:131;:::i;:::-;37760:139;;37487:419;;;:::o;37912:348::-;37952:7;37975:20;37993:1;37975:20;:::i;:::-;37970:25;;38009:20;38027:1;38009:20;:::i;:::-;38004:25;;38197:1;38129:66;38125:74;38122:1;38119:81;38114:1;38107:9;38100:17;38096:105;38093:131;;;38204:18;;:::i;:::-;38093:131;38252:1;38249;38245:9;38234:20;;37912:348;;;;:::o;38266:180::-;38314:77;38311:1;38304:88;38411:4;38408:1;38401:15;38435:4;38432:1;38425:15;38452:185;38492:1;38509:20;38527:1;38509:20;:::i;:::-;38504:25;;38543:20;38561:1;38543:20;:::i;:::-;38538:25;;38582:1;38572:35;;38587:18;;:::i;:::-;38572:35;38629:1;38626;38622:9;38617:14;;38452:185;;;;:::o;38643:191::-;38683:4;38703:20;38721:1;38703:20;:::i;:::-;38698:25;;38737:20;38755:1;38737:20;:::i;:::-;38732:25;;38776:1;38773;38770:8;38767:34;;;38781:18;;:::i;:::-;38767:34;38826:1;38823;38819:9;38811:17;;38643:191;;;;:::o;38840:179::-;38980:31;38976:1;38968:6;38964:14;38957:55;38840:179;:::o;39025:366::-;39167:3;39188:67;39252:2;39247:3;39188:67;:::i;:::-;39181:74;;39264:93;39353:3;39264:93;:::i;:::-;39382:2;39377:3;39373:12;39366:19;;39025:366;;;:::o;39397:419::-;39563:4;39601:2;39590:9;39586:18;39578:26;;39650:9;39644:4;39640:20;39636:1;39625:9;39621:17;39614:47;39678:131;39804:4;39678:131;:::i;:::-;39670:139;;39397:419;;;:::o;39822:147::-;39923:11;39960:3;39945:18;;39822:147;;;;:::o;39975:114::-;;:::o;40095:398::-;40254:3;40275:83;40356:1;40351:3;40275:83;:::i;:::-;40268:90;;40367:93;40456:3;40367:93;:::i;:::-;40485:1;40480:3;40476:11;40469:18;;40095:398;;;:::o;40499:379::-;40683:3;40705:147;40848:3;40705:147;:::i;:::-;40698:154;;40869:3;40862:10;;40499:379;;;:::o;40884:245::-;41024:34;41020:1;41012:6;41008:14;41001:58;41093:28;41088:2;41080:6;41076:15;41069:53;40884:245;:::o;41135:366::-;41277:3;41298:67;41362:2;41357:3;41298:67;:::i;:::-;41291:74;;41374:93;41463:3;41374:93;:::i;:::-;41492:2;41487:3;41483:12;41476:19;;41135:366;;;:::o;41507:419::-;41673:4;41711:2;41700:9;41696:18;41688:26;;41760:9;41754:4;41750:20;41746:1;41735:9;41731:17;41724:47;41788:131;41914:4;41788:131;:::i;:::-;41780:139;;41507:419;;;:::o;41932:231::-;42072:34;42068:1;42060:6;42056:14;42049:58;42141:14;42136:2;42128:6;42124:15;42117:39;41932:231;:::o;42169:366::-;42311:3;42332:67;42396:2;42391:3;42332:67;:::i;:::-;42325:74;;42408:93;42497:3;42408:93;:::i;:::-;42526:2;42521:3;42517:12;42510:19;;42169:366;;;:::o;42541:419::-;42707:4;42745:2;42734:9;42730:18;42722:26;;42794:9;42788:4;42784:20;42780:1;42769:9;42765:17;42758:47;42822:131;42948:4;42822:131;:::i;:::-;42814:139;;42541:419;;;:::o;42966:228::-;43106:34;43102:1;43094:6;43090:14;43083:58;43175:11;43170:2;43162:6;43158:15;43151:36;42966:228;:::o;43200:366::-;43342:3;43363:67;43427:2;43422:3;43363:67;:::i;:::-;43356:74;;43439:93;43528:3;43439:93;:::i;:::-;43557:2;43552:3;43548:12;43541:19;;43200:366;;;:::o;43572:419::-;43738:4;43776:2;43765:9;43761:18;43753:26;;43825:9;43819:4;43815:20;43811:1;43800:9;43796:17;43789:47;43853:131;43979:4;43853:131;:::i;:::-;43845:139;;43572:419;;;:::o;43997:223::-;44137:34;44133:1;44125:6;44121:14;44114:58;44206:6;44201:2;44193:6;44189:15;44182:31;43997:223;:::o;44226:366::-;44368:3;44389:67;44453:2;44448:3;44389:67;:::i;:::-;44382:74;;44465:93;44554:3;44465:93;:::i;:::-;44583:2;44578:3;44574:12;44567:19;;44226:366;;;:::o;44598:419::-;44764:4;44802:2;44791:9;44787:18;44779:26;;44851:9;44845:4;44841:20;44837:1;44826:9;44822:17;44815:47;44879:131;45005:4;44879:131;:::i;:::-;44871:139;;44598:419;;;:::o;45023:175::-;45163:27;45159:1;45151:6;45147:14;45140:51;45023:175;:::o;45204:366::-;45346:3;45367:67;45431:2;45426:3;45367:67;:::i;:::-;45360:74;;45443:93;45532:3;45443:93;:::i;:::-;45561:2;45556:3;45552:12;45545:19;;45204:366;;;:::o;45576:419::-;45742:4;45780:2;45769:9;45765:18;45757:26;;45829:9;45823:4;45819:20;45815:1;45804:9;45800:17;45793:47;45857:131;45983:4;45857:131;:::i;:::-;45849:139;;45576:419;;;:::o;46001:237::-;46141:34;46137:1;46129:6;46125:14;46118:58;46210:20;46205:2;46197:6;46193:15;46186:45;46001:237;:::o;46244:366::-;46386:3;46407:67;46471:2;46466:3;46407:67;:::i;:::-;46400:74;;46483:93;46572:3;46483:93;:::i;:::-;46601:2;46596:3;46592:12;46585:19;;46244:366;;;:::o;46616:419::-;46782:4;46820:2;46809:9;46805:18;46797:26;;46869:9;46863:4;46859:20;46855:1;46844:9;46840:17;46833:47;46897:131;47023:4;46897:131;:::i;:::-;46889:139;;46616:419;;;:::o;47041:176::-;47073:1;47090:20;47108:1;47090:20;:::i;:::-;47085:25;;47124:20;47142:1;47124:20;:::i;:::-;47119:25;;47163:1;47153:35;;47168:18;;:::i;:::-;47153:35;47209:1;47206;47202:9;47197:14;;47041:176;;;;:::o;47223:137::-;47277:5;47308:6;47302:13;47293:22;;47324:30;47348:5;47324:30;:::i;:::-;47223:137;;;;:::o;47366:345::-;47433:6;47482:2;47470:9;47461:7;47457:23;47453:32;47450:119;;;47488:79;;:::i;:::-;47450:119;47608:1;47633:61;47686:7;47677:6;47666:9;47662:22;47633:61;:::i;:::-;47623:71;;47579:125;47366:345;;;;:::o;47717:229::-;47857:34;47853:1;47845:6;47841:14;47834:58;47926:12;47921:2;47913:6;47909:15;47902:37;47717:229;:::o;47952:366::-;48094:3;48115:67;48179:2;48174:3;48115:67;:::i;:::-;48108:74;;48191:93;48280:3;48191:93;:::i;:::-;48309:2;48304:3;48300:12;48293:19;;47952:366;;;:::o;48324:419::-;48490:4;48528:2;48517:9;48513:18;48505:26;;48577:9;48571:4;48567:20;48563:1;48552:9;48548:17;48541:47;48605:131;48731:4;48605:131;:::i;:::-;48597:139;;48324:419;;;:::o;48749:98::-;48800:6;48834:5;48828:12;48818:22;;48749:98;;;:::o;48853:168::-;48936:11;48970:6;48965:3;48958:19;49010:4;49005:3;49001:14;48986:29;;48853:168;;;;:::o;49027:360::-;49113:3;49141:38;49173:5;49141:38;:::i;:::-;49195:70;49258:6;49253:3;49195:70;:::i;:::-;49188:77;;49274:52;49319:6;49314:3;49307:4;49300:5;49296:16;49274:52;:::i;:::-;49351:29;49373:6;49351:29;:::i;:::-;49346:3;49342:39;49335:46;;49117:270;49027:360;;;;:::o;49393:640::-;49588:4;49626:3;49615:9;49611:19;49603:27;;49640:71;49708:1;49697:9;49693:17;49684:6;49640:71;:::i;:::-;49721:72;49789:2;49778:9;49774:18;49765:6;49721:72;:::i;:::-;49803;49871:2;49860:9;49856:18;49847:6;49803:72;:::i;:::-;49922:9;49916:4;49912:20;49907:2;49896:9;49892:18;49885:48;49950:76;50021:4;50012:6;49950:76;:::i;:::-;49942:84;;49393:640;;;;;;;:::o;50039:141::-;50095:5;50126:6;50120:13;50111:22;;50142:32;50168:5;50142:32;:::i;:::-;50039:141;;;;:::o;50186:349::-;50255:6;50304:2;50292:9;50283:7;50279:23;50275:32;50272:119;;;50310:79;;:::i;:::-;50272:119;50430:1;50455:63;50510:7;50501:6;50490:9;50486:22;50455:63;:::i;:::-;50445:73;;50401:127;50186:349;;;;:::o;50541:182::-;50681:34;50677:1;50669:6;50665:14;50658:58;50541:182;:::o;50729:366::-;50871:3;50892:67;50956:2;50951:3;50892:67;:::i;:::-;50885:74;;50968:93;51057:3;50968:93;:::i;:::-;51086:2;51081:3;51077:12;51070:19;;50729:366;;;:::o;51101:419::-;51267:4;51305:2;51294:9;51290:18;51282:26;;51354:9;51348:4;51344:20;51340:1;51329:9;51325:17;51318:47;51382:131;51508:4;51382:131;:::i;:::-;51374:139;;51101:419;;;:::o;51526:178::-;51666:30;51662:1;51654:6;51650:14;51643:54;51526:178;:::o;51710:366::-;51852:3;51873:67;51937:2;51932:3;51873:67;:::i;:::-;51866:74;;51949:93;52038:3;51949:93;:::i;:::-;52067:2;52062:3;52058:12;52051:19;;51710:366;;;:::o;52082:419::-;52248:4;52286:2;52275:9;52271:18;52263:26;;52335:9;52329:4;52325:20;52321:1;52310:9;52306:17;52299:47;52363:131;52489:4;52363:131;:::i;:::-;52355:139;;52082:419;;;:::o;52507:225::-;52647:34;52643:1;52635:6;52631:14;52624:58;52716:8;52711:2;52703:6;52699:15;52692:33;52507:225;:::o;52738:366::-;52880:3;52901:67;52965:2;52960:3;52901:67;:::i;:::-;52894:74;;52977:93;53066:3;52977:93;:::i;:::-;53095:2;53090:3;53086:12;53079:19;;52738:366;;;:::o;53110:419::-;53276:4;53314:2;53303:9;53299:18;53291:26;;53363:9;53357:4;53353:20;53349:1;53338:9;53334:17;53327:47;53391:131;53517:4;53391:131;:::i;:::-;53383:139;;53110:419;;;:::o;53535:179::-;53675:31;53671:1;53663:6;53659:14;53652:55;53535:179;:::o;53720:366::-;53862:3;53883:67;53947:2;53942:3;53883:67;:::i;:::-;53876:74;;53959:93;54048:3;53959:93;:::i;:::-;54077:2;54072:3;54068:12;54061:19;;53720:366;;;:::o;54092:419::-;54258:4;54296:2;54285:9;54281:18;54273:26;;54345:9;54339:4;54335:20;54331:1;54320:9;54316:17;54309:47;54373:131;54499:4;54373:131;:::i;:::-;54365:139;;54092:419;;;:::o;54517:373::-;54621:3;54649:38;54681:5;54649:38;:::i;:::-;54703:88;54784:6;54779:3;54703:88;:::i;:::-;54696:95;;54800:52;54845:6;54840:3;54833:4;54826:5;54822:16;54800:52;:::i;:::-;54877:6;54872:3;54868:16;54861:23;;54625:265;54517:373;;;;:::o;54896:271::-;55026:3;55048:93;55137:3;55128:6;55048:93;:::i;:::-;55041:100;;55158:3;55151:10;;54896:271;;;;:::o

Swarm Source

ipfs://1094a7723e3dc8678084eea3f82ed272c412ce7a4b508f5fe0913384b295ff9e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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