ETH Price: $3,405.11 (+2.81%)
Gas: 8.3 Gwei

TheWickedStallions (TWS)
 

Overview

TokenID

959

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
WickedStallions

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

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/ERC721/IERC721.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

// File: @openzeppelin/contracts/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;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

}

// 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/token/ERC721/ERC721.sol

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/WickedStallions.sol

pragma solidity ^0.8.0;

abstract contract TWC {
  function ownerOf(uint256 tokenId) public virtual view returns (address);
  function tokenOfOwnerByIndex(address owner, uint256 index) public virtual view returns (uint256);
  function balanceOf(address owner) external virtual view returns (uint256 balance);
}

contract WickedStallions is ERC721Enumerable, Ownable {  
  
  TWC private twc = TWC(0x85f740958906b317de6ed79663012859067E745B); 
  string public WickedStallionsProvenance;
  bool public saleIsActive = false;
  uint256 public maxStallions = 10762;
  string private baseURI;

  constructor() ERC721("TheWickedStallions", "TWS") {
  }

  function setProvenanceHash(string memory provenanceHash) public onlyOwner {
    WickedStallionsProvenance = provenanceHash;
  }

  function isMinted(uint256 tokenId) external view returns (bool) {
    require(tokenId < maxStallions, "tokenId outside collection bounds");
    return _exists(tokenId);
  }

  function _baseURI() internal view override returns (string memory) {
    return baseURI;
  }
  
  function setBaseURI(string memory uri) public onlyOwner {
    baseURI = uri;
  }

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

  function mintStallions(uint256 startingIndex, uint256 totalStallionsToMint) public {
    require(saleIsActive, "Sale must be active to mint a Stallion");
    require(totalStallionsToMint > 0, "Must mint at least one Stallion");
    uint balance = twc.balanceOf(msg.sender);
    require(balance > 0, "Must hold at least one Cranium to mint a Stallion");
    require(balance >= totalStallionsToMint, "Must hold at least as many Craniums as the number of Stallions you intend to mint");
    require(balance >= startingIndex + totalStallionsToMint, "Must hold at least as many Craniums as the number of Stallions you intend to mint");

    for(uint i = 0; i < balance && i < totalStallionsToMint; i++) {
      require(totalSupply() < maxStallions, "Cannot exceed max supply of Stallions");
      uint tokenId = twc.tokenOfOwnerByIndex(msg.sender, i + startingIndex);
      if (!_exists(tokenId)) {
        _safeMint(msg.sender, tokenId);
      }
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"WickedStallionsProvenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxStallions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startingIndex","type":"uint256"},{"internalType":"uint256","name":"totalStallionsToMint","type":"uint256"}],"name":"mintStallions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527385f740958906b317de6ed79663012859067e745b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60006101000a81548160ff021916908315150217905550612a0a600e553480156200008757600080fd5b506040518060400160405280601281526020017f5468655769636b65645374616c6c696f6e7300000000000000000000000000008152506040518060400160405280600381526020017f545753000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200010c929190620001e7565b50806001908051906020019062000125929190620001e7565b50505060006200013a620001df60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002fc565b600033905090565b828054620001f59062000297565b90600052602060002090601f01602090048101928262000219576000855562000265565b82601f106200023457805160ff191683800117855562000265565b8280016001018555821562000265579182015b828111156200026457825182559160200191906001019062000247565b5b50905062000274919062000278565b5090565b5b808211156200029357600081600090555060010162000279565b5090565b60006002820490506001821680620002b057607f821691505b60208210811415620002c757620002c6620002cd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614108806200030c6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806355f804b3116100f9578063b88d4fde11610097578063eb8d244411610071578063eb8d2444146104cc578063f2fde38b146104ea578063fe8abb7414610506578063ff30487414610524576101a9565b8063b88d4fde14610450578063c87b56dd1461046c578063e985e9c51461049c576101a9565b8063715018a6116100d3578063715018a6146103ee5780638da5cb5b146103f857806395d89b4114610416578063a22cb46514610434576101a9565b806355f804b3146103725780636352211e1461038e57806370a08231146103be576101a9565b806323b872dd1161016657806334918dfd1161014057806334918dfd146102fe57806342842e0e146103085780634f6ccce7146103245780635134442a14610354576101a9565b806323b872dd146102825780632f745c591461029e57806333c41a90146102ce576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c578063109695231461024857806318160ddd14610264575b600080fd5b6101c860048036038101906101c39190612c7c565b610540565b6040516101d59190613269565b60405180910390f35b6101e66105ba565b6040516101f39190613284565b60405180910390f35b61021660048036038101906102119190612d0f565b61064c565b60405161022391906131d9565b60405180910390f35b61024660048036038101906102419190612c40565b6106d1565b005b610262600480360381019061025d9190612cce565b6107e9565b005b61026c61087f565b60405161027991906135a6565b60405180910390f35b61029c60048036038101906102979190612b3a565b61088c565b005b6102b860048036038101906102b39190612c40565b6108ec565b6040516102c591906135a6565b60405180910390f35b6102e860048036038101906102e39190612d0f565b610991565b6040516102f59190613269565b60405180910390f35b6103066109e7565b005b610322600480360381019061031d9190612b3a565b610a8f565b005b61033e60048036038101906103399190612d0f565b610aaf565b60405161034b91906135a6565b60405180910390f35b61035c610b46565b6040516103699190613284565b60405180910390f35b61038c60048036038101906103879190612cce565b610bd4565b005b6103a860048036038101906103a39190612d0f565b610c6a565b6040516103b591906131d9565b60405180910390f35b6103d860048036038101906103d39190612ad5565b610d1c565b6040516103e591906135a6565b60405180910390f35b6103f6610dd4565b005b610400610f11565b60405161040d91906131d9565b60405180910390f35b61041e610f3b565b60405161042b9190613284565b60405180910390f35b61044e60048036038101906104499190612c04565b610fcd565b005b61046a60048036038101906104659190612b89565b61114e565b005b61048660048036038101906104819190612d0f565b6111b0565b6040516104939190613284565b60405180910390f35b6104b660048036038101906104b19190612afe565b611257565b6040516104c39190613269565b60405180910390f35b6104d46112eb565b6040516104e19190613269565b60405180910390f35b61050460048036038101906104ff9190612ad5565b6112fe565b005b61050e6114aa565b60405161051b91906135a6565b60405180910390f35b61053e60048036038101906105399190612d61565b6114b0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105b357506105b282611814565b5b9050919050565b6060600080546105c9906137fc565b80601f01602080910402602001604051908101604052809291908181526020018280546105f5906137fc565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b5050505050905090565b6000610657826118f6565b610696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d90613466565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106dc82610c6a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074490613526565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661076c611962565b73ffffffffffffffffffffffffffffffffffffffff16148061079b575061079a81610795611962565b611257565b5b6107da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d1906133c6565b60405180910390fd5b6107e4838361196a565b505050565b6107f1611962565b73ffffffffffffffffffffffffffffffffffffffff1661080f610f11565b73ffffffffffffffffffffffffffffffffffffffff1614610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085c90613486565b60405180910390fd5b80600c908051906020019061087b9291906128e4565b5050565b6000600880549050905090565b61089d610897611962565b82611a23565b6108dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d390613546565b60405180910390fd5b6108e7838383611b01565b505050565b60006108f783610d1c565b8210610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f906132a6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600e5482106109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce90613506565b60405180910390fd5b6109e0826118f6565b9050919050565b6109ef611962565b73ffffffffffffffffffffffffffffffffffffffff16610a0d610f11565b73ffffffffffffffffffffffffffffffffffffffff1614610a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5a90613486565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610aaa8383836040518060200160405280600081525061114e565b505050565b6000610ab961087f565b8210610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190613566565b60405180910390fd5b60088281548110610b34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600c8054610b53906137fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7f906137fc565b8015610bcc5780601f10610ba157610100808354040283529160200191610bcc565b820191906000526020600020905b815481529060010190602001808311610baf57829003601f168201915b505050505081565b610bdc611962565b73ffffffffffffffffffffffffffffffffffffffff16610bfa610f11565b73ffffffffffffffffffffffffffffffffffffffff1614610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4790613486565b60405180910390fd5b80600f9080519060200190610c669291906128e4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0a90613426565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8490613406565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ddc611962565b73ffffffffffffffffffffffffffffffffffffffff16610dfa610f11565b73ffffffffffffffffffffffffffffffffffffffff1614610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790613486565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f4a906137fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f76906137fc565b8015610fc35780601f10610f9857610100808354040283529160200191610fc3565b820191906000526020600020905b815481529060010190602001808311610fa657829003601f168201915b5050505050905090565b610fd5611962565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103a90613346565b60405180910390fd5b8060056000611050611962565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110fd611962565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111429190613269565b60405180910390a35050565b61115f611159611962565b83611a23565b61119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590613546565b60405180910390fd5b6111aa84848484611d5d565b50505050565b60606111bb826118f6565b6111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f1906134e6565b60405180910390fd5b6000611204611db9565b90506000815111611224576040518060200160405280600081525061124f565b8061122e84611e4b565b60405160200161123f9291906131b5565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b611306611962565b73ffffffffffffffffffffffffffffffffffffffff16611324610f11565b73ffffffffffffffffffffffffffffffffffffffff161461137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190613486565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e1906132e6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b600d60009054906101000a900460ff166114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f6906134a6565b60405180910390fd5b60008111611542576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611539906133a6565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161159f91906131d9565b60206040518083038186803b1580156115b757600080fd5b505afa1580156115cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ef9190612d38565b905060008111611634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162b90613386565b60405180910390fd5b81811015611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e906133e6565b60405180910390fd5b8183611683919061368b565b8110156116c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bc906133e6565b60405180910390fd5b60005b81811080156116d657508281105b1561180e57600e546116e661087f565b10611726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171d90613586565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59338785611773919061368b565b6040518363ffffffff1660e01b8152600401611790929190613240565b60206040518083038186803b1580156117a857600080fd5b505afa1580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e09190612d38565b90506117eb816118f6565b6117fa576117f93382611ff8565b5b5080806118069061385f565b9150506116c8565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118df57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118ef57506118ee82612016565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119dd83610c6a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a2e826118f6565b611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6490613366565b60405180910390fd5b6000611a7883610c6a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ae757508373ffffffffffffffffffffffffffffffffffffffff16611acf8461064c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611af85750611af78185611257565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b2182610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e906134c6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90613326565b60405180910390fd5b611bf2838383612080565b611bfd60008261196a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c4d9190613712565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca4919061368b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611d68848484611b01565b611d7484848484612194565b611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa906132c6565b60405180910390fd5b50505050565b6060600f8054611dc8906137fc565b80601f0160208091040260200160405190810160405280929190818152602001828054611df4906137fc565b8015611e415780601f10611e1657610100808354040283529160200191611e41565b820191906000526020600020905b815481529060010190602001808311611e2457829003601f168201915b5050505050905090565b60606000821415611e93576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ff3565b600082905060005b60008214611ec5578080611eae9061385f565b915050600a82611ebe91906136e1565b9150611e9b565b60008167ffffffffffffffff811115611f07577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f395781602001600182028036833780820191505090505b5090505b60008514611fec57600182611f529190613712565b9150600a85611f6191906138a8565b6030611f6d919061368b565b60f81b818381518110611fa9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fe591906136e1565b9450611f3d565b8093505050505b919050565b61201282826040518060200160405280600081525061232b565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61208b838383612386565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120ce576120c98161238b565b61210d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461210c5761210b83826123d4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121505761214b81612541565b61218f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461218e5761218d8282612684565b5b5b505050565b60006121b58473ffffffffffffffffffffffffffffffffffffffff16612703565b1561231e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121de611962565b8786866040518563ffffffff1660e01b815260040161220094939291906131f4565b602060405180830381600087803b15801561221a57600080fd5b505af192505050801561224b57506040513d601f19601f820116820180604052508101906122489190612ca5565b60015b6122ce573d806000811461227b576040519150601f19603f3d011682016040523d82523d6000602084013e612280565b606091505b506000815114156122c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bd906132c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612323565b600190505b949350505050565b6123358383612716565b6123426000848484612194565b612381576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612378906132c6565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016123e184610d1c565b6123eb9190613712565b90506000600760008481526020019081526020016000205490508181146124d0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125559190613712565b90506000600960008481526020019081526020016000205490506000600883815481106125ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106125f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612668577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061268f83610d1c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277d90613446565b60405180910390fd5b61278f816118f6565b156127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690613306565b60405180910390fd5b6127db60008383612080565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461282b919061368b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546128f0906137fc565b90600052602060002090601f0160209004810192826129125760008555612959565b82601f1061292b57805160ff1916838001178555612959565b82800160010185558215612959579182015b8281111561295857825182559160200191906001019061293d565b5b509050612966919061296a565b5090565b5b8082111561298357600081600090555060010161296b565b5090565b600061299a612995846135e6565b6135c1565b9050828152602081018484840111156129b257600080fd5b6129bd8482856137ba565b509392505050565b60006129d86129d384613617565b6135c1565b9050828152602081018484840111156129f057600080fd5b6129fb8482856137ba565b509392505050565b600081359050612a1281614076565b92915050565b600081359050612a278161408d565b92915050565b600081359050612a3c816140a4565b92915050565b600081519050612a51816140a4565b92915050565b600082601f830112612a6857600080fd5b8135612a78848260208601612987565b91505092915050565b600082601f830112612a9257600080fd5b8135612aa28482602086016129c5565b91505092915050565b600081359050612aba816140bb565b92915050565b600081519050612acf816140bb565b92915050565b600060208284031215612ae757600080fd5b6000612af584828501612a03565b91505092915050565b60008060408385031215612b1157600080fd5b6000612b1f85828601612a03565b9250506020612b3085828601612a03565b9150509250929050565b600080600060608486031215612b4f57600080fd5b6000612b5d86828701612a03565b9350506020612b6e86828701612a03565b9250506040612b7f86828701612aab565b9150509250925092565b60008060008060808587031215612b9f57600080fd5b6000612bad87828801612a03565b9450506020612bbe87828801612a03565b9350506040612bcf87828801612aab565b925050606085013567ffffffffffffffff811115612bec57600080fd5b612bf887828801612a57565b91505092959194509250565b60008060408385031215612c1757600080fd5b6000612c2585828601612a03565b9250506020612c3685828601612a18565b9150509250929050565b60008060408385031215612c5357600080fd5b6000612c6185828601612a03565b9250506020612c7285828601612aab565b9150509250929050565b600060208284031215612c8e57600080fd5b6000612c9c84828501612a2d565b91505092915050565b600060208284031215612cb757600080fd5b6000612cc584828501612a42565b91505092915050565b600060208284031215612ce057600080fd5b600082013567ffffffffffffffff811115612cfa57600080fd5b612d0684828501612a81565b91505092915050565b600060208284031215612d2157600080fd5b6000612d2f84828501612aab565b91505092915050565b600060208284031215612d4a57600080fd5b6000612d5884828501612ac0565b91505092915050565b60008060408385031215612d7457600080fd5b6000612d8285828601612aab565b9250506020612d9385828601612aab565b9150509250929050565b612da681613746565b82525050565b612db581613758565b82525050565b6000612dc682613648565b612dd0818561365e565b9350612de08185602086016137c9565b612de981613995565b840191505092915050565b6000612dff82613653565b612e09818561366f565b9350612e198185602086016137c9565b612e2281613995565b840191505092915050565b6000612e3882613653565b612e428185613680565b9350612e528185602086016137c9565b80840191505092915050565b6000612e6b602b8361366f565b9150612e76826139a6565b604082019050919050565b6000612e8e60328361366f565b9150612e99826139f5565b604082019050919050565b6000612eb160268361366f565b9150612ebc82613a44565b604082019050919050565b6000612ed4601c8361366f565b9150612edf82613a93565b602082019050919050565b6000612ef760248361366f565b9150612f0282613abc565b604082019050919050565b6000612f1a60198361366f565b9150612f2582613b0b565b602082019050919050565b6000612f3d602c8361366f565b9150612f4882613b34565b604082019050919050565b6000612f6060318361366f565b9150612f6b82613b83565b604082019050919050565b6000612f83601f8361366f565b9150612f8e82613bd2565b602082019050919050565b6000612fa660388361366f565b9150612fb182613bfb565b604082019050919050565b6000612fc960518361366f565b9150612fd482613c4a565b606082019050919050565b6000612fec602a8361366f565b9150612ff782613cbf565b604082019050919050565b600061300f60298361366f565b915061301a82613d0e565b604082019050919050565b600061303260208361366f565b915061303d82613d5d565b602082019050919050565b6000613055602c8361366f565b915061306082613d86565b604082019050919050565b600061307860208361366f565b915061308382613dd5565b602082019050919050565b600061309b60268361366f565b91506130a682613dfe565b604082019050919050565b60006130be60298361366f565b91506130c982613e4d565b604082019050919050565b60006130e1602f8361366f565b91506130ec82613e9c565b604082019050919050565b600061310460218361366f565b915061310f82613eeb565b604082019050919050565b600061312760218361366f565b915061313282613f3a565b604082019050919050565b600061314a60318361366f565b915061315582613f89565b604082019050919050565b600061316d602c8361366f565b915061317882613fd8565b604082019050919050565b600061319060258361366f565b915061319b82614027565b604082019050919050565b6131af816137b0565b82525050565b60006131c18285612e2d565b91506131cd8284612e2d565b91508190509392505050565b60006020820190506131ee6000830184612d9d565b92915050565b60006080820190506132096000830187612d9d565b6132166020830186612d9d565b61322360408301856131a6565b81810360608301526132358184612dbb565b905095945050505050565b60006040820190506132556000830185612d9d565b61326260208301846131a6565b9392505050565b600060208201905061327e6000830184612dac565b92915050565b6000602082019050818103600083015261329e8184612df4565b905092915050565b600060208201905081810360008301526132bf81612e5e565b9050919050565b600060208201905081810360008301526132df81612e81565b9050919050565b600060208201905081810360008301526132ff81612ea4565b9050919050565b6000602082019050818103600083015261331f81612ec7565b9050919050565b6000602082019050818103600083015261333f81612eea565b9050919050565b6000602082019050818103600083015261335f81612f0d565b9050919050565b6000602082019050818103600083015261337f81612f30565b9050919050565b6000602082019050818103600083015261339f81612f53565b9050919050565b600060208201905081810360008301526133bf81612f76565b9050919050565b600060208201905081810360008301526133df81612f99565b9050919050565b600060208201905081810360008301526133ff81612fbc565b9050919050565b6000602082019050818103600083015261341f81612fdf565b9050919050565b6000602082019050818103600083015261343f81613002565b9050919050565b6000602082019050818103600083015261345f81613025565b9050919050565b6000602082019050818103600083015261347f81613048565b9050919050565b6000602082019050818103600083015261349f8161306b565b9050919050565b600060208201905081810360008301526134bf8161308e565b9050919050565b600060208201905081810360008301526134df816130b1565b9050919050565b600060208201905081810360008301526134ff816130d4565b9050919050565b6000602082019050818103600083015261351f816130f7565b9050919050565b6000602082019050818103600083015261353f8161311a565b9050919050565b6000602082019050818103600083015261355f8161313d565b9050919050565b6000602082019050818103600083015261357f81613160565b9050919050565b6000602082019050818103600083015261359f81613183565b9050919050565b60006020820190506135bb60008301846131a6565b92915050565b60006135cb6135dc565b90506135d7828261382e565b919050565b6000604051905090565b600067ffffffffffffffff82111561360157613600613966565b5b61360a82613995565b9050602081019050919050565b600067ffffffffffffffff82111561363257613631613966565b5b61363b82613995565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613696826137b0565b91506136a1836137b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136d6576136d56138d9565b5b828201905092915050565b60006136ec826137b0565b91506136f7836137b0565b92508261370757613706613908565b5b828204905092915050565b600061371d826137b0565b9150613728836137b0565b92508282101561373b5761373a6138d9565b5b828203905092915050565b600061375182613790565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156137e75780820151818401526020810190506137cc565b838111156137f6576000848401525b50505050565b6000600282049050600182168061381457607f821691505b6020821081141561382857613827613937565b5b50919050565b61383782613995565b810181811067ffffffffffffffff8211171561385657613855613966565b5b80604052505050565b600061386a826137b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561389d5761389c6138d9565b5b600182019050919050565b60006138b3826137b0565b91506138be836137b0565b9250826138ce576138cd613908565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d75737420686f6c64206174206c65617374206f6e65204372616e69756d207460008201527f6f206d696e742061205374616c6c696f6e000000000000000000000000000000602082015250565b7f4d757374206d696e74206174206c65617374206f6e65205374616c6c696f6e00600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4d75737420686f6c64206174206c65617374206173206d616e79204372616e6960008201527f756d7320617320746865206e756d626572206f66205374616c6c696f6e73207960208201527f6f7520696e74656e6420746f206d696e74000000000000000000000000000000604082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e74206120537460008201527f616c6c696f6e0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f746f6b656e4964206f75747369646520636f6c6c656374696f6e20626f756e6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564206d617820737570706c79206f66205374616c60008201527f6c696f6e73000000000000000000000000000000000000000000000000000000602082015250565b61407f81613746565b811461408a57600080fd5b50565b61409681613758565b81146140a157600080fd5b50565b6140ad81613764565b81146140b857600080fd5b50565b6140c4816137b0565b81146140cf57600080fd5b5056fea2646970667358221220f651fc62181842e25e5ac080c85da55f2617640a85fc97730d8537e17a0e28e764736f6c63430008030033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806355f804b3116100f9578063b88d4fde11610097578063eb8d244411610071578063eb8d2444146104cc578063f2fde38b146104ea578063fe8abb7414610506578063ff30487414610524576101a9565b8063b88d4fde14610450578063c87b56dd1461046c578063e985e9c51461049c576101a9565b8063715018a6116100d3578063715018a6146103ee5780638da5cb5b146103f857806395d89b4114610416578063a22cb46514610434576101a9565b806355f804b3146103725780636352211e1461038e57806370a08231146103be576101a9565b806323b872dd1161016657806334918dfd1161014057806334918dfd146102fe57806342842e0e146103085780634f6ccce7146103245780635134442a14610354576101a9565b806323b872dd146102825780632f745c591461029e57806333c41a90146102ce576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c578063109695231461024857806318160ddd14610264575b600080fd5b6101c860048036038101906101c39190612c7c565b610540565b6040516101d59190613269565b60405180910390f35b6101e66105ba565b6040516101f39190613284565b60405180910390f35b61021660048036038101906102119190612d0f565b61064c565b60405161022391906131d9565b60405180910390f35b61024660048036038101906102419190612c40565b6106d1565b005b610262600480360381019061025d9190612cce565b6107e9565b005b61026c61087f565b60405161027991906135a6565b60405180910390f35b61029c60048036038101906102979190612b3a565b61088c565b005b6102b860048036038101906102b39190612c40565b6108ec565b6040516102c591906135a6565b60405180910390f35b6102e860048036038101906102e39190612d0f565b610991565b6040516102f59190613269565b60405180910390f35b6103066109e7565b005b610322600480360381019061031d9190612b3a565b610a8f565b005b61033e60048036038101906103399190612d0f565b610aaf565b60405161034b91906135a6565b60405180910390f35b61035c610b46565b6040516103699190613284565b60405180910390f35b61038c60048036038101906103879190612cce565b610bd4565b005b6103a860048036038101906103a39190612d0f565b610c6a565b6040516103b591906131d9565b60405180910390f35b6103d860048036038101906103d39190612ad5565b610d1c565b6040516103e591906135a6565b60405180910390f35b6103f6610dd4565b005b610400610f11565b60405161040d91906131d9565b60405180910390f35b61041e610f3b565b60405161042b9190613284565b60405180910390f35b61044e60048036038101906104499190612c04565b610fcd565b005b61046a60048036038101906104659190612b89565b61114e565b005b61048660048036038101906104819190612d0f565b6111b0565b6040516104939190613284565b60405180910390f35b6104b660048036038101906104b19190612afe565b611257565b6040516104c39190613269565b60405180910390f35b6104d46112eb565b6040516104e19190613269565b60405180910390f35b61050460048036038101906104ff9190612ad5565b6112fe565b005b61050e6114aa565b60405161051b91906135a6565b60405180910390f35b61053e60048036038101906105399190612d61565b6114b0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105b357506105b282611814565b5b9050919050565b6060600080546105c9906137fc565b80601f01602080910402602001604051908101604052809291908181526020018280546105f5906137fc565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b5050505050905090565b6000610657826118f6565b610696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068d90613466565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106dc82610c6a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074490613526565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661076c611962565b73ffffffffffffffffffffffffffffffffffffffff16148061079b575061079a81610795611962565b611257565b5b6107da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d1906133c6565b60405180910390fd5b6107e4838361196a565b505050565b6107f1611962565b73ffffffffffffffffffffffffffffffffffffffff1661080f610f11565b73ffffffffffffffffffffffffffffffffffffffff1614610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085c90613486565b60405180910390fd5b80600c908051906020019061087b9291906128e4565b5050565b6000600880549050905090565b61089d610897611962565b82611a23565b6108dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d390613546565b60405180910390fd5b6108e7838383611b01565b505050565b60006108f783610d1c565b8210610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f906132a6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600e5482106109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce90613506565b60405180910390fd5b6109e0826118f6565b9050919050565b6109ef611962565b73ffffffffffffffffffffffffffffffffffffffff16610a0d610f11565b73ffffffffffffffffffffffffffffffffffffffff1614610a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5a90613486565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610aaa8383836040518060200160405280600081525061114e565b505050565b6000610ab961087f565b8210610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190613566565b60405180910390fd5b60088281548110610b34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600c8054610b53906137fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7f906137fc565b8015610bcc5780601f10610ba157610100808354040283529160200191610bcc565b820191906000526020600020905b815481529060010190602001808311610baf57829003601f168201915b505050505081565b610bdc611962565b73ffffffffffffffffffffffffffffffffffffffff16610bfa610f11565b73ffffffffffffffffffffffffffffffffffffffff1614610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4790613486565b60405180910390fd5b80600f9080519060200190610c669291906128e4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0a90613426565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8490613406565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ddc611962565b73ffffffffffffffffffffffffffffffffffffffff16610dfa610f11565b73ffffffffffffffffffffffffffffffffffffffff1614610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790613486565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f4a906137fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f76906137fc565b8015610fc35780601f10610f9857610100808354040283529160200191610fc3565b820191906000526020600020905b815481529060010190602001808311610fa657829003601f168201915b5050505050905090565b610fd5611962565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103a90613346565b60405180910390fd5b8060056000611050611962565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110fd611962565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111429190613269565b60405180910390a35050565b61115f611159611962565b83611a23565b61119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590613546565b60405180910390fd5b6111aa84848484611d5d565b50505050565b60606111bb826118f6565b6111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f1906134e6565b60405180910390fd5b6000611204611db9565b90506000815111611224576040518060200160405280600081525061124f565b8061122e84611e4b565b60405160200161123f9291906131b5565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b611306611962565b73ffffffffffffffffffffffffffffffffffffffff16611324610f11565b73ffffffffffffffffffffffffffffffffffffffff161461137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190613486565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e1906132e6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b600d60009054906101000a900460ff166114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f6906134a6565b60405180910390fd5b60008111611542576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611539906133a6565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161159f91906131d9565b60206040518083038186803b1580156115b757600080fd5b505afa1580156115cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ef9190612d38565b905060008111611634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162b90613386565b60405180910390fd5b81811015611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e906133e6565b60405180910390fd5b8183611683919061368b565b8110156116c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bc906133e6565b60405180910390fd5b60005b81811080156116d657508281105b1561180e57600e546116e661087f565b10611726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171d90613586565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59338785611773919061368b565b6040518363ffffffff1660e01b8152600401611790929190613240565b60206040518083038186803b1580156117a857600080fd5b505afa1580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e09190612d38565b90506117eb816118f6565b6117fa576117f93382611ff8565b5b5080806118069061385f565b9150506116c8565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118df57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118ef57506118ee82612016565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119dd83610c6a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a2e826118f6565b611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6490613366565b60405180910390fd5b6000611a7883610c6a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ae757508373ffffffffffffffffffffffffffffffffffffffff16611acf8461064c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611af85750611af78185611257565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b2182610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e906134c6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90613326565b60405180910390fd5b611bf2838383612080565b611bfd60008261196a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c4d9190613712565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca4919061368b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611d68848484611b01565b611d7484848484612194565b611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa906132c6565b60405180910390fd5b50505050565b6060600f8054611dc8906137fc565b80601f0160208091040260200160405190810160405280929190818152602001828054611df4906137fc565b8015611e415780601f10611e1657610100808354040283529160200191611e41565b820191906000526020600020905b815481529060010190602001808311611e2457829003601f168201915b5050505050905090565b60606000821415611e93576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ff3565b600082905060005b60008214611ec5578080611eae9061385f565b915050600a82611ebe91906136e1565b9150611e9b565b60008167ffffffffffffffff811115611f07577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f395781602001600182028036833780820191505090505b5090505b60008514611fec57600182611f529190613712565b9150600a85611f6191906138a8565b6030611f6d919061368b565b60f81b818381518110611fa9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fe591906136e1565b9450611f3d565b8093505050505b919050565b61201282826040518060200160405280600081525061232b565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61208b838383612386565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120ce576120c98161238b565b61210d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461210c5761210b83826123d4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121505761214b81612541565b61218f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461218e5761218d8282612684565b5b5b505050565b60006121b58473ffffffffffffffffffffffffffffffffffffffff16612703565b1561231e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121de611962565b8786866040518563ffffffff1660e01b815260040161220094939291906131f4565b602060405180830381600087803b15801561221a57600080fd5b505af192505050801561224b57506040513d601f19601f820116820180604052508101906122489190612ca5565b60015b6122ce573d806000811461227b576040519150601f19603f3d011682016040523d82523d6000602084013e612280565b606091505b506000815114156122c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bd906132c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612323565b600190505b949350505050565b6123358383612716565b6123426000848484612194565b612381576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612378906132c6565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016123e184610d1c565b6123eb9190613712565b90506000600760008481526020019081526020016000205490508181146124d0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125559190613712565b90506000600960008481526020019081526020016000205490506000600883815481106125ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106125f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612668577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061268f83610d1c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277d90613446565b60405180910390fd5b61278f816118f6565b156127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690613306565b60405180910390fd5b6127db60008383612080565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461282b919061368b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546128f0906137fc565b90600052602060002090601f0160209004810192826129125760008555612959565b82601f1061292b57805160ff1916838001178555612959565b82800160010185558215612959579182015b8281111561295857825182559160200191906001019061293d565b5b509050612966919061296a565b5090565b5b8082111561298357600081600090555060010161296b565b5090565b600061299a612995846135e6565b6135c1565b9050828152602081018484840111156129b257600080fd5b6129bd8482856137ba565b509392505050565b60006129d86129d384613617565b6135c1565b9050828152602081018484840111156129f057600080fd5b6129fb8482856137ba565b509392505050565b600081359050612a1281614076565b92915050565b600081359050612a278161408d565b92915050565b600081359050612a3c816140a4565b92915050565b600081519050612a51816140a4565b92915050565b600082601f830112612a6857600080fd5b8135612a78848260208601612987565b91505092915050565b600082601f830112612a9257600080fd5b8135612aa28482602086016129c5565b91505092915050565b600081359050612aba816140bb565b92915050565b600081519050612acf816140bb565b92915050565b600060208284031215612ae757600080fd5b6000612af584828501612a03565b91505092915050565b60008060408385031215612b1157600080fd5b6000612b1f85828601612a03565b9250506020612b3085828601612a03565b9150509250929050565b600080600060608486031215612b4f57600080fd5b6000612b5d86828701612a03565b9350506020612b6e86828701612a03565b9250506040612b7f86828701612aab565b9150509250925092565b60008060008060808587031215612b9f57600080fd5b6000612bad87828801612a03565b9450506020612bbe87828801612a03565b9350506040612bcf87828801612aab565b925050606085013567ffffffffffffffff811115612bec57600080fd5b612bf887828801612a57565b91505092959194509250565b60008060408385031215612c1757600080fd5b6000612c2585828601612a03565b9250506020612c3685828601612a18565b9150509250929050565b60008060408385031215612c5357600080fd5b6000612c6185828601612a03565b9250506020612c7285828601612aab565b9150509250929050565b600060208284031215612c8e57600080fd5b6000612c9c84828501612a2d565b91505092915050565b600060208284031215612cb757600080fd5b6000612cc584828501612a42565b91505092915050565b600060208284031215612ce057600080fd5b600082013567ffffffffffffffff811115612cfa57600080fd5b612d0684828501612a81565b91505092915050565b600060208284031215612d2157600080fd5b6000612d2f84828501612aab565b91505092915050565b600060208284031215612d4a57600080fd5b6000612d5884828501612ac0565b91505092915050565b60008060408385031215612d7457600080fd5b6000612d8285828601612aab565b9250506020612d9385828601612aab565b9150509250929050565b612da681613746565b82525050565b612db581613758565b82525050565b6000612dc682613648565b612dd0818561365e565b9350612de08185602086016137c9565b612de981613995565b840191505092915050565b6000612dff82613653565b612e09818561366f565b9350612e198185602086016137c9565b612e2281613995565b840191505092915050565b6000612e3882613653565b612e428185613680565b9350612e528185602086016137c9565b80840191505092915050565b6000612e6b602b8361366f565b9150612e76826139a6565b604082019050919050565b6000612e8e60328361366f565b9150612e99826139f5565b604082019050919050565b6000612eb160268361366f565b9150612ebc82613a44565b604082019050919050565b6000612ed4601c8361366f565b9150612edf82613a93565b602082019050919050565b6000612ef760248361366f565b9150612f0282613abc565b604082019050919050565b6000612f1a60198361366f565b9150612f2582613b0b565b602082019050919050565b6000612f3d602c8361366f565b9150612f4882613b34565b604082019050919050565b6000612f6060318361366f565b9150612f6b82613b83565b604082019050919050565b6000612f83601f8361366f565b9150612f8e82613bd2565b602082019050919050565b6000612fa660388361366f565b9150612fb182613bfb565b604082019050919050565b6000612fc960518361366f565b9150612fd482613c4a565b606082019050919050565b6000612fec602a8361366f565b9150612ff782613cbf565b604082019050919050565b600061300f60298361366f565b915061301a82613d0e565b604082019050919050565b600061303260208361366f565b915061303d82613d5d565b602082019050919050565b6000613055602c8361366f565b915061306082613d86565b604082019050919050565b600061307860208361366f565b915061308382613dd5565b602082019050919050565b600061309b60268361366f565b91506130a682613dfe565b604082019050919050565b60006130be60298361366f565b91506130c982613e4d565b604082019050919050565b60006130e1602f8361366f565b91506130ec82613e9c565b604082019050919050565b600061310460218361366f565b915061310f82613eeb565b604082019050919050565b600061312760218361366f565b915061313282613f3a565b604082019050919050565b600061314a60318361366f565b915061315582613f89565b604082019050919050565b600061316d602c8361366f565b915061317882613fd8565b604082019050919050565b600061319060258361366f565b915061319b82614027565b604082019050919050565b6131af816137b0565b82525050565b60006131c18285612e2d565b91506131cd8284612e2d565b91508190509392505050565b60006020820190506131ee6000830184612d9d565b92915050565b60006080820190506132096000830187612d9d565b6132166020830186612d9d565b61322360408301856131a6565b81810360608301526132358184612dbb565b905095945050505050565b60006040820190506132556000830185612d9d565b61326260208301846131a6565b9392505050565b600060208201905061327e6000830184612dac565b92915050565b6000602082019050818103600083015261329e8184612df4565b905092915050565b600060208201905081810360008301526132bf81612e5e565b9050919050565b600060208201905081810360008301526132df81612e81565b9050919050565b600060208201905081810360008301526132ff81612ea4565b9050919050565b6000602082019050818103600083015261331f81612ec7565b9050919050565b6000602082019050818103600083015261333f81612eea565b9050919050565b6000602082019050818103600083015261335f81612f0d565b9050919050565b6000602082019050818103600083015261337f81612f30565b9050919050565b6000602082019050818103600083015261339f81612f53565b9050919050565b600060208201905081810360008301526133bf81612f76565b9050919050565b600060208201905081810360008301526133df81612f99565b9050919050565b600060208201905081810360008301526133ff81612fbc565b9050919050565b6000602082019050818103600083015261341f81612fdf565b9050919050565b6000602082019050818103600083015261343f81613002565b9050919050565b6000602082019050818103600083015261345f81613025565b9050919050565b6000602082019050818103600083015261347f81613048565b9050919050565b6000602082019050818103600083015261349f8161306b565b9050919050565b600060208201905081810360008301526134bf8161308e565b9050919050565b600060208201905081810360008301526134df816130b1565b9050919050565b600060208201905081810360008301526134ff816130d4565b9050919050565b6000602082019050818103600083015261351f816130f7565b9050919050565b6000602082019050818103600083015261353f8161311a565b9050919050565b6000602082019050818103600083015261355f8161313d565b9050919050565b6000602082019050818103600083015261357f81613160565b9050919050565b6000602082019050818103600083015261359f81613183565b9050919050565b60006020820190506135bb60008301846131a6565b92915050565b60006135cb6135dc565b90506135d7828261382e565b919050565b6000604051905090565b600067ffffffffffffffff82111561360157613600613966565b5b61360a82613995565b9050602081019050919050565b600067ffffffffffffffff82111561363257613631613966565b5b61363b82613995565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613696826137b0565b91506136a1836137b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136d6576136d56138d9565b5b828201905092915050565b60006136ec826137b0565b91506136f7836137b0565b92508261370757613706613908565b5b828204905092915050565b600061371d826137b0565b9150613728836137b0565b92508282101561373b5761373a6138d9565b5b828203905092915050565b600061375182613790565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156137e75780820151818401526020810190506137cc565b838111156137f6576000848401525b50505050565b6000600282049050600182168061381457607f821691505b6020821081141561382857613827613937565b5b50919050565b61383782613995565b810181811067ffffffffffffffff8211171561385657613855613966565b5b80604052505050565b600061386a826137b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561389d5761389c6138d9565b5b600182019050919050565b60006138b3826137b0565b91506138be836137b0565b9250826138ce576138cd613908565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d75737420686f6c64206174206c65617374206f6e65204372616e69756d207460008201527f6f206d696e742061205374616c6c696f6e000000000000000000000000000000602082015250565b7f4d757374206d696e74206174206c65617374206f6e65205374616c6c696f6e00600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4d75737420686f6c64206174206c65617374206173206d616e79204372616e6960008201527f756d7320617320746865206e756d626572206f66205374616c6c696f6e73207960208201527f6f7520696e74656e6420746f206d696e74000000000000000000000000000000604082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e74206120537460008201527f616c6c696f6e0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f746f6b656e4964206f75747369646520636f6c6c656374696f6e20626f756e6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564206d617820737570706c79206f66205374616c60008201527f6c696f6e73000000000000000000000000000000000000000000000000000000602082015250565b61407f81613746565b811461408a57600080fd5b50565b61409681613758565b81146140a157600080fd5b50565b6140ad81613764565b81146140b857600080fd5b50565b6140c4816137b0565b81146140cf57600080fd5b5056fea2646970667358221220f651fc62181842e25e5ac080c85da55f2617640a85fc97730d8537e17a0e28e764736f6c63430008030033

Deployed Bytecode Sourcemap

43042:1912:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34258:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21477:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22937:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22474:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43390:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34911:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23827:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34579:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43525:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43896:83;;;:::i;:::-;;24203:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35101:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43178:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43808:82;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21171:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20901:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42126:148;;;:::i;:::-;;41475:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21646:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23230:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24425:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21821:360;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23596:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43222:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42429:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43259:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43985:966;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34258:237;34360:4;34399:35;34384:50;;;:11;:50;;;;:103;;;;34451:36;34475:11;34451:23;:36::i;:::-;34384:103;34377:110;;34258:237;;;:::o;21477:100::-;21531:13;21564:5;21557:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21477:100;:::o;22937:221::-;23013:7;23041:16;23049:7;23041;:16::i;:::-;23033:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23126:15;:24;23142:7;23126:24;;;;;;;;;;;;;;;;;;;;;23119:31;;22937:221;;;:::o;22474:397::-;22555:13;22571:23;22586:7;22571:14;:23::i;:::-;22555:39;;22619:5;22613:11;;:2;:11;;;;22605:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22699:5;22683:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22708:37;22725:5;22732:12;:10;:12::i;:::-;22708:16;:37::i;:::-;22683:62;22675:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22842:21;22851:2;22855:7;22842:8;:21::i;:::-;22474:397;;;:::o;43390:129::-;41706:12;:10;:12::i;:::-;41695:23;;:7;:5;:7::i;:::-;:23;;;41687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43499:14:::1;43471:25;:42;;;;;;;;;;;;:::i;:::-;;43390:129:::0;:::o;34911:113::-;34972:7;34999:10;:17;;;;34992:24;;34911:113;:::o;23827:305::-;23988:41;24007:12;:10;:12::i;:::-;24021:7;23988:18;:41::i;:::-;23980:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24096:28;24106:4;24112:2;24116:7;24096:9;:28::i;:::-;23827:305;;;:::o;34579:256::-;34676:7;34712:23;34729:5;34712:16;:23::i;:::-;34704:5;:31;34696:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34801:12;:19;34814:5;34801:19;;;;;;;;;;;;;;;:26;34821:5;34801:26;;;;;;;;;;;;34794:33;;34579:256;;;;:::o;43525:175::-;43583:4;43614:12;;43604:7;:22;43596:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43678:16;43686:7;43678;:16::i;:::-;43671:23;;43525:175;;;:::o;43896:83::-;41706:12;:10;:12::i;:::-;41695:23;;:7;:5;:7::i;:::-;:23;;;41687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43961:12:::1;;;;;;;;;;;43960:13;43945:12;;:28;;;;;;;;;;;;;;;;;;43896:83::o:0;24203:151::-;24307:39;24324:4;24330:2;24334:7;24307:39;;;;;;;;;;;;:16;:39::i;:::-;24203:151;;;:::o;35101:233::-;35176:7;35212:30;:28;:30::i;:::-;35204:5;:38;35196:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35309:10;35320:5;35309:17;;;;;;;;;;;;;;;;;;;;;;;;35302:24;;35101:233;;;:::o;43178:39::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43808:82::-;41706:12;:10;:12::i;:::-;41695:23;;:7;:5;:7::i;:::-;:23;;;41687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43881:3:::1;43871:7;:13;;;;;;;;;;;;:::i;:::-;;43808:82:::0;:::o;21171:239::-;21243:7;21263:13;21279:7;:16;21287:7;21279:16;;;;;;;;;;;;;;;;;;;;;21263:32;;21331:1;21314:19;;:5;:19;;;;21306:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21397:5;21390:12;;;21171:239;;;:::o;20901:208::-;20973:7;21018:1;21001:19;;:5;:19;;;;20993:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21085:9;:16;21095:5;21085:16;;;;;;;;;;;;;;;;21078:23;;20901:208;;;:::o;42126:148::-;41706:12;:10;:12::i;:::-;41695:23;;:7;:5;:7::i;:::-;:23;;;41687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42233:1:::1;42196:40;;42217:6;;;;;;;;;;;42196:40;;;;;;;;;;;;42264:1;42247:6;;:19;;;;;;;;;;;;;;;;;;42126:148::o:0;41475:87::-;41521:7;41548:6;;;;;;;;;;;41541:13;;41475:87;:::o;21646:104::-;21702:13;21735:7;21728:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21646:104;:::o;23230:295::-;23345:12;:10;:12::i;:::-;23333:24;;:8;:24;;;;23325:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23445:8;23400:18;:32;23419:12;:10;:12::i;:::-;23400:32;;;;;;;;;;;;;;;:42;23433:8;23400:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23498:8;23469:48;;23484:12;:10;:12::i;:::-;23469:48;;;23508:8;23469:48;;;;;;:::i;:::-;;;;;;;;23230:295;;:::o;24425:285::-;24557:41;24576:12;:10;:12::i;:::-;24590:7;24557:18;:41::i;:::-;24549:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24663:39;24677:4;24683:2;24687:7;24696:5;24663:13;:39::i;:::-;24425:285;;;;:::o;21821:360::-;21894:13;21928:16;21936:7;21928;:16::i;:::-;21920:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22009:21;22033:10;:8;:10::i;:::-;22009:34;;22085:1;22067:7;22061:21;:25;:112;;;;;;;;;;;;;;;;;22126:7;22135:18;:7;:16;:18::i;:::-;22109:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22061:112;22054:119;;;21821:360;;;:::o;23596:164::-;23693:4;23717:18;:25;23736:5;23717:25;;;;;;;;;;;;;;;:35;23743:8;23717:35;;;;;;;;;;;;;;;;;;;;;;;;;23710:42;;23596:164;;;;:::o;43222:32::-;;;;;;;;;;;;;:::o;42429:244::-;41706:12;:10;:12::i;:::-;41695:23;;:7;:5;:7::i;:::-;:23;;;41687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42538:1:::1;42518:22;;:8;:22;;;;42510:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42628:8;42599:38;;42620:6;;;;;;;;;;;42599:38;;;;;;;;;;;;42657:8;42648:6;;:17;;;;;;;;;;;;;;;;;;42429:244:::0;:::o;43259:35::-;;;;:::o;43985:966::-;44083:12;;;;;;;;;;;44075:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44176:1;44153:20;:24;44145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44220:12;44235:3;;;;;;;;;;;:13;;;44249:10;44235:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44220:40;;44285:1;44275:7;:11;44267:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44366:20;44355:7;:31;;44347:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;44514:20;44498:13;:36;;;;:::i;:::-;44487:7;:47;;44479:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;44633:6;44629:317;44649:7;44645:1;:11;:39;;;;;44664:20;44660:1;:24;44645:39;44629:317;;;44724:12;;44708:13;:11;:13::i;:::-;:28;44700:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;44787:12;44802:3;;;;;;;;;;;:23;;;44826:10;44842:13;44838:1;:17;;;;:::i;:::-;44802:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44787:69;;44870:16;44878:7;44870;:16::i;:::-;44865:74;;44899:30;44909:10;44921:7;44899:9;:30::i;:::-;44865:74;44629:317;44686:3;;;;;:::i;:::-;;;;44629:317;;;;43985:966;;;:::o;20545:292::-;20647:4;20686:25;20671:40;;;:11;:40;;;;:105;;;;20743:33;20728:48;;;:11;:48;;;;20671:105;:158;;;;20793:36;20817:11;20793:23;:36::i;:::-;20671:158;20664:165;;20545:292;;;:::o;26177:127::-;26242:4;26294:1;26266:30;;:7;:16;26274:7;26266:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26259:37;;26177:127;;;:::o;15861:98::-;15914:7;15941:10;15934:17;;15861:98;:::o;30054:174::-;30156:2;30129:15;:24;30145:7;30129:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30212:7;30208:2;30174:46;;30183:23;30198:7;30183:14;:23::i;:::-;30174:46;;;;;;;;;;;;30054:174;;:::o;26471:348::-;26564:4;26589:16;26597:7;26589;:16::i;:::-;26581:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26665:13;26681:23;26696:7;26681:14;:23::i;:::-;26665:39;;26734:5;26723:16;;:7;:16;;;:51;;;;26767:7;26743:31;;:20;26755:7;26743:11;:20::i;:::-;:31;;;26723:51;:87;;;;26778:32;26795:5;26802:7;26778:16;:32::i;:::-;26723:87;26715:96;;;26471:348;;;;:::o;29392:544::-;29517:4;29490:31;;:23;29505:7;29490:14;:23::i;:::-;:31;;;29482:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29600:1;29586:16;;:2;:16;;;;29578:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29656:39;29677:4;29683:2;29687:7;29656:20;:39::i;:::-;29760:29;29777:1;29781:7;29760:8;:29::i;:::-;29821:1;29802:9;:15;29812:4;29802:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29850:1;29833:9;:13;29843:2;29833:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29881:2;29862:7;:16;29870:7;29862:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29920:7;29916:2;29901:27;;29910:4;29901:27;;;;;;;;;;;;29392:544;;;:::o;25592:272::-;25706:28;25716:4;25722:2;25726:7;25706:9;:28::i;:::-;25753:48;25776:4;25782:2;25786:7;25795:5;25753:22;:48::i;:::-;25745:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25592:272;;;;:::o;43706:94::-;43758:13;43787:7;43780:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43706:94;:::o;16512:723::-;16568:13;16798:1;16789:5;:10;16785:53;;;16816:10;;;;;;;;;;;;;;;;;;;;;16785:53;16848:12;16863:5;16848:20;;16879:14;16904:78;16919:1;16911:4;:9;16904:78;;16937:8;;;;;:::i;:::-;;;;16968:2;16960:10;;;;;:::i;:::-;;;16904:78;;;16992:19;17024:6;17014:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16992:39;;17042:154;17058:1;17049:5;:10;17042:154;;17086:1;17076:11;;;;;:::i;:::-;;;17153:2;17145:5;:10;;;;:::i;:::-;17132:2;:24;;;;:::i;:::-;17119:39;;17102:6;17109;17102:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17182:2;17173:11;;;;;:::i;:::-;;;17042:154;;;17220:6;17206:21;;;;;16512:723;;;;:::o;27161:110::-;27237:26;27247:2;27251:7;27237:26;;;;;;;;;;;;:9;:26::i;:::-;27161:110;;:::o;19061:157::-;19146:4;19185:25;19170:40;;;:11;:40;;;;19163:47;;19061:157;;;:::o;35947:555::-;36057:45;36084:4;36090:2;36094:7;36057:26;:45::i;:::-;36135:1;36119:18;;:4;:18;;;36115:187;;;36154:40;36186:7;36154:31;:40::i;:::-;36115:187;;;36224:2;36216:10;;:4;:10;;;36212:90;;36243:47;36276:4;36282:7;36243:32;:47::i;:::-;36212:90;36115:187;36330:1;36316:16;;:2;:16;;;36312:183;;;36349:45;36386:7;36349:36;:45::i;:::-;36312:183;;;36422:4;36416:10;;:2;:10;;;36412:83;;36443:40;36471:2;36475:7;36443:27;:40::i;:::-;36412:83;36312:183;35947:555;;;:::o;30793:843::-;30914:4;30940:15;:2;:13;;;:15::i;:::-;30936:693;;;30992:2;30976:36;;;31013:12;:10;:12::i;:::-;31027:4;31033:7;31042:5;30976:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30972:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31239:1;31222:6;:13;:18;31218:341;;;31265:60;;;;;;;;;;:::i;:::-;;;;;;;;31218:341;31509:6;31503:13;31494:6;31490:2;31486:15;31479:38;30972:602;31109:45;;;31099:55;;;:6;:55;;;;31092:62;;;;;30936:693;31613:4;31606:11;;30793:843;;;;;;;:::o;27498:250::-;27594:18;27600:2;27604:7;27594:5;:18::i;:::-;27631:54;27662:1;27666:2;27670:7;27679:5;27631:22;:54::i;:::-;27623:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27498:250;;;:::o;32249:93::-;;;;:::o;37225:164::-;37329:10;:17;;;;37302:15;:24;37318:7;37302:24;;;;;;;;;;;:44;;;;37357:10;37373:7;37357:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37225:164;:::o;38016:988::-;38282:22;38332:1;38307:22;38324:4;38307:16;:22::i;:::-;:26;;;;:::i;:::-;38282:51;;38344:18;38365:17;:26;38383:7;38365:26;;;;;;;;;;;;38344:47;;38512:14;38498:10;:28;38494:328;;38543:19;38565:12;:18;38578:4;38565:18;;;;;;;;;;;;;;;:34;38584:14;38565:34;;;;;;;;;;;;38543:56;;38649:11;38616:12;:18;38629:4;38616:18;;;;;;;;;;;;;;;:30;38635:10;38616:30;;;;;;;;;;;:44;;;;38766:10;38733:17;:30;38751:11;38733:30;;;;;;;;;;;:43;;;;38494:328;;38918:17;:26;38936:7;38918:26;;;;;;;;;;;38911:33;;;38962:12;:18;38975:4;38962:18;;;;;;;;;;;;;;;:34;38981:14;38962:34;;;;;;;;;;;38955:41;;;38016:988;;;;:::o;39299:1079::-;39552:22;39597:1;39577:10;:17;;;;:21;;;;:::i;:::-;39552:46;;39609:18;39630:15;:24;39646:7;39630:24;;;;;;;;;;;;39609:45;;39981:19;40003:10;40014:14;40003:26;;;;;;;;;;;;;;;;;;;;;;;;39981:48;;40067:11;40042:10;40053;40042:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40178:10;40147:15;:28;40163:11;40147:28;;;;;;;;;;;:41;;;;40319:15;:24;40335:7;40319:24;;;;;;;;;;;40312:31;;;40354:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39299:1079;;;;:::o;36803:221::-;36888:14;36905:20;36922:2;36905:16;:20::i;:::-;36888:37;;36963:7;36936:12;:16;36949:2;36936:16;;;;;;;;;;;;;;;:24;36953:6;36936:24;;;;;;;;;;;:34;;;;37010:6;36981:17;:26;36999:7;36981:26;;;;;;;;;;;:35;;;;36803:221;;;:::o;7982:422::-;8042:4;8250:12;8361:7;8349:20;8341:28;;8395:1;8388:4;:8;8381:15;;;7982:422;;;:::o;28084:382::-;28178:1;28164:16;;:2;:16;;;;28156:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28237:16;28245:7;28237;:16::i;:::-;28236:17;28228:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28299:45;28328:1;28332:2;28336:7;28299:20;:45::i;:::-;28374:1;28357:9;:13;28367:2;28357:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28405:2;28386:7;:16;28394:7;28386:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28450:7;28446:2;28425:33;;28442:1;28425:33;;;;;;;;;;;;28084:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:143::-;;2097:6;2091:13;2082:22;;2113:33;2140:5;2113:33;:::i;:::-;2072:80;;;;:::o;2158:262::-;;2266:2;2254:9;2245:7;2241:23;2237:32;2234:2;;;2282:1;2279;2272:12;2234:2;2325:1;2350:53;2395:7;2386:6;2375:9;2371:22;2350:53;:::i;:::-;2340:63;;2296:117;2224:196;;;;:::o;2426:407::-;;;2551:2;2539:9;2530:7;2526:23;2522:32;2519:2;;;2567:1;2564;2557:12;2519:2;2610:1;2635:53;2680:7;2671:6;2660:9;2656:22;2635:53;:::i;:::-;2625:63;;2581:117;2737:2;2763:53;2808:7;2799:6;2788:9;2784:22;2763:53;:::i;:::-;2753:63;;2708:118;2509:324;;;;;:::o;2839:552::-;;;;2981:2;2969:9;2960:7;2956:23;2952:32;2949:2;;;2997:1;2994;2987:12;2949:2;3040:1;3065:53;3110:7;3101:6;3090:9;3086:22;3065:53;:::i;:::-;3055:63;;3011:117;3167:2;3193:53;3238:7;3229:6;3218:9;3214:22;3193:53;:::i;:::-;3183:63;;3138:118;3295:2;3321:53;3366:7;3357:6;3346:9;3342:22;3321:53;:::i;:::-;3311:63;;3266:118;2939:452;;;;;:::o;3397:809::-;;;;;3565:3;3553:9;3544:7;3540:23;3536:33;3533:2;;;3582:1;3579;3572:12;3533:2;3625:1;3650:53;3695:7;3686:6;3675:9;3671:22;3650:53;:::i;:::-;3640:63;;3596:117;3752:2;3778:53;3823:7;3814:6;3803:9;3799:22;3778:53;:::i;:::-;3768:63;;3723:118;3880:2;3906:53;3951:7;3942:6;3931:9;3927:22;3906:53;:::i;:::-;3896:63;;3851:118;4036:2;4025:9;4021:18;4008:32;4067:18;4059:6;4056:30;4053:2;;;4099:1;4096;4089:12;4053:2;4127:62;4181:7;4172:6;4161:9;4157:22;4127:62;:::i;:::-;4117:72;;3979:220;3523:683;;;;;;;:::o;4212:401::-;;;4334:2;4322:9;4313:7;4309:23;4305:32;4302:2;;;4350:1;4347;4340:12;4302:2;4393:1;4418:53;4463:7;4454:6;4443:9;4439:22;4418:53;:::i;:::-;4408:63;;4364:117;4520:2;4546:50;4588:7;4579:6;4568:9;4564:22;4546:50;:::i;:::-;4536:60;;4491:115;4292:321;;;;;:::o;4619:407::-;;;4744:2;4732:9;4723:7;4719:23;4715:32;4712:2;;;4760:1;4757;4750:12;4712:2;4803:1;4828:53;4873:7;4864:6;4853:9;4849:22;4828:53;:::i;:::-;4818:63;;4774:117;4930:2;4956:53;5001:7;4992:6;4981:9;4977:22;4956:53;:::i;:::-;4946:63;;4901:118;4702:324;;;;;:::o;5032:260::-;;5139:2;5127:9;5118:7;5114:23;5110:32;5107:2;;;5155:1;5152;5145:12;5107:2;5198:1;5223:52;5267:7;5258:6;5247:9;5243:22;5223:52;:::i;:::-;5213:62;;5169:116;5097:195;;;;:::o;5298:282::-;;5416:2;5404:9;5395:7;5391:23;5387:32;5384:2;;;5432:1;5429;5422:12;5384:2;5475:1;5500:63;5555:7;5546:6;5535:9;5531:22;5500:63;:::i;:::-;5490:73;;5446:127;5374:206;;;;:::o;5586:375::-;;5704:2;5692:9;5683:7;5679:23;5675:32;5672:2;;;5720:1;5717;5710:12;5672:2;5791:1;5780:9;5776:17;5763:31;5821:18;5813:6;5810:30;5807:2;;;5853:1;5850;5843:12;5807:2;5881:63;5936:7;5927:6;5916:9;5912:22;5881:63;:::i;:::-;5871:73;;5734:220;5662:299;;;;:::o;5967:262::-;;6075:2;6063:9;6054:7;6050:23;6046:32;6043:2;;;6091:1;6088;6081:12;6043:2;6134:1;6159:53;6204:7;6195:6;6184:9;6180:22;6159:53;:::i;:::-;6149:63;;6105:117;6033:196;;;;:::o;6235:284::-;;6354:2;6342:9;6333:7;6329:23;6325:32;6322:2;;;6370:1;6367;6360:12;6322:2;6413:1;6438:64;6494:7;6485:6;6474:9;6470:22;6438:64;:::i;:::-;6428:74;;6384:128;6312:207;;;;:::o;6525:407::-;;;6650:2;6638:9;6629:7;6625:23;6621:32;6618:2;;;6666:1;6663;6656:12;6618:2;6709:1;6734:53;6779:7;6770:6;6759:9;6755:22;6734:53;:::i;:::-;6724:63;;6680:117;6836:2;6862:53;6907:7;6898:6;6887:9;6883:22;6862:53;:::i;:::-;6852:63;;6807:118;6608:324;;;;;:::o;6938:118::-;7025:24;7043:5;7025:24;:::i;:::-;7020:3;7013:37;7003:53;;:::o;7062:109::-;7143:21;7158:5;7143:21;:::i;:::-;7138:3;7131:34;7121:50;;:::o;7177:360::-;;7291:38;7323:5;7291:38;:::i;:::-;7345:70;7408:6;7403:3;7345:70;:::i;:::-;7338:77;;7424:52;7469:6;7464:3;7457:4;7450:5;7446:16;7424:52;:::i;:::-;7501:29;7523:6;7501:29;:::i;:::-;7496:3;7492:39;7485:46;;7267:270;;;;;:::o;7543:364::-;;7659:39;7692:5;7659:39;:::i;:::-;7714:71;7778:6;7773:3;7714:71;:::i;:::-;7707:78;;7794:52;7839:6;7834:3;7827:4;7820:5;7816:16;7794:52;:::i;:::-;7871:29;7893:6;7871:29;:::i;:::-;7866:3;7862:39;7855:46;;7635:272;;;;;:::o;7913:377::-;;8047:39;8080:5;8047:39;:::i;:::-;8102:89;8184:6;8179:3;8102:89;:::i;:::-;8095:96;;8200:52;8245:6;8240:3;8233:4;8226:5;8222:16;8200:52;:::i;:::-;8277:6;8272:3;8268:16;8261:23;;8023:267;;;;;:::o;8296:366::-;;8459:67;8523:2;8518:3;8459:67;:::i;:::-;8452:74;;8535:93;8624:3;8535:93;:::i;:::-;8653:2;8648:3;8644:12;8637:19;;8442:220;;;:::o;8668:366::-;;8831:67;8895:2;8890:3;8831:67;:::i;:::-;8824:74;;8907:93;8996:3;8907:93;:::i;:::-;9025:2;9020:3;9016:12;9009:19;;8814:220;;;:::o;9040:366::-;;9203:67;9267:2;9262:3;9203:67;:::i;:::-;9196:74;;9279:93;9368:3;9279:93;:::i;:::-;9397:2;9392:3;9388:12;9381:19;;9186:220;;;:::o;9412:366::-;;9575:67;9639:2;9634:3;9575:67;:::i;:::-;9568:74;;9651:93;9740:3;9651:93;:::i;:::-;9769:2;9764:3;9760:12;9753:19;;9558:220;;;:::o;9784:366::-;;9947:67;10011:2;10006:3;9947:67;:::i;:::-;9940:74;;10023:93;10112:3;10023:93;:::i;:::-;10141:2;10136:3;10132:12;10125:19;;9930:220;;;:::o;10156:366::-;;10319:67;10383:2;10378:3;10319:67;:::i;:::-;10312:74;;10395:93;10484:3;10395:93;:::i;:::-;10513:2;10508:3;10504:12;10497:19;;10302:220;;;:::o;10528:366::-;;10691:67;10755:2;10750:3;10691:67;:::i;:::-;10684:74;;10767:93;10856:3;10767:93;:::i;:::-;10885:2;10880:3;10876:12;10869:19;;10674:220;;;:::o;10900:366::-;;11063:67;11127:2;11122:3;11063:67;:::i;:::-;11056:74;;11139:93;11228:3;11139:93;:::i;:::-;11257:2;11252:3;11248:12;11241:19;;11046:220;;;:::o;11272:366::-;;11435:67;11499:2;11494:3;11435:67;:::i;:::-;11428:74;;11511:93;11600:3;11511:93;:::i;:::-;11629:2;11624:3;11620:12;11613:19;;11418:220;;;:::o;11644:366::-;;11807:67;11871:2;11866:3;11807:67;:::i;:::-;11800:74;;11883:93;11972:3;11883:93;:::i;:::-;12001:2;11996:3;11992:12;11985:19;;11790:220;;;:::o;12016:366::-;;12179:67;12243:2;12238:3;12179:67;:::i;:::-;12172:74;;12255:93;12344:3;12255:93;:::i;:::-;12373:2;12368:3;12364:12;12357:19;;12162:220;;;:::o;12388:366::-;;12551:67;12615:2;12610:3;12551:67;:::i;:::-;12544:74;;12627:93;12716:3;12627:93;:::i;:::-;12745:2;12740:3;12736:12;12729:19;;12534:220;;;:::o;12760:366::-;;12923:67;12987:2;12982:3;12923:67;:::i;:::-;12916:74;;12999:93;13088:3;12999:93;:::i;:::-;13117:2;13112:3;13108:12;13101:19;;12906:220;;;:::o;13132:366::-;;13295:67;13359:2;13354:3;13295:67;:::i;:::-;13288:74;;13371:93;13460:3;13371:93;:::i;:::-;13489:2;13484:3;13480:12;13473:19;;13278:220;;;:::o;13504:366::-;;13667:67;13731:2;13726:3;13667:67;:::i;:::-;13660:74;;13743:93;13832:3;13743:93;:::i;:::-;13861:2;13856:3;13852:12;13845:19;;13650:220;;;:::o;13876:366::-;;14039:67;14103:2;14098:3;14039:67;:::i;:::-;14032:74;;14115:93;14204:3;14115:93;:::i;:::-;14233:2;14228:3;14224:12;14217:19;;14022:220;;;:::o;14248:366::-;;14411:67;14475:2;14470:3;14411:67;:::i;:::-;14404:74;;14487:93;14576:3;14487:93;:::i;:::-;14605:2;14600:3;14596:12;14589:19;;14394:220;;;:::o;14620:366::-;;14783:67;14847:2;14842:3;14783:67;:::i;:::-;14776:74;;14859:93;14948:3;14859:93;:::i;:::-;14977:2;14972:3;14968:12;14961:19;;14766:220;;;:::o;14992:366::-;;15155:67;15219:2;15214:3;15155:67;:::i;:::-;15148:74;;15231:93;15320:3;15231:93;:::i;:::-;15349:2;15344:3;15340:12;15333:19;;15138:220;;;:::o;15364:366::-;;15527:67;15591:2;15586:3;15527:67;:::i;:::-;15520:74;;15603:93;15692:3;15603:93;:::i;:::-;15721:2;15716:3;15712:12;15705:19;;15510:220;;;:::o;15736:366::-;;15899:67;15963:2;15958:3;15899:67;:::i;:::-;15892:74;;15975:93;16064:3;15975:93;:::i;:::-;16093:2;16088:3;16084:12;16077:19;;15882:220;;;:::o;16108:366::-;;16271:67;16335:2;16330:3;16271:67;:::i;:::-;16264:74;;16347:93;16436:3;16347:93;:::i;:::-;16465:2;16460:3;16456:12;16449:19;;16254:220;;;:::o;16480:366::-;;16643:67;16707:2;16702:3;16643:67;:::i;:::-;16636:74;;16719:93;16808:3;16719:93;:::i;:::-;16837:2;16832:3;16828:12;16821:19;;16626:220;;;:::o;16852:366::-;;17015:67;17079:2;17074:3;17015:67;:::i;:::-;17008:74;;17091:93;17180:3;17091:93;:::i;:::-;17209:2;17204:3;17200:12;17193:19;;16998:220;;;:::o;17224:118::-;17311:24;17329:5;17311:24;:::i;:::-;17306:3;17299:37;17289:53;;:::o;17348:435::-;;17550:95;17641:3;17632:6;17550:95;:::i;:::-;17543:102;;17662:95;17753:3;17744:6;17662:95;:::i;:::-;17655:102;;17774:3;17767:10;;17532:251;;;;;:::o;17789:222::-;;17920:2;17909:9;17905:18;17897:26;;17933:71;18001:1;17990:9;17986:17;17977:6;17933:71;:::i;:::-;17887:124;;;;:::o;18017:640::-;;18250:3;18239:9;18235:19;18227:27;;18264:71;18332:1;18321:9;18317:17;18308:6;18264:71;:::i;:::-;18345:72;18413:2;18402:9;18398:18;18389:6;18345:72;:::i;:::-;18427;18495:2;18484:9;18480:18;18471:6;18427:72;:::i;:::-;18546:9;18540:4;18536:20;18531:2;18520:9;18516:18;18509:48;18574:76;18645:4;18636:6;18574:76;:::i;:::-;18566:84;;18217:440;;;;;;;:::o;18663:332::-;;18822:2;18811:9;18807:18;18799:26;;18835:71;18903:1;18892:9;18888:17;18879:6;18835:71;:::i;:::-;18916:72;18984:2;18973:9;18969:18;18960:6;18916:72;:::i;:::-;18789:206;;;;;:::o;19001:210::-;;19126:2;19115:9;19111:18;19103:26;;19139:65;19201:1;19190:9;19186:17;19177:6;19139:65;:::i;:::-;19093:118;;;;:::o;19217:313::-;;19368:2;19357:9;19353:18;19345:26;;19417:9;19411:4;19407:20;19403:1;19392:9;19388:17;19381:47;19445:78;19518:4;19509:6;19445:78;:::i;:::-;19437:86;;19335:195;;;;:::o;19536:419::-;;19740:2;19729:9;19725:18;19717:26;;19789:9;19783:4;19779:20;19775:1;19764:9;19760:17;19753:47;19817:131;19943:4;19817:131;:::i;:::-;19809:139;;19707:248;;;:::o;19961:419::-;;20165:2;20154:9;20150:18;20142:26;;20214:9;20208:4;20204:20;20200:1;20189:9;20185:17;20178:47;20242:131;20368:4;20242:131;:::i;:::-;20234:139;;20132:248;;;:::o;20386:419::-;;20590:2;20579:9;20575:18;20567:26;;20639:9;20633:4;20629:20;20625:1;20614:9;20610:17;20603:47;20667:131;20793:4;20667:131;:::i;:::-;20659:139;;20557:248;;;:::o;20811:419::-;;21015:2;21004:9;21000:18;20992:26;;21064:9;21058:4;21054:20;21050:1;21039:9;21035:17;21028:47;21092:131;21218:4;21092:131;:::i;:::-;21084:139;;20982:248;;;:::o;21236:419::-;;21440:2;21429:9;21425:18;21417:26;;21489:9;21483:4;21479:20;21475:1;21464:9;21460:17;21453:47;21517:131;21643:4;21517:131;:::i;:::-;21509:139;;21407:248;;;:::o;21661:419::-;;21865:2;21854:9;21850:18;21842:26;;21914:9;21908:4;21904:20;21900:1;21889:9;21885:17;21878:47;21942:131;22068:4;21942:131;:::i;:::-;21934:139;;21832:248;;;:::o;22086:419::-;;22290:2;22279:9;22275:18;22267:26;;22339:9;22333:4;22329:20;22325:1;22314:9;22310:17;22303:47;22367:131;22493:4;22367:131;:::i;:::-;22359:139;;22257:248;;;:::o;22511:419::-;;22715:2;22704:9;22700:18;22692:26;;22764:9;22758:4;22754:20;22750:1;22739:9;22735:17;22728:47;22792:131;22918:4;22792:131;:::i;:::-;22784:139;;22682:248;;;:::o;22936:419::-;;23140:2;23129:9;23125:18;23117:26;;23189:9;23183:4;23179:20;23175:1;23164:9;23160:17;23153:47;23217:131;23343:4;23217:131;:::i;:::-;23209:139;;23107:248;;;:::o;23361:419::-;;23565:2;23554:9;23550:18;23542:26;;23614:9;23608:4;23604:20;23600:1;23589:9;23585:17;23578:47;23642:131;23768:4;23642:131;:::i;:::-;23634:139;;23532:248;;;:::o;23786:419::-;;23990:2;23979:9;23975:18;23967:26;;24039:9;24033:4;24029:20;24025:1;24014:9;24010:17;24003:47;24067:131;24193:4;24067:131;:::i;:::-;24059:139;;23957:248;;;:::o;24211:419::-;;24415:2;24404:9;24400:18;24392:26;;24464:9;24458:4;24454:20;24450:1;24439:9;24435:17;24428:47;24492:131;24618:4;24492:131;:::i;:::-;24484:139;;24382:248;;;:::o;24636:419::-;;24840:2;24829:9;24825:18;24817:26;;24889:9;24883:4;24879:20;24875:1;24864:9;24860:17;24853:47;24917:131;25043:4;24917:131;:::i;:::-;24909:139;;24807:248;;;:::o;25061:419::-;;25265:2;25254:9;25250:18;25242:26;;25314:9;25308:4;25304:20;25300:1;25289:9;25285:17;25278:47;25342:131;25468:4;25342:131;:::i;:::-;25334:139;;25232:248;;;:::o;25486:419::-;;25690:2;25679:9;25675:18;25667:26;;25739:9;25733:4;25729:20;25725:1;25714:9;25710:17;25703:47;25767:131;25893:4;25767:131;:::i;:::-;25759:139;;25657:248;;;:::o;25911:419::-;;26115:2;26104:9;26100:18;26092:26;;26164:9;26158:4;26154:20;26150:1;26139:9;26135:17;26128:47;26192:131;26318:4;26192:131;:::i;:::-;26184:139;;26082:248;;;:::o;26336:419::-;;26540:2;26529:9;26525:18;26517:26;;26589:9;26583:4;26579:20;26575:1;26564:9;26560:17;26553:47;26617:131;26743:4;26617:131;:::i;:::-;26609:139;;26507:248;;;:::o;26761:419::-;;26965:2;26954:9;26950:18;26942:26;;27014:9;27008:4;27004:20;27000:1;26989:9;26985:17;26978:47;27042:131;27168:4;27042:131;:::i;:::-;27034:139;;26932:248;;;:::o;27186:419::-;;27390:2;27379:9;27375:18;27367:26;;27439:9;27433:4;27429:20;27425:1;27414:9;27410:17;27403:47;27467:131;27593:4;27467:131;:::i;:::-;27459:139;;27357:248;;;:::o;27611:419::-;;27815:2;27804:9;27800:18;27792:26;;27864:9;27858:4;27854:20;27850:1;27839:9;27835:17;27828:47;27892:131;28018:4;27892:131;:::i;:::-;27884:139;;27782:248;;;:::o;28036:419::-;;28240:2;28229:9;28225:18;28217:26;;28289:9;28283:4;28279:20;28275:1;28264:9;28260:17;28253:47;28317:131;28443:4;28317:131;:::i;:::-;28309:139;;28207:248;;;:::o;28461:419::-;;28665:2;28654:9;28650:18;28642:26;;28714:9;28708:4;28704:20;28700:1;28689:9;28685:17;28678:47;28742:131;28868:4;28742:131;:::i;:::-;28734:139;;28632:248;;;:::o;28886:419::-;;29090:2;29079:9;29075:18;29067:26;;29139:9;29133:4;29129:20;29125:1;29114:9;29110:17;29103:47;29167:131;29293:4;29167:131;:::i;:::-;29159:139;;29057:248;;;:::o;29311:419::-;;29515:2;29504:9;29500:18;29492:26;;29564:9;29558:4;29554:20;29550:1;29539:9;29535:17;29528:47;29592:131;29718:4;29592:131;:::i;:::-;29584:139;;29482:248;;;:::o;29736:222::-;;29867:2;29856:9;29852:18;29844:26;;29880:71;29948:1;29937:9;29933:17;29924:6;29880:71;:::i;:::-;29834:124;;;;:::o;29964:129::-;;30025:20;;:::i;:::-;30015:30;;30054:33;30082:4;30074:6;30054:33;:::i;:::-;30005:88;;;:::o;30099:75::-;;30165:2;30159:9;30149:19;;30139:35;:::o;30180:307::-;;30331:18;30323:6;30320:30;30317:2;;;30353:18;;:::i;:::-;30317:2;30391:29;30413:6;30391:29;:::i;:::-;30383:37;;30475:4;30469;30465:15;30457:23;;30246:241;;;:::o;30493:308::-;;30645:18;30637:6;30634:30;30631:2;;;30667:18;;:::i;:::-;30631:2;30705:29;30727:6;30705:29;:::i;:::-;30697:37;;30789:4;30783;30779:15;30771:23;;30560:241;;;:::o;30807:98::-;;30892:5;30886:12;30876:22;;30865:40;;;:::o;30911:99::-;;30997:5;30991:12;30981:22;;30970:40;;;:::o;31016:168::-;;31133:6;31128:3;31121:19;31173:4;31168:3;31164:14;31149:29;;31111:73;;;;:::o;31190:169::-;;31308:6;31303:3;31296:19;31348:4;31343:3;31339:14;31324:29;;31286:73;;;;:::o;31365:148::-;;31504:3;31489:18;;31479:34;;;;:::o;31519:305::-;;31578:20;31596:1;31578:20;:::i;:::-;31573:25;;31612:20;31630:1;31612:20;:::i;:::-;31607:25;;31766:1;31698:66;31694:74;31691:1;31688:81;31685:2;;;31772:18;;:::i;:::-;31685:2;31816:1;31813;31809:9;31802:16;;31563:261;;;;:::o;31830:185::-;;31887:20;31905:1;31887:20;:::i;:::-;31882:25;;31921:20;31939:1;31921:20;:::i;:::-;31916:25;;31960:1;31950:2;;31965:18;;:::i;:::-;31950:2;32007:1;32004;32000:9;31995:14;;31872:143;;;;:::o;32021:191::-;;32081:20;32099:1;32081:20;:::i;:::-;32076:25;;32115:20;32133:1;32115:20;:::i;:::-;32110:25;;32154:1;32151;32148:8;32145:2;;;32159:18;;:::i;:::-;32145:2;32204:1;32201;32197:9;32189:17;;32066:146;;;;:::o;32218:96::-;;32284:24;32302:5;32284:24;:::i;:::-;32273:35;;32263:51;;;:::o;32320:90::-;;32397:5;32390:13;32383:21;32372:32;;32362:48;;;:::o;32416:149::-;;32492:66;32485:5;32481:78;32470:89;;32460:105;;;:::o;32571:126::-;;32648:42;32641:5;32637:54;32626:65;;32616:81;;;:::o;32703:77::-;;32769:5;32758:16;;32748:32;;;:::o;32786:154::-;32870:6;32865:3;32860;32847:30;32932:1;32923:6;32918:3;32914:16;32907:27;32837:103;;;:::o;32946:307::-;33014:1;33024:113;33038:6;33035:1;33032:13;33024:113;;;33123:1;33118:3;33114:11;33108:18;33104:1;33099:3;33095:11;33088:39;33060:2;33057:1;33053:10;33048:15;;33024:113;;;33155:6;33152:1;33149:13;33146:2;;;33235:1;33226:6;33221:3;33217:16;33210:27;33146:2;32995:258;;;;:::o;33259:320::-;;33340:1;33334:4;33330:12;33320:22;;33387:1;33381:4;33377:12;33408:18;33398:2;;33464:4;33456:6;33452:17;33442:27;;33398:2;33526;33518:6;33515:14;33495:18;33492:38;33489:2;;;33545:18;;:::i;:::-;33489:2;33310:269;;;;:::o;33585:281::-;33668:27;33690:4;33668:27;:::i;:::-;33660:6;33656:40;33798:6;33786:10;33783:22;33762:18;33750:10;33747:34;33744:62;33741:2;;;33809:18;;:::i;:::-;33741:2;33849:10;33845:2;33838:22;33628:238;;;:::o;33872:233::-;;33934:24;33952:5;33934:24;:::i;:::-;33925:33;;33980:66;33973:5;33970:77;33967:2;;;34050:18;;:::i;:::-;33967:2;34097:1;34090:5;34086:13;34079:20;;33915:190;;;:::o;34111:176::-;;34160:20;34178:1;34160:20;:::i;:::-;34155:25;;34194:20;34212:1;34194:20;:::i;:::-;34189:25;;34233:1;34223:2;;34238:18;;:::i;:::-;34223:2;34279:1;34276;34272:9;34267:14;;34145:142;;;;:::o;34293:180::-;34341:77;34338:1;34331:88;34438:4;34435:1;34428:15;34462:4;34459:1;34452:15;34479:180;34527:77;34524:1;34517:88;34624:4;34621:1;34614:15;34648:4;34645:1;34638:15;34665:180;34713:77;34710:1;34703:88;34810:4;34807:1;34800:15;34834:4;34831:1;34824:15;34851:180;34899:77;34896:1;34889:88;34996:4;34993:1;34986:15;35020:4;35017:1;35010:15;35037:102;;35129:2;35125:7;35120:2;35113:5;35109:14;35105:28;35095:38;;35085:54;;;:::o;35145:230::-;35285:34;35281:1;35273:6;35269:14;35262:58;35354:13;35349:2;35341:6;35337:15;35330:38;35251:124;:::o;35381:237::-;35521:34;35517:1;35509:6;35505:14;35498:58;35590:20;35585:2;35577:6;35573:15;35566:45;35487:131;:::o;35624:225::-;35764:34;35760:1;35752:6;35748:14;35741:58;35833:8;35828:2;35820:6;35816:15;35809:33;35730:119;:::o;35855:178::-;35995:30;35991:1;35983:6;35979:14;35972:54;35961:72;:::o;36039:223::-;36179:34;36175:1;36167:6;36163:14;36156:58;36248:6;36243:2;36235:6;36231:15;36224:31;36145:117;:::o;36268:175::-;36408:27;36404:1;36396:6;36392:14;36385:51;36374:69;:::o;36449:231::-;36589:34;36585:1;36577:6;36573:14;36566:58;36658:14;36653:2;36645:6;36641:15;36634:39;36555:125;:::o;36686:236::-;36826:34;36822:1;36814:6;36810:14;36803:58;36895:19;36890:2;36882:6;36878:15;36871:44;36792:130;:::o;36928:181::-;37068:33;37064:1;37056:6;37052:14;37045:57;37034:75;:::o;37115:243::-;37255:34;37251:1;37243:6;37239:14;37232:58;37324:26;37319:2;37311:6;37307:15;37300:51;37221:137;:::o;37364:305::-;37504:34;37500:1;37492:6;37488:14;37481:58;37573:34;37568:2;37560:6;37556:15;37549:59;37642:19;37637:2;37629:6;37625:15;37618:44;37470:199;:::o;37675:229::-;37815:34;37811:1;37803:6;37799:14;37792:58;37884:12;37879:2;37871:6;37867:15;37860:37;37781:123;:::o;37910:228::-;38050:34;38046:1;38038:6;38034:14;38027:58;38119:11;38114:2;38106:6;38102:15;38095:36;38016:122;:::o;38144:182::-;38284:34;38280:1;38272:6;38268:14;38261:58;38250:76;:::o;38332:231::-;38472:34;38468:1;38460:6;38456:14;38449:58;38541:14;38536:2;38528:6;38524:15;38517:39;38438:125;:::o;38569:182::-;38709:34;38705:1;38697:6;38693:14;38686:58;38675:76;:::o;38757:225::-;38897:34;38893:1;38885:6;38881:14;38874:58;38966:8;38961:2;38953:6;38949:15;38942:33;38863:119;:::o;38988:228::-;39128:34;39124:1;39116:6;39112:14;39105:58;39197:11;39192:2;39184:6;39180:15;39173:36;39094:122;:::o;39222:234::-;39362:34;39358:1;39350:6;39346:14;39339:58;39431:17;39426:2;39418:6;39414:15;39407:42;39328:128;:::o;39462:220::-;39602:34;39598:1;39590:6;39586:14;39579:58;39671:3;39666:2;39658:6;39654:15;39647:28;39568:114;:::o;39688:220::-;39828:34;39824:1;39816:6;39812:14;39805:58;39897:3;39892:2;39884:6;39880:15;39873:28;39794:114;:::o;39914:236::-;40054:34;40050:1;40042:6;40038:14;40031:58;40123:19;40118:2;40110:6;40106:15;40099:44;40020:130;:::o;40156:231::-;40296:34;40292:1;40284:6;40280:14;40273:58;40365:14;40360:2;40352:6;40348:15;40341:39;40262:125;:::o;40393:224::-;40533:34;40529:1;40521:6;40517:14;40510:58;40602:7;40597:2;40589:6;40585:15;40578:32;40499:118;:::o;40623:122::-;40696:24;40714:5;40696:24;:::i;:::-;40689:5;40686:35;40676:2;;40735:1;40732;40725:12;40676:2;40666:79;:::o;40751:116::-;40821:21;40836:5;40821:21;:::i;:::-;40814:5;40811:32;40801:2;;40857:1;40854;40847:12;40801:2;40791:76;:::o;40873:120::-;40945:23;40962:5;40945:23;:::i;:::-;40938:5;40935:34;40925:2;;40983:1;40980;40973:12;40925:2;40915:78;:::o;40999:122::-;41072:24;41090:5;41072:24;:::i;:::-;41065:5;41062:35;41052:2;;41111:1;41108;41101:12;41052:2;41042:79;:::o

Swarm Source

ipfs://f651fc62181842e25e5ac080c85da55f2617640a85fc97730d8537e17a0e28e7
Loading...
Loading
Loading...
Loading
[ 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.