ETH Price: $3,262.13 (+4.45%)
Gas: 2 Gwei

Token

ThievesGang ()
 

Overview

Max Total Supply

94

Holders

63

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xeea89c8843e8beb56e411bb4cac6dbc2d937ee1d
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:
ThievesGang

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol



pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol



pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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



pragma solidity ^0.8.0;

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

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

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is 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. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol



pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: contracts/ThievesGang.sol

pragma solidity ^0.8.0;











/*
                                                 ............
                                        .;;;;;;;*SSSSSSS%%%S?;;:
                                     ;++%@@SSSSSSSSSSSSSSSS%%SS%+++.
                                  +%%S@@@SSSSSSSSSSSSSSSSSSSSSS%SSS?+
                               .+S@@@@SSSSSSSSSSSSSSSSSSSSSSSSSSS%%SS%+.
                             .+S@@@@SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS%%SS?
                            +%@@@@SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS%%SS%*:
                          +S@@@@@SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS%%SS+.
                        .:*@@@@SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS%%S?;.
                        .S@@@@SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS%%SS+
                       +%@@@@SSSSS%%%S@@@@S%%%%SSSSSSSSSSSSSSSSSSSSSSSSSSS%S%*.
                     ..?@@@@SSSSSS%S@@@@@@@@@@@@S%%SSSSSSSSSSSSSSSSSSSSSSS%%S%:
                     ;@@@@@@SSSSS@@@@SSS%??%SSSS@@SSS%%SSSSSSSSSSSSSSSSSSSS%S%+:
                     :@@@@SSSS@@@S%%????????????%S@@@@S%SSSSSSSSSSSSSSSSSSS%%%S*
                     :@@SSSS@@@S%???%?????????????%S@@@@SSSSSSSSSSSSSSSSSSSSS%%%?:
                    :+@@SS@@@@@%?%%%%%%??????????%%%%S@@@@SSSSSSSSSSSSSSSSSSS%%SS;
                    ?@SSS@@@S%??%%%%%%%%???????%%%%%%???S@@@@SSSSSSSSSSSSSSSS%SS%;
                    ?@SS@@@@SSSSSSSSS%%%%S%%S%?%%%SSSSSSSS@@@@@SSSSSSSSSSSSSSS%S%;
                  ..?@S@@@S%SS???S%??S@%%%SS%%%%S@%??SS??%@S%@@@SSSSSSSSSSSSSSSS%;
                  ;@@SS@@@S??%S%???%S@S?%S?*?%%%SSS%????SS%???S@@SSSSSSSSSSSSS%SS;
                  ;@@SS@@@S????%SSSS%%?;+S+;???%%%?%SSSS%?????%S@@S%%SSSSSSSSSS?+:
                  ;@@SS@@@S??????%%%%++?*+;+SSS??%%%%%??????????@@@SS%%SSSSS%S@*
                  ;@@SS@@@S??????*+:;:::+?%%%+:;:;*?*????????????S@@SSS%%%%%SS%+
                  +@@SS@@@@%???*+::::::::::::::::::::+++?????????%S@@SS%%%%S@S:
                  .+?SSS@@@@%*+;::::::::::::::::::::::::;+?????????@@SSS%SSS?;.
                    ?@SSS@@@@?::::::;;;;;;;;;;;;;;;;;%?:::;+???????@@SS%%SS@+
                    ?@@SS@@@@%+::::;?%???????????????%*:::::;+????%@@SSSSSS@+
                    +*@@S@@@@@@%+:::::::::::::::::::::::::::::+%?S@@SSS@@@S@+
                     :@@@SS@@@@@@%+:::::::::::::::::::::::::;*?%S@@SSS@@@@@S%*:
                      .?@@SS@@@@@@@@@?;;;;;;;;;;;;;;;;+??????%%%@@SSS@@@@@SSSS%+
                       +?@@@S@@@@@@@@@@@@%%%%%%%%%%%%%%%%%%%%?S@@@SS@@@@SSSSSSS?;.
                         +?@@S@@@@@@@@@@S%%%%%%%%%%%%%%%%%%%%%S@SSS@@@SSSSSSSS%SS?+
                          +@@SS@@@@@@@@@S%%%%%%%%%%%%%%%%%%%%SSS@@SSSSSSSSSSSSSS%S%?;
                          +@@@SSS@@@@@S%%%%%%%%%%%%%%%%%%%%SSS@@SSSSSSSSSSSSSSSSSSSS+:
                         +?@@@@SS@@@S%??%%%%%%%%%%%%%%%%%SSS@@@@SSSSSSSSSSSSSSSSSSS%S%+:
                       +%@@@@@@@@SSS?????%%%%%%%%%%%%%%SSS@@@@@@SSSSSSSSSSSSSSSSSSSSS%S%+.
                      .?@@@@@@@@@@@SS%???%%%%%%%%%%%%SSS@@@@@@@@@@@@@SSSSSSSSSSSSSSSSS%SS%+..
                  .+++@@@@@@@@@@@@@@@SS%%%%%%%%%%%%%SS@@@@@@@@@@@@@@@@@@@@S@SSSSSSSSSSSSS%S%:
                 +%@@@@@@@@@@@@@@@@@@@@@@@SSSSSSSS@@@@@@@@@@@@@@@@@@@@@@@@@@@@SSSSSSSSSSSSSS?+
               +%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@SSSSSSSSSSS@?
*/

