ETH Price: $3,269.96 (+0.14%)
Gas: 31 Gwei

Token

The Adventurers Weapon (Weapon)
 

Overview

Max Total Supply

1,391 Weapon

Holders

628

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
confusedhawk.eth
Balance
3 Weapon
0xc212788d35d3acafdf21b5cde975bcf6d7309a26
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:
Weapon

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-28
*/

/**
 *Submitted for verification at Etherscan.io on 2021-07-27
*/

// SPDX-License-Identifier: MIT

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 no longer needed starting with Solidity 0.8. 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. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * 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;
    }
    }
}


pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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




pragma solidity ^0.8.0;

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

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

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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


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}. 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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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, true);

        _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, true);

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

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

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

    function _burnSave(address owner, uint256 tokenId) internal virtual {

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

        // 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, true);

        // 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 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId, bool isDelete) internal virtual { }
}

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId, bool isDelete) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId, isDelete);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0) && isDelete) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from && isDelete) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

pragma solidity ^0.8.0;
abstract contract AdvText {
  function ownerOf(uint256 tokenId) public virtual view returns (address);
  function tokenOfOwnerByIndex(address owner, uint256 index) public virtual view returns (uint256);
  function balanceOf(address owner) external virtual view returns (uint256 balance);
}

contract Weapon is ERC721Enumerable, Ownable{
    using SafeMath for uint256;
    using Address for address;
    using Strings for uint256;

    address public PFPContract;
    uint256 public NFT_PRICE = 0; // 0 ETH
    uint public constant MAX_NFT_PURCHASE = 50;
    uint256 public MAX_SUPPLY = 5000;
    bool public saleIsActive = false;
    bool public composeIsActive = false;
      
    address public  AdvTextContractAddress;

    uint256 public startingIndex;
    uint256 public startingIndexBlock;

    string private _baseURIExtended;
    mapping (uint256 => string) _tokenURIs;

    constructor() ERC721("The Adventurers Weapon","Weapon"){
    }

    function setPFPContractAddress(address contractAddress) public onlyOwner {
        PFPContract = contractAddress;
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function flipComposeState() public onlyOwner {
        composeIsActive = !composeIsActive;
    }
    
    function setMintPrice(uint price) external onlyOwner {
        NFT_PRICE = price;
    }

    function setMaxHeros(uint maxhero) external onlyOwner {
        MAX_SUPPLY = maxhero;
    }

    function setTextContractAddress(address contractAddress) public onlyOwner {
        AdvTextContractAddress = contractAddress;
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function reserveTokens(uint256 num) public onlyOwner {
        uint supply = totalSupply();
        uint i;
        for (i = 0; i < num; i++) {
            _safeMint(msg.sender, supply + i);
        }

        if (startingIndexBlock == 0) {
            startingIndexBlock = block.number;
        }
    }

    function trySetStartingIndexBlock() private {
        if (
            startingIndexBlock == 0 &&
            totalSupply() == MAX_SUPPLY)
        {
            startingIndexBlock = block.number;
        }
    }
      
    
    function mintbyowner(address owner, uint256 tokenId) public onlyOwner {
      require(saleIsActive, "Not allowed");
         
        require(!_exists(tokenId), "Token already minted");
        require(tokenId<= MAX_SUPPLY, "Token ID too high");
        _mint(owner, tokenId);
    }
    
function Mintweapon(uint256 tokenId) public {
    require(saleIsActive, "Sale must be active to mint a weapon");
    require(totalSupply() < MAX_SUPPLY, "Purchase would exceed max supply of weapon");
    require(tokenId < MAX_SUPPLY, "Requested tokenId exceeds upper bound");
    

    AdvText advText = AdvText(AdvTextContractAddress);

    require(advText.ownerOf(tokenId) == msg.sender, "Must own the Text for requested tokenId to mint a weapon");
    require(!_exists(tokenId), "Token already minted");
            
    _safeMint(msg.sender, tokenId);
    trySetStartingIndexBlock();
  }

  function Mintweapons(uint256 startingIndex, uint256 numDHeros) public {
    require(saleIsActive, "Sale must be active to mint a weapon");
    require(numDHeros > 0, "Must mint at least one weapon");
    require(numDHeros <= MAX_NFT_PURCHASE, "Cannot mint more than 50 weapon at once");

    AdvText advText = AdvText(AdvTextContractAddress);

    uint balance = advText.balanceOf(msg.sender);
    require(balance > 0, "Must hold at least one Text to mint a weapon");
    require(balance >= startingIndex + numDHeros, "Must hold at least as many Text as the number of weapons you intend to mint");
    
    for(uint i = 0; i < balance && i < numDHeros && i < MAX_NFT_PURCHASE; i++) {
      require(totalSupply() < MAX_SUPPLY, "Cannot exceed max supply of weapon.");
      uint tokenId = advText.tokenOfOwnerByIndex(msg.sender, i + startingIndex);
      if (!_exists(tokenId)) {
        _safeMint(msg.sender, tokenId);
      }
    }

    trySetStartingIndexBlock();
  }
  
    function compose(uint256 useTokenId, uint256 PFPtokenId, uint256 newPFPtokenId) public {
        require(composeIsActive, "Not allowed");
        require(PFPContract != address(0), "PFP contract address need be set");

       address from = msg.sender;
        AdventurersPFP pfp = AdventurersPFP(PFPContract);
        bool result = pfp.composePFP(from, useTokenId, PFPtokenId, newPFPtokenId);
        require(result, "PFP compose failed");
        
        _burnSave(msg.sender, useTokenId);

    }

    function calcStartingIndex() public onlyOwner {
        require(startingIndex == 0, "Starting index has already been set");
        require(startingIndexBlock != 0, "Starting index has not been set yet");

        startingIndex = uint(blockhash(startingIndexBlock)) % MAX_SUPPLY;
        // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
        if(block.number.sub(startingIndexBlock) > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % MAX_SUPPLY;
        }

        // To prevent original sequence
        if (startingIndex == 0) {
            startingIndex = startingIndex.add(1);
        }
    }

    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");
        startingIndexBlock = block.number;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIExtended;
    }

    // Sets base URI for all tokens, only able to be called by contract owner
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIExtended = baseURI_;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }
}

