Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
912
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Str8fireOGPass
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-05-29 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /// @title Str8fire OG Pass /// @author Andre Costa @ LuxLabs.io // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (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; address internal _oldOwner; uint256 internal lastOwnershipTransfer; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Returns the address of the previous owner. */ function oldOwner() public view virtual returns (address) { return _oldOwner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner_ = _owner; _oldOwner = oldOwner_; _owner = newOwner; lastOwnershipTransfer = block.timestamp; emit OwnershipTransferred(oldOwner_, newOwner); } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); 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) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden 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 token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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 from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-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. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } contract Str8fireOGPass is ERC721, Ownable { /// @notice The base uri of the project string public baseURI; /// @notice The collection's max supply uint256 public maxSupply = 1200; /// @notice Total reserved uint256 public reserved = 50; uint256 public reservedMinted; /// @notice Total guaranteed mint count uint256 public guaranteed; /// @dev Merkle tree root hash for guaranteed list bytes32 public rootForGuaranteed; /// @dev Merkle tree root hash for allowed list bytes32 public rootForOversubscribed; /// @dev Mapping to check if an address has already minted to avoid double mints on allow list mints mapping(address => bool) public mintedOnGuaranteed; mapping(address => bool) public mintedOnOversubscribed; /// @dev Counters library to track token id and counts using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; Counters.Counter private _guaranteedAllowListMintedCounter; Counters.Counter private _oversubscribedAllowListMintedCounter; /// @dev Different states of minting enum MintState { PAUSED, // Minting is paused GUARANTEED, // Guaranteed allow list OVERSUBSCRIBED, // General allow list PUBLIC // Open to public } MintState public mintState = MintState.PAUSED; constructor() ERC721("Str8fire OG Pass", "SOGP") { baseURI = "ipfs://QmXMy1c7bJTP7AnRWySNnPcfgn1qGNUSPhsc3hX8HXA2i6/"; } /// Base uri functions ///@notice Returns the base uri ///@return Base uri function _baseURI() internal view override returns (string memory) { return baseURI; } ///@notice Sets a new base uri ///@dev Only callable by owner ///@param newBaseURI The new base uri function setBaseURI(string memory newBaseURI) external onlyOwner { baseURI = newBaseURI; } ///@notice Returns the token uri ///@dev Updated to include json ///@param tokenId Token id function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(tokenId <= _tokenIdCounter.current(), "URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string.concat(baseURI, Strings.toString(tokenId), ".json") : ""; } /// Minting functions ///@notice Mints nft token for allowed list addresses ///@dev Uses Merkle tree proof ///@param proof The Merkle tree proof of the allow list address function mintAllowlist(bytes32[] calldata proof) external { /// Check if the sale is paused require(mintState == MintState.GUARANTEED || mintState == MintState.OVERSUBSCRIBED, "Not in allowlist minting states"); require(_tokenIdCounter.current() < maxSupply, "Max supply minted"); /// Check if user is on the allow list bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); /// Update the root based on the state bytes32 root; // If current state is for guaranteed mints, set to the guaranteed hash if (mintState == MintState.GUARANTEED) { /// Set the correct root hash root = rootForGuaranteed; /// Check that user has not minted on guaranteed list require(mintedOnGuaranteed[_msgSender()] == false, "User already minted on guaranteed list"); // Check there is sufficient guaranteed mint supply left require(totalGuaranteedAllowListMinted() < guaranteed, "Max guaranteed supply minted"); /// Increase the allow list minted count _guaranteedAllowListMintedCounter.increment(); /// Set that address has minted mintedOnGuaranteed[_msgSender()] = true; } // If current state is for oversubscribed, set to the oversubscribed hash if (mintState == MintState.OVERSUBSCRIBED) { /// Set the correct root hash root = rootForOversubscribed; /// Check that user has not minted on oversubscribed list require(mintedOnOversubscribed[_msgSender()] == false, "User already minted on oversubscribed list"); /// Check there is sufficient oversubscribed supply left /// Balance for oversubscribed mint = max supply minus reserved and guaranteed count require(totalOversubscribedAllowListMinted() < maxSupply - reserved - guaranteed, "Max allow list supply minted"); _oversubscribedAllowListMintedCounter.increment(); /// Set that address has minted mintedOnOversubscribed[_msgSender()] = true; } // Check the merkle proof require(MerkleProof.verify(proof, root, leaf), "Invalid proof"); /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(_msgSender(), tokenId); } ///@notice Mints a token to caller addresses function mintPublic() external { require(mintState == MintState.PUBLIC, "Public mint inactive"); /// Check balance of supply /// Total supply minus reserved require(_tokenIdCounter.current() < maxSupply - reserved, "Max available public supply minted"); /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(_msgSender(), tokenId); } ///@notice Mint from reserve supply ///@dev Only callable by owner ///@param to Array of addresses to receive airdrop function mintFromReserved(address to, uint256 amount) external onlyOwner { /// Check balance of supply require(amount + reservedMinted <= reserved, "Amount exceeds reserved supply"); for(uint i; i < amount;) { /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(to, tokenId); /// Unchecked i to save gas unchecked { i++; } } reservedMinted += amount; } /// Other view and admin functions /** * @param merkleRoot_ The new merkle root */ function setMerkleRootGuaranteed(bytes32 merkleRoot_) external onlyOwner { rootForGuaranteed = merkleRoot_; } /** * @param merkleRoot_ The new merkle root */ function setMerkleOversubscribed(bytes32 merkleRoot_) external onlyOwner { rootForOversubscribed = merkleRoot_; } ///@notice Returns the total number of nftes minted function totalMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _tokenIdCounter.current(); } ///@notice Returns the current number of guaranteed allow list minted function totalGuaranteedAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _guaranteedAllowListMintedCounter.current(); } ///@notice Returns the current number of oversubscribed allow list minted function totalOversubscribedAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _oversubscribedAllowListMintedCounter.current(); } ///@notice Returns the total allow list minted function totalAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _guaranteedAllowListMintedCounter.current() + _oversubscribedAllowListMintedCounter.current(); } /** * Set mint state. * @param mintState_ The new state of the contract. */ function setMintState(uint256 mintState_) external onlyOwner { require(mintState_ < 5, "Invalid State!"); if (mintState_ == 0) { mintState = MintState.PAUSED; } else if (mintState_ == 1) { mintState = MintState.GUARANTEED; } else if (mintState_ == 2) { mintState = MintState.OVERSUBSCRIBED; } else { mintState = MintState.PUBLIC; } } ///@notice Function to update guaranteed mint count ///@param count New guaranteed mint count function setGuaranteedCount(uint256 count) external onlyOwner { guaranteed = count; } ///@notice Function to update reserved mint count ///@param count New reserved mint count function setReservedCount(uint256 count) external onlyOwner { reserved = count; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":[{"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guaranteed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFromReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"enum Str8fireOGPass.MintState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnGuaranteed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnOversubscribed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForGuaranteed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForOversubscribed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setGuaranteedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleOversubscribed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootGuaranteed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintState_","type":"uint256"}],"name":"setMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setReservedCount","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGuaranteedAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOversubscribedAllowListMinted","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"}]
Contract Creation Code
60806040526104b0600a556032600b555f60155f6101000a81548160ff021916908360038111156200003657620000356200023b565b5b021790555034801562000047575f80fd5b506040518060400160405280601081526020017f5374723866697265204f472050617373000000000000000000000000000000008152506040518060400160405280600481526020017f534f475000000000000000000000000000000000000000000000000000000000815250815f9081620000c49190620004cc565b508060019081620000d69190620004cc565b505050620000f9620000ed6200012a60201b60201c565b6200013160201b60201c565b60405180606001604052806036815260200162004ce36036913960099081620001239190620004cc565b50620005b0565b5f33905090565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620002e457607f821691505b602082108103620002fa57620002f96200029f565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200035e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000321565b6200036a868362000321565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620003b4620003ae620003a88462000382565b6200038b565b62000382565b9050919050565b5f819050919050565b620003cf8362000394565b620003e7620003de82620003bb565b8484546200032d565b825550505050565b5f90565b620003fd620003ef565b6200040a818484620003c4565b505050565b5b818110156200043157620004255f82620003f3565b60018101905062000410565b5050565b601f82111562000480576200044a8162000300565b620004558462000312565b8101602085101562000465578190505b6200047d620004748562000312565b8301826200040f565b50505b505050565b5f82821c905092915050565b5f620004a25f198460080262000485565b1980831691505092915050565b5f620004bc838362000491565b9150826002028217905092915050565b620004d78262000268565b67ffffffffffffffff811115620004f357620004f262000272565b5b620004ff8254620002cc565b6200050c82828562000435565b5f60209050601f83116001811462000542575f84156200052d578287015190505b620005398582620004af565b865550620005a8565b601f198416620005528662000300565b5f5b828110156200057b5784890151825560018201915060208501945060208101905062000554565b868310156200059b578489015162000597601f89168262000491565b8355505b6001600288020188555050505b505050505050565b61472580620005be5f395ff3fe608060405234801561000f575f80fd5b5060043610610246575f3560e01c8063893807aa11610139578063c87b56dd116100b6578063f20423141161007a578063f2042314146106b4578063f2fde38b146106d2578063f487404f146106ee578063f9c957d81461070c578063fe60d12c1461072857610246565b8063c87b56dd146105fa578063d371f76b1461062a578063d5abeb0114610648578063e921dad214610666578063e985e9c51461068457610246565b8063a2309ff8116100fd578063a2309ff814610556578063ad8c3f3314610574578063b242223214610590578063b88d4fde146105c0578063c051e38a146105dc57610246565b8063893807aa146104c45780638c874ebd146104f45780638da5cb5b146104fe57806395d89b411461051c578063a22cb4651461053a57610246565b806335d5959a116101c75780636352211e1161018b5780636352211e146104205780636c0360eb146104505780636c96b0831461046e57806370a082311461048a578063715018a6146104ba57610246565b806335d5959a146103905780633c186018146103ac57806342842e0e146103ca5780634f297ccc146103e657806355f804b31461040457610246565b80630bb862d11161020e5780630bb862d11461030057806316f9b7071461031c57806323b872dd146103385780632dc7b8551461035457806332f4681c1461037257610246565b806301ffc9a71461024a57806306fdde031461027a578063081812fc14610298578063084520b4146102c8578063095ea7b3146102e4575b5f80fd5b610264600480360381019061025f9190612be9565b610746565b6040516102719190612c2e565b60405180910390f35b610282610827565b60405161028f9190612cd1565b60405180910390f35b6102b260048036038101906102ad9190612d24565b6108b6565b6040516102bf9190612d8e565b60405180910390f35b6102e260048036038101906102dd9190612dd1565b6108f8565b005b6102fe60048036038101906102f99190612dd1565b610a1c565b005b61031a60048036038101906103159190612d24565b610b32565b005b61033660048036038101906103319190612d24565b610cc4565b005b610352600480360381019061034d9190612e0f565b610d4a565b005b61035c610daa565b6040516103699190612e77565b60405180910390f35b61037a610db0565b6040516103879190612e9f565b60405180910390f35b6103aa60048036038101906103a59190612ee2565b610db6565b005b6103b4610e3c565b6040516103c19190612e9f565b60405180910390f35b6103e460048036038101906103df9190612e0f565b610e60565b005b6103ee610e7f565b6040516103fb9190612e9f565b60405180910390f35b61041e60048036038101906104199190613039565b610e85565b005b61043a60048036038101906104359190612d24565b610f14565b6040516104479190612d8e565b60405180910390f35b610458610f98565b6040516104659190612cd1565b60405180910390f35b610488600480360381019061048391906130dd565b611024565b005b6104a4600480360381019061049f9190613128565b611536565b6040516104b19190612e9f565b60405180910390f35b6104c26115ea565b005b6104de60048036038101906104d99190613128565b611671565b6040516104eb9190612c2e565b60405180910390f35b6104fc61168e565b005b610506611787565b6040516105139190612d8e565b60405180910390f35b6105246117af565b6040516105319190612cd1565b60405180910390f35b610554600480360381019061054f919061317d565b61183f565b005b61055e611855565b60405161056b9190612e9f565b60405180910390f35b61058e60048036038101906105899190612ee2565b611865565b005b6105aa60048036038101906105a59190613128565b6118eb565b6040516105b79190612c2e565b60405180910390f35b6105da60048036038101906105d59190613259565b611908565b005b6105e461196a565b6040516105f1919061334c565b60405180910390f35b610614600480360381019061060f9190612d24565b61197c565b6040516106219190612cd1565b60405180910390f35b610632611a26565b60405161063f9190612e9f565b60405180910390f35b610650611a36565b60405161065d9190612e9f565b60405180910390f35b61066e611a3c565b60405161067b9190612e77565b60405180910390f35b61069e60048036038101906106999190613365565b611a42565b6040516106ab9190612c2e565b60405180910390f35b6106bc611ad0565b6040516106c99190612e9f565b60405180910390f35b6106ec60048036038101906106e79190613128565b611ae0565b005b6106f6611bd6565b6040516107039190612d8e565b60405180910390f35b61072660048036038101906107219190612d24565b611bfe565b005b610730611c84565b60405161073d9190612e9f565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610820575061081f82611c8a565b5b9050919050565b60605f8054610835906133d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610861906133d0565b80156108ac5780601f10610883576101008083540402835291602001916108ac565b820191905f5260205f20905b81548152906001019060200180831161088f57829003601f168201915b5050505050905090565b5f6108c082611cf3565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610900611d3e565b73ffffffffffffffffffffffffffffffffffffffff1661091e611787565b73ffffffffffffffffffffffffffffffffffffffff1614610974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096b9061344a565b60405180910390fd5b600b54600c54826109859190613495565b11156109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90613512565b60405180910390fd5b5f5b818110156109ff575f6109db6012611d45565b90506109e76012611d51565b6109f18482611d65565b8180600101925050506109c8565b5080600c5f828254610a119190613495565b925050819055505050565b5f610a2682610f14565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8d906135a0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ab5611d3e565b73ffffffffffffffffffffffffffffffffffffffff161480610ae45750610ae381610ade611d3e565b611a42565b5b610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a9061362e565b60405180910390fd5b610b2d8383611d82565b505050565b610b3a611d3e565b73ffffffffffffffffffffffffffffffffffffffff16610b58611787565b73ffffffffffffffffffffffffffffffffffffffff1614610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba59061344a565b60405180910390fd5b60058110610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be890613696565b60405180910390fd5b5f8103610c26575f60155f6101000a81548160ff02191690836003811115610c1c57610c1b6132d9565b5b0217905550610cc1565b60018103610c5d57600160155f6101000a81548160ff02191690836003811115610c5357610c526132d9565b5b0217905550610cc0565b60028103610c9457600260155f6101000a81548160ff02191690836003811115610c8a57610c896132d9565b5b0217905550610cbf565b600360155f6101000a81548160ff02191690836003811115610cb957610cb86132d9565b5b02179055505b5b5b50565b610ccc611d3e565b73ffffffffffffffffffffffffffffffffffffffff16610cea611787565b73ffffffffffffffffffffffffffffffffffffffff1614610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d379061344a565b60405180910390fd5b80600b8190555050565b610d5b610d55611d3e565b82611e38565b610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190613724565b60405180910390fd5b610da5838383611f14565b505050565b600e5481565b600d5481565b610dbe611d3e565b73ffffffffffffffffffffffffffffffffffffffff16610ddc611787565b73ffffffffffffffffffffffffffffffffffffffff1614610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e299061344a565b60405180910390fd5b80600e8190555050565b5f610e476014611d45565b610e516013611d45565b610e5b9190613495565b905090565b610e7a83838360405180602001604052805f815250611908565b505050565b600c5481565b610e8d611d3e565b73ffffffffffffffffffffffffffffffffffffffff16610eab611787565b73ffffffffffffffffffffffffffffffffffffffff1614610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef89061344a565b60405180910390fd5b8060099081610f1091906138df565b5050565b5f80610f1f83612212565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f86906139f8565b60405180910390fd5b80915050919050565b60098054610fa5906133d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd1906133d0565b801561101c5780601f10610ff35761010080835404028352916020019161101c565b820191905f5260205f20905b815481529060010190602001808311610fff57829003601f168201915b505050505081565b60016003811115611038576110376132d9565b5b60155f9054906101000a900460ff166003811115611059576110586132d9565b5b1480611097575060026003811115611074576110736132d9565b5b60155f9054906101000a900460ff166003811115611095576110946132d9565b5b145b6110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90613a60565b60405180910390fd5b600a546110e36012611d45565b10611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a90613ac8565b60405180910390fd5b5f61112c611d3e565b60405160200161113c9190613b2b565b6040516020818303038152906040528051906020012090505f60016003811115611169576111686132d9565b5b60155f9054906101000a900460ff16600381111561118a576111896132d9565b5b036112dc57600e5490505f151560105f6111a2611d3e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461122a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122190613bb5565b60405180910390fd5b600d54611235611ad0565b10611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c90613c1d565b60405180910390fd5b61127f6013611d51565b600160105f61128c611d3e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b600260038111156112f0576112ef6132d9565b5b60155f9054906101000a900460ff166003811115611311576113106132d9565b5b0361147d57600f5490505f151560115f611329611d3e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515146113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a890613cab565b60405180910390fd5b600d54600b54600a546113c49190613cc9565b6113ce9190613cc9565b6113d6611a26565b10611416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140d90613d46565b60405180910390fd5b6114206014611d51565b600160115f61142d611d3e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6114c88484808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050828461224b565b611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe90613dae565b60405180910390fd5b5f6115126012611d45565b905061151e6012611d51565b61152f611529611d3e565b82611d65565b5050505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90613e3c565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6115f2611d3e565b73ffffffffffffffffffffffffffffffffffffffff16611610611787565b73ffffffffffffffffffffffffffffffffffffffff1614611666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165d9061344a565b60405180910390fd5b61166f5f612261565b565b6011602052805f5260405f205f915054906101000a900460ff1681565b6003808111156116a1576116a06132d9565b5b60155f9054906101000a900460ff1660038111156116c2576116c16132d9565b5b14611702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f990613ea4565b60405180910390fd5b600b54600a546117129190613cc9565b61171c6012611d45565b1061175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175390613f32565b60405180910390fd5b5f6117676012611d45565b90506117736012611d51565b61178461177e611d3e565b82611d65565b50565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117be906133d0565b80601f01602080910402602001604051908101604052809291908181526020018280546117ea906133d0565b80156118355780601f1061180c57610100808354040283529160200191611835565b820191905f5260205f20905b81548152906001019060200180831161181857829003601f168201915b5050505050905090565b61185161184a611d3e565b838361236b565b5050565b5f6118606012611d45565b905090565b61186d611d3e565b73ffffffffffffffffffffffffffffffffffffffff1661188b611787565b73ffffffffffffffffffffffffffffffffffffffff16146118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d89061344a565b60405180910390fd5b80600f8190555050565b6010602052805f5260405f205f915054906101000a900460ff1681565b611919611913611d3e565b83611e38565b611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90613724565b60405180910390fd5b611964848484846124d2565b50505050565b60155f9054906101000a900460ff1681565b60606119886012611d45565b8211156119ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c190613f9a565b60405180910390fd5b5f600980546119d8906133d0565b9050116119f35760405180602001604052805f815250611a1f565b60096119fe8361252e565b604051602001611a0f929190614098565b6040516020818303038152906040525b9050919050565b5f611a316014611d45565b905090565b600a5481565b600f5481565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f611adb6013611d45565b905090565b611ae8611d3e565b73ffffffffffffffffffffffffffffffffffffffff16611b06611787565b73ffffffffffffffffffffffffffffffffffffffff1614611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b539061344a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc19061413a565b60405180910390fd5b611bd381612261565b50565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c06611d3e565b73ffffffffffffffffffffffffffffffffffffffff16611c24611787565b73ffffffffffffffffffffffffffffffffffffffff1614611c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c719061344a565b60405180910390fd5b80600d8190555050565b600b5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611cfc81612687565b611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d32906139f8565b60405180910390fd5b50565b5f33905090565b5f815f01549050919050565b6001815f015f828254019250508190555050565b611d7e828260405180602001604052805f8152506126c7565b5050565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611df283610f14565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f611e4282612687565b611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e78906141c8565b60405180910390fd5b5f611e8b83610f14565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ecd5750611ecc8185611a42565b5b80611f0b57508373ffffffffffffffffffffffffffffffffffffffff16611ef3846108b6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f3482610f14565b73ffffffffffffffffffffffffffffffffffffffff1614611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8190614256565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef906142e4565b60405180910390fd5b6120058383836001612721565b8273ffffffffffffffffffffffffffffffffffffffff1661202582610f14565b73ffffffffffffffffffffffffffffffffffffffff161461207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207290614256565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546120fb9190613cc9565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461214f9190613495565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461220d8383836001612727565b505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f82612257858461272d565b1490509392505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d09061434c565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124c59190612c2e565b60405180910390a3505050565b6124dd848484611f14565b6124e9848484846127dd565b612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f906143da565b60405180910390fd5b50505050565b60605f8203612574576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612682565b5f8290505f5b5f82146125a357808061258c906143f8565b915050600a8261259c919061446c565b915061257a565b5f8167ffffffffffffffff8111156125be576125bd612f15565b5b6040519080825280601f01601f1916602001820160405280156125f05781602001600182028036833780820191505090505b5090505b5f851461267b576001826126089190613cc9565b9150600a85612617919061449c565b60306126239190613495565b60f81b818381518110612639576126386144cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612674919061446c565b94506125f4565b8093505050505b919050565b5f8073ffffffffffffffffffffffffffffffffffffffff166126a883612212565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6126d1838361295f565b6126dd5f8484846127dd565b61271c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612713906143da565b60405180910390fd5b505050565b50505050565b50505050565b5f808290505f5b84518110156127d2575f858281518110612751576127506144cc565b5b60200260200101519050808311612792578281604051602001612775929190614519565b6040516020818303038152906040528051906020012092506127be565b80836040516020016127a5929190614519565b6040516020818303038152906040528051906020012092505b5080806127ca906143f8565b915050612734565b508091505092915050565b5f6127fd8473ffffffffffffffffffffffffffffffffffffffff16612b72565b15612952578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612826611d3e565b8786866040518563ffffffff1660e01b81526004016128489493929190614596565b6020604051808303815f875af192505050801561288357506040513d601f19601f8201168201806040525081019061288091906145f4565b60015b612902573d805f81146128b1576040519150601f19603f3d011682016040523d82523d5f602084013e6128b6565b606091505b505f8151036128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f1906143da565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612957565b600190505b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c490614669565b60405180910390fd5b6129d681612687565b15612a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0d906146d1565b60405180910390fd5b612a235f83836001612721565b612a2c81612687565b15612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a63906146d1565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b6e5f83836001612727565b5050565b5f80823b90505f8111915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bc881612b94565b8114612bd2575f80fd5b50565b5f81359050612be381612bbf565b92915050565b5f60208284031215612bfe57612bfd612b8c565b5b5f612c0b84828501612bd5565b91505092915050565b5f8115159050919050565b612c2881612c14565b82525050565b5f602082019050612c415f830184612c1f565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612c7e578082015181840152602081019050612c63565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612ca382612c47565b612cad8185612c51565b9350612cbd818560208601612c61565b612cc681612c89565b840191505092915050565b5f6020820190508181035f830152612ce98184612c99565b905092915050565b5f819050919050565b612d0381612cf1565b8114612d0d575f80fd5b50565b5f81359050612d1e81612cfa565b92915050565b5f60208284031215612d3957612d38612b8c565b5b5f612d4684828501612d10565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d7882612d4f565b9050919050565b612d8881612d6e565b82525050565b5f602082019050612da15f830184612d7f565b92915050565b612db081612d6e565b8114612dba575f80fd5b50565b5f81359050612dcb81612da7565b92915050565b5f8060408385031215612de757612de6612b8c565b5b5f612df485828601612dbd565b9250506020612e0585828601612d10565b9150509250929050565b5f805f60608486031215612e2657612e25612b8c565b5b5f612e3386828701612dbd565b9350506020612e4486828701612dbd565b9250506040612e5586828701612d10565b9150509250925092565b5f819050919050565b612e7181612e5f565b82525050565b5f602082019050612e8a5f830184612e68565b92915050565b612e9981612cf1565b82525050565b5f602082019050612eb25f830184612e90565b92915050565b612ec181612e5f565b8114612ecb575f80fd5b50565b5f81359050612edc81612eb8565b92915050565b5f60208284031215612ef757612ef6612b8c565b5b5f612f0484828501612ece565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612f4b82612c89565b810181811067ffffffffffffffff82111715612f6a57612f69612f15565b5b80604052505050565b5f612f7c612b83565b9050612f888282612f42565b919050565b5f67ffffffffffffffff821115612fa757612fa6612f15565b5b612fb082612c89565b9050602081019050919050565b828183375f83830152505050565b5f612fdd612fd884612f8d565b612f73565b905082815260208101848484011115612ff957612ff8612f11565b5b613004848285612fbd565b509392505050565b5f82601f8301126130205761301f612f0d565b5b8135613030848260208601612fcb565b91505092915050565b5f6020828403121561304e5761304d612b8c565b5b5f82013567ffffffffffffffff81111561306b5761306a612b90565b5b6130778482850161300c565b91505092915050565b5f80fd5b5f80fd5b5f8083601f84011261309d5761309c612f0d565b5b8235905067ffffffffffffffff8111156130ba576130b9613080565b5b6020830191508360208202830111156130d6576130d5613084565b5b9250929050565b5f80602083850312156130f3576130f2612b8c565b5b5f83013567ffffffffffffffff8111156131105761310f612b90565b5b61311c85828601613088565b92509250509250929050565b5f6020828403121561313d5761313c612b8c565b5b5f61314a84828501612dbd565b91505092915050565b61315c81612c14565b8114613166575f80fd5b50565b5f8135905061317781613153565b92915050565b5f806040838503121561319357613192612b8c565b5b5f6131a085828601612dbd565b92505060206131b185828601613169565b9150509250929050565b5f67ffffffffffffffff8211156131d5576131d4612f15565b5b6131de82612c89565b9050602081019050919050565b5f6131fd6131f8846131bb565b612f73565b90508281526020810184848401111561321957613218612f11565b5b613224848285612fbd565b509392505050565b5f82601f8301126132405761323f612f0d565b5b81356132508482602086016131eb565b91505092915050565b5f805f806080858703121561327157613270612b8c565b5b5f61327e87828801612dbd565b945050602061328f87828801612dbd565b93505060406132a087828801612d10565b925050606085013567ffffffffffffffff8111156132c1576132c0612b90565b5b6132cd8782880161322c565b91505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60048110613317576133166132d9565b5b50565b5f81905061332782613306565b919050565b5f6133368261331a565b9050919050565b6133468161332c565b82525050565b5f60208201905061335f5f83018461333d565b92915050565b5f806040838503121561337b5761337a612b8c565b5b5f61338885828601612dbd565b925050602061339985828601612dbd565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806133e757607f821691505b6020821081036133fa576133f96133a3565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613434602083612c51565b915061343f82613400565b602082019050919050565b5f6020820190508181035f83015261346181613428565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61349f82612cf1565b91506134aa83612cf1565b92508282019050808211156134c2576134c1613468565b5b92915050565b7f416d6f756e74206578636565647320726573657276656420737570706c7900005f82015250565b5f6134fc601e83612c51565b9150613507826134c8565b602082019050919050565b5f6020820190508181035f830152613529816134f0565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f61358a602183612c51565b915061359582613530565b604082019050919050565b5f6020820190508181035f8301526135b78161357e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f5f8201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b5f613618603d83612c51565b9150613623826135be565b604082019050919050565b5f6020820190508181035f8301526136458161360c565b9050919050565b7f496e76616c6964205374617465210000000000000000000000000000000000005f82015250565b5f613680600e83612c51565b915061368b8261364c565b602082019050919050565b5f6020820190508181035f8301526136ad81613674565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f61370e602d83612c51565b9150613719826136b4565b604082019050919050565b5f6020820190508181035f83015261373b81613702565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261379e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613763565b6137a88683613763565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6137e36137de6137d984612cf1565b6137c0565b612cf1565b9050919050565b5f819050919050565b6137fc836137c9565b613810613808826137ea565b84845461376f565b825550505050565b5f90565b613824613818565b61382f8184846137f3565b505050565b5b81811015613852576138475f8261381c565b600181019050613835565b5050565b601f8211156138975761386881613742565b61387184613754565b81016020851015613880578190505b61389461388c85613754565b830182613834565b50505b505050565b5f82821c905092915050565b5f6138b75f198460080261389c565b1980831691505092915050565b5f6138cf83836138a8565b9150826002028217905092915050565b6138e882612c47565b67ffffffffffffffff81111561390157613900612f15565b5b61390b82546133d0565b613916828285613856565b5f60209050601f831160018114613947575f8415613935578287015190505b61393f85826138c4565b8655506139a6565b601f19841661395586613742565b5f5b8281101561397c57848901518255600182019150602085019450602081019050613957565b868310156139995784890151613995601f8916826138a8565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f6139e2601883612c51565b91506139ed826139ae565b602082019050919050565b5f6020820190508181035f830152613a0f816139d6565b9050919050565b7f4e6f7420696e20616c6c6f776c697374206d696e74696e6720737461746573005f82015250565b5f613a4a601f83612c51565b9150613a5582613a16565b602082019050919050565b5f6020820190508181035f830152613a7781613a3e565b9050919050565b7f4d617820737570706c79206d696e7465640000000000000000000000000000005f82015250565b5f613ab2601183612c51565b9150613abd82613a7e565b602082019050919050565b5f6020820190508181035f830152613adf81613aa6565b9050919050565b5f8160601b9050919050565b5f613afc82613ae6565b9050919050565b5f613b0d82613af2565b9050919050565b613b25613b2082612d6e565b613b03565b82525050565b5f613b368284613b14565b60148201915081905092915050565b7f5573657220616c7265616479206d696e746564206f6e2067756172616e7465655f8201527f64206c6973740000000000000000000000000000000000000000000000000000602082015250565b5f613b9f602683612c51565b9150613baa82613b45565b604082019050919050565b5f6020820190508181035f830152613bcc81613b93565b9050919050565b7f4d61782067756172616e7465656420737570706c79206d696e746564000000005f82015250565b5f613c07601c83612c51565b9150613c1282613bd3565b602082019050919050565b5f6020820190508181035f830152613c3481613bfb565b9050919050565b7f5573657220616c7265616479206d696e746564206f6e206f76657273756273635f8201527f7269626564206c69737400000000000000000000000000000000000000000000602082015250565b5f613c95602a83612c51565b9150613ca082613c3b565b604082019050919050565b5f6020820190508181035f830152613cc281613c89565b9050919050565b5f613cd382612cf1565b9150613cde83612cf1565b9250828203905081811115613cf657613cf5613468565b5b92915050565b7f4d617820616c6c6f77206c69737420737570706c79206d696e746564000000005f82015250565b5f613d30601c83612c51565b9150613d3b82613cfc565b602082019050919050565b5f6020820190508181035f830152613d5d81613d24565b9050919050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f613d98600d83612c51565b9150613da382613d64565b602082019050919050565b5f6020820190508181035f830152613dc581613d8c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f7420612076615f8201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b5f613e26602983612c51565b9150613e3182613dcc565b604082019050919050565b5f6020820190508181035f830152613e5381613e1a565b9050919050565b7f5075626c6963206d696e7420696e6163746976650000000000000000000000005f82015250565b5f613e8e601483612c51565b9150613e9982613e5a565b602082019050919050565b5f6020820190508181035f830152613ebb81613e82565b9050919050565b7f4d617820617661696c61626c65207075626c696320737570706c79206d696e745f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f613f1c602283612c51565b9150613f2782613ec2565b604082019050919050565b5f6020820190508181035f830152613f4981613f10565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e005f82015250565b5f613f84601f83612c51565b9150613f8f82613f50565b602082019050919050565b5f6020820190508181035f830152613fb181613f78565b9050919050565b5f81905092915050565b5f8154613fce816133d0565b613fd88186613fb8565b9450600182165f8114613ff2576001811461400757614039565b60ff1983168652811515820286019350614039565b61401085613742565b5f5b8381101561403157815481890152600182019150602081019050614012565b838801955050505b50505092915050565b5f61404c82612c47565b6140568185613fb8565b9350614066818560208601612c61565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f6140a38285613fc2565b91506140af8284614042565b91506140ba82614072565b6005820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614124602683612c51565b915061412f826140ca565b604082019050919050565b5f6020820190508181035f83015261415181614118565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f6141b2602c83612c51565b91506141bd82614158565b604082019050919050565b5f6020820190508181035f8301526141df816141a6565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f614240602583612c51565b915061424b826141e6565b604082019050919050565b5f6020820190508181035f83015261426d81614234565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6142ce602483612c51565b91506142d982614274565b604082019050919050565b5f6020820190508181035f8301526142fb816142c2565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f614336601983612c51565b915061434182614302565b602082019050919050565b5f6020820190508181035f8301526143638161432a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f6143c4603283612c51565b91506143cf8261436a565b604082019050919050565b5f6020820190508181035f8301526143f1816143b8565b9050919050565b5f61440282612cf1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361443457614433613468565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61447682612cf1565b915061448183612cf1565b9250826144915761449061443f565b5b828204905092915050565b5f6144a682612cf1565b91506144b183612cf1565b9250826144c1576144c061443f565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b61451361450e82612e5f565b6144f9565b82525050565b5f6145248285614502565b6020820191506145348284614502565b6020820191508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f61456882614544565b614572818561454e565b9350614582818560208601612c61565b61458b81612c89565b840191505092915050565b5f6080820190506145a95f830187612d7f565b6145b66020830186612d7f565b6145c36040830185612e90565b81810360608301526145d5818461455e565b905095945050505050565b5f815190506145ee81612bbf565b92915050565b5f6020828403121561460957614608612b8c565b5b5f614616848285016145e0565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f614653602083612c51565b915061465e8261461f565b602082019050919050565b5f6020820190508181035f83015261468081614647565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f6146bb601c83612c51565b91506146c682614687565b602082019050919050565b5f6020820190508181035f8301526146e8816146af565b905091905056fea26469706673582212207f13d233391dac33e4c4b8f2e38526648b9a10c42f69eb49e950a9bbfad0b72264736f6c63430008140033697066733a2f2f516d584d79316337624a545037416e525779534e6e506366676e3171474e555350687363336858384858413269362f
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610246575f3560e01c8063893807aa11610139578063c87b56dd116100b6578063f20423141161007a578063f2042314146106b4578063f2fde38b146106d2578063f487404f146106ee578063f9c957d81461070c578063fe60d12c1461072857610246565b8063c87b56dd146105fa578063d371f76b1461062a578063d5abeb0114610648578063e921dad214610666578063e985e9c51461068457610246565b8063a2309ff8116100fd578063a2309ff814610556578063ad8c3f3314610574578063b242223214610590578063b88d4fde146105c0578063c051e38a146105dc57610246565b8063893807aa146104c45780638c874ebd146104f45780638da5cb5b146104fe57806395d89b411461051c578063a22cb4651461053a57610246565b806335d5959a116101c75780636352211e1161018b5780636352211e146104205780636c0360eb146104505780636c96b0831461046e57806370a082311461048a578063715018a6146104ba57610246565b806335d5959a146103905780633c186018146103ac57806342842e0e146103ca5780634f297ccc146103e657806355f804b31461040457610246565b80630bb862d11161020e5780630bb862d11461030057806316f9b7071461031c57806323b872dd146103385780632dc7b8551461035457806332f4681c1461037257610246565b806301ffc9a71461024a57806306fdde031461027a578063081812fc14610298578063084520b4146102c8578063095ea7b3146102e4575b5f80fd5b610264600480360381019061025f9190612be9565b610746565b6040516102719190612c2e565b60405180910390f35b610282610827565b60405161028f9190612cd1565b60405180910390f35b6102b260048036038101906102ad9190612d24565b6108b6565b6040516102bf9190612d8e565b60405180910390f35b6102e260048036038101906102dd9190612dd1565b6108f8565b005b6102fe60048036038101906102f99190612dd1565b610a1c565b005b61031a60048036038101906103159190612d24565b610b32565b005b61033660048036038101906103319190612d24565b610cc4565b005b610352600480360381019061034d9190612e0f565b610d4a565b005b61035c610daa565b6040516103699190612e77565b60405180910390f35b61037a610db0565b6040516103879190612e9f565b60405180910390f35b6103aa60048036038101906103a59190612ee2565b610db6565b005b6103b4610e3c565b6040516103c19190612e9f565b60405180910390f35b6103e460048036038101906103df9190612e0f565b610e60565b005b6103ee610e7f565b6040516103fb9190612e9f565b60405180910390f35b61041e60048036038101906104199190613039565b610e85565b005b61043a60048036038101906104359190612d24565b610f14565b6040516104479190612d8e565b60405180910390f35b610458610f98565b6040516104659190612cd1565b60405180910390f35b610488600480360381019061048391906130dd565b611024565b005b6104a4600480360381019061049f9190613128565b611536565b6040516104b19190612e9f565b60405180910390f35b6104c26115ea565b005b6104de60048036038101906104d99190613128565b611671565b6040516104eb9190612c2e565b60405180910390f35b6104fc61168e565b005b610506611787565b6040516105139190612d8e565b60405180910390f35b6105246117af565b6040516105319190612cd1565b60405180910390f35b610554600480360381019061054f919061317d565b61183f565b005b61055e611855565b60405161056b9190612e9f565b60405180910390f35b61058e60048036038101906105899190612ee2565b611865565b005b6105aa60048036038101906105a59190613128565b6118eb565b6040516105b79190612c2e565b60405180910390f35b6105da60048036038101906105d59190613259565b611908565b005b6105e461196a565b6040516105f1919061334c565b60405180910390f35b610614600480360381019061060f9190612d24565b61197c565b6040516106219190612cd1565b60405180910390f35b610632611a26565b60405161063f9190612e9f565b60405180910390f35b610650611a36565b60405161065d9190612e9f565b60405180910390f35b61066e611a3c565b60405161067b9190612e77565b60405180910390f35b61069e60048036038101906106999190613365565b611a42565b6040516106ab9190612c2e565b60405180910390f35b6106bc611ad0565b6040516106c99190612e9f565b60405180910390f35b6106ec60048036038101906106e79190613128565b611ae0565b005b6106f6611bd6565b6040516107039190612d8e565b60405180910390f35b61072660048036038101906107219190612d24565b611bfe565b005b610730611c84565b60405161073d9190612e9f565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061081057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610820575061081f82611c8a565b5b9050919050565b60605f8054610835906133d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610861906133d0565b80156108ac5780601f10610883576101008083540402835291602001916108ac565b820191905f5260205f20905b81548152906001019060200180831161088f57829003601f168201915b5050505050905090565b5f6108c082611cf3565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610900611d3e565b73ffffffffffffffffffffffffffffffffffffffff1661091e611787565b73ffffffffffffffffffffffffffffffffffffffff1614610974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096b9061344a565b60405180910390fd5b600b54600c54826109859190613495565b11156109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90613512565b60405180910390fd5b5f5b818110156109ff575f6109db6012611d45565b90506109e76012611d51565b6109f18482611d65565b8180600101925050506109c8565b5080600c5f828254610a119190613495565b925050819055505050565b5f610a2682610f14565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8d906135a0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ab5611d3e565b73ffffffffffffffffffffffffffffffffffffffff161480610ae45750610ae381610ade611d3e565b611a42565b5b610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a9061362e565b60405180910390fd5b610b2d8383611d82565b505050565b610b3a611d3e565b73ffffffffffffffffffffffffffffffffffffffff16610b58611787565b73ffffffffffffffffffffffffffffffffffffffff1614610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba59061344a565b60405180910390fd5b60058110610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be890613696565b60405180910390fd5b5f8103610c26575f60155f6101000a81548160ff02191690836003811115610c1c57610c1b6132d9565b5b0217905550610cc1565b60018103610c5d57600160155f6101000a81548160ff02191690836003811115610c5357610c526132d9565b5b0217905550610cc0565b60028103610c9457600260155f6101000a81548160ff02191690836003811115610c8a57610c896132d9565b5b0217905550610cbf565b600360155f6101000a81548160ff02191690836003811115610cb957610cb86132d9565b5b02179055505b5b5b50565b610ccc611d3e565b73ffffffffffffffffffffffffffffffffffffffff16610cea611787565b73ffffffffffffffffffffffffffffffffffffffff1614610d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d379061344a565b60405180910390fd5b80600b8190555050565b610d5b610d55611d3e565b82611e38565b610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190613724565b60405180910390fd5b610da5838383611f14565b505050565b600e5481565b600d5481565b610dbe611d3e565b73ffffffffffffffffffffffffffffffffffffffff16610ddc611787565b73ffffffffffffffffffffffffffffffffffffffff1614610e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e299061344a565b60405180910390fd5b80600e8190555050565b5f610e476014611d45565b610e516013611d45565b610e5b9190613495565b905090565b610e7a83838360405180602001604052805f815250611908565b505050565b600c5481565b610e8d611d3e565b73ffffffffffffffffffffffffffffffffffffffff16610eab611787565b73ffffffffffffffffffffffffffffffffffffffff1614610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef89061344a565b60405180910390fd5b8060099081610f1091906138df565b5050565b5f80610f1f83612212565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f86906139f8565b60405180910390fd5b80915050919050565b60098054610fa5906133d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd1906133d0565b801561101c5780601f10610ff35761010080835404028352916020019161101c565b820191905f5260205f20905b815481529060010190602001808311610fff57829003601f168201915b505050505081565b60016003811115611038576110376132d9565b5b60155f9054906101000a900460ff166003811115611059576110586132d9565b5b1480611097575060026003811115611074576110736132d9565b5b60155f9054906101000a900460ff166003811115611095576110946132d9565b5b145b6110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90613a60565b60405180910390fd5b600a546110e36012611d45565b10611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a90613ac8565b60405180910390fd5b5f61112c611d3e565b60405160200161113c9190613b2b565b6040516020818303038152906040528051906020012090505f60016003811115611169576111686132d9565b5b60155f9054906101000a900460ff16600381111561118a576111896132d9565b5b036112dc57600e5490505f151560105f6111a2611d3e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461122a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122190613bb5565b60405180910390fd5b600d54611235611ad0565b10611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c90613c1d565b60405180910390fd5b61127f6013611d51565b600160105f61128c611d3e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b600260038111156112f0576112ef6132d9565b5b60155f9054906101000a900460ff166003811115611311576113106132d9565b5b0361147d57600f5490505f151560115f611329611d3e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515146113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a890613cab565b60405180910390fd5b600d54600b54600a546113c49190613cc9565b6113ce9190613cc9565b6113d6611a26565b10611416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140d90613d46565b60405180910390fd5b6114206014611d51565b600160115f61142d611d3e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6114c88484808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050828461224b565b611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe90613dae565b60405180910390fd5b5f6115126012611d45565b905061151e6012611d51565b61152f611529611d3e565b82611d65565b5050505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90613e3c565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6115f2611d3e565b73ffffffffffffffffffffffffffffffffffffffff16611610611787565b73ffffffffffffffffffffffffffffffffffffffff1614611666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165d9061344a565b60405180910390fd5b61166f5f612261565b565b6011602052805f5260405f205f915054906101000a900460ff1681565b6003808111156116a1576116a06132d9565b5b60155f9054906101000a900460ff1660038111156116c2576116c16132d9565b5b14611702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f990613ea4565b60405180910390fd5b600b54600a546117129190613cc9565b61171c6012611d45565b1061175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175390613f32565b60405180910390fd5b5f6117676012611d45565b90506117736012611d51565b61178461177e611d3e565b82611d65565b50565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117be906133d0565b80601f01602080910402602001604051908101604052809291908181526020018280546117ea906133d0565b80156118355780601f1061180c57610100808354040283529160200191611835565b820191905f5260205f20905b81548152906001019060200180831161181857829003601f168201915b5050505050905090565b61185161184a611d3e565b838361236b565b5050565b5f6118606012611d45565b905090565b61186d611d3e565b73ffffffffffffffffffffffffffffffffffffffff1661188b611787565b73ffffffffffffffffffffffffffffffffffffffff16146118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d89061344a565b60405180910390fd5b80600f8190555050565b6010602052805f5260405f205f915054906101000a900460ff1681565b611919611913611d3e565b83611e38565b611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90613724565b60405180910390fd5b611964848484846124d2565b50505050565b60155f9054906101000a900460ff1681565b60606119886012611d45565b8211156119ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c190613f9a565b60405180910390fd5b5f600980546119d8906133d0565b9050116119f35760405180602001604052805f815250611a1f565b60096119fe8361252e565b604051602001611a0f929190614098565b6040516020818303038152906040525b9050919050565b5f611a316014611d45565b905090565b600a5481565b600f5481565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f611adb6013611d45565b905090565b611ae8611d3e565b73ffffffffffffffffffffffffffffffffffffffff16611b06611787565b73ffffffffffffffffffffffffffffffffffffffff1614611b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b539061344a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc19061413a565b60405180910390fd5b611bd381612261565b50565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c06611d3e565b73ffffffffffffffffffffffffffffffffffffffff16611c24611787565b73ffffffffffffffffffffffffffffffffffffffff1614611c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c719061344a565b60405180910390fd5b80600d8190555050565b600b5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611cfc81612687565b611d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d32906139f8565b60405180910390fd5b50565b5f33905090565b5f815f01549050919050565b6001815f015f828254019250508190555050565b611d7e828260405180602001604052805f8152506126c7565b5050565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611df283610f14565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f611e4282612687565b611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e78906141c8565b60405180910390fd5b5f611e8b83610f14565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ecd5750611ecc8185611a42565b5b80611f0b57508373ffffffffffffffffffffffffffffffffffffffff16611ef3846108b6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f3482610f14565b73ffffffffffffffffffffffffffffffffffffffff1614611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8190614256565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef906142e4565b60405180910390fd5b6120058383836001612721565b8273ffffffffffffffffffffffffffffffffffffffff1661202582610f14565b73ffffffffffffffffffffffffffffffffffffffff161461207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207290614256565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546120fb9190613cc9565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461214f9190613495565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461220d8383836001612727565b505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f82612257858461272d565b1490509392505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d09061434c565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124c59190612c2e565b60405180910390a3505050565b6124dd848484611f14565b6124e9848484846127dd565b612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f906143da565b60405180910390fd5b50505050565b60605f8203612574576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612682565b5f8290505f5b5f82146125a357808061258c906143f8565b915050600a8261259c919061446c565b915061257a565b5f8167ffffffffffffffff8111156125be576125bd612f15565b5b6040519080825280601f01601f1916602001820160405280156125f05781602001600182028036833780820191505090505b5090505b5f851461267b576001826126089190613cc9565b9150600a85612617919061449c565b60306126239190613495565b60f81b818381518110612639576126386144cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612674919061446c565b94506125f4565b8093505050505b919050565b5f8073ffffffffffffffffffffffffffffffffffffffff166126a883612212565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6126d1838361295f565b6126dd5f8484846127dd565b61271c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612713906143da565b60405180910390fd5b505050565b50505050565b50505050565b5f808290505f5b84518110156127d2575f858281518110612751576127506144cc565b5b60200260200101519050808311612792578281604051602001612775929190614519565b6040516020818303038152906040528051906020012092506127be565b80836040516020016127a5929190614519565b6040516020818303038152906040528051906020012092505b5080806127ca906143f8565b915050612734565b508091505092915050565b5f6127fd8473ffffffffffffffffffffffffffffffffffffffff16612b72565b15612952578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612826611d3e565b8786866040518563ffffffff1660e01b81526004016128489493929190614596565b6020604051808303815f875af192505050801561288357506040513d601f19601f8201168201806040525081019061288091906145f4565b60015b612902573d805f81146128b1576040519150601f19603f3d011682016040523d82523d5f602084013e6128b6565b606091505b505f8151036128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f1906143da565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612957565b600190505b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c490614669565b60405180910390fd5b6129d681612687565b15612a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0d906146d1565b60405180910390fd5b612a235f83836001612721565b612a2c81612687565b15612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a63906146d1565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b6e5f83836001612727565b5050565b5f80823b90505f8111915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bc881612b94565b8114612bd2575f80fd5b50565b5f81359050612be381612bbf565b92915050565b5f60208284031215612bfe57612bfd612b8c565b5b5f612c0b84828501612bd5565b91505092915050565b5f8115159050919050565b612c2881612c14565b82525050565b5f602082019050612c415f830184612c1f565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612c7e578082015181840152602081019050612c63565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612ca382612c47565b612cad8185612c51565b9350612cbd818560208601612c61565b612cc681612c89565b840191505092915050565b5f6020820190508181035f830152612ce98184612c99565b905092915050565b5f819050919050565b612d0381612cf1565b8114612d0d575f80fd5b50565b5f81359050612d1e81612cfa565b92915050565b5f60208284031215612d3957612d38612b8c565b5b5f612d4684828501612d10565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d7882612d4f565b9050919050565b612d8881612d6e565b82525050565b5f602082019050612da15f830184612d7f565b92915050565b612db081612d6e565b8114612dba575f80fd5b50565b5f81359050612dcb81612da7565b92915050565b5f8060408385031215612de757612de6612b8c565b5b5f612df485828601612dbd565b9250506020612e0585828601612d10565b9150509250929050565b5f805f60608486031215612e2657612e25612b8c565b5b5f612e3386828701612dbd565b9350506020612e4486828701612dbd565b9250506040612e5586828701612d10565b9150509250925092565b5f819050919050565b612e7181612e5f565b82525050565b5f602082019050612e8a5f830184612e68565b92915050565b612e9981612cf1565b82525050565b5f602082019050612eb25f830184612e90565b92915050565b612ec181612e5f565b8114612ecb575f80fd5b50565b5f81359050612edc81612eb8565b92915050565b5f60208284031215612ef757612ef6612b8c565b5b5f612f0484828501612ece565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612f4b82612c89565b810181811067ffffffffffffffff82111715612f6a57612f69612f15565b5b80604052505050565b5f612f7c612b83565b9050612f888282612f42565b919050565b5f67ffffffffffffffff821115612fa757612fa6612f15565b5b612fb082612c89565b9050602081019050919050565b828183375f83830152505050565b5f612fdd612fd884612f8d565b612f73565b905082815260208101848484011115612ff957612ff8612f11565b5b613004848285612fbd565b509392505050565b5f82601f8301126130205761301f612f0d565b5b8135613030848260208601612fcb565b91505092915050565b5f6020828403121561304e5761304d612b8c565b5b5f82013567ffffffffffffffff81111561306b5761306a612b90565b5b6130778482850161300c565b91505092915050565b5f80fd5b5f80fd5b5f8083601f84011261309d5761309c612f0d565b5b8235905067ffffffffffffffff8111156130ba576130b9613080565b5b6020830191508360208202830111156130d6576130d5613084565b5b9250929050565b5f80602083850312156130f3576130f2612b8c565b5b5f83013567ffffffffffffffff8111156131105761310f612b90565b5b61311c85828601613088565b92509250509250929050565b5f6020828403121561313d5761313c612b8c565b5b5f61314a84828501612dbd565b91505092915050565b61315c81612c14565b8114613166575f80fd5b50565b5f8135905061317781613153565b92915050565b5f806040838503121561319357613192612b8c565b5b5f6131a085828601612dbd565b92505060206131b185828601613169565b9150509250929050565b5f67ffffffffffffffff8211156131d5576131d4612f15565b5b6131de82612c89565b9050602081019050919050565b5f6131fd6131f8846131bb565b612f73565b90508281526020810184848401111561321957613218612f11565b5b613224848285612fbd565b509392505050565b5f82601f8301126132405761323f612f0d565b5b81356132508482602086016131eb565b91505092915050565b5f805f806080858703121561327157613270612b8c565b5b5f61327e87828801612dbd565b945050602061328f87828801612dbd565b93505060406132a087828801612d10565b925050606085013567ffffffffffffffff8111156132c1576132c0612b90565b5b6132cd8782880161322c565b91505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60048110613317576133166132d9565b5b50565b5f81905061332782613306565b919050565b5f6133368261331a565b9050919050565b6133468161332c565b82525050565b5f60208201905061335f5f83018461333d565b92915050565b5f806040838503121561337b5761337a612b8c565b5b5f61338885828601612dbd565b925050602061339985828601612dbd565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806133e757607f821691505b6020821081036133fa576133f96133a3565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613434602083612c51565b915061343f82613400565b602082019050919050565b5f6020820190508181035f83015261346181613428565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61349f82612cf1565b91506134aa83612cf1565b92508282019050808211156134c2576134c1613468565b5b92915050565b7f416d6f756e74206578636565647320726573657276656420737570706c7900005f82015250565b5f6134fc601e83612c51565b9150613507826134c8565b602082019050919050565b5f6020820190508181035f830152613529816134f0565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f61358a602183612c51565b915061359582613530565b604082019050919050565b5f6020820190508181035f8301526135b78161357e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f5f8201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b5f613618603d83612c51565b9150613623826135be565b604082019050919050565b5f6020820190508181035f8301526136458161360c565b9050919050565b7f496e76616c6964205374617465210000000000000000000000000000000000005f82015250565b5f613680600e83612c51565b915061368b8261364c565b602082019050919050565b5f6020820190508181035f8301526136ad81613674565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f61370e602d83612c51565b9150613719826136b4565b604082019050919050565b5f6020820190508181035f83015261373b81613702565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261379e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613763565b6137a88683613763565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6137e36137de6137d984612cf1565b6137c0565b612cf1565b9050919050565b5f819050919050565b6137fc836137c9565b613810613808826137ea565b84845461376f565b825550505050565b5f90565b613824613818565b61382f8184846137f3565b505050565b5b81811015613852576138475f8261381c565b600181019050613835565b5050565b601f8211156138975761386881613742565b61387184613754565b81016020851015613880578190505b61389461388c85613754565b830182613834565b50505b505050565b5f82821c905092915050565b5f6138b75f198460080261389c565b1980831691505092915050565b5f6138cf83836138a8565b9150826002028217905092915050565b6138e882612c47565b67ffffffffffffffff81111561390157613900612f15565b5b61390b82546133d0565b613916828285613856565b5f60209050601f831160018114613947575f8415613935578287015190505b61393f85826138c4565b8655506139a6565b601f19841661395586613742565b5f5b8281101561397c57848901518255600182019150602085019450602081019050613957565b868310156139995784890151613995601f8916826138a8565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f6139e2601883612c51565b91506139ed826139ae565b602082019050919050565b5f6020820190508181035f830152613a0f816139d6565b9050919050565b7f4e6f7420696e20616c6c6f776c697374206d696e74696e6720737461746573005f82015250565b5f613a4a601f83612c51565b9150613a5582613a16565b602082019050919050565b5f6020820190508181035f830152613a7781613a3e565b9050919050565b7f4d617820737570706c79206d696e7465640000000000000000000000000000005f82015250565b5f613ab2601183612c51565b9150613abd82613a7e565b602082019050919050565b5f6020820190508181035f830152613adf81613aa6565b9050919050565b5f8160601b9050919050565b5f613afc82613ae6565b9050919050565b5f613b0d82613af2565b9050919050565b613b25613b2082612d6e565b613b03565b82525050565b5f613b368284613b14565b60148201915081905092915050565b7f5573657220616c7265616479206d696e746564206f6e2067756172616e7465655f8201527f64206c6973740000000000000000000000000000000000000000000000000000602082015250565b5f613b9f602683612c51565b9150613baa82613b45565b604082019050919050565b5f6020820190508181035f830152613bcc81613b93565b9050919050565b7f4d61782067756172616e7465656420737570706c79206d696e746564000000005f82015250565b5f613c07601c83612c51565b9150613c1282613bd3565b602082019050919050565b5f6020820190508181035f830152613c3481613bfb565b9050919050565b7f5573657220616c7265616479206d696e746564206f6e206f76657273756273635f8201527f7269626564206c69737400000000000000000000000000000000000000000000602082015250565b5f613c95602a83612c51565b9150613ca082613c3b565b604082019050919050565b5f6020820190508181035f830152613cc281613c89565b9050919050565b5f613cd382612cf1565b9150613cde83612cf1565b9250828203905081811115613cf657613cf5613468565b5b92915050565b7f4d617820616c6c6f77206c69737420737570706c79206d696e746564000000005f82015250565b5f613d30601c83612c51565b9150613d3b82613cfc565b602082019050919050565b5f6020820190508181035f830152613d5d81613d24565b9050919050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f613d98600d83612c51565b9150613da382613d64565b602082019050919050565b5f6020820190508181035f830152613dc581613d8c565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f7420612076615f8201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b5f613e26602983612c51565b9150613e3182613dcc565b604082019050919050565b5f6020820190508181035f830152613e5381613e1a565b9050919050565b7f5075626c6963206d696e7420696e6163746976650000000000000000000000005f82015250565b5f613e8e601483612c51565b9150613e9982613e5a565b602082019050919050565b5f6020820190508181035f830152613ebb81613e82565b9050919050565b7f4d617820617661696c61626c65207075626c696320737570706c79206d696e745f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f613f1c602283612c51565b9150613f2782613ec2565b604082019050919050565b5f6020820190508181035f830152613f4981613f10565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e005f82015250565b5f613f84601f83612c51565b9150613f8f82613f50565b602082019050919050565b5f6020820190508181035f830152613fb181613f78565b9050919050565b5f81905092915050565b5f8154613fce816133d0565b613fd88186613fb8565b9450600182165f8114613ff2576001811461400757614039565b60ff1983168652811515820286019350614039565b61401085613742565b5f5b8381101561403157815481890152600182019150602081019050614012565b838801955050505b50505092915050565b5f61404c82612c47565b6140568185613fb8565b9350614066818560208601612c61565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f6140a38285613fc2565b91506140af8284614042565b91506140ba82614072565b6005820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614124602683612c51565b915061412f826140ca565b604082019050919050565b5f6020820190508181035f83015261415181614118565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f6141b2602c83612c51565b91506141bd82614158565b604082019050919050565b5f6020820190508181035f8301526141df816141a6565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f614240602583612c51565b915061424b826141e6565b604082019050919050565b5f6020820190508181035f83015261426d81614234565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6142ce602483612c51565b91506142d982614274565b604082019050919050565b5f6020820190508181035f8301526142fb816142c2565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f614336601983612c51565b915061434182614302565b602082019050919050565b5f6020820190508181035f8301526143638161432a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f6143c4603283612c51565b91506143cf8261436a565b604082019050919050565b5f6020820190508181035f8301526143f1816143b8565b9050919050565b5f61440282612cf1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361443457614433613468565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61447682612cf1565b915061448183612cf1565b9250826144915761449061443f565b5b828204905092915050565b5f6144a682612cf1565b91506144b183612cf1565b9250826144c1576144c061443f565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b61451361450e82612e5f565b6144f9565b82525050565b5f6145248285614502565b6020820191506145348284614502565b6020820191508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f61456882614544565b614572818561454e565b9350614582818560208601612c61565b61458b81612c89565b840191505092915050565b5f6080820190506145a95f830187612d7f565b6145b66020830186612d7f565b6145c36040830185612e90565b81810360608301526145d5818461455e565b905095945050505050565b5f815190506145ee81612bbf565b92915050565b5f6020828403121561460957614608612b8c565b5b5f614616848285016145e0565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f614653602083612c51565b915061465e8261461f565b602082019050919050565b5f6020820190508181035f83015261468081614647565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f6146bb601c83612c51565b91506146c682614687565b602082019050919050565b5f6020820190508181035f8301526146e8816146af565b905091905056fea26469706673582212207f13d233391dac33e4c4b8f2e38526648b9a10c42f69eb49e950a9bbfad0b72264736f6c63430008140033
Deployed Bytecode Sourcemap
42362:9313:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27078:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28006:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29518:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48230:631;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29036:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50769:481;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51572:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30218:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42820:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42729:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48976:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50358:304;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30590:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42645:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44227:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27716:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42460:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44945:2563;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27447:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21924:103;;;:::i;:::-;;43123:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47567:521;;;:::i;:::-;;21098:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28175:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29761:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49364:227;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49172:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43065:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30812:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43713:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44447:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50025:272;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42536:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42914:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29987:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49674:264;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22182:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21267:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51363:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42609:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27078:305;27180:4;27232:25;27217:40;;;:11;:40;;;;:105;;;;27289:33;27274:48;;;:11;:48;;;;27217:105;:158;;;;27339:36;27363:11;27339:23;:36::i;:::-;27217:158;27197:178;;27078:305;;;:::o;28006:100::-;28060:13;28093:5;28086:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28006:100;:::o;29518:171::-;29594:7;29614:23;29629:7;29614:14;:23::i;:::-;29657:15;:24;29673:7;29657:24;;;;;;;;;;;;;;;;;;;;;29650:31;;29518:171;;;:::o;48230:631::-;21504:12;:10;:12::i;:::-;21493:23;;:7;:5;:7::i;:::-;:23;;;21485:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48386:8:::1;;48368:14;;48359:6;:23;;;;:::i;:::-;:35;;48351:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;48455:6;48451:368;48467:6;48463:1;:10;48451:368;;;48546:15;48564:25;:15;:23;:25::i;:::-;48546:43;;48604:27;:15;:25;:27::i;:::-;48680:22;48690:2;48694:7;48680:9;:22::i;:::-;48789:3;;;;;;;48476:343;48451:368;;;;48847:6;48829:14;;:24;;;;;;;:::i;:::-;;;;;;;;48230:631:::0;;:::o;29036:416::-;29117:13;29133:23;29148:7;29133:14;:23::i;:::-;29117:39;;29181:5;29175:11;;:2;:11;;;29167:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29275:5;29259:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29284:37;29301:5;29308:12;:10;:12::i;:::-;29284:16;:37::i;:::-;29259:62;29237:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;29423:21;29432:2;29436:7;29423:8;:21::i;:::-;29106:346;29036:416;;:::o;50769:481::-;21504:12;:10;:12::i;:::-;21493:23;;:7;:5;:7::i;:::-;:23;;;21485:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50862:1:::1;50849:10;:14;50841:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;50921:1;50907:10;:15:::0;50903:340:::1;;50951:16;50939:9;;:28;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;50903:340;;;51012:1;50998:10;:15:::0;50994:249:::1;;51042:20;51030:9;;:32;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;50994:249;;;51107:1;51093:10;:15:::0;51089:154:::1;;51137:24;51125:9;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;51089:154;;;51215:16;51203:9;;:28;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;51089:154;50994:249;50903:340;50769:481:::0;:::o;51572:96::-;21504:12;:10;:12::i;:::-;21493:23;;:7;:5;:7::i;:::-;:23;;;21485:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51654:5:::1;51643:8;:16;;;;51572:96:::0;:::o;30218:301::-;30379:41;30398:12;:10;:12::i;:::-;30412:7;30379:18;:41::i;:::-;30371:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;30483:28;30493:4;30499:2;30503:7;30483:9;:28::i;:::-;30218:301;;;:::o;42820:32::-;;;;:::o;42729:25::-;;;;:::o;48976:123::-;21504:12;:10;:12::i;:::-;21493:23;;:7;:5;:7::i;:::-;:23;;;21485:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49080:11:::1;49060:17;:31;;;;48976:123:::0;:::o;50358:304::-;50410:7;50606:47;:37;:45;:47::i;:::-;50560:43;:33;:41;:43::i;:::-;:93;;;;:::i;:::-;50553:100;;50358:304;:::o;30590:151::-;30694:39;30711:4;30717:2;30721:7;30694:39;;;;;;;;;;;;:16;:39::i;:::-;30590:151;;;:::o;42645:29::-;;;;:::o;44227:104::-;21504:12;:10;:12::i;:::-;21493:23;;:7;:5;:7::i;:::-;:23;;;21485:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44313:10:::1;44303:7;:20;;;;;;:::i;:::-;;44227:104:::0;:::o;27716:223::-;27788:7;27808:13;27824:17;27833:7;27824:8;:17::i;:::-;27808:33;;27877:1;27860:19;;:5;:19;;;27852:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;27926:5;27919:12;;;27716:223;;;:::o;42460:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44945:2563::-;45076:20;45063:33;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;:74;;;;45113:24;45100:37;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;45063:74;45055:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;45222:9;;45194:25;:15;:23;:25::i;:::-;:37;45186:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45315:12;45357;:10;:12::i;:::-;45340:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;45330:41;;;;;;45315:56;;45440:12;45563:20;45550:33;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;45546:728;;45652:17;;45645:24;;45798:5;45762:41;;:18;:32;45781:12;:10;:12::i;:::-;45762:32;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;45754:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;45989:10;;45954:32;:30;:32::i;:::-;:45;45946:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;46116:45;:33;:43;:45::i;:::-;46258:4;46223:18;:32;46242:12;:10;:12::i;:::-;46223:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;45546:728;46387:24;46374:37;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;46370:802;;46480:21;;46473:28;;46638:5;46598:45;;:22;:36;46621:12;:10;:12::i;:::-;46598:36;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;46590:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;46945:10;;46934:8;;46922:9;;:20;;;;:::i;:::-;:33;;;;:::i;:::-;46883:36;:34;:36::i;:::-;:72;46875:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;47006:49;:37;:47;:49::i;:::-;47156:4;47117:22;:36;47140:12;:10;:12::i;:::-;47117:36;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;46370:802;47227:37;47246:5;;47227:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47253:4;47259;47227:18;:37::i;:::-;47219:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47346:15;47364:25;:15;:23;:25::i;:::-;47346:43;;47400:27;:15;:25;:27::i;:::-;47468:32;47478:12;:10;:12::i;:::-;47492:7;47468:9;:32::i;:::-;45003:2505;;;44945:2563;;:::o;27447:207::-;27519:7;27564:1;27547:19;;:5;:19;;;27539:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27630:9;:16;27640:5;27630:16;;;;;;;;;;;;;;;;27623:23;;27447:207;;;:::o;21924:103::-;21504:12;:10;:12::i;:::-;21493:23;;:7;:5;:7::i;:::-;:23;;;21485:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21989:30:::1;22016:1;21989:18;:30::i;:::-;21924:103::o:0;43123:54::-;;;;;;;;;;;;;;;;;;;;;;:::o;47567:521::-;47632:16;47619:29;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:29;;;;;;;;:::i;:::-;;;47611:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47814:8;;47802:9;;:20;;;;:::i;:::-;47774:25;:15;:23;:25::i;:::-;:48;47766:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47926:15;47944:25;:15;:23;:25::i;:::-;47926:43;;47980:27;:15;:25;:27::i;:::-;48048:32;48058:12;:10;:12::i;:::-;48072:7;48048:9;:32::i;:::-;47598:490;47567:521::o;21098:87::-;21144:7;21171:6;;;;;;;;;;;21164:13;;21098:87;:::o;28175:104::-;28231:13;28264:7;28257:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28175:104;:::o;29761:155::-;29856:52;29875:12;:10;:12::i;:::-;29889:8;29899;29856:18;:52::i;:::-;29761:155;;:::o;49364:227::-;49407:7;49557:25;:15;:23;:25::i;:::-;49550:32;;49364:227;:::o;49172:127::-;21504:12;:10;:12::i;:::-;21493:23;;:7;:5;:7::i;:::-;:23;;;21485:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49280:11:::1;49256:21;:35;;;;49172:127:::0;:::o;43065:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;30812:279::-;30943:41;30962:12;:10;:12::i;:::-;30976:7;30943:18;:41::i;:::-;30935:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;31045:38;31059:4;31065:2;31069:7;31078:4;31045:13;:38::i;:::-;30812:279;;;;:::o;43713:45::-;;;;;;;;;;;;;:::o;44447:298::-;44520:13;44565:25;:15;:23;:25::i;:::-;44554:7;:36;;44546:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;44670:1;44652:7;44646:21;;;;;:::i;:::-;;;:25;:91;;;;;;;;;;;;;;;;;44688:7;44697:25;44714:7;44697:16;:25::i;:::-;44674:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44646:91;44639:98;;44447:298;;;:::o;50025:272::-;50091:7;50241:47;:37;:45;:47::i;:::-;50234:54;;50025:272;:::o;42536:31::-;;;;:::o;42914:36::-;;;;:::o;29987:164::-;30084:4;30108:18;:25;30127:5;30108:25;;;;;;;;;;;;;;;:35;30134:8;30108:35;;;;;;;;;;;;;;;;;;;;;;;;;30101:42;;29987:164;;;;:::o;49674:264::-;49736:7;49886:43;:33;:41;:43::i;:::-;49879:50;;49674:264;:::o;22182:201::-;21504:12;:10;:12::i;:::-;21493:23;;:7;:5;:7::i;:::-;:23;;;21485:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22291:1:::1;22271:22;;:8;:22;;::::0;22263:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22347:28;22366:8;22347:18;:28::i;:::-;22182:201:::0;:::o;21267:93::-;21316:7;21343:9;;;;;;;;;;;21336:16;;21267:93;:::o;51363:100::-;21504:12;:10;:12::i;:::-;21493:23;;:7;:5;:7::i;:::-;:23;;;21485:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51449:5:::1;51436:10;:18;;;;51363:100:::0;:::o;42609:28::-;;;;:::o;25687:157::-;25772:4;25811:25;25796:40;;;:11;:40;;;;25789:47;;25687:157;;;:::o;38512:135::-;38594:16;38602:7;38594;:16::i;:::-;38586:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;38512:135;:::o;19742:98::-;19795:7;19822:10;19815:17;;19742:98;:::o;947:114::-;1012:7;1039;:14;;;1032:21;;947:114;;;:::o;1069:127::-;1176:1;1158:7;:14;;;:19;;;;;;;;;;;1069:127;:::o;33771:110::-;33847:26;33857:2;33861:7;33847:26;;;;;;;;;;;;:9;:26::i;:::-;33771:110;;:::o;37825:174::-;37927:2;37900:15;:24;37916:7;37900:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37983:7;37979:2;37945:46;;37954:23;37969:7;37954:14;:23::i;:::-;37945:46;;;;;;;;;;;;37825:174;;:::o;33081:348::-;33174:4;33199:16;33207:7;33199;:16::i;:::-;33191:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33275:13;33291:23;33306:7;33291:14;:23::i;:::-;33275:39;;33344:5;33333:16;;:7;:16;;;:52;;;;33353:32;33370:5;33377:7;33353:16;:32::i;:::-;33333:52;:87;;;;33413:7;33389:31;;:20;33401:7;33389:11;:20::i;:::-;:31;;;33333:87;33325:96;;;33081:348;;;;:::o;36921:785::-;37046:4;37019:31;;:23;37034:7;37019:14;:23::i;:::-;:31;;;37011:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37125:1;37111:16;;:2;:16;;;37103:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37181:42;37202:4;37208:2;37212:7;37221:1;37181:20;:42::i;:::-;37353:4;37326:31;;:23;37341:7;37326:14;:23::i;:::-;:31;;;37318:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37471:15;:24;37487:7;37471:24;;;;;;;;;;;;37464:31;;;;;;;;;;;37527:1;37508:9;:15;37518:4;37508:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37556:1;37539:9;:13;37549:2;37539:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37597:2;37578:7;:16;37586:7;37578:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37636:7;37632:2;37617:27;;37626:4;37617:27;;;;;;;;;;;;37657:41;37677:4;37683:2;37687:7;37696:1;37657:19;:41::i;:::-;36921:785;;;:::o;32356:117::-;32422:7;32449;:16;32457:7;32449:16;;;;;;;;;;;;;;;;;;;;;32442:23;;32356:117;;;:::o;2375:190::-;2500:4;2553;2524:25;2537:5;2544:4;2524:12;:25::i;:::-;:33;2517:40;;2375:190;;;;;:::o;22543:275::-;22617:17;22637:6;;;;;;;;;;;22617:26;;22666:9;22654;;:21;;;;;;;;;;;;;;;;;;22695:8;22686:6;;:17;;;;;;;;;;;;;;;;;;22738:15;22714:21;:39;;;;22801:8;22769:41;;22790:9;22769:41;;;;;;;;;;;;22606:212;22543:275;:::o;38142:281::-;38263:8;38254:17;;:5;:17;;;38246:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38350:8;38312:18;:25;38331:5;38312:25;;;;;;;;;;;;;;;:35;38338:8;38312:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38396:8;38374:41;;38389:5;38374:41;;;38406:8;38374:41;;;;;;:::i;:::-;;;;;;;;38142:281;;;:::o;31972:270::-;32085:28;32095:4;32101:2;32105:7;32085:9;:28::i;:::-;32132:47;32155:4;32161:2;32165:7;32174:4;32132:22;:47::i;:::-;32124:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31972:270;;;;:::o;23134:723::-;23190:13;23420:1;23411:5;:10;23407:53;;23438:10;;;;;;;;;;;;;;;;;;;;;23407:53;23470:12;23485:5;23470:20;;23501:14;23526:78;23541:1;23533:4;:9;23526:78;;23559:8;;;;;:::i;:::-;;;;23590:2;23582:10;;;;;:::i;:::-;;;23526:78;;;23614:19;23646:6;23636:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23614:39;;23664:154;23680:1;23671:5;:10;23664:154;;23708:1;23698:11;;;;;:::i;:::-;;;23775:2;23767:5;:10;;;;:::i;:::-;23754:2;:24;;;;:::i;:::-;23741:39;;23724:6;23731;23724:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;23804:2;23795:11;;;;;:::i;:::-;;;23664:154;;;23842:6;23828:21;;;;;23134:723;;;;:::o;32786:128::-;32851:4;32904:1;32875:31;;:17;32884:7;32875:8;:17::i;:::-;:31;;;;32868:38;;32786:128;;;:::o;34108:285::-;34203:18;34209:2;34213:7;34203:5;:18::i;:::-;34254:53;34285:1;34289:2;34293:7;34302:4;34254:22;:53::i;:::-;34232:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;34108:285;;;:::o;40796:116::-;;;;;:::o;41634:115::-;;;;;:::o;2927:701::-;3010:7;3030:20;3053:4;3030:27;;3073:9;3068:523;3092:5;:12;3088:1;:16;3068:523;;;3126:20;3149:5;3155:1;3149:8;;;;;;;;:::i;:::-;;;;;;;;3126:31;;3192:12;3176;:28;3172:408;;3346:12;3360;3329:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3319:55;;;;;;3304:70;;3172:408;;;3536:12;3550;3519:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3509:55;;;;;;3494:70;;3172:408;3111:480;3106:3;;;;;:::i;:::-;;;;3068:523;;;;3608:12;3601:19;;;2927:701;;;;:::o;39211:853::-;39365:4;39386:15;:2;:13;;;:15::i;:::-;39382:675;;;39438:2;39422:36;;;39459:12;:10;:12::i;:::-;39473:4;39479:7;39488:4;39422:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39418:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39680:1;39663:6;:13;:18;39659:328;;39706:60;;;;;;;;;;:::i;:::-;;;;;;;;39659:328;39937:6;39931:13;39922:6;39918:2;39914:15;39907:38;39418:584;39554:41;;;39544:51;;;:6;:51;;;;39537:58;;;;;39382:675;40041:4;40034:11;;39211:853;;;;;;;:::o;34729:942::-;34823:1;34809:16;;:2;:16;;;34801:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34882:16;34890:7;34882;:16::i;:::-;34881:17;34873:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34944:48;34973:1;34977:2;34981:7;34990:1;34944:20;:48::i;:::-;35091:16;35099:7;35091;:16::i;:::-;35090:17;35082:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35506:1;35489:9;:13;35499:2;35489:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;35550:2;35531:7;:16;35539:7;35531:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35595:7;35591:2;35570:33;;35587:1;35570:33;;;;;;;;;;;;35616:47;35644:1;35648:2;35652:7;35661:1;35616:19;:47::i;:::-;34729:942;;:::o;11732:387::-;11792:4;12000:12;12067:7;12055:20;12047:28;;12110:1;12103:4;:8;12096:15;;;11732:387;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:77::-;5552:7;5581:5;5570:16;;5515:77;;;:::o;5598:118::-;5685:24;5703:5;5685:24;:::i;:::-;5680:3;5673:37;5598:118;;:::o;5722:222::-;5815:4;5853:2;5842:9;5838:18;5830:26;;5866:71;5934:1;5923:9;5919:17;5910:6;5866:71;:::i;:::-;5722:222;;;;:::o;5950:118::-;6037:24;6055:5;6037:24;:::i;:::-;6032:3;6025:37;5950:118;;:::o;6074:222::-;6167:4;6205:2;6194:9;6190:18;6182:26;;6218:71;6286:1;6275:9;6271:17;6262:6;6218:71;:::i;:::-;6074:222;;;;:::o;6302:122::-;6375:24;6393:5;6375:24;:::i;:::-;6368:5;6365:35;6355:63;;6414:1;6411;6404:12;6355:63;6302:122;:::o;6430:139::-;6476:5;6514:6;6501:20;6492:29;;6530:33;6557:5;6530:33;:::i;:::-;6430:139;;;;:::o;6575:329::-;6634:6;6683:2;6671:9;6662:7;6658:23;6654:32;6651:119;;;6689:79;;:::i;:::-;6651:119;6809:1;6834:53;6879:7;6870:6;6859:9;6855:22;6834:53;:::i;:::-;6824:63;;6780:117;6575:329;;;;:::o;6910:117::-;7019:1;7016;7009:12;7033:117;7142:1;7139;7132:12;7156:180;7204:77;7201:1;7194:88;7301:4;7298:1;7291:15;7325:4;7322:1;7315:15;7342:281;7425:27;7447:4;7425:27;:::i;:::-;7417:6;7413:40;7555:6;7543:10;7540:22;7519:18;7507:10;7504:34;7501:62;7498:88;;;7566:18;;:::i;:::-;7498:88;7606:10;7602:2;7595:22;7385:238;7342:281;;:::o;7629:129::-;7663:6;7690:20;;:::i;:::-;7680:30;;7719:33;7747:4;7739:6;7719:33;:::i;:::-;7629:129;;;:::o;7764:308::-;7826:4;7916:18;7908:6;7905:30;7902:56;;;7938:18;;:::i;:::-;7902:56;7976:29;7998:6;7976:29;:::i;:::-;7968:37;;8060:4;8054;8050:15;8042:23;;7764:308;;;:::o;8078:146::-;8175:6;8170:3;8165;8152:30;8216:1;8207:6;8202:3;8198:16;8191:27;8078:146;;;:::o;8230:425::-;8308:5;8333:66;8349:49;8391:6;8349:49;:::i;:::-;8333:66;:::i;:::-;8324:75;;8422:6;8415:5;8408:21;8460:4;8453:5;8449:16;8498:3;8489:6;8484:3;8480:16;8477:25;8474:112;;;8505:79;;:::i;:::-;8474:112;8595:54;8642:6;8637:3;8632;8595:54;:::i;:::-;8314:341;8230:425;;;;;:::o;8675:340::-;8731:5;8780:3;8773:4;8765:6;8761:17;8757:27;8747:122;;8788:79;;:::i;:::-;8747:122;8905:6;8892:20;8930:79;9005:3;8997:6;8990:4;8982:6;8978:17;8930:79;:::i;:::-;8921:88;;8737:278;8675:340;;;;:::o;9021:509::-;9090:6;9139:2;9127:9;9118:7;9114:23;9110:32;9107:119;;;9145:79;;:::i;:::-;9107:119;9293:1;9282:9;9278:17;9265:31;9323:18;9315:6;9312:30;9309:117;;;9345:79;;:::i;:::-;9309:117;9450:63;9505:7;9496:6;9485:9;9481:22;9450:63;:::i;:::-;9440:73;;9236:287;9021:509;;;;:::o;9536:117::-;9645:1;9642;9635:12;9659:117;9768:1;9765;9758:12;9799:568;9872:8;9882:6;9932:3;9925:4;9917:6;9913:17;9909:27;9899:122;;9940:79;;:::i;:::-;9899:122;10053:6;10040:20;10030:30;;10083:18;10075:6;10072:30;10069:117;;;10105:79;;:::i;:::-;10069:117;10219:4;10211:6;10207:17;10195:29;;10273:3;10265:4;10257:6;10253:17;10243:8;10239:32;10236:41;10233:128;;;10280:79;;:::i;:::-;10233:128;9799:568;;;;;:::o;10373:559::-;10459:6;10467;10516:2;10504:9;10495:7;10491:23;10487:32;10484:119;;;10522:79;;:::i;:::-;10484:119;10670:1;10659:9;10655:17;10642:31;10700:18;10692:6;10689:30;10686:117;;;10722:79;;:::i;:::-;10686:117;10835:80;10907:7;10898:6;10887:9;10883:22;10835:80;:::i;:::-;10817:98;;;;10613:312;10373:559;;;;;:::o;10938:329::-;10997:6;11046:2;11034:9;11025:7;11021:23;11017:32;11014:119;;;11052:79;;:::i;:::-;11014:119;11172:1;11197:53;11242:7;11233:6;11222:9;11218:22;11197:53;:::i;:::-;11187:63;;11143:117;10938:329;;;;:::o;11273:116::-;11343:21;11358:5;11343:21;:::i;:::-;11336:5;11333:32;11323:60;;11379:1;11376;11369:12;11323:60;11273:116;:::o;11395:133::-;11438:5;11476:6;11463:20;11454:29;;11492:30;11516:5;11492:30;:::i;:::-;11395:133;;;;:::o;11534:468::-;11599:6;11607;11656:2;11644:9;11635:7;11631:23;11627:32;11624:119;;;11662:79;;:::i;:::-;11624:119;11782:1;11807:53;11852:7;11843:6;11832:9;11828:22;11807:53;:::i;:::-;11797:63;;11753:117;11909:2;11935:50;11977:7;11968:6;11957:9;11953:22;11935:50;:::i;:::-;11925:60;;11880:115;11534:468;;;;;:::o;12008:307::-;12069:4;12159:18;12151:6;12148:30;12145:56;;;12181:18;;:::i;:::-;12145:56;12219:29;12241:6;12219:29;:::i;:::-;12211:37;;12303:4;12297;12293:15;12285:23;;12008:307;;;:::o;12321:423::-;12398:5;12423:65;12439:48;12480:6;12439:48;:::i;:::-;12423:65;:::i;:::-;12414:74;;12511:6;12504:5;12497:21;12549:4;12542:5;12538:16;12587:3;12578:6;12573:3;12569:16;12566:25;12563:112;;;12594:79;;:::i;:::-;12563:112;12684:54;12731:6;12726:3;12721;12684:54;:::i;:::-;12404:340;12321:423;;;;;:::o;12763:338::-;12818:5;12867:3;12860:4;12852:6;12848:17;12844:27;12834:122;;12875:79;;:::i;:::-;12834:122;12992:6;12979:20;13017:78;13091:3;13083:6;13076:4;13068:6;13064:17;13017:78;:::i;:::-;13008:87;;12824:277;12763:338;;;;:::o;13107:943::-;13202:6;13210;13218;13226;13275:3;13263:9;13254:7;13250:23;13246:33;13243:120;;;13282:79;;:::i;:::-;13243:120;13402:1;13427:53;13472:7;13463:6;13452:9;13448:22;13427:53;:::i;:::-;13417:63;;13373:117;13529:2;13555:53;13600:7;13591:6;13580:9;13576:22;13555:53;:::i;:::-;13545:63;;13500:118;13657:2;13683:53;13728:7;13719:6;13708:9;13704:22;13683:53;:::i;:::-;13673:63;;13628:118;13813:2;13802:9;13798:18;13785:32;13844:18;13836:6;13833:30;13830:117;;;13866:79;;:::i;:::-;13830:117;13971:62;14025:7;14016:6;14005:9;14001:22;13971:62;:::i;:::-;13961:72;;13756:287;13107:943;;;;;;;:::o;14056:180::-;14104:77;14101:1;14094:88;14201:4;14198:1;14191:15;14225:4;14222:1;14215:15;14242:119;14329:1;14322:5;14319:12;14309:46;;14335:18;;:::i;:::-;14309:46;14242:119;:::o;14367:139::-;14418:7;14447:5;14436:16;;14453:47;14494:5;14453:47;:::i;:::-;14367:139;;;:::o;14512:::-;14574:9;14607:38;14639:5;14607:38;:::i;:::-;14594:51;;14512:139;;;:::o;14657:155::-;14756:49;14799:5;14756:49;:::i;:::-;14751:3;14744:62;14657:155;;:::o;14818:246::-;14923:4;14961:2;14950:9;14946:18;14938:26;;14974:83;15054:1;15043:9;15039:17;15030:6;14974:83;:::i;:::-;14818:246;;;;:::o;15070:474::-;15138:6;15146;15195:2;15183:9;15174:7;15170:23;15166:32;15163:119;;;15201:79;;:::i;:::-;15163:119;15321:1;15346:53;15391:7;15382:6;15371:9;15367:22;15346:53;:::i;:::-;15336:63;;15292:117;15448:2;15474:53;15519:7;15510:6;15499:9;15495:22;15474:53;:::i;:::-;15464:63;;15419:118;15070:474;;;;;:::o;15550:180::-;15598:77;15595:1;15588:88;15695:4;15692:1;15685:15;15719:4;15716:1;15709:15;15736:320;15780:6;15817:1;15811:4;15807:12;15797:22;;15864:1;15858:4;15854:12;15885:18;15875:81;;15941:4;15933:6;15929:17;15919:27;;15875:81;16003:2;15995:6;15992:14;15972:18;15969:38;15966:84;;16022:18;;:::i;:::-;15966:84;15787:269;15736:320;;;:::o;16062:182::-;16202:34;16198:1;16190:6;16186:14;16179:58;16062:182;:::o;16250:366::-;16392:3;16413:67;16477:2;16472:3;16413:67;:::i;:::-;16406:74;;16489:93;16578:3;16489:93;:::i;:::-;16607:2;16602:3;16598:12;16591:19;;16250:366;;;:::o;16622:419::-;16788:4;16826:2;16815:9;16811:18;16803:26;;16875:9;16869:4;16865:20;16861:1;16850:9;16846:17;16839:47;16903:131;17029:4;16903:131;:::i;:::-;16895:139;;16622:419;;;:::o;17047:180::-;17095:77;17092:1;17085:88;17192:4;17189:1;17182:15;17216:4;17213:1;17206:15;17233:191;17273:3;17292:20;17310:1;17292:20;:::i;:::-;17287:25;;17326:20;17344:1;17326:20;:::i;:::-;17321:25;;17369:1;17366;17362:9;17355:16;;17390:3;17387:1;17384:10;17381:36;;;17397:18;;:::i;:::-;17381:36;17233:191;;;;:::o;17430:180::-;17570:32;17566:1;17558:6;17554:14;17547:56;17430:180;:::o;17616:366::-;17758:3;17779:67;17843:2;17838:3;17779:67;:::i;:::-;17772:74;;17855:93;17944:3;17855:93;:::i;:::-;17973:2;17968:3;17964:12;17957:19;;17616:366;;;:::o;17988:419::-;18154:4;18192:2;18181:9;18177:18;18169:26;;18241:9;18235:4;18231:20;18227:1;18216:9;18212:17;18205:47;18269:131;18395:4;18269:131;:::i;:::-;18261:139;;17988:419;;;:::o;18413:220::-;18553:34;18549:1;18541:6;18537:14;18530:58;18622:3;18617:2;18609:6;18605:15;18598:28;18413:220;:::o;18639:366::-;18781:3;18802:67;18866:2;18861:3;18802:67;:::i;:::-;18795:74;;18878:93;18967:3;18878:93;:::i;:::-;18996:2;18991:3;18987:12;18980:19;;18639:366;;;:::o;19011:419::-;19177:4;19215:2;19204:9;19200:18;19192:26;;19264:9;19258:4;19254:20;19250:1;19239:9;19235:17;19228:47;19292:131;19418:4;19292:131;:::i;:::-;19284:139;;19011:419;;;:::o;19436:248::-;19576:34;19572:1;19564:6;19560:14;19553:58;19645:31;19640:2;19632:6;19628:15;19621:56;19436:248;:::o;19690:366::-;19832:3;19853:67;19917:2;19912:3;19853:67;:::i;:::-;19846:74;;19929:93;20018:3;19929:93;:::i;:::-;20047:2;20042:3;20038:12;20031:19;;19690:366;;;:::o;20062:419::-;20228:4;20266:2;20255:9;20251:18;20243:26;;20315:9;20309:4;20305:20;20301:1;20290:9;20286:17;20279:47;20343:131;20469:4;20343:131;:::i;:::-;20335:139;;20062:419;;;:::o;20487:164::-;20627:16;20623:1;20615:6;20611:14;20604:40;20487:164;:::o;20657:366::-;20799:3;20820:67;20884:2;20879:3;20820:67;:::i;:::-;20813:74;;20896:93;20985:3;20896:93;:::i;:::-;21014:2;21009:3;21005:12;20998:19;;20657:366;;;:::o;21029:419::-;21195:4;21233:2;21222:9;21218:18;21210:26;;21282:9;21276:4;21272:20;21268:1;21257:9;21253:17;21246:47;21310:131;21436:4;21310:131;:::i;:::-;21302:139;;21029:419;;;:::o;21454:232::-;21594:34;21590:1;21582:6;21578:14;21571:58;21663:15;21658:2;21650:6;21646:15;21639:40;21454:232;:::o;21692:366::-;21834:3;21855:67;21919:2;21914:3;21855:67;:::i;:::-;21848:74;;21931:93;22020:3;21931:93;:::i;:::-;22049:2;22044:3;22040:12;22033:19;;21692:366;;;:::o;22064:419::-;22230:4;22268:2;22257:9;22253:18;22245:26;;22317:9;22311:4;22307:20;22303:1;22292:9;22288:17;22281:47;22345:131;22471:4;22345:131;:::i;:::-;22337:139;;22064:419;;;:::o;22489:141::-;22538:4;22561:3;22553:11;;22584:3;22581:1;22574:14;22618:4;22615:1;22605:18;22597:26;;22489:141;;;:::o;22636:93::-;22673:6;22720:2;22715;22708:5;22704:14;22700:23;22690:33;;22636:93;;;:::o;22735:107::-;22779:8;22829:5;22823:4;22819:16;22798:37;;22735:107;;;;:::o;22848:393::-;22917:6;22967:1;22955:10;22951:18;22990:97;23020:66;23009:9;22990:97;:::i;:::-;23108:39;23138:8;23127:9;23108:39;:::i;:::-;23096:51;;23180:4;23176:9;23169:5;23165:21;23156:30;;23229:4;23219:8;23215:19;23208:5;23205:30;23195:40;;22924:317;;22848:393;;;;;:::o;23247:60::-;23275:3;23296:5;23289:12;;23247:60;;;:::o;23313:142::-;23363:9;23396:53;23414:34;23423:24;23441:5;23423:24;:::i;:::-;23414:34;:::i;:::-;23396:53;:::i;:::-;23383:66;;23313:142;;;:::o;23461:75::-;23504:3;23525:5;23518:12;;23461:75;;;:::o;23542:269::-;23652:39;23683:7;23652:39;:::i;:::-;23713:91;23762:41;23786:16;23762:41;:::i;:::-;23754:6;23747:4;23741:11;23713:91;:::i;:::-;23707:4;23700:105;23618:193;23542:269;;;:::o;23817:73::-;23862:3;23817:73;:::o;23896:189::-;23973:32;;:::i;:::-;24014:65;24072:6;24064;24058:4;24014:65;:::i;:::-;23949:136;23896:189;;:::o;24091:186::-;24151:120;24168:3;24161:5;24158:14;24151:120;;;24222:39;24259:1;24252:5;24222:39;:::i;:::-;24195:1;24188:5;24184:13;24175:22;;24151:120;;;24091:186;;:::o;24283:543::-;24384:2;24379:3;24376:11;24373:446;;;24418:38;24450:5;24418:38;:::i;:::-;24502:29;24520:10;24502:29;:::i;:::-;24492:8;24488:44;24685:2;24673:10;24670:18;24667:49;;;24706:8;24691:23;;24667:49;24729:80;24785:22;24803:3;24785:22;:::i;:::-;24775:8;24771:37;24758:11;24729:80;:::i;:::-;24388:431;;24373:446;24283:543;;;:::o;24832:117::-;24886:8;24936:5;24930:4;24926:16;24905:37;;24832:117;;;;:::o;24955:169::-;24999:6;25032:51;25080:1;25076:6;25068:5;25065:1;25061:13;25032:51;:::i;:::-;25028:56;25113:4;25107;25103:15;25093:25;;25006:118;24955:169;;;;:::o;25129:295::-;25205:4;25351:29;25376:3;25370:4;25351:29;:::i;:::-;25343:37;;25413:3;25410:1;25406:11;25400:4;25397:21;25389:29;;25129:295;;;;:::o;25429:1395::-;25546:37;25579:3;25546:37;:::i;:::-;25648:18;25640:6;25637:30;25634:56;;;25670:18;;:::i;:::-;25634:56;25714:38;25746:4;25740:11;25714:38;:::i;:::-;25799:67;25859:6;25851;25845:4;25799:67;:::i;:::-;25893:1;25917:4;25904:17;;25949:2;25941:6;25938:14;25966:1;25961:618;;;;26623:1;26640:6;26637:77;;;26689:9;26684:3;26680:19;26674:26;26665:35;;26637:77;26740:67;26800:6;26793:5;26740:67;:::i;:::-;26734:4;26727:81;26596:222;25931:887;;25961:618;26013:4;26009:9;26001:6;25997:22;26047:37;26079:4;26047:37;:::i;:::-;26106:1;26120:208;26134:7;26131:1;26128:14;26120:208;;;26213:9;26208:3;26204:19;26198:26;26190:6;26183:42;26264:1;26256:6;26252:14;26242:24;;26311:2;26300:9;26296:18;26283:31;;26157:4;26154:1;26150:12;26145:17;;26120:208;;;26356:6;26347:7;26344:19;26341:179;;;26414:9;26409:3;26405:19;26399:26;26457:48;26499:4;26491:6;26487:17;26476:9;26457:48;:::i;:::-;26449:6;26442:64;26364:156;26341:179;26566:1;26562;26554:6;26550:14;26546:22;26540:4;26533:36;25968:611;;;25931:887;;25521:1303;;;25429:1395;;:::o;26830:174::-;26970:26;26966:1;26958:6;26954:14;26947:50;26830:174;:::o;27010:366::-;27152:3;27173:67;27237:2;27232:3;27173:67;:::i;:::-;27166:74;;27249:93;27338:3;27249:93;:::i;:::-;27367:2;27362:3;27358:12;27351:19;;27010:366;;;:::o;27382:419::-;27548:4;27586:2;27575:9;27571:18;27563:26;;27635:9;27629:4;27625:20;27621:1;27610:9;27606:17;27599:47;27663:131;27789:4;27663:131;:::i;:::-;27655:139;;27382:419;;;:::o;27807:181::-;27947:33;27943:1;27935:6;27931:14;27924:57;27807:181;:::o;27994:366::-;28136:3;28157:67;28221:2;28216:3;28157:67;:::i;:::-;28150:74;;28233:93;28322:3;28233:93;:::i;:::-;28351:2;28346:3;28342:12;28335:19;;27994:366;;;:::o;28366:419::-;28532:4;28570:2;28559:9;28555:18;28547:26;;28619:9;28613:4;28609:20;28605:1;28594:9;28590:17;28583:47;28647:131;28773:4;28647:131;:::i;:::-;28639:139;;28366:419;;;:::o;28791:167::-;28931:19;28927:1;28919:6;28915:14;28908:43;28791:167;:::o;28964:366::-;29106:3;29127:67;29191:2;29186:3;29127:67;:::i;:::-;29120:74;;29203:93;29292:3;29203:93;:::i;:::-;29321:2;29316:3;29312:12;29305:19;;28964:366;;;:::o;29336:419::-;29502:4;29540:2;29529:9;29525:18;29517:26;;29589:9;29583:4;29579:20;29575:1;29564:9;29560:17;29553:47;29617:131;29743:4;29617:131;:::i;:::-;29609:139;;29336:419;;;:::o;29761:94::-;29794:8;29842:5;29838:2;29834:14;29813:35;;29761:94;;;:::o;29861:::-;29900:7;29929:20;29943:5;29929:20;:::i;:::-;29918:31;;29861:94;;;:::o;29961:100::-;30000:7;30029:26;30049:5;30029:26;:::i;:::-;30018:37;;29961:100;;;:::o;30067:157::-;30172:45;30192:24;30210:5;30192:24;:::i;:::-;30172:45;:::i;:::-;30167:3;30160:58;30067:157;;:::o;30230:256::-;30342:3;30357:75;30428:3;30419:6;30357:75;:::i;:::-;30457:2;30452:3;30448:12;30441:19;;30477:3;30470:10;;30230:256;;;;:::o;30492:225::-;30632:34;30628:1;30620:6;30616:14;30609:58;30701:8;30696:2;30688:6;30684:15;30677:33;30492:225;:::o;30723:366::-;30865:3;30886:67;30950:2;30945:3;30886:67;:::i;:::-;30879:74;;30962:93;31051:3;30962:93;:::i;:::-;31080:2;31075:3;31071:12;31064:19;;30723:366;;;:::o;31095:419::-;31261:4;31299:2;31288:9;31284:18;31276:26;;31348:9;31342:4;31338:20;31334:1;31323:9;31319:17;31312:47;31376:131;31502:4;31376:131;:::i;:::-;31368:139;;31095:419;;;:::o;31520:178::-;31660:30;31656:1;31648:6;31644:14;31637:54;31520:178;:::o;31704:366::-;31846:3;31867:67;31931:2;31926:3;31867:67;:::i;:::-;31860:74;;31943:93;32032:3;31943:93;:::i;:::-;32061:2;32056:3;32052:12;32045:19;;31704:366;;;:::o;32076:419::-;32242:4;32280:2;32269:9;32265:18;32257:26;;32329:9;32323:4;32319:20;32315:1;32304:9;32300:17;32293:47;32357:131;32483:4;32357:131;:::i;:::-;32349:139;;32076:419;;;:::o;32501:229::-;32641:34;32637:1;32629:6;32625:14;32618:58;32710:12;32705:2;32697:6;32693:15;32686:37;32501:229;:::o;32736:366::-;32878:3;32899:67;32963:2;32958:3;32899:67;:::i;:::-;32892:74;;32975:93;33064:3;32975:93;:::i;:::-;33093:2;33088:3;33084:12;33077:19;;32736:366;;;:::o;33108:419::-;33274:4;33312:2;33301:9;33297:18;33289:26;;33361:9;33355:4;33351:20;33347:1;33336:9;33332:17;33325:47;33389:131;33515:4;33389:131;:::i;:::-;33381:139;;33108:419;;;:::o;33533:194::-;33573:4;33593:20;33611:1;33593:20;:::i;:::-;33588:25;;33627:20;33645:1;33627:20;:::i;:::-;33622:25;;33671:1;33668;33664:9;33656:17;;33695:1;33689:4;33686:11;33683:37;;;33700:18;;:::i;:::-;33683:37;33533:194;;;;:::o;33733:178::-;33873:30;33869:1;33861:6;33857:14;33850:54;33733:178;:::o;33917:366::-;34059:3;34080:67;34144:2;34139:3;34080:67;:::i;:::-;34073:74;;34156:93;34245:3;34156:93;:::i;:::-;34274:2;34269:3;34265:12;34258:19;;33917:366;;;:::o;34289:419::-;34455:4;34493:2;34482:9;34478:18;34470:26;;34542:9;34536:4;34532:20;34528:1;34517:9;34513:17;34506:47;34570:131;34696:4;34570:131;:::i;:::-;34562:139;;34289:419;;;:::o;34714:163::-;34854:15;34850:1;34842:6;34838:14;34831:39;34714:163;:::o;34883:366::-;35025:3;35046:67;35110:2;35105:3;35046:67;:::i;:::-;35039:74;;35122:93;35211:3;35122:93;:::i;:::-;35240:2;35235:3;35231:12;35224:19;;34883:366;;;:::o;35255:419::-;35421:4;35459:2;35448:9;35444:18;35436:26;;35508:9;35502:4;35498:20;35494:1;35483:9;35479:17;35472:47;35536:131;35662:4;35536:131;:::i;:::-;35528:139;;35255:419;;;:::o;35680:228::-;35820:34;35816:1;35808:6;35804:14;35797:58;35889:11;35884:2;35876:6;35872:15;35865:36;35680:228;:::o;35914:366::-;36056:3;36077:67;36141:2;36136:3;36077:67;:::i;:::-;36070:74;;36153:93;36242:3;36153:93;:::i;:::-;36271:2;36266:3;36262:12;36255:19;;35914:366;;;:::o;36286:419::-;36452:4;36490:2;36479:9;36475:18;36467:26;;36539:9;36533:4;36529:20;36525:1;36514:9;36510:17;36503:47;36567:131;36693:4;36567:131;:::i;:::-;36559:139;;36286:419;;;:::o;36711:170::-;36851:22;36847:1;36839:6;36835:14;36828:46;36711:170;:::o;36887:366::-;37029:3;37050:67;37114:2;37109:3;37050:67;:::i;:::-;37043:74;;37126:93;37215:3;37126:93;:::i;:::-;37244:2;37239:3;37235:12;37228:19;;36887:366;;;:::o;37259:419::-;37425:4;37463:2;37452:9;37448:18;37440:26;;37512:9;37506:4;37502:20;37498:1;37487:9;37483:17;37476:47;37540:131;37666:4;37540:131;:::i;:::-;37532:139;;37259:419;;;:::o;37684:221::-;37824:34;37820:1;37812:6;37808:14;37801:58;37893:4;37888:2;37880:6;37876:15;37869:29;37684:221;:::o;37911:366::-;38053:3;38074:67;38138:2;38133:3;38074:67;:::i;:::-;38067:74;;38150:93;38239:3;38150:93;:::i;:::-;38268:2;38263:3;38259:12;38252:19;;37911:366;;;:::o;38283:419::-;38449:4;38487:2;38476:9;38472:18;38464:26;;38536:9;38530:4;38526:20;38522:1;38511:9;38507:17;38500:47;38564:131;38690:4;38564:131;:::i;:::-;38556:139;;38283:419;;;:::o;38708:181::-;38848:33;38844:1;38836:6;38832:14;38825:57;38708:181;:::o;38895:366::-;39037:3;39058:67;39122:2;39117:3;39058:67;:::i;:::-;39051:74;;39134:93;39223:3;39134:93;:::i;:::-;39252:2;39247:3;39243:12;39236:19;;38895:366;;;:::o;39267:419::-;39433:4;39471:2;39460:9;39456:18;39448:26;;39520:9;39514:4;39510:20;39506:1;39495:9;39491:17;39484:47;39548:131;39674:4;39548:131;:::i;:::-;39540:139;;39267:419;;;:::o;39692:148::-;39794:11;39831:3;39816:18;;39692:148;;;;:::o;39870:874::-;39973:3;40010:5;40004:12;40039:36;40065:9;40039:36;:::i;:::-;40091:89;40173:6;40168:3;40091:89;:::i;:::-;40084:96;;40211:1;40200:9;40196:17;40227:1;40222:166;;;;40402:1;40397:341;;;;40189:549;;40222:166;40306:4;40302:9;40291;40287:25;40282:3;40275:38;40368:6;40361:14;40354:22;40346:6;40342:35;40337:3;40333:45;40326:52;;40222:166;;40397:341;40464:38;40496:5;40464:38;:::i;:::-;40524:1;40538:154;40552:6;40549:1;40546:13;40538:154;;;40626:7;40620:14;40616:1;40611:3;40607:11;40600:35;40676:1;40667:7;40663:15;40652:26;;40574:4;40571:1;40567:12;40562:17;;40538:154;;;40721:6;40716:3;40712:16;40705:23;;40404:334;;40189:549;;39977:767;;39870:874;;;;:::o;40750:390::-;40856:3;40884:39;40917:5;40884:39;:::i;:::-;40939:89;41021:6;41016:3;40939:89;:::i;:::-;40932:96;;41037:65;41095:6;41090:3;41083:4;41076:5;41072:16;41037:65;:::i;:::-;41127:6;41122:3;41118:16;41111:23;;40860:280;40750:390;;;;:::o;41146:182::-;41314:7;41309:3;41302:20;41146:182;:::o;41334:693::-;41601:3;41623:92;41711:3;41702:6;41623:92;:::i;:::-;41616:99;;41732:95;41823:3;41814:6;41732:95;:::i;:::-;41725:102;;41837:137;41970:3;41837:137;:::i;:::-;41999:1;41994:3;41990:11;41983:18;;42018:3;42011:10;;41334:693;;;;;:::o;42033:225::-;42173:34;42169:1;42161:6;42157:14;42150:58;42242:8;42237:2;42229:6;42225:15;42218:33;42033:225;:::o;42264:366::-;42406:3;42427:67;42491:2;42486:3;42427:67;:::i;:::-;42420:74;;42503:93;42592:3;42503:93;:::i;:::-;42621:2;42616:3;42612:12;42605:19;;42264:366;;;:::o;42636:419::-;42802:4;42840:2;42829:9;42825:18;42817:26;;42889:9;42883:4;42879:20;42875:1;42864:9;42860:17;42853:47;42917:131;43043:4;42917:131;:::i;:::-;42909:139;;42636:419;;;:::o;43061:231::-;43201:34;43197:1;43189:6;43185:14;43178:58;43270:14;43265:2;43257:6;43253:15;43246:39;43061:231;:::o;43298:366::-;43440:3;43461:67;43525:2;43520:3;43461:67;:::i;:::-;43454:74;;43537:93;43626:3;43537:93;:::i;:::-;43655:2;43650:3;43646:12;43639:19;;43298:366;;;:::o;43670:419::-;43836:4;43874:2;43863:9;43859:18;43851:26;;43923:9;43917:4;43913:20;43909:1;43898:9;43894:17;43887:47;43951:131;44077:4;43951:131;:::i;:::-;43943:139;;43670:419;;;:::o;44095:224::-;44235:34;44231:1;44223:6;44219:14;44212:58;44304:7;44299:2;44291:6;44287:15;44280:32;44095:224;:::o;44325:366::-;44467:3;44488:67;44552:2;44547:3;44488:67;:::i;:::-;44481:74;;44564:93;44653:3;44564:93;:::i;:::-;44682:2;44677:3;44673:12;44666:19;;44325:366;;;:::o;44697:419::-;44863:4;44901:2;44890:9;44886:18;44878:26;;44950:9;44944:4;44940:20;44936:1;44925:9;44921:17;44914:47;44978:131;45104:4;44978:131;:::i;:::-;44970:139;;44697:419;;;:::o;45122:223::-;45262:34;45258:1;45250:6;45246:14;45239:58;45331:6;45326:2;45318:6;45314:15;45307:31;45122:223;:::o;45351:366::-;45493:3;45514:67;45578:2;45573:3;45514:67;:::i;:::-;45507:74;;45590:93;45679:3;45590:93;:::i;:::-;45708:2;45703:3;45699:12;45692:19;;45351:366;;;:::o;45723:419::-;45889:4;45927:2;45916:9;45912:18;45904:26;;45976:9;45970:4;45966:20;45962:1;45951:9;45947:17;45940:47;46004:131;46130:4;46004:131;:::i;:::-;45996:139;;45723:419;;;:::o;46148:175::-;46288:27;46284:1;46276:6;46272:14;46265:51;46148:175;:::o;46329:366::-;46471:3;46492:67;46556:2;46551:3;46492:67;:::i;:::-;46485:74;;46568:93;46657:3;46568:93;:::i;:::-;46686:2;46681:3;46677:12;46670:19;;46329:366;;;:::o;46701:419::-;46867:4;46905:2;46894:9;46890:18;46882:26;;46954:9;46948:4;46944:20;46940:1;46929:9;46925:17;46918:47;46982:131;47108:4;46982:131;:::i;:::-;46974:139;;46701:419;;;:::o;47126:237::-;47266:34;47262:1;47254:6;47250:14;47243:58;47335:20;47330:2;47322:6;47318:15;47311:45;47126:237;:::o;47369:366::-;47511:3;47532:67;47596:2;47591:3;47532:67;:::i;:::-;47525:74;;47608:93;47697:3;47608:93;:::i;:::-;47726:2;47721:3;47717:12;47710:19;;47369:366;;;:::o;47741:419::-;47907:4;47945:2;47934:9;47930:18;47922:26;;47994:9;47988:4;47984:20;47980:1;47969:9;47965:17;47958:47;48022:131;48148:4;48022:131;:::i;:::-;48014:139;;47741:419;;;:::o;48166:233::-;48205:3;48228:24;48246:5;48228:24;:::i;:::-;48219:33;;48274:66;48267:5;48264:77;48261:103;;48344:18;;:::i;:::-;48261:103;48391:1;48384:5;48380:13;48373:20;;48166:233;;;:::o;48405:180::-;48453:77;48450:1;48443:88;48550:4;48547:1;48540:15;48574:4;48571:1;48564:15;48591:185;48631:1;48648:20;48666:1;48648:20;:::i;:::-;48643:25;;48682:20;48700:1;48682:20;:::i;:::-;48677:25;;48721:1;48711:35;;48726:18;;:::i;:::-;48711:35;48768:1;48765;48761:9;48756:14;;48591:185;;;;:::o;48782:176::-;48814:1;48831:20;48849:1;48831:20;:::i;:::-;48826:25;;48865:20;48883:1;48865:20;:::i;:::-;48860:25;;48904:1;48894:35;;48909:18;;:::i;:::-;48894:35;48950:1;48947;48943:9;48938:14;;48782:176;;;;:::o;48964:180::-;49012:77;49009:1;49002:88;49109:4;49106:1;49099:15;49133:4;49130:1;49123:15;49150:79;49189:7;49218:5;49207:16;;49150:79;;;:::o;49235:157::-;49340:45;49360:24;49378:5;49360:24;:::i;:::-;49340:45;:::i;:::-;49335:3;49328:58;49235:157;;:::o;49398:397::-;49538:3;49553:75;49624:3;49615:6;49553:75;:::i;:::-;49653:2;49648:3;49644:12;49637:19;;49666:75;49737:3;49728:6;49666:75;:::i;:::-;49766:2;49761:3;49757:12;49750:19;;49786:3;49779:10;;49398:397;;;;;:::o;49801:98::-;49852:6;49886:5;49880:12;49870:22;;49801:98;;;:::o;49905:168::-;49988:11;50022:6;50017:3;50010:19;50062:4;50057:3;50053:14;50038:29;;49905:168;;;;:::o;50079:373::-;50165:3;50193:38;50225:5;50193:38;:::i;:::-;50247:70;50310:6;50305:3;50247:70;:::i;:::-;50240:77;;50326:65;50384:6;50379:3;50372:4;50365:5;50361:16;50326:65;:::i;:::-;50416:29;50438:6;50416:29;:::i;:::-;50411:3;50407:39;50400:46;;50169:283;50079:373;;;;:::o;50458:640::-;50653:4;50691:3;50680:9;50676:19;50668:27;;50705:71;50773:1;50762:9;50758:17;50749:6;50705:71;:::i;:::-;50786:72;50854:2;50843:9;50839:18;50830:6;50786:72;:::i;:::-;50868;50936:2;50925:9;50921:18;50912:6;50868:72;:::i;:::-;50987:9;50981:4;50977:20;50972:2;50961:9;50957:18;50950:48;51015:76;51086:4;51077:6;51015:76;:::i;:::-;51007:84;;50458:640;;;;;;;:::o;51104:141::-;51160:5;51191:6;51185:13;51176:22;;51207:32;51233:5;51207:32;:::i;:::-;51104:141;;;;:::o;51251:349::-;51320:6;51369:2;51357:9;51348:7;51344:23;51340:32;51337:119;;;51375:79;;:::i;:::-;51337:119;51495:1;51520:63;51575:7;51566:6;51555:9;51551:22;51520:63;:::i;:::-;51510:73;;51466:127;51251:349;;;;:::o;51606:182::-;51746:34;51742:1;51734:6;51730:14;51723:58;51606:182;:::o;51794:366::-;51936:3;51957:67;52021:2;52016:3;51957:67;:::i;:::-;51950:74;;52033:93;52122:3;52033:93;:::i;:::-;52151:2;52146:3;52142:12;52135:19;;51794:366;;;:::o;52166:419::-;52332:4;52370:2;52359:9;52355:18;52347:26;;52419:9;52413:4;52409:20;52405:1;52394:9;52390:17;52383:47;52447:131;52573:4;52447:131;:::i;:::-;52439:139;;52166:419;;;:::o;52591:178::-;52731:30;52727:1;52719:6;52715:14;52708:54;52591:178;:::o;52775:366::-;52917:3;52938:67;53002:2;52997:3;52938:67;:::i;:::-;52931:74;;53014:93;53103:3;53014:93;:::i;:::-;53132:2;53127:3;53123:12;53116:19;;52775:366;;;:::o;53147:419::-;53313:4;53351:2;53340:9;53336:18;53328:26;;53400:9;53394:4;53390:20;53386:1;53375:9;53371:17;53364:47;53428:131;53554:4;53428:131;:::i;:::-;53420:139;;53147:419;;;:::o
Swarm Source
ipfs://7f13d233391dac33e4c4b8f2e38526648b9a10c42f69eb49e950a9bbfad0b722
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.