contract ThievesGang is Context, ERC165, IERC1155, IERC1155MetadataURI, Ownable {
    using Address for address;
    using SafeMath for uint256;
    using Strings for uint256;
    using ECDSA for bytes32;

    uint256 public token_price = 0.03 ether;
    uint256 public max_tokens = 9800;
    uint256 public _max_tokens = 10000;
    uint256 public max_minted = 30;
    uint256 public max_minted_presale = 10;
    bool public public_sale = false;
    bool public private_sale = false;
    string private _uri;
    uint256 public total_supply = 0;
    address private signer = 0x2c48175f003DBc089d82D63714420677D2C93018;
    bool private freezed = false;
    bool private _freezed = false;
    
    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    
    mapping(address => uint256) public burned;
    mapping(address => uint256) public minted;
    mapping(uint256 => string) public additionalURIs;
    mapping(uint256 => bool) public reserved;

    constructor() {
    }
    
    function supportsInterface(bytes4 interfaceId) public view override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    
    function balanceOf(address account, uint256 id) public view override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }
    
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }
    
    function setApprovalForAll(address operator, bool approved) public override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(address account, address operator) public view override returns (bool) {
        return _operatorApprovals[account][operator];
    }
    
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }
    
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }
    
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }
    
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }
    
    function _mint(
        address account,
        uint256 id
    ) internal {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(1), "");

        _balances[id][account] += 1;
        emit TransferSingle(operator, address(0), account, id, 1);

        _doSafeTransferAcceptanceCheck(operator, address(0), account, id, 1, "");
    }
    
    function _mintBatch(
        address to,
        uint256[] memory ids
    ) internal {
        require(to != address(0), "ERC1155: mint to the zero address");
        address operator = _msgSender();
        
        uint256[] memory amounts = baseAmounts(ids.length);
        _beforeTokenTransfer(operator, address(0), to, ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, "");
    }
    
    function _burn(
        address account,
        uint256 id
    ) internal {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(1), "");

        uint256 accountBalance = _balances[id][account];
        require(accountBalance >= 1, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][account] = accountBalance - 1;
        }
        
        emit TransferSingle(operator, account, address(0), id, 1);
    }
    
    function _burnBatch(
        address account,
        uint256[] memory ids
    ) internal {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory amounts = baseAmounts(ids.length);

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 accountBalance = _balances[id][account];
            require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][account] = accountBalance - amount;
            }
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }
    
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }
    
    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
    
    function setBaseUri(string memory uri_) public onlyOwner {
        require(!freezed, 'Base URI freezed');
        _uri = uri_;
    }
    
    function freeze() public onlyOwner {
        freezed = true;
    }
    
    function _setBaseUri(uint256 tokenId, string memory uri_) public onlyOwner {
        require(!_freezed, 'additionalURIs freezed');
        require(reserved[tokenId], 'Wrong tokenId');
        additionalURIs[tokenId] = uri_;
    }
    
    function _freeze() public onlyOwner {
        _freezed = true;
    }

    function baseAmounts(uint256 length) private pure returns (uint256[] memory) {
        uint256[] memory amounts = new uint256[](length);
        for(uint i = 0; i < length; i++) {
            amounts[i] = 1;
        }
        return amounts;
    }
    
    function mint(uint256 number_of_tokens) public payable {
        require(public_sale, "Paused");
        require(total_supply + number_of_tokens <= max_tokens, "TS exceeded");
        require(msg.value >= number_of_tokens * token_price, "Eth value error");
        if(number_of_tokens == 1) {
            _mint(msg.sender, total_supply + 1);
        }
        else if(number_of_tokens > 1) {
            uint256[] memory ids = new uint256[](number_of_tokens);
            for(uint i = 0; i < number_of_tokens; i++) {
                ids[i] = total_supply + i + 1;
            }
            _mintBatch(msg.sender, ids);
        }
        total_supply += number_of_tokens;
        minted[msg.sender] += number_of_tokens;
    }
    
    function earlyMint(uint256 number_of_tokens, bytes memory signature) public payable {
        require(private_sale, "Paused");
        require(verify(msg.sender, signature) == true, "Signature error");
        require(minted[msg.sender] + number_of_tokens <= max_minted_presale, "Limit is 10");
        require(total_supply + number_of_tokens <= max_tokens, "TS exceeded");
        require(msg.value >= number_of_tokens * token_price, "Eth value error");
        if(number_of_tokens == 1) {
            _mint(msg.sender, total_supply + 1);
        }
        else if(number_of_tokens > 1) {
            uint256[] memory ids = new uint256[](number_of_tokens);
            for(uint i = 0; i < number_of_tokens; i++) {
                ids[i] = total_supply + i + 1;
            }
            _mintBatch(msg.sender, ids);
        }
        total_supply += number_of_tokens;
        minted[msg.sender] += number_of_tokens;
    }
    
    function burn(uint256[] memory ids) public {
        for(uint i = 0; i < ids.length; i++) {
            if(balanceOf(msg.sender, ids[i]) < 1) {
                revert("Wrong ids");
            }
        }
        if(ids.length == 1) {
            _burn(msg.sender, ids[0]);
        }
        else {
            _burnBatch(msg.sender, ids);
        }
        burned[msg.sender] += ids.length;
    }
    
    function setPrice(uint256 price) public onlyOwner {
        token_price = price;
    }
    
    function setLimit(uint256 presale_limit, uint256 limit) public onlyOwner {
        max_minted_presale = presale_limit;
        max_minted = limit;
    }
    
    function withdraw(uint256 amount) public onlyOwner {
        require(amount <= address(this).balance, "Insufficient balance");
        payable(msg.sender).transfer(amount);
    }
    
    function uri(uint256 tokenId) public view override returns (string memory) {
        require(tokenId <= max_tokens || reserved[tokenId], "URI query for nonexistent token");
        if(tokenId > 9900) {
            return additionalURIs[tokenId];
        }
        return string(abi.encodePacked(_uri, tokenId.toString()));
    }
    
    function flipPublicSale() public onlyOwner {
        public_sale = !public_sale;
    }
    
    function flipPrivateSale() public onlyOwner {
        private_sale = !private_sale;
    }
    
    function reserve(uint256[] memory ids) public onlyOwner {
        for(uint i = 0; i < ids.length; i++) {
            if(ids[i] <= max_tokens || ids[i] > 10000 || reserved[ids[i]] == true) {
                revert("Wrong ids");
            }
        }
        _mintBatch(msg.sender, ids);
        for(uint i = 0; i < ids.length; i++) {
            reserved[ids[i]] = true;
        }
    }
    
    function verify(address addr, bytes memory signature) private view returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(addr));
        bytes32 prefixedHash = ECDSA.toEthSignedMessageHash(hash);
        return ECDSA.recover(prefixedHash, signature) == signer;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"_freeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_max_tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri_","type":"string"}],"name":"_setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"additionalURIs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number_of_tokens","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"earlyMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flipPrivateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_minted_presale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number_of_tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"private_sale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_sale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","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":"uri_","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"presale_limit","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052666a94d74f430000600155612648600255612710600355601e600455600a6005556000600660006101000a81548160ff0219169083151502179055506000600660016101000a81548160ff0219169083151502179055506000600855732c48175f003dbc089d82d63714420677d2c93018600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600960146101000a81548160ff0219169083151502179055506000600960156101000a81548160ff021916908315150217905550348015620000f857600080fd5b50620001196200010d6200011f60201b60201c565b6200012760201b60201c565b620001eb565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b615f2980620001fb6000396000f3fe60806040526004361061020e5760003560e01c8063715018a611610118578063a0bcfc7f116100a0578063cdb5b16c1161006f578063cdb5b16c14610746578063e985e9c514610771578063f242432a146107ae578063f2fde38b146107d7578063f35fde11146108005761020e565b8063a0bcfc7f1461068e578063a22cb465146106b7578063a7509b83146106e0578063b80f55c91461071d5761020e565b806390e33f3a116100e757806390e33f3a146105dc57806391b7f5ed146105f357806391ed094d1461061c5780639dda1dda14610647578063a0712d68146106725761020e565b8063715018a6146105585780637b4fd96e1461056f578063880846051461059a5780638da5cb5b146105b15761020e565b80633940e9ee1161019b57806354572e091161016a57806354572e09146104975780635d463915146104c257806362a5af3b146104ff57806365ed50e91461051657806370a601841461052d5761020e565b80633940e9ee146103d657806346e31e04146104015780634e1273f41461041d57806353f9195e1461045a5761020e565b80631949c177116101e25780631949c177146102f55780631e7269c51461031e578063207add911461035b5780632e1a7d4d146103845780632eb2c2d6146103ad5761020e565b8062fdd58e1461021357806301ffc9a7146102505780630e89341c1461028d57806313377ea1146102ca575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190613d36565b610829565b6040516102479190613d85565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613df8565b6108f3565b6040516102849190613e40565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613e5b565b6109d5565b6040516102c19190613f21565b60405180910390f35b3480156102d657600080fd5b506102df610b24565b6040516102ec9190613d85565b60405180910390f35b34801561030157600080fd5b5061031c6004803603810190610317919061408b565b610b2a565b005b34801561032a57600080fd5b50610345600480360381019061034091906140d4565b610d08565b6040516103529190613d85565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d9190614101565b610d20565b005b34801561039057600080fd5b506103ab60048036038101906103a69190613e5b565b610dae565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906141f6565b610eb7565b005b3480156103e257600080fd5b506103eb610f58565b6040516103f89190613d85565b60405180910390f35b61041b600480360381019061041691906142c5565b610f5e565b005b34801561042957600080fd5b50610444600480360381019061043f91906143e4565b611282565b604051610451919061451a565b60405180910390f35b34801561046657600080fd5b50610481600480360381019061047c9190613e5b565b61139b565b60405161048e9190613e40565b60405180910390f35b3480156104a357600080fd5b506104ac6113bb565b6040516104b99190613d85565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e49190613e5b565b6113c1565b6040516104f69190613f21565b60405180910390f35b34801561050b57600080fd5b50610514611461565b005b34801561052257600080fd5b5061052b6114fa565b005b34801561053957600080fd5b50610542611593565b60405161054f9190613d85565b60405180910390f35b34801561056457600080fd5b5061056d611599565b005b34801561057b57600080fd5b50610584611621565b6040516105919190613d85565b60405180910390f35b3480156105a657600080fd5b506105af611627565b005b3480156105bd57600080fd5b506105c66116cf565b6040516105d3919061454b565b60405180910390f35b3480156105e857600080fd5b506105f16116f8565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190613e5b565b6117a0565b005b34801561062857600080fd5b50610631611826565b60405161063e9190613e40565b60405180910390f35b34801561065357600080fd5b5061065c611839565b6040516106699190613d85565b60405180910390f35b61068c60048036038101906106879190613e5b565b61183f565b005b34801561069a57600080fd5b506106b560048036038101906106b09190614607565b611a83565b005b3480156106c357600080fd5b506106de60048036038101906106d9919061467c565b611b69565b005b3480156106ec57600080fd5b50610707600480360381019061070291906140d4565b611cea565b6040516107149190613d85565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f919061408b565b611d02565b005b34801561075257600080fd5b5061075b611e22565b6040516107689190613e40565b60405180910390f35b34801561077d57600080fd5b50610798600480360381019061079391906146bc565b611e35565b6040516107a59190613e40565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d091906146fc565b611ec9565b005b3480156107e357600080fd5b506107fe60048036038101906107f991906140d4565b611f6a565b005b34801561080c57600080fd5b5061082760048036038101906108229190614793565b612062565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561089a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089190614861565b60405180910390fd5b600a600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109be57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109ce57506109cd826121ba565b5b9050919050565b606060025482111580610a055750600f600083815260200190815260200160002060009054906101000a900460ff165b610a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3b906148cd565b60405180910390fd5b6126ac821115610af157600e60008381526020019081526020016000208054610a6c9061491c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a989061491c565b8015610ae55780601f10610aba57610100808354040283529160200191610ae5565b820191906000526020600020905b815481529060010190602001808311610ac857829003601f168201915b50505050509050610b1f565b6007610afc83612224565b604051602001610b0d929190614a1e565b60405160208183030381529060405290505b919050565b60055481565b610b32612385565b73ffffffffffffffffffffffffffffffffffffffff16610b506116cf565b73ffffffffffffffffffffffffffffffffffffffff1614610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90614a8e565b60405180910390fd5b60005b8151811015610c9457600254828281518110610bc857610bc7614aae565b5b6020026020010151111580610bf85750612710828281518110610bee57610bed614aae565b5b6020026020010151115b80610c41575060011515600f6000848481518110610c1957610c18614aae565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff161515145b15610c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7890614b29565b60405180910390fd5b8080610c8c90614b78565b915050610ba9565b50610c9f338261238d565b60005b8151811015610d04576001600f6000848481518110610cc457610cc3614aae565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610cfc90614b78565b915050610ca2565b5050565b600d6020528060005260406000206000915090505481565b610d28612385565b73ffffffffffffffffffffffffffffffffffffffff16610d466116cf565b73ffffffffffffffffffffffffffffffffffffffff1614610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390614a8e565b60405180910390fd5b81600581905550806004819055505050565b610db6612385565b73ffffffffffffffffffffffffffffffffffffffff16610dd46116cf565b73ffffffffffffffffffffffffffffffffffffffff1614610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2190614a8e565b60405180910390fd5b47811115610e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6490614c0d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610eb3573d6000803e3d6000fd5b5050565b610ebf612385565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610f055750610f0485610eff612385565b611e35565b5b610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90614c9f565b60405180910390fd5b610f518585858585612593565b5050505050565b60085481565b600660019054906101000a900460ff16610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa490614d0b565b60405180910390fd5b60011515610fbb33836128aa565b151514610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff490614d77565b60405180910390fd5b60055482600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461104b9190614d97565b111561108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390614e39565b60405180910390fd5b6002548260085461109d9190614d97565b11156110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d590614ea5565b60405180910390fd5b600154826110ec9190614ec5565b34101561112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590614f6b565b60405180910390fd5b60018214156111545761114f33600160085461114a9190614d97565b612947565b61120f565b600182111561120e5760008267ffffffffffffffff81111561117957611178613f48565b5b6040519080825280602002602001820160405280156111a75781602001602082028036833780820191505090505b50905060005b83811015611201576001816008546111c59190614d97565b6111cf9190614d97565b8282815181106111e2576111e1614aae565b5b60200260200101818152505080806111f990614b78565b9150506111ad565b5061120c338261238d565b505b5b81600860008282546112219190614d97565b9250508190555081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112779190614d97565b925050819055505050565b606081518351146112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf90614ffd565b60405180910390fd5b6000835167ffffffffffffffff8111156112e5576112e4613f48565b5b6040519080825280602002602001820160405280156113135781602001602082028036833780820191505090505b50905060005b84518110156113905761136085828151811061133857611337614aae565b5b602002602001015185838151811061135357611352614aae565b5b6020026020010151610829565b82828151811061137357611372614aae565b5b6020026020010181815250508061138990614b78565b9050611319565b508091505092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b60025481565b600e60205280600052604060002060009150905080546113e09061491c565b80601f016020809104026020016040519081016040528092919081815260200182805461140c9061491c565b80156114595780601f1061142e57610100808354040283529160200191611459565b820191906000526020600020905b81548152906001019060200180831161143c57829003601f168201915b505050505081565b611469612385565b73ffffffffffffffffffffffffffffffffffffffff166114876116cf565b73ffffffffffffffffffffffffffffffffffffffff16146114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d490614a8e565b60405180910390fd5b6001600960146101000a81548160ff021916908315150217905550565b611502612385565b73ffffffffffffffffffffffffffffffffffffffff166115206116cf565b73ffffffffffffffffffffffffffffffffffffffff1614611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d90614a8e565b60405180910390fd5b6001600960156101000a81548160ff021916908315150217905550565b60045481565b6115a1612385565b73ffffffffffffffffffffffffffffffffffffffff166115bf6116cf565b73ffffffffffffffffffffffffffffffffffffffff1614611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c90614a8e565b60405180910390fd5b61161f6000612afe565b565b60015481565b61162f612385565b73ffffffffffffffffffffffffffffffffffffffff1661164d6116cf565b73ffffffffffffffffffffffffffffffffffffffff16146116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90614a8e565b60405180910390fd5b600660009054906101000a900460ff1615600660006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611700612385565b73ffffffffffffffffffffffffffffffffffffffff1661171e6116cf565b73ffffffffffffffffffffffffffffffffffffffff1614611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90614a8e565b60405180910390fd5b600660019054906101000a900460ff1615600660016101000a81548160ff021916908315150217905550565b6117a8612385565b73ffffffffffffffffffffffffffffffffffffffff166117c66116cf565b73ffffffffffffffffffffffffffffffffffffffff161461181c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181390614a8e565b60405180910390fd5b8060018190555050565b600660009054906101000a900460ff1681565b60035481565b600660009054906101000a900460ff1661188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590614d0b565b60405180910390fd5b6002548160085461189f9190614d97565b11156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790614ea5565b60405180910390fd5b600154816118ee9190614ec5565b341015611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790614f6b565b60405180910390fd5b60018114156119565761195133600160085461194c9190614d97565b612947565b611a11565b6001811115611a105760008167ffffffffffffffff81111561197b5761197a613f48565b5b6040519080825280602002602001820160405280156119a95781602001602082028036833780820191505090505b50905060005b82811015611a03576001816008546119c79190614d97565b6119d19190614d97565b8282815181106119e4576119e3614aae565b5b60200260200101818152505080806119fb90614b78565b9150506119af565b50611a0e338261238d565b505b5b8060086000828254611a239190614d97565b9250508190555080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a799190614d97565b9250508190555050565b611a8b612385565b73ffffffffffffffffffffffffffffffffffffffff16611aa96116cf565b73ffffffffffffffffffffffffffffffffffffffff1614611aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af690614a8e565b60405180910390fd5b600960149054906101000a900460ff1615611b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4690615069565b60405180910390fd5b8060079080519060200190611b65929190613beb565b5050565b8173ffffffffffffffffffffffffffffffffffffffff16611b88612385565b73ffffffffffffffffffffffffffffffffffffffff161415611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd6906150fb565b60405180910390fd5b80600b6000611bec612385565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c99612385565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cde9190613e40565b60405180910390a35050565b600c6020528060005260406000206000915090505481565b60005b8151811015611d88576001611d3433848481518110611d2757611d26614aae565b5b6020026020010151610829565b1015611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c90614b29565b60405180910390fd5b8080611d8090614b78565b915050611d05565b50600181511415611dbd57611db83382600081518110611dab57611daa614aae565b5b6020026020010151612bc2565b611dc8565b611dc73382612de4565b5b8051600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e189190614d97565b9250508190555050565b600660019054906101000a900460ff1681565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ed1612385565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611f175750611f1685611f11612385565b611e35565b5b611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d9061518d565b60405180910390fd5b611f638585858585613061565b5050505050565b611f72612385565b73ffffffffffffffffffffffffffffffffffffffff16611f906116cf565b73ffffffffffffffffffffffffffffffffffffffff1614611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd90614a8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d9061521f565b60405180910390fd5b61205f81612afe565b50565b61206a612385565b73ffffffffffffffffffffffffffffffffffffffff166120886116cf565b73ffffffffffffffffffffffffffffffffffffffff16146120de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d590614a8e565b60405180910390fd5b600960159054906101000a900460ff161561212e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121259061528b565b60405180910390fd5b600f600083815260200190815260200160002060009054906101000a900460ff1661218e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612185906152f7565b60405180910390fd5b80600e600084815260200190815260200160002090805190602001906121b5929190613beb565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600082141561226c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612380565b600082905060005b6000821461229e57808061228790614b78565b915050600a826122979190615346565b9150612274565b60008167ffffffffffffffff8111156122ba576122b9613f48565b5b6040519080825280601f01601f1916602001820160405280156122ec5781602001600182028036833780820191505090505b5090505b60008514612379576001826123059190615377565b9150600a8561231491906153ab565b60306123209190614d97565b60f81b81838151811061233657612335614aae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123729190615346565b94506122f0565b8093505050505b919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f49061544e565b60405180910390fd5b6000612407612385565b9050600061241583516132e6565b90506124358260008686856040518060200160405280600081525061337e565b60005b83518110156124ef5781818151811061245457612453614aae565b5b6020026020010151600a600086848151811061247357612472614aae565b5b6020026020010151815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124d59190614d97565b9250508190555080806124e790614b78565b915050612438565b508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868560405161256792919061546e565b60405180910390a461258d82600086868560405180602001604052806000815250613386565b50505050565b81518351146125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce90615517565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e906155a9565b60405180910390fd5b6000612651612385565b905061266181878787878761337e565b60005b845181101561281557600085828151811061268257612681614aae565b5b6020026020010151905060008583815181106126a1576126a0614aae565b5b602002602001015190506000600a600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273a9061563b565b60405180910390fd5b818103600a600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600a600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127fa9190614d97565b925050819055505050508061280e90614b78565b9050612664565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161288c92919061546e565b60405180910390a46128a2818787878787613386565b505050505050565b600080836040516020016128be91906156a3565b60405160208183030381529060405280519060200120905060006128e18261356d565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612926828661359d565b73ffffffffffffffffffffffffffffffffffffffff16149250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ae9061544e565b60405180910390fd5b60006129c1612385565b90506129f2816000856129d3866135c4565b6129dd60016135c4565b6040518060200160405280600081525061337e565b6001600a600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a539190614d97565b925050819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62856001604051612ad2929190615703565b60405180910390a4612af9816000858560016040518060200160405280600081525061363e565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c299061579e565b60405180910390fd5b6000612c3c612385565b9050612c6d81846000612c4e866135c4565b612c5860016135c4565b6040518060200160405280600081525061337e565b6000600a600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001811015612d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfd90615830565b60405180910390fd5b60018103600a600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62866001604051612dd6929190615703565b60405180910390a450505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4b9061579e565b60405180910390fd5b6000612e5e612385565b90506000612e6c83516132e6565b9050612e8c8285600086856040518060200160405280600081525061337e565b60005b8351811015612fdb576000848281518110612ead57612eac614aae565b5b602002602001015190506000838381518110612ecc57612ecb614aae565b5b602002602001015190506000600a600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6590615830565b60405180910390fd5b818103600a600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080612fd390614b78565b915050612e8f565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868560405161305392919061546e565b60405180910390a450505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156130d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c8906155a9565b60405180910390fd5b60006130db612385565b90506130fb8187876130ec886135c4565b6130f5886135c4565b8761337e565b6000600a600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015613193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318a9061563b565b60405180910390fd5b838103600a600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083600a600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461324a9190614d97565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516132c7929190615850565b60405180910390a46132dd82888888888861363e565b50505050505050565b606060008267ffffffffffffffff81111561330457613303613f48565b5b6040519080825280602002602001820160405280156133325781602001602082028036833780820191505090505b50905060005b8381101561337457600182828151811061335557613354614aae565b5b602002602001018181525050808061336c90614b78565b915050613338565b5080915050919050565b505050505050565b6133a58473ffffffffffffffffffffffffffffffffffffffff16613825565b15613565578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016133eb9594939291906158ce565b602060405180830381600087803b15801561340557600080fd5b505af192505050801561343657506040513d601f19601f82011682018060405250810190613433919061594b565b60015b6134dc57613442615985565b806308c379a0141561349f57506134576159a7565b8061346257506134a1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134969190613f21565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d390615aaf565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355a90615b41565b60405180910390fd5b505b505050505050565b6000816040516020016135809190615bd8565b604051602081830303815290604052805190602001209050919050565b60008060006135ac8585613838565b915091506135b9816138bb565b819250505092915050565b60606000600167ffffffffffffffff8111156135e3576135e2613f48565b5b6040519080825280602002602001820160405280156136115781602001602082028036833780820191505090505b509050828160008151811061362957613628614aae565b5b60200260200101818152505080915050919050565b61365d8473ffffffffffffffffffffffffffffffffffffffff16613825565b1561381d578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016136a3959493929190615bfe565b602060405180830381600087803b1580156136bd57600080fd5b505af19250505080156136ee57506040513d601f19601f820116820180604052508101906136eb919061594b565b60015b613794576136fa615985565b806308c379a01415613757575061370f6159a7565b8061371a5750613759565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374e9190613f21565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378b90615aaf565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461381b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381290615b41565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b60008060418351141561387a5760008060006020860151925060408601519150606086015160001a905061386e87828585613a90565b945094505050506138b4565b6040835114156138ab5760008060208501519150604085015190506138a0868383613b9d565b9350935050506138b4565b60006002915091505b9250929050565b600060048111156138cf576138ce615c58565b5b8160048111156138e2576138e1615c58565b5b14156138ed57613a8d565b6001600481111561390157613900615c58565b5b81600481111561391457613913615c58565b5b1415613955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394c90615cd3565b60405180910390fd5b6002600481111561396957613968615c58565b5b81600481111561397c5761397b615c58565b5b14156139bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b490615d3f565b60405180910390fd5b600360048111156139d1576139d0615c58565b5b8160048111156139e4576139e3615c58565b5b1415613a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1c90615dd1565b60405180910390fd5b600480811115613a3857613a37615c58565b5b816004811115613a4b57613a4a615c58565b5b1415613a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8390615e63565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613acb576000600391509150613b94565b601b8560ff1614158015613ae35750601c8560ff1614155b15613af5576000600491509150613b94565b600060018787878760405160008152602001604052604051613b1a9493929190615eae565b6020604051602081039080840390855afa158015613b3c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b8b57600060019250925050613b94565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613bdd87828885613a90565b935093505050935093915050565b828054613bf79061491c565b90600052602060002090601f016020900481019282613c195760008555613c60565b82601f10613c3257805160ff1916838001178555613c60565b82800160010185558215613c60579182015b82811115613c5f578251825591602001919060010190613c44565b5b509050613c6d9190613c71565b5090565b5b80821115613c8a576000816000905550600101613c72565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ccd82613ca2565b9050919050565b613cdd81613cc2565b8114613ce857600080fd5b50565b600081359050613cfa81613cd4565b92915050565b6000819050919050565b613d1381613d00565b8114613d1e57600080fd5b50565b600081359050613d3081613d0a565b92915050565b60008060408385031215613d4d57613d4c613c98565b5b6000613d5b85828601613ceb565b9250506020613d6c85828601613d21565b9150509250929050565b613d7f81613d00565b82525050565b6000602082019050613d9a6000830184613d76565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dd581613da0565b8114613de057600080fd5b50565b600081359050613df281613dcc565b92915050565b600060208284031215613e0e57613e0d613c98565b5b6000613e1c84828501613de3565b91505092915050565b60008115159050919050565b613e3a81613e25565b82525050565b6000602082019050613e556000830184613e31565b92915050565b600060208284031215613e7157613e70613c98565b5b6000613e7f84828501613d21565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ec2578082015181840152602081019050613ea7565b83811115613ed1576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ef382613e88565b613efd8185613e93565b9350613f0d818560208601613ea4565b613f1681613ed7565b840191505092915050565b60006020820190508181036000830152613f3b8184613ee8565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f8082613ed7565b810181811067ffffffffffffffff82111715613f9f57613f9e613f48565b5b80604052505050565b6000613fb2613c8e565b9050613fbe8282613f77565b919050565b600067ffffffffffffffff821115613fde57613fdd613f48565b5b602082029050602081019050919050565b600080fd5b600061400761400284613fc3565b613fa8565b9050808382526020820190506020840283018581111561402a57614029613fef565b5b835b81811015614053578061403f8882613d21565b84526020840193505060208101905061402c565b5050509392505050565b600082601f83011261407257614071613f43565b5b8135614082848260208601613ff4565b91505092915050565b6000602082840312156140a1576140a0613c98565b5b600082013567ffffffffffffffff8111156140bf576140be613c9d565b5b6140cb8482850161405d565b91505092915050565b6000602082840312156140ea576140e9613c98565b5b60006140f884828501613ceb565b91505092915050565b6000806040838503121561411857614117613c98565b5b600061412685828601613d21565b925050602061413785828601613d21565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561416157614160613f48565b5b61416a82613ed7565b9050602081019050919050565b82818337600083830152505050565b600061419961419484614146565b613fa8565b9050828152602081018484840111156141b5576141b4614141565b5b6141c0848285614177565b509392505050565b600082601f8301126141dd576141dc613f43565b5b81356141ed848260208601614186565b91505092915050565b600080600080600060a0868803121561421257614211613c98565b5b600061422088828901613ceb565b955050602061423188828901613ceb565b945050604086013567ffffffffffffffff81111561425257614251613c9d565b5b61425e8882890161405d565b935050606086013567ffffffffffffffff81111561427f5761427e613c9d565b5b61428b8882890161405d565b925050608086013567ffffffffffffffff8111156142ac576142ab613c9d565b5b6142b8888289016141c8565b9150509295509295909350565b600080604083850312156142dc576142db613c98565b5b60006142ea85828601613d21565b925050602083013567ffffffffffffffff81111561430b5761430a613c9d565b5b614317858286016141c8565b9150509250929050565b600067ffffffffffffffff82111561433c5761433b613f48565b5b602082029050602081019050919050565b600061436061435b84614321565b613fa8565b9050808382526020820190506020840283018581111561438357614382613fef565b5b835b818110156143ac57806143988882613ceb565b845260208401935050602081019050614385565b5050509392505050565b600082601f8301126143cb576143ca613f43565b5b81356143db84826020860161434d565b91505092915050565b600080604083850312156143fb576143fa613c98565b5b600083013567ffffffffffffffff81111561441957614418613c9d565b5b614425858286016143b6565b925050602083013567ffffffffffffffff81111561444657614445613c9d565b5b6144528582860161405d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61449181613d00565b82525050565b60006144a38383614488565b60208301905092915050565b6000602082019050919050565b60006144c78261445c565b6144d18185614467565b93506144dc83614478565b8060005b8381101561450d5781516144f48882614497565b97506144ff836144af565b9250506001810190506144e0565b5085935050505092915050565b6000602082019050818103600083015261453481846144bc565b905092915050565b61454581613cc2565b82525050565b6000602082019050614560600083018461453c565b92915050565b600067ffffffffffffffff82111561458157614580613f48565b5b61458a82613ed7565b9050602081019050919050565b60006145aa6145a584614566565b613fa8565b9050828152602081018484840111156145c6576145c5614141565b5b6145d1848285614177565b509392505050565b600082601f8301126145ee576145ed613f43565b5b81356145fe848260208601614597565b91505092915050565b60006020828403121561461d5761461c613c98565b5b600082013567ffffffffffffffff81111561463b5761463a613c9d565b5b614647848285016145d9565b91505092915050565b61465981613e25565b811461466457600080fd5b50565b60008135905061467681614650565b92915050565b6000806040838503121561469357614692613c98565b5b60006146a185828601613ceb565b92505060206146b285828601614667565b9150509250929050565b600080604083850312156146d3576146d2613c98565b5b60006146e185828601613ceb565b92505060206146f285828601613ceb565b9150509250929050565b600080600080600060a0868803121561471857614717613c98565b5b600061472688828901613ceb565b955050602061473788828901613ceb565b945050604061474888828901613d21565b935050606061475988828901613d21565b925050608086013567ffffffffffffffff81111561477a57614779613c9d565b5b614786888289016141c8565b9150509295509295909350565b600080604083850312156147aa576147a9613c98565b5b60006147b885828601613d21565b925050602083013567ffffffffffffffff8111156147d9576147d8613c9d565b5b6147e5858286016145d9565b9150509250929050565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b600061484b602b83613e93565b9150614856826147ef565b604082019050919050565b6000602082019050818103600083015261487a8161483e565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b60006148b7601f83613e93565b91506148c282614881565b602082019050919050565b600060208201905081810360008301526148e6816148aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061493457607f821691505b60208210811415614948576149476148ed565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461497b8161491c565b614985818661494e565b945060018216600081146149a057600181146149b1576149e4565b60ff198316865281860193506149e4565b6149ba85614959565b60005b838110156149dc578154818901526001820191506020810190506149bd565b838801955050505b50505092915050565b60006149f882613e88565b614a02818561494e565b9350614a12818560208601613ea4565b80840191505092915050565b6000614a2a828561496e565b9150614a3682846149ed565b91508190509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a78602083613e93565b9150614a8382614a42565b602082019050919050565b60006020820190508181036000830152614aa781614a6b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f57726f6e67206964730000000000000000000000000000000000000000000000600082015250565b6000614b13600983613e93565b9150614b1e82614add565b602082019050919050565b60006020820190508181036000830152614b4281614b06565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b8382613d00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614bb657614bb5614b49565b5b600182019050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b6000614bf7601483613e93565b9150614c0282614bc1565b602082019050919050565b60006020820190508181036000830152614c2681614bea565b9050919050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614c89603283613e93565b9150614c9482614c2d565b604082019050919050565b60006020820190508181036000830152614cb881614c7c565b9050919050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b6000614cf5600683613e93565b9150614d0082614cbf565b602082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b7f5369676e6174757265206572726f720000000000000000000000000000000000600082015250565b6000614d61600f83613e93565b9150614d6c82614d2b565b602082019050919050565b60006020820190508181036000830152614d9081614d54565b9050919050565b6000614da282613d00565b9150614dad83613d00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614de257614de1614b49565b5b828201905092915050565b7f4c696d6974206973203130000000000000000000000000000000000000000000600082015250565b6000614e23600b83613e93565b9150614e2e82614ded565b602082019050919050565b60006020820190508181036000830152614e5281614e16565b9050919050565b7f5453206578636565646564000000000000000000000000000000000000000000600082015250565b6000614e8f600b83613e93565b9150614e9a82614e59565b602082019050919050565b60006020820190508181036000830152614ebe81614e82565b9050919050565b6000614ed082613d00565b9150614edb83613d00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f1457614f13614b49565b5b828202905092915050565b7f4574682076616c7565206572726f720000000000000000000000000000000000600082015250565b6000614f55600f83613e93565b9150614f6082614f1f565b602082019050919050565b60006020820190508181036000830152614f8481614f48565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614fe7602983613e93565b9150614ff282614f8b565b604082019050919050565b6000602082019050818103600083015261501681614fda565b9050919050565b7f426173652055524920667265657a656400000000000000000000000000000000600082015250565b6000615053601083613e93565b915061505e8261501d565b602082019050919050565b6000602082019050818103600083015261508281615046565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006150e5602983613e93565b91506150f082615089565b604082019050919050565b60006020820190508181036000830152615114816150d8565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000615177602983613e93565b91506151828261511b565b604082019050919050565b600060208201905081810360008301526151a68161516a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615209602683613e93565b9150615214826151ad565b604082019050919050565b60006020820190508181036000830152615238816151fc565b9050919050565b7f6164646974696f6e616c5552497320667265657a656400000000000000000000600082015250565b6000615275601683613e93565b91506152808261523f565b602082019050919050565b600060208201905081810360008301526152a481615268565b9050919050565b7f57726f6e6720746f6b656e496400000000000000000000000000000000000000600082015250565b60006152e1600d83613e93565b91506152ec826152ab565b602082019050919050565b60006020820190508181036000830152615310816152d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061535182613d00565b915061535c83613d00565b92508261536c5761536b615317565b5b828204905092915050565b600061538282613d00565b915061538d83613d00565b9250828210156153a05761539f614b49565b5b828203905092915050565b60006153b682613d00565b91506153c183613d00565b9250826153d1576153d0615317565b5b828206905092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615438602183613e93565b9150615443826153dc565b604082019050919050565b600060208201905081810360008301526154678161542b565b9050919050565b6000604082019050818103600083015261548881856144bc565b9050818103602083015261549c81846144bc565b90509392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615501602883613e93565b915061550c826154a5565b604082019050919050565b60006020820190508181036000830152615530816154f4565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615593602583613e93565b915061559e82615537565b604082019050919050565b600060208201905081810360008301526155c281615586565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615625602a83613e93565b9150615630826155c9565b604082019050919050565b6000602082019050818103600083015261565481615618565b9050919050565b60008160601b9050919050565b60006156738261565b565b9050919050565b600061568582615668565b9050919050565b61569d61569882613cc2565b61567a565b82525050565b60006156af828461568c565b60148201915081905092915050565b6000819050919050565b6000819050919050565b60006156ed6156e86156e3846156be565b6156c8565b613d00565b9050919050565b6156fd816156d2565b82525050565b60006040820190506157186000830185613d76565b61572560208301846156f4565b9392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615788602383613e93565b91506157938261572c565b604082019050919050565b600060208201905081810360008301526157b78161577b565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061581a602483613e93565b9150615825826157be565b604082019050919050565b600060208201905081810360008301526158498161580d565b9050919050565b60006040820190506158656000830185613d76565b6158726020830184613d76565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006158a082615879565b6158aa8185615884565b93506158ba818560208601613ea4565b6158c381613ed7565b840191505092915050565b600060a0820190506158e3600083018861453c565b6158f0602083018761453c565b818103604083015261590281866144bc565b9050818103606083015261591681856144bc565b9050818103608083015261592a8184615895565b90509695505050505050565b60008151905061594581613dcc565b92915050565b60006020828403121561596157615960613c98565b5b600061596f84828501615936565b91505092915050565b60008160e01c9050919050565b600060033d11156159a45760046000803e6159a1600051615978565b90505b90565b600060443d10156159b757615a3a565b6159bf613c8e565b60043d036004823e80513d602482011167ffffffffffffffff821117156159e7575050615a3a565b808201805167ffffffffffffffff811115615a055750505050615a3a565b80602083010160043d038501811115615a22575050505050615a3a565b615a3182602001850186613f77565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615a99603483613e93565b9150615aa482615a3d565b604082019050919050565b60006020820190508181036000830152615ac881615a8c565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615b2b602883613e93565b9150615b3682615acf565b604082019050919050565b60006020820190508181036000830152615b5a81615b1e565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000615b97601c8361494e565b9150615ba282615b61565b601c82019050919050565b6000819050919050565b6000819050919050565b615bd2615bcd82615bad565b615bb7565b82525050565b6000615be382615b8a565b9150615bef8284615bc1565b60208201915081905092915050565b600060a082019050615c13600083018861453c565b615c20602083018761453c565b615c2d6040830186613d76565b615c3a6060830185613d76565b8181036080830152615c4c8184615895565b90509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615cbd601883613e93565b9150615cc882615c87565b602082019050919050565b60006020820190508181036000830152615cec81615cb0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000615d29601f83613e93565b9150615d3482615cf3565b602082019050919050565b60006020820190508181036000830152615d5881615d1c565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615dbb602283613e93565b9150615dc682615d5f565b604082019050919050565b60006020820190508181036000830152615dea81615dae565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615e4d602283613e93565b9150615e5882615df1565b604082019050919050565b60006020820190508181036000830152615e7c81615e40565b9050919050565b615e8c81615bad565b82525050565b600060ff82169050919050565b615ea881615e92565b82525050565b6000608082019050615ec36000830187615e83565b615ed06020830186615e9f565b615edd6040830185615e83565b615eea6060830184615e83565b9594505050505056fea26469706673582212202fb542fa39a93fb102c3e7fc3c0794f802521ac206485aa80238cbda29b6c8d364736f6c63430008090033