interface AdventurersPFP {
    function composePFP(address owner, uint256 WeapontokenId,uint256 PFPtokenId, uint256 newPFPtokenId) external returns (bool);
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"AdvTextContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mintweapon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startingIndex","type":"uint256"},{"internalType":"uint256","name":"numDHeros","type":"uint256"}],"name":"Mintweapons","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PFPContract","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"calcStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"useTokenId","type":"uint256"},{"internalType":"uint256","name":"PFPtokenId","type":"uint256"},{"internalType":"uint256","name":"newPFPtokenId","type":"uint256"}],"name":"compose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"composeIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipComposeState","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintbyowner","outputs":[],"stateMutability":"nonpayable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserveTokens","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":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxhero","type":"uint256"}],"name":"setMaxHeros","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setPFPContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setTextContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c55611388600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055503480156200005257600080fd5b506040518060400160405280601681526020017f54686520416476656e74757265727320576561706f6e000000000000000000008152506040518060400160405280600681526020017f576561706f6e00000000000000000000000000000000000000000000000000008152508160009080519060200190620000d7929190620001b2565b508060019080519060200190620000f0929190620001b2565b505050600062000105620001aa60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002c7565b600033905090565b828054620001c09062000262565b90600052602060002090601f016020900481019282620001e4576000855562000230565b82601f10620001ff57805160ff191683800117855562000230565b8280016001018555821562000230579182015b828111156200022f57825182559160200191906001019062000212565b5b5090506200023f919062000243565b5090565b5b808211156200025e57600081600090555060010162000244565b5090565b600060028204905060018216806200027b57607f821691505b6020821081141562000292576200029162000298565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6155f480620002d76000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c8063715018a611610151578063c87b56dd116100c3578063e985e9c511610087578063e985e9c5146106c4578063eb7a3333146106f4578063eb8d2444146106fe578063ec0870451461071c578063f2fde38b14610738578063f4a0a5281461075457610269565b8063c87b56dd14610632578063cb774d4714610662578063d031370b14610680578063e13f351a1461069c578063e36d6498146106a657610269565b80638e8d4644116101155780638e8d46441461058457806395d89b41146105a2578063a22cb465146105c0578063b7d16640146105dc578063b88d4fde146105fa578063c030bc351461061657610269565b8063715018a61461051a5780637d17fcbe146105245780638490754a1461052e578063888a14ec1461054a5780638da5cb5b1461056657610269565b806334918dfd116101ea57806355f804b3116101ae57806355f804b3146104465780635a67728c146104625780636352211e14610480578063676dd563146104b05780636ab84064146104ce57806370a08231146104ea57610269565b806334918dfd146103ca5780633ccfd60b146103d457806342842e0e146103de57806343b4501b146103fa5780634f6ccce71461041657610269565b806318160ddd1161023157806318160ddd1461032657806323b872dd14610344578063286a84e4146103605780632f745c591461037c57806332cb6b0c146103ac57610269565b806301ffc9a71461026e578063020b39cc1461029e57806306fdde03146102bc578063081812fc146102da578063095ea7b31461030a575b600080fd5b61028860048036038101906102839190613d3d565b610770565b6040516102959190614cec565b60405180910390f35b6102a66107ea565b6040516102b39190615189565b60405180910390f35b6102c46107ef565b6040516102d19190614d07565b60405180910390f35b6102f460048036038101906102ef9190613dd0565b610881565b6040516103019190614c17565b60405180910390f35b610324600480360381019061031f9190613cd8565b610906565b005b61032e610a1e565b60405161033b9190615189565b60405180910390f35b61035e60048036038101906103599190613bd2565b610a2b565b005b61037a60048036038101906103759190613dd0565b610a8b565b005b61039660048036038101906103919190613cd8565b610b11565b6040516103a39190615189565b60405180910390f35b6103b4610bb6565b6040516103c19190615189565b60405180910390f35b6103d2610bbc565b005b6103dc610c64565b005b6103f860048036038101906103f39190613bd2565b610d2f565b005b610414600480360381019061040f9190613dd0565b610d4f565b005b610430600480360381019061042b9190613dd0565b610fa9565b60405161043d9190615189565b60405180910390f35b610460600480360381019061045b9190613d8f565b611040565b005b61046a6110d6565b6040516104779190614c17565b60405180910390f35b61049a60048036038101906104959190613dd0565b6110fc565b6040516104a79190614c17565b60405180910390f35b6104b86111ae565b6040516104c59190615189565b60405180910390f35b6104e860048036038101906104e39190613b44565b6111b4565b005b61050460048036038101906104ff9190613b44565b611274565b6040516105119190615189565b60405180910390f35b61052261132c565b005b61052c611469565b005b61054860048036038101906105439190613e22565b611533565b005b610564600480360381019061055f9190613e5e565b611890565b005b61056e611a84565b60405161057b9190614c17565b60405180910390f35b61058c611aae565b6040516105999190614c17565b60405180910390f35b6105aa611ad4565b6040516105b79190614d07565b60405180910390f35b6105da60048036038101906105d59190613c9c565b611b66565b005b6105e4611ce7565b6040516105f19190614cec565b60405180910390f35b610614600480360381019061060f9190613c21565b611cfa565b005b610630600480360381019061062b9190613cd8565b611d5c565b005b61064c60048036038101906106479190613dd0565b611ec3565b6040516106599190614d07565b60405180910390f35b61066a612036565b6040516106779190615189565b60405180910390f35b61069a60048036038101906106959190613dd0565b61203c565b005b6106a461210f565b005b6106ae61229c565b6040516106bb9190615189565b60405180910390f35b6106de60048036038101906106d99190613b96565b6122a2565b6040516106eb9190614cec565b60405180910390f35b6106fc612336565b005b6107066123de565b6040516107139190614cec565b60405180910390f35b61073660048036038101906107319190613b44565b6123f1565b005b610752600480360381019061074d9190613b44565b6124b1565b005b61076e60048036038101906107699190613dd0565b61265d565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107e357506107e2826126e3565b5b9050919050565b603281565b6060600080546107fe906153e9565b80601f016020809104026020016040519081016040528092919081815260200182805461082a906153e9565b80156108775780601f1061084c57610100808354040283529160200191610877565b820191906000526020600020905b81548152906001019060200180831161085a57829003601f168201915b5050505050905090565b600061088c826127c5565b6108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c290615009565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610911826110fc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610979906150c9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109a1612831565b73ffffffffffffffffffffffffffffffffffffffff1614806109d057506109cf816109ca612831565b6122a2565b5b610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690614ee9565b60405180910390fd5b610a198383612839565b505050565b6000600880549050905090565b610a3c610a36612831565b826128f2565b610a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a72906150e9565b60405180910390fd5b610a868383836129d0565b505050565b610a93612831565b73ffffffffffffffffffffffffffffffffffffffff16610ab1611a84565b73ffffffffffffffffffffffffffffffffffffffff1614610b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afe90615049565b60405180910390fd5b80600d8190555050565b6000610b1c83611274565b8210610b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5490614d69565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d5481565b610bc4612831565b73ffffffffffffffffffffffffffffffffffffffff16610be2611a84565b73ffffffffffffffffffffffffffffffffffffffff1614610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f90615049565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610c6c612831565b73ffffffffffffffffffffffffffffffffffffffff16610c8a611a84565b73ffffffffffffffffffffffffffffffffffffffff1614610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd790615049565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d2b573d6000803e3d6000fd5b5050565b610d4a83838360405180602001604052806000815250611cfa565b505050565b600e60009054906101000a900460ff16610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9590614f69565b60405180910390fd5b600d54610da9610a1e565b10610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090614dc9565b60405180910390fd5b600d548110610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490614ec9565b60405180910390fd5b6000600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401610ea49190615189565b60206040518083038186803b158015610ebc57600080fd5b505afa158015610ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef49190613b6d565b73ffffffffffffffffffffffffffffffffffffffff1614610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4190615109565b60405180910390fd5b610f53826127c5565b15610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a90614d49565b60405180910390fd5b610f9d3383612c2e565b610fa5612c4c565b5050565b6000610fb3610a1e565b8210610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90615129565b60405180910390fd5b6008828154811061102e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611048612831565b73ffffffffffffffffffffffffffffffffffffffff16611066611a84565b73ffffffffffffffffffffffffffffffffffffffff16146110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b390615049565b60405180910390fd5b80601190805190602001906110d2929190613929565b5050565b600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c90614f29565b60405180910390fd5b80915050919050565b600c5481565b6111bc612831565b73ffffffffffffffffffffffffffffffffffffffff166111da611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790615049565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc90614f09565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611334612831565b73ffffffffffffffffffffffffffffffffffffffff16611352611a84565b73ffffffffffffffffffffffffffffffffffffffff16146113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f90615049565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611471612831565b73ffffffffffffffffffffffffffffffffffffffff1661148f611a84565b73ffffffffffffffffffffffffffffffffffffffff16146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90615049565b60405180910390fd5b6000600f541461152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152190614ea9565b60405180910390fd5b43601081905550565b600e60009054906101000a900460ff16611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990614f69565b60405180910390fd5b600081116115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90614e69565b60405180910390fd5b6032811115611609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160090614f49565b60405180910390fd5b6000600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161166b9190614c17565b60206040518083038186803b15801561168357600080fd5b505afa158015611697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bb9190613df9565b905060008111611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790614e09565b60405180910390fd5b828461170c9190615278565b81101561174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590615089565b60405180910390fd5b60005b818110801561175f57508381105b801561176b5750603281105b1561188157600d5461177b610a1e565b106117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290615169565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff16632f745c593388856117e69190615278565b6040518363ffffffff1660e01b8152600401611803929190614c7e565b60206040518083038186803b15801561181b57600080fd5b505afa15801561182f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118539190613df9565b905061185e816127c5565b61186d5761186c3382612c2e565b5b5080806118799061541b565b915050611751565b5061188a612c4c565b50505050565b600e60019054906101000a900460ff166118df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d690615029565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890614f89565b60405180910390fd5b60003390506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166347dc3be3848888886040518563ffffffff1660e01b81526004016119de9493929190614ca7565b602060405180830381600087803b1580156119f857600080fd5b505af1158015611a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a309190613d14565b905080611a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6990614fa9565b60405180910390fd5b611a7c3387612c75565b505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054611ae3906153e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0f906153e9565b8015611b5c5780601f10611b3157610100808354040283529160200191611b5c565b820191906000526020600020905b815481529060010190602001808311611b3f57829003601f168201915b5050505050905090565b611b6e612831565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd390614e49565b60405180910390fd5b8060056000611be9612831565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c96612831565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cdb9190614cec565b60405180910390a35050565b600e60019054906101000a900460ff1681565b611d0b611d05612831565b836128f2565b611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d41906150e9565b60405180910390fd5b611d5684848484612d7b565b50505050565b611d64612831565b73ffffffffffffffffffffffffffffffffffffffff16611d82611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf90615049565b60405180910390fd5b600e60009054906101000a900460ff16611e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1e90615029565b60405180910390fd5b611e30816127c5565b15611e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6790614d49565b60405180910390fd5b600d54811115611eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eac90614fc9565b60405180910390fd5b611ebf8282612dd7565b5050565b6060611ece826127c5565b611f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f04906150a9565b60405180910390fd5b6000601260008481526020019081526020016000208054611f2d906153e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611f59906153e9565b8015611fa65780601f10611f7b57610100808354040283529160200191611fa6565b820191906000526020600020905b815481529060010190602001808311611f8957829003601f168201915b505050505090506000611fb7612fa7565b9050600081511415611fcd578192505050612031565b600082511115612002578082604051602001611fea929190614bf3565b60405160208183030381529060405292505050612031565b8061200c85613039565b60405160200161201d929190614bf3565b604051602081830303815290604052925050505b919050565b600f5481565b612044612831565b73ffffffffffffffffffffffffffffffffffffffff16612062611a84565b73ffffffffffffffffffffffffffffffffffffffff16146120b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120af90615049565b60405180910390fd5b60006120c2610a1e565b905060005b828110156120f7576120e43382846120df9190615278565b612c2e565b80806120ef9061541b565b9150506120c7565b6000601054141561210a57436010819055505b505050565b612117612831565b73ffffffffffffffffffffffffffffffffffffffff16612135611a84565b73ffffffffffffffffffffffffffffffffffffffff161461218b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218290615049565b60405180910390fd5b6000600f54146121d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c790615149565b60405180910390fd5b60006010541415612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d90614d29565b60405180910390fd5b600d546010544060001c61222a9190615464565b600f8190555060ff612247601054436131e690919063ffffffff16565b111561227257600d5460014361225d91906152ff565b4060001c61226b9190615464565b600f819055505b6000600f54141561229a576122936001600f546131fc90919063ffffffff16565b600f819055505b565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61233e612831565b73ffffffffffffffffffffffffffffffffffffffff1661235c611a84565b73ffffffffffffffffffffffffffffffffffffffff16146123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990615049565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600e60009054906101000a900460ff1681565b6123f9612831565b73ffffffffffffffffffffffffffffffffffffffff16612417611a84565b73ffffffffffffffffffffffffffffffffffffffff161461246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490615049565b60405180910390fd5b80600e60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6124b9612831565b73ffffffffffffffffffffffffffffffffffffffff166124d7611a84565b73ffffffffffffffffffffffffffffffffffffffff161461252d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252490615049565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561259d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259490614da9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612665612831565b73ffffffffffffffffffffffffffffffffffffffff16612683611a84565b73ffffffffffffffffffffffffffffffffffffffff16146126d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d090615049565b60405180910390fd5b80600c8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127ae57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127be57506127bd82613212565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128ac836110fc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128fd826127c5565b61293c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293390614e89565b60405180910390fd5b6000612947836110fc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129b657508373ffffffffffffffffffffffffffffffffffffffff1661299e84610881565b73ffffffffffffffffffffffffffffffffffffffff16145b806129c757506129c681856122a2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129f0826110fc565b73ffffffffffffffffffffffffffffffffffffffff1614612a46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3d90615069565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aad90614e29565b60405180910390fd5b612ac3838383600161327c565b612ace600082612839565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b1e91906152ff565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b759190615278565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612c488282604051806020016040528060008152506133a6565b5050565b6000601054148015612c665750600d54612c64610a1e565b145b15612c7357436010819055505b565b612c8382600083600061327c565b612c8e600082612839565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cde91906152ff565b925050819055506002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905580600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612d868484846129d0565b612d9284848484613401565b612dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc890614d89565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3e90614fe9565b60405180910390fd5b612e50816127c5565b15612e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8790614de9565b60405180910390fd5b612e9e60008383600161327c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eee9190615278565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606060118054612fb6906153e9565b80601f0160208091040260200160405190810160405280929190818152602001828054612fe2906153e9565b801561302f5780601f106130045761010080835404028352916020019161302f565b820191906000526020600020905b81548152906001019060200180831161301257829003601f168201915b5050505050905090565b60606000821415613081576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131e1565b600082905060005b600082146130b357808061309c9061541b565b915050600a826130ac91906152ce565b9150613089565b60008167ffffffffffffffff8111156130f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131275781602001600182028036833780820191505090505b5090505b600085146131da5760018261314091906152ff565b9150600a8561314f9190615464565b603061315b9190615278565b60f81b818381518110613197577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131d391906152ce565b945061312b565b8093505050505b919050565b600081836131f491906152ff565b905092915050565b6000818361320a9190615278565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61328884848484613598565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156132cb576132c68261359e565b61330a565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146133095761330884836135e7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156133435750805b156133565761335182613754565b6133a0565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561338f5750805b1561339f5761339e8383613897565b5b5b50505050565b6133b08383612dd7565b6133bd6000848484613401565b6133fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f390614d89565b60405180910390fd5b505050565b60006134228473ffffffffffffffffffffffffffffffffffffffff16613916565b1561358b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261344b612831565b8786866040518563ffffffff1660e01b815260040161346d9493929190614c32565b602060405180830381600087803b15801561348757600080fd5b505af19250505080156134b857506040513d601f19601f820116820180604052508101906134b59190613d66565b60015b61353b573d80600081146134e8576040519150601f19603f3d011682016040523d82523d6000602084013e6134ed565b606091505b50600081511415613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90614d89565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613590565b600190505b949350505050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135f484611274565b6135fe91906152ff565b90506000600760008481526020019081526020016000205490508181146136e3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061376891906152ff565b90506000600960008481526020019081526020016000205490506000600883815481106137be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613806577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061387b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006138a283611274565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613935906153e9565b90600052602060002090601f016020900481019282613957576000855561399e565b82601f1061397057805160ff191683800117855561399e565b8280016001018555821561399e579182015b8281111561399d578251825591602001919060010190613982565b5b5090506139ab91906139af565b5090565b5b808211156139c85760008160009055506001016139b0565b5090565b60006139df6139da846151d5565b6151a4565b9050828152602081018484840111156139f757600080fd5b613a028482856153a7565b509392505050565b6000613a1d613a1884615205565b6151a4565b905082815260208101848484011115613a3557600080fd5b613a408482856153a7565b509392505050565b600081359050613a5781615562565b92915050565b600081519050613a6c81615562565b92915050565b600081359050613a8181615579565b92915050565b600081519050613a9681615579565b92915050565b600081359050613aab81615590565b92915050565b600081519050613ac081615590565b92915050565b600082601f830112613ad757600080fd5b8135613ae78482602086016139cc565b91505092915050565b600082601f830112613b0157600080fd5b8135613b11848260208601613a0a565b91505092915050565b600081359050613b29816155a7565b92915050565b600081519050613b3e816155a7565b92915050565b600060208284031215613b5657600080fd5b6000613b6484828501613a48565b91505092915050565b600060208284031215613b7f57600080fd5b6000613b8d84828501613a5d565b91505092915050565b60008060408385031215613ba957600080fd5b6000613bb785828601613a48565b9250506020613bc885828601613a48565b9150509250929050565b600080600060608486031215613be757600080fd5b6000613bf586828701613a48565b9350506020613c0686828701613a48565b9250506040613c1786828701613b1a565b9150509250925092565b60008060008060808587031215613c3757600080fd5b6000613c4587828801613a48565b9450506020613c5687828801613a48565b9350506040613c6787828801613b1a565b925050606085013567ffffffffffffffff811115613c8457600080fd5b613c9087828801613ac6565b91505092959194509250565b60008060408385031215613caf57600080fd5b6000613cbd85828601613a48565b9250506020613cce85828601613a72565b9150509250929050565b60008060408385031215613ceb57600080fd5b6000613cf985828601613a48565b9250506020613d0a85828601613b1a565b9150509250929050565b600060208284031215613d2657600080fd5b6000613d3484828501613a87565b91505092915050565b600060208284031215613d4f57600080fd5b6000613d5d84828501613a9c565b91505092915050565b600060208284031215613d7857600080fd5b6000613d8684828501613ab1565b91505092915050565b600060208284031215613da157600080fd5b600082013567ffffffffffffffff811115613dbb57600080fd5b613dc784828501613af0565b91505092915050565b600060208284031215613de257600080fd5b6000613df084828501613b1a565b91505092915050565b600060208284031215613e0b57600080fd5b6000613e1984828501613b2f565b91505092915050565b60008060408385031215613e3557600080fd5b6000613e4385828601613b1a565b9250506020613e5485828601613b1a565b9150509250929050565b600080600060608486031215613e7357600080fd5b6000613e8186828701613b1a565b9350506020613e9286828701613b1a565b9250506040613ea386828701613b1a565b9150509250925092565b613eb681615333565b82525050565b613ec581615345565b82525050565b6000613ed682615235565b613ee0818561524b565b9350613ef08185602086016153b6565b613ef981615551565b840191505092915050565b6000613f0f82615240565b613f19818561525c565b9350613f298185602086016153b6565b613f3281615551565b840191505092915050565b6000613f4882615240565b613f52818561526d565b9350613f628185602086016153b6565b80840191505092915050565b6000613f7b60238361525c565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fe160148361525c565b91507f546f6b656e20616c7265616479206d696e7465640000000000000000000000006000830152602082019050919050565b6000614021602b8361525c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061408760328361525c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006140ed60268361525c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614153602a8361525c565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620776561706f6e000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b9601c8361525c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006141f9602c8361525c565b91507f4d75737420686f6c64206174206c65617374206f6e65205465787420746f206d60008301527f696e74206120776561706f6e00000000000000000000000000000000000000006020830152604082019050919050565b600061425f60248361525c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c560198361525c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614305601d8361525c565b91507f4d757374206d696e74206174206c65617374206f6e6520776561706f6e0000006000830152602082019050919050565b6000614345602c8361525c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143ab601d8361525c565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b60006143eb60258361525c565b91507f52657175657374656420746f6b656e496420657863656564732075707065722060008301527f626f756e640000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061445160388361525c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006144b7602a8361525c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061451d60298361525c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061458360278361525c565b91507f43616e6e6f74206d696e74206d6f7265207468616e20353020776561706f6e2060008301527f6174206f6e6365000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e960248361525c565b91507f53616c65206d7573742062652061637469766520746f206d696e74206120776560008301527f61706f6e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061464f60208361525c565b91507f50465020636f6e74726163742061646472657373206e656564206265207365746000830152602082019050919050565b600061468f60128361525c565b91507f50465020636f6d706f7365206661696c656400000000000000000000000000006000830152602082019050919050565b60006146cf60118361525c565b91507f546f6b656e20494420746f6f20686967680000000000000000000000000000006000830152602082019050919050565b600061470f60208361525c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061474f602c8361525c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147b5600b8361525c565b91507f4e6f7420616c6c6f7765640000000000000000000000000000000000000000006000830152602082019050919050565b60006147f560208361525c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061483560298361525c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061489b604b8361525c565b91507f4d75737420686f6c64206174206c65617374206173206d616e7920546578742060008301527f617320746865206e756d626572206f6620776561706f6e7320796f7520696e7460208301527f656e6420746f206d696e740000000000000000000000000000000000000000006040830152606082019050919050565b6000614927602f8361525c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061498d60218361525c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149f360318361525c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614a5960388361525c565b91507f4d757374206f776e20746865205465787420666f72207265717565737465642060008301527f746f6b656e496420746f206d696e74206120776561706f6e00000000000000006020830152604082019050919050565b6000614abf602c8361525c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614b2560238361525c565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b8b60238361525c565b91507f43616e6e6f7420657863656564206d617820737570706c79206f66207765617060008301527f6f6e2e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b614bed8161539d565b82525050565b6000614bff8285613f3d565b9150614c0b8284613f3d565b91508190509392505050565b6000602082019050614c2c6000830184613ead565b92915050565b6000608082019050614c476000830187613ead565b614c546020830186613ead565b614c616040830185614be4565b8181036060830152614c738184613ecb565b905095945050505050565b6000604082019050614c936000830185613ead565b614ca06020830184614be4565b9392505050565b6000608082019050614cbc6000830187613ead565b614cc96020830186614be4565b614cd66040830185614be4565b614ce36060830184614be4565b95945050505050565b6000602082019050614d016000830184613ebc565b92915050565b60006020820190508181036000830152614d218184613f04565b905092915050565b60006020820190508181036000830152614d4281613f6e565b9050919050565b60006020820190508181036000830152614d6281613fd4565b9050919050565b60006020820190508181036000830152614d8281614014565b9050919050565b60006020820190508181036000830152614da28161407a565b9050919050565b60006020820190508181036000830152614dc2816140e0565b9050919050565b60006020820190508181036000830152614de281614146565b9050919050565b60006020820190508181036000830152614e02816141ac565b9050919050565b60006020820190508181036000830152614e22816141ec565b9050919050565b60006020820190508181036000830152614e4281614252565b9050919050565b60006020820190508181036000830152614e62816142b8565b9050919050565b60006020820190508181036000830152614e82816142f8565b9050919050565b60006020820190508181036000830152614ea281614338565b9050919050565b60006020820190508181036000830152614ec28161439e565b9050919050565b60006020820190508181036000830152614ee2816143de565b9050919050565b60006020820190508181036000830152614f0281614444565b9050919050565b60006020820190508181036000830152614f22816144aa565b9050919050565b60006020820190508181036000830152614f4281614510565b9050919050565b60006020820190508181036000830152614f6281614576565b9050919050565b60006020820190508181036000830152614f82816145dc565b9050919050565b60006020820190508181036000830152614fa281614642565b9050919050565b60006020820190508181036000830152614fc281614682565b9050919050565b60006020820190508181036000830152614fe2816146c2565b9050919050565b6000602082019050818103600083015261500281614702565b9050919050565b6000602082019050818103600083015261502281614742565b9050919050565b60006020820190508181036000830152615042816147a8565b9050919050565b60006020820190508181036000830152615062816147e8565b9050919050565b6000602082019050818103600083015261508281614828565b9050919050565b600060208201905081810360008301526150a28161488e565b9050919050565b600060208201905081810360008301526150c28161491a565b9050919050565b600060208201905081810360008301526150e281614980565b9050919050565b60006020820190508181036000830152615102816149e6565b9050919050565b6000602082019050818103600083015261512281614a4c565b9050919050565b6000602082019050818103600083015261514281614ab2565b9050919050565b6000602082019050818103600083015261516281614b18565b9050919050565b6000602082019050818103600083015261518281614b7e565b9050919050565b600060208201905061519e6000830184614be4565b92915050565b6000604051905081810181811067ffffffffffffffff821117156151cb576151ca615522565b5b8060405250919050565b600067ffffffffffffffff8211156151f0576151ef615522565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156152205761521f615522565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006152838261539d565b915061528e8361539d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152c3576152c2615495565b5b828201905092915050565b60006152d98261539d565b91506152e48361539d565b9250826152f4576152f36154c4565b5b828204905092915050565b600061530a8261539d565b91506153158361539d565b92508282101561532857615327615495565b5b828203905092915050565b600061533e8261537d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156153d45780820151818401526020810190506153b9565b838111156153e3576000848401525b50505050565b6000600282049050600182168061540157607f821691505b60208210811415615415576154146154f3565b5b50919050565b60006154268261539d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561545957615458615495565b5b600182019050919050565b600061546f8261539d565b915061547a8361539d565b92508261548a576154896154c4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61556b81615333565b811461557657600080fd5b50565b61558281615345565b811461558d57600080fd5b50565b61559981615351565b81146155a457600080fd5b50565b6155b08161539d565b81146155bb57600080fd5b5056fea2646970667358221220288c85e5421c044b17a9dca16aa93e2564bf888f6b52c05ef2924b64ed3c693b64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c8063715018a611610151578063c87b56dd116100c3578063e985e9c511610087578063e985e9c5146106c4578063eb7a3333146106f4578063eb8d2444146106fe578063ec0870451461071c578063f2fde38b14610738578063f4a0a5281461075457610269565b8063c87b56dd14610632578063cb774d4714610662578063d031370b14610680578063e13f351a1461069c578063e36d6498146106a657610269565b80638e8d4644116101155780638e8d46441461058457806395d89b41146105a2578063a22cb465146105c0578063b7d16640146105dc578063b88d4fde146105fa578063c030bc351461061657610269565b8063715018a61461051a5780637d17fcbe146105245780638490754a1461052e578063888a14ec1461054a5780638da5cb5b1461056657610269565b806334918dfd116101ea57806355f804b3116101ae57806355f804b3146104465780635a67728c146104625780636352211e14610480578063676dd563146104b05780636ab84064146104ce57806370a08231146104ea57610269565b806334918dfd146103ca5780633ccfd60b146103d457806342842e0e146103de57806343b4501b146103fa5780634f6ccce71461041657610269565b806318160ddd1161023157806318160ddd1461032657806323b872dd14610344578063286a84e4146103605780632f745c591461037c57806332cb6b0c146103ac57610269565b806301ffc9a71461026e578063020b39cc1461029e57806306fdde03146102bc578063081812fc146102da578063095ea7b31461030a575b600080fd5b61028860048036038101906102839190613d3d565b610770565b6040516102959190614cec565b60405180910390f35b6102a66107ea565b6040516102b39190615189565b60405180910390f35b6102c46107ef565b6040516102d19190614d07565b60405180910390f35b6102f460048036038101906102ef9190613dd0565b610881565b6040516103019190614c17565b60405180910390f35b610324600480360381019061031f9190613cd8565b610906565b005b61032e610a1e565b60405161033b9190615189565b60405180910390f35b61035e60048036038101906103599190613bd2565b610a2b565b005b61037a60048036038101906103759190613dd0565b610a8b565b005b61039660048036038101906103919190613cd8565b610b11565b6040516103a39190615189565b60405180910390f35b6103b4610bb6565b6040516103c19190615189565b60405180910390f35b6103d2610bbc565b005b6103dc610c64565b005b6103f860048036038101906103f39190613bd2565b610d2f565b005b610414600480360381019061040f9190613dd0565b610d4f565b005b610430600480360381019061042b9190613dd0565b610fa9565b60405161043d9190615189565b60405180910390f35b610460600480360381019061045b9190613d8f565b611040565b005b61046a6110d6565b6040516104779190614c17565b60405180910390f35b61049a60048036038101906104959190613dd0565b6110fc565b6040516104a79190614c17565b60405180910390f35b6104b86111ae565b6040516104c59190615189565b60405180910390f35b6104e860048036038101906104e39190613b44565b6111b4565b005b61050460048036038101906104ff9190613b44565b611274565b6040516105119190615189565b60405180910390f35b61052261132c565b005b61052c611469565b005b61054860048036038101906105439190613e22565b611533565b005b610564600480360381019061055f9190613e5e565b611890565b005b61056e611a84565b60405161057b9190614c17565b60405180910390f35b61058c611aae565b6040516105999190614c17565b60405180910390f35b6105aa611ad4565b6040516105b79190614d07565b60405180910390f35b6105da60048036038101906105d59190613c9c565b611b66565b005b6105e4611ce7565b6040516105f19190614cec565b60405180910390f35b610614600480360381019061060f9190613c21565b611cfa565b005b610630600480360381019061062b9190613cd8565b611d5c565b005b61064c60048036038101906106479190613dd0565b611ec3565b6040516106599190614d07565b60405180910390f35b61066a612036565b6040516106779190615189565b60405180910390f35b61069a60048036038101906106959190613dd0565b61203c565b005b6106a461210f565b005b6106ae61229c565b6040516106bb9190615189565b60405180910390f35b6106de60048036038101906106d99190613b96565b6122a2565b6040516106eb9190614cec565b60405180910390f35b6106fc612336565b005b6107066123de565b6040516107139190614cec565b60405180910390f35b61073660048036038101906107319190613b44565b6123f1565b005b610752600480360381019061074d9190613b44565b6124b1565b005b61076e60048036038101906107699190613dd0565b61265d565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107e357506107e2826126e3565b5b9050919050565b603281565b6060600080546107fe906153e9565b80601f016020809104026020016040519081016040528092919081815260200182805461082a906153e9565b80156108775780601f1061084c57610100808354040283529160200191610877565b820191906000526020600020905b81548152906001019060200180831161085a57829003601f168201915b5050505050905090565b600061088c826127c5565b6108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c290615009565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610911826110fc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610979906150c9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109a1612831565b73ffffffffffffffffffffffffffffffffffffffff1614806109d057506109cf816109ca612831565b6122a2565b5b610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690614ee9565b60405180910390fd5b610a198383612839565b505050565b6000600880549050905090565b610a3c610a36612831565b826128f2565b610a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a72906150e9565b60405180910390fd5b610a868383836129d0565b505050565b610a93612831565b73ffffffffffffffffffffffffffffffffffffffff16610ab1611a84565b73ffffffffffffffffffffffffffffffffffffffff1614610b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afe90615049565b60405180910390fd5b80600d8190555050565b6000610b1c83611274565b8210610b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5490614d69565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d5481565b610bc4612831565b73ffffffffffffffffffffffffffffffffffffffff16610be2611a84565b73ffffffffffffffffffffffffffffffffffffffff1614610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f90615049565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610c6c612831565b73ffffffffffffffffffffffffffffffffffffffff16610c8a611a84565b73ffffffffffffffffffffffffffffffffffffffff1614610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd790615049565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d2b573d6000803e3d6000fd5b5050565b610d4a83838360405180602001604052806000815250611cfa565b505050565b600e60009054906101000a900460ff16610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9590614f69565b60405180910390fd5b600d54610da9610a1e565b10610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090614dc9565b60405180910390fd5b600d548110610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490614ec9565b60405180910390fd5b6000600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401610ea49190615189565b60206040518083038186803b158015610ebc57600080fd5b505afa158015610ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef49190613b6d565b73ffffffffffffffffffffffffffffffffffffffff1614610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4190615109565b60405180910390fd5b610f53826127c5565b15610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a90614d49565b60405180910390fd5b610f9d3383612c2e565b610fa5612c4c565b5050565b6000610fb3610a1e565b8210610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90615129565b60405180910390fd5b6008828154811061102e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611048612831565b73ffffffffffffffffffffffffffffffffffffffff16611066611a84565b73ffffffffffffffffffffffffffffffffffffffff16146110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b390615049565b60405180910390fd5b80601190805190602001906110d2929190613929565b5050565b600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c90614f29565b60405180910390fd5b80915050919050565b600c5481565b6111bc612831565b73ffffffffffffffffffffffffffffffffffffffff166111da611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790615049565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc90614f09565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611334612831565b73ffffffffffffffffffffffffffffffffffffffff16611352611a84565b73ffffffffffffffffffffffffffffffffffffffff16146113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f90615049565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611471612831565b73ffffffffffffffffffffffffffffffffffffffff1661148f611a84565b73ffffffffffffffffffffffffffffffffffffffff16146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90615049565b60405180910390fd5b6000600f541461152a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152190614ea9565b60405180910390fd5b43601081905550565b600e60009054906101000a900460ff16611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990614f69565b60405180910390fd5b600081116115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90614e69565b60405180910390fd5b6032811115611609576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160090614f49565b60405180910390fd5b6000600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161166b9190614c17565b60206040518083038186803b15801561168357600080fd5b505afa158015611697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bb9190613df9565b905060008111611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790614e09565b60405180910390fd5b828461170c9190615278565b81101561174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590615089565b60405180910390fd5b60005b818110801561175f57508381105b801561176b5750603281105b1561188157600d5461177b610a1e565b106117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290615169565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff16632f745c593388856117e69190615278565b6040518363ffffffff1660e01b8152600401611803929190614c7e565b60206040518083038186803b15801561181b57600080fd5b505afa15801561182f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118539190613df9565b905061185e816127c5565b61186d5761186c3382612c2e565b5b5080806118799061541b565b915050611751565b5061188a612c4c565b50505050565b600e60019054906101000a900460ff166118df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d690615029565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890614f89565b60405180910390fd5b60003390506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166347dc3be3848888886040518563ffffffff1660e01b81526004016119de9493929190614ca7565b602060405180830381600087803b1580156119f857600080fd5b505af1158015611a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a309190613d14565b905080611a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6990614fa9565b60405180910390fd5b611a7c3387612c75565b505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054611ae3906153e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0f906153e9565b8015611b5c5780601f10611b3157610100808354040283529160200191611b5c565b820191906000526020600020905b815481529060010190602001808311611b3f57829003601f168201915b5050505050905090565b611b6e612831565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd390614e49565b60405180910390fd5b8060056000611be9612831565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c96612831565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cdb9190614cec565b60405180910390a35050565b600e60019054906101000a900460ff1681565b611d0b611d05612831565b836128f2565b611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d41906150e9565b60405180910390fd5b611d5684848484612d7b565b50505050565b611d64612831565b73ffffffffffffffffffffffffffffffffffffffff16611d82611a84565b73ffffffffffffffffffffffffffffffffffffffff1614611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf90615049565b60405180910390fd5b600e60009054906101000a900460ff16611e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1e90615029565b60405180910390fd5b611e30816127c5565b15611e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6790614d49565b60405180910390fd5b600d54811115611eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eac90614fc9565b60405180910390fd5b611ebf8282612dd7565b5050565b6060611ece826127c5565b611f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f04906150a9565b60405180910390fd5b6000601260008481526020019081526020016000208054611f2d906153e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611f59906153e9565b8015611fa65780601f10611f7b57610100808354040283529160200191611fa6565b820191906000526020600020905b815481529060010190602001808311611f8957829003601f168201915b505050505090506000611fb7612fa7565b9050600081511415611fcd578192505050612031565b600082511115612002578082604051602001611fea929190614bf3565b60405160208183030381529060405292505050612031565b8061200c85613039565b60405160200161201d929190614bf3565b604051602081830303815290604052925050505b919050565b600f5481565b612044612831565b73ffffffffffffffffffffffffffffffffffffffff16612062611a84565b73ffffffffffffffffffffffffffffffffffffffff16146120b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120af90615049565b60405180910390fd5b60006120c2610a1e565b905060005b828110156120f7576120e43382846120df9190615278565b612c2e565b80806120ef9061541b565b9150506120c7565b6000601054141561210a57436010819055505b505050565b612117612831565b73ffffffffffffffffffffffffffffffffffffffff16612135611a84565b73ffffffffffffffffffffffffffffffffffffffff161461218b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218290615049565b60405180910390fd5b6000600f54146121d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c790615149565b60405180910390fd5b60006010541415612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220d90614d29565b60405180910390fd5b600d546010544060001c61222a9190615464565b600f8190555060ff612247601054436131e690919063ffffffff16565b111561227257600d5460014361225d91906152ff565b4060001c61226b9190615464565b600f819055505b6000600f54141561229a576122936001600f546131fc90919063ffffffff16565b600f819055505b565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61233e612831565b73ffffffffffffffffffffffffffffffffffffffff1661235c611a84565b73ffffffffffffffffffffffffffffffffffffffff16146123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990615049565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b600e60009054906101000a900460ff1681565b6123f9612831565b73ffffffffffffffffffffffffffffffffffffffff16612417611a84565b73ffffffffffffffffffffffffffffffffffffffff161461246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490615049565b60405180910390fd5b80600e60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6124b9612831565b73ffffffffffffffffffffffffffffffffffffffff166124d7611a84565b73ffffffffffffffffffffffffffffffffffffffff161461252d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252490615049565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561259d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259490614da9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612665612831565b73ffffffffffffffffffffffffffffffffffffffff16612683611a84565b73ffffffffffffffffffffffffffffffffffffffff16146126d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d090615049565b60405180910390fd5b80600c8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127ae57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127be57506127bd82613212565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128ac836110fc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128fd826127c5565b61293c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293390614e89565b60405180910390fd5b6000612947836110fc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129b657508373ffffffffffffffffffffffffffffffffffffffff1661299e84610881565b73ffffffffffffffffffffffffffffffffffffffff16145b806129c757506129c681856122a2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129f0826110fc565b73ffffffffffffffffffffffffffffffffffffffff1614612a46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3d90615069565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aad90614e29565b60405180910390fd5b612ac3838383600161327c565b612ace600082612839565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b1e91906152ff565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b759190615278565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612c488282604051806020016040528060008152506133a6565b5050565b6000601054148015612c665750600d54612c64610a1e565b145b15612c7357436010819055505b565b612c8382600083600061327c565b612c8e600082612839565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cde91906152ff565b925050819055506002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905580600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612d868484846129d0565b612d9284848484613401565b612dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc890614d89565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3e90614fe9565b60405180910390fd5b612e50816127c5565b15612e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8790614de9565b60405180910390fd5b612e9e60008383600161327c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eee9190615278565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606060118054612fb6906153e9565b80601f0160208091040260200160405190810160405280929190818152602001828054612fe2906153e9565b801561302f5780601f106130045761010080835404028352916020019161302f565b820191906000526020600020905b81548152906001019060200180831161301257829003601f168201915b5050505050905090565b60606000821415613081576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131e1565b600082905060005b600082146130b357808061309c9061541b565b915050600a826130ac91906152ce565b9150613089565b60008167ffffffffffffffff8111156130f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131275781602001600182028036833780820191505090505b5090505b600085146131da5760018261314091906152ff565b9150600a8561314f9190615464565b603061315b9190615278565b60f81b818381518110613197577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131d391906152ce565b945061312b565b8093505050505b919050565b600081836131f491906152ff565b905092915050565b6000818361320a9190615278565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61328884848484613598565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156132cb576132c68261359e565b61330a565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146133095761330884836135e7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156133435750805b156133565761335182613754565b6133a0565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561338f5750805b1561339f5761339e8383613897565b5b5b50505050565b6133b08383612dd7565b6133bd6000848484613401565b6133fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f390614d89565b60405180910390fd5b505050565b60006134228473ffffffffffffffffffffffffffffffffffffffff16613916565b1561358b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261344b612831565b8786866040518563ffffffff1660e01b815260040161346d9493929190614c32565b602060405180830381600087803b15801561348757600080fd5b505af19250505080156134b857506040513d601f19601f820116820180604052508101906134b59190613d66565b60015b61353b573d80600081146134e8576040519150601f19603f3d011682016040523d82523d6000602084013e6134ed565b606091505b50600081511415613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90614d89565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613590565b600190505b949350505050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135f484611274565b6135fe91906152ff565b90506000600760008481526020019081526020016000205490508181146136e3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061376891906152ff565b90506000600960008481526020019081526020016000205490506000600883815481106137be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613806577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061387b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006138a283611274565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613935906153e9565b90600052602060002090601f016020900481019282613957576000855561399e565b82601f1061397057805160ff191683800117855561399e565b8280016001018555821561399e579182015b8281111561399d578251825591602001919060010190613982565b5b5090506139ab91906139af565b5090565b5b808211156139c85760008160009055506001016139b0565b5090565b60006139df6139da846151d5565b6151a4565b9050828152602081018484840111156139f757600080fd5b613a028482856153a7565b509392505050565b6000613a1d613a1884615205565b6151a4565b905082815260208101848484011115613a3557600080fd5b613a408482856153a7565b509392505050565b600081359050613a5781615562565b92915050565b600081519050613a6c81615562565b92915050565b600081359050613a8181615579565b92915050565b600081519050613a9681615579565b92915050565b600081359050613aab81615590565b92915050565b600081519050613ac081615590565b92915050565b600082601f830112613ad757600080fd5b8135613ae78482602086016139cc565b91505092915050565b600082601f830112613b0157600080fd5b8135613b11848260208601613a0a565b91505092915050565b600081359050613b29816155a7565b92915050565b600081519050613b3e816155a7565b92915050565b600060208284031215613b5657600080fd5b6000613b6484828501613a48565b91505092915050565b600060208284031215613b7f57600080fd5b6000613b8d84828501613a5d565b91505092915050565b60008060408385031215613ba957600080fd5b6000613bb785828601613a48565b9250506020613bc885828601613a48565b9150509250929050565b600080600060608486031215613be757600080fd5b6000613bf586828701613a48565b9350506020613c0686828701613a48565b9250506040613c1786828701613b1a565b9150509250925092565b60008060008060808587031215613c3757600080fd5b6000613c4587828801613a48565b9450506020613c5687828801613a48565b9350506040613c6787828801613b1a565b925050606085013567ffffffffffffffff811115613c8457600080fd5b613c9087828801613ac6565b91505092959194509250565b60008060408385031215613caf57600080fd5b6000613cbd85828601613a48565b9250506020613cce85828601613a72565b9150509250929050565b60008060408385031215613ceb57600080fd5b6000613cf985828601613a48565b9250506020613d0a85828601613b1a565b9150509250929050565b600060208284031215613d2657600080fd5b6000613d3484828501613a87565b91505092915050565b600060208284031215613d4f57600080fd5b6000613d5d84828501613a9c565b91505092915050565b600060208284031215613d7857600080fd5b6000613d8684828501613ab1565b91505092915050565b600060208284031215613da157600080fd5b600082013567ffffffffffffffff811115613dbb57600080fd5b613dc784828501613af0565b91505092915050565b600060208284031215613de257600080fd5b6000613df084828501613b1a565b91505092915050565b600060208284031215613e0b57600080fd5b6000613e1984828501613b2f565b91505092915050565b60008060408385031215613e3557600080fd5b6000613e4385828601613b1a565b9250506020613e5485828601613b1a565b9150509250929050565b600080600060608486031215613e7357600080fd5b6000613e8186828701613b1a565b9350506020613e9286828701613b1a565b9250506040613ea386828701613b1a565b9150509250925092565b613eb681615333565b82525050565b613ec581615345565b82525050565b6000613ed682615235565b613ee0818561524b565b9350613ef08185602086016153b6565b613ef981615551565b840191505092915050565b6000613f0f82615240565b613f19818561525c565b9350613f298185602086016153b6565b613f3281615551565b840191505092915050565b6000613f4882615240565b613f52818561526d565b9350613f628185602086016153b6565b80840191505092915050565b6000613f7b60238361525c565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fe160148361525c565b91507f546f6b656e20616c7265616479206d696e7465640000000000000000000000006000830152602082019050919050565b6000614021602b8361525c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061408760328361525c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006140ed60268361525c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614153602a8361525c565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620776561706f6e000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b9601c8361525c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006141f9602c8361525c565b91507f4d75737420686f6c64206174206c65617374206f6e65205465787420746f206d60008301527f696e74206120776561706f6e00000000000000000000000000000000000000006020830152604082019050919050565b600061425f60248361525c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c560198361525c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614305601d8361525c565b91507f4d757374206d696e74206174206c65617374206f6e6520776561706f6e0000006000830152602082019050919050565b6000614345602c8361525c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143ab601d8361525c565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b60006143eb60258361525c565b91507f52657175657374656420746f6b656e496420657863656564732075707065722060008301527f626f756e640000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061445160388361525c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006144b7602a8361525c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061451d60298361525c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061458360278361525c565b91507f43616e6e6f74206d696e74206d6f7265207468616e20353020776561706f6e2060008301527f6174206f6e6365000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e960248361525c565b91507f53616c65206d7573742062652061637469766520746f206d696e74206120776560008301527f61706f6e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061464f60208361525c565b91507f50465020636f6e74726163742061646472657373206e656564206265207365746000830152602082019050919050565b600061468f60128361525c565b91507f50465020636f6d706f7365206661696c656400000000000000000000000000006000830152602082019050919050565b60006146cf60118361525c565b91507f546f6b656e20494420746f6f20686967680000000000000000000000000000006000830152602082019050919050565b600061470f60208361525c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061474f602c8361525c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147b5600b8361525c565b91507f4e6f7420616c6c6f7765640000000000000000000000000000000000000000006000830152602082019050919050565b60006147f560208361525c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061483560298361525c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061489b604b8361525c565b91507f4d75737420686f6c64206174206c65617374206173206d616e7920546578742060008301527f617320746865206e756d626572206f6620776561706f6e7320796f7520696e7460208301527f656e6420746f206d696e740000000000000000000000000000000000000000006040830152606082019050919050565b6000614927602f8361525c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061498d60218361525c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149f360318361525c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614a5960388361525c565b91507f4d757374206f776e20746865205465787420666f72207265717565737465642060008301527f746f6b656e496420746f206d696e74206120776561706f6e00000000000000006020830152604082019050919050565b6000614abf602c8361525c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614b2560238361525c565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b8b60238361525c565b91507f43616e6e6f7420657863656564206d617820737570706c79206f66207765617060008301527f6f6e2e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b614bed8161539d565b82525050565b6000614bff8285613f3d565b9150614c0b8284613f3d565b91508190509392505050565b6000602082019050614c2c6000830184613ead565b92915050565b6000608082019050614c476000830187613ead565b614c546020830186613ead565b614c616040830185614be4565b8181036060830152614c738184613ecb565b905095945050505050565b6000604082019050614c936000830185613ead565b614ca06020830184614be4565b9392505050565b6000608082019050614cbc6000830187613ead565b614cc96020830186614be4565b614cd66040830185614be4565b614ce36060830184614be4565b95945050505050565b6000602082019050614d016000830184613ebc565b92915050565b60006020820190508181036000830152614d218184613f04565b905092915050565b60006020820190508181036000830152614d4281613f6e565b9050919050565b60006020820190508181036000830152614d6281613fd4565b9050919050565b60006020820190508181036000830152614d8281614014565b9050919050565b60006020820190508181036000830152614da28161407a565b9050919050565b60006020820190508181036000830152614dc2816140e0565b9050919050565b60006020820190508181036000830152614de281614146565b9050919050565b60006020820190508181036000830152614e02816141ac565b9050919050565b60006020820190508181036000830152614e22816141ec565b9050919050565b60006020820190508181036000830152614e4281614252565b9050919050565b60006020820190508181036000830152614e62816142b8565b9050919050565b60006020820190508181036000830152614e82816142f8565b9050919050565b60006020820190508181036000830152614ea281614338565b9050919050565b60006020820190508181036000830152614ec28161439e565b9050919050565b60006020820190508181036000830152614ee2816143de565b9050919050565b60006020820190508181036000830152614f0281614444565b9050919050565b60006020820190508181036000830152614f22816144aa565b9050919050565b60006020820190508181036000830152614f4281614510565b9050919050565b60006020820190508181036000830152614f6281614576565b9050919050565b60006020820190508181036000830152614f82816145dc565b9050919050565b60006020820190508181036000830152614fa281614642565b9050919050565b60006020820190508181036000830152614fc281614682565b9050919050565b60006020820190508181036000830152614fe2816146c2565b9050919050565b6000602082019050818103600083015261500281614702565b9050919050565b6000602082019050818103600083015261502281614742565b9050919050565b60006020820190508181036000830152615042816147a8565b9050919050565b60006020820190508181036000830152615062816147e8565b9050919050565b6000602082019050818103600083015261508281614828565b9050919050565b600060208201905081810360008301526150a28161488e565b9050919050565b600060208201905081810360008301526150c28161491a565b9050919050565b600060208201905081810360008301526150e281614980565b9050919050565b60006020820190508181036000830152615102816149e6565b9050919050565b6000602082019050818103600083015261512281614a4c565b9050919050565b6000602082019050818103600083015261514281614ab2565b9050919050565b6000602082019050818103600083015261516281614b18565b9050919050565b6000602082019050818103600083015261518281614b7e565b9050919050565b600060208201905061519e6000830184614be4565b92915050565b6000604051905081810181811067ffffffffffffffff821117156151cb576151ca615522565b5b8060405250919050565b600067ffffffffffffffff8211156151f0576151ef615522565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156152205761521f615522565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006152838261539d565b915061528e8361539d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152c3576152c2615495565b5b828201905092915050565b60006152d98261539d565b91506152e48361539d565b9250826152f4576152f36154c4565b5b828204905092915050565b600061530a8261539d565b91506153158361539d565b92508282101561532857615327615495565b5b828203905092915050565b600061533e8261537d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156153d45780820151818401526020810190506153b9565b838111156153e3576000848401525b50505050565b6000600282049050600182168061540157607f821691505b60208210811415615415576154146154f3565b5b50919050565b60006154268261539d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561545957615458615495565b5b600182019050919050565b600061546f8261539d565b915061547a8361539d565b92508261548a576154896154c4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61556b81615333565b811461557657600080fd5b50565b61558281615345565b811461558d57600080fd5b50565b61559981615351565b81146155a457600080fd5b50565b6155b08161539d565b81146155bb57600080fd5b5056fea2646970667358221220288c85e5421c044b17a9dca16aa93e2564bf888f6b52c05ef2924b64ed3c693b64736f6c63430008000033