Deployed Bytecode

0x60806040526004361061020e5760003560e01c8063715018a611610118578063a0bcfc7f116100a0578063cdb5b16c1161006f578063cdb5b16c14610746578063e985e9c514610771578063f242432a146107ae578063f2fde38b146107d7578063f35fde11146108005761020e565b8063a0bcfc7f1461068e578063a22cb465146106b7578063a7509b83146106e0578063b80f55c91461071d5761020e565b806390e33f3a116100e757806390e33f3a146105dc57806391b7f5ed146105f357806391ed094d1461061c5780639dda1dda14610647578063a0712d68146106725761020e565b8063715018a6146105585780637b4fd96e1461056f578063880846051461059a5780638da5cb5b146105b15761020e565b80633940e9ee1161019b57806354572e091161016a57806354572e09146104975780635d463915146104c257806362a5af3b146104ff57806365ed50e91461051657806370a601841461052d5761020e565b80633940e9ee146103d657806346e31e04146104015780634e1273f41461041d57806353f9195e1461045a5761020e565b80631949c177116101e25780631949c177146102f55780631e7269c51461031e578063207add911461035b5780632e1a7d4d146103845780632eb2c2d6146103ad5761020e565b8062fdd58e1461021357806301ffc9a7146102505780630e89341c1461028d57806313377ea1146102ca575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190613d36565b610829565b6040516102479190613d85565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613df8565b6108f3565b6040516102849190613e40565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613e5b565b6109d5565b6040516102c19190613f21565b60405180910390f35b3480156102d657600080fd5b506102df610b24565b6040516102ec9190613d85565b60405180910390f35b34801561030157600080fd5b5061031c6004803603810190610317919061408b565b610b2a565b005b34801561032a57600080fd5b50610345600480360381019061034091906140d4565b610d08565b6040516103529190613d85565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d9190614101565b610d20565b005b34801561039057600080fd5b506103ab60048036038101906103a69190613e5b565b610dae565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906141f6565b610eb7565b005b3480156103e257600080fd5b506103eb610f58565b6040516103f89190613d85565b60405180910390f35b61041b600480360381019061041691906142c5565b610f5e565b005b34801561042957600080fd5b50610444600480360381019061043f91906143e4565b611282565b604051610451919061451a565b60405180910390f35b34801561046657600080fd5b50610481600480360381019061047c9190613e5b565b61139b565b60405161048e9190613e40565b60405180910390f35b3480156104a357600080fd5b506104ac6113bb565b6040516104b99190613d85565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e49190613e5b565b6113c1565b6040516104f69190613f21565b60405180910390f35b34801561050b57600080fd5b50610514611461565b005b34801561052257600080fd5b5061052b6114fa565b005b34801561053957600080fd5b50610542611593565b60405161054f9190613d85565b60405180910390f35b34801561056457600080fd5b5061056d611599565b005b34801561057b57600080fd5b50610584611621565b6040516105919190613d85565b60405180910390f35b3480156105a657600080fd5b506105af611627565b005b3480156105bd57600080fd5b506105c66116cf565b6040516105d3919061454b565b60405180910390f35b3480156105e857600080fd5b506105f16116f8565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190613e5b565b6117a0565b005b34801561062857600080fd5b50610631611826565b60405161063e9190613e40565b60405180910390f35b34801561065357600080fd5b5061065c611839565b6040516106699190613d85565b60405180910390f35b61068c60048036038101906106879190613e5b565b61183f565b005b34801561069a57600080fd5b506106b560048036038101906106b09190614607565b611a83565b005b3480156106c357600080fd5b506106de60048036038101906106d9919061467c565b611b69565b005b3480156106ec57600080fd5b50610707600480360381019061070291906140d4565b611cea565b6040516107149190613d85565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f919061408b565b611d02565b005b34801561075257600080fd5b5061075b611e22565b6040516107689190613e40565b60405180910390f35b34801561077d57600080fd5b50610798600480360381019061079391906146bc565b611e35565b6040516107a59190613e40565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d091906146fc565b611ec9565b005b3480156107e357600080fd5b506107fe60048036038101906107f991906140d4565b611f6a565b005b34801561080c57600080fd5b5061082760048036038101906108229190614793565b612062565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561089a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089190614861565b60405180910390fd5b600a600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109be57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109ce57506109cd826121ba565b5b9050919050565b606060025482111580610a055750600f600083815260200190815260200160002060009054906101000a900460ff165b610a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3b906148cd565b60405180910390fd5b6126ac821115610af157600e60008381526020019081526020016000208054610a6c9061491c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a989061491c565b8015610ae55780601f10610aba57610100808354040283529160200191610ae5565b820191906000526020600020905b815481529060010190602001808311610ac857829003601f168201915b50505050509050610b1f565b6007610afc83612224565b604051602001610b0d929190614a1e565b60405160208183030381529060405290505b919050565b60055481565b610b32612385565b73ffffffffffffffffffffffffffffffffffffffff16610b506116cf565b73ffffffffffffffffffffffffffffffffffffffff1614610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90614a8e565b60405180910390fd5b60005b8151811015610c9457600254828281518110610bc857610bc7614aae565b5b6020026020010151111580610bf85750612710828281518110610bee57610bed614aae565b5b6020026020010151115b80610c41575060011515600f6000848481518110610c1957610c18614aae565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff161515145b15610c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7890614b29565b60405180910390fd5b8080610c8c90614b78565b915050610ba9565b50610c9f338261238d565b60005b8151811015610d04576001600f6000848481518110610cc457610cc3614aae565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610cfc90614b78565b915050610ca2565b5050565b600d6020528060005260406000206000915090505481565b610d28612385565b73ffffffffffffffffffffffffffffffffffffffff16610d466116cf565b73ffffffffffffffffffffffffffffffffffffffff1614610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390614a8e565b60405180910390fd5b81600581905550806004819055505050565b610db6612385565b73ffffffffffffffffffffffffffffffffffffffff16610dd46116cf565b73ffffffffffffffffffffffffffffffffffffffff1614610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2190614a8e565b60405180910390fd5b47811115610e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6490614c0d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610eb3573d6000803e3d6000fd5b5050565b610ebf612385565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610f055750610f0485610eff612385565b611e35565b5b610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90614c9f565b60405180910390fd5b610f518585858585612593565b5050505050565b60085481565b600660019054906101000a900460ff16610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa490614d0b565b60405180910390fd5b60011515610fbb33836128aa565b151514610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff490614d77565b60405180910390fd5b60055482600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461104b9190614d97565b111561108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390614e39565b60405180910390fd5b6002548260085461109d9190614d97565b11156110de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d590614ea5565b60405180910390fd5b600154826110ec9190614ec5565b34101561112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590614f6b565b60405180910390fd5b60018214156111545761114f33600160085461114a9190614d97565b612947565b61120f565b600182111561120e5760008267ffffffffffffffff81111561117957611178613f48565b5b6040519080825280602002602001820160405280156111a75781602001602082028036833780820191505090505b50905060005b83811015611201576001816008546111c59190614d97565b6111cf9190614d97565b8282815181106111e2576111e1614aae565b5b60200260200101818152505080806111f990614b78565b9150506111ad565b5061120c338261238d565b505b5b81600860008282546112219190614d97565b9250508190555081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112779190614d97565b925050819055505050565b606081518351146112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf90614ffd565b60405180910390fd5b6000835167ffffffffffffffff8111156112e5576112e4613f48565b5b6040519080825280602002602001820160405280156113135781602001602082028036833780820191505090505b50905060005b84518110156113905761136085828151811061133857611337614aae565b5b602002602001015185838151811061135357611352614aae565b5b6020026020010151610829565b82828151811061137357611372614aae565b5b6020026020010181815250508061138990614b78565b9050611319565b508091505092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b60025481565b600e60205280600052604060002060009150905080546113e09061491c565b80601f016020809104026020016040519081016040528092919081815260200182805461140c9061491c565b80156114595780601f1061142e57610100808354040283529160200191611459565b820191906000526020600020905b81548152906001019060200180831161143c57829003601f168201915b505050505081565b611469612385565b73ffffffffffffffffffffffffffffffffffffffff166114876116cf565b73ffffffffffffffffffffffffffffffffffffffff16146114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d490614a8e565b60405180910390fd5b6001600960146101000a81548160ff021916908315150217905550565b611502612385565b73ffffffffffffffffffffffffffffffffffffffff166115206116cf565b73ffffffffffffffffffffffffffffffffffffffff1614611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d90614a8e565b60405180910390fd5b6001600960156101000a81548160ff021916908315150217905550565b60045481565b6115a1612385565b73ffffffffffffffffffffffffffffffffffffffff166115bf6116cf565b73ffffffffffffffffffffffffffffffffffffffff1614611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c90614a8e565b60405180910390fd5b61161f6000612afe565b565b60015481565b61162f612385565b73ffffffffffffffffffffffffffffffffffffffff1661164d6116cf565b73ffffffffffffffffffffffffffffffffffffffff16146116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90614a8e565b60405180910390fd5b600660009054906101000a900460ff1615600660006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611700612385565b73ffffffffffffffffffffffffffffffffffffffff1661171e6116cf565b73ffffffffffffffffffffffffffffffffffffffff1614611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90614a8e565b60405180910390fd5b600660019054906101000a900460ff1615600660016101000a81548160ff021916908315150217905550565b6117a8612385565b73ffffffffffffffffffffffffffffffffffffffff166117c66116cf565b73ffffffffffffffffffffffffffffffffffffffff161461181c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181390614a8e565b60405180910390fd5b8060018190555050565b600660009054906101000a900460ff1681565b60035481565b600660009054906101000a900460ff1661188e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188590614d0b565b60405180910390fd5b6002548160085461189f9190614d97565b11156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790614ea5565b60405180910390fd5b600154816118ee9190614ec5565b341015611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790614f6b565b60405180910390fd5b60018114156119565761195133600160085461194c9190614d97565b612947565b611a11565b6001811115611a105760008167ffffffffffffffff81111561197b5761197a613f48565b5b6040519080825280602002602001820160405280156119a95781602001602082028036833780820191505090505b50905060005b82811015611a03576001816008546119c79190614d97565b6119d19190614d97565b8282815181106119e4576119e3614aae565b5b60200260200101818152505080806119fb90614b78565b9150506119af565b50611a0e338261238d565b505b5b8060086000828254611a239190614d97565b9250508190555080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a799190614d97565b9250508190555050565b611a8b612385565b73ffffffffffffffffffffffffffffffffffffffff16611aa96116cf565b73ffffffffffffffffffffffffffffffffffffffff1614611aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af690614a8e565b60405180910390fd5b600960149054906101000a900460ff1615611b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4690615069565b60405180910390fd5b8060079080519060200190611b65929190613beb565b5050565b8173ffffffffffffffffffffffffffffffffffffffff16611b88612385565b73ffffffffffffffffffffffffffffffffffffffff161415611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd6906150fb565b60405180910390fd5b80600b6000611bec612385565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c99612385565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cde9190613e40565b60405180910390a35050565b600c6020528060005260406000206000915090505481565b60005b8151811015611d88576001611d3433848481518110611d2757611d26614aae565b5b6020026020010151610829565b1015611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c90614b29565b60405180910390fd5b8080611d8090614b78565b915050611d05565b50600181511415611dbd57611db83382600081518110611dab57611daa614aae565b5b6020026020010151612bc2565b611dc8565b611dc73382612de4565b5b8051600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e189190614d97565b9250508190555050565b600660019054906101000a900460ff1681565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ed1612385565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611f175750611f1685611f11612385565b611e35565b5b611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d9061518d565b60405180910390fd5b611f638585858585613061565b5050505050565b611f72612385565b73ffffffffffffffffffffffffffffffffffffffff16611f906116cf565b73ffffffffffffffffffffffffffffffffffffffff1614611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd90614a8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204d9061521f565b60405180910390fd5b61205f81612afe565b50565b61206a612385565b73ffffffffffffffffffffffffffffffffffffffff166120886116cf565b73ffffffffffffffffffffffffffffffffffffffff16146120de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d590614a8e565b60405180910390fd5b600960159054906101000a900460ff161561212e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121259061528b565b60405180910390fd5b600f600083815260200190815260200160002060009054906101000a900460ff1661218e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612185906152f7565b60405180910390fd5b80600e600084815260200190815260200160002090805190602001906121b5929190613beb565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600082141561226c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612380565b600082905060005b6000821461229e57808061228790614b78565b915050600a826122979190615346565b9150612274565b60008167ffffffffffffffff8111156122ba576122b9613f48565b5b6040519080825280601f01601f1916602001820160405280156122ec5781602001600182028036833780820191505090505b5090505b60008514612379576001826123059190615377565b9150600a8561231491906153ab565b60306123209190614d97565b60f81b81838151811061233657612335614aae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123729190615346565b94506122f0565b8093505050505b919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f49061544e565b60405180910390fd5b6000612407612385565b9050600061241583516132e6565b90506124358260008686856040518060200160405280600081525061337e565b60005b83518110156124ef5781818151811061245457612453614aae565b5b6020026020010151600a600086848151811061247357612472614aae565b5b6020026020010151815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124d59190614d97565b9250508190555080806124e790614b78565b915050612438565b508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868560405161256792919061546e565b60405180910390a461258d82600086868560405180602001604052806000815250613386565b50505050565b81518351146125d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ce90615517565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e906155a9565b60405180910390fd5b6000612651612385565b905061266181878787878761337e565b60005b845181101561281557600085828151811061268257612681614aae565b5b6020026020010151905060008583815181106126a1576126a0614aae565b5b602002602001015190506000600a600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273a9061563b565b60405180910390fd5b818103600a600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600a600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127fa9190614d97565b925050819055505050508061280e90614b78565b9050612664565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161288c92919061546e565b60405180910390a46128a2818787878787613386565b505050505050565b600080836040516020016128be91906156a3565b60405160208183030381529060405280519060200120905060006128e18261356d565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612926828661359d565b73ffffffffffffffffffffffffffffffffffffffff16149250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ae9061544e565b60405180910390fd5b60006129c1612385565b90506129f2816000856129d3866135c4565b6129dd60016135c4565b6040518060200160405280600081525061337e565b6001600a600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a539190614d97565b925050819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62856001604051612ad2929190615703565b60405180910390a4612af9816000858560016040518060200160405280600081525061363e565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c299061579e565b60405180910390fd5b6000612c3c612385565b9050612c6d81846000612c4e866135c4565b612c5860016135c4565b6040518060200160405280600081525061337e565b6000600a600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001811015612d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfd90615830565b60405180910390fd5b60018103600a600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62866001604051612dd6929190615703565b60405180910390a450505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4b9061579e565b60405180910390fd5b6000612e5e612385565b90506000612e6c83516132e6565b9050612e8c8285600086856040518060200160405280600081525061337e565b60005b8351811015612fdb576000848281518110612ead57612eac614aae565b5b602002602001015190506000838381518110612ecc57612ecb614aae565b5b602002602001015190506000600a600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6590615830565b60405180910390fd5b818103600a600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080612fd390614b78565b915050612e8f565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868560405161305392919061546e565b60405180910390a450505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156130d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c8906155a9565b60405180910390fd5b60006130db612385565b90506130fb8187876130ec886135c4565b6130f5886135c4565b8761337e565b6000600a600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015613193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318a9061563b565b60405180910390fd5b838103600a600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083600a600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461324a9190614d97565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516132c7929190615850565b60405180910390a46132dd82888888888861363e565b50505050505050565b606060008267ffffffffffffffff81111561330457613303613f48565b5b6040519080825280602002602001820160405280156133325781602001602082028036833780820191505090505b50905060005b8381101561337457600182828151811061335557613354614aae565b5b602002602001018181525050808061336c90614b78565b915050613338565b5080915050919050565b505050505050565b6133a58473ffffffffffffffffffffffffffffffffffffffff16613825565b15613565578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016133eb9594939291906158ce565b602060405180830381600087803b15801561340557600080fd5b505af192505050801561343657506040513d601f19601f82011682018060405250810190613433919061594b565b60015b6134dc57613442615985565b806308c379a0141561349f57506134576159a7565b8061346257506134a1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134969190613f21565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d390615aaf565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355a90615b41565b60405180910390fd5b505b505050505050565b6000816040516020016135809190615bd8565b604051602081830303815290604052805190602001209050919050565b60008060006135ac8585613838565b915091506135b9816138bb565b819250505092915050565b60606000600167ffffffffffffffff8111156135e3576135e2613f48565b5b6040519080825280602002602001820160405280156136115781602001602082028036833780820191505090505b509050828160008151811061362957613628614aae565b5b60200260200101818152505080915050919050565b61365d8473ffffffffffffffffffffffffffffffffffffffff16613825565b1561381d578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016136a3959493929190615bfe565b602060405180830381600087803b1580156136bd57600080fd5b505af19250505080156136ee57506040513d601f19601f820116820180604052508101906136eb919061594b565b60015b613794576136fa615985565b806308c379a01415613757575061370f6159a7565b8061371a5750613759565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374e9190613f21565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378b90615aaf565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461381b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381290615b41565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b60008060418351141561387a5760008060006020860151925060408601519150606086015160001a905061386e87828585613a90565b945094505050506138b4565b6040835114156138ab5760008060208501519150604085015190506138a0868383613b9d565b9350935050506138b4565b60006002915091505b9250929050565b600060048111156138cf576138ce615c58565b5b8160048111156138e2576138e1615c58565b5b14156138ed57613a8d565b6001600481111561390157613900615c58565b5b81600481111561391457613913615c58565b5b1415613955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394c90615cd3565b60405180910390fd5b6002600481111561396957613968615c58565b5b81600481111561397c5761397b615c58565b5b14156139bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b490615d3f565b60405180910390fd5b600360048111156139d1576139d0615c58565b5b8160048111156139e4576139e3615c58565b5b1415613a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a1c90615dd1565b60405180910390fd5b600480811115613a3857613a37615c58565b5b816004811115613a4b57613a4a615c58565b5b1415613a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8390615e63565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613acb576000600391509150613b94565b601b8560ff1614158015613ae35750601c8560ff1614155b15613af5576000600491509150613b94565b600060018787878760405160008152602001604052604051613b1a9493929190615eae565b6020604051602081039080840390855afa158015613b3c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b8b57600060019250925050613b94565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613bdd87828885613a90565b935093505050935093915050565b828054613bf79061491c565b90600052602060002090601f016020900481019282613c195760008555613c60565b82601f10613c3257805160ff1916838001178555613c60565b82800160010185558215613c60579182015b82811115613c5f578251825591602001919060010190613c44565b5b509050613c6d9190613c71565b5090565b5b80821115613c8a576000816000905550600101613c72565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ccd82613ca2565b9050919050565b613cdd81613cc2565b8114613ce857600080fd5b50565b600081359050613cfa81613cd4565b92915050565b6000819050919050565b613d1381613d00565b8114613d1e57600080fd5b50565b600081359050613d3081613d0a565b92915050565b60008060408385031215613d4d57613d4c613c98565b5b6000613d5b85828601613ceb565b9250506020613d6c85828601613d21565b9150509250929050565b613d7f81613d00565b82525050565b6000602082019050613d9a6000830184613d76565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dd581613da0565b8114613de057600080fd5b50565b600081359050613df281613dcc565b92915050565b600060208284031215613e0e57613e0d613c98565b5b6000613e1c84828501613de3565b91505092915050565b60008115159050919050565b613e3a81613e25565b82525050565b6000602082019050613e556000830184613e31565b92915050565b600060208284031215613e7157613e70613c98565b5b6000613e7f84828501613d21565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ec2578082015181840152602081019050613ea7565b83811115613ed1576000848401525b50505050565b6000601f19601f8301169050919050565b6000613ef382613e88565b613efd8185613e93565b9350613f0d818560208601613ea4565b613f1681613ed7565b840191505092915050565b60006020820190508181036000830152613f3b8184613ee8565b905092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f8082613ed7565b810181811067ffffffffffffffff82111715613f9f57613f9e613f48565b5b80604052505050565b6000613fb2613c8e565b9050613fbe8282613f77565b919050565b600067ffffffffffffffff821115613fde57613fdd613f48565b5b602082029050602081019050919050565b600080fd5b600061400761400284613fc3565b613fa8565b9050808382526020820190506020840283018581111561402a57614029613fef565b5b835b81811015614053578061403f8882613d21565b84526020840193505060208101905061402c565b5050509392505050565b600082601f83011261407257614071613f43565b5b8135614082848260208601613ff4565b91505092915050565b6000602082840312156140a1576140a0613c98565b5b600082013567ffffffffffffffff8111156140bf576140be613c9d565b5b6140cb8482850161405d565b91505092915050565b6000602082840312156140ea576140e9613c98565b5b60006140f884828501613ceb565b91505092915050565b6000806040838503121561411857614117613c98565b5b600061412685828601613d21565b925050602061413785828601613d21565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561416157614160613f48565b5b61416a82613ed7565b9050602081019050919050565b82818337600083830152505050565b600061419961419484614146565b613fa8565b9050828152602081018484840111156141b5576141b4614141565b5b6141c0848285614177565b509392505050565b600082601f8301126141dd576141dc613f43565b5b81356141ed848260208601614186565b91505092915050565b600080600080600060a0868803121561421257614211613c98565b5b600061422088828901613ceb565b955050602061423188828901613ceb565b945050604086013567ffffffffffffffff81111561425257614251613c9d565b5b61425e8882890161405d565b935050606086013567ffffffffffffffff81111561427f5761427e613c9d565b5b61428b8882890161405d565b925050608086013567ffffffffffffffff8111156142ac576142ab613c9d565b5b6142b8888289016141c8565b9150509295509295909350565b600080604083850312156142dc576142db613c98565b5b60006142ea85828601613d21565b925050602083013567ffffffffffffffff81111561430b5761430a613c9d565b5b614317858286016141c8565b9150509250929050565b600067ffffffffffffffff82111561433c5761433b613f48565b5b602082029050602081019050919050565b600061436061435b84614321565b613fa8565b9050808382526020820190506020840283018581111561438357614382613fef565b5b835b818110156143ac57806143988882613ceb565b845260208401935050602081019050614385565b5050509392505050565b600082601f8301126143cb576143ca613f43565b5b81356143db84826020860161434d565b91505092915050565b600080604083850312156143fb576143fa613c98565b5b600083013567ffffffffffffffff81111561441957614418613c9d565b5b614425858286016143b6565b925050602083013567ffffffffffffffff81111561444657614445613c9d565b5b6144528582860161405d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61449181613d00565b82525050565b60006144a38383614488565b60208301905092915050565b6000602082019050919050565b60006144c78261445c565b6144d18185614467565b93506144dc83614478565b8060005b8381101561450d5781516144f48882614497565b97506144ff836144af565b9250506001810190506144e0565b5085935050505092915050565b6000602082019050818103600083015261453481846144bc565b905092915050565b61454581613cc2565b82525050565b6000602082019050614560600083018461453c565b92915050565b600067ffffffffffffffff82111561458157614580613f48565b5b61458a82613ed7565b9050602081019050919050565b60006145aa6145a584614566565b613fa8565b9050828152602081018484840111156145c6576145c5614141565b5b6145d1848285614177565b509392505050565b600082601f8301126145ee576145ed613f43565b5b81356145fe848260208601614597565b91505092915050565b60006020828403121561461d5761461c613c98565b5b600082013567ffffffffffffffff81111561463b5761463a613c9d565b5b614647848285016145d9565b91505092915050565b61465981613e25565b811461466457600080fd5b50565b60008135905061467681614650565b92915050565b6000806040838503121561469357614692613c98565b5b60006146a185828601613ceb565b92505060206146b285828601614667565b9150509250929050565b600080604083850312156146d3576146d2613c98565b5b60006146e185828601613ceb565b92505060206146f285828601613ceb565b9150509250929050565b600080600080600060a0868803121561471857614717613c98565b5b600061472688828901613ceb565b955050602061473788828901613ceb565b945050604061474888828901613d21565b935050606061475988828901613d21565b925050608086013567ffffffffffffffff81111561477a57614779613c9d565b5b614786888289016141c8565b9150509295509295909350565b600080604083850312156147aa576147a9613c98565b5b60006147b885828601613d21565b925050602083013567ffffffffffffffff8111156147d9576147d8613c9d565b5b6147e5858286016145d9565b9150509250929050565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b600061484b602b83613e93565b9150614856826147ef565b604082019050919050565b6000602082019050818103600083015261487a8161483e565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b60006148b7601f83613e93565b91506148c282614881565b602082019050919050565b600060208201905081810360008301526148e6816148aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061493457607f821691505b60208210811415614948576149476148ed565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461497b8161491c565b614985818661494e565b945060018216600081146149a057600181146149b1576149e4565b60ff198316865281860193506149e4565b6149ba85614959565b60005b838110156149dc578154818901526001820191506020810190506149bd565b838801955050505b50505092915050565b60006149f882613e88565b614a02818561494e565b9350614a12818560208601613ea4565b80840191505092915050565b6000614a2a828561496e565b9150614a3682846149ed565b91508190509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a78602083613e93565b9150614a8382614a42565b602082019050919050565b60006020820190508181036000830152614aa781614a6b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f57726f6e67206964730000000000000000000000000000000000000000000000600082015250565b6000614b13600983613e93565b9150614b1e82614add565b602082019050919050565b60006020820190508181036000830152614b4281614b06565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b8382613d00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614bb657614bb5614b49565b5b600182019050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b6000614bf7601483613e93565b9150614c0282614bc1565b602082019050919050565b60006020820190508181036000830152614c2681614bea565b9050919050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614c89603283613e93565b9150614c9482614c2d565b604082019050919050565b60006020820190508181036000830152614cb881614c7c565b9050919050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b6000614cf5600683613e93565b9150614d0082614cbf565b602082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b7f5369676e6174757265206572726f720000000000000000000000000000000000600082015250565b6000614d61600f83613e93565b9150614d6c82614d2b565b602082019050919050565b60006020820190508181036000830152614d9081614d54565b9050919050565b6000614da282613d00565b9150614dad83613d00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614de257614de1614b49565b5b828201905092915050565b7f4c696d6974206973203130000000000000000000000000000000000000000000600082015250565b6000614e23600b83613e93565b9150614e2e82614ded565b602082019050919050565b60006020820190508181036000830152614e5281614e16565b9050919050565b7f5453206578636565646564000000000000000000000000000000000000000000600082015250565b6000614e8f600b83613e93565b9150614e9a82614e59565b602082019050919050565b60006020820190508181036000830152614ebe81614e82565b9050919050565b6000614ed082613d00565b9150614edb83613d00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f1457614f13614b49565b5b828202905092915050565b7f4574682076616c7565206572726f720000000000000000000000000000000000600082015250565b6000614f55600f83613e93565b9150614f6082614f1f565b602082019050919050565b60006020820190508181036000830152614f8481614f48565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614fe7602983613e93565b9150614ff282614f8b565b604082019050919050565b6000602082019050818103600083015261501681614fda565b9050919050565b7f426173652055524920667265657a656400000000000000000000000000000000600082015250565b6000615053601083613e93565b915061505e8261501d565b602082019050919050565b6000602082019050818103600083015261508281615046565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006150e5602983613e93565b91506150f082615089565b604082019050919050565b60006020820190508181036000830152615114816150d8565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000615177602983613e93565b91506151828261511b565b604082019050919050565b600060208201905081810360008301526151a68161516a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615209602683613e93565b9150615214826151ad565b604082019050919050565b60006020820190508181036000830152615238816151fc565b9050919050565b7f6164646974696f6e616c5552497320667265657a656400000000000000000000600082015250565b6000615275601683613e93565b91506152808261523f565b602082019050919050565b600060208201905081810360008301526152a481615268565b9050919050565b7f57726f6e6720746f6b656e496400000000000000000000000000000000000000600082015250565b60006152e1600d83613e93565b91506152ec826152ab565b602082019050919050565b60006020820190508181036000830152615310816152d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061535182613d00565b915061535c83613d00565b92508261536c5761536b615317565b5b828204905092915050565b600061538282613d00565b915061538d83613d00565b9250828210156153a05761539f614b49565b5b828203905092915050565b60006153b682613d00565b91506153c183613d00565b9250826153d1576153d0615317565b5b828206905092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615438602183613e93565b9150615443826153dc565b604082019050919050565b600060208201905081810360008301526154678161542b565b9050919050565b6000604082019050818103600083015261548881856144bc565b9050818103602083015261549c81846144bc565b90509392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615501602883613e93565b915061550c826154a5565b604082019050919050565b60006020820190508181036000830152615530816154f4565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615593602583613e93565b915061559e82615537565b604082019050919050565b600060208201905081810360008301526155c281615586565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615625602a83613e93565b9150615630826155c9565b604082019050919050565b6000602082019050818103600083015261565481615618565b9050919050565b60008160601b9050919050565b60006156738261565b565b9050919050565b600061568582615668565b9050919050565b61569d61569882613cc2565b61567a565b82525050565b60006156af828461568c565b60148201915081905092915050565b6000819050919050565b6000819050919050565b60006156ed6156e86156e3846156be565b6156c8565b613d00565b9050919050565b6156fd816156d2565b82525050565b60006040820190506157186000830185613d76565b61572560208301846156f4565b9392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615788602383613e93565b91506157938261572c565b604082019050919050565b600060208201905081810360008301526157b78161577b565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061581a602483613e93565b9150615825826157be565b604082019050919050565b600060208201905081810360008301526158498161580d565b9050919050565b60006040820190506158656000830185613d76565b6158726020830184613d76565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006158a082615879565b6158aa8185615884565b93506158ba818560208601613ea4565b6158c381613ed7565b840191505092915050565b600060a0820190506158e3600083018861453c565b6158f0602083018761453c565b818103604083015261590281866144bc565b9050818103606083015261591681856144bc565b9050818103608083015261592a8184615895565b90509695505050505050565b60008151905061594581613dcc565b92915050565b60006020828403121561596157615960613c98565b5b600061596f84828501615936565b91505092915050565b60008160e01c9050919050565b600060033d11156159a45760046000803e6159a1600051615978565b90505b90565b600060443d10156159b757615a3a565b6159bf613c8e565b60043d036004823e80513d602482011167ffffffffffffffff821117156159e7575050615a3a565b808201805167ffffffffffffffff811115615a055750505050615a3a565b80602083010160043d038501811115615a22575050505050615a3a565b615a3182602001850186613f77565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615a99603483613e93565b9150615aa482615a3d565b604082019050919050565b60006020820190508181036000830152615ac881615a8c565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615b2b602883613e93565b9150615b3682615acf565b604082019050919050565b60006020820190508181036000830152615b5a81615b1e565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000615b97601c8361494e565b9150615ba282615b61565b601c82019050919050565b6000819050919050565b6000819050919050565b615bd2615bcd82615bad565b615bb7565b82525050565b6000615be382615b8a565b9150615bef8284615bc1565b60208201915081905092915050565b600060a082019050615c13600083018861453c565b615c20602083018761453c565b615c2d6040830186613d76565b615c3a6060830185613d76565b8181036080830152615c4c8184615895565b90509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615cbd601883613e93565b9150615cc882615c87565b602082019050919050565b60006020820190508181036000830152615cec81615cb0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000615d29601f83613e93565b9150615d3482615cf3565b602082019050919050565b60006020820190508181036000830152615d5881615d1c565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615dbb602283613e93565b9150615dc682615d5f565b604082019050919050565b60006020820190508181036000830152615dea81615dae565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615e4d602283613e93565b9150615e5882615df1565b604082019050919050565b60006020820190508181036000830152615e7c81615e40565b9050919050565b615e8c81615bad565b82525050565b600060ff82169050919050565b615ea881615e92565b82525050565b6000608082019050615ec36000830187615e83565b615ed06020830186615e9f565b615edd6040830185615e83565b615eea6060830184615e83565b9594505050505056fea26469706673582212202fb542fa39a93fb102c3e7fc3c0794f802521ac206485aa80238cbda29b6c8d364736f6c63430008090033

Deployed Bytecode Sourcemap

41615:14837:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43138:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42824:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55208:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41994:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55757:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42638:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54848:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55015:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44780:434;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42142:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53374:940;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43373:507;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42741:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41877:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42686:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51954:68;;;;;;;;;;;;;:::i;:::-;;52279:70;;;;;;;;;;;;;:::i;:::-;;41957:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19581:94;;;;;;;;;;;;;:::i;:::-;;41831:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55554:88;;;;;;;;;;;;;:::i;:::-;;18930:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55654:91;;;;;;;;;;;;;:::i;:::-;;54748:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42039:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41916:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52622:740;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51807:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43892:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42590:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54326:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42077:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44203:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44375:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19830:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52034:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43138:223;43216:7;43263:1;43244:21;;:7;:21;;;;43236:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;43331:9;:13;43341:2;43331:13;;;;;;;;;;;:22;43345:7;43331:22;;;;;;;;;;;;;;;;43324:29;;43138:223;;;;:::o;42824:302::-;42918:4;42970:26;42955:41;;;:11;:41;;;;:110;;;;43028:37;43013:52;;;:11;:52;;;;42955:110;:163;;;;43082:36;43106:11;43082:23;:36::i;:::-;42955:163;42935:183;;42824:302;;;:::o;55208:334::-;55268:13;55313:10;;55302:7;:21;;:42;;;;55327:8;:17;55336:7;55327:17;;;;;;;;;;;;;;;;;;;;;55302:42;55294:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;55404:4;55394:7;:14;55391:76;;;55432:14;:23;55447:7;55432:23;;;;;;;;;;;55425:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55391:76;55508:4;55514:18;:7;:16;:18::i;:::-;55491:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55477:57;;55208:334;;;;:::o;41994:38::-;;;;:::o;55757:397::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55828:6:::1;55824:188;55844:3;:10;55840:1;:14;55824:188;;;55889:10;;55879:3;55883:1;55879:6;;;;;;;;:::i;:::-;;;;;;;;:20;;:38;;;;55912:5;55903:3;55907:1;55903:6;;;;;;;;:::i;:::-;;;;;;;;:14;55879:38;:66;;;;55941:4;55921:24;;:8;:16;55930:3;55934:1;55930:6;;;;;;;;:::i;:::-;;;;;;;;55921:16;;;;;;;;;;;;;;;;;;;;;:24;;;55879:66;55876:125;;;55966:19;;;;;;;;;;:::i;:::-;;;;;;;;55876:125;55856:3;;;;;:::i;:::-;;;;55824:188;;;;56022:27;56033:10;56045:3;56022:10;:27::i;:::-;56064:6;56060:87;56080:3;:10;56076:1;:14;56060:87;;;56131:4;56112:8;:16;56121:3;56125:1;56121:6;;;;;;;;:::i;:::-;;;;;;;;56112:16;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;56092:3;;;;;:::i;:::-;;;;56060:87;;;;55757:397:::0;:::o;42638:41::-;;;;;;;;;;;;;;;;;:::o;54848:155::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54953:13:::1;54932:18;:34;;;;54990:5;54977:10;:18;;;;54848:155:::0;;:::o;55015:181::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55095:21:::1;55085:6;:31;;55077:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;55160:10;55152:28;;:36;55181:6;55152:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55015:181:::0;:::o;44780:434::-;45013:12;:10;:12::i;:::-;45005:20;;:4;:20;;;:60;;;;45029:36;45046:4;45052:12;:10;:12::i;:::-;45029:16;:36::i;:::-;45005:60;44983:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;45154:52;45177:4;45183:2;45187:3;45192:7;45201:4;45154:22;:52::i;:::-;44780:434;;;;;:::o;42142:31::-;;;;:::o;53374:940::-;53477:12;;;;;;;;;;;53469:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;53552:4;53519:37;;:29;53526:10;53538:9;53519:6;:29::i;:::-;:37;;;53511:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53636:18;;53616:16;53595:6;:18;53602:10;53595:18;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:59;;53587:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53724:10;;53704:16;53689:12;;:31;;;;:::i;:::-;:45;;53681:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53801:11;;53782:16;:30;;;;:::i;:::-;53769:9;:43;;53761:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53866:1;53846:16;:21;53843:372;;;53884:35;53890:10;53917:1;53902:12;;:16;;;;:::i;:::-;53884:5;:35::i;:::-;53843:372;;;53968:1;53949:16;:20;53946:269;;;53986:20;54023:16;54009:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53986:54;;54059:6;54055:107;54075:16;54071:1;:20;54055:107;;;54145:1;54141;54126:12;;:16;;;;:::i;:::-;:20;;;;:::i;:::-;54117:3;54121:1;54117:6;;;;;;;;:::i;:::-;;;;;;;:29;;;;;54093:3;;;;;:::i;:::-;;;;54055:107;;;;54176:27;54187:10;54199:3;54176:10;:27::i;:::-;53971:244;53946:269;53843:372;54241:16;54225:12;;:32;;;;;;;:::i;:::-;;;;;;;;54290:16;54268:6;:18;54275:10;54268:18;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;53374:940;;:::o;43373:507::-;43512:16;43573:3;:10;43554:8;:15;:29;43546:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;43642:30;43689:8;:15;43675:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43642:63;;43723:9;43718:122;43742:8;:15;43738:1;:19;43718:122;;;43798:30;43808:8;43817:1;43808:11;;;;;;;;:::i;:::-;;;;;;;;43821:3;43825:1;43821:6;;;;;;;;:::i;:::-;;;;;;;;43798:9;:30::i;:::-;43779:13;43793:1;43779:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;43759:3;;;;:::i;:::-;;;43718:122;;;;43859:13;43852:20;;;43373:507;;;;:::o;42741:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;41877:32::-;;;;:::o;42686:48::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51954:68::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52010:4:::1;52000:7;;:14;;;;;;;;;;;;;;;;;;51954:68::o:0;52279:70::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52337:4:::1;52326:8;;:15;;;;;;;;;;;;;;;;;;52279:70::o:0;41957:30::-;;;;:::o;19581:94::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19646:21:::1;19664:1;19646:9;:21::i;:::-;19581:94::o:0;41831:39::-;;;;:::o;55554:88::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55623:11:::1;;;;;;;;;;;55622:12;55608:11;;:26;;;;;;;;;;;;;;;;;;55554:88::o:0;18930:87::-;18976:7;19003:6;;;;;;;;;;;18996:13;;18930:87;:::o;55654:91::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55725:12:::1;;;;;;;;;;;55724:13;55709:12;;:28;;;;;;;;;;;;;;;;;;55654:91::o:0;54748:88::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54823:5:::1;54809:11;:19;;;;54748:88:::0;:::o;42039:31::-;;;;;;;;;;;;;:::o;41916:34::-;;;;:::o;52622:740::-;52696:11;;;;;;;;;;;52688:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;52772:10;;52752:16;52737:12;;:31;;;;:::i;:::-;:45;;52729:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52849:11;;52830:16;:30;;;;:::i;:::-;52817:9;:43;;52809:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52914:1;52894:16;:21;52891:372;;;52932:35;52938:10;52965:1;52950:12;;:16;;;;:::i;:::-;52932:5;:35::i;:::-;52891:372;;;53016:1;52997:16;:20;52994:269;;;53034:20;53071:16;53057:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53034:54;;53107:6;53103:107;53123:16;53119:1;:20;53103:107;;;53193:1;53189;53174:12;;:16;;;;:::i;:::-;:20;;;;:::i;:::-;53165:3;53169:1;53165:6;;;;;;;;:::i;:::-;;;;;;;:29;;;;;53141:3;;;;;:::i;:::-;;;;53103:107;;;;53224:27;53235:10;53247:3;53224:10;:27::i;:::-;53019:244;52994:269;52891:372;53289:16;53273:12;;:32;;;;;;;:::i;:::-;;;;;;;;53338:16;53316:6;:18;53323:10;53316:18;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;52622:740;:::o;51807:135::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51884:7:::1;;;;;;;;;;;51883:8;51875:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;51930:4;51923;:11;;;;;;;;;;;;:::i;:::-;;51807:135:::0;:::o;43892:303::-;44003:8;43987:24;;:12;:10;:12::i;:::-;:24;;;;43979:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;44115:8;44070:18;:32;44089:12;:10;:12::i;:::-;44070:32;;;;;;;;;;;;;;;:42;44103:8;44070:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;44168:8;44139:48;;44154:12;:10;:12::i;:::-;44139:48;;;44178:8;44139:48;;;;;;:::i;:::-;;;;;;;;43892:303;;:::o;42590:41::-;;;;;;;;;;;;;;;;;:::o;54326:410::-;54384:6;54380:155;54400:3;:10;54396:1;:14;54380:155;;;54467:1;54435:29;54445:10;54457:3;54461:1;54457:6;;;;;;;;:::i;:::-;;;;;;;;54435:9;:29::i;:::-;:33;54432:92;;;54489:19;;;;;;;;;;:::i;:::-;;;;;;;;54432:92;54412:3;;;;;:::i;:::-;;;;54380:155;;;;54562:1;54548:3;:10;:15;54545:141;;;54580:25;54586:10;54598:3;54602:1;54598:6;;;;;;;;:::i;:::-;;;;;;;;54580:5;:25::i;:::-;54545:141;;;54647:27;54658:10;54670:3;54647:10;:27::i;:::-;54545:141;54718:3;:10;54696:6;:18;54703:10;54696:18;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;54326:410;:::o;42077:32::-;;;;;;;;;;;;;:::o;44203:160::-;44294:4;44318:18;:27;44337:7;44318:27;;;;;;;;;;;;;;;:37;44346:8;44318:37;;;;;;;;;;;;;;;;;;;;;;;;;44311:44;;44203:160;;;;:::o;44375:393::-;44583:12;:10;:12::i;:::-;44575:20;;:4;:20;;;:60;;;;44599:36;44616:4;44622:12;:10;:12::i;:::-;44599:16;:36::i;:::-;44575:60;44553:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;44715:45;44733:4;44739:2;44743;44747:6;44755:4;44715:17;:45::i;:::-;44375:393;;;;;:::o;19830:192::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19939:1:::1;19919:22;;:8;:22;;;;19911:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19995:19;20005:8;19995:9;:19::i;:::-;19830:192:::0;:::o;52034:233::-;19161:12;:10;:12::i;:::-;19150:23;;:7;:5;:7::i;:::-;:23;;;19142:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52129:8:::1;;;;;;;;;;;52128:9;52120:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;52183:8;:17;52192:7;52183:17;;;;;;;;;;;;;;;;;;;;;52175:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;52255:4;52229:14;:23;52244:7;52229:23;;;;;;;;;;;:30;;;;;;;;;;;;:::i;:::-;;52034:233:::0;;:::o;17768:157::-;17853:4;17892:25;17877:40;;;:11;:40;;;;17870:47;;17768:157;;;:::o;27478:723::-;27534:13;27764:1;27755:5;:10;27751:53;;;27782:10;;;;;;;;;;;;;;;;;;;;;27751:53;27814:12;27829:5;27814:20;;27845:14;27870:78;27885:1;27877:4;:9;27870:78;;27903:8;;;;;:::i;:::-;;;;27934:2;27926:10;;;;;:::i;:::-;;;27870:78;;;27958:19;27990:6;27980:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27958:39;;28008:154;28024:1;28015:5;:10;28008:154;;28052:1;28042:11;;;;;:::i;:::-;;;28119:2;28111:5;:10;;;;:::i;:::-;28098:2;:24;;;;:::i;:::-;28085:39;;28068:6;28075;28068:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;28148:2;28139:11;;;;;:::i;:::-;;;28008:154;;;28186:6;28172:21;;;;;27478:723;;;;:::o;16756:98::-;16809:7;16836:10;16829:17;;16756:98;:::o;47654:635::-;47775:1;47761:16;;:2;:16;;;;47753:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47826:16;47845:12;:10;:12::i;:::-;47826:31;;47878:24;47905:23;47917:3;:10;47905:11;:23::i;:::-;47878:50;;47939:64;47960:8;47978:1;47982:2;47986:3;47991:7;47939:64;;;;;;;;;;;;:20;:64::i;:::-;48021:9;48016:103;48040:3;:10;48036:1;:14;48016:103;;;48097:7;48105:1;48097:10;;;;;;;;:::i;:::-;;;;;;;;48072:9;:17;48082:3;48086:1;48082:6;;;;;;;;:::i;:::-;;;;;;;;48072:17;;;;;;;;;;;:21;48090:2;48072:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;48052:3;;;;;:::i;:::-;;;;48016:103;;;;48172:2;48136:53;;48168:1;48136:53;;48150:8;48136:53;;;48176:3;48181:7;48136:53;;;;;;;:::i;:::-;;;;;;;;48202:79;48238:8;48256:1;48260:2;48264:3;48269:7;48202:79;;;;;;;;;;;;:35;:79::i;:::-;47742:547;;47654:635;;:::o;46050:1066::-;46269:7;:14;46255:3;:10;:28;46247:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46361:1;46347:16;;:2;:16;;;;46339:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;46418:16;46437:12;:10;:12::i;:::-;46418:31;;46462:60;46483:8;46493:4;46499:2;46503:3;46508:7;46517:4;46462:20;:60::i;:::-;46540:9;46535:421;46559:3;:10;46555:1;:14;46535:421;;;46591:10;46604:3;46608:1;46604:6;;;;;;;;:::i;:::-;;;;;;;;46591:19;;46625:14;46642:7;46650:1;46642:10;;;;;;;;:::i;:::-;;;;;;;;46625:27;;46669:19;46691:9;:13;46701:2;46691:13;;;;;;;;;;;:19;46705:4;46691:19;;;;;;;;;;;;;;;;46669:41;;46748:6;46733:11;:21;;46725:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46881:6;46867:11;:20;46845:9;:13;46855:2;46845:13;;;;;;;;;;;:19;46859:4;46845:19;;;;;;;;;;;;;;;:42;;;;46938:6;46917:9;:13;46927:2;46917:13;;;;;;;;;;;:17;46931:2;46917:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;46576:380;;;46571:3;;;;:::i;:::-;;;46535:421;;;;47003:2;46973:47;;46997:4;46973:47;;46987:8;46973:47;;;47007:3;47012:7;46973:47;;;;;;;:::i;:::-;;;;;;;;47033:75;47069:8;47079:4;47085:2;47089:3;47094:7;47103:4;47033:35;:75::i;:::-;46236:880;46050:1066;;;;;:::o;56166:283::-;56242:4;56259:12;56301:4;56284:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;56274:33;;;;;;56259:48;;56318:20;56341:34;56370:4;56341:28;:34::i;:::-;56318:57;;56435:6;;;;;;;;;;;56393:48;;:38;56407:12;56421:9;56393:13;:38::i;:::-;:48;;;56386:55;;;;56166:283;;;;:::o;47128:514::-;47244:1;47225:21;;:7;:21;;;;47217:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;47297:16;47316:12;:10;:12::i;:::-;47297:31;;47341:100;47362:8;47380:1;47384:7;47393:21;47411:2;47393:17;:21::i;:::-;47416:20;47434:1;47416:17;:20::i;:::-;47341:100;;;;;;;;;;;;:20;:100::i;:::-;47480:1;47454:9;:13;47464:2;47454:13;;;;;;;;;;;:22;47468:7;47454:22;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;47534:7;47497:52;;47530:1;47497:52;;47512:8;47497:52;;;47543:2;47547:1;47497:52;;;;;;;:::i;:::-;;;;;;;;47562:72;47593:8;47611:1;47615:7;47624:2;47628:1;47562:72;;;;;;;;;;;;:30;:72::i;:::-;47206:436;47128:514;;:::o;20030:173::-;20086:16;20105:6;;;;;;;;;;;20086:25;;20131:8;20122:6;;:17;;;;;;;;;;;;;;;;;;20186:8;20155:40;;20176:8;20155:40;;;;;;;;;;;;20075:128;20030:173;:::o;48301:630::-;48417:1;48398:21;;:7;:21;;;;48390:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;48472:16;48491:12;:10;:12::i;:::-;48472:31;;48516:100;48537:8;48547:7;48564:1;48568:21;48586:2;48568:17;:21::i;:::-;48591:20;48609:1;48591:17;:20::i;:::-;48516:100;;;;;;;;;;;;:20;:100::i;:::-;48629:22;48654:9;:13;48664:2;48654:13;;;;;;;;;;;:22;48668:7;48654:22;;;;;;;;;;;;;;;;48629:47;;48713:1;48695:14;:19;;48687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48833:1;48816:14;:18;48791:9;:13;48801:2;48791:13;;;;;;;;;;;:22;48805:7;48791:22;;;;;;;;;;;;;;;:43;;;;48913:1;48871:52;;48896:7;48871:52;;48886:8;48871:52;;;48917:2;48921:1;48871:52;;;;;;;:::i;:::-;;;;;;;;48379:552;;48301:630;;:::o;48943:844::-;49074:1;49055:21;;:7;:21;;;;49047:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;49129:16;49148:12;:10;:12::i;:::-;49129:31;;49171:24;49198:23;49210:3;:10;49198:11;:23::i;:::-;49171:50;;49234:69;49255:8;49265:7;49282:1;49286:3;49291:7;49234:69;;;;;;;;;;;;:20;:69::i;:::-;49321:9;49316:388;49340:3;:10;49336:1;:14;49316:388;;;49372:10;49385:3;49389:1;49385:6;;;;;;;;:::i;:::-;;;;;;;;49372:19;;49406:14;49423:7;49431:1;49423:10;;;;;;;;:::i;:::-;;;;;;;;49406:27;;49450:22;49475:9;:13;49485:2;49475:13;;;;;;;;;;;:22;49489:7;49475:22;;;;;;;;;;;;;;;;49450:47;;49538:6;49520:14;:24;;49512:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49671:6;49654:14;:23;49629:9;:13;49639:2;49629:13;;;;;;;;;;;:22;49643:7;49629:22;;;;;;;;;;;;;;;:48;;;;49357:347;;;49352:3;;;;;:::i;:::-;;;;49316:388;;;;49762:1;49721:58;;49745:7;49721:58;;49735:8;49721:58;;;49766:3;49771:7;49721:58;;;;;;;:::i;:::-;;;;;;;;49036:751;;48943:844;;:::o;45226:812::-;45420:1;45406:16;;:2;:16;;;;45398:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45477:16;45496:12;:10;:12::i;:::-;45477:31;;45521:96;45542:8;45552:4;45558:2;45562:21;45580:2;45562:17;:21::i;:::-;45585:25;45603:6;45585:17;:25::i;:::-;45612:4;45521:20;:96::i;:::-;45630:19;45652:9;:13;45662:2;45652:13;;;;;;;;;;;:19;45666:4;45652:19;;;;;;;;;;;;;;;;45630:41;;45705:6;45690:11;:21;;45682:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45830:6;45816:11;:20;45794:9;:13;45804:2;45794:13;;;;;;;;;;;:19;45808:4;45794:19;;;;;;;;;;;;;;;:42;;;;45879:6;45858:9;:13;45868:2;45858:13;;;;;;;;;;;:17;45872:2;45858:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;45934:2;45903:46;;45928:4;45903:46;;45918:8;45903:46;;;45938:2;45942:6;45903:46;;;;;;;:::i;:::-;;;;;;;;45962:68;45993:8;46003:4;46009:2;46013;46017:6;46025:4;45962:30;:68::i;:::-;45387:651;;45226:812;;;;;:::o;52357:253::-;52416:16;52445:24;52486:6;52472:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52445:48;;52508:6;52504:74;52524:6;52520:1;:10;52504:74;;;52565:1;52552:7;52560:1;52552:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;52532:3;;;;;:::i;:::-;;;;52504:74;;;;52595:7;52588:14;;;52357:253;;;:::o;49799:213::-;;;;;;;:::o;50776:813::-;51016:15;:2;:13;;;:15::i;:::-;51012:570;;;51069:2;51052:43;;;51096:8;51106:4;51112:3;51117:7;51126:4;51052:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51048:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;51444:6;51437:14;;;;;;;;;;;:::i;:::-;;;;;;;;51048:523;;;51493:62;;;;;;;;;;:::i;:::-;;;;;;;;51048:523;51225:48;;;51213:60;;;:8;:60;;;;51209:159;;51298:50;;;;;;;;;;:::i;:::-;;;;;;;;51209:159;51132:251;51012:570;50776:813;;;;;;:::o;37421:269::-;37490:7;37676:4;37623:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;37613:69;;;;;;37606:76;;37421:269;;;:::o;33572:231::-;33650:7;33671:17;33690:18;33712:27;33723:4;33729:9;33712:10;:27::i;:::-;33670:69;;;;33750:18;33762:5;33750:11;:18::i;:::-;33786:9;33779:16;;;;33572:231;;;;:::o;51597:198::-;51663:16;51692:22;51731:1;51717:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51692:41;;51755:7;51744:5;51750:1;51744:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;51782:5;51775:12;;;51597:198;;;:::o;50020:744::-;50235:15;:2;:13;;;:15::i;:::-;50231:526;;;50288:2;50271:38;;;50310:8;50320:4;50326:2;50330:6;50338:4;50271:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50267:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;50619:6;50612:14;;;;;;;;;;;:::i;:::-;;;;;;;;50267:479;;;50668:62;;;;;;;;;;:::i;:::-;;;;;;;;50267:479;50405:43;;;50393:55;;;:8;:55;;;;50389:154;;50473:50;;;;;;;;;;:::i;:::-;;;;;;;;50389:154;50344:214;50231:526;50020:744;;;;;;:::o;8800:387::-;8860:4;9068:12;9135:7;9123:20;9115:28;;9178:1;9171:4;:8;9164:15;;;8800:387;;;:::o;31462:1308::-;31543:7;31552:12;31797:2;31777:9;:16;:22;31773:990;;;31816:9;31840;31864:7;32073:4;32062:9;32058:20;32052:27;32047:32;;32123:4;32112:9;32108:20;32102:27;32097:32;;32181:4;32170:9;32166:20;32160:27;32157:1;32152:36;32147:41;;32224:25;32235:4;32241:1;32244;32247;32224:10;:25::i;:::-;32217:32;;;;;;;;;31773:990;32291:2;32271:9;:16;:22;32267:496;;;32310:9;32334:10;32546:4;32535:9;32531:20;32525:27;32520:32;;32597:4;32586:9;32582:20;32576:27;32570:33;;32639:23;32650:4;32656:1;32659:2;32639:10;:23::i;:::-;32632:30;;;;;;;;32267:496;32711:1;32715:35;32695:56;;;;31462:1308;;;;;;:::o;29733:643::-;29811:20;29802:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;29798:571;;;29848:7;;29798:571;29909:29;29900:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;29896:473;;;29955:34;;;;;;;;;;:::i;:::-;;;;;;;;29896:473;30020:35;30011:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;30007:362;;;30072:41;;;;;;;;;;:::i;:::-;;;;;;;;30007:362;30144:30;30135:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;30131:238;;;30191:44;;;;;;;;;;:::i;:::-;;;;;;;;30131:238;30266:30;30257:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;30253:116;;;30313:44;;;;;;;;;;:::i;:::-;;;;;;;;30253:116;29733:643;;:::o;35071:1632::-;35202:7;35211:12;36136:66;36131:1;36123:10;;:79;36119:163;;;36235:1;36239:30;36219:51;;;;;;36119:163;36301:2;36296:1;:7;;;;:18;;;;;36312:2;36307:1;:7;;;;36296:18;36292:102;;;36347:1;36351:30;36331:51;;;;;;36292:102;36491:14;36508:24;36518:4;36524:1;36527;36530;36508:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36491:41;;36565:1;36547:20;;:6;:20;;;36543:103;;;36600:1;36604:29;36584:50;;;;;;;36543:103;36666:6;36674:20;36658:37;;;;;35071:1632;;;;;;;;:::o;34066:391::-;34180:7;34189:12;34214:9;34234:7;34289:66;34285:2;34281:75;34276:80;;34393:2;34388;34383:3;34379:12;34375:21;34370:26;;34424:25;34435:4;34441:1;34444;34447;34424:10;:25::i;:::-;34417:32;;;;;;34066:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:329::-;3272:6;3321:2;3309:9;3300:7;3296:23;3292:32;3289:119;;;3327:79;;:::i;:::-;3289:119;3447:1;3472:53;3517:7;3508:6;3497:9;3493:22;3472:53;:::i;:::-;3462:63;;3418:117;3213:329;;;;:::o;3548:99::-;3600:6;3634:5;3628:12;3618:22;;3548:99;;;:::o;3653:169::-;3737:11;3771:6;3766:3;3759:19;3811:4;3806:3;3802:14;3787:29;;3653:169;;;;:::o;3828:307::-;3896:1;3906:113;3920:6;3917:1;3914:13;3906:113;;;4005:1;4000:3;3996:11;3990:18;3986:1;3981:3;3977:11;3970:39;3942:2;3939:1;3935:10;3930:15;;3906:113;;;4037:6;4034:1;4031:13;4028:101;;;4117:1;4108:6;4103:3;4099:16;4092:27;4028:101;3877:258;3828:307;;;:::o;4141:102::-;4182:6;4233:2;4229:7;4224:2;4217:5;4213:14;4209:28;4199:38;;4141:102;;;:::o;4249:364::-;4337:3;4365:39;4398:5;4365:39;:::i;:::-;4420:71;4484:6;4479:3;4420:71;:::i;:::-;4413:78;;4500:52;4545:6;4540:3;4533:4;4526:5;4522:16;4500:52;:::i;:::-;4577:29;4599:6;4577:29;:::i;:::-;4572:3;4568:39;4561:46;;4341:272;4249:364;;;;:::o;4619:313::-;4732:4;4770:2;4759:9;4755:18;4747:26;;4819:9;4813:4;4809:20;4805:1;4794:9;4790:17;4783:47;4847:78;4920:4;4911:6;4847:78;:::i;:::-;4839:86;;4619:313;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:180;5109:77;5106:1;5099:88;5206:4;5203:1;5196:15;5230:4;5227:1;5220:15;5247:281;5330:27;5352:4;5330:27;:::i;:::-;5322:6;5318:40;5460:6;5448:10;5445:22;5424:18;5412:10;5409:34;5406:62;5403:88;;;5471:18;;:::i;:::-;5403:88;5511:10;5507:2;5500:22;5290:238;5247:281;;:::o;5534:129::-;5568:6;5595:20;;:::i;:::-;5585:30;;5624:33;5652:4;5644:6;5624:33;:::i;:::-;5534:129;;;:::o;5669:311::-;5746:4;5836:18;5828:6;5825:30;5822:56;;;5858:18;;:::i;:::-;5822:56;5908:4;5900:6;5896:17;5888:25;;5968:4;5962;5958:15;5950:23;;5669:311;;;:::o;5986:117::-;6095:1;6092;6085:12;6126:710;6222:5;6247:81;6263:64;6320:6;6263:64;:::i;:::-;6247:81;:::i;:::-;6238:90;;6348:5;6377:6;6370:5;6363:21;6411:4;6404:5;6400:16;6393:23;;6464:4;6456:6;6452:17;6444:6;6440:30;6493:3;6485:6;6482:15;6479:122;;;6512:79;;:::i;:::-;6479:122;6627:6;6610:220;6644:6;6639:3;6636:15;6610:220;;;6719:3;6748:37;6781:3;6769:10;6748:37;:::i;:::-;6743:3;6736:50;6815:4;6810:3;6806:14;6799:21;;6686:144;6670:4;6665:3;6661:14;6654:21;;6610:220;;;6614:21;6228:608;;6126:710;;;;;:::o;6859:370::-;6930:5;6979:3;6972:4;6964:6;6960:17;6956:27;6946:122;;6987:79;;:::i;:::-;6946:122;7104:6;7091:20;7129:94;7219:3;7211:6;7204:4;7196:6;7192:17;7129:94;:::i;:::-;7120:103;;6936:293;6859:370;;;;:::o;7235:539::-;7319:6;7368:2;7356:9;7347:7;7343:23;7339:32;7336:119;;;7374:79;;:::i;:::-;7336:119;7522:1;7511:9;7507:17;7494:31;7552:18;7544:6;7541:30;7538:117;;;7574:79;;:::i;:::-;7538:117;7679:78;7749:7;7740:6;7729:9;7725:22;7679:78;:::i;:::-;7669:88;;7465:302;7235:539;;;;:::o;7780:329::-;7839:6;7888:2;7876:9;7867:7;7863:23;7859:32;7856:119;;;7894:79;;:::i;:::-;7856:119;8014:1;8039:53;8084:7;8075:6;8064:9;8060:22;8039:53;:::i;:::-;8029:63;;7985:117;7780:329;;;;:::o;8115:474::-;8183:6;8191;8240:2;8228:9;8219:7;8215:23;8211:32;8208:119;;;8246:79;;:::i;:::-;8208:119;8366:1;8391:53;8436:7;8427:6;8416:9;8412:22;8391:53;:::i;:::-;8381:63;;8337:117;8493:2;8519:53;8564:7;8555:6;8544:9;8540:22;8519:53;:::i;:::-;8509:63;;8464:118;8115:474;;;;;:::o;8595:117::-;8704:1;8701;8694:12;8718:307;8779:4;8869:18;8861:6;8858:30;8855:56;;;8891:18;;:::i;:::-;8855:56;8929:29;8951:6;8929:29;:::i;:::-;8921:37;;9013:4;9007;9003:15;8995:23;;8718:307;;;:::o;9031:154::-;9115:6;9110:3;9105;9092:30;9177:1;9168:6;9163:3;9159:16;9152:27;9031:154;;;:::o;9191:410::-;9268:5;9293:65;9309:48;9350:6;9309:48;:::i;:::-;9293:65;:::i;:::-;9284:74;;9381:6;9374:5;9367:21;9419:4;9412:5;9408:16;9457:3;9448:6;9443:3;9439:16;9436:25;9433:112;;;9464:79;;:::i;:::-;9433:112;9554:41;9588:6;9583:3;9578;9554:41;:::i;:::-;9274:327;9191:410;;;;;:::o;9620:338::-;9675:5;9724:3;9717:4;9709:6;9705:17;9701:27;9691:122;;9732:79;;:::i;:::-;9691:122;9849:6;9836:20;9874:78;9948:3;9940:6;9933:4;9925:6;9921:17;9874:78;:::i;:::-;9865:87;;9681:277;9620:338;;;;:::o;9964:1509::-;10118:6;10126;10134;10142;10150;10199:3;10187:9;10178:7;10174:23;10170:33;10167:120;;;10206:79;;:::i;:::-;10167:120;10326:1;10351:53;10396:7;10387:6;10376:9;10372:22;10351:53;:::i;:::-;10341:63;;10297:117;10453:2;10479:53;10524:7;10515:6;10504:9;10500:22;10479:53;:::i;:::-;10469:63;;10424:118;10609:2;10598:9;10594:18;10581:32;10640:18;10632:6;10629:30;10626:117;;;10662:79;;:::i;:::-;10626:117;10767:78;10837:7;10828:6;10817:9;10813:22;10767:78;:::i;:::-;10757:88;;10552:303;10922:2;10911:9;10907:18;10894:32;10953:18;10945:6;10942:30;10939:117;;;10975:79;;:::i;:::-;10939:117;11080:78;11150:7;11141:6;11130:9;11126:22;11080:78;:::i;:::-;11070:88;;10865:303;11235:3;11224:9;11220:19;11207:33;11267:18;11259:6;11256:30;11253:117;;;11289:79;;:::i;:::-;11253:117;11394:62;11448:7;11439:6;11428:9;11424:22;11394:62;:::i;:::-;11384:72;;11178:288;9964:1509;;;;;;;;:::o;11479:652::-;11556:6;11564;11613:2;11601:9;11592:7;11588:23;11584:32;11581:119;;;11619:79;;:::i;:::-;11581:119;11739:1;11764:53;11809:7;11800:6;11789:9;11785:22;11764:53;:::i;:::-;11754:63;;11710:117;11894:2;11883:9;11879:18;11866:32;11925:18;11917:6;11914:30;11911:117;;;11947:79;;:::i;:::-;11911:117;12052:62;12106:7;12097:6;12086:9;12082:22;12052:62;:::i;:::-;12042:72;;11837:287;11479:652;;;;;:::o;12137:311::-;12214:4;12304:18;12296:6;12293:30;12290:56;;;12326:18;;:::i;:::-;12290:56;12376:4;12368:6;12364:17;12356:25;;12436:4;12430;12426:15;12418:23;;12137:311;;;:::o;12471:710::-;12567:5;12592:81;12608:64;12665:6;12608:64;:::i;:::-;12592:81;:::i;:::-;12583:90;;12693:5;12722:6;12715:5;12708:21;12756:4;12749:5;12745:16;12738:23;;12809:4;12801:6;12797:17;12789:6;12785:30;12838:3;12830:6;12827:15;12824:122;;;12857:79;;:::i;:::-;12824:122;12972:6;12955:220;12989:6;12984:3;12981:15;12955:220;;;13064:3;13093:37;13126:3;13114:10;13093:37;:::i;:::-;13088:3;13081:50;13160:4;13155:3;13151:14;13144:21;;13031:144;13015:4;13010:3;13006:14;12999:21;;12955:220;;;12959:21;12573:608;;12471:710;;;;;:::o;13204:370::-;13275:5;13324:3;13317:4;13309:6;13305:17;13301:27;13291:122;;13332:79;;:::i;:::-;13291:122;13449:6;13436:20;13474:94;13564:3;13556:6;13549:4;13541:6;13537:17;13474:94;:::i;:::-;13465:103;;13281:293;13204:370;;;;:::o;13580:894::-;13698:6;13706;13755:2;13743:9;13734:7;13730:23;13726:32;13723:119;;;13761:79;;:::i;:::-;13723:119;13909:1;13898:9;13894:17;13881:31;13939:18;13931:6;13928:30;13925:117;;;13961:79;;:::i;:::-;13925:117;14066:78;14136:7;14127:6;14116:9;14112:22;14066:78;:::i;:::-;14056:88;;13852:302;14221:2;14210:9;14206:18;14193:32;14252:18;14244:6;14241:30;14238:117;;;14274:79;;:::i;:::-;14238:117;14379:78;14449:7;14440:6;14429:9;14425:22;14379:78;:::i;:::-;14369:88;;14164:303;13580:894;;;;;:::o;14480:114::-;14547:6;14581:5;14575:12;14565:22;;14480:114;;;:::o;14600:184::-;14699:11;14733:6;14728:3;14721:19;14773:4;14768:3;14764:14;14749:29;;14600:184;;;;:::o;14790:132::-;14857:4;14880:3;14872:11;;14910:4;14905:3;14901:14;14893:22;;14790:132;;;:::o;14928:108::-;15005:24;15023:5;15005:24;:::i;:::-;15000:3;14993:37;14928:108;;:::o;15042:179::-;15111:10;15132:46;15174:3;15166:6;15132:46;:::i;:::-;15210:4;15205:3;15201:14;15187:28;;15042:179;;;;:::o;15227:113::-;15297:4;15329;15324:3;15320:14;15312:22;;15227:113;;;:::o;15376:732::-;15495:3;15524:54;15572:5;15524:54;:::i;:::-;15594:86;15673:6;15668:3;15594:86;:::i;:::-;15587:93;;15704:56;15754:5;15704:56;:::i;:::-;15783:7;15814:1;15799:284;15824:6;15821:1;15818:13;15799:284;;;15900:6;15894:13;15927:63;15986:3;15971:13;15927:63;:::i;:::-;15920:70;;16013:60;16066:6;16013:60;:::i;:::-;16003:70;;15859:224;15846:1;15843;15839:9;15834:14;;15799:284;;;15803:14;16099:3;16092:10;;15500:608;;;15376:732;;;;:::o;16114:373::-;16257:4;16295:2;16284:9;16280:18;16272:26;;16344:9;16338:4;16334:20;16330:1;16319:9;16315:17;16308:47;16372:108;16475:4;16466:6;16372:108;:::i;:::-;16364:116;;16114:373;;;;:::o;16493:118::-;16580:24;16598:5;16580:24;:::i;:::-;16575:3;16568:37;16493:118;;:::o;16617:222::-;16710:4;16748:2;16737:9;16733:18;16725:26;;16761:71;16829:1;16818:9;16814:17;16805:6;16761:71;:::i;:::-;16617:222;;;;:::o;16845:308::-;16907:4;16997:18;16989:6;16986:30;16983:56;;;17019:18;;:::i;:::-;16983:56;17057:29;17079:6;17057:29;:::i;:::-;17049:37;;17141:4;17135;17131:15;17123:23;;16845:308;;;:::o;17159:412::-;17237:5;17262:66;17278:49;17320:6;17278:49;:::i;:::-;17262:66;:::i;:::-;17253:75;;17351:6;17344:5;17337:21;17389:4;17382:5;17378:16;17427:3;17418:6;17413:3;17409:16;17406:25;17403:112;;;17434:79;;:::i;:::-;17403:112;17524:41;17558:6;17553:3;17548;17524:41;:::i;:::-;17243:328;17159:412;;;;;:::o;17591:340::-;17647:5;17696:3;17689:4;17681:6;17677:17;17673:27;17663:122;;17704:79;;:::i;:::-;17663:122;17821:6;17808:20;17846:79;17921:3;17913:6;17906:4;17898:6;17894:17;17846:79;:::i;:::-;17837:88;;17653:278;17591:340;;;;:::o;17937:509::-;18006:6;18055:2;18043:9;18034:7;18030:23;18026:32;18023:119;;;18061:79;;:::i;:::-;18023:119;18209:1;18198:9;18194:17;18181:31;18239:18;18231:6;18228:30;18225:117;;;18261:79;;:::i;:::-;18225:117;18366:63;18421:7;18412:6;18401:9;18397:22;18366:63;:::i;:::-;18356:73;;18152:287;17937:509;;;;:::o;18452:116::-;18522:21;18537:5;18522:21;:::i;:::-;18515:5;18512:32;18502:60;;18558:1;18555;18548:12;18502:60;18452:116;:::o;18574:133::-;18617:5;18655:6;18642:20;18633:29;;18671:30;18695:5;18671:30;:::i;:::-;18574:133;;;;:::o;18713:468::-;18778:6;18786;18835:2;18823:9;18814:7;18810:23;18806:32;18803:119;;;18841:79;;:::i;:::-;18803:119;18961:1;18986:53;19031:7;19022:6;19011:9;19007:22;18986:53;:::i;:::-;18976:63;;18932:117;19088:2;19114:50;19156:7;19147:6;19136:9;19132:22;19114:50;:::i;:::-;19104:60;;19059:115;18713:468;;;;;:::o;19187:474::-;19255:6;19263;19312:2;19300:9;19291:7;19287:23;19283:32;19280:119;;;19318:79;;:::i;:::-;19280:119;19438:1;19463:53;19508:7;19499:6;19488:9;19484:22;19463:53;:::i;:::-;19453:63;;19409:117;19565:2;19591:53;19636:7;19627:6;19616:9;19612:22;19591:53;:::i;:::-;19581:63;;19536:118;19187:474;;;;;:::o;19667:1089::-;19771:6;19779;19787;19795;19803;19852:3;19840:9;19831:7;19827:23;19823:33;19820:120;;;19859:79;;:::i;:::-;19820:120;19979:1;20004:53;20049:7;20040:6;20029:9;20025:22;20004:53;:::i;:::-;19994:63;;19950:117;20106:2;20132:53;20177:7;20168:6;20157:9;20153:22;20132:53;:::i;:::-;20122:63;;20077:118;20234:2;20260:53;20305:7;20296:6;20285:9;20281:22;20260:53;:::i;:::-;20250:63;;20205:118;20362:2;20388:53;20433:7;20424:6;20413:9;20409:22;20388:53;:::i;:::-;20378:63;;20333:118;20518:3;20507:9;20503:19;20490:33;20550:18;20542:6;20539:30;20536:117;;;20572:79;;:::i;:::-;20536:117;20677:62;20731:7;20722:6;20711:9;20707:22;20677:62;:::i;:::-;20667:72;;20461:288;19667:1089;;;;;;;;:::o;20762:654::-;20840:6;20848;20897:2;20885:9;20876:7;20872:23;20868:32;20865:119;;;20903:79;;:::i;:::-;20865:119;21023:1;21048:53;21093:7;21084:6;21073:9;21069:22;21048:53;:::i;:::-;21038:63;;20994:117;21178:2;21167:9;21163:18;21150:32;21209:18;21201:6;21198:30;21195:117;;;21231:79;;:::i;:::-;21195:117;21336:63;21391:7;21382:6;21371:9;21367:22;21336:63;:::i;:::-;21326:73;;21121:288;20762:654;;;;;:::o;21422:230::-;21562:34;21558:1;21550:6;21546:14;21539:58;21631:13;21626:2;21618:6;21614:15;21607:38;21422:230;:::o;21658:366::-;21800:3;21821:67;21885:2;21880:3;21821:67;:::i;:::-;21814:74;;21897:93;21986:3;21897:93;:::i;:::-;22015:2;22010:3;22006:12;21999:19;;21658:366;;;:::o;22030:419::-;22196:4;22234:2;22223:9;22219:18;22211:26;;22283:9;22277:4;22273:20;22269:1;22258:9;22254:17;22247:47;22311:131;22437:4;22311:131;:::i;:::-;22303:139;;22030:419;;;:::o;22455:181::-;22595:33;22591:1;22583:6;22579:14;22572:57;22455:181;:::o;22642:366::-;22784:3;22805:67;22869:2;22864:3;22805:67;:::i;:::-;22798:74;;22881:93;22970:3;22881:93;:::i;:::-;22999:2;22994:3;22990:12;22983:19;;22642:366;;;:::o;23014:419::-;23180:4;23218:2;23207:9;23203:18;23195:26;;23267:9;23261:4;23257:20;23253:1;23242:9;23238:17;23231:47;23295:131;23421:4;23295:131;:::i;:::-;23287:139;;23014:419;;;:::o;23439:180::-;23487:77;23484:1;23477:88;23584:4;23581:1;23574:15;23608:4;23605:1;23598:15;23625:320;23669:6;23706:1;23700:4;23696:12;23686:22;;23753:1;23747:4;23743:12;23774:18;23764:81;;23830:4;23822:6;23818:17;23808:27;;23764:81;23892:2;23884:6;23881:14;23861:18;23858:38;23855:84;;;23911:18;;:::i;:::-;23855:84;23676:269;23625:320;;;:::o;23951:148::-;24053:11;24090:3;24075:18;;23951:148;;;;:::o;24105:141::-;24154:4;24177:3;24169:11;;24200:3;24197:1;24190:14;24234:4;24231:1;24221:18;24213:26;;24105:141;;;:::o;24276:845::-;24379:3;24416:5;24410:12;24445:36;24471:9;24445:36;:::i;:::-;24497:89;24579:6;24574:3;24497:89;:::i;:::-;24490:96;;24617:1;24606:9;24602:17;24633:1;24628:137;;;;24779:1;24774:341;;;;24595:520;;24628:137;24712:4;24708:9;24697;24693:25;24688:3;24681:38;24748:6;24743:3;24739:16;24732:23;;24628:137;;24774:341;24841:38;24873:5;24841:38;:::i;:::-;24901:1;24915:154;24929:6;24926:1;24923:13;24915:154;;;25003:7;24997:14;24993:1;24988:3;24984:11;24977:35;25053:1;25044:7;25040:15;25029:26;;24951:4;24948:1;24944:12;24939:17;;24915:154;;;25098:6;25093:3;25089:16;25082:23;;24781:334;;24595:520;;24383:738;;24276:845;;;;:::o;25127:377::-;25233:3;25261:39;25294:5;25261:39;:::i;:::-;25316:89;25398:6;25393:3;25316:89;:::i;:::-;25309:96;;25414:52;25459:6;25454:3;25447:4;25440:5;25436:16;25414:52;:::i;:::-;25491:6;25486:3;25482:16;25475:23;;25237:267;25127:377;;;;:::o;25510:429::-;25687:3;25709:92;25797:3;25788:6;25709:92;:::i;:::-;25702:99;;25818:95;25909:3;25900:6;25818:95;:::i;:::-;25811:102;;25930:3;25923:10;;25510:429;;;;;:::o;25945:182::-;26085:34;26081:1;26073:6;26069:14;26062:58;25945:182;:::o;26133:366::-;26275:3;26296:67;26360:2;26355:3;26296:67;:::i;:::-;26289:74;;26372:93;26461:3;26372:93;:::i;:::-;26490:2;26485:3;26481:12;26474:19;;26133:366;;;:::o;26505:419::-;26671:4;26709:2;26698:9;26694:18;26686:26;;26758:9;26752:4;26748:20;26744:1;26733:9;26729:17;26722:47;26786:131;26912:4;26786:131;:::i;:::-;26778:139;;26505:419;;;:::o;26930:180::-;26978:77;26975:1;26968:88;27075:4;27072:1;27065:15;27099:4;27096:1;27089:15;27116:159;27256:11;27252:1;27244:6;27240:14;27233:35;27116:159;:::o;27281:365::-;27423:3;27444:66;27508:1;27503:3;27444:66;:::i;:::-;27437:73;;27519:93;27608:3;27519:93;:::i;:::-;27637:2;27632:3;27628:12;27621:19;;27281:365;;;:::o;27652:419::-;27818:4;27856:2;27845:9;27841:18;27833:26;;27905:9;27899:4;27895:20;27891:1;27880:9;27876:17;27869:47;27933:131;28059:4;27933:131;:::i;:::-;27925:139;;27652:419;;;:::o;28077:180::-;28125:77;28122:1;28115:88;28222:4;28219:1;28212:15;28246:4;28243:1;28236:15;28263:233;28302:3;28325:24;28343:5;28325:24;:::i;:::-;28316:33;;28371:66;28364:5;28361:77;28358:103;;;28441:18;;:::i;:::-;28358:103;28488:1;28481:5;28477:13;28470:20;;28263:233;;;:::o;28502:170::-;28642:22;28638:1;28630:6;28626:14;28619:46;28502:170;:::o;28678:366::-;28820:3;28841:67;28905:2;28900:3;28841:67;:::i;:::-;28834:74;;28917:93;29006:3;28917:93;:::i;:::-;29035:2;29030:3;29026:12;29019:19;;28678:366;;;:::o;29050:419::-;29216:4;29254:2;29243:9;29239:18;29231:26;;29303:9;29297:4;29293:20;29289:1;29278:9;29274:17;29267:47;29331:131;29457:4;29331:131;:::i;:::-;29323:139;;29050:419;;;:::o;29475:237::-;29615:34;29611:1;29603:6;29599:14;29592:58;29684:20;29679:2;29671:6;29667:15;29660:45;29475:237;:::o;29718:366::-;29860:3;29881:67;29945:2;29940:3;29881:67;:::i;:::-;29874:74;;29957:93;30046:3;29957:93;:::i;:::-;30075:2;30070:3;30066:12;30059:19;;29718:366;;;:::o;30090:419::-;30256:4;30294:2;30283:9;30279:18;30271:26;;30343:9;30337:4;30333:20;30329:1;30318:9;30314:17;30307:47;30371:131;30497:4;30371:131;:::i;:::-;30363:139;;30090:419;;;:::o;30515:156::-;30655:8;30651:1;30643:6;30639:14;30632:32;30515:156;:::o;30677:365::-;30819:3;30840:66;30904:1;30899:3;30840:66;:::i;:::-;30833:73;;30915:93;31004:3;30915:93;:::i;:::-;31033:2;31028:3;31024:12;31017:19;;30677:365;;;:::o;31048:419::-;31214:4;31252:2;31241:9;31237:18;31229:26;;31301:9;31295:4;31291:20;31287:1;31276:9;31272:17;31265:47;31329:131;31455:4;31329:131;:::i;:::-;31321:139;;31048:419;;;:::o;31473:165::-;31613:17;31609:1;31601:6;31597:14;31590:41;31473:165;:::o;31644:366::-;31786:3;31807:67;31871:2;31866:3;31807:67;:::i;:::-;31800:74;;31883:93;31972:3;31883:93;:::i;:::-;32001:2;31996:3;31992:12;31985:19;;31644:366;;;:::o;32016:419::-;32182:4;32220:2;32209:9;32205:18;32197:26;;32269:9;32263:4;32259:20;32255:1;32244:9;32240:17;32233:47;32297:131;32423:4;32297:131;:::i;:::-;32289:139;;32016:419;;;:::o;32441:305::-;32481:3;32500:20;32518:1;32500:20;:::i;:::-;32495:25;;32534:20;32552:1;32534:20;:::i;:::-;32529:25;;32688:1;32620:66;32616:74;32613:1;32610:81;32607:107;;;32694:18;;:::i;:::-;32607:107;32738:1;32735;32731:9;32724:16;;32441:305;;;;:::o;32752:161::-;32892:13;32888:1;32880:6;32876:14;32869:37;32752:161;:::o;32919:366::-;33061:3;33082:67;33146:2;33141:3;33082:67;:::i;:::-;33075:74;;33158:93;33247:3;33158:93;:::i;:::-;33276:2;33271:3;33267:12;33260:19;;32919:366;;;:::o;33291:419::-;33457:4;33495:2;33484:9;33480:18;33472:26;;33544:9;33538:4;33534:20;33530:1;33519:9;33515:17;33508:47;33572:131;33698:4;33572:131;:::i;:::-;33564:139;;33291:419;;;:::o;33716:161::-;33856:13;33852:1;33844:6;33840:14;33833:37;33716:161;:::o;33883:366::-;34025:3;34046:67;34110:2;34105:3;34046:67;:::i;:::-;34039:74;;34122:93;34211:3;34122:93;:::i;:::-;34240:2;34235:3;34231:12;34224:19;;33883:366;;;:::o;34255:419::-;34421:4;34459:2;34448:9;34444:18;34436:26;;34508:9;34502:4;34498:20;34494:1;34483:9;34479:17;34472:47;34536:131;34662:4;34536:131;:::i;:::-;34528:139;;34255:419;;;:::o;34680:348::-;34720:7;34743:20;34761:1;34743:20;:::i;:::-;34738:25;;34777:20;34795:1;34777:20;:::i;:::-;34772:25;;34965:1;34897:66;34893:74;34890:1;34887:81;34882:1;34875:9;34868:17;34864:105;34861:131;;;34972:18;;:::i;:::-;34861:131;35020:1;35017;35013:9;35002:20;;34680:348;;;;:::o;35034:165::-;35174:17;35170:1;35162:6;35158:14;35151:41;35034:165;:::o;35205:366::-;35347:3;35368:67;35432:2;35427:3;35368:67;:::i;:::-;35361:74;;35444:93;35533:3;35444:93;:::i;:::-;35562:2;35557:3;35553:12;35546:19;;35205:366;;;:::o;35577:419::-;35743:4;35781:2;35770:9;35766:18;35758:26;;35830:9;35824:4;35820:20;35816:1;35805:9;35801:17;35794:47;35858:131;35984:4;35858:131;:::i;:::-;35850:139;;35577:419;;;:::o;36002:228::-;36142:34;36138:1;36130:6;36126:14;36119:58;36211:11;36206:2;36198:6;36194:15;36187:36;36002:228;:::o;36236:366::-;36378:3;36399:67;36463:2;36458:3;36399:67;:::i;:::-;36392:74;;36475:93;36564:3;36475:93;:::i;:::-;36593:2;36588:3;36584:12;36577:19;;36236:366;;;:::o;36608:419::-;36774:4;36812:2;36801:9;36797:18;36789:26;;36861:9;36855:4;36851:20;36847:1;36836:9;36832:17;36825:47;36889:131;37015:4;36889:131;:::i;:::-;36881:139;;36608:419;;;:::o;37033:166::-;37173:18;37169:1;37161:6;37157:14;37150:42;37033:166;:::o;37205:366::-;37347:3;37368:67;37432:2;37427:3;37368:67;:::i;:::-;37361:74;;37444:93;37533:3;37444:93;:::i;:::-;37562:2;37557:3;37553:12;37546:19;;37205:366;;;:::o;37577:419::-;37743:4;37781:2;37770:9;37766:18;37758:26;;37830:9;37824:4;37820:20;37816:1;37805:9;37801:17;37794:47;37858:131;37984:4;37858:131;:::i;:::-;37850:139;;37577:419;;;:::o;38002:228::-;38142:34;38138:1;38130:6;38126:14;38119:58;38211:11;38206:2;38198:6;38194:15;38187:36;38002:228;:::o;38236:366::-;38378:3;38399:67;38463:2;38458:3;38399:67;:::i;:::-;38392:74;;38475:93;38564:3;38475:93;:::i;:::-;38593:2;38588:3;38584:12;38577:19;;38236:366;;;:::o;38608:419::-;38774:4;38812:2;38801:9;38797:18;38789:26;;38861:9;38855:4;38851:20;38847:1;38836:9;38832:17;38825:47;38889:131;39015:4;38889:131;:::i;:::-;38881:139;;38608:419;;;:::o;39033:228::-;39173:34;39169:1;39161:6;39157:14;39150:58;39242:11;39237:2;39229:6;39225:15;39218:36;39033:228;:::o;39267:366::-;39409:3;39430:67;39494:2;39489:3;39430:67;:::i;:::-;39423:74;;39506:93;39595:3;39506:93;:::i;:::-;39624:2;39619:3;39615:12;39608:19;;39267:366;;;:::o;39639:419::-;39805:4;39843:2;39832:9;39828:18;39820:26;;39892:9;39886:4;39882:20;39878:1;39867:9;39863:17;39856:47;39920:131;40046:4;39920:131;:::i;:::-;39912:139;;39639:419;;;:::o;40064:225::-;40204:34;40200:1;40192:6;40188:14;40181:58;40273:8;40268:2;40260:6;40256:15;40249:33;40064:225;:::o;40295:366::-;40437:3;40458:67;40522:2;40517:3;40458:67;:::i;:::-;40451:74;;40534:93;40623:3;40534:93;:::i;:::-;40652:2;40647:3;40643:12;40636:19;;40295:366;;;:::o;40667:419::-;40833:4;40871:2;40860:9;40856:18;40848:26;;40920:9;40914:4;40910:20;40906:1;40895:9;40891:17;40884:47;40948:131;41074:4;40948:131;:::i;:::-;40940:139;;40667:419;;;:::o;41092:172::-;41232:24;41228:1;41220:6;41216:14;41209:48;41092:172;:::o;41270:366::-;41412:3;41433:67;41497:2;41492:3;41433:67;:::i;:::-;41426:74;;41509:93;41598:3;41509:93;:::i;:::-;41627:2;41622:3;41618:12;41611:19;;41270:366;;;:::o;41642:419::-;41808:4;41846:2;41835:9;41831:18;41823:26;;41895:9;41889:4;41885:20;41881:1;41870:9;41866:17;41859:47;41923:131;42049:4;41923:131;:::i;:::-;41915:139;;41642:419;;;:::o;42067:163::-;42207:15;42203:1;42195:6;42191:14;42184:39;42067:163;:::o;42236:366::-;42378:3;42399:67;42463:2;42458:3;42399:67;:::i;:::-;42392:74;;42475:93;42564:3;42475:93;:::i;:::-;42593:2;42588:3;42584:12;42577:19;;42236:366;;;:::o;42608:419::-;42774:4;42812:2;42801:9;42797:18;42789:26;;42861:9;42855:4;42851:20;42847:1;42836:9;42832:17;42825:47;42889:131;43015:4;42889:131;:::i;:::-;42881:139;;42608:419;;;:::o;43033:180::-;43081:77;43078:1;43071:88;43178:4;43175:1;43168:15;43202:4;43199:1;43192:15;43219:185;43259:1;43276:20;43294:1;43276:20;:::i;:::-;43271:25;;43310:20;43328:1;43310:20;:::i;:::-;43305:25;;43349:1;43339:35;;43354:18;;:::i;:::-;43339:35;43396:1;43393;43389:9;43384:14;;43219:185;;;;:::o;43410:191::-;43450:4;43470:20;43488:1;43470:20;:::i;:::-;43465:25;;43504:20;43522:1;43504:20;:::i;:::-;43499:25;;43543:1;43540;43537:8;43534:34;;;43548:18;;:::i;:::-;43534:34;43593:1;43590;43586:9;43578:17;;43410:191;;;;:::o;43607:176::-;43639:1;43656:20;43674:1;43656:20;:::i;:::-;43651:25;;43690:20;43708:1;43690:20;:::i;:::-;43685:25;;43729:1;43719:35;;43734:18;;:::i;:::-;43719:35;43775:1;43772;43768:9;43763:14;;43607:176;;;;:::o;43789:220::-;43929:34;43925:1;43917:6;43913:14;43906:58;43998:3;43993:2;43985:6;43981:15;43974:28;43789:220;:::o;44015:366::-;44157:3;44178:67;44242:2;44237:3;44178:67;:::i;:::-;44171:74;;44254:93;44343:3;44254:93;:::i;:::-;44372:2;44367:3;44363:12;44356:19;;44015:366;;;:::o;44387:419::-;44553:4;44591:2;44580:9;44576:18;44568:26;;44640:9;44634:4;44630:20;44626:1;44615:9;44611:17;44604:47;44668:131;44794:4;44668:131;:::i;:::-;44660:139;;44387:419;;;:::o;44812:634::-;45033:4;45071:2;45060:9;45056:18;45048:26;;45120:9;45114:4;45110:20;45106:1;45095:9;45091:17;45084:47;45148:108;45251:4;45242:6;45148:108;:::i;:::-;45140:116;;45303:9;45297:4;45293:20;45288:2;45277:9;45273:18;45266:48;45331:108;45434:4;45425:6;45331:108;:::i;:::-;45323:116;;44812:634;;;;;:::o;45452:227::-;45592:34;45588:1;45580:6;45576:14;45569:58;45661:10;45656:2;45648:6;45644:15;45637:35;45452:227;:::o;45685:366::-;45827:3;45848:67;45912:2;45907:3;45848:67;:::i;:::-;45841:74;;45924:93;46013:3;45924:93;:::i;:::-;46042:2;46037:3;46033:12;46026:19;;45685:366;;;:::o;46057:419::-;46223:4;46261:2;46250:9;46246:18;46238:26;;46310:9;46304:4;46300:20;46296:1;46285:9;46281:17;46274:47;46338:131;46464:4;46338:131;:::i;:::-;46330:139;;46057:419;;;:::o;46482:224::-;46622:34;46618:1;46610:6;46606:14;46599:58;46691:7;46686:2;46678:6;46674:15;46667:32;46482:224;:::o;46712:366::-;46854:3;46875:67;46939:2;46934:3;46875:67;:::i;:::-;46868:74;;46951:93;47040:3;46951:93;:::i;:::-;47069:2;47064:3;47060:12;47053:19;;46712:366;;;:::o;47084:419::-;47250:4;47288:2;47277:9;47273:18;47265:26;;47337:9;47331:4;47327:20;47323:1;47312:9;47308:17;47301:47;47365:131;47491:4;47365:131;:::i;:::-;47357:139;;47084:419;;;:::o;47509:229::-;47649:34;47645:1;47637:6;47633:14;47626:58;47718:12;47713:2;47705:6;47701:15;47694:37;47509:229;:::o;47744:366::-;47886:3;47907:67;47971:2;47966:3;47907:67;:::i;:::-;47900:74;;47983:93;48072:3;47983:93;:::i;:::-;48101:2;48096:3;48092:12;48085:19;;47744:366;;;:::o;48116:419::-;48282:4;48320:2;48309:9;48305:18;48297:26;;48369:9;48363:4;48359:20;48355:1;48344:9;48340:17;48333:47;48397:131;48523:4;48397:131;:::i;:::-;48389:139;;48116:419;;;:::o;48541:94::-;48574:8;48622:5;48618:2;48614:14;48593:35;;48541:94;;;:::o;48641:::-;48680:7;48709:20;48723:5;48709:20;:::i;:::-;48698:31;;48641:94;;;:::o;48741:100::-;48780:7;48809:26;48829:5;48809:26;:::i;:::-;48798:37;;48741:100;;;:::o;48847:157::-;48952:45;48972:24;48990:5;48972:24;:::i;:::-;48952:45;:::i;:::-;48947:3;48940:58;48847:157;;:::o;49010:256::-;49122:3;49137:75;49208:3;49199:6;49137:75;:::i;:::-;49237:2;49232:3;49228:12;49221:19;;49257:3;49250:10;;49010:256;;;;:::o;49272:85::-;49317:7;49346:5;49335:16;;49272:85;;;:::o;49363:60::-;49391:3;49412:5;49405:12;;49363:60;;;:::o;49429:158::-;49487:9;49520:61;49538:42;49547:32;49573:5;49547:32;:::i;:::-;49538:42;:::i;:::-;49520:61;:::i;:::-;49507:74;;49429:158;;;:::o;49593:147::-;49688:45;49727:5;49688:45;:::i;:::-;49683:3;49676:58;49593:147;;:::o;49746:348::-;49875:4;49913:2;49902:9;49898:18;49890:26;;49926:71;49994:1;49983:9;49979:17;49970:6;49926:71;:::i;:::-;50007:80;50083:2;50072:9;50068:18;50059:6;50007:80;:::i;:::-;49746:348;;;;;:::o;50100:222::-;50240:34;50236:1;50228:6;50224:14;50217:58;50309:5;50304:2;50296:6;50292:15;50285:30;50100:222;:::o;50328:366::-;50470:3;50491:67;50555:2;50550:3;50491:67;:::i;:::-;50484:74;;50567:93;50656:3;50567:93;:::i;:::-;50685:2;50680:3;50676:12;50669:19;;50328:366;;;:::o;50700:419::-;50866:4;50904:2;50893:9;50889:18;50881:26;;50953:9;50947:4;50943:20;50939:1;50928:9;50924:17;50917:47;50981:131;51107:4;50981:131;:::i;:::-;50973:139;;50700:419;;;:::o;51125:223::-;51265:34;51261:1;51253:6;51249:14;51242:58;51334:6;51329:2;51321:6;51317:15;51310:31;51125:223;:::o;51354:366::-;51496:3;51517:67;51581:2;51576:3;51517:67;:::i;:::-;51510:74;;51593:93;51682:3;51593:93;:::i;:::-;51711:2;51706:3;51702:12;51695:19;;51354:366;;;:::o;51726:419::-;51892:4;51930:2;51919:9;51915:18;51907:26;;51979:9;51973:4;51969:20;51965:1;51954:9;51950:17;51943:47;52007:131;52133:4;52007:131;:::i;:::-;51999:139;;51726:419;;;:::o;52151:332::-;52272:4;52310:2;52299:9;52295:18;52287:26;;52323:71;52391:1;52380:9;52376:17;52367:6;52323:71;:::i;:::-;52404:72;52472:2;52461:9;52457:18;52448:6;52404:72;:::i;:::-;52151:332;;;;;:::o;52489:98::-;52540:6;52574:5;52568:12;52558:22;;52489:98;;;:::o;52593:168::-;52676:11;52710:6;52705:3;52698:19;52750:4;52745:3;52741:14;52726:29;;52593:168;;;;:::o;52767:360::-;52853:3;52881:38;52913:5;52881:38;:::i;:::-;52935:70;52998:6;52993:3;52935:70;:::i;:::-;52928:77;;53014:52;53059:6;53054:3;53047:4;53040:5;53036:16;53014:52;:::i;:::-;53091:29;53113:6;53091:29;:::i;:::-;53086:3;53082:39;53075:46;;52857:270;52767:360;;;;:::o;53133:1053::-;53456:4;53494:3;53483:9;53479:19;53471:27;;53508:71;53576:1;53565:9;53561:17;53552:6;53508:71;:::i;:::-;53589:72;53657:2;53646:9;53642:18;53633:6;53589:72;:::i;:::-;53708:9;53702:4;53698:20;53693:2;53682:9;53678:18;53671:48;53736:108;53839:4;53830:6;53736:108;:::i;:::-;53728:116;;53891:9;53885:4;53881:20;53876:2;53865:9;53861:18;53854:48;53919:108;54022:4;54013:6;53919:108;:::i;:::-;53911:116;;54075:9;54069:4;54065:20;54059:3;54048:9;54044:19;54037:49;54103:76;54174:4;54165:6;54103:76;:::i;:::-;54095:84;;53133:1053;;;;;;;;:::o;54192:141::-;54248:5;54279:6;54273:13;54264:22;;54295:32;54321:5;54295:32;:::i;:::-;54192:141;;;;:::o;54339:349::-;54408:6;54457:2;54445:9;54436:7;54432:23;54428:32;54425:119;;;54463:79;;:::i;:::-;54425:119;54583:1;54608:63;54663:7;54654:6;54643:9;54639:22;54608:63;:::i;:::-;54598:73;;54554:127;54339:349;;;;:::o;54694:106::-;54738:8;54787:5;54782:3;54778:15;54757:36;;54694:106;;;:::o;54806:183::-;54841:3;54879:1;54861:16;54858:23;54855:128;;;54917:1;54914;54911;54896:23;54939:34;54970:1;54964:8;54939:34;:::i;:::-;54932:41;;54855:128;54806:183;:::o;54995:711::-;55034:3;55072:4;55054:16;55051:26;55048:39;;;55080:5;;55048:39;55109:20;;:::i;:::-;55184:1;55166:16;55162:24;55159:1;55153:4;55138:49;55217:4;55211:11;55316:16;55309:4;55301:6;55297:17;55294:39;55261:18;55253:6;55250:30;55234:113;55231:146;;;55362:5;;;;55231:146;55408:6;55402:4;55398:17;55444:3;55438:10;55471:18;55463:6;55460:30;55457:43;;;55493:5;;;;;;55457:43;55541:6;55534:4;55529:3;55525:14;55521:27;55600:1;55582:16;55578:24;55572:4;55568:35;55563:3;55560:44;55557:57;;;55607:5;;;;;;;55557:57;55624;55672:6;55666:4;55662:17;55654:6;55650:30;55644:4;55624:57;:::i;:::-;55697:3;55690:10;;55038:668;;;;;54995:711;;:::o;55712:239::-;55852:34;55848:1;55840:6;55836:14;55829:58;55921:22;55916:2;55908:6;55904:15;55897:47;55712:239;:::o;55957:366::-;56099:3;56120:67;56184:2;56179:3;56120:67;:::i;:::-;56113:74;;56196:93;56285:3;56196:93;:::i;:::-;56314:2;56309:3;56305:12;56298:19;;55957:366;;;:::o;56329:419::-;56495:4;56533:2;56522:9;56518:18;56510:26;;56582:9;56576:4;56572:20;56568:1;56557:9;56553:17;56546:47;56610:131;56736:4;56610:131;:::i;:::-;56602:139;;56329:419;;;:::o;56754:227::-;56894:34;56890:1;56882:6;56878:14;56871:58;56963:10;56958:2;56950:6;56946:15;56939:35;56754:227;:::o;56987:366::-;57129:3;57150:67;57214:2;57209:3;57150:67;:::i;:::-;57143:74;;57226:93;57315:3;57226:93;:::i;:::-;57344:2;57339:3;57335:12;57328:19;;56987:366;;;:::o;57359:419::-;57525:4;57563:2;57552:9;57548:18;57540:26;;57612:9;57606:4;57602:20;57598:1;57587:9;57583:17;57576:47;57640:131;57766:4;57640:131;:::i;:::-;57632:139;;57359:419;;;:::o;57784:214::-;57924:66;57920:1;57912:6;57908:14;57901:90;57784:214;:::o;58004:402::-;58164:3;58185:85;58267:2;58262:3;58185:85;:::i;:::-;58178:92;;58279:93;58368:3;58279:93;:::i;:::-;58397:2;58392:3;58388:12;58381:19;;58004:402;;;:::o;58412:77::-;58449:7;58478:5;58467:16;;58412:77;;;:::o;58495:79::-;58534:7;58563:5;58552:16;;58495:79;;;:::o;58580:157::-;58685:45;58705:24;58723:5;58705:24;:::i;:::-;58685:45;:::i;:::-;58680:3;58673:58;58580:157;;:::o;58743:522::-;58956:3;58978:148;59122:3;58978:148;:::i;:::-;58971:155;;59136:75;59207:3;59198:6;59136:75;:::i;:::-;59236:2;59231:3;59227:12;59220:19;;59256:3;59249:10;;58743:522;;;;:::o;59271:751::-;59494:4;59532:3;59521:9;59517:19;59509:27;;59546:71;59614:1;59603:9;59599:17;59590:6;59546:71;:::i;:::-;59627:72;59695:2;59684:9;59680:18;59671:6;59627:72;:::i;:::-;59709;59777:2;59766:9;59762:18;59753:6;59709:72;:::i;:::-;59791;59859:2;59848:9;59844:18;59835:6;59791:72;:::i;:::-;59911:9;59905:4;59901:20;59895:3;59884:9;59880:19;59873:49;59939:76;60010:4;60001:6;59939:76;:::i;:::-;59931:84;;59271:751;;;;;;;;:::o;60028:180::-;60076:77;60073:1;60066:88;60173:4;60170:1;60163:15;60197:4;60194:1;60187:15;60214:174;60354:26;60350:1;60342:6;60338:14;60331:50;60214:174;:::o;60394:366::-;60536:3;60557:67;60621:2;60616:3;60557:67;:::i;:::-;60550:74;;60633:93;60722:3;60633:93;:::i;:::-;60751:2;60746:3;60742:12;60735:19;;60394:366;;;:::o;60766:419::-;60932:4;60970:2;60959:9;60955:18;60947:26;;61019:9;61013:4;61009:20;61005:1;60994:9;60990:17;60983:47;61047:131;61173:4;61047:131;:::i;:::-;61039:139;;60766:419;;;:::o;61191:181::-;61331:33;61327:1;61319:6;61315:14;61308:57;61191:181;:::o;61378:366::-;61520:3;61541:67;61605:2;61600:3;61541:67;:::i;:::-;61534:74;;61617:93;61706:3;61617:93;:::i;:::-;61735:2;61730:3;61726:12;61719:19;;61378:366;;;:::o;61750:419::-;61916:4;61954:2;61943:9;61939:18;61931:26;;62003:9;61997:4;61993:20;61989:1;61978:9;61974:17;61967:47;62031:131;62157:4;62031:131;:::i;:::-;62023:139;;61750:419;;;:::o;62175:221::-;62315:34;62311:1;62303:6;62299:14;62292:58;62384:4;62379:2;62371:6;62367:15;62360:29;62175:221;:::o;62402:366::-;62544:3;62565:67;62629:2;62624:3;62565:67;:::i;:::-;62558:74;;62641:93;62730:3;62641:93;:::i;:::-;62759:2;62754:3;62750:12;62743:19;;62402:366;;;:::o;62774:419::-;62940:4;62978:2;62967:9;62963:18;62955:26;;63027:9;63021:4;63017:20;63013:1;63002:9;62998:17;62991:47;63055:131;63181:4;63055:131;:::i;:::-;63047:139;;62774:419;;;:::o;63199:221::-;63339:34;63335:1;63327:6;63323:14;63316:58;63408:4;63403:2;63395:6;63391:15;63384:29;63199:221;:::o;63426:366::-;63568:3;63589:67;63653:2;63648:3;63589:67;:::i;:::-;63582:74;;63665:93;63754:3;63665:93;:::i;:::-;63783:2;63778:3;63774:12;63767:19;;63426:366;;;:::o;63798:419::-;63964:4;64002:2;63991:9;63987:18;63979:26;;64051:9;64045:4;64041:20;64037:1;64026:9;64022:17;64015:47;64079:131;64205:4;64079:131;:::i;:::-;64071:139;;63798:419;;;:::o;64223:118::-;64310:24;64328:5;64310:24;:::i;:::-;64305:3;64298:37;64223:118;;:::o;64347:86::-;64382:7;64422:4;64415:5;64411:16;64400:27;;64347:86;;;:::o;64439:112::-;64522:22;64538:5;64522:22;:::i;:::-;64517:3;64510:35;64439:112;;:::o;64557:545::-;64730:4;64768:3;64757:9;64753:19;64745:27;;64782:71;64850:1;64839:9;64835:17;64826:6;64782:71;:::i;:::-;64863:68;64927:2;64916:9;64912:18;64903:6;64863:68;:::i;:::-;64941:72;65009:2;64998:9;64994:18;64985:6;64941:72;:::i;:::-;65023;65091:2;65080:9;65076:18;65067:6;65023:72;:::i;:::-;64557:545;;;;;;;:::o

Swarm Source

ipfs://2fb542fa39a93fb102c3e7fc3c0794f802521ac206485aa80238cbda29b6c8d3
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.