Deployed Bytecode Sourcemap

49572:6500:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43078:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49799:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31000:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32452:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31989:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43727:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33342:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50689:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43395:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49848:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50385:89;;;:::i;:::-;;50931:140;;;:::i;:::-;;33718:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51934:604;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43917:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55159:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49976:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30694:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49755:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50256:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30424:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28260:148;;;:::i;:::-;;54765:182;;;:::i;:::-;;52544:988;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53542:510;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27609:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49722:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31169:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32745:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49926:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33940:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51638:288;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55276:793;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50023:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51079:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54060:697;;;:::i;:::-;;50058:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33111:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50482:98;;;:::i;:::-;;49887:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50790:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28563:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50592:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43078:233;43180:4;43219:35;43204:50;;;:11;:50;;;;:99;;;;43267:36;43291:11;43267:23;:36::i;:::-;43204:99;43197:106;;43078:233;;;:::o;49799:42::-;49839:2;49799:42;:::o;31000:100::-;31054:13;31087:5;31080:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31000:100;:::o;32452:221::-;32528:7;32556:16;32564:7;32556;:16::i;:::-;32548:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32641:15;:24;32657:7;32641:24;;;;;;;;;;;;;;;;;;;;;32634:31;;32452:221;;;:::o;31989:397::-;32070:13;32086:23;32101:7;32086:14;:23::i;:::-;32070:39;;32134:5;32128:11;;:2;:11;;;;32120:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32214:5;32198:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32223:37;32240:5;32247:12;:10;:12::i;:::-;32223:16;:37::i;:::-;32198:62;32190:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32357:21;32366:2;32370:7;32357:8;:21::i;:::-;31989:397;;;:::o;43727:113::-;43788:7;43815:10;:17;;;;43808:24;;43727:113;:::o;33342:305::-;33503:41;33522:12;:10;:12::i;:::-;33536:7;33503:18;:41::i;:::-;33495:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33611:28;33621:4;33627:2;33631:7;33611:9;:28::i;:::-;33342:305;;;:::o;50689:93::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50767:7:::1;50754:10;:20;;;;50689:93:::0;:::o;43395:256::-;43492:7;43528:23;43545:5;43528:16;:23::i;:::-;43520:5;:31;43512:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43617:12;:19;43630:5;43617:19;;;;;;;;;;;;;;;:26;43637:5;43617:26;;;;;;;;;;;;43610:33;;43395:256;;;;:::o;49848:32::-;;;;:::o;50385:89::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50454:12:::1;;;;;;;;;;;50453:13;50438:12;;:28;;;;;;;;;;;;;;;;;;50385:89::o:0;50931:140::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50979:12:::1;50994:21;50979:36;;51034:10;51026:28;;:37;51055:7;51026:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;27900:1;50931:140::o:0;33718:151::-;33822:39;33839:4;33845:2;33849:7;33822:39;;;;;;;;;;;;:16;:39::i;:::-;33718:151;;;:::o;51934:604::-;51993:12;;;;;;;;;;;51985:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52077:10;;52061:13;:11;:13::i;:::-;:26;52053:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52159:10;;52149:7;:20;52141:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52226:15;52252:22;;;;;;;;;;;52226:49;;52320:10;52292:38;;:7;:15;;;52308:7;52292:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;;52284:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;52407:16;52415:7;52407;:16::i;:::-;52406:17;52398:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;52469:30;52479:10;52491:7;52469:9;:30::i;:::-;52506:26;:24;:26::i;:::-;51934:604;;:::o;43917:233::-;43992:7;44028:30;:28;:30::i;:::-;44020:5;:38;44012:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44125:10;44136:5;44125:17;;;;;;;;;;;;;;;;;;;;;;;;44118:24;;43917:233;;;:::o;55159:109::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55252:8:::1;55233:16;:27;;;;;;;;;;;;:::i;:::-;;55159:109:::0;:::o;49976:38::-;;;;;;;;;;;;;:::o;30694:239::-;30766:7;30786:13;30802:7;:16;30810:7;30802:16;;;;;;;;;;;;;;;;;;;;;30786:32;;30854:1;30837:19;;:5;:19;;;;30829:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30920:5;30913:12;;;30694:239;;;:::o;49755:28::-;;;;:::o;50256:121::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50354:15:::1;50340:11;;:29;;;;;;;;;;;;;;;;;;50256:121:::0;:::o;30424:208::-;30496:7;30541:1;30524:19;;:5;:19;;;;30516:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30608:9;:16;30618:5;30608:16;;;;;;;;;;;;;;;;30601:23;;30424:208;;;:::o;28260:148::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28367:1:::1;28330:40;;28351:6;;;;;;;;;;;28330:40;;;;;;;;;;;;28398:1;28381:6;;:19;;;;;;;;;;;;;;;;;;28260:148::o:0;54765:182::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54860:1:::1;54843:13;;:18;54835:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;54927:12;54906:18;:33;;;;54765:182::o:0;52544:988::-;52629:12;;;;;;;;;;;52621:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52709:1;52697:9;:13;52689:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49839:2;52759:9;:29;;52751:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52841:15;52867:22;;;;;;;;;;;52841:49;;52899:12;52914:7;:17;;;52932:10;52914:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52899:44;;52968:1;52958:7;:11;52950:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53060:9;53044:13;:25;;;;:::i;:::-;53033:7;:36;;53025:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;53166:6;53162:330;53182:7;53178:1;:11;:28;;;;;53197:9;53193:1;:13;53178:28;:52;;;;;49839:2;53210:1;:20;53178:52;53162:330;;;53270:10;;53254:13;:11;:13::i;:::-;:26;53246:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53329:12;53344:7;:27;;;53372:10;53388:13;53384:1;:17;;;;:::i;:::-;53344:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53329:73;;53416:16;53424:7;53416;:16::i;:::-;53411:74;;53445:30;53455:10;53467:7;53445:9;:30::i;:::-;53411:74;53162:330;53232:3;;;;;:::i;:::-;;;;53162:330;;;;53500:26;:24;:26::i;:::-;52544:988;;;;:::o;53542:510::-;53648:15;;;;;;;;;;;53640:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;53721:1;53698:25;;:11;;;;;;;;;;;:25;;;;53690:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53772:12;53787:10;53772:25;;53808:18;53844:11;;;;;;;;;;;53808:48;;53867:11;53881:3;:14;;;53896:4;53902:10;53914;53926:13;53881:59;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53867:73;;53959:6;53951:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;54009:33;54019:10;54031;54009:9;:33::i;:::-;53542:510;;;;;;:::o;27609:87::-;27655:7;27682:6;;;;;;;;;;;27675:13;;27609:87;:::o;49722:26::-;;;;;;;;;;;;;:::o;31169:104::-;31225:13;31258:7;31251:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31169:104;:::o;32745:295::-;32860:12;:10;:12::i;:::-;32848:24;;:8;:24;;;;32840:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32960:8;32915:18;:32;32934:12;:10;:12::i;:::-;32915:32;;;;;;;;;;;;;;;:42;32948:8;32915:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33013:8;32984:48;;32999:12;:10;:12::i;:::-;32984:48;;;33023:8;32984:48;;;;;;:::i;:::-;;;;;;;;32745:295;;:::o;49926:35::-;;;;;;;;;;;;;:::o;33940:285::-;34072:41;34091:12;:10;:12::i;:::-;34105:7;34072:18;:41::i;:::-;34064:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34178:39;34192:4;34198:2;34202:7;34211:5;34178:13;:39::i;:::-;33940:285;;;;:::o;51638:288::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51725:12:::1;;;;;;;;;;;51717:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;51784:16;51792:7;51784;:16::i;:::-;51783:17;51775:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;51854:10;;51844:7;:20;;51836:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;51897:21;51903:5;51910:7;51897:5;:21::i;:::-;51638:288:::0;;:::o;55276:793::-;55349:13;55383:16;55391:7;55383;:16::i;:::-;55375:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55464:23;55490:10;:19;55501:7;55490:19;;;;;;;;;;;55464:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55520:18;55541:10;:8;:10::i;:::-;55520:31;;55649:1;55633:4;55627:18;:23;55623:72;;;55674:9;55667:16;;;;;;55623:72;55825:1;55805:9;55799:23;:27;55795:108;;;55874:4;55880:9;55857:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55843:48;;;;;;55795:108;56035:4;56041:18;:7;:16;:18::i;:::-;56018:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56004:57;;;;55276:793;;;;:::o;50023:28::-;;;;:::o;51079:313::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51143:11:::1;51157:13;:11;:13::i;:::-;51143:27;;51181:6;51198:86;51214:3;51210:1;:7;51198:86;;;51239:33;51249:10;51270:1;51261:6;:10;;;;:::i;:::-;51239:9;:33::i;:::-;51219:3;;;;;:::i;:::-;;;;51198:86;;;51322:1;51300:18;;:23;51296:89;;;51361:12;51340:18;:33;;;;51296:89;27900:1;;51079:313:::0;:::o;54060:697::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54142:1:::1;54125:13;;:18;54117:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54224:1;54202:18;;:23;;54194:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54332:10;;54309:18;;54299:29;54294:35;;:48;;;;:::i;:::-;54278:13;:64;;;;54516:3;54477:36;54494:18;;54477:12;:16;;:36;;;;:::i;:::-;:42;54474:136;;;54588:10;;54582:1;54567:12;:16;;;;:::i;:::-;54557:27;54552:33;;:46;;;;:::i;:::-;54536:13;:62;;;;54474:136;54684:1;54667:13;;:18;54663:87;;;54718:20;54736:1;54718:13;;:17;;:20;;;;:::i;:::-;54702:13;:36;;;;54663:87;54060:697::o:0;50058:33::-;;;;:::o;33111:164::-;33208:4;33232:18;:25;33251:5;33232:25;;;;;;;;;;;;;;;:35;33258:8;33232:35;;;;;;;;;;;;;;;;;;;;;;;;;33225:42;;33111:164;;;;:::o;50482:98::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50557:15:::1;;;;;;;;;;;50556:16;50538:15;;:34;;;;;;;;;;;;;;;;;;50482:98::o:0;49887:32::-;;;;;;;;;;;;;:::o;50790:133::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50900:15:::1;50875:22;;:40;;;;;;;;;;;;;;;;;;50790:133:::0;:::o;28563:244::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28672:1:::1;28652:22;;:8;:22;;;;28644:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28762:8;28733:38;;28754:6;;;;;;;;;;;28733:38;;;;;;;;;;;;28791:8;28782:6;;:17;;;;;;;;;;;;;;;;;;28563:244:::0;:::o;50592:89::-;27840:12;:10;:12::i;:::-;27829:23;;:7;:5;:7::i;:::-;:23;;;27821:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50668:5:::1;50656:9;:17;;;;50592:89:::0;:::o;30076:284::-;30178:4;30217:25;30202:40;;;:11;:40;;;;:101;;;;30270:33;30255:48;;;:11;:48;;;;30202:101;:150;;;;30316:36;30340:11;30316:23;:36::i;:::-;30202:150;30195:157;;30076:284;;;:::o;35692:127::-;35757:4;35809:1;35781:30;;:7;:16;35789:7;35781:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35774:37;;35692:127;;;:::o;26226:98::-;26279:7;26306:10;26299:17;;26226:98;:::o;39931:174::-;40033:2;40006:15;:24;40022:7;40006:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40089:7;40085:2;40051:46;;40060:23;40075:7;40060:14;:23::i;:::-;40051:46;;;;;;;;;;;;39931:174;;:::o;35986:348::-;36079:4;36104:16;36112:7;36104;:16::i;:::-;36096:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36180:13;36196:23;36211:7;36196:14;:23::i;:::-;36180:39;;36249:5;36238:16;;:7;:16;;;:51;;;;36282:7;36258:31;;:20;36270:7;36258:11;:20::i;:::-;:31;;;36238:51;:87;;;;36293:32;36310:5;36317:7;36293:16;:32::i;:::-;36238:87;36230:96;;;35986:348;;;;:::o;39263:550::-;39388:4;39361:31;;:23;39376:7;39361:14;:23::i;:::-;:31;;;39353:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39471:1;39457:16;;:2;:16;;;;39449:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39527:45;39548:4;39554:2;39558:7;39567:4;39527:20;:45::i;:::-;39637:29;39654:1;39658:7;39637:8;:29::i;:::-;39698:1;39679:9;:15;39689:4;39679:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39727:1;39710:9;:13;39720:2;39710:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39758:2;39739:7;:16;39747:7;39739:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39797:7;39793:2;39778:27;;39787:4;39778:27;;;;;;;;;;;;39263:550;;;:::o;36676:110::-;36752:26;36762:2;36766:7;36752:26;;;;;;;;;;;;:9;:26::i;:::-;36676:110;;:::o;51400:218::-;51495:1;51473:18;;:23;:67;;;;;51530:10;;51513:13;:11;:13::i;:::-;:27;51473:67;51455:156;;;51587:12;51566:18;:33;;;;51455:156;51400:218::o;38590:336::-;38671:55;38692:5;38707:1;38711:7;38720:5;38671:20;:55::i;:::-;38767:29;38784:1;38788:7;38767:8;:29::i;:::-;38829:1;38809:9;:16;38819:5;38809:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;38848:7;:16;38856:7;38848:16;;;;;;;;;;;;38841:23;;;;;;;;;;;38910:7;38906:1;38882:36;;38891:5;38882:36;;;;;;;;;;;;38590:336;;:::o;35107:272::-;35221:28;35231:4;35237:2;35241:7;35221:9;:28::i;:::-;35268:48;35291:4;35297:2;35301:7;35310:5;35268:22;:48::i;:::-;35260:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35107:272;;;;:::o;37599:388::-;37693:1;37679:16;;:2;:16;;;;37671:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37752:16;37760:7;37752;:16::i;:::-;37751:17;37743:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37814:51;37843:1;37847:2;37851:7;37860:4;37814:20;:51::i;:::-;37895:1;37878:9;:13;37888:2;37878:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37926:2;37907:7;:16;37915:7;37907:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37971:7;37967:2;37946:33;;37963:1;37946:33;;;;;;;;;;;;37599:388;;:::o;54955:117::-;55015:13;55048:16;55041:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54955:117;:::o;7223:723::-;7279:13;7509:1;7500:5;:10;7496:53;;;7527:10;;;;;;;;;;;;;;;;;;;;;7496:53;7559:12;7574:5;7559:20;;7590:14;7615:78;7630:1;7622:4;:9;7615:78;;7648:8;;;;;:::i;:::-;;;;7679:2;7671:10;;;;;:::i;:::-;;;7615:78;;;7703:19;7735:6;7725:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7703:39;;7753:154;7769:1;7760:5;:10;7753:154;;7797:1;7787:11;;;;;:::i;:::-;;;7864:2;7856:5;:10;;;;:::i;:::-;7843:2;:24;;;;:::i;:::-;7830:39;;7813:6;7820;7813:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7893:2;7884:11;;;;;:::i;:::-;;;7753:154;;;7931:6;7917:21;;;;;7223:723;;;;:::o;3111:98::-;3169:7;3200:1;3196;:5;;;;:::i;:::-;3189:12;;3111:98;;;;:::o;2730:::-;2788:7;2819:1;2815;:5;;;;:::i;:::-;2808:12;;2730:98;;;;:::o;19299:157::-;19384:4;19423:25;19408:40;;;:11;:40;;;;19401:47;;19299:157;;;:::o;44763:604::-;44888:55;44915:4;44921:2;44925:7;44934:8;44888:26;:55::i;:::-;44976:1;44960:18;;:4;:18;;;44956:187;;;44995:40;45027:7;44995:31;:40::i;:::-;44956:187;;;45065:2;45057:10;;:4;:10;;;45053:90;;45084:47;45117:4;45123:7;45084:32;:47::i;:::-;45053:90;44956:187;45171:1;45157:16;;:2;:16;;;:28;;;;;45177:8;45157:28;45153:207;;;45202:45;45239:7;45202:36;:45::i;:::-;45153:207;;;45275:4;45269:10;;:2;:10;;;;:22;;;;;45283:8;45269:22;45265:95;;;45308:40;45336:2;45340:7;45308:27;:40::i;:::-;45265:95;45153:207;44763:604;;;;:::o;37013:250::-;37109:18;37115:2;37119:7;37109:5;:18::i;:::-;37146:54;37177:1;37181:2;37185:7;37194:5;37146:22;:54::i;:::-;37138:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;37013:250;;;:::o;40670:839::-;40787:4;40813:15;:2;:13;;;:15::i;:::-;40809:693;;;40865:2;40849:36;;;40886:12;:10;:12::i;:::-;40900:4;40906:7;40915:5;40849:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40845:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41112:1;41095:6;:13;:18;41091:341;;;41138:60;;;;;;;;;;:::i;:::-;;;;;;;;41091:341;41382:6;41376:13;41367:6;41363:2;41359:15;41352:38;40845:602;40982:45;;;40972:55;;;:6;:55;;;;40965:62;;;;;40809:693;41486:4;41479:11;;40670:839;;;;;;;:::o;42122:108::-;;;;;:::o;46090:164::-;46194:10;:17;;;;46167:15;:24;46183:7;46167:24;;;;;;;;;;;:44;;;;46222:10;46238:7;46222:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46090:164;:::o;46881:988::-;47147:22;47197:1;47172:22;47189:4;47172:16;:22::i;:::-;:26;;;;:::i;:::-;47147:51;;47209:18;47230:17;:26;47248:7;47230:26;;;;;;;;;;;;47209:47;;47377:14;47363:10;:28;47359:328;;47408:19;47430:12;:18;47443:4;47430:18;;;;;;;;;;;;;;;:34;47449:14;47430:34;;;;;;;;;;;;47408:56;;47514:11;47481:12;:18;47494:4;47481:18;;;;;;;;;;;;;;;:30;47500:10;47481:30;;;;;;;;;;;:44;;;;47631:10;47598:17;:30;47616:11;47598:30;;;;;;;;;;;:43;;;;47359:328;;47783:17;:26;47801:7;47783:26;;;;;;;;;;;47776:33;;;47827:12;:18;47840:4;47827:18;;;;;;;;;;;;;;;:34;47846:14;47827:34;;;;;;;;;;;47820:41;;;46881:988;;;;:::o;48164:1079::-;48417:22;48462:1;48442:10;:17;;;;:21;;;;:::i;:::-;48417:46;;48474:18;48495:15;:24;48511:7;48495:24;;;;;;;;;;;;48474:45;;48846:19;48868:10;48879:14;48868:26;;;;;;;;;;;;;;;;;;;;;;;;48846:48;;48932:11;48907:10;48918;48907:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;49043:10;49012:15;:28;49028:11;49012:28;;;;;;;;;;;:41;;;;49184:15;:24;49200:7;49184:24;;;;;;;;;;;49177:31;;;49219:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48164:1079;;;;:::o;45668:221::-;45753:14;45770:20;45787:2;45770:16;:20::i;:::-;45753:37;;45828:7;45801:12;:16;45814:2;45801:16;;;;;;;;;;;;;;;:24;45818:6;45801:24;;;;;;;;;;;:34;;;;45875:6;45846:17;:26;45864:7;45846:26;;;;;;;;;;;:35;;;;45668:221;;;:::o;9688:422::-;9748:4;9956:12;10067:7;10055:20;10047:28;;10101:1;10094:4;:8;10087:15;;;9688:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:143::-;;938:6;932:13;923:22;;954:33;981:5;954:33;:::i;:::-;913:80;;;;:::o;999:133::-;;1080:6;1067:20;1058:29;;1096:30;1120:5;1096:30;:::i;:::-;1048:84;;;;:::o;1138:137::-;;1223:6;1217:13;1208:22;;1239:30;1263:5;1239:30;:::i;:::-;1198:77;;;;:::o;1281:137::-;;1364:6;1351:20;1342:29;;1380:32;1406:5;1380:32;:::i;:::-;1332:86;;;;:::o;1424:141::-;;1511:6;1505:13;1496:22;;1527:32;1553:5;1527:32;:::i;:::-;1486:79;;;;:::o;1584:271::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:78;1845:3;1837:6;1830:4;1822:6;1818:17;1771:78;:::i;:::-;1762:87;;1645:210;;;;;:::o;1875:273::-;;1980:3;1973:4;1965:6;1961:17;1957:27;1947:2;;1998:1;1995;1988:12;1947:2;2038:6;2025:20;2063:79;2138:3;2130:6;2123:4;2115:6;2111:17;2063:79;:::i;:::-;2054:88;;1937:211;;;;;:::o;2154:139::-;;2238:6;2225:20;2216:29;;2254:33;2281:5;2254:33;:::i;:::-;2206:87;;;;:::o;2299:143::-;;2387:6;2381:13;2372:22;;2403:33;2430:5;2403:33;:::i;:::-;2362:80;;;;:::o;2448:262::-;;2556:2;2544:9;2535:7;2531:23;2527:32;2524:2;;;2572:1;2569;2562:12;2524:2;2615:1;2640:53;2685:7;2676:6;2665:9;2661:22;2640:53;:::i;:::-;2630:63;;2586:117;2514:196;;;;:::o;2716:284::-;;2835:2;2823:9;2814:7;2810:23;2806:32;2803:2;;;2851:1;2848;2841:12;2803:2;2894:1;2919:64;2975:7;2966:6;2955:9;2951:22;2919:64;:::i;:::-;2909:74;;2865:128;2793:207;;;;:::o;3006:407::-;;;3131:2;3119:9;3110:7;3106:23;3102:32;3099:2;;;3147:1;3144;3137:12;3099:2;3190:1;3215:53;3260:7;3251:6;3240:9;3236:22;3215:53;:::i;:::-;3205:63;;3161:117;3317:2;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3288:118;3089:324;;;;;:::o;3419:552::-;;;;3561:2;3549:9;3540:7;3536:23;3532:32;3529:2;;;3577:1;3574;3567:12;3529:2;3620:1;3645:53;3690:7;3681:6;3670:9;3666:22;3645:53;:::i;:::-;3635:63;;3591:117;3747:2;3773:53;3818:7;3809:6;3798:9;3794:22;3773:53;:::i;:::-;3763:63;;3718:118;3875:2;3901:53;3946:7;3937:6;3926:9;3922:22;3901:53;:::i;:::-;3891:63;;3846:118;3519:452;;;;;:::o;3977:809::-;;;;;4145:3;4133:9;4124:7;4120:23;4116:33;4113:2;;;4162:1;4159;4152:12;4113:2;4205:1;4230:53;4275:7;4266:6;4255:9;4251:22;4230:53;:::i;:::-;4220:63;;4176:117;4332:2;4358:53;4403:7;4394:6;4383:9;4379:22;4358:53;:::i;:::-;4348:63;;4303:118;4460:2;4486:53;4531:7;4522:6;4511:9;4507:22;4486:53;:::i;:::-;4476:63;;4431:118;4616:2;4605:9;4601:18;4588:32;4647:18;4639:6;4636:30;4633:2;;;4679:1;4676;4669:12;4633:2;4707:62;4761:7;4752:6;4741:9;4737:22;4707:62;:::i;:::-;4697:72;;4559:220;4103:683;;;;;;;:::o;4792:401::-;;;4914:2;4902:9;4893:7;4889:23;4885:32;4882:2;;;4930:1;4927;4920:12;4882:2;4973:1;4998:53;5043:7;5034:6;5023:9;5019:22;4998:53;:::i;:::-;4988:63;;4944:117;5100:2;5126:50;5168:7;5159:6;5148:9;5144:22;5126:50;:::i;:::-;5116:60;;5071:115;4872:321;;;;;:::o;5199:407::-;;;5324:2;5312:9;5303:7;5299:23;5295:32;5292:2;;;5340:1;5337;5330:12;5292:2;5383:1;5408:53;5453:7;5444:6;5433:9;5429:22;5408:53;:::i;:::-;5398:63;;5354:117;5510:2;5536:53;5581:7;5572:6;5561:9;5557:22;5536:53;:::i;:::-;5526:63;;5481:118;5282:324;;;;;:::o;5612:278::-;;5728:2;5716:9;5707:7;5703:23;5699:32;5696:2;;;5744:1;5741;5734:12;5696:2;5787:1;5812:61;5865:7;5856:6;5845:9;5841:22;5812:61;:::i;:::-;5802:71;;5758:125;5686:204;;;;:::o;5896:260::-;;6003:2;5991:9;5982:7;5978:23;5974:32;5971:2;;;6019:1;6016;6009:12;5971:2;6062:1;6087:52;6131:7;6122:6;6111:9;6107:22;6087:52;:::i;:::-;6077:62;;6033:116;5961:195;;;;:::o;6162:282::-;;6280:2;6268:9;6259:7;6255:23;6251:32;6248:2;;;6296:1;6293;6286:12;6248:2;6339:1;6364:63;6419:7;6410:6;6399:9;6395:22;6364:63;:::i;:::-;6354:73;;6310:127;6238:206;;;;:::o;6450:375::-;;6568:2;6556:9;6547:7;6543:23;6539:32;6536:2;;;6584:1;6581;6574:12;6536:2;6655:1;6644:9;6640:17;6627:31;6685:18;6677:6;6674:30;6671:2;;;6717:1;6714;6707:12;6671:2;6745:63;6800:7;6791:6;6780:9;6776:22;6745:63;:::i;:::-;6735:73;;6598:220;6526:299;;;;:::o;6831:262::-;;6939:2;6927:9;6918:7;6914:23;6910:32;6907:2;;;6955:1;6952;6945:12;6907:2;6998:1;7023:53;7068:7;7059:6;7048:9;7044:22;7023:53;:::i;:::-;7013:63;;6969:117;6897:196;;;;:::o;7099:284::-;;7218:2;7206:9;7197:7;7193:23;7189:32;7186:2;;;7234:1;7231;7224:12;7186:2;7277:1;7302:64;7358:7;7349:6;7338:9;7334:22;7302:64;:::i;:::-;7292:74;;7248:128;7176:207;;;;:::o;7389:407::-;;;7514:2;7502:9;7493:7;7489:23;7485:32;7482:2;;;7530:1;7527;7520:12;7482:2;7573:1;7598:53;7643:7;7634:6;7623:9;7619:22;7598:53;:::i;:::-;7588:63;;7544:117;7700:2;7726:53;7771:7;7762:6;7751:9;7747:22;7726:53;:::i;:::-;7716:63;;7671:118;7472:324;;;;;:::o;7802:552::-;;;;7944:2;7932:9;7923:7;7919:23;7915:32;7912:2;;;7960:1;7957;7950:12;7912:2;8003:1;8028:53;8073:7;8064:6;8053:9;8049:22;8028:53;:::i;:::-;8018:63;;7974:117;8130:2;8156:53;8201:7;8192:6;8181:9;8177:22;8156:53;:::i;:::-;8146:63;;8101:118;8258:2;8284:53;8329:7;8320:6;8309:9;8305:22;8284:53;:::i;:::-;8274:63;;8229:118;7902:452;;;;;:::o;8360:118::-;8447:24;8465:5;8447:24;:::i;:::-;8442:3;8435:37;8425:53;;:::o;8484:109::-;8565:21;8580:5;8565:21;:::i;:::-;8560:3;8553:34;8543:50;;:::o;8599:360::-;;8713:38;8745:5;8713:38;:::i;:::-;8767:70;8830:6;8825:3;8767:70;:::i;:::-;8760:77;;8846:52;8891:6;8886:3;8879:4;8872:5;8868:16;8846:52;:::i;:::-;8923:29;8945:6;8923:29;:::i;:::-;8918:3;8914:39;8907:46;;8689:270;;;;;:::o;8965:364::-;;9081:39;9114:5;9081:39;:::i;:::-;9136:71;9200:6;9195:3;9136:71;:::i;:::-;9129:78;;9216:52;9261:6;9256:3;9249:4;9242:5;9238:16;9216:52;:::i;:::-;9293:29;9315:6;9293:29;:::i;:::-;9288:3;9284:39;9277:46;;9057:272;;;;;:::o;9335:377::-;;9469:39;9502:5;9469:39;:::i;:::-;9524:89;9606:6;9601:3;9524:89;:::i;:::-;9517:96;;9622:52;9667:6;9662:3;9655:4;9648:5;9644:16;9622:52;:::i;:::-;9699:6;9694:3;9690:16;9683:23;;9445:267;;;;;:::o;9718:367::-;;9881:67;9945:2;9940:3;9881:67;:::i;:::-;9874:74;;9978:34;9974:1;9969:3;9965:11;9958:55;10044:5;10039:2;10034:3;10030:12;10023:27;10076:2;10071:3;10067:12;10060:19;;9864:221;;;:::o;10091:318::-;;10254:67;10318:2;10313:3;10254:67;:::i;:::-;10247:74;;10351:22;10347:1;10342:3;10338:11;10331:43;10400:2;10395:3;10391:12;10384:19;;10237:172;;;:::o;10415:375::-;;10578:67;10642:2;10637:3;10578:67;:::i;:::-;10571:74;;10675:34;10671:1;10666:3;10662:11;10655:55;10741:13;10736:2;10731:3;10727:12;10720:35;10781:2;10776:3;10772:12;10765:19;;10561:229;;;:::o;10796:382::-;;10959:67;11023:2;11018:3;10959:67;:::i;:::-;10952:74;;11056:34;11052:1;11047:3;11043:11;11036:55;11122:20;11117:2;11112:3;11108:12;11101:42;11169:2;11164:3;11160:12;11153:19;;10942:236;;;:::o;11184:370::-;;11347:67;11411:2;11406:3;11347:67;:::i;:::-;11340:74;;11444:34;11440:1;11435:3;11431:11;11424:55;11510:8;11505:2;11500:3;11496:12;11489:30;11545:2;11540:3;11536:12;11529:19;;11330:224;;;:::o;11560:374::-;;11723:67;11787:2;11782:3;11723:67;:::i;:::-;11716:74;;11820:34;11816:1;11811:3;11807:11;11800:55;11886:12;11881:2;11876:3;11872:12;11865:34;11925:2;11920:3;11916:12;11909:19;;11706:228;;;:::o;11940:326::-;;12103:67;12167:2;12162:3;12103:67;:::i;:::-;12096:74;;12200:30;12196:1;12191:3;12187:11;12180:51;12257:2;12252:3;12248:12;12241:19;;12086:180;;;:::o;12272:376::-;;12435:67;12499:2;12494:3;12435:67;:::i;:::-;12428:74;;12532:34;12528:1;12523:3;12519:11;12512:55;12598:14;12593:2;12588:3;12584:12;12577:36;12639:2;12634:3;12630:12;12623:19;;12418:230;;;:::o;12654:368::-;;12817:67;12881:2;12876:3;12817:67;:::i;:::-;12810:74;;12914:34;12910:1;12905:3;12901:11;12894:55;12980:6;12975:2;12970:3;12966:12;12959:28;13013:2;13008:3;13004:12;12997:19;;12800:222;;;:::o;13028:323::-;;13191:67;13255:2;13250:3;13191:67;:::i;:::-;13184:74;;13288:27;13284:1;13279:3;13275:11;13268:48;13342:2;13337:3;13333:12;13326:19;;13174:177;;;:::o;13357:327::-;;13520:67;13584:2;13579:3;13520:67;:::i;:::-;13513:74;;13617:31;13613:1;13608:3;13604:11;13597:52;13675:2;13670:3;13666:12;13659:19;;13503:181;;;:::o;13690:376::-;;13853:67;13917:2;13912:3;13853:67;:::i;:::-;13846:74;;13950:34;13946:1;13941:3;13937:11;13930:55;14016:14;14011:2;14006:3;14002:12;13995:36;14057:2;14052:3;14048:12;14041:19;;13836:230;;;:::o;14072:327::-;;14235:67;14299:2;14294:3;14235:67;:::i;:::-;14228:74;;14332:31;14328:1;14323:3;14319:11;14312:52;14390:2;14385:3;14381:12;14374:19;;14218:181;;;:::o;14405:369::-;;14568:67;14632:2;14627:3;14568:67;:::i;:::-;14561:74;;14665:34;14661:1;14656:3;14652:11;14645:55;14731:7;14726:2;14721:3;14717:12;14710:29;14765:2;14760:3;14756:12;14749:19;;14551:223;;;:::o;14780:388::-;;14943:67;15007:2;15002:3;14943:67;:::i;:::-;14936:74;;15040:34;15036:1;15031:3;15027:11;15020:55;15106:26;15101:2;15096:3;15092:12;15085:48;15159:2;15154:3;15150:12;15143:19;;14926:242;;;:::o;15174:374::-;;15337:67;15401:2;15396:3;15337:67;:::i;:::-;15330:74;;15434:34;15430:1;15425:3;15421:11;15414:55;15500:12;15495:2;15490:3;15486:12;15479:34;15539:2;15534:3;15530:12;15523:19;;15320:228;;;:::o;15554:373::-;;15717:67;15781:2;15776:3;15717:67;:::i;:::-;15710:74;;15814:34;15810:1;15805:3;15801:11;15794:55;15880:11;15875:2;15870:3;15866:12;15859:33;15918:2;15913:3;15909:12;15902:19;;15700:227;;;:::o;15933:371::-;;16096:67;16160:2;16155:3;16096:67;:::i;:::-;16089:74;;16193:34;16189:1;16184:3;16180:11;16173:55;16259:9;16254:2;16249:3;16245:12;16238:31;16295:2;16290:3;16286:12;16279:19;;16079:225;;;:::o;16310:368::-;;16473:67;16537:2;16532:3;16473:67;:::i;:::-;16466:74;;16570:34;16566:1;16561:3;16557:11;16550:55;16636:6;16631:2;16626:3;16622:12;16615:28;16669:2;16664:3;16660:12;16653:19;;16456:222;;;:::o;16684:330::-;;16847:67;16911:2;16906:3;16847:67;:::i;:::-;16840:74;;16944:34;16940:1;16935:3;16931:11;16924:55;17005:2;17000:3;16996:12;16989:19;;16830:184;;;:::o;17020:316::-;;17183:67;17247:2;17242:3;17183:67;:::i;:::-;17176:74;;17280:20;17276:1;17271:3;17267:11;17260:41;17327:2;17322:3;17318:12;17311:19;;17166:170;;;:::o;17342:315::-;;17505:67;17569:2;17564:3;17505:67;:::i;:::-;17498:74;;17602:19;17598:1;17593:3;17589:11;17582:40;17648:2;17643:3;17639:12;17632:19;;17488:169;;;:::o;17663:330::-;;17826:67;17890:2;17885:3;17826:67;:::i;:::-;17819:74;;17923:34;17919:1;17914:3;17910:11;17903:55;17984:2;17979:3;17975:12;17968:19;;17809:184;;;:::o;17999:376::-;;18162:67;18226:2;18221:3;18162:67;:::i;:::-;18155:74;;18259:34;18255:1;18250:3;18246:11;18239:55;18325:14;18320:2;18315:3;18311:12;18304:36;18366:2;18361:3;18357:12;18350:19;;18145:230;;;:::o;18381:309::-;;18544:67;18608:2;18603:3;18544:67;:::i;:::-;18537:74;;18641:13;18637:1;18632:3;18628:11;18621:34;18681:2;18676:3;18672:12;18665:19;;18527:163;;;:::o;18696:330::-;;18859:67;18923:2;18918:3;18859:67;:::i;:::-;18852:74;;18956:34;18952:1;18947:3;18943:11;18936:55;19017:2;19012:3;19008:12;19001:19;;18842:184;;;:::o;19032:373::-;;19195:67;19259:2;19254:3;19195:67;:::i;:::-;19188:74;;19292:34;19288:1;19283:3;19279:11;19272:55;19358:11;19353:2;19348:3;19344:12;19337:33;19396:2;19391:3;19387:12;19380:19;;19178:227;;;:::o;19411:441::-;;19574:67;19638:2;19633:3;19574:67;:::i;:::-;19567:74;;19671:34;19667:1;19662:3;19658:11;19651:55;19737:34;19732:2;19727:3;19723:12;19716:56;19803:13;19798:2;19793:3;19789:12;19782:35;19843:2;19838:3;19834:12;19827:19;;19557:295;;;:::o;19858:379::-;;20021:67;20085:2;20080:3;20021:67;:::i;:::-;20014:74;;20118:34;20114:1;20109:3;20105:11;20098:55;20184:17;20179:2;20174:3;20170:12;20163:39;20228:2;20223:3;20219:12;20212:19;;20004:233;;;:::o;20243:365::-;;20406:67;20470:2;20465:3;20406:67;:::i;:::-;20399:74;;20503:34;20499:1;20494:3;20490:11;20483:55;20569:3;20564:2;20559:3;20555:12;20548:25;20599:2;20594:3;20590:12;20583:19;;20389:219;;;:::o;20614:381::-;;20777:67;20841:2;20836:3;20777:67;:::i;:::-;20770:74;;20874:34;20870:1;20865:3;20861:11;20854:55;20940:19;20935:2;20930:3;20926:12;20919:41;20986:2;20981:3;20977:12;20970:19;;20760:235;;;:::o;21001:388::-;;21164:67;21228:2;21223:3;21164:67;:::i;:::-;21157:74;;21261:34;21257:1;21252:3;21248:11;21241:55;21327:26;21322:2;21317:3;21313:12;21306:48;21380:2;21375:3;21371:12;21364:19;;21147:242;;;:::o;21395:376::-;;21558:67;21622:2;21617:3;21558:67;:::i;:::-;21551:74;;21655:34;21651:1;21646:3;21642:11;21635:55;21721:14;21716:2;21711:3;21707:12;21700:36;21762:2;21757:3;21753:12;21746:19;;21541:230;;;:::o;21777:367::-;;21940:67;22004:2;21999:3;21940:67;:::i;:::-;21933:74;;22037:34;22033:1;22028:3;22024:11;22017:55;22103:5;22098:2;22093:3;22089:12;22082:27;22135:2;22130:3;22126:12;22119:19;;21923:221;;;:::o;22150:367::-;;22313:67;22377:2;22372:3;22313:67;:::i;:::-;22306:74;;22410:34;22406:1;22401:3;22397:11;22390:55;22476:5;22471:2;22466:3;22462:12;22455:27;22508:2;22503:3;22499:12;22492:19;;22296:221;;;:::o;22523:118::-;22610:24;22628:5;22610:24;:::i;:::-;22605:3;22598:37;22588:53;;:::o;22647:435::-;;22849:95;22940:3;22931:6;22849:95;:::i;:::-;22842:102;;22961:95;23052:3;23043:6;22961:95;:::i;:::-;22954:102;;23073:3;23066:10;;22831:251;;;;;:::o;23088:222::-;;23219:2;23208:9;23204:18;23196:26;;23232:71;23300:1;23289:9;23285:17;23276:6;23232:71;:::i;:::-;23186:124;;;;:::o;23316:640::-;;23549:3;23538:9;23534:19;23526:27;;23563:71;23631:1;23620:9;23616:17;23607:6;23563:71;:::i;:::-;23644:72;23712:2;23701:9;23697:18;23688:6;23644:72;:::i;:::-;23726;23794:2;23783:9;23779:18;23770:6;23726:72;:::i;:::-;23845:9;23839:4;23835:20;23830:2;23819:9;23815:18;23808:48;23873:76;23944:4;23935:6;23873:76;:::i;:::-;23865:84;;23516:440;;;;;;;:::o;23962:332::-;;24121:2;24110:9;24106:18;24098:26;;24134:71;24202:1;24191:9;24187:17;24178:6;24134:71;:::i;:::-;24215:72;24283:2;24272:9;24268:18;24259:6;24215:72;:::i;:::-;24088:206;;;;;:::o;24300:553::-;;24515:3;24504:9;24500:19;24492:27;;24529:71;24597:1;24586:9;24582:17;24573:6;24529:71;:::i;:::-;24610:72;24678:2;24667:9;24663:18;24654:6;24610:72;:::i;:::-;24692;24760:2;24749:9;24745:18;24736:6;24692:72;:::i;:::-;24774;24842:2;24831:9;24827:18;24818:6;24774:72;:::i;:::-;24482:371;;;;;;;:::o;24859:210::-;;24984:2;24973:9;24969:18;24961:26;;24997:65;25059:1;25048:9;25044:17;25035:6;24997:65;:::i;:::-;24951:118;;;;:::o;25075:313::-;;25226:2;25215:9;25211:18;25203:26;;25275:9;25269:4;25265:20;25261:1;25250:9;25246:17;25239:47;25303:78;25376:4;25367:6;25303:78;:::i;:::-;25295:86;;25193:195;;;;:::o;25394:419::-;;25598:2;25587:9;25583:18;25575:26;;25647:9;25641:4;25637:20;25633:1;25622:9;25618:17;25611:47;25675:131;25801:4;25675:131;:::i;:::-;25667:139;;25565:248;;;:::o;25819:419::-;;26023:2;26012:9;26008:18;26000:26;;26072:9;26066:4;26062:20;26058:1;26047:9;26043:17;26036:47;26100:131;26226:4;26100:131;:::i;:::-;26092:139;;25990:248;;;:::o;26244:419::-;;26448:2;26437:9;26433:18;26425:26;;26497:9;26491:4;26487:20;26483:1;26472:9;26468:17;26461:47;26525:131;26651:4;26525:131;:::i;:::-;26517:139;;26415:248;;;:::o;26669:419::-;;26873:2;26862:9;26858:18;26850:26;;26922:9;26916:4;26912:20;26908:1;26897:9;26893:17;26886:47;26950:131;27076:4;26950:131;:::i;:::-;26942:139;;26840:248;;;:::o;27094:419::-;;27298:2;27287:9;27283:18;27275:26;;27347:9;27341:4;27337:20;27333:1;27322:9;27318:17;27311:47;27375:131;27501:4;27375:131;:::i;:::-;27367:139;;27265:248;;;:::o;27519:419::-;;27723:2;27712:9;27708:18;27700:26;;27772:9;27766:4;27762:20;27758:1;27747:9;27743:17;27736:47;27800:131;27926:4;27800:131;:::i;:::-;27792:139;;27690:248;;;:::o;27944:419::-;;28148:2;28137:9;28133:18;28125:26;;28197:9;28191:4;28187:20;28183:1;28172:9;28168:17;28161:47;28225:131;28351:4;28225:131;:::i;:::-;28217:139;;28115:248;;;:::o;28369:419::-;;28573:2;28562:9;28558:18;28550:26;;28622:9;28616:4;28612:20;28608:1;28597:9;28593:17;28586:47;28650:131;28776:4;28650:131;:::i;:::-;28642:139;;28540:248;;;:::o;28794:419::-;;28998:2;28987:9;28983:18;28975:26;;29047:9;29041:4;29037:20;29033:1;29022:9;29018:17;29011:47;29075:131;29201:4;29075:131;:::i;:::-;29067:139;;28965:248;;;:::o;29219:419::-;;29423:2;29412:9;29408:18;29400:26;;29472:9;29466:4;29462:20;29458:1;29447:9;29443:17;29436:47;29500:131;29626:4;29500:131;:::i;:::-;29492:139;;29390:248;;;:::o;29644:419::-;;29848:2;29837:9;29833:18;29825:26;;29897:9;29891:4;29887:20;29883:1;29872:9;29868:17;29861:47;29925:131;30051:4;29925:131;:::i;:::-;29917:139;;29815:248;;;:::o;30069:419::-;;30273:2;30262:9;30258:18;30250:26;;30322:9;30316:4;30312:20;30308:1;30297:9;30293:17;30286:47;30350:131;30476:4;30350:131;:::i;:::-;30342:139;;30240:248;;;:::o;30494:419::-;;30698:2;30687:9;30683:18;30675:26;;30747:9;30741:4;30737:20;30733:1;30722:9;30718:17;30711:47;30775:131;30901:4;30775:131;:::i;:::-;30767:139;;30665:248;;;:::o;30919:419::-;;31123:2;31112:9;31108:18;31100:26;;31172:9;31166:4;31162:20;31158:1;31147:9;31143:17;31136:47;31200:131;31326:4;31200:131;:::i;:::-;31192:139;;31090:248;;;:::o;31344:419::-;;31548:2;31537:9;31533:18;31525:26;;31597:9;31591:4;31587:20;31583:1;31572:9;31568:17;31561:47;31625:131;31751:4;31625:131;:::i;:::-;31617:139;;31515:248;;;:::o;31769:419::-;;31973:2;31962:9;31958:18;31950:26;;32022:9;32016:4;32012:20;32008:1;31997:9;31993:17;31986:47;32050:131;32176:4;32050:131;:::i;:::-;32042:139;;31940:248;;;:::o;32194:419::-;;32398:2;32387:9;32383:18;32375:26;;32447:9;32441:4;32437:20;32433:1;32422:9;32418:17;32411:47;32475:131;32601:4;32475:131;:::i;:::-;32467:139;;32365:248;;;:::o;32619:419::-;;32823:2;32812:9;32808:18;32800:26;;32872:9;32866:4;32862:20;32858:1;32847:9;32843:17;32836:47;32900:131;33026:4;32900:131;:::i;:::-;32892:139;;32790:248;;;:::o;33044:419::-;;33248:2;33237:9;33233:18;33225:26;;33297:9;33291:4;33287:20;33283:1;33272:9;33268:17;33261:47;33325:131;33451:4;33325:131;:::i;:::-;33317:139;;33215:248;;;:::o;33469:419::-;;33673:2;33662:9;33658:18;33650:26;;33722:9;33716:4;33712:20;33708:1;33697:9;33693:17;33686:47;33750:131;33876:4;33750:131;:::i;:::-;33742:139;;33640:248;;;:::o;33894:419::-;;34098:2;34087:9;34083:18;34075:26;;34147:9;34141:4;34137:20;34133:1;34122:9;34118:17;34111:47;34175:131;34301:4;34175:131;:::i;:::-;34167:139;;34065:248;;;:::o;34319:419::-;;34523:2;34512:9;34508:18;34500:26;;34572:9;34566:4;34562:20;34558:1;34547:9;34543:17;34536:47;34600:131;34726:4;34600:131;:::i;:::-;34592:139;;34490:248;;;:::o;34744:419::-;;34948:2;34937:9;34933:18;34925:26;;34997:9;34991:4;34987:20;34983:1;34972:9;34968:17;34961:47;35025:131;35151:4;35025:131;:::i;:::-;35017:139;;34915:248;;;:::o;35169:419::-;;35373:2;35362:9;35358:18;35350:26;;35422:9;35416:4;35412:20;35408:1;35397:9;35393:17;35386:47;35450:131;35576:4;35450:131;:::i;:::-;35442:139;;35340:248;;;:::o;35594:419::-;;35798:2;35787:9;35783:18;35775:26;;35847:9;35841:4;35837:20;35833:1;35822:9;35818:17;35811:47;35875:131;36001:4;35875:131;:::i;:::-;35867:139;;35765:248;;;:::o;36019:419::-;;36223:2;36212:9;36208:18;36200:26;;36272:9;36266:4;36262:20;36258:1;36247:9;36243:17;36236:47;36300:131;36426:4;36300:131;:::i;:::-;36292:139;;36190:248;;;:::o;36444:419::-;;36648:2;36637:9;36633:18;36625:26;;36697:9;36691:4;36687:20;36683:1;36672:9;36668:17;36661:47;36725:131;36851:4;36725:131;:::i;:::-;36717:139;;36615:248;;;:::o;36869:419::-;;37073:2;37062:9;37058:18;37050:26;;37122:9;37116:4;37112:20;37108:1;37097:9;37093:17;37086:47;37150:131;37276:4;37150:131;:::i;:::-;37142:139;;37040:248;;;:::o;37294:419::-;;37498:2;37487:9;37483:18;37475:26;;37547:9;37541:4;37537:20;37533:1;37522:9;37518:17;37511:47;37575:131;37701:4;37575:131;:::i;:::-;37567:139;;37465:248;;;:::o;37719:419::-;;37923:2;37912:9;37908:18;37900:26;;37972:9;37966:4;37962:20;37958:1;37947:9;37943:17;37936:47;38000:131;38126:4;38000:131;:::i;:::-;37992:139;;37890:248;;;:::o;38144:419::-;;38348:2;38337:9;38333:18;38325:26;;38397:9;38391:4;38387:20;38383:1;38372:9;38368:17;38361:47;38425:131;38551:4;38425:131;:::i;:::-;38417:139;;38315:248;;;:::o;38569:419::-;;38773:2;38762:9;38758:18;38750:26;;38822:9;38816:4;38812:20;38808:1;38797:9;38793:17;38786:47;38850:131;38976:4;38850:131;:::i;:::-;38842:139;;38740:248;;;:::o;38994:419::-;;39198:2;39187:9;39183:18;39175:26;;39247:9;39241:4;39237:20;39233:1;39222:9;39218:17;39211:47;39275:131;39401:4;39275:131;:::i;:::-;39267:139;;39165:248;;;:::o;39419:419::-;;39623:2;39612:9;39608:18;39600:26;;39672:9;39666:4;39662:20;39658:1;39647:9;39643:17;39636:47;39700:131;39826:4;39700:131;:::i;:::-;39692:139;;39590:248;;;:::o;39844:419::-;;40048:2;40037:9;40033:18;40025:26;;40097:9;40091:4;40087:20;40083:1;40072:9;40068:17;40061:47;40125:131;40251:4;40125:131;:::i;:::-;40117:139;;40015:248;;;:::o;40269:222::-;;40400:2;40389:9;40385:18;40377:26;;40413:71;40481:1;40470:9;40466:17;40457:6;40413:71;:::i;:::-;40367:124;;;;:::o;40497:283::-;;40563:2;40557:9;40547:19;;40605:4;40597:6;40593:17;40712:6;40700:10;40697:22;40676:18;40664:10;40661:34;40658:62;40655:2;;;40723:18;;:::i;:::-;40655:2;40763:10;40759:2;40752:22;40537:243;;;;:::o;40786:331::-;;40937:18;40929:6;40926:30;40923:2;;;40959:18;;:::i;:::-;40923:2;41044:4;41040:9;41033:4;41025:6;41021:17;41017:33;41009:41;;41105:4;41099;41095:15;41087:23;;40852:265;;;:::o;41123:332::-;;41275:18;41267:6;41264:30;41261:2;;;41297:18;;:::i;:::-;41261:2;41382:4;41378:9;41371:4;41363:6;41359:17;41355:33;41347:41;;41443:4;41437;41433:15;41425:23;;41190:265;;;:::o;41461:98::-;;41546:5;41540:12;41530:22;;41519:40;;;:::o;41565:99::-;;41651:5;41645:12;41635:22;;41624:40;;;:::o;41670:168::-;;41787:6;41782:3;41775:19;41827:4;41822:3;41818:14;41803:29;;41765:73;;;;:::o;41844:169::-;;41962:6;41957:3;41950:19;42002:4;41997:3;41993:14;41978:29;;41940:73;;;;:::o;42019:148::-;;42158:3;42143:18;;42133:34;;;;:::o;42173:305::-;;42232:20;42250:1;42232:20;:::i;:::-;42227:25;;42266:20;42284:1;42266:20;:::i;:::-;42261:25;;42420:1;42352:66;42348:74;42345:1;42342:81;42339:2;;;42426:18;;:::i;:::-;42339:2;42470:1;42467;42463:9;42456:16;;42217:261;;;;:::o;42484:185::-;;42541:20;42559:1;42541:20;:::i;:::-;42536:25;;42575:20;42593:1;42575:20;:::i;:::-;42570:25;;42614:1;42604:2;;42619:18;;:::i;:::-;42604:2;42661:1;42658;42654:9;42649:14;;42526:143;;;;:::o;42675:191::-;;42735:20;42753:1;42735:20;:::i;:::-;42730:25;;42769:20;42787:1;42769:20;:::i;:::-;42764:25;;42808:1;42805;42802:8;42799:2;;;42813:18;;:::i;:::-;42799:2;42858:1;42855;42851:9;42843:17;;42720:146;;;;:::o;42872:96::-;;42938:24;42956:5;42938:24;:::i;:::-;42927:35;;42917:51;;;:::o;42974:90::-;;43051:5;43044:13;43037:21;43026:32;;43016:48;;;:::o;43070:149::-;;43146:66;43139:5;43135:78;43124:89;;43114:105;;;:::o;43225:126::-;;43302:42;43295:5;43291:54;43280:65;;43270:81;;;:::o;43357:77::-;;43423:5;43412:16;;43402:32;;;:::o;43440:154::-;43524:6;43519:3;43514;43501:30;43586:1;43577:6;43572:3;43568:16;43561:27;43491:103;;;:::o;43600:307::-;43668:1;43678:113;43692:6;43689:1;43686:13;43678:113;;;43777:1;43772:3;43768:11;43762:18;43758:1;43753:3;43749:11;43742:39;43714:2;43711:1;43707:10;43702:15;;43678:113;;;43809:6;43806:1;43803:13;43800:2;;;43889:1;43880:6;43875:3;43871:16;43864:27;43800:2;43649:258;;;;:::o;43913:320::-;;43994:1;43988:4;43984:12;43974:22;;44041:1;44035:4;44031:12;44062:18;44052:2;;44118:4;44110:6;44106:17;44096:27;;44052:2;44180;44172:6;44169:14;44149:18;44146:38;44143:2;;;44199:18;;:::i;:::-;44143:2;43964:269;;;;:::o;44239:233::-;;44301:24;44319:5;44301:24;:::i;:::-;44292:33;;44347:66;44340:5;44337:77;44334:2;;;44417:18;;:::i;:::-;44334:2;44464:1;44457:5;44453:13;44446:20;;44282:190;;;:::o;44478:176::-;;44527:20;44545:1;44527:20;:::i;:::-;44522:25;;44561:20;44579:1;44561:20;:::i;:::-;44556:25;;44600:1;44590:2;;44605:18;;:::i;:::-;44590:2;44646:1;44643;44639:9;44634:14;;44512:142;;;;:::o;44660:180::-;44708:77;44705:1;44698:88;44805:4;44802:1;44795:15;44829:4;44826:1;44819:15;44846:180;44894:77;44891:1;44884:88;44991:4;44988:1;44981:15;45015:4;45012:1;45005:15;45032:180;45080:77;45077:1;45070:88;45177:4;45174:1;45167:15;45201:4;45198:1;45191:15;45218:180;45266:77;45263:1;45256:88;45363:4;45360:1;45353:15;45387:4;45384:1;45377:15;45404:102;;45496:2;45492:7;45487:2;45480:5;45476:14;45472:28;45462:38;;45452:54;;;:::o;45512:122::-;45585:24;45603:5;45585:24;:::i;:::-;45578:5;45575:35;45565:2;;45624:1;45621;45614:12;45565:2;45555:79;:::o;45640:116::-;45710:21;45725:5;45710:21;:::i;:::-;45703:5;45700:32;45690:2;;45746:1;45743;45736:12;45690:2;45680:76;:::o;45762:120::-;45834:23;45851:5;45834:23;:::i;:::-;45827:5;45824:34;45814:2;;45872:1;45869;45862:12;45814:2;45804:78;:::o;45888:122::-;45961:24;45979:5;45961:24;:::i;:::-;45954:5;45951:35;45941:2;;46000:1;45997;45990:12;45941:2;45931:79;:::o

Swarm Source

ipfs://288c85e5421c044b17a9dca16aa93e2564bf888f6b52c05ef2924b64ed3c693b
